       return
 
     marker = @getMarker(marker.id)
-    @decorationMarkerDestroyedSubscriptions[marker.id] ?= @subscribe marker, 'destroyed', => @removeAllDecorationsForMarker(marker)
-
-    subscription = @subscribe marker, 'changed', (event) => @emit('decoration-changed', marker, decoration, event)
-    @decorationMarkerChangedSubscriptions[marker.id] ?= []
-    @decorationMarkerChangedSubscriptions[marker.id].push {decoration, subscription}
+
+    @decorationMarkerDestroyedSubscriptions[marker.id] ?= @subscribe marker, 'destroyed', =>
+      @removeAllDecorationsForMarker(marker)
+
+    @decorationMarkerChangedSubscriptions[marker.id] ?= @subscribe marker, 'changed', (event) =>
+      decorations = @decorationsByMarkerId[marker.id]
+      for decoration in decorations
+        @emit 'decoration-changed', marker, decoration, event
 
     @decorationsByMarkerId[marker.id] ?= []
     @decorationsByMarkerId[marker.id].push(decoration)

      console.warn 'A decoration cannot be removed from a null marker'
      return

    return unless @decorationMarkerSubscriptions[marker.id]?

    decorations = @decorationsByMarkerId[marker.id]
    for i in [decorations.length - 1..0]
      decoration = decorations[i]
      if @decorationMatchesPattern(decoration, decorationPattern)
        @unsubscribeDecorationFromMarker(marker, decoration)
        decorations.splice(i, 1)
        @emit 'decoration-removed', marker, decoration


    @removedAllMarkerDecorations(marker)

  removedAllMarkerDecorations: (marker) ->
    @decorationMarkerChangedSubscriptions[marker.id].off()
    @decorationMarkerDestroyedSubscriptions[marker.id].off()

    delete @decorationsByMarkerId[marker.id]
    delete @decorationMarkerChangedSubscriptions[marker.id]
    delete @decorationMarkerDestroyedSubscriptions[marker.id]

  # Retrieves a {DisplayBufferMarker} based on its id.
  #
