         context.deleteObject(self)
     }
 
-    private class func fetchRequest(predicate: NSPredicate, context: NSManagedObjectContext) -> NSFetchRequest {
+    private class func fetchRequest(predicate: NSPredicate, sortDescriptors: [NSSortDescriptor]?, context: NSManagedObjectContext) -> NSFetchRequest {
         let request = NSFetchRequest()
         request.entity = NSEntityDescription.entityForName(self.entityName, inManagedObjectContext: context)
         request.predicate = predicate
+        request.sortDescriptors = sortDescriptors
         return request
     }
 
-    public class func find(predicate: NSPredicate, context: NSManagedObjectContext = CoreDataManager.sharedInstance.mainContext) -> [NSManagedObject] {
-        let request = self.fetchRequest(predicate, context: context)
+    public class func find(predicate: NSPredicate, sortDescriptors: [NSSortDescriptor]? = nil, context: NSManagedObjectContext = CoreDataManager.sharedInstance.mainContext) -> [NSManagedObject] {
+        let request = self.fetchRequest(predicate, sortDescriptors: sortDescriptors, context: context)
         if let objects = context.executeFetchRequest(request, error: nil) {
             return objects as [NSManagedObject]
         } else {
             return []
         }
     }
-
-    public class func findFirst(predicate: NSPredicate, context: NSManagedObjectContext = CoreDataManager.sharedInstance.mainContext) -> NSManagedObject? {
-        let request = self.fetchRequest(predicate, context: context)
+    
+    public class func findAll(sortDescriptors: [NSSortDescriptor]? = nil, context: NSManagedObjectContext = CoreDataManager.sharedInstance.mainContext) -> [NSManagedObject] {
+        let predicate = NSPredicate(value: true)
+        return self.find(predicate, sortDescriptors: sortDescriptors, context: context)
+    }
+    
+    public class func findFirst(predicate: NSPredicate, sortDescriptors: [NSSortDescriptor]? = nil, context: NSManagedObjectContext = CoreDataManager.sharedInstance.mainContext) -> NSManagedObject? {
+        let request = self.fetchRequest(predicate, sortDescriptors: sortDescriptors, context: context)
         request.fetchLimit = 1
         if let objects = context.executeFetchRequest(request, error: nil) {
             return objects.first as NSManagedObject?

            #endif
            return error
        }

        return nil
    }

    public func saveWithBlock(block: (Void)->(Void)) {
        self.performBlockAndWait({
            block()
            if let error = self._save() {
                #if DEBUG
#endif
            }
        })
    }

    public func saveAsynchronouslyWithBlock(block: (Void)->(Void)){
            self.performBlock({
                block()
                if let error = self._save() {
                } else {
                }
            })
    }
    
}

extension NSManagedObjectContext {
    
    private func _save() -> NSError? {
        
        if !self.hasChanges {
            return nil
        }
        
        var error: NSError? = nil
        if (!self.save(&error)) {
            #if DEBUG
