diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index f0cc32bf3..f7ee75d8d 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -191,6 +191,10 @@
     </codeStyleSettings>
     <codeStyleSettings language="kotlin">
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+      <indentOptions>
+        <option name="INDENT_SIZE" value="2" />
+        <option name="TAB_SIZE" value="2" />
+      </indentOptions>
     </codeStyleSettings>
   </code_scheme>
 </component>
\ No newline at end of file
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 cdbe2d87e..f39e66b39 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
@@ -35,7 +35,7 @@ import com.maddyhome.idea.vim.helper.mode
 import com.maddyhome.idea.vim.helper.subMode
 import com.maddyhome.idea.vim.helper.vimStateMachine
 import com.maddyhome.idea.vim.key.OperatorFunction
-import com.maddyhome.idea.vim.newapi.IjExecutionContext
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext
 import com.maddyhome.idea.vim.newapi.IjVimEditor
 import com.maddyhome.idea.vim.newapi.ij
 import com.maddyhome.idea.vim.newapi.vim
@@ -169,7 +169,7 @@ class ReplaceWithRegister : VimExtension {
       ClipboardOptionHelper.IdeaputDisabler().use {
         VimPlugin.getPut().putText(
           IjVimEditor(editor),
-          IjExecutionContext(EditorDataContext.init(editor)),
+          IjEditorExecutionContext(EditorDataContext.init(editor)),
           putData,
           operatorArguments = OperatorArguments(
             editor.vimStateMachine?.isOperatorPending ?: false,
diff --git a/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java b/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java
index a170de807..c030959eb 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java
@@ -45,8 +45,8 @@ import com.maddyhome.idea.vim.helper.*;
 import com.maddyhome.idea.vim.icons.VimIcons;
 import com.maddyhome.idea.vim.key.KeyHandlerKeeper;
 import com.maddyhome.idea.vim.listener.VimInsertListener;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
-import com.maddyhome.idea.vim.newapi.IjExecutionContextKt;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContextKt;
 import com.maddyhome.idea.vim.newapi.IjVimCaret;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.options.OptionConstants;
@@ -99,7 +99,7 @@ public class ChangeGroup extends VimChangeGroupBase {
   @Override
   public void type(@NotNull VimEditor vimEditor, @NotNull ExecutionContext context, char key) {
     Editor editor = ((IjVimEditor) vimEditor).getEditor();
-    DataContext ijContext = IjExecutionContextKt.getIj(context);
+    DataContext ijContext = IjEditorExecutionContextKt.getIj(context);
     final Document doc = ((IjVimEditor) vimEditor).getEditor().getDocument();
     CommandProcessor.getInstance().executeCommand(editor.getProject(), () -> ApplicationManager.getApplication()
                                                     .runWriteAction(() -> KeyHandlerKeeper.getInstance().getOriginalHandler().execute(editor, key, ijContext)), "", doc,
@@ -116,7 +116,7 @@ public class ChangeGroup extends VimChangeGroupBase {
                                                                          final @NotNull Argument argument,
                                                                          boolean isChange,
                                                                          @NotNull OperatorArguments operatorArguments) {
-    final TextRange range = MotionGroup.getMotionRange2(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), ((IjExecutionContext) context).getContext(), argument, operatorArguments);
+    final TextRange range = MotionGroup.getMotionRange2(((IjVimEditor) editor).getEditor(), ((IjVimCaret) caret).getCaret(), ((IjEditorExecutionContext) context).getContext(), argument, operatorArguments);
     if (range == null) return null;
 
     // Delete motion commands that are not linewise become linewise if all the following are true:
@@ -210,7 +210,7 @@ public class ChangeGroup extends VimChangeGroupBase {
 
       final int lineLength = EngineEditorHelperKt.lineLength(editor, line);
       if (column < VimMotionGroupBase.LAST_COLUMN && lineLength < column) {
-        final String pad = EditorHelper.pad(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), line, column);
+        final String pad = EditorHelper.pad(((IjVimEditor) editor).getEditor(), ((IjEditorExecutionContext) context).getContext(), line, column);
         final int offset = editor.getLineEndOffset(line);
         insertText(editor, caret, offset, pad);
       }
@@ -436,7 +436,7 @@ public class ChangeGroup extends VimChangeGroupBase {
     // Remember the current caret column
     final int intendedColumn = caret.getVimLastColumn();
 
-    IndentConfig indentConfig = IndentConfig.create(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext());
+    IndentConfig indentConfig = IndentConfig.create(((IjVimEditor) editor).getEditor(), ((IjEditorExecutionContext) context).getContext());
 
     final int sline = editor.offsetToBufferPosition(range.getStartOffset()).getLine();
     final BufferPosition endLogicalPosition = editor.offsetToBufferPosition(range.getEndOffset());
diff --git a/src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java b/src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java
index abe7a9183..8a2567cc1 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/EditorGroup.java
@@ -23,7 +23,7 @@ import com.maddyhome.idea.vim.VimPlugin;
 import com.maddyhome.idea.vim.api.VimEditor;
 import com.maddyhome.idea.vim.api.VimEditorGroup;
 import com.maddyhome.idea.vim.helper.*;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.options.LocalOptionChangeListener;
 import com.maddyhome.idea.vim.options.OptionConstants;
@@ -36,7 +36,6 @@ import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
@@ -215,7 +214,7 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
     if (!EditorHelper.isFileEditor(editor) &&
         editor.getDocument().isWritable() &&
         !CommandStateHelper.inInsertMode(editor)) {
-      VimPlugin.getChange().insertBeforeCursor(new IjVimEditor(editor), new IjExecutionContext(EditorDataContext.init(editor, null)));
+      VimPlugin.getChange().insertBeforeCursor(new IjVimEditor(editor), new IjEditorExecutionContext(EditorDataContext.init(editor, null)));
       KeyHandler.getInstance().reset(new IjVimEditor(editor));
     }
     updateCaretsVisualAttributes(editor);
diff --git a/src/main/java/com/maddyhome/idea/vim/group/FileGroup.java b/src/main/java/com/maddyhome/idea/vim/group/FileGroup.java
index 9f5d1765d..a91d36050 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/FileGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/FileGroup.java
@@ -37,7 +37,7 @@ import com.maddyhome.idea.vim.helper.EditorHelperRt;
 import com.maddyhome.idea.vim.helper.MessageHelper;
 import com.maddyhome.idea.vim.helper.SearchHelper;
 import com.maddyhome.idea.vim.newapi.ExecuteExtensionKt;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.vimscript.services.IjOptionConstants;
 import org.jetbrains.annotations.NotNull;
@@ -54,7 +54,7 @@ public class FileGroup extends VimFileBase {
     if (logger.isDebugEnabled()) {
       logger.debug("openFile(" + filename + ")");
     }
-    final Project project = PlatformDataKeys.PROJECT.getData(((IjExecutionContext) context).getContext()); // API change - don't merge
+    final Project project = PlatformDataKeys.PROJECT.getData(((IjEditorExecutionContext) context).getContext()); // API change - don't merge
     if (project == null) return false;
 
     VirtualFile found = findFile(filename, project);
@@ -165,7 +165,7 @@ public class FileGroup extends VimFileBase {
    */
   @Override
   public void closeFile(int number, @NotNull ExecutionContext context) {
-    final Project project = PlatformDataKeys.PROJECT.getData(((IjExecutionContext) context).getContext());
+    final Project project = PlatformDataKeys.PROJECT.getData(((IjEditorExecutionContext) context).getContext());
     if (project == null) return;
     final FileEditorManagerEx fileEditorManager = FileEditorManagerEx.getInstanceEx(project);
     final EditorWindow window = fileEditorManager.getCurrentWindow();
@@ -207,7 +207,7 @@ public class FileGroup extends VimFileBase {
    */
   @Override
   public boolean selectFile(int count, @NotNull ExecutionContext context) {
-    final Project project = PlatformDataKeys.PROJECT.getData(((IjExecutionContext) context).getContext());
+    final Project project = PlatformDataKeys.PROJECT.getData(((IjEditorExecutionContext) context).getContext());
     if (project == null) return false;
     FileEditorManager fem = FileEditorManager.getInstance(project); // API change - don't merge
     VirtualFile[] editors = fem.getOpenFiles();
@@ -227,7 +227,7 @@ public class FileGroup extends VimFileBase {
    * Selects then next or previous editor.
    */
   public void selectNextFile(int count, @NotNull ExecutionContext context) {
-    Project project = PlatformDataKeys.PROJECT.getData(((IjExecutionContext) context).getContext());
+    Project project = PlatformDataKeys.PROJECT.getData(((IjEditorExecutionContext) context).getContext());
     if (project == null) return;
     FileEditorManager fem = FileEditorManager.getInstance(project); // API change - don't merge
     VirtualFile[] editors = fem.getOpenFiles();
diff --git a/src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt b/src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt
index a11b68677..2d5258801 100755
--- a/src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt
+++ b/src/main/java/com/maddyhome/idea/vim/group/MotionGroup.kt
@@ -66,7 +66,7 @@ import com.maddyhome.idea.vim.helper.isEndAllowed
 import com.maddyhome.idea.vim.helper.vimLastColumn
 import com.maddyhome.idea.vim.listener.AppCodeTemplates
 import com.maddyhome.idea.vim.mark.Mark
-import com.maddyhome.idea.vim.newapi.IjExecutionContext
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext
 import com.maddyhome.idea.vim.newapi.IjVimCaret
 import com.maddyhome.idea.vim.newapi.IjVimEditor
 import com.maddyhome.idea.vim.newapi.ij
@@ -366,7 +366,7 @@ class MotionGroup : VimMotionGroupBase() {
           val motion = action.getHandlerOffset(
             editor.vim,
             caret.vim,
-            IjExecutionContext(context!!),
+            IjEditorExecutionContext(context!!),
             cmd.argument,
             operatorArguments.withCount0(raw)
           )
@@ -387,7 +387,7 @@ class MotionGroup : VimMotionGroupBase() {
         } else if (cmd.action is TextObjectActionHandler) {
           val action = cmd.action as TextObjectActionHandler
           val range =
-            action.getRange(editor.vim, caret.vim, IjExecutionContext(context!!), cnt, raw, cmd.argument) ?: return null
+            action.getRange(editor.vim, caret.vim, IjEditorExecutionContext(context!!), cnt, raw, cmd.argument) ?: return null
           start = range.startOffset
           end = range.endOffset
           if (cmd.isLinewiseMotion()) end--
diff --git a/src/main/java/com/maddyhome/idea/vim/group/ProcessGroup.java b/src/main/java/com/maddyhome/idea/vim/group/ProcessGroup.java
index e712bc7a8..ecb08862d 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/ProcessGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/ProcessGroup.java
@@ -34,7 +34,7 @@ import com.maddyhome.idea.vim.command.VimStateMachine;
 import com.maddyhome.idea.vim.ex.ExException;
 import com.maddyhome.idea.vim.ex.InvalidCommandException;
 import com.maddyhome.idea.vim.helper.UiHelper;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.options.OptionConstants;
 import com.maddyhome.idea.vim.ui.ex.ExEntryPanel;
@@ -84,7 +84,7 @@ public class ProcessGroup extends VimProcessGroupBase {
     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd);
     VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE);
     ExEntryPanel panel = ExEntryPanel.getInstance();
-    panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1);
+    panel.activate(((IjVimEditor) editor).getEditor(), ((IjEditorExecutionContext) context).getContext(), ":", initText, 1);
   }
 
   @Override
@@ -159,7 +159,7 @@ public class ProcessGroup extends VimProcessGroupBase {
     String initText = getRange(((IjVimEditor) editor).getEditor(), cmd) + "!";
     VimStateMachine.getInstance(editor).pushModes(VimStateMachine.Mode.CMD_LINE, VimStateMachine.SubMode.NONE);
     ExEntryPanel panel = ExEntryPanel.getInstance();
-    panel.activate(((IjVimEditor) editor).getEditor(), ((IjExecutionContext) context).getContext(), ":", initText, 1);
+    panel.activate(((IjVimEditor) editor).getEditor(), ((IjEditorExecutionContext) context).getContext(), ":", initText, 1);
   }
 
   private @NotNull String getRange(Editor editor, @NotNull Command cmd) {
diff --git a/src/main/java/com/maddyhome/idea/vim/group/SearchGroup.java b/src/main/java/com/maddyhome/idea/vim/group/SearchGroup.java
index 922f13297..b2ccab533 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/SearchGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/SearchGroup.java
@@ -33,7 +33,7 @@ import com.maddyhome.idea.vim.ex.ExException;
 import com.maddyhome.idea.vim.ex.ranges.LineRange;
 import com.maddyhome.idea.vim.helper.*;
 import com.maddyhome.idea.vim.history.HistoryConstants;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import com.maddyhome.idea.vim.newapi.IjVimCaret;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.options.OptionChangeListener;
@@ -803,7 +803,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo
             if (expression != null) {
               try {
               match = expression
-                .evaluate(editor, new IjExecutionContext(EditorDataContext.init(((IjVimEditor) editor).getEditor(), null)), parent)
+                .evaluate(editor, new IjEditorExecutionContext(EditorDataContext.init(((IjVimEditor) editor).getEditor(), null)), parent)
                 .toInsertableString();
               } catch (Exception e) {
                 exceptions.add((ExException) e);
diff --git a/src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java b/src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java
index 3bcd8f5dc..56275a6ec 100644
--- a/src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java
+++ b/src/main/java/com/maddyhome/idea/vim/group/WindowGroup.java
@@ -20,7 +20,7 @@ import com.maddyhome.idea.vim.VimPlugin;
 import com.maddyhome.idea.vim.api.ExecutionContext;
 import com.maddyhome.idea.vim.helper.MessageHelper;
 import com.maddyhome.idea.vim.helper.RWLockLabel;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -51,7 +51,7 @@ public class WindowGroup extends WindowGroupBase {
   }
 
   public void closeAll(@NotNull ExecutionContext context) {
-    getFileEditorManager(((IjExecutionContext) context).getContext()).closeAllFiles();
+    getFileEditorManager(((IjEditorExecutionContext) context).getContext()).closeAllFiles();
   }
 
   @Override
diff --git a/src/main/java/com/maddyhome/idea/vim/helper/IjActionExecutor.kt b/src/main/java/com/maddyhome/idea/vim/helper/IjActionExecutor.kt
index 83ffbcccc..b9d074c04 100644
--- a/src/main/java/com/maddyhome/idea/vim/helper/IjActionExecutor.kt
+++ b/src/main/java/com/maddyhome/idea/vim/helper/IjActionExecutor.kt
@@ -31,6 +31,7 @@ import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.NativeAction
 import com.maddyhome.idea.vim.api.VimActionExecutor
 import com.maddyhome.idea.vim.api.VimEditor
+import com.maddyhome.idea.vim.api.injector
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.handler.EditorActionHandlerBase
 import com.maddyhome.idea.vim.newapi.IjNativeAction
@@ -163,7 +164,7 @@ class IjActionExecutor : VimActionExecutor {
     CommandProcessor.getInstance()
       .executeCommand(
         editor.ij.project,
-        { cmd.execute(editor, EditorDataContext.init(editor.ij, context.ij).vim, operatorArguments) },
+        { cmd.execute(editor, injector.executionContextManager.onEditor(editor, context), operatorArguments) },
         cmd.id, DocCommandGroupId.noneGroupId(editor.ij.document), UndoConfirmationPolicy.DEFAULT,
         editor.ij.document
       )
diff --git a/src/main/java/com/maddyhome/idea/vim/helper/ModeExtensions.kt b/src/main/java/com/maddyhome/idea/vim/helper/ModeExtensions.kt
index 3ca8a2268..016a90a83 100644
--- a/src/main/java/com/maddyhome/idea/vim/helper/ModeExtensions.kt
+++ b/src/main/java/com/maddyhome/idea/vim/helper/ModeExtensions.kt
@@ -19,7 +19,7 @@ import com.maddyhome.idea.vim.api.getLineStartForOffset
 import com.maddyhome.idea.vim.command.OperatorArguments
 import com.maddyhome.idea.vim.command.VimStateMachine
 import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor
-import com.maddyhome.idea.vim.newapi.IjExecutionContext
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext
 import com.maddyhome.idea.vim.newapi.IjVimCaret
 import com.maddyhome.idea.vim.newapi.IjVimEditor
 import com.maddyhome.idea.vim.newapi.vim
@@ -76,5 +76,5 @@ fun VimEditor.exitSelectMode(adjustCaretPosition: Boolean) {
 }
 
 fun Editor.exitInsertMode(context: DataContext, operatorArguments: OperatorArguments) {
-  VimPlugin.getChange().processEscape(IjVimEditor(this), IjExecutionContext(context), operatorArguments)
+  VimPlugin.getChange().processEscape(IjVimEditor(this), IjEditorExecutionContext(context), operatorArguments)
 }
diff --git a/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContext.kt b/src/main/java/com/maddyhome/idea/vim/newapi/IjEditorExecutionContext.kt
similarity index 54%
rename from src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContext.kt
rename to src/main/java/com/maddyhome/idea/vim/newapi/IjEditorExecutionContext.kt
index 05f94bf28..f7ccae6b2 100644
--- a/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContext.kt
+++ b/src/main/java/com/maddyhome/idea/vim/newapi/IjEditorExecutionContext.kt
@@ -13,14 +13,16 @@ import com.maddyhome.idea.vim.api.ExecutionContext
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.helper.EditorDataContext
 
-class IjExecutionContext(override val context: DataContext) : ExecutionContext {
+open class IjEditorExecutionContext(override val context: DataContext) : ExecutionContext.Editor {
   override fun updateEditor(editor: VimEditor): ExecutionContext {
-    return IjExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, context))
+    return IjEditorExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, context))
   }
 }
 
-val DataContext.vim
-  get() = IjExecutionContext(this)
+class IjCaretAndEditorExecutionContext(override val context: DataContext) : IjEditorExecutionContext(context), ExecutionContext.CaretAndEditor
+
+val DataContext.vim: ExecutionContext
+  get() = IjEditorExecutionContext(this)
 
 val ExecutionContext.ij: DataContext
-  get() = (this as IjExecutionContext).context
+  get() = (this as IjEditorExecutionContext).context
diff --git a/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContextManager.kt b/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContextManager.kt
index dd85ba2af..b1040dbe6 100644
--- a/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContextManager.kt
+++ b/src/main/java/com/maddyhome/idea/vim/newapi/IjExecutionContextManager.kt
@@ -15,22 +15,20 @@ import com.maddyhome.idea.vim.api.ExecutionContextManagerBase
 import com.maddyhome.idea.vim.api.VimCaret
 import com.maddyhome.idea.vim.api.VimEditor
 import com.maddyhome.idea.vim.helper.EditorDataContext
+import com.maddyhome.idea.vim.options.helpers.StrictMode
 
 @Service
 class IjExecutionContextManager : ExecutionContextManagerBase() {
-  override fun onEditor(editor: VimEditor, prevContext: ExecutionContext?): ExecutionContext {
-    return IjExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, prevContext?.ij))
+  override fun onEditor(editor: VimEditor, prevContext: ExecutionContext?): ExecutionContext.Editor {
+    if (prevContext is ExecutionContext.CaretAndEditor) {
+      StrictMode.fail("You should not create context on editor from the context on caret and editor")
+      prevContext.updateEditor(editor)
+      return prevContext
+    }
+    return IjEditorExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, prevContext?.ij))
   }
 
-  override fun onCaret(caret: VimCaret, prevContext: ExecutionContext): ExecutionContext {
-    return IjExecutionContext(CaretSpecificDataContext.create(prevContext.ij, caret.ij))
-  }
-
-  override fun createCaretSpecificDataContext(context: ExecutionContext, caret: VimCaret): ExecutionContext {
-    return IjExecutionContext(CaretSpecificDataContext.create(context.ij, caret.ij))
-  }
-
-  override fun createEditorDataContext(editor: VimEditor, context: ExecutionContext): ExecutionContext {
-    return EditorDataContext.init(editor.ij, context.ij).vim
+  override fun onCaret(caret: VimCaret, prevContext: ExecutionContext.Editor): ExecutionContext.CaretAndEditor {
+    return IjCaretAndEditorExecutionContext(CaretSpecificDataContext.create(prevContext.ij, caret.ij))
   }
 }
diff --git a/src/main/java/com/maddyhome/idea/vim/ui/ExOutputPanel.java b/src/main/java/com/maddyhome/idea/vim/ui/ExOutputPanel.java
index 2d9641ce4..8bc5ac3bf 100644
--- a/src/main/java/com/maddyhome/idea/vim/ui/ExOutputPanel.java
+++ b/src/main/java/com/maddyhome/idea/vim/ui/ExOutputPanel.java
@@ -18,7 +18,7 @@ import com.intellij.util.IJSwingUtilities;
 import com.maddyhome.idea.vim.KeyHandler;
 import com.maddyhome.idea.vim.VimPlugin;
 import com.maddyhome.idea.vim.helper.*;
-import com.maddyhome.idea.vim.newapi.IjExecutionContext;
+import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
 import com.maddyhome.idea.vim.newapi.IjVimEditor;
 import com.maddyhome.idea.vim.options.OptionConstants;
 import org.jetbrains.annotations.Nls;
@@ -296,7 +296,7 @@ public class ExOutputPanel extends JPanel {
         final List<KeyStroke> keys = new ArrayList<>(1);
         keys.add(key);
         KeyHandler.getInstance().getKeyStack().addKeys(keys);
-        VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), new IjExecutionContext(EditorDataContext.init(myEditor, null)),
+        VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), new IjEditorExecutionContext(EditorDataContext.init(myEditor, null)),
                                           1);
       }
     });
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/ExecutionContext.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/ExecutionContext.kt
index b9a9caa3c..cc1076ee4 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/ExecutionContext.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/ExecutionContext.kt
@@ -12,16 +12,17 @@ package com.maddyhome.idea.vim.api
  * This would be ideal if we could provide a typed solution, but sofar this is just a holder
  */
 
-interface ExecutionContext {
+sealed interface ExecutionContext {
   val context: Any
 
   // TODO: 10.02.2022 Not sure about this method
   fun updateEditor(editor: VimEditor): ExecutionContext
+
+  interface Editor : ExecutionContext
+  interface CaretAndEditor : Editor
 }
 
 interface ExecutionContextManager {
-  fun onEditor(editor: VimEditor, prevContext: ExecutionContext? = null): ExecutionContext
-  fun onCaret(caret: VimCaret, prevContext: ExecutionContext): ExecutionContext
-  fun createCaretSpecificDataContext(context: ExecutionContext, caret: VimCaret): ExecutionContext
-  fun createEditorDataContext(editor: VimEditor, context: ExecutionContext): ExecutionContext
+  fun onEditor(editor: VimEditor, prevContext: ExecutionContext? = null): ExecutionContext.Editor
+  fun onCaret(caret: VimCaret, prevContext: ExecutionContext.Editor): ExecutionContext.CaretAndEditor
 }
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/stubs/ExecutionContextManagerStub.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/stubs/ExecutionContextManagerStub.kt
index 9eccf0130..06e2afa11 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/stubs/ExecutionContextManagerStub.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/stubs/ExecutionContextManagerStub.kt
@@ -19,19 +19,11 @@ class ExecutionContextManagerStub : ExecutionContextManager {
     vimLogger<ExecutionContextManagerStub>().warn("ExecutionContextManagerStub is used. Please replace it with your own implementation of ExecutionContextManager.")
   }
 
-  override fun onEditor(editor: VimEditor, prevContext: ExecutionContext?): ExecutionContext {
+  override fun onEditor(editor: VimEditor, prevContext: ExecutionContext?): ExecutionContext.Editor {
     TODO("Not yet implemented")
   }
 
-  override fun onCaret(caret: VimCaret, prevContext: ExecutionContext): ExecutionContext {
-    TODO("Not yet implemented")
-  }
-
-  override fun createCaretSpecificDataContext(context: ExecutionContext, caret: VimCaret): ExecutionContext {
-    TODO("Not yet implemented")
-  }
-
-  override fun createEditorDataContext(editor: VimEditor, context: ExecutionContext): ExecutionContext {
+  override fun onCaret(caret: VimCaret, prevContext: ExecutionContext.Editor): ExecutionContext.CaretAndEditor {
     TODO("Not yet implemented")
   }
 }
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/EditorActionHandlerBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/EditorActionHandlerBase.kt
index 3ec8de328..d7eedfaba 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/EditorActionHandlerBase.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/handler/EditorActionHandlerBase.kt
@@ -74,7 +74,7 @@ abstract class EditorActionHandlerBase(private val myRunForEachCaret: Boolean) {
     operatorArguments: OperatorArguments,
   ): Boolean
 
-  fun execute(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments) {
+  fun execute(editor: VimEditor, context: ExecutionContext.Editor, operatorArguments: OperatorArguments) {
     val action = { caret: VimCaret -> doExecute(editor, caret, context, operatorArguments) }
     if (myRunForEachCaret) {
       editor.forEachCaret(action)
@@ -83,7 +83,7 @@ abstract class EditorActionHandlerBase(private val myRunForEachCaret: Boolean) {
     }
   }
 
-  private fun doExecute(editor: VimEditor, caret: VimCaret, context: ExecutionContext, operatorArguments: OperatorArguments) {
+  private fun doExecute(editor: VimEditor, caret: VimCaret, context: ExecutionContext.Editor, operatorArguments: OperatorArguments) {
     if (!injector.enabler.isEnabled()) return
 
     logger.debug("Execute command with handler: " + this.javaClass.name)
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 be780dab8..79199db57 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
@@ -243,7 +243,7 @@ class ToActionMappingInfo(
   override fun execute(editor: VimEditor, context: ExecutionContext) {
     LOG.debug("Executing 'ToAction' mapping...")
     val editorDataContext = injector.executionContextManager.onEditor(editor, context)
-    val dataContext = injector.executionContextManager.createCaretSpecificDataContext(editorDataContext, editor.currentCaret())
+    val dataContext = injector.executionContextManager.onCaret(editor.currentCaret(), editorDataContext)
     injector.actionExecutor.executeAction(action, dataContext)
   }
 
diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt
index f7370a1e8..dab127e36 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/EditFileCommand.kt
@@ -36,7 +36,7 @@ data class EditFileCommand(val ranges: Ranges, val argument: String) : Command.S
 
     // Don't open a choose file dialog under a write action
     injector.application.invokeLater {
-      injector.actionExecutor.executeAction("OpenFile", injector.executionContextManager.createEditorDataContext(editor, context))
+      injector.actionExecutor.executeAction("OpenFile", injector.executionContextManager.onEditor(editor, context))
     }
 
     return ExecutionResult.Success