diff --git a/annotation-processors/src/main/kotlin/com/intellij/vim/annotations/CommandOrMotion.kt b/annotation-processors/src/main/kotlin/com/intellij/vim/annotations/CommandOrMotion.kt
new file mode 100644
index 000000000..6e0a84f1f
--- /dev/null
+++ b/annotation-processors/src/main/kotlin/com/intellij/vim/annotations/CommandOrMotion.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2003-2023 The IdeaVim authors
+ *
+ * Use of this source code is governed by an MIT-style
+ * license that can be found in the LICENSE.txt file or at
+ * https://opensource.org/licenses/MIT.
+ */
+
+package com.intellij.vim.annotations
+
+// TODO support numpad keys parsing, see :keycodes
+/**
+ * It's not necessary a Vim command
+ * This annotation may be used for:
+ * - commands
+ * - motions
+ */
+@Target(AnnotationTarget.CLASS)
+@Retention(AnnotationRetention.SOURCE)
+annotation class CommandOrMotion(val keys: Array<String>, vararg val modes: Mode)
+
+annotation class TextObject(val keys: String)
+
+
+/**
+ * @author vlan
+ *
+ * COMPATIBILITY-LAYER: Do not move this class to a different package
+ */
+enum class Mode {
+  /**
+   * Indicates this key mapping applies to Normal mode
+   */
+  NORMAL,
+
+  /**
+   * Indicates this key mapping applies to Visual mode
+   */
+  VISUAL,
+
+  /**
+   * Indicates this key mapping applies to Select mode
+   */
+  SELECT,
+
+  /**
+   * Indicates this key mapping applies to Operator Pending mode
+   */
+  OP_PENDING,
+
+  /**
+   * Indicates this key mapping applies to Insert mode
+   */
+  INSERT,
+
+  /**
+   * Indicates this key mapping applies to Command Line mode
+   */
+  CMD_LINE,
+}
\ No newline at end of file
diff --git a/src/main/java/com/maddyhome/idea/vim/action/ExEntryAction.kt b/src/main/java/com/maddyhome/idea/vim/action/ExEntryAction.kt
index 99c5e5c31..b6438a6c3 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/ExEntryAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/ExEntryAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.VimPlugin
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = [":"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 internal class ExEntryAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/OperatorAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/OperatorAction.kt
index b5435ffdf..743bdfa7c 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/OperatorAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/OperatorAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.VimPlugin
 import com.maddyhome.idea.vim.api.ExecutionContext
@@ -47,6 +49,7 @@ private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textR
   return result
 }
 
+@CommandOrMotion(keys = ["g@"], modes = [Mode.NORMAL])
 internal class OperatorAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
@@ -97,6 +100,7 @@ internal class OperatorAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["g@"], modes = [Mode.VISUAL])
 internal class VisualOperatorAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/RepeatChangeAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/RepeatChangeAction.kt
index 13ada7276..c581028cf 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/RepeatChangeAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/RepeatChangeAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.intellij.openapi.command.CommandProcessor
 import com.maddyhome.idea.vim.VimPlugin
 import com.maddyhome.idea.vim.api.ExecutionContext
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.vimStateMachine
 import com.maddyhome.idea.vim.newapi.ij
 
+@CommandOrMotion(keys = ["."], modes = [Mode.NORMAL])
 internal class RepeatChangeAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_WRITABLE
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesAction.kt
index a4c2b190a..3bce67007 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.newapi.ijOptions
 
+@CommandOrMotion(keys = ["gJ"], modes = [Mode.NORMAL])
 public class DeleteJoinLinesAction : ChangeEditorActionHandler.ConditionalSingleExecution() {
   override val type: Command.Type = Command.Type.DELETE
   override fun runAsMulticaret(
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesSpacesAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesSpacesAction.kt
index e0765dc26..1c0eaa866 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesSpacesAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinLinesSpacesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.newapi.ijOptions
 
+@CommandOrMotion(keys = ["J"], modes = [Mode.NORMAL])
 public class DeleteJoinLinesSpacesAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesAction.kt
index a08db4958..f287f8a20 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["gJ"], modes = [Mode.VISUAL])
 public class DeleteJoinVisualLinesAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesSpacesAction.kt b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesSpacesAction.kt
index 5f7aa3d88..e5ed6959c 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesSpacesAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/change/delete/DeleteJoinVisualLinesSpacesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["J"], modes = [Mode.VISUAL])
 public class DeleteJoinVisualLinesSpacesAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt b/src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt
index 7a044ddba..d824c7059 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/editor/VimEditorActions.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.editor
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.intellij.openapi.actionSystem.IdeActions
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
@@ -23,6 +25,7 @@ import java.awt.event.KeyEvent
 import java.util.*
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-H>", "<BS>"], modes = [Mode.INSERT])
 internal class VimEditorBackSpace : IdeActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK)),
@@ -31,6 +34,7 @@ internal class VimEditorBackSpace : IdeActionHandler(IdeActions.ACTION_EDITOR_BA
   override val type: Command.Type = Command.Type.DELETE
 }
 
+@CommandOrMotion(keys = ["<Del>"], modes = [Mode.INSERT])
 internal class VimEditorDelete : IdeActionHandler(IdeActions.ACTION_EDITOR_DELETE), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)),
@@ -39,6 +43,7 @@ internal class VimEditorDelete : IdeActionHandler(IdeActions.ACTION_EDITOR_DELET
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_STROKE)
 }
 
+@CommandOrMotion(keys = ["<Down>", "<kDown>"], modes = [Mode.INSERT])
 internal class VimEditorDown : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)),
@@ -48,6 +53,7 @@ internal class VimEditorDown : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CA
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_CLEAR_STROKES)
 }
 
+@CommandOrMotion(keys = ["<Tab>", "<C-I>"], modes = [Mode.INSERT])
 internal class VimEditorTab : IdeActionHandler(IdeActions.ACTION_EDITOR_TAB), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_DOWN_MASK)),
@@ -57,6 +63,7 @@ internal class VimEditorTab : IdeActionHandler(IdeActions.ACTION_EDITOR_TAB), Co
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_STROKE)
 }
 
+@CommandOrMotion(keys = ["<Up>", "<kUp>"], modes = [Mode.INSERT])
 internal class VimEditorUp : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_UP), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)),
@@ -66,6 +73,7 @@ internal class VimEditorUp : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARE
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_CLEAR_STROKES)
 }
 
+@CommandOrMotion(keys = ["K"], modes = [Mode.NORMAL])
 internal class VimQuickJavaDoc : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/src/main/java/com/maddyhome/idea/vim/action/ex/ProcessExEntryAction.kt b/src/main/java/com/maddyhome/idea/vim/action/ex/ProcessExEntryAction.kt
index ce0fa6d4f..6f4dab3d1 100644
--- a/src/main/java/com/maddyhome/idea/vim/action/ex/ProcessExEntryAction.kt
+++ b/src/main/java/com/maddyhome/idea/vim/action/ex/ProcessExEntryAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.ex
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.VimPlugin
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
@@ -23,6 +25,7 @@ import javax.swing.KeyStroke
  *
  * The mapping for this action means that the ex command is executed as a write action
  */
+@CommandOrMotion(keys = ["<CR>", "<C-M>", "<C-J>"], modes = [Mode.CMD_LINE])
 public class ProcessExEntryAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> =
     parseKeysSet("<CR>", "<C-M>", 0x0a.toChar().toString(), 0x0d.toChar().toString())
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ResetModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ResetModeAction.kt
index 82b11f993..5cb9db630 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ResetModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/ResetModeAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
@@ -14,13 +16,13 @@ import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
 import com.maddyhome.idea.vim.api.moveToMotion
 import com.maddyhome.idea.vim.command.Command
-import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.state.mode.mode
 
+@CommandOrMotion(keys = ["<C-\\><C-N>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.SELECT, Mode.OP_PENDING, Mode.INSERT, Mode.CMD_LINE])
 public class ResetModeAction : VimActionHandler.ConditionalMulticaret() {
-  private lateinit var modeBeforeReset: Mode
+  private lateinit var modeBeforeReset: com.maddyhome.idea.vim.state.mode.Mode
   override val type: Command.Type = Command.Type.OTHER_WRITABLE
   override fun runAsMulticaret(
     editor: VimEditor,
@@ -40,7 +42,7 @@ public class ResetModeAction : VimActionHandler.ConditionalMulticaret() {
     cmd: Command,
     operatorArguments: OperatorArguments,
   ): Boolean {
-    if (modeBeforeReset == Mode.INSERT) {
+    if (modeBeforeReset == com.maddyhome.idea.vim.state.mode.Mode.INSERT) {
       val position = injector.motion.getHorizontalMotion(editor, caret, -1, false)
       caret.moveToMotion(position)
     }
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/RedoAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/RedoAction.kt
index 42d3279fc..6ca5c81c4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/RedoAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/RedoAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["<C-R>"], modes = [Mode.NORMAL])
 public class RedoAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/UndoAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/UndoAction.kt
index a83e32599..07b945f76 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/UndoAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/UndoAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["u"], modes = [Mode.NORMAL])
 public class UndoAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     injector.parser.parseKeys("u"),
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/AutoIndentLinesVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/AutoIndentLinesVisualAction.kt
index 0f56bcc73..a8621cd2a 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/AutoIndentLinesVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/AutoIndentLinesVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["="], modes = [Mode.VISUAL])
 public class AutoIndentLinesVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt
index 7496043b1..3b35d23f6 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.CharacterHelper
 
+@CommandOrMotion(keys = ["gu"], modes = [Mode.NORMAL])
 public class ChangeCaseLowerMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerVisualAction.kt
index 876b15c3c..83a8d6922 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseLowerVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["u"], modes = [Mode.VISUAL])
 public class ChangeCaseLowerVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleCharacterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleCharacterAction.kt
index f4c285832..90aac05f9 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleCharacterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleCharacterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["~"], modes = [Mode.NORMAL])
 public class ChangeCaseToggleCharacterAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleMotionAction.kt
index 686e77aaa..f1977d440 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.CharacterHelper
 
+@CommandOrMotion(keys = ["g~"], modes = [Mode.NORMAL])
 public class ChangeCaseToggleMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleVisualAction.kt
index ef79a6884..a19d81d57 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseToggleVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["~"], modes = [Mode.VISUAL])
 public class ChangeCaseToggleVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperMotionAction.kt
