     @decorationsByMarkerId[marker.id].push(decoration)
     @decorationsById[decoration.id] = decoration
 
-    @decorationUpdatedSubscriptions[decoration.id] ?= @subscribe decoration, 'updated', (event) =>
+    @decorationUpdatedSubscriptions[decoration.id] ?= decoration.onDidChangeProperties (event) =>
       @stackDecorationChanges(decoration)
 
-    @decorationDestroyedSubscriptions[decoration.id] ?= @subscribe decoration, 'destroyed', (event) =>
+    @decorationDestroyedSubscriptions[decoration.id] ?= decoration.onDidDestroy (event) =>
       @removeDecoration(decoration)
 
     @stackDecorationChanges(decoration)


    @stackDecorationChanges(decoration)

    @decorationUpdatedSubscriptions[decoration.id].off()
    @decorationDestroyedSubscriptions[decoration.id].off()

    delete @decorationUpdatedSubscriptions[decoration.id]
    delete @decorationDestroyedSubscriptions[decoration.id]

      cls = decorationParams.class.split(' ').join('.')
      decorationParams.scope = ".minimap .#{cls}"

    @decorationMarkerDestroyedSubscriptions[marker.id] ?= marker.onDidDestroy =>
      @removeAllDecorationsForMarker(marker)
      @stackRangeChanges(marker.getScreenRange())

    @decorationMarkerChangedSubscriptions[marker.id] ?= marker.onDidChange (event) =>
      decorations = @decorationsByMarkerId[marker.id]

      # Why check existence? Markers may get destroyed or decorations removed
