diff --git a/.github/workflows/devbuild.yml b/.github/workflows/devbuild.yml
index 9778b28df5c7edd7ba3a99d786d88f063723c699..512fa592652620ad1b7fd2d3c0bdc40a35774595 100644
--- a/.github/workflows/devbuild.yml
+++ b/.github/workflows/devbuild.yml
@@ -67,14 +67,33 @@ jobs:
         run: |
           cp checksum.txt continuous/
 
-      - name: Upload to GitHub Releases
-        uses: "slord399/action-automatic-releases@v1.0.1"
+#      - name: Upload to GitHub Releases
+#        uses: "slord399/action-automatic-releases@v1.0.1"
+#        with:
+#          repo_token: "${{ secrets.GITHUB_TOKEN }}"
+#          automatic_release_tag: "continuous"
+#          prerelease: true
+#          files: |
+#            continuous/*
+
+      - name: Update develop
+        uses: richardsimko/update-tag@v1
         with:
-          repo_token: "${{ secrets.GITHUB_TOKEN }}"
-          automatic_release_tag: "continuous"
-          prerelease: true
-          files: |
-            continuous/*
+          tag_name: continuous
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - uses: ncipollo/release-action@v1
+        with:
+          allowUpdates: 'true'
+          artifacts: "continuous/*"
+          body: "Continuous dev-build release.<br>Updated every time changes are pushed to develop.<br>Do not use unless you have been told to, or are curious about the contents of the dev build.<br>Do not link to this release."
+          commit: "${{ github.sha }}"
+          name: "continuous"
+          prerelease: 'true'
+          removeArtifacts: 'true'
+          replacesArtifacts: 'true'
+          tag: 'continuous'
             
 #      - name: Delete drafts
 #        uses: hugo19941994/delete-draft-releases@v1.0.1
diff --git a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/TabbedConfigsTab.kt b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/TabbedConfigsTab.kt
index 0b17a90ed7e199cd6b573d04a112f5d78424a8c1..c2f98169cbb3581f332328e6b4363462fbc1bab4 100644
--- a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/TabbedConfigsTab.kt
+++ b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/TabbedConfigsTab.kt
@@ -37,6 +37,7 @@ import kotlinx.coroutines.swing.Swing
 import org.apache.commons.io.monitor.FileAlterationListener
 import org.apache.commons.io.monitor.FileAlterationMonitor
 import org.apache.commons.io.monitor.FileAlterationObserver
+import org.apache.commons.io.monitor.FileEntry
 import org.apache.logging.log4j.kotlin.cachedLoggerOf
 import java.awt.datatransfer.DataFlavor
 import java.awt.dnd.DnDConstants
@@ -63,7 +64,7 @@ class TabbedConfigsTab(
     private val choose = arrayOf(Translations.createserverpack_gui_quickselect_choose.toString())
     private val noVersions = DefaultComboBoxModel(arrayOf(Translations.createserverpack_gui_createserverpack_forge_none.toString()))
     private val componentResizer = ComponentResizer()
-    private val timer = ConfigCheckTimer(500, guiProps, apiWrapper.configurationHandler,this)
+    private val timer = ConfigCheckTimer(500, guiProps, apiWrapper,this)
     val selectedEditor: ConfigEditor?
         get() {
             return if (activeTab != null) {
@@ -277,7 +278,9 @@ class TabbedConfigsTab(
     @Suppress("DuplicatedCode")
     private fun iconsDirectoryWatcher() {
         Executors.newSingleThreadExecutor().execute {
-            val observer = FileAlterationObserver(apiWrapper.apiProperties.iconsDirectory)
+            val observer = FileAlterationObserver.builder()
+                .setRootEntry(FileEntry(apiWrapper.apiProperties.iconsDirectory))
+                .get()
             val alterations = object : FileAlterationListener {
                 override fun onStart(observer: FileAlterationObserver?) {}
                 override fun onDirectoryCreate(directory: File?) {}
@@ -309,6 +312,7 @@ class TabbedConfigsTab(
                     }
                 }
             }
+
             observer.addListener(alterations)
             val monitor = FileAlterationMonitor(2000)
             monitor.addObserver(observer)
@@ -323,7 +327,9 @@ class TabbedConfigsTab(
     @Suppress("DuplicatedCode")
     private fun propertiesDirectoryWatcher() {
         Executors.newSingleThreadExecutor().execute {
-            val observer = FileAlterationObserver(apiWrapper.apiProperties.propertiesDirectory)
+            val observer = FileAlterationObserver.builder()
+                .setRootEntry(FileEntry(apiWrapper.apiProperties.propertiesDirectory))
+                .get()
             val alterations = object : FileAlterationListener {
                 override fun onStart(observer: FileAlterationObserver?) {}
                 override fun onDirectoryCreate(directory: File?) {}
diff --git a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/ConfigCheckTimer.kt b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/ConfigCheckTimer.kt
index b1ed4ac9b9891c5fe041ddb987ccba164c5a21c6..d8782e5f42aaa61b37d2dc005ca52d7bc8b15d09 100644
--- a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/ConfigCheckTimer.kt
+++ b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/ConfigCheckTimer.kt
@@ -20,7 +20,7 @@
 package de.griefed.serverpackcreator.app.gui.window.configs.components
 
 import Translations
-import de.griefed.serverpackcreator.api.config.ConfigurationHandler
+import de.griefed.serverpackcreator.api.ApiWrapper
 import de.griefed.serverpackcreator.app.gui.GuiProps
 import de.griefed.serverpackcreator.app.gui.window.configs.ConfigEditor
 import de.griefed.serverpackcreator.app.gui.window.configs.TabbedConfigsTab
@@ -35,7 +35,7 @@ import javax.swing.Timer
  * @author Griefed
  */
 @OptIn(DelicateCoroutinesApi::class)
