     range = getNewTextRangeFromCheckpoint(@editor, @getCheckpoint(purpose))
     fn(range) if range?
 
-  repeatInsertCountTimes: (count) ->
-    @withAddedBufferRangeFromCheckpoint 'undo', (range) =>
-      text = @editor.getTextInBufferRange(range)
-      _.times count, =>
-        for selection in @editor.getSelections()
-          selection.insertText(text, autoIndent: true)
-
   observeWillDeactivateMode: ->
-    # Need to preserve here since count is reset on operationStack::process finished()
-    count = @getCount() - 1
     disposable = @vimState.modeManager.preemptWillDeactivateMode ({mode}) =>
       return unless mode is 'insert'
       disposable.dispose()
 
       @vimState.mark.set('^', @editor.getCursorBufferPosition())
       text = ''
-      @withAddedBufferRangeFromCheckpoint 'insert', (range) =>
-        # Marker can track following extra insert incase count specified
-        @setMarkForChange(range)
+      if (range = getNewTextRangeFromCheckpoint(@editor, @getCheckpoint('insert')))?
+        @setMarkForChange(range) # Marker can track following extra insertion incase count specified
         text = @editor.getTextInBufferRange(range)
-        @saveInsertedText(text)
-        @vimState.register.set('.', {text})
-
-      if @supportInsertionCount and count > 0
-        @repeatInsertCountTimes(count)
+      @saveInsertedText(text)
+      @vimState.register.set('.', {text})
+
+      _.times @getInsertionCount(), =>
+        text = @textByOperator + @getInsertedText()
+        for selection in @editor.getSelections()
+          selection.insertText(text, autoIndent: true)
 
       # grouping changes for undo checkpoint need to come last
       @editor.groupChangesSinceCheckpoint(@getCheckpoint('undo'))

          @repeatInsert(s, text)
          moveCursorLeft(s.cursor)
    else
      @setCheckpoint('insert')
      @vimState.activate('insert', @submode)


  @extend()
  target: 'MoveToNextFoldStart'

class InsertAboveWithNewline extends ActivateInsertMode
  @extend()
  execute: ->
