diff --git a/CHANGES.md b/CHANGES.md
index c6f7147..2e36bb0 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -5,6 +5,7 @@
 ## 3.8.9
 
 - Add ids to editor action handlers, [#410](https://github.com/acejump/AceJump/pull/410), thanks to [@AlexPl292](https://github.com/AlexPl292)
+- Update API to IJ-2022.3 and JDK to 17
 
 ## 3.8.8
 
diff --git a/build.gradle.kts b/build.gradle.kts
index 302187f..389251e 100755
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,12 +1,12 @@
 import org.jetbrains.changelog.*
+import org.jetbrains.changelog.Changelog.OutputType.HTML
 import org.jetbrains.intellij.tasks.*
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
   idea apply true
   kotlin("jvm") version "1.8.0-Beta"
   id("org.jetbrains.intellij") version "1.10.0"
-  id("org.jetbrains.changelog") version "1.3.1"
+  id("org.jetbrains.changelog") version "2.0.0"
   id("com.github.ben-manes.versions") version "0.44.0"
 }
 
@@ -31,9 +31,9 @@ tasks {
   }
 
   patchPluginXml {
-    sinceBuild.set("213.5744.223")
+    sinceBuild.set("223.7571.182")
     changeNotes.set(provider {
-      changelog.getAll().values.take(2).last().toHTML()
+      changelog.renderItem(changelog.getAll().values.take(2).last(), HTML)
     })
   }
 