-class ConfigCheckTimer(delay: Int, guiProps: GuiProps, configHandler: ConfigurationHandler, tabbedConfigsTab: TabbedConfigsTab) : Timer(delay,
+class ConfigCheckTimer(delay: Int, guiProps: GuiProps, apiWrapper: ApiWrapper, tabbedConfigsTab: TabbedConfigsTab) : Timer(delay,
     ActionListener {
         GlobalScope.launch(guiProps.configDispatcher, CoroutineStart.UNDISPATCHED) {
             var errorsEncountered = false
@@ -47,7 +47,7 @@ class ConfigCheckTimer(delay: Int, guiProps: GuiProps, configHandler: Configurat
                 runBlocking {
                     launch {
                         errors.addAll(editor.validateModpackDir())
-                        val name = configHandler.checkManifests(editor.getModpackDirectory(), pack)
+                        val name = apiWrapper.configurationHandler.checkManifests(editor.getModpackDirectory(), pack)
                         @Suppress("IfThenToElvis")
                         editor.title.title = if (pack.name != null) {
                             pack.name!!
diff --git a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/inclusions/InclusionsEditor.kt b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/inclusions/InclusionsEditor.kt
index 8e85c27bc70a2f95bf42b73a7fd2bf18cca8ccb9..f4577f30533a525d308670cc039ec1bdcb29d547 100644
--- a/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/inclusions/InclusionsEditor.kt
+++ b/serverpackcreator-app/src/main/kotlin/de/griefed/serverpackcreator/app/gui/window/configs/components/inclusions/InclusionsEditor.kt
@@ -33,6 +33,7 @@ import org.apache.logging.log4j.kotlin.cachedLoggerOf
 import java.awt.BorderLayout
 import java.awt.Dimension
 import java.awt.datatransfer.DataFlavor
+import java.awt.event.ActionListener
 import java.awt.event.MouseAdapter
 import java.awt.event.MouseEvent
 import java.io.File
@@ -110,8 +111,7 @@ class InclusionsEditor(
     private val inclusionsReset = BalloonTipButton(null, guiProps.resetIcon, Translations.createserverpack_gui_buttoncopydirs_reset_tip.toString(), guiProps) { setInclusionsFromStringList(apiWrapper.apiProperties.directoriesToInclude.toMutableList()) }
 
     private var selectedInclusion: InclusionSpecification? = null
-    private val delay = 250
-    private val tipUpdateTimer: Timer = Timer(delay) { updateTip() }
+    private val tipUpdateTimer: TipUpdateTimer = TipUpdateTimer(500)
 
     private val sourceListener = object : DocumentChangeListener {
         override fun update(e: DocumentEvent) {
@@ -154,7 +154,7 @@ class InclusionsEditor(
             val index = inclusionList.locationToIndex(e.point)
             val bounds = inclusionList.getCellBounds(index, index)
             if (bounds == null || !bounds.contains(e.point) || inclusionList.model.size <= 0) {
-                emtpySelection()
+                emptySelection()
             } else {
                 enableInputs()
             }
@@ -177,16 +177,13 @@ class InclusionsEditor(
 
         fun checkSize() {
             if (inclusionList.model.size <= 0 || inclusionList.isSelectionEmpty) {
-                emtpySelection()
+                emptySelection()
             }
         }
     }
 
     init {
         source.isEditable = guiProps.allowManualEditing
-        tipUpdateTimer.stop()
-        tipUpdateTimer.delay = delay
-        tipUpdateTimer.isRepeats = false
         dividerLocation = 150
         setLeftComponent(leftPanel)
         setRightComponent(rightPanel)
@@ -234,11 +231,11 @@ class InclusionsEditor(
         inclusionList.addMouseListener(listMouseAdapter)
         inclusionList.model.addListDataListener(listModelDataAdapter)
         if (inclusionList.model.size <= 0) {
-            emtpySelection()
+            emptySelection()
         }
     }
 
-    private fun emtpySelection() {
+    private fun emptySelection() {
         if (inclusionList.model.size > 0 || inclusionList.valueIsAdjusting) {
             return
         }
@@ -324,7 +321,7 @@ class InclusionsEditor(
                 selectedInclusionDetailsScrollPanel.isEnabled = true
                 inclusionList.isEnabled = true
             } else {
-                updateTip()
+                tipUpdateTimer.restart()
             }
         }
     }
@@ -438,7 +435,7 @@ class InclusionsEditor(
             inclusionList.valueIsAdjusting -> return
             event.valueIsAdjusting -> return
             inclusionList.selectedIndex == -1 || inclusionList.model.size <= 0 -> {
-                emtpySelection()
+                emptySelection()
                 return
             }
         }
@@ -535,7 +532,7 @@ class InclusionsEditor(
             inclusionList.selectedIndex = 0
         }
         if (inclusionList.model.size <= 0) {
-            emtpySelection()
+            emptySelection()
         }
         validate()
         return removed
@@ -682,4 +679,19 @@ class InclusionsEditor(
             return true
         }
     }
+
+    /**
+     * Timer responsible for updating the tip in the inclusions-editor.
+     *
+     * @author Griefed
+     */
+    inner class TipUpdateTimer(delay: Int) :
+        Timer(delay, ActionListener {
+            updateTip()
+        }) {
+        init {
+            stop()
+            isRepeats = false
+        }
+    }
 }
\ No newline at end of file