 extension FetchedResultsController {
     
     public func bindToTableView(tableView: UITableView, rowAnimation: UITableViewRowAnimation = .Fade, reloadRowAtIndexPath reloadRowAtIndexPathClosure: (NSIndexPath -> Void)? = nil) -> Self {
+        var insertedSectionIndexes = NSMutableIndexSet()
+        var deletedSectionIndexes = NSMutableIndexSet()
+        var updatedSectionIndexes = NSMutableIndexSet()
+        
+        var insertedItemIndexPaths = [NSIndexPath]()
+        var deletedItemIndexPaths = [NSIndexPath]()
+        var updatedItemIndexPaths = [NSIndexPath]()
+        
         var reloadData = false
-
+        
         self
             .needsReloadData {
                 reloadData = true
             }
-            .willChangeContent { [unowned tableView] in
-                if !reloadData {
+            .willChangeContent {
+                if !reloadData {
+                    insertedSectionIndexes.removeAllIndexes()
+                    deletedSectionIndexes.removeAllIndexes()
+                    updatedSectionIndexes.removeAllIndexes()
+                    
+                    insertedItemIndexPaths.removeAll(keepCapacity: false)
+                    deletedItemIndexPaths.removeAll(keepCapacity: false)
+                    updatedItemIndexPaths.removeAll(keepCapacity: false)
+
+                    //
                     tableView.beginUpdates()
                 }
             }
-            .didInsertSection { [unowned tableView] sectionInfo, sectionIndex in
-                if !reloadData {
-                    tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
-                }
-            }
-            .didDeleteSection { [unowned tableView] sectionInfo, sectionIndex in
-                if !reloadData {
-                    tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
-                }
-            }
-            .didUpdateSection { [unowned tableView] sectionInfo, sectionIndex in
-                if !reloadData {
-                    tableView.reloadSections(NSIndexSet(index: sectionIndex), withRowAnimation: rowAnimation)
-                }
-            }
-            .didInsertEntity { [unowned tableView] entity, newIndexPath in
-                if !reloadData {
-                    tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: rowAnimation)
-                }
-            }
-            .didDeleteEntity { [unowned tableView] entity, indexPath in
-                if !reloadData {
-                    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
-                }
-            }
-            .didUpdateEntity { [unowned tableView] entity, indexPath in
-                if !reloadData {
-                    if let reloadRowAtIndexPathClosure = reloadRowAtIndexPathClosure {
-                        reloadRowAtIndexPathClosure(indexPath)
-                    }
-                    else {
-                        tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
-                    }
-                }
-            }
-            .didMoveEntity { [unowned tableView] entity, indexPath, newIndexPath in
-                if !reloadData {
-                    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: rowAnimation)
-                    tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: rowAnimation)
+            .didInsertSection { sectionInfo, sectionIndex in
+                if !reloadData {
+                    insertedSectionIndexes.addIndex(sectionIndex)
+                }
+            }
+            .didDeleteSection { sectionInfo, sectionIndex in
+                if !reloadData {
+                    deletedSectionIndexes.addIndex(sectionIndex)
+                    deletedItemIndexPaths = deletedItemIndexPaths.filter { $0.section != sectionIndex }
+                    updatedItemIndexPaths = updatedItemIndexPaths.filter { $0.section != sectionIndex }
+                }
+            }
+            .didUpdateSection { sectionInfo, sectionIndex in
+                if !reloadData {
+                    updatedSectionIndexes.addIndex(sectionIndex)
+                }
+            }
+            .didInsertEntity { entity, newIndexPath in
+                if !reloadData {
+                    if !insertedSectionIndexes.containsIndex(newIndexPath.section) {
+                        insertedItemIndexPaths.append(newIndexPath)
+                    }
+                }
+            }
+            .didDeleteEntity { entity, indexPath in
+                if !reloadData {
+                    if !deletedSectionIndexes.containsIndex(indexPath.section) {
+                        deletedItemIndexPaths.append(indexPath)
+                    }
+                }
+            }
+            .didUpdateEntity { entity, indexPath in
+                if !reloadData {
+                    if !deletedSectionIndexes.containsIndex(indexPath.section) && find(deletedItemIndexPaths, indexPath) == nil && find(updatedItemIndexPaths, indexPath) == nil {
+                        updatedItemIndexPaths.append(indexPath)
+                    }
+                }
+            }
+            .didMoveEntity { entity, indexPath, newIndexPath in
+                if !reloadData {
+                    if !deletedSectionIndexes.containsIndex(indexPath.section) {
+                        deletedItemIndexPaths.append(indexPath)
+                    }
+                    
+                    if !insertedSectionIndexes.containsIndex(newIndexPath.section) {
+                        insertedItemIndexPaths.append(newIndexPath)
+                    }
                 }
             }
             .didChangeContent { [unowned tableView] in

                }
            }
            .didDeleteSection { sectionInfo, sectionIndex in
                if !reloadData {
                    deletedSectionIndexes.addIndex(sectionIndex)
                }
            }
            .didUpdateSection { sectionInfo, sectionIndex in
                if !reloadData {

                            }
                    })
                }
            }
        
        return self
    }
