diff --git a/src/main/java/com/maddyhome/idea/vim/extension/replacewithregister/ReplaceWithRegister.kt b/src/main/java/com/maddyhome/idea/vim/extension/replacewithregister/ReplaceWithRegister.kt
index bdcf6cfff..7b1c43076 100644
--- a/src/main/java/com/maddyhome/idea/vim/extension/replacewithregister/ReplaceWithRegister.kt
+++ b/src/main/java/com/maddyhome/idea/vim/extension/replacewithregister/ReplaceWithRegister.kt
@@ -10,6 +10,7 @@ package com.maddyhome.idea.vim.extension.replacewithregister
 
 import com.intellij.openapi.actionSystem.DataContext
 import com.intellij.openapi.editor.Editor
+import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.VimPlugin
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.ImmutableVimCaret
@@ -166,13 +167,14 @@ private fun doReplace(editor: Editor, context: DataContext, caret: ImmutableVimC
     putToLine = -1,
   )
   val vimEditor = editor.vim
+  val keyHandler = KeyHandler.getInstance()
   ClipboardOptionHelper.IdeaputDisabler().use {
     VimPlugin.getPut().putText(
       vimEditor,
       context.vim,
       putData,
       operatorArguments = OperatorArguments(
-        editor.vimStateMachine?.isOperatorPending(vimEditor.mode) ?: false,
+        keyHandler.isOperatorPending(vimEditor.mode, keyHandler.keyHandlerState),
         0,
         editor.vim.mode,
       ),
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/impl/state/VimStateMachineImpl.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/impl/state/VimStateMachineImpl.kt
index cff19396e..30401fb54 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/impl/state/VimStateMachineImpl.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/impl/state/VimStateMachineImpl.kt
@@ -7,21 +7,14 @@
  */
 package com.maddyhome.idea.vim.impl.state
 
-import com.maddyhome.idea.vim.KeyHandler
-import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.command.Command
-import com.maddyhome.idea.vim.command.CommandBuilder
 import com.maddyhome.idea.vim.command.CommandFlags
 import com.maddyhome.idea.vim.command.MappingMode
-import com.maddyhome.idea.vim.command.MappingState
-import com.maddyhome.idea.vim.common.DigraphResult
-import com.maddyhome.idea.vim.common.DigraphSequence
 import com.maddyhome.idea.vim.helper.noneOfEnum
 import com.maddyhome.idea.vim.state.VimStateMachine
 import com.maddyhome.idea.vim.state.mode.Mode
 import org.jetbrains.annotations.Contract
 import java.util.*
-import javax.swing.KeyStroke
 
 /**
  * Used to maintain state before and while entering a Vim command (operator, motion, text object, etc.)
@@ -44,18 +37,6 @@ public class VimStateMachineImpl : VimStateMachine {
    */
   override var executingCommand: Command? = null
 
-  @Deprecated("Please use KeyHandler instead")
-  override fun isOperatorPending(mode: Mode): Boolean {
-    val keyHandler = KeyHandler.getInstance()
-    return keyHandler.isOperatorPending(mode, keyHandler.keyHandlerState)
-  }
-
-  @Deprecated("Please use KeyHandler instead")
-  override fun isDuplicateOperatorKeyStroke(key: KeyStroke, mode: Mode): Boolean {
-    val keyHandler = KeyHandler.getInstance()
-    return keyHandler.isDuplicateOperatorKeyStroke(key, mode, keyHandler.keyHandlerState)
-  }
-
   override val executingCommandFlags: EnumSet<CommandFlags>
     get() = executingCommand?.flags ?: noneOfEnum()
 
@@ -66,24 +47,6 @@ public class VimStateMachineImpl : VimStateMachine {
     }
   }
 
-  @Deprecated("Please use KeyHandler instead")
-  override fun startDigraphSequence() {
-    val keyHandler = KeyHandler.getInstance()
-    keyHandler.keyHandlerState.digraphSequence.startDigraphSequence()
-  }
-
-  @Deprecated("Please use KeyHandler instead")
-  override fun startLiteralSequence() {
-    val keyHandler = KeyHandler.getInstance()
-    keyHandler.keyHandlerState.digraphSequence.startLiteralSequence()
-  }
-
-  @Deprecated("Please use KeyHandler instead")
-  override fun processDigraphKey(key: KeyStroke, editor: VimEditor): DigraphResult {
-    val keyHandler = KeyHandler.getInstance()
-    return keyHandler.keyHandlerState.digraphSequence.processKey(key, editor)
-  }
-
   /**
    * Toggles the insert/overwrite state. If currently insert, goto replace mode. If currently replace, goto insert
    * mode.
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt
index f1b9e1640..7ee1c362c 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/key/MappingInfo.kt
@@ -25,7 +25,6 @@ import com.maddyhome.idea.vim.group.visual.VimSelection
 import com.maddyhome.idea.vim.group.visual.VimSelection.Companion.create
 import com.maddyhome.idea.vim.helper.VimNlsSafe
 import com.maddyhome.idea.vim.state.KeyHandlerState
-import com.maddyhome.idea.vim.state.VimStateMachine
 import com.maddyhome.idea.vim.state.mode.Mode
 import com.maddyhome.idea.vim.state.mode.SelectionType.CHARACTER_WISE
 import com.maddyhome.idea.vim.state.mode.selectionType
@@ -148,12 +147,12 @@ public class ToHandlerMappingInfo(
 
   override fun execute(editor: VimEditor, context: ExecutionContext, keyState: KeyHandlerState) {
     LOG.debug("Executing 'ToHandler' mapping info...")
-    val vimStateMachine = VimStateMachine.getInstance(editor)
+    val keyHandler = KeyHandler.getInstance()
 
     // Cache isOperatorPending in case the extension changes the mode while moving the caret
     // See CommonExtensionTest
     // TODO: Is this legal? Should we assert in this case?
-    val shouldCalculateOffsets: Boolean = vimStateMachine.isOperatorPending(editor.mode)
+    val shouldCalculateOffsets: Boolean = keyHandler.isOperatorPending(editor.mode, keyState)
 
     val startOffsets: Map<ImmutableVimCaret, Int> = editor.carets().associateWith { it.offset }
 
@@ -181,7 +180,7 @@ public class ToHandlerMappingInfo(
       }
     }
 
-    val operatorArguments = OperatorArguments(vimStateMachine.isOperatorPending(editor.mode), keyState.commandBuilder.count, vimStateMachine.mode)
+    val operatorArguments = OperatorArguments(keyHandler.isOperatorPending(editor.mode, keyState), keyState.commandBuilder.count, editor.mode)
     val register = keyState.commandBuilder.register
     if (register != null) {
       injector.registerGroup.selectRegister(register)
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/state/VimStateMachine.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/state/VimStateMachine.kt
index 361c680b0..3befabf56 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/state/VimStateMachine.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/state/VimStateMachine.kt
@@ -8,16 +8,13 @@
 
 package com.maddyhome.idea.vim.state
 
-import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.api.globalOptions
 import com.maddyhome.idea.vim.api.injector
 import com.maddyhome.idea.vim.command.Command
 import com.maddyhome.idea.vim.command.CommandFlags
-import com.maddyhome.idea.vim.common.DigraphResult
 import com.maddyhome.idea.vim.impl.state.VimStateMachineImpl
 import com.maddyhome.idea.vim.state.mode.Mode
 import java.util.*
-import javax.swing.KeyStroke
 
 /**
  * Used to maintain state before and while entering a Vim command (operator, motion, text object, etc.)
@@ -39,18 +36,9 @@ public interface VimStateMachine {
    * This field is reset after the command has been executed.
    */
   public var executingCommand: Command?
-  @Deprecated("Please use KeyHandler instead")
-  public fun isOperatorPending(mode: Mode): Boolean
   public val executingCommandFlags: EnumSet<CommandFlags>
 
-  @Deprecated("Please use KeyHandler instead")
-  public fun isDuplicateOperatorKeyStroke(key: KeyStroke, mode: Mode): Boolean
-
   public fun resetRegisterPending()
-  @Deprecated("Please use KeyHandler instead")
-  public fun startLiteralSequence()
-  @Deprecated("Please use KeyHandler instead")
-  public fun processDigraphKey(key: KeyStroke, editor: VimEditor): DigraphResult
 
   /**
    * Toggles the insert/overwrite state. If currently insert, goto replace mode. If currently replace, goto insert
@@ -58,9 +46,6 @@ public interface VimStateMachine {
    */
   public fun toggleInsertOverwrite()
 
-  @Deprecated("Please use KeyHandler instead")
-  public fun startDigraphSequence()
-
   public companion object {
     private val globalState = VimStateMachineImpl()
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt
index 01e9aacf2..1c01aee71 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/Command.kt
@@ -8,6 +8,7 @@
 
 package com.maddyhome.idea.vim.vimscript.model.commands
 
+import com.maddyhome.idea.vim.KeyHandler
 import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
@@ -22,7 +23,6 @@ import com.maddyhome.idea.vim.ex.ranges.LineRange
 import com.maddyhome.idea.vim.ex.ranges.Range
 import com.maddyhome.idea.vim.helper.Msg
 import com.maddyhome.idea.vim.helper.StrictMode
-import com.maddyhome.idea.vim.helper.vimStateMachine
 import com.maddyhome.idea.vim.state.mode.inNormalMode
 import com.maddyhome.idea.vim.state.mode.isBlock
 import com.maddyhome.idea.vim.vimscript.model.Executable
@@ -91,8 +91,10 @@ public sealed class Command(private val commandRange: Range, public val commandA
       return ExecutionResult.Error
     }
 
+    val keyHandler = KeyHandler.getInstance()
+    val keyState = keyHandler.keyHandlerState
     val operatorArguments = OperatorArguments(
-      editor.vimStateMachine.isOperatorPending(editor.mode),
+      keyHandler.isOperatorPending(editor.mode, keyState),
       0,
       editor.mode,
     )