@@ -76,7 +76,7 @@ dependencies {
 }
 
 intellij {
-  version.set("2022.2")
+  version.set("2022.3")
   pluginName.set("AceJump")
   updateSinceUntilBuild.set(false)
   plugins.set(listOf("java"))
diff --git a/src/main/kotlin/org/acejump/action/AceAction.kt b/src/main/kotlin/org/acejump/action/AceAction.kt
index 5978251..629d03d 100644
--- a/src/main/kotlin/org/acejump/action/AceAction.kt
+++ b/src/main/kotlin/org/acejump/action/AceAction.kt
@@ -29,7 +29,7 @@ sealed class AceAction: DumbAwareAction() {
   
     if (project != null) {
       try {
-        val openEditors = FileEditorManagerEx.getInstanceEx(project).splitters.selectedEditors
+        val openEditors = FileEditorManagerEx.getInstanceEx(project).splitters.getSelectedEditors()
           .mapNotNull { (it as? TextEditor)?.editor }
           .sortedBy { if (it === editor) 0 else 1 }
         invoke(SessionManager.start(editor, openEditors))
diff --git a/src/main/kotlin/org/acejump/action/TagJumper.kt b/src/main/kotlin/org/acejump/action/TagJumper.kt
index 2be2228..f1210f0 100644
--- a/src/main/kotlin/org/acejump/action/TagJumper.kt
+++ b/src/main/kotlin/org/acejump/action/TagJumper.kt
@@ -100,7 +100,7 @@ internal class TagJumper(private val mode: JumpMode, private val searchProcessor
       val project = editor.project ?: return
       val fem = FileEditorManagerEx.getInstanceEx(project)
     
-      val window = fem.windows.firstOrNull { (it.selectedEditor?.selectedWithProvider?.fileEditor as? TextEditor)?.editor === editor }
+      val window = fem.windows.firstOrNull { (it.getSelectedComposite(true)?.fileEditorManager?.selectedTextEditor) === editor }
       if (window != null && window !== fem.currentWindow) {
         fem.currentWindow = window
       }
diff --git a/src/main/kotlin/org/acejump/config/AceSettingsPanel.kt b/src/main/kotlin/org/acejump/config/AceSettingsPanel.kt
index e33b018..615c4da 100644
--- a/src/main/kotlin/org/acejump/config/AceSettingsPanel.kt
+++ b/src/main/kotlin/org/acejump/config/AceSettingsPanel.kt
@@ -5,17 +5,14 @@ import com.intellij.ui.ColorPanel
 import com.intellij.ui.components.JBCheckBox
 import com.intellij.ui.components.JBTextArea
 import com.intellij.ui.components.JBTextField
-import com.intellij.ui.layout.Cell
-import com.intellij.ui.layout.GrowPolicy.MEDIUM_TEXT
-import com.intellij.ui.layout.GrowPolicy.SHORT_TEXT
-import com.intellij.ui.layout.panel
+import com.intellij.ui.dsl.builder.*
 import org.acejump.input.JumpMode
 import org.acejump.input.KeyLayout
 import java.awt.Color
 import java.awt.Font
 import javax.swing.JCheckBox
-import javax.swing.JComponent
 import javax.swing.JPanel
+import javax.swing.JTextArea
 import javax.swing.text.JTextComponent
 import kotlin.reflect.KProperty
 
@@ -54,45 +51,41 @@ internal class AceSettingsPanel {
   }
 
   internal val rootPanel: JPanel = panel {
-    fun Cell.short(component: JComponent) = component(growPolicy = SHORT_TEXT)
-    fun Cell.medium(component: JComponent) = component(growPolicy = MEDIUM_TEXT)
 
-    titledRow("Characters and Layout") {
-      row("Allowed characters in tags:") { medium(tagCharsField) }
-      row("Keyboard layout:") { short(keyboardLayoutCombo) }
-      row("Keyboard design:") { short(keyboardLayoutArea) }
+    group("Characters and Layout") {
+      row("Allowed characters in tags:") { cell(tagCharsField).columns(COLUMNS_LARGE) }
+      row("Keyboard layout:") { cell(keyboardLayoutCombo).columns(COLUMNS_SHORT) }
+      row("Keyboard design:") { cell(keyboardLayoutArea).columns(COLUMNS_SHORT) }
     }
 
-    titledRow("Modes") {
-      row("Cycle order:") { cell { cycleModeCombo1() } }
+    group("Modes") {
+      row("Cycle order:") { cycleModeCombo1 }
       row("") {
-        cell(isVerticalFlow = true) {
-          cycleModeCombo2()
-          cycleModeCombo3()
-          cycleModeCombo4()
-        }
+          cycleModeCombo2
+          cycleModeCombo3
+          cycleModeCombo4
       }
     }
 
-    titledRow("Colors") {
-      row("Jump mode caret background:") { short(jumpModeColorWheel) }
-      row("Jump to End mode caret background:") { short(jumpEndModeColorWheel) }
-      row("Target mode caret background:") { short(targetModeColorWheel) }
-      row("Definition mode caret background:") { short(definitionModeColorWheel) }
-      row("Searched text background:") { short(textHighlightColorWheel) }
-      row("Tag foreground:") { short(tagForegroundColorWheel) }
-      row("Tag background:") { short(tagBackgroundColorWheel) }
+    group("Colors") {
+      row("Jump mode caret background:") { cell(jumpModeColorWheel) }
+      row("Jump to End mode caret background:") { cell(jumpEndModeColorWheel) }
+      row("Target mode caret background:") { cell(targetModeColorWheel) }
+      row("Definition mode caret background:") { cell(definitionModeColorWheel) }
+      row("Searched text background:") { cell(textHighlightColorWheel) }
+      row("Tag foreground:") { cell(tagForegroundColorWheel) }
+      row("Tag background:") { cell(tagBackgroundColorWheel) }
     }
 
-    titledRow("Behavior") {
-      row { short(searchWholeFileCheckBox.apply { text = "Search whole file" }) }
-      row("Minimum typed characters (1-10):") { short(minQueryLengthField) }
+    group("Behavior") {
+      row { cell(searchWholeFileCheckBox.apply { text = "Search whole file" }) }
+      row("Minimum typed characters (1-10):") { cell(minQueryLengthField) }
     }
-    titledRow("Language Settings") {
-      row { short(mapToASCIICheckBox.apply { text = "Map unicode to ASCII" }) }
+    group("Language Settings") {
+      row { cell(mapToASCIICheckBox.apply { text = "Map unicode to ASCII" }) }
     }
-    titledRow("Visual") {
-      row { short(showSearchNotificationCheckBox.apply { text = "Show hint with search text" }) }
+    group("Visual") {
+      row { cell(showSearchNotificationCheckBox.apply { text = "Show hint with search text" }) }
     }
   }
 
diff --git a/src/test/kotlin/ExternalUsageTest.kt b/src/test/kotlin/ExternalUsageTest.kt
index b938eb6..495bbb6 100644
--- a/src/test/kotlin/ExternalUsageTest.kt
+++ b/src/test/kotlin/ExternalUsageTest.kt
@@ -43,12 +43,12 @@ class ExternalUsageTest: BaseTest() {
   fun `test externally tagged results with multiple editors`() {
     val fileA = MockVirtualFile("a.txt", "first file")
     val fileB = MockVirtualFile("b.txt", "second file with more markers")
-    myManager.openFile(fileA, true)
-    myManager.openFile(fileB, false)
+    manager?.openFile(fileA, true)
+    manager?.openFile(fileB, false)
     
-    val mainEditor = (myManager.selectedEditor as TextEditor).editor
-    val editorA = (myManager.getEditors(fileA).single() as TextEditor).editor
-    val editorB = (myManager.getEditors(fileB).single() as TextEditor).editor
+    val mainEditor = (manager?.selectedEditor as TextEditor).editor
+    val editorA = (manager?.getEditors(fileA)?.single() as TextEditor).editor
+    val editorB = (manager?.getEditors(fileB)?.single() as TextEditor).editor
     
     val session = SessionManager.start(mainEditor, listOf(editorA, editorB))
     
diff --git a/src/test/kotlin/org/acejump/test/util/BaseTest.kt b/src/test/kotlin/org/acejump/test/util/BaseTest.kt
index d074ff6..f74dd3a 100644
--- a/src/test/kotlin/org/acejump/test/util/BaseTest.kt
+++ b/src/test/kotlin/org/acejump/test/util/BaseTest.kt
@@ -38,7 +38,7 @@ abstract class BaseTest: FileEditorManagerTestCase() {
       UIUtil.dispatchAllInvocationEvents()
       assertEmpty(it.markupModel.allHighlighters)
     }
-    myManager.closeAllFiles()
+    manager?.closeAllFiles()
   }
 
   fun typeAndWaitForResults(string: String) {