index 86cc04587..ab2a9f637 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.CharacterHelper
 
+@CommandOrMotion(keys = ["gU"], modes = [Mode.NORMAL])
 public class ChangeCaseUpperMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperVisualAction.kt
index 9a5caae90..90374802b 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCaseUpperVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["U"], modes = [Mode.VISUAL])
 public class ChangeCaseUpperVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharacterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharacterAction.kt
index a8ec67146..a48213788 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharacterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharacterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["r"], modes = [Mode.NORMAL])
 public class ChangeCharacterAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharactersAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharactersAction.kt
index 8ea8e2c62..d8454d14f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharactersAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeCharactersAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["s"], modes = [Mode.NORMAL])
 public class ChangeCharactersAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeEndOfLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeEndOfLineAction.kt
index 4a4418dd5..db6a6d985 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeEndOfLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeEndOfLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["C"], modes = [Mode.NORMAL])
 public class ChangeEndOfLineAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastGlobalSearchReplaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastGlobalSearchReplaceAction.kt
index 9fd524ee6..225b8c768 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastGlobalSearchReplaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastGlobalSearchReplaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.ex.ranges.LineRange
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.vimscript.model.Script
 
+@CommandOrMotion(keys = ["g&"], modes = [Mode.NORMAL])
 public class ChangeLastGlobalSearchReplaceAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastSearchReplaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastSearchReplaceAction.kt
index c55efe487..ee98c0df8 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastSearchReplaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLastSearchReplaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.ex.ranges.LineRange
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.vimscript.model.Script
 
+@CommandOrMotion(keys = ["&"], modes = [Mode.NORMAL])
 public class ChangeLastSearchReplaceAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLineAction.kt
index 73e9385ee..7b8e2db5f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["S"], modes = [Mode.NORMAL])
 public class ChangeLineAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeMotionAction.kt
index a0a4d38e7..b4e962c68 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.DuplicableOperatorAction
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["c"], modes = [Mode.NORMAL])
 public class ChangeMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeReplaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeReplaceAction.kt
index 697754b4e..a863d6d53 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeReplaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeReplaceAction.kt
@@ -7,18 +7,20 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
 import com.maddyhome.idea.vim.command.Argument
 import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.CommandFlags
-import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["R"], modes = [Mode.NORMAL])
 public class ChangeReplaceAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.CHANGE
 
@@ -41,5 +43,5 @@ public class ChangeReplaceAction : ChangeEditorActionHandler.SingleExecution() {
  * @param context The data context
  */
 private fun changeReplace(editor: VimEditor, context: ExecutionContext) {
-  injector.changeGroup.initInsert(editor, context, Mode.REPLACE)
+  injector.changeGroup.initInsert(editor, context, com.maddyhome.idea.vim.state.mode.Mode.REPLACE)
 }
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualAction.kt
index 7cfd7b38d..94a1f94a0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["c", "s"], modes = [Mode.VISUAL])
 public class ChangeVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualCharacterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualCharacterAction.kt
index 5785fff47..11d988df3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualCharacterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualCharacterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -26,6 +28,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["r"], modes = [Mode.VISUAL])
 public class ChangeVisualCharacterAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesAction.kt
index 1a3a99df1..8c29f59dd 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -29,6 +31,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["R", "S"], modes = [Mode.VISUAL])
 public class ChangeVisualLinesAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt
index 2ac72be76..574fe9fc6 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ChangeVisualLinesEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -29,6 +31,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["C"], modes = [Mode.VISUAL])
 public class ChangeVisualLinesEndAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterMotionAction.kt
index 3d3bac334..9eaa73eb0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterMotionAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.endOffsetInclusive
 
+@CommandOrMotion(keys = ["!"], modes = [Mode.NORMAL])
 public class FilterMotionAction : VimActionHandler.SingleExecution(), DuplicableOperatorAction {
 
   override val type: Command.Type = Command.Type.CHANGE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterVisualLinesAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterVisualLinesAction.kt
index b9e656498..8f26d7317 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterVisualLinesAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/FilterVisualLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -21,6 +23,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["!"], modes = [Mode.VISUAL])
 public class FilterVisualLinesAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeMotionAction.kt
index 06a0a2066..db498318b 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.DuplicableOperatorAction
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["gq"], modes = [Mode.NORMAL])
 public class ReformatCodeMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeVisualAction.kt
index 1483dbb15..cf99cd09f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/ReformatCodeVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["gq"], modes = [Mode.VISUAL])
 public class ReformatCodeVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeNumberIncAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeNumberIncAction.kt
index 7475268e2..cebf1fe67 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeNumberIncAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeNumberIncAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change.number
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -30,5 +32,8 @@ public sealed class IncAction(public val inc: Int) : ChangeEditorActionHandler.F
   }
 }
 
+@CommandOrMotion(keys = ["<C-A>"], modes = [Mode.NORMAL])
 public class ChangeNumberIncAction : IncAction(1)
+
+@CommandOrMotion(keys = ["<C-X>"], modes = [Mode.NORMAL])
 public class ChangeNumberDecAction : IncAction(-1)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeVisualNumberIncAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeVisualNumberIncAction.kt
index 0a472e57c..d1664fbe4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeVisualNumberIncAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/change/number/ChangeVisualNumberIncAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.change.number
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -35,7 +37,14 @@ public sealed class IncNumber(public val inc: Int, private val avalanche: Boolea
   }
 }
 
+@CommandOrMotion(keys = ["<C-A>"], modes = [Mode.VISUAL])
 public class ChangeVisualNumberIncAction : IncNumber(1, false)
+
+@CommandOrMotion(keys = ["<C-X>"], modes = [Mode.VISUAL])
 public class ChangeVisualNumberDecAction : IncNumber(-1, false)
+
+@CommandOrMotion(keys = ["g<C-A>"], modes = [Mode.VISUAL])
 public class ChangeVisualNumberAvalancheIncAction : IncNumber(1, true)
+
+@CommandOrMotion(keys = ["g<C-X>"], modes = [Mode.VISUAL])
 public class ChangeVisualNumberAvalancheDecAction : IncNumber(-1, true)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteCharacterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteCharacterAction.kt
index 56e5f3c8d..cac70450e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteCharacterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteCharacterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -16,8 +18,13 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["<Del>"], modes = [Mode.NORMAL])
 public class DeleteCharacterAction : DeleteCharacter({ 1 })
+
+@CommandOrMotion(keys = ["X"], modes = [Mode.NORMAL])
 public class DeleteCharacterLeftAction : DeleteCharacter({ -it })
+
+@CommandOrMotion(keys = ["x"], modes = [Mode.NORMAL])
 public class DeleteCharacterRightAction : DeleteCharacter({ it })
 
 public abstract class DeleteCharacter(private val countModifier: (Int) -> Int) : ChangeEditorActionHandler.ForEachCaret() {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteEndOfLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteEndOfLineAction.kt
index 2e0397693..8bd22c2e8 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteEndOfLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteEndOfLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["D"], modes = [Mode.NORMAL])
 public class DeleteEndOfLineAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteMotionAction.kt
index 439f661ef..bd61d8300 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.DuplicableOperatorAction
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["d"], modes = [Mode.NORMAL])
 public class DeleteMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualAction.kt
index 2f4c4d4cf..536aa96a5 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["d", "x", "<Del>"], modes = [Mode.VISUAL])
 public class DeleteVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesAction.kt
index 8baf46926..0a49e4422 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -26,6 +28,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["X"], modes = [Mode.VISUAL])
 public class DeleteVisualLinesAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesEndAction.kt
index 52070216f..8e2fc0b1d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/delete/DeleteVisualLinesEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.delete
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -26,6 +28,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["D"], modes = [Mode.VISUAL])
 public class DeleteVisualLinesEndAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.DELETE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterCursorAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterCursorAction.kt
index 1721681e4..c678e730f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterCursorAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterCursorAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["a"], modes = [Mode.NORMAL])
 public class InsertAfterCursorAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterLineEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterLineEndAction.kt
index 96ec58f0f..dbf9b43d4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterLineEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAfterLineEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["A"], modes = [Mode.NORMAL])
 public class InsertAfterLineEndAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAtPreviousInsertAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAtPreviousInsertAction.kt
index 3ced425f5..af46f7094 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAtPreviousInsertAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertAtPreviousInsertAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.VimMarkService
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["gi"], modes = [Mode.NORMAL])
 public class InsertAtPreviousInsertAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeCursorAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeCursorAction.kt
index 28cc31fd2..e374d93de 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeCursorAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeCursorAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.helper.enumSetOf
 import org.jetbrains.annotations.Contract
 import java.util.*
 
+@CommandOrMotion(keys = ["i", "<Insert>"], modes = [Mode.NORMAL])
 public class InsertBeforeCursorAction : ChangeEditorActionHandler.SingleExecution() {
   @get:Contract(pure = true)
   override val type: Command.Type = Command.Type.INSERT
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeFirstNonBlankAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeFirstNonBlankAction.kt
index f730ef8c8..51f1fdcd0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeFirstNonBlankAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertBeforeFirstNonBlankAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["I"], modes = [Mode.NORMAL])
 public class InsertBeforeFirstNonBlankAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCharacterAroundCursorAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCharacterAroundCursorAction.kt
index fa4088bf3..4a9e91bbf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCharacterAroundCursorAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCharacterAroundCursorAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.MutableVimEditor
 import com.maddyhome.idea.vim.api.VimCaret
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 
+@CommandOrMotion(keys = ["<C-Y>"], modes = [Mode.INSERT])
 public class InsertCharacterAboveCursorAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.INSERT
 
@@ -39,6 +42,7 @@ public class InsertCharacterAboveCursorAction : ChangeEditorActionHandler.ForEac
   }
 }
 
+@CommandOrMotion(keys = ["<C-E>"], modes = [Mode.INSERT])
 public class InsertCharacterBelowCursorAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt
