         }
     }
 
-    func removeItem(item:AnyObject, atIndex index:Int) {
+    func removeItemAtIndex(index:Int) {
         mainThread {
             if index < self.items.count {
                 self.items.removeAtIndex(index)
                 self.removeItemsAtIndexPaths([index])
             } else {
                 NSLog("index out of bounds: %d", index)
+            }
+        }
+    }
+    
+    func moveItemFromIndex(fromIndex:Int, toIndex: Int) {
+        mainThread {
+            if fromIndex < self.items.count && toIndex < self.items.count {
+                if fromIndex == toIndex {
+                    return
+                }
+                if let item = self.itemForIndex(fromIndex) {
+                    self.items.removeAtIndex(fromIndex)
+                    self.items.insert(item, atIndex: toIndex)
+                    self.moveItemAtIndexPath(fromIndex, toIndex: toIndex)
+                }
+            }
+        }
+    }
+    
+    func moveUpdatedItem(updatedItem:AnyObject, toIndex: Int) {
+        mainThread {
+            if toIndex < self.items.count {
+                if let fromIndex = self.indexForItem(updatedItem) {
+                    if fromIndex == toIndex {
+                        return
+                    }
+                    self.items.removeAtIndex(fromIndex)
+                    self.items.insert(updatedItem, atIndex: toIndex)
+                    self.moveItemAtIndexPath(fromIndex, toIndex: toIndex)
+                }
+            }
+        }
+    }
+    
+    func moveUpdatedItem(updatedItem:AnyObject, fromIndex: Int, toIndex: Int) {
+        if fromIndex == toIndex {
+            return
+        }
+        mainThread {
+            if fromIndex < self.items.count && toIndex < self.items.count {
+                self.items.removeAtIndex(fromIndex)
+                self.items.insert(updatedItem, atIndex: toIndex)
+                self.moveItemAtIndexPath(fromIndex, toIndex: toIndex)
             }
         }
     }

        self.tableView?.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: self.rowAnimation)
    }
    
    private func removeItemsAtIndexPaths(indexes:[Int]) {
        let indexPaths = self.indexPathsForIndexes(indexes)
        self.collectionView?.deleteItemsAtIndexPaths(indexPaths)

        }
    }

    func removeItem(item:AnyObject) {
        mainThread {
            if let index = self.indexForItem(item) {
