diff --git a/.idea/runConfigurations/Plugin___IdeaVIM.xml b/.idea/runConfigurations/Plugin___IdeaVIM.xml
new file mode 100644
index 0000000..c9a9c3e
--- /dev/null
+++ b/.idea/runConfigurations/Plugin___IdeaVIM.xml
@@ -0,0 +1,26 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="Plugin + IdeaVIM" type="GradleRunConfiguration" factoryName="Gradle">
+    <ExternalSystemSettings>
+      <option name="env">
+        <map>
+          <entry key="IDEAVIM" value="1" />
+        </map>
+      </option>
+      <option name="executionName" />
+      <option name="externalProjectPath" value="$PROJECT_DIR$" />
+      <option name="externalSystemIdString" value="GRADLE" />
+      <option name="scriptParameters" value=":runIde" />
+      <option name="taskDescriptions">
+        <list />
+      </option>
+      <option name="taskNames">
+        <list />
+      </option>
+      <option name="vmOptions" />
+    </ExternalSystemSettings>
+    <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
+    <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+    <DebugAllEnabled>false</DebugAllEnabled>
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index c6c1f9a..03439db 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -19,4 +19,8 @@ dependencies {
 
 intellij {
     version.set("2021.2.2")
+	
+	if (System.getenv("IDEAVIM") == "1") {
+		plugins.add("IdeaVIM:0.66")
+	}
 }
diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt
new file mode 100644
index 0000000..6cc74e8
--- /dev/null
+++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt
@@ -0,0 +1,24 @@
+package com.chylex.intellij.keyboardmaster
+
+import com.chylex.intellij.keyboardmaster.feature.codeCompletion.CodeCompletionPopupKeyHandler
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.startup.StartupActivity
+
+class PluginStartup : StartupActivity.DumbAware {
+	private var isInitialized = false
+	
+	override fun runActivity(project: Project) {
+		if (!isInitialized) {
+			isInitialized = true
+			
+			val application = ApplicationManager.getApplication()
+			if (application.isUnitTestMode) {
+				CodeCompletionPopupKeyHandler.registerRawHandler()
+			}
+			else {
+				application.invokeLater(CodeCompletionPopupKeyHandler.Companion::registerRawHandler)
+			}
+		}
+	}
+}
diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt
index 9d7c0ce..ceb7aa8 100644
--- a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt
+++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt
@@ -6,6 +6,7 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl
 import com.intellij.codeInsight.template.impl.editorActions.TypedActionHandlerBase
 import com.intellij.openapi.actionSystem.DataContext
 import com.intellij.openapi.editor.Editor
+import com.intellij.openapi.editor.actionSystem.TypedAction
 import com.intellij.openapi.editor.actionSystem.TypedActionHandler
 import com.intellij.ui.ScrollingUtil
 import javax.swing.ListModel
@@ -13,7 +14,16 @@ import javax.swing.ListModel
 /**
  * Handles configured key bindings inside a code completion popup menu.
  */
-class CodeCompletionPopupKeyHandler(originalHandler: TypedActionHandler?) : TypedActionHandlerBase(originalHandler) {
+class CodeCompletionPopupKeyHandler private constructor(originalHandler: TypedActionHandler?) : TypedActionHandlerBase(originalHandler) {
+	companion object {
+		/**
+		 * Registers the key handler as a raw handler, because IdeaVIM steals keys from Keyboard Master when renaming an element in normal mode.
+		 */
+		fun registerRawHandler() {
+			TypedAction.getInstance().let { it.setupRawHandler(CodeCompletionPopupKeyHandler(it.rawHandler)) }
+		}
+	}
+	
 	override fun execute(editor: Editor, charTyped: Char, dataContext: DataContext) {
 		if (!executeImpl(editor, charTyped)) {
 			myOriginalHandler?.execute(editor, charTyped, dataContext)
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 18675ed..0cbfeaf 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -19,7 +19,6 @@
   <extensions defaultExtensionNs="com.intellij">
     <applicationService serviceImplementation="com.chylex.intellij.keyboardmaster.configuration.PluginConfiguration" />
     <applicationConfigurable parentId="tools" instance="com.chylex.intellij.keyboardmaster.configuration.PluginConfigurable" id="com.chylex.keyboardmaster" />
-    <!--suppress PluginXmlValidity, PluginXmlDynamicPlugin -->
-    <editorTypedHandler implementationClass="com.chylex.intellij.keyboardmaster.feature.codeCompletion.CodeCompletionPopupKeyHandler" />
+    <postStartupActivity implementation="com.chylex.intellij.keyboardmaster.PluginStartup" order="last" />
   </extensions>
 </idea-plugin>