index dc1831773..00164cee8 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedDigraphAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-K>"], modes = [Mode.INSERT, Mode.CMD_LINE])
 public class InsertCompletedDigraphAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
   override val argumentType: Argument.Type = Argument.Type.DIGRAPH
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt
index 6aac26296..dd74d80be 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertCompletedLiteralAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-V>", "<C-Q>"], modes = [Mode.INSERT, Mode.CMD_LINE])
 public class InsertCompletedLiteralAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
   override val argumentType: Argument.Type = Argument.Type.DIGRAPH
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeleteInsertedTextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeleteInsertedTextAction.kt
index 24e932169..175aaf13e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeleteInsertedTextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeleteInsertedTextAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-U>"], modes = [Mode.INSERT])
 public class InsertDeleteInsertedTextAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeletePreviousWordAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeletePreviousWordAction.kt
index eaf423a75..44009b234 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeletePreviousWordAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertDeletePreviousWordAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.Motion.AbsoluteOffset
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-W>"], modes = [Mode.INSERT])
 public class InsertDeletePreviousWordAction : ChangeEditorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertEnterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertEnterAction.kt
index d30c3f7cc..529f143f6 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertEnterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertEnterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-M>", "<CR>"], modes = [Mode.INSERT])
 public class InsertEnterAction : VimActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertExitModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertExitModeAction.kt
index ffaa68c32..225c70d5d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertExitModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertExitModeAction.kt
@@ -7,12 +7,15 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["<C-[>", "<C-C>", "<Esc>"], modes = [Mode.INSERT])
 public class InsertExitModeAction : VimActionHandler.SingleExecution() {
   // Note that hitting Escape can insert text when exiting insert mode after visual block mode.
   // If the editor is read-only, we'll get a "This view is read-only" tooltip. However, we should only enter insert
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertInsertAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertInsertAction.kt
index efd7d0574..224bfbcea 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertInsertAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertInsertAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.command.Command
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.helper.enumSetOf
 import com.maddyhome.idea.vim.helper.vimStateMachine
 import java.util.*
 
+@CommandOrMotion(keys = ["<Insert>"], modes = [Mode.INSERT])
 public class InsertInsertAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertLineStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertLineStartAction.kt
index e3f7e3d7b..598abae53 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertLineStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertLineStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["gI"], modes = [Mode.NORMAL])
 public class InsertLineStartAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt
index 300ce7f6f..5aafad6cc 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt
@@ -7,6 +7,7 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +22,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["o"], modes = [com.intellij.vim.annotations.Mode.NORMAL])
 public class InsertNewLineBelowAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
@@ -38,6 +40,7 @@ public class InsertNewLineBelowAction : ChangeEditorActionHandler.SingleExecutio
   }
 }
 
+@CommandOrMotion(keys = ["O"], modes = [com.intellij.vim.annotations.Mode.NORMAL])
 public class InsertNewLineAboveAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertPreviousInsertAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertPreviousInsertAction.kt
index 29470d654..5b4cedf77 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertPreviousInsertAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertPreviousInsertAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-A>"], modes = [Mode.INSERT])
 public class InsertPreviousInsertAction : ChangeEditorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
@@ -32,6 +35,8 @@ public class InsertPreviousInsertAction : ChangeEditorActionHandler.SingleExecut
   }
 }
 
+// TODO is C-S-2 needed?
+@CommandOrMotion(keys = ["C-@", "<C-S-2>"], modes = [Mode.INSERT])
 public class InsertPreviousInsertExitAction : ChangeEditorActionHandler.SingleExecution(), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_DOWN_MASK or KeyEvent.SHIFT_DOWN_MASK)),
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertRegisterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertRegisterAction.kt
index ca0966be7..415c3d151 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertRegisterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertRegisterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.put.PutData
 import com.maddyhome.idea.vim.register.Register
 import com.maddyhome.idea.vim.vimscript.model.Script
 
+@CommandOrMotion(keys = ["<C-R>"], modes = [Mode.INSERT])
 public class InsertRegisterAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertSingleCommandAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertSingleCommandAction.kt
index dd2fe2527..878ece40e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertSingleCommandAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertSingleCommandAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-O>"], modes = [Mode.INSERT])
 public class InsertSingleCommandAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockAppendAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockAppendAction.kt
index e8168a5e1..8b470cd81 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockAppendAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockAppendAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["A"], modes = [Mode.VISUAL])
 public class VisualBlockAppendAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockInsertAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockInsertAction.kt
index b968a3414..291c592da 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockInsertAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/VisualBlockInsertAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.insert
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["I"], modes = [Mode.VISUAL])
 public class VisualBlockInsertAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.INSERT
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/AutoIndentMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/AutoIndentMotionAction.kt
index 64012922d..8b4877403 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/AutoIndentMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/AutoIndentMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.change.shift
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.ChangeEditorActionHandler
 /**
  * @author Aleksey Lagoshin
  */
+@CommandOrMotion(keys = ["="], modes = [Mode.NORMAL])
 public class AutoIndentMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftLeft.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftLeft.kt
index 3dce20b5d..4e2711a3c 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftLeft.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftLeft.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.change.shift
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-D>"], modes = [Mode.INSERT])
 public class ShiftLeftLinesAction : ChangeEditorActionHandler.ForEachCaret() {
 
   override val type: Command.Type = Command.Type.INSERT
@@ -42,6 +45,7 @@ public class ShiftLeftLinesAction : ChangeEditorActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<"], modes = [Mode.NORMAL])
 public class ShiftLeftMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
@@ -63,6 +67,7 @@ public class ShiftLeftMotionAction : ChangeEditorActionHandler.ForEachCaret(), D
   }
 }
 
+@CommandOrMotion(keys = ["<"], modes = [Mode.VISUAL])
 public class ShiftLeftVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftRight.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftRight.kt
index 95af217f2..1680e8cc1 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftRight.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/shift/ShiftRight.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.change.shift
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-T>"], modes = [Mode.INSERT])
 public class ShiftRightLinesAction : ChangeEditorActionHandler.ForEachCaret() {
 
   override val type: Command.Type = Command.Type.INSERT
@@ -42,6 +45,7 @@ public class ShiftRightLinesAction : ChangeEditorActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = [">"], modes = [Mode.NORMAL])
 public class ShiftRightMotionAction : ChangeEditorActionHandler.ForEachCaret(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.CHANGE
 
@@ -63,6 +67,7 @@ public class ShiftRightMotionAction : ChangeEditorActionHandler.ForEachCaret(),
   }
 }
 
+@CommandOrMotion(keys = [">"], modes = [Mode.VISUAL])
 public class ShiftRightVisualAction : VisualOperatorActionHandler.ForEachCaret() {
   override val type: Command.Type = Command.Type.CHANGE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutTextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutTextAction.kt
index 74dcc72f7..8c2cd8606 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutTextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutTextAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -68,11 +70,20 @@ public sealed class PutTextBaseAction(
   }
 }
 
+@CommandOrMotion(keys = ["p"], modes = [Mode.NORMAL])
 public class PutTextAfterCursorAction : PutTextBaseAction(insertTextBeforeCaret = false, indent = true, caretAfterInsertedText = false)
+
+@CommandOrMotion(keys = ["gp"], modes = [Mode.NORMAL])
 public class PutTextAfterCursorActionMoveCursor : PutTextBaseAction(insertTextBeforeCaret = false, indent = true, caretAfterInsertedText = true)
 
+@CommandOrMotion(keys = ["]p"], modes = [Mode.NORMAL])
 public class PutTextAfterCursorNoIndentAction : PutTextBaseAction(insertTextBeforeCaret = false, indent = false, caretAfterInsertedText = false)
+
+@CommandOrMotion(keys = ["[P", "]P", "[p"], modes = [Mode.NORMAL])
 public class PutTextBeforeCursorNoIndentAction : PutTextBaseAction(insertTextBeforeCaret = true, indent = false, caretAfterInsertedText = false)
 
+@CommandOrMotion(keys = ["P"], modes = [Mode.NORMAL])
 public class PutTextBeforeCursorAction : PutTextBaseAction(insertTextBeforeCaret = true, indent = true, caretAfterInsertedText = false)
+
+@CommandOrMotion(keys = ["gP"], modes = [Mode.NORMAL])
 public class PutTextBeforeCursorActionMoveCursor : PutTextBaseAction(insertTextBeforeCaret = true, indent = true, caretAfterInsertedText = true)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutVisualTextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutVisualTextAction.kt
index 7bfe439eb..0f482db9e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutVisualTextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/PutVisualTextAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -71,11 +73,20 @@ public sealed class PutVisualTextBaseAction(
   }
 }
 
+@CommandOrMotion(keys = ["P"], modes = [Mode.VISUAL])
 public class PutVisualTextBeforeCursorAction : PutVisualTextBaseAction(insertTextBeforeCaret = true, indent = true, caretAfterInsertedText = false, modifyRegister = false)
+
+@CommandOrMotion(keys = ["p"], modes = [Mode.VISUAL])
 public class PutVisualTextAfterCursorAction : PutVisualTextBaseAction(insertTextBeforeCaret = false, indent = true, caretAfterInsertedText = false)
 
+@CommandOrMotion(keys = ["]P", "[P"], modes = [Mode.VISUAL])
 public class PutVisualTextBeforeCursorNoIndentAction : PutVisualTextBaseAction(insertTextBeforeCaret = true, indent = false, caretAfterInsertedText = false)
+
+@CommandOrMotion(keys = ["[p", "]p"], modes = [Mode.VISUAL])
 public class PutVisualTextAfterCursorNoIndentAction : PutVisualTextBaseAction(insertTextBeforeCaret = false, indent = false, caretAfterInsertedText = false)
 
+@CommandOrMotion(keys = ["gP"], modes = [Mode.VISUAL])
 public class PutVisualTextBeforeCursorMoveCursorAction : PutVisualTextBaseAction(insertTextBeforeCaret = true, indent = true, caretAfterInsertedText = true)
+
+@CommandOrMotion(keys = ["gp"], modes = [Mode.VISUAL])
 public class PutVisualTextAfterCursorMoveCursorAction : PutVisualTextBaseAction(insertTextBeforeCaret = false, indent = true, caretAfterInsertedText = true)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankLineAction.kt
index 877cdec53..301b476a3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankLineAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -15,6 +17,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["Y"], modes = [Mode.NORMAL])
 public class YankLineAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.COPY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankMotionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankMotionAction.kt
