diff --git a/dist b/dist
index 80ab682b0a6f338e48979b619e0c7b6f55ca9a48..b9f9c762ebed9b30c44b1c87b555e89a7257ae58 160000
--- a/dist
+++ b/dist
@@ -1 +1 @@
-Subproject commit 80ab682b0a6f338e48979b619e0c7b6f55ca9a48
+Subproject commit b9f9c762ebed9b30c44b1c87b555e89a7257ae58
diff --git a/package.json b/package.json
index a18608da639e9481b5137e6fe3960cf8a944dda8..6e3a4175950b3aafd3f5f73429beda20d68c3065 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "yjs",
-  "version": "11.1.0",
+  "version": "11.2.0",
   "description": "A framework for real-time p2p shared editing on arbitrary complex data types",
   "main": "./src/y.js",
   "scripts": {
diff --git a/src/Database.js b/src/Database.js
index 6b9ece788142e54ec7ee1057434a9f88afaf2d9e..66c77a26009b67c501d49cf67cf9241df8c9478c 100644
--- a/src/Database.js
+++ b/src/Database.js
@@ -379,56 +379,73 @@ module.exports = function (Y /* :any */) {
         }
       }
     }
-    // called by a transaction when an operation is added
+    /*
+     * Called by a transaction when an operation is added.
+     * This function is especially important for y-indexeddb, where several instances may share a single database.
+     * Every time an operation is created by one instance, it is send to all other instances and operationAdded is called
+     *
+     * If it's not a Delete operation:
+     *   * Checks if another operation is executable (listenersById)
+     *   * Update state, if possible
+     *
+     * Always:
+     *   * Call type
+     */
     * operationAdded (transaction, op) {
-      // increase SS
-      yield* transaction.updateState(op.id[0])
-
-      var opLen = op.content != null ? op.content.length : 1
-      for (let i = 0; i < opLen; i++) {
-        // notify whenOperation listeners (by id)
-        var sid = JSON.stringify([op.id[0], op.id[1] + i])
-        var l = this.listenersById[sid]
-        delete this.listenersById[sid]
-
-        if (l != null) {
-          for (var key in l) {
-            var listener = l[key]
-            if (--listener.missing === 0) {
-              this.whenOperationsExist([], listener.op)
+      if (op.struct === 'Delete') {
+        var target = yield* transaction.getInsertion(op.target)
+        var type = this.initializedTypes[JSON.stringify(target.parent)]
+        if (type != null) {
+          yield* type._changed(transaction, op)
+        }
+      } else {
+        // increase SS
+        yield* transaction.updateState(op.id[0])
+        var opLen = op.content != null ? op.content.length : 1
+        for (let i = 0; i < opLen; i++) {
+          // notify whenOperation listeners (by id)
+          var sid = JSON.stringify([op.id[0], op.id[1] + i])
+          var l = this.listenersById[sid]
+          delete this.listenersById[sid]
+          if (l != null) {
+            for (var key in l) {
+              var listener = l[key]
+              if (--listener.missing === 0) {
+                this.whenOperationsExist([], listener.op)
+              }
             }
           }
         }
-      }
-      var t = this.initializedTypes[JSON.stringify(op.parent)]
+        var t = this.initializedTypes[JSON.stringify(op.parent)]
 
-      // if parent is deleted, mark as gc'd and return
-      if (op.parent != null) {
-        var parentIsDeleted = yield* transaction.isDeleted(op.parent)
-        if (parentIsDeleted) {
-          yield* transaction.deleteList(op.id)
-          return
+        // if parent is deleted, mark as gc'd and return
+        if (op.parent != null) {
+          var parentIsDeleted = yield* transaction.isDeleted(op.parent)
+          if (parentIsDeleted) {
+            yield* transaction.deleteList(op.id)
+            return
+          }
         }
-      }
 
-      // notify parent, if it was instanciated as a custom type
-      if (t != null) {
-        let o = Y.utils.copyOperation(op)
-        yield* t._changed(transaction, o)
-      }
-      if (!op.deleted) {
-        // Delete if DS says this is actually deleted
-        var len = op.content != null ? op.content.length : 1
-        var startId = op.id // You must not use op.id in the following loop, because op will change when deleted
-        for (let i = 0; i < len; i++) {
-          var id = [startId[0], startId[1] + i]
-          var opIsDeleted = yield* transaction.isDeleted(id)
-          if (opIsDeleted) {
-            var delop = {
-              struct: 'Delete',
-              target: id
+        // notify parent, if it was instanciated as a custom type
+        if (t != null) {
+          let o = Y.utils.copyOperation(op)
+          yield* t._changed(transaction, o)
+        }
+        if (!op.deleted) {
+          // Delete if DS says this is actually deleted
+          var len = op.content != null ? op.content.length : 1
+          var startId = op.id // You must not use op.id in the following loop, because op will change when deleted
+          for (let i = 0; i < len; i++) {
+            var id = [startId[0], startId[1] + i]
+            var opIsDeleted = yield* transaction.isDeleted(id)
+            if (opIsDeleted) {
+              var delop = {
+                struct: 'Delete',
+                target: id
+              }
+              yield* this.tryExecute.call(transaction, delop)
             }
-            yield* this.tryExecute.call(transaction, delop)
           }
         }
       }
diff --git a/src/Transaction.js b/src/Transaction.js
index d32112b3f6a6c4d82f42d8e673291c74444e013a..461db13b5b463bf403b23fd809dd6cef7ddf4cda 100644
--- a/src/Transaction.js
+++ b/src/Transaction.js
@@ -254,14 +254,11 @@ module.exports = function (Y/* :any */) {
             right = null
           }
           if (callType && !preventCallType) {
-            var type = this.store.initializedTypes[JSON.stringify(target.parent)]
-            if (type != null) {
-              yield* type._changed(this, {
-                struct: 'Delete',
-                target: target.id,
-                length: targetLength
-              })
-            }
+            yield* this.store.operationAdded(this, {
+              struct: 'Delete',
+              target: target.id,
+              length: targetLength
+            })
           }
           // need to gc in the end!
           yield* this.store.addToGarbageCollector.call(this, target, left)