       console.warn 'A decoration cannot be removed from a null marker'
       return
 
-    return unless @decorationMarkerSubscriptions[marker.id]?
-
-    decorations = @decorationsByMarkerId[marker.id]
+    return unless 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
 

      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}

    @decorationsByMarkerId[marker.id] ?= []
    @decorationsByMarkerId[marker.id].push(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.
  #