index 6c058582d..20255a4bf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankMotionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankMotionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.DuplicableOperatorAction
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["y"], modes = [Mode.NORMAL])
 public class YankMotionAction : VimActionHandler.SingleExecution(), DuplicableOperatorAction {
   override val type: Command.Type = Command.Type.COPY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt
index 9ad748f96..6befeba31 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["y"], modes = [Mode.VISUAL])
 public class YankVisualAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.COPY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt
index ffd719655..db4d4da75 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/copy/YankVisualLinesAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.copy
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -24,6 +26,7 @@ import java.util.*
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["Y"], modes = [Mode.VISUAL])
 public class YankVisualLinesAction : VisualOperatorActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.COPY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetAsciiAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetAsciiAction.kt
index 1334b250a..f64751ddf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetAsciiAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetAsciiAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["ga"], modes = [Mode.NORMAL])
 public class FileGetAsciiAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetFileInfoAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetFileInfoAction.kt
index d97d710e2..21e8bf245 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetFileInfoAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetFileInfoAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["<C-G>"], modes = [Mode.NORMAL])
 public class FileGetFileInfoAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetHexAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetHexAction.kt
index a5bd93720..b50068c86 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetHexAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetHexAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["g8"], modes = [Mode.NORMAL])
 public class FileGetHexAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetLocationInfoAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetLocationInfoAction.kt
