   #
   # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
   onDidChange: (callback) ->
+    unless @hasChangeObservers
+      @oldHeadBufferPosition = @getHeadBufferPosition()
+      @oldHeadScreenPosition = @getHeadScreenPosition()
+      @oldTailBufferPosition = @getTailBufferPosition()
+      @oldTailScreenPosition = @getTailScreenPosition()
+      @wasValid = @isValid()
+      @disposables.add @bufferMarker.onDidChange (event) => @notifyObservers(event)
+      @hasChangeObservers = true
     @emitter.on 'did-change', callback
 
   # Essential: Invoke the given callback when the marker is destroyed.

  oldTailBufferPosition: null
  oldTailScreenPosition: null
  wasValid: true

  ###
  Section: Construction and Destruction

    @emitter = new Emitter
    @disposables = new CompositeDisposable
    @id = @bufferMarker.id

    @disposables.add @bufferMarker.onDidDestroy => @destroyed()

  # Essential: Destroys the marker, causing it to emit the 'destroyed' event. Once
  # destroyed, a marker cannot be restored by undo/redo operations.