index c0725c7d5..f74bf2b4b 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetLocationInfoAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileGetLocationInfoAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["g<C-G>"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class FileGetLocationInfoAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FilePreviousAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FilePreviousAction.kt
index 2b69d1766..6a4cbf920 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FilePreviousAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FilePreviousAction.kt
@@ -7,6 +7,7 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +18,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-^>"], modes = [com.intellij.vim.annotations.Mode.NORMAL])
 public class FilePreviousAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction {
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
     listOf(KeyStroke.getKeyStroke(KeyEvent.VK_6, KeyEvent.CTRL_DOWN_MASK or KeyEvent.SHIFT_DOWN_MASK)),
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileSaveCloseAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileSaveCloseAction.kt
index 3621d1f35..47115331a 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileSaveCloseAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/file/FileSaveCloseAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.file
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["ZQ", "ZZ"], modes = [Mode.NORMAL])
 public class FileSaveCloseAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_WRITABLE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/fold/FoldActions.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/fold/FoldActions.kt
index baf6c21b9..b3428f6c2 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/fold/FoldActions.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/fold/FoldActions.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.fold
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -15,6 +17,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["zM"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimCollapseAllRegions : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -30,6 +33,7 @@ public class VimCollapseAllRegions : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["zc"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimCollapseRegion : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -45,6 +49,7 @@ public class VimCollapseRegion : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["zC"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimCollapseRegionRecursively : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -59,6 +64,7 @@ public class VimCollapseRegionRecursively : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["zR"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimExpandAllRegions : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -74,6 +80,7 @@ public class VimExpandAllRegions : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["zo"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimExpandRegion : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -89,6 +96,7 @@ public class VimExpandRegion : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["zO"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VimExpandRegionRecursively : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/PlaybackRegisterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/PlaybackRegisterAction.kt
index fad01a572..c3f2f60ce 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/PlaybackRegisterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/PlaybackRegisterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.macro
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.ex.ExException
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.register.RegisterConstants.LAST_COMMAND_REGISTER
 
+@CommandOrMotion(keys = ["@"], modes = [Mode.NORMAL])
 public class PlaybackRegisterAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_SELF_SYNCHRONIZED
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/ToggleRecordingAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/ToggleRecordingAction.kt
index e78b74bd2..e5986b385 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/ToggleRecordingAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/macro/ToggleRecordingAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.macro
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.vimStateMachine
 
+@CommandOrMotion(keys = ["q"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class ToggleRecordingAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnNextTextObject.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnNextTextObject.kt
index 3e21c3dd2..6863df341 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnNextTextObject.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnNextTextObject.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.gn
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["gn"], modes = [Mode.OP_PENDING])
 public class GnNextTextObject : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnPreviousTextObject.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnPreviousTextObject.kt
index b6523b067..9a53f6a83 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnPreviousTextObject.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/GnPreviousTextObject.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.gn
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["gN"], modes = [Mode.OP_PENDING])
 public class GnPreviousTextObject : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/VisualSelectSearch.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/VisualSelectSearch.kt
index 904721d95..1f38e1372 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/VisualSelectSearch.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/gn/VisualSelectSearch.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.gn
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.helper.noneOfEnum
 import java.util.*
 import kotlin.math.max
 
+@CommandOrMotion(keys = ["gn"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VisualSelectNextSearch : MotionActionHandler.SingleExecution() {
   override val flags: EnumSet<CommandFlags> = noneOfEnum()
 
@@ -38,6 +41,7 @@ public class VisualSelectNextSearch : MotionActionHandler.SingleExecution() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["gN"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VisualSelectPreviousSearch : MotionActionHandler.SingleExecution() {
   override val flags: EnumSet<CommandFlags> = noneOfEnum()
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowLeftAction.kt
index a1b7b71d6..fec02db50 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<Left>", "<kLeft>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionArrowLeftAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt
index 2cb7cb63e..fdd5204c4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionArrowRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -24,6 +26,7 @@ import com.maddyhome.idea.vim.helper.usesVirtualSpace
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<Right>", "<kRight>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionArrowRightAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionBackspaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionBackspaceAction.kt
index 0040a43ba..de61c986f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionBackspaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionBackspaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["<BS>", "<C-H>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionBackspaceAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
@@ -33,6 +36,7 @@ public class MotionBackspaceAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["<Space>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSpaceAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.kt
index edbfe31b7..70e4747b3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["|"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionColumnAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt
index 6a8ff87c6..755421be3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionEndAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.state.mode.isInsertionAllowed
 import com.maddyhome.idea.vim.state.mode.inSelectMode
 import com.maddyhome.idea.vim.state.mode.inVisualMode
 
+@CommandOrMotion(keys = ["<End>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.SELECT, Mode.OP_PENDING])
 public class MotionEndAction : NonShiftedSpecialKeyHandler() {
   override val motionType: MotionType = MotionType.INCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.kt
index d8944f477..615259734 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["0"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionFirstColumnAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -36,6 +39,8 @@ public class MotionFirstColumnAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+// TODO we have the same command but for NX modes
+@CommandOrMotion(keys = ["<Home>"], modes = [Mode.INSERT])
 public class MotionFirstColumnInsertModeAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.kt
index a15f7165e..628423fc7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["^"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionFirstNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenColumnAction.kt
index 6e3a0a47f..60f0ea8bd 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["g0", "g<Home>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionFirstScreenColumnAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenNonSpaceAction.kt
index 9dd97a5b7..8a61432e5 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstScreenNonSpaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["g^"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionFirstScreenNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionHomeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionHomeAction.kt
index b56e1109d..16cafe621 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionHomeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionHomeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
 import com.maddyhome.idea.vim.handler.toMotionOrError
 
+@CommandOrMotion(keys = ["<Home>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionHomeAction : NonShiftedSpecialKeyHandler() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.kt
index cc8fc1e17..c3eab559d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -25,10 +27,12 @@ import com.maddyhome.idea.vim.state.mode.inVisualMode
 import com.maddyhome.idea.vim.helper.isEndAllowed
 import java.util.*
 
+@CommandOrMotion(keys = ["<End>"], modes = [Mode.INSERT])
 public class MotionLastColumnInsertAction : MotionLastColumnAction() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_STROKE)
 }
 
+@CommandOrMotion(keys = ["$"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public open class MotionLastColumnAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.INCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.kt
index d39903d9b..a7cb0e2e2 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,7 +19,10 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = [";"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLastMatchCharAction : MotionLastMatchCharActionBase(MotionType.INCLUSIVE, reverse = false)
+
+@CommandOrMotion(keys = [","], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLastMatchCharReverseAction : MotionLastMatchCharActionBase(MotionType.EXCLUSIVE, reverse = true)
 
 public sealed class MotionLastMatchCharActionBase(defaultMotionType: MotionType, private val reverse: Boolean) :
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.kt
index 29441929f..d84c9fdeb 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["g_"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLastNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastScreenColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastScreenColumnAction.kt
index 896ff17da..3a177482e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastScreenColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLastScreenColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.state.mode.isInsertionAllowed
 import com.maddyhome.idea.vim.state.mode.inVisualMode
 
+@CommandOrMotion(keys = ["g$", "g<End>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLastScreenColumnAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.kt
index dca7405f4..853a50f49 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.MotionActionHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["h"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLeftAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -38,6 +41,7 @@ public class MotionLeftAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<Left>", "<kLeft>"], modes = [Mode.INSERT])
 public class MotionLeftInsertModeAction : MotionActionHandler.ForEachCaret(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionMiddleColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionMiddleColumnAction.kt
index 188ced08d..6a9849c9b 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionMiddleColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionMiddleColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["gm"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMiddleColumnAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.kt
index db4ead142..59337bd32 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -24,6 +26,7 @@ import com.maddyhome.idea.vim.helper.usesVirtualSpace
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["l"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionRightAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -41,6 +44,7 @@ public class MotionRightAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<Right>", "<kRight>"], modes = [Mode.INSERT])
 public class MotionRightInsertAction : MotionActionHandler.ForEachCaret(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftEndAction.kt
index 4797b464c..8f9aaf54d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftEndAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.state.mode.isInsertionAllowed
 import com.maddyhome.idea.vim.state.mode.inSelectMode
 import com.maddyhome.idea.vim.state.mode.inVisualMode
 
+@CommandOrMotion(keys = ["<S-End>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftEndAction : ShiftedSpecialKeyHandler() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftHomeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftHomeAction.kt
index 7195ae701..5ffe2d1c7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftHomeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftHomeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.ShiftedSpecialKeyHandler
 /**
  * @author Alex Plate
  */
+@CommandOrMotion(keys = ["<S-Home>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftHomeAction : ShiftedSpecialKeyHandler() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftLeftAction.kt
index 3250fdad0..2dab7d54e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.ShiftedArrowKeyHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<S-Left>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftLeftAction : ShiftedArrowKeyHandler(true) {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftRightAction.kt
index d21d1d60b..ab9fbe537 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/MotionShiftRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.ShiftedArrowKeyHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<S-Right>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftRightAction : ShiftedArrowKeyHandler(true) {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/TillCharacterMotion.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/TillCharacterMotion.kt
index a9ae43610..17b0ff0af 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/TillCharacterMotion.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/leftright/TillCharacterMotion.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.leftright
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -30,9 +32,16 @@ public enum class TillCharacterMotionType {
   LAST_SMALL_T,
 }
 
+@CommandOrMotion(keys = ["F"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLeftMatchCharAction : TillCharacterMotion(Direction.BACKWARDS, TillCharacterMotionType.LAST_F, false)
+
+@CommandOrMotion(keys = ["T"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionLeftTillMatchCharAction : TillCharacterMotion(Direction.BACKWARDS, TillCharacterMotionType.LAST_T, true)
+
+@CommandOrMotion(keys = ["f"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionRightMatchCharAction : TillCharacterMotion(Direction.FORWARDS, TillCharacterMotionType.LAST_SMALL_F, false)
+
+@CommandOrMotion(keys = ["t"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionRightTillMatchCharAction :
   TillCharacterMotion(Direction.FORWARDS, TillCharacterMotionType.LAST_SMALL_T, true)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt
index 41e39d0c0..6b6b9e969 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import java.util.*
 
+@CommandOrMotion(keys = ["`"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoFileMarkAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -41,6 +44,7 @@ public class MotionGotoFileMarkAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["g`"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoFileMarkNoSaveJumpAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt
index faa3ce7f8..ff0b072f3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoFileMarkLineAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import java.util.*
 
+@CommandOrMotion(keys = ["'"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoFileMarkLineAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
@@ -41,6 +44,7 @@ public class MotionGotoFileMarkLineAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["g'"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoFileMarkLineNoSaveJumpAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt
index 6ffba7bd0..3d8273739 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import java.util.*
 
+@CommandOrMotion(keys = ["`"], modes = [Mode.NORMAL])
 public class MotionGotoMarkAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -41,6 +44,7 @@ public class MotionGotoMarkAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["g`"], modes = [Mode.NORMAL])
 public class MotionGotoMarkNoSaveJumpAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt
index 724585bd1..e2db55bde 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionGotoMarkLineAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import java.util.*
 
+@CommandOrMotion(keys = ["'"], modes = [Mode.NORMAL])
 public class MotionGotoMarkLineAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
@@ -41,6 +44,7 @@ public class MotionGotoMarkLineAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["g'"], modes = [Mode.NORMAL])
 public class MotionGotoMarkLineNoSaveJumpAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpNextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpNextAction.kt
index b5421658d..62dc5c476 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpNextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpNextAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["<C-I>", "<Tab>"], modes = [Mode.NORMAL])
 public class MotionJumpNextAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpPreviousAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpPreviousAction.kt
index 589c68bef..762e9cd9f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpPreviousAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionJumpPreviousAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["<C-O>", "<C-T>"], modes = [Mode.NORMAL])
 public class MotionJumpPreviousAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionMarkAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionMarkAction.kt
index 49ff0d0f2..c52b03b95 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionMarkAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/mark/MotionMarkAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.mark
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -15,6 +17,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["m"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class MotionMarkAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionAngleAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionAngleAction.kt
index 1ee6621c7..fbc4b87ff 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionAngleAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionAngleAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["i>", "i<lt>"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockAngleAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -36,6 +39,7 @@ public class MotionInnerBlockAngleAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["iB", "i{", "i}"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockBraceAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -53,6 +57,7 @@ public class MotionInnerBlockBraceAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["i[", "i]"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockBracketAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -70,6 +75,7 @@ public class MotionInnerBlockBracketAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["ib", "i(", "i)"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockParenAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -87,6 +93,7 @@ public class MotionInnerBlockParenAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["a<", "a>"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockAngleAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -104,6 +111,7 @@ public class MotionOuterBlockAngleAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["aB", "a{", "a}"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockBraceAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -121,6 +129,7 @@ public class MotionOuterBlockBraceAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["a[", "a]"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockBracketAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -138,6 +147,7 @@ public class MotionOuterBlockBracketAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["ab", "a(", "a)"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockParenAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionBlockTagAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionBlockTagAction.kt
index b18103d9b..c45eae0ea 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionBlockTagAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionBlockTagAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["it"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockTagAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -36,6 +39,7 @@ public class MotionInnerBlockTagAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["at"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockTagAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionParagraphAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionParagraphAction.kt
index 97503a1e7..11d425447 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionParagraphAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionParagraphAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["ap"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterParagraphAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -36,6 +39,7 @@ public class MotionOuterParagraphAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["ip"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerParagraphAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionQuoteAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionQuoteAction.kt
index b222f3ae4..6c3b68499 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionQuoteAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionQuoteAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["i`"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockBackQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -36,6 +39,7 @@ public class MotionInnerBlockBackQuoteAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["i\""], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockDoubleQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -53,6 +57,7 @@ public class MotionInnerBlockDoubleQuoteAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["i'"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerBlockSingleQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -70,6 +75,7 @@ public class MotionInnerBlockSingleQuoteAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["a`"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockBackQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -87,6 +93,7 @@ public class MotionOuterBlockBackQuoteAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["a\""], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockDoubleQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -104,6 +111,7 @@ public class MotionOuterBlockDoubleQuoteAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["a'"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterBlockSingleQuoteAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionSentenceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionSentenceAction.kt
index 342469bdb..300cdca42 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionSentenceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionSentenceAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["is"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionInnerSentenceAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
@@ -36,6 +39,7 @@ public class MotionInnerSentenceAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["as"], modes = [Mode.VISUAL, Mode.OP_PENDING])
 public class MotionOuterSentenceAction : TextObjectActionHandler() {
 
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_TEXT_BLOCK)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionWordAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionWordAction.kt
index 8c2a133c5..ed312efc9 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionWordAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/object/MotionWordAction.kt
@@ -8,6 +8,7 @@
 
 package com.maddyhome.idea.vim.action.motion.`object`
 
+import com.intellij.vim.annotations.CommandOrMotion
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +19,7 @@ import com.maddyhome.idea.vim.common.TextRange
 import com.maddyhome.idea.vim.handler.TextObjectActionHandler
 import com.maddyhome.idea.vim.state.mode.mode
 
+@CommandOrMotion(keys = ["iW"], modes = [com.intellij.vim.annotations.Mode.VISUAL, com.intellij.vim.annotations.Mode.OP_PENDING])
 public class MotionInnerBigWordAction : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
@@ -33,6 +35,7 @@ public class MotionInnerBigWordAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["aW"], modes = [com.intellij.vim.annotations.Mode.VISUAL, com.intellij.vim.annotations.Mode.OP_PENDING])
 public class MotionOuterBigWordAction : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
@@ -48,6 +51,7 @@ public class MotionOuterBigWordAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["iw"], modes = [com.intellij.vim.annotations.Mode.VISUAL, com.intellij.vim.annotations.Mode.OP_PENDING])
 public class MotionInnerWordAction : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
@@ -63,6 +67,7 @@ public class MotionInnerWordAction : TextObjectActionHandler() {
   }
 }
 
+@CommandOrMotion(keys = ["aw"], modes = [com.intellij.vim.annotations.Mode.VISUAL, com.intellij.vim.annotations.Mode.OP_PENDING])
 public class MotionOuterWordAction : TextObjectActionHandler() {
 
   override val visualType: TextObjectVisualType = TextObjectVisualType.CHARACTER_WISE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionFirstScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionFirstScreenLineAction.kt
index ea101a439..b6669f1de 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionFirstScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionFirstScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.screen
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -52,5 +54,8 @@ public abstract class MotionFirstScreenLineActionBase(private val operatorPendin
   }
 }
 
+@CommandOrMotion(keys = ["H"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class MotionFirstScreenLineAction : MotionFirstScreenLineActionBase(false)
+
+@CommandOrMotion(keys = ["H"], modes = [Mode.OP_PENDING])
 public class MotionOpPendingFirstScreenLineAction : MotionFirstScreenLineActionBase(true)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionLastScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionLastScreenLineAction.kt
index 695fa83ff..2a891eb14 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionLastScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionLastScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.screen
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -49,5 +51,8 @@ public abstract class MotionLastScreenLineActionBase(private val operatorPending
   }
 }
 
+@CommandOrMotion(keys = ["L"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class MotionLastScreenLineAction : MotionLastScreenLineActionBase(false)
+
+@CommandOrMotion(keys = ["L"], modes = [Mode.OP_PENDING])
 public class MotionOpPendingLastScreenLineAction : MotionLastScreenLineActionBase(true)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionMiddleScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionMiddleScreenLineAction.kt
index 5059f3d42..49574e7aa 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionMiddleScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/screen/MotionMiddleScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.screen
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -26,6 +28,7 @@ import java.util.*
 M                       To Middle line of window, on the first non-blank
                         character |linewise|.  See also 'startofline' option.
  */
+@CommandOrMotion(keys = ["M"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMiddleScreenLineAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt
index 26bd8541c..2a2ebf049 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/CtrlUpDownAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
  * @author Alex Plate
  */
 // FIXME: 2019-07-05 Workaround to make jump through methods work
+@CommandOrMotion(keys = ["<C-Down>"], modes = [Mode.NORMAL])
 public class CtrlDownAction : VimActionHandler.SingleExecution() {
 
   private val keySet = parseKeysSet("<C-Down>")
@@ -40,6 +43,7 @@ public class CtrlDownAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-Up>"], modes = [Mode.NORMAL])
 public class CtrlUpAction : VimActionHandler.SingleExecution() {
 
   private val keySet = parseKeysSet("<C-Up>")
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnLeftAction.kt
index e326ad7af..70ae97fda 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnLeftAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["zl", "z<Right>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollColumnLeftAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnRightAction.kt
index db967360d..418654726 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollColumnRightAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -16,6 +18,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import java.util.*
 
+@CommandOrMotion(keys = ["zh", "z<Left>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollColumnRightAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenColumnAction.kt
index 5bb582184..dcf23f3da 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["zs"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollFirstScreenColumnAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineAction.kt
index 3ccfeda20..841814fd7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["zt"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollFirstScreenLineAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLinePageStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLinePageStartAction.kt
index 323804a8c..f775503f7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLinePageStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLinePageStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["z+"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollFirstScreenLinePageStartAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineStartAction.kt
index baf271637..2b7ab1d7e 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollFirstScreenLineStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["z<CR>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollFirstScreenLineStartAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageDownAction.kt
index 3daa011b8..56b5243a1 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageDownAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-D>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollHalfPageDownAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageUpAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageUpAction.kt
index 96eb1a8a0..caa7334b0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageUpAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfPageUpAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-U>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollHalfPageUpAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthLeftAction.kt
index 35dd63d3c..bba382f6c 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -31,6 +33,7 @@ zH                      Move the view on the text half a screenwidth to the
 
 [count] is used but undocumented.
  */
+@CommandOrMotion(keys = ["zL"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollHalfWidthLeftAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthRightAction.kt
index 4ca382c87..714d336c8 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollHalfWidthRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -31,6 +33,7 @@ zH                      Move the view on the text half a screenwidth to the
 
 [count] is used but undocumented.
  */
+@CommandOrMotion(keys = ["zH"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollHalfWidthRightAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenColumnAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenColumnAction.kt
index ed770dfd8..f180328b0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenColumnAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenColumnAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["ze"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLastScreenColumnAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineAction.kt
index 3c8a122ff..0e0145162 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["zb"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLastScreenLineAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLinePageStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLinePageStartAction.kt
index 76545a29b..0a2ba5b25 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLinePageStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLinePageStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["z^"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLastScreenLinePageStartAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineStartAction.kt
index 741369655..94bd036bf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLastScreenLineStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["z-"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLastScreenLineStartAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLineAction.kt
index 4b014709a..0fd80958d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-E>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLineDownAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -32,6 +35,7 @@ public class MotionScrollLineDownAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-Y>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollLineUpAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollMiddleScreenLineAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollMiddleScreenLineAction.kt
index 89a15751f..18482f937 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollMiddleScreenLineAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollMiddleScreenLineAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["zz"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollMiddleScreenLineAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -32,6 +35,7 @@ public class MotionScrollMiddleScreenLineAction : VimActionHandler.SingleExecuti
   }
 }
 
+@CommandOrMotion(keys = ["z."], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollMiddleScreenLineStartAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageDownAction.kt
index 081901371..6f50819c3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageDownAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.awt.event.KeyEvent
 import java.util.*
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-F>", "<PageDown>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollPageDownAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -34,6 +37,7 @@ public class MotionScrollPageDownAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["<PageDown>"], modes = [Mode.INSERT])
 public class MotionScrollPageDownInsertModeAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction {
 
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageUpAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageUpAction.kt
index 7dd2e66ab..d71d77a2a 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageUpAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/scroll/MotionScrollPageUpAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.scroll
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import java.awt.event.KeyEvent
 import java.util.*
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<C-B>", "<PageUp>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionScrollPageUpAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -34,6 +37,7 @@ public class MotionScrollPageUpAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["<PageUp>"], modes = [Mode.INSERT])
 public class MotionScrollPageUpInsertModeAction : VimActionHandler.SingleExecution(), ComplicatedKeysAction {
 
   override val keyStrokesSet: Set<List<KeyStroke>> = setOf(
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/GotoDeclarationAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/GotoDeclarationAction.kt
index b71b1e5d8..87c4eaa79 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/GotoDeclarationAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/GotoDeclarationAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["gD", "gd", "<C-]>"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class GotoDeclarationAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainNextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainNextAction.kt
index a8b1943a4..370382045 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainNextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainNextAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["n"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchAgainNextAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainPreviousAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainPreviousAction.kt
index d857bfaea..167d2896f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainPreviousAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchAgainPreviousAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["N"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchAgainPreviousAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryFwdAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryFwdAction.kt
index b8ee77814..a613e23bf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryFwdAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryFwdAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["/"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchEntryFwdAction : MotionActionHandler.ForEachCaret() {
   override val argumentType: Argument.Type = Argument.Type.EX_STRING
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryRevAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryRevAction.kt
index 4fd6ac6de..75fd33ae0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryRevAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchEntryRevAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["?"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchEntryRevAction : MotionActionHandler.ForEachCaret() {
   override val argumentType: Argument.Type = Argument.Type.EX_STRING
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordBackwardAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordBackwardAction.kt
index 6043b272b..5d49a70a4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordBackwardAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordBackwardAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrNoMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["#"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchWholeWordBackwardAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordForwardAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordForwardAction.kt
index 2d14b4b71..aaaa388ed 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordForwardAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWholeWordForwardAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrNoMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["*"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchWholeWordForwardAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordBackwardAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordBackwardAction.kt
index de44fb10b..bb87be159 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordBackwardAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordBackwardAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["g#"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchWordBackwardAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordForwardAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordForwardAction.kt
index ff3d31625..bd2ef0d09 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordForwardAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/search/SearchWordForwardAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.search
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["g*"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class SearchWordForwardAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectDeleteAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectDeleteAction.kt
index b82557d49..3aca1b76f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectDeleteAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectDeleteAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -21,6 +23,7 @@ import javax.swing.KeyStroke
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<BS>", "<DEL>"], modes = [Mode.SELECT])
 public class SelectDeleteAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.INSERT
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableBlockModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableBlockModeAction.kt
index 7435f8c2c..57d7dcb43 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableBlockModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableBlockModeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.getLineEndForOffset
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["g<C-h>"], modes = [Mode.NORMAL])
 public class SelectEnableBlockModeAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableCharacterModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableCharacterModeAction.kt
index 2ef4ab393..7d96c7787 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableCharacterModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableCharacterModeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.getLineEndForOffset
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["gh"], modes = [Mode.NORMAL])
 public class SelectEnableCharacterModeAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableLineModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableLineModeAction.kt
index 158266589..66a4bdf2d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableLineModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnableLineModeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.getLineEndForOffset
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["gH"], modes = [Mode.NORMAL])
 public class SelectEnableLineModeAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnterAction.kt
index e419ff3ef..30143ec9a 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEnterAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<Enter>"], modes = [Mode.SELECT])
 public class SelectEnterAction : VimActionHandler.ForEachCaret() {
 
   override val type: Command.Type = Command.Type.INSERT
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEscapeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEscapeAction.kt
index fee612013..b3805b7d9 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEscapeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectEscapeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.command.Command
@@ -15,6 +17,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.state.mode.inBlockSelection
 
+@CommandOrMotion(keys = ["<Esc>"], modes = [Mode.SELECT])
 public class SelectEscapeAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectToggleVisualMode.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectToggleVisualMode.kt
index 317cf9b24..1fa68a8e7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectToggleVisualMode.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/SelectToggleVisualMode.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,13 +19,13 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.pushVisualMode
 import com.maddyhome.idea.vim.helper.setSelectMode
 import com.maddyhome.idea.vim.helper.vimStateMachine
-import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.state.mode.SelectionType
 
 /**
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<C-G>"], modes = [Mode.VISUAL, Mode.SELECT])
 public class SelectToggleVisualMode : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -42,7 +44,7 @@ public class SelectToggleVisualMode : VimActionHandler.SingleExecution() {
     public fun toggleMode(editor: VimEditor) {
       val commandState = editor.vimStateMachine
       val myMode = commandState.mode
-      if (myMode is Mode.VISUAL) {
+      if (myMode is com.maddyhome.idea.vim.state.mode.Mode.VISUAL) {
         commandState.setSelectMode(myMode.selectionType)
         if (myMode.selectionType != SelectionType.LINE_WISE) {
           editor.nativeCarets().forEach {
@@ -51,7 +53,7 @@ public class SelectToggleVisualMode : VimActionHandler.SingleExecution() {
             }
           }
         }
-      } else if (myMode is Mode.SELECT) {
+      } else if (myMode is com.maddyhome.idea.vim.state.mode.Mode.SELECT) {
         commandState.pushVisualMode(myMode.selectionType)
         if (myMode.selectionType != SelectionType.LINE_WISE) {
           editor.nativeCarets().forEach {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionLeftAction.kt
index d6540b6f7..446d3554f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select.motion
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -25,6 +27,7 @@ import com.maddyhome.idea.vim.options.OptionConstants
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<Left>"], modes = [Mode.SELECT])
 public class SelectMotionLeftAction : MotionActionHandler.ForEachCaret() {
 
   override val motionType: MotionType = MotionType.EXCLUSIVE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionRightAction.kt
index 17136bf9a..9d1e79796 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/select/motion/SelectMotionRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.select.motion
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -25,6 +27,7 @@ import com.maddyhome.idea.vim.options.OptionConstants
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<Right>"], modes = [Mode.SELECT])
 public class SelectMotionRightAction : MotionActionHandler.ForEachCaret() {
 
   override val motionType: MotionType = MotionType.EXCLUSIVE
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordEndLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordEndLeftAction.kt
index 43dc56857..5fbb14354 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordEndLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordEndLeftAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,9 +21,16 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.Motion.AbsoluteOffset
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["gE"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionBigWordEndLeftAction : WordEndAction(Direction.BACKWARDS, true)
+
+@CommandOrMotion(keys = ["E"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionBigWordEndRightAction : WordEndAction(Direction.FORWARDS, true)
+
+@CommandOrMotion(keys = ["ge"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionWordEndLeftAction : WordEndAction(Direction.BACKWARDS, false)
+
+@CommandOrMotion(keys = ["e"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionWordEndRightAction : WordEndAction(Direction.FORWARDS, false)
 
 public sealed class WordEndAction(public val direction: Direction, public val bigWord: Boolean) : MotionActionHandler.ForEachCaret() {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordLeftAction.kt
index 3908c5347..c9896038f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordLeftAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["B", "<C-Left>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionBigWordLeftAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordRightAction.kt
index 3ace0964b..be3425cfb 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionBigWordRightAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 
+@CommandOrMotion(keys = ["W", "<C-Right>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionBigWordRightAction : MotionActionHandler.ForEachCaret() {
   override fun getOffset(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelEndAction.kt
index aa3f4040a..ff6e6238d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotionOrError
 
+@CommandOrMotion(keys = ["]b"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionCamelEndLeftAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.INCLUSIVE
 
@@ -33,6 +36,7 @@ public class MotionCamelEndLeftAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["]w"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionCamelEndRightAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.INCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
index c3d048927..78fc14251 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotionOrError
 
+@CommandOrMotion(keys = ["[b"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionCamelLeftAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
@@ -33,6 +36,7 @@ public class MotionCamelLeftAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["[w"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionCamelRightAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodEndAction.kt
index 7bbfec70c..8e5098b5f 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["]M"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMethodNextEndAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
@@ -37,6 +40,7 @@ public class MotionMethodNextEndAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["[M"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMethodPreviousEndAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodStartAction.kt
index d272179f5..1b4077fd5 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionMethodStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["]m"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMethodNextStartAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
@@ -37,6 +40,7 @@ public class MotionMethodNextStartAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["[m"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionMethodPreviousStartAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionNthCharacterAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionNthCharacterAction.kt
index fe225b666..8c1948371 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionNthCharacterAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionNthCharacterAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import java.util.*
 import kotlin.math.max
 import kotlin.math.min
 
+@CommandOrMotion(keys = ["go"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionNthCharacterAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionParagraphAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionParagraphAction.kt
index b063dcda4..a80d68a79 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionParagraphAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionParagraphAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -39,7 +41,10 @@ public sealed class MotionParagraphAction(public val direction: Direction) : Mot
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["}"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionParagraphNextAction : MotionParagraphAction(Direction.FORWARDS)
+
+@CommandOrMotion(keys = ["{"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionParagraphPreviousAction : MotionParagraphAction(Direction.BACKWARDS)
 
 private fun moveCaretToNextParagraph(editor: VimEditor, caret: ImmutableVimCaret, count: Int): Motion {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt
index 2e41fb485..423d06915 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSectionAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,9 +25,16 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["[]"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSectionBackwardEndAction : MotionSectionAction('}', Direction.BACKWARDS)
+
+@CommandOrMotion(keys = ["[["], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSectionBackwardStartAction : MotionSectionAction('{', Direction.BACKWARDS)
+
+@CommandOrMotion(keys = ["]["], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSectionForwardEndAction : MotionSectionAction('}', Direction.FORWARDS)
+
+@CommandOrMotion(keys = ["]]"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSectionForwardStartAction : MotionSectionAction('{', Direction.FORWARDS)
 
 public sealed class MotionSectionAction(private val charType: Char, public val direction: Direction) : MotionActionHandler.ForEachCaret() {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceNextEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceNextEndAction.kt
index 6ecf80484..9b2c9bac3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceNextEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceNextEndAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,7 +25,10 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["g)"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSentenceNextEndAction : MotionSentenceEndAction(Direction.FORWARDS)
+
+@CommandOrMotion(keys = ["g("], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSentencePreviousEndAction : MotionSentenceEndAction(Direction.BACKWARDS)
 
 public sealed class MotionSentenceEndAction(public val direction: Direction) : MotionActionHandler.ForEachCaret() {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceStartAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceStartAction.kt
index 998e794a6..6a5c4e693 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceStartAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionSentenceStartAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotionOrError
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = [")"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSentenceNextStartAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
@@ -38,6 +41,7 @@ public class MotionSentenceNextStartAction : MotionActionHandler.ForEachCaret()
   override val motionType: MotionType = MotionType.EXCLUSIVE
 }
 
+@CommandOrMotion(keys = ["("], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionSentencePreviousStartAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionUnmatchedAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionUnmatchedAction.kt
index 177c4ff8b..be75ace36 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionUnmatchedAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionUnmatchedAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -39,9 +41,16 @@ public sealed class MotionUnmatchedAction(private val motionChar: Char) : Motion
   }
 }
 
+@CommandOrMotion(keys = ["]}"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUnmatchedBraceCloseAction : MotionUnmatchedAction('}')
+
+@CommandOrMotion(keys = ["[{"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUnmatchedBraceOpenAction : MotionUnmatchedAction('{')
+
+@CommandOrMotion(keys = ["])"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUnmatchedParenCloseAction : MotionUnmatchedAction(')')
+
+@CommandOrMotion(keys = ["[("], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUnmatchedParenOpenAction : MotionUnmatchedAction('(')
 
 private fun moveCaretToUnmatchedBlock(editor: VimEditor, caret: ImmutableVimCaret, count: Int, type: Char): Int {
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordLeftAction.kt
index 6a1aa4f47..f0e03d44d 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordLeftAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -24,6 +26,7 @@ import java.awt.event.KeyEvent
 import java.util.*
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["b"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionWordLeftAction : MotionActionHandler.ForEachCaret() {
 
   override val motionType: MotionType = MotionType.EXCLUSIVE
@@ -39,6 +42,7 @@ public class MotionWordLeftAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-Left>", "<C-kLeft>"], modes = [Mode.INSERT])
 public class MotionWordLeftInsertAction : MotionActionHandler.ForEachCaret(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordRightAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordRightAction.kt
index 4ddfc700d..d1bbe6204 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordRightAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionWordRightAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.text
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -24,6 +26,7 @@ import java.awt.event.KeyEvent
 import java.util.*
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["w"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionWordRightAction : MotionActionHandler.ForEachCaret() {
 
   override val motionType: MotionType = MotionType.EXCLUSIVE
@@ -39,6 +42,7 @@ public class MotionWordRightAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-Right>", "<C-kRight>"], modes = [Mode.INSERT])
 public class MotionWordRightInsertAction : MotionActionHandler.ForEachCaret(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowDownAction.kt
index 9d1310f20..69966fdb9 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowDownAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<Down>", "<kDown>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.SELECT, Mode.OP_PENDING])
 public class MotionArrowDownAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.LINE_WISE
   override val keepFold: Boolean = true
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowUpAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowUpAction.kt
index 6eb51f11f..5ed9c70a0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowUpAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionArrowUpAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.action.ComplicatedKeysAction
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
 import java.awt.event.KeyEvent
 import javax.swing.KeyStroke
 
+@CommandOrMotion(keys = ["<Up>", "k<Up>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.SELECT, Mode.OP_PENDING])
 public class MotionArrowUpAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAction {
   override val motionType: MotionType = MotionType.LINE_WISE
   override val keepFold: Boolean = true
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownActions.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownActions.kt
index a587ee1dc..25b2b6941 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownActions.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownActions.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["j"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public open class MotionDownAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
   override val keepFold: Boolean = true
@@ -34,6 +37,7 @@ public open class MotionDownAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-N>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionDownCtrlNAction : MotionDownAction() {
   override fun getOffset(
     editor: VimEditor,
@@ -55,6 +59,7 @@ public class MotionDownCtrlNAction : MotionDownAction() {
   }
 }
 
+@CommandOrMotion(keys = ["gj", "g<Down>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionDownNotLineWiseAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownFirstNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownFirstNonSpaceAction.kt
index a08258419..e9beb1af4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownFirstNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownFirstNonSpaceAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["+", "<C-M>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionDownFirstNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
@@ -33,6 +36,8 @@ public class MotionDownFirstNonSpaceAction : MotionActionHandler.ForEachCaret()
   }
 }
 
+// FIXME I should not exist (see class above)
+@CommandOrMotion(keys = ["<CR>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class EnterNormalAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownLess1FirstNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownLess1FirstNonSpaceAction.kt
index bda622368..f42ec87e9 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownLess1FirstNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionDownLess1FirstNonSpaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["_"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionDownLess1FirstNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineFirstAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineFirstAction.kt
index 91fc546f7..a9db48f72 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineFirstAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineFirstAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -23,6 +25,7 @@ import com.maddyhome.idea.vim.handler.toMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["gg", "<C-Home>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoLineFirstAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
   override val keepFold: Boolean = true
@@ -41,6 +44,7 @@ public class MotionGotoLineFirstAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-Home>"], modes = [Mode.INSERT])
 public class MotionGotoLineFirstInsertAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastAction.kt
index 835da95c7..855707dbf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["G"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoLineLastAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt
index 2f81a2725..2dddefbd3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionGotoLineLastEndAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -26,6 +28,7 @@ import com.maddyhome.idea.vim.state.mode.isInsertionAllowed
 import com.maddyhome.idea.vim.state.mode.inVisualMode
 import java.util.*
 
+@CommandOrMotion(keys = ["<C-End>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionGotoLineLastEndAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
@@ -49,6 +52,7 @@ public class MotionGotoLineLastEndAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-End>"], modes = [Mode.INSERT])
 public class MotionGotoLineLastEndInsertAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionPercentOrMatchAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionPercentOrMatchAction.kt
index 6e512ab1e..4d6413ecf 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionPercentOrMatchAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionPercentOrMatchAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,6 +24,7 @@ import com.maddyhome.idea.vim.handler.toMotion
 import com.maddyhome.idea.vim.helper.enumSetOf
 import java.util.*
 
+@CommandOrMotion(keys = ["%"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionPercentOrMatchAction : MotionActionHandler.ForEachCaret() {
   override val flags: EnumSet<CommandFlags> = enumSetOf(CommandFlags.FLAG_SAVE_JUMP)
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt
index 1c6a3eb77..a4e9a9590 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftDownAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.ShiftedArrowKeyHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<S-Down>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftDownAction : ShiftedArrowKeyHandler(false) {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftUpAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftUpAction.kt
index 1f33c6a51..7f11db247 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftUpAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionShiftUpAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.handler.ShiftedArrowKeyHandler
  * @author Alex Plate
  */
 
+@CommandOrMotion(keys = ["<S-Up>"], modes = [Mode.INSERT, Mode.NORMAL, Mode.VISUAL, Mode.SELECT])
 public class MotionShiftUpAction : ShiftedArrowKeyHandler(false) {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpActions.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpActions.kt
index be5a96e7f..755c3d1b0 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpActions.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpActions.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -19,6 +21,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["k"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public open class MotionUpAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
   override val keepFold: Boolean = true
@@ -34,6 +37,7 @@ public open class MotionUpAction : MotionActionHandler.ForEachCaret() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-P>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUpCtrlPAction : MotionUpAction() {
   override fun getOffset(
     editor: VimEditor,
@@ -55,6 +59,7 @@ public class MotionUpCtrlPAction : MotionUpAction() {
   }
 }
 
+@CommandOrMotion(keys = ["gk", "g<Up>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUpNotLineWiseAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.EXCLUSIVE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpFirstNonSpaceAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpFirstNonSpaceAction.kt
index d08a924a2..f5ac6ade5 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpFirstNonSpaceAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/updown/MotionUpFirstNonSpaceAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.updown
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.Motion
 import com.maddyhome.idea.vim.handler.MotionActionHandler
 import com.maddyhome.idea.vim.handler.toMotion
 
+@CommandOrMotion(keys = ["-"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class MotionUpFirstNonSpaceAction : MotionActionHandler.ForEachCaret() {
   override val motionType: MotionType = MotionType.LINE_WISE
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualExitModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualExitModeAction.kt
index 885275230..65e4a1b52 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualExitModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualExitModeAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -21,6 +23,7 @@ import com.maddyhome.idea.vim.helper.exitVisualMode
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["<Esc>", "<C-[>", "<C-C>"], modes = [Mode.VISUAL])
 public class VisualExitModeAction : VimActionHandler.ConditionalMulticaret() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
   override fun runAsMulticaret(
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSelectPreviousAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSelectPreviousAction.kt
index 1d9fda3a1..a1e2aa9b3 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSelectPreviousAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSelectPreviousAction.kt
@@ -7,11 +7,12 @@
  */
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
 import com.maddyhome.idea.vim.command.Command
-import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.group.visual.vimSetSelection
 import com.maddyhome.idea.vim.handler.VimActionHandler
@@ -20,6 +21,7 @@ import com.maddyhome.idea.vim.helper.vimStateMachine
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["gv"], modes = [Mode.NORMAL])
 public class VisualSelectPreviousAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -35,7 +37,7 @@ public class VisualSelectPreviousAction : VimActionHandler.SingleExecution() {
 
     if (caretToSelectionInfo.any { it.second.start == null || it.second.end == null }) return false
 
-    editor.vimStateMachine.mode = Mode.VISUAL(selectionType)
+    editor.vimStateMachine.mode = com.maddyhome.idea.vim.state.mode.Mode.VISUAL(selectionType)
 
     for ((caret, selectionInfo) in caretToSelectionInfo) {
       val startOffset = editor.bufferPositionToOffset(selectionInfo.start!!)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapEndsAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapEndsAction.kt
index 773cc4754..1d7213a8c 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapEndsAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapEndsAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.state.mode.inBlockSelection
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["o"], modes = [Mode.VISUAL])
 public class VisualSwapEndsAction : VimActionHandler.ForEachCaret() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
@@ -36,6 +39,7 @@ public class VisualSwapEndsAction : VimActionHandler.ForEachCaret() {
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["O"], modes = [Mode.VISUAL])
 public class VisualSwapEndsBlockAction : VimActionHandler.SingleExecution() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapSelectionsAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapSelectionsAction.kt
index 173a48e04..54cd42c34 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapSelectionsAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualSwapSelectionsAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,12 +19,12 @@ import com.maddyhome.idea.vim.common.TextRange
 import com.maddyhome.idea.vim.group.visual.vimSetSelection
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.helper.vimStateMachine
-import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.state.mode.mode
 
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["gv"], modes = [Mode.VISUAL])
 public class VisualSwapSelectionsAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -39,7 +41,7 @@ public class VisualSwapSelectionsAction : VimActionHandler.SingleExecution() {
 
 private fun swapVisualSelections(editor: VimEditor): Boolean {
   val mode = editor.mode
-  check(mode is Mode.VISUAL)
+  check(mode is com.maddyhome.idea.vim.state.mode.Mode.VISUAL)
 
   val lastSelectionType = editor.vimLastSelectionType ?: return false
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleBlockModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleBlockModeAction.kt
index 526d14a6c..ca17bf6ea 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleBlockModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleBlockModeAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.state.mode.SelectionType
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.options.OptionConstants
 
+@CommandOrMotion(keys = ["<C-q>", "<C-v>"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VisualToggleBlockModeAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleCharacterModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleCharacterModeAction.kt
index a748ba7c5..198e94eae 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleCharacterModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleCharacterModeAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.state.mode.SelectionType
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.options.OptionConstants
 
+@CommandOrMotion(keys = ["v"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VisualToggleCharacterModeAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleLineModeAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleLineModeAction.kt
index e69045a62..45e54b8ee 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleLineModeAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/visual/VisualToggleLineModeAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.motion.visual
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -20,6 +22,7 @@ import com.maddyhome.idea.vim.group.visual.vimSetSelection
 import com.maddyhome.idea.vim.handler.VimActionHandler
 import com.maddyhome.idea.vim.options.OptionConstants
 
+@CommandOrMotion(keys = ["V"], modes = [Mode.NORMAL, Mode.VISUAL])
 public class VisualToggleLineModeAction : VimActionHandler.ConditionalMulticaret() {
 
   override val type: Command.Type = Command.Type.OTHER_READONLY
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/CloseWindowAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/CloseWindowAction.kt
index a6bb8eff3..8162f85ca 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/CloseWindowAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/CloseWindowAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author rasendubi
  */
+@CommandOrMotion(keys = ["<C-W>c"], modes = [Mode.NORMAL])
 public class CloseWindowAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/HorizontalSplitAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/HorizontalSplitAction.kt
index 5cc830fbf..06205524b 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/HorizontalSplitAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/HorizontalSplitAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author rasendubi
  */
+@CommandOrMotion(keys = ["<C-W>s", "<C-W>S", "<C-W><C-S>"], modes = [Mode.NORMAL])
 public class HorizontalSplitAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt
index 64cbddfac..f45f51d30 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupDownAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author Alex Plate
  */
+@CommandOrMotion(keys = ["<C-N>"], modes = [Mode.INSERT])
 public class LookupDownAction : VimActionHandler.SingleExecution() {
 
   private val keySet = parseKeysSet("<C-N>")
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt
index 0ac0a9ecc..f150c5740 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/LookupUpAction.kt
@@ -8,6 +8,8 @@
 
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -18,6 +20,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author Alex Plate
  */
+@CommandOrMotion(keys = ["<C-P>"], modes = [Mode.INSERT])
 public class LookupUpAction : VimActionHandler.SingleExecution() {
 
   private val keySet = setOf(injector.parser.parseKeys("<C-P>"))
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/VerticalSplitAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/VerticalSplitAction.kt
index c42c698a8..971900904 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/VerticalSplitAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/VerticalSplitAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author rasendubi
  */
+@CommandOrMotion(keys = ["<C-W>v", "<C-W><C-V>"], modes = [Mode.NORMAL])
 public class VerticalSplitAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowAction.kt
index c711ebad0..ff683bc68 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["<C-W>j", "<C-W><C-J>", "<C-W><Down>"], modes = [Mode.NORMAL])
 public class WindowDownAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -34,6 +37,7 @@ public class WindowDownAction : VimActionHandler.SingleExecution() {
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["<C-W>h", "<C-W><C-H>", "<C-W><Left>"], modes = [Mode.NORMAL])
 public class WindowLeftAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -51,6 +55,7 @@ public class WindowLeftAction : VimActionHandler.SingleExecution() {
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["<C-W>l", "<C-W><C-L>", "<C-W><Right>"], modes = [Mode.NORMAL])
 public class WindowRightAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -68,6 +73,7 @@ public class WindowRightAction : VimActionHandler.SingleExecution() {
 /**
  * @author vlan
  */
+@CommandOrMotion(keys = ["<C-W>k", "<C-W><C-K>", "<C-W><Up>"], modes = [Mode.NORMAL])
 public class WindowUpAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowNextAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowNextAction.kt
index 1045af6fd..a903f75de 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowNextAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowNextAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author rasendubi
  */
+@CommandOrMotion(keys = ["<C-W>w", "<C-W><C-W>"], modes = [Mode.NORMAL])
 public class WindowNextAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
@@ -35,6 +38,7 @@ public class WindowNextAction : VimActionHandler.SingleExecution() {
   }
 }
 
+@CommandOrMotion(keys = ["<C-W>W"], modes = [Mode.NORMAL])
 public class WindowPrevAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowOnlyAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowOnlyAction.kt
index 5dcb6fb05..8e625b8c7 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowOnlyAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/WindowOnlyAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -17,6 +19,7 @@ import com.maddyhome.idea.vim.handler.VimActionHandler
 /**
  * @author rasendubi
  */
+@CommandOrMotion(keys = ["<C-W>o", "<C-W><C-O>"], modes = [Mode.NORMAL])
 public class WindowOnlyAction : VimActionHandler.SingleExecution() {
   override val type: Command.Type = Command.Type.OTHER_READONLY
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/NextTabAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/NextTabAction.kt
index 186eb47f0..de4b53c21 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/NextTabAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/NextTabAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window.tabs
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["gt"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class NextTabAction : VimActionHandler.SingleExecution() {
   override fun execute(
     editor: VimEditor,
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/PreviousTabAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/PreviousTabAction.kt
index ffbd2a25a..3e774dd70 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/PreviousTabAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/window/tabs/PreviousTabAction.kt
@@ -7,6 +7,8 @@
  */
 package com.maddyhome.idea.vim.action.window.tabs
 
+import com.intellij.vim.annotations.CommandOrMotion
+import com.intellij.vim.annotations.Mode
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.injector
@@ -14,6 +16,7 @@ import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.VimActionHandler
 
+@CommandOrMotion(keys = ["gT"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
 public class PreviousTabAction : VimActionHandler.SingleExecution() {
   override fun execute(
     editor: VimEditor,