     // Try to perform fetch request
     do {
       try fetchedResultsController.performFetch()
-    } catch {
-      
-    }
-    
-    // Return NSFetchedResultsController
-    return fetchedResultsController as? NSFetchedResultsController<T>
-  }
-  
-  /**
-   Fetch all objects with predicate in context
-   
-   - parameter withPredicate: predicate for search
-   - parameter sortBy: Column name for sorting
-   - parameter ascending: sorting order
-   - parameter inContext: context for search
-   - parameter delegate: NSFetchedResultsControllerDelegate
-   */
+      return fetchedResultsController
+      
+    } catch {
+      if CoreDuck.printErrors {
+        print("⚠️ failed to fetch request for " + entityName)
+      }
+      return nil
+    }
+  }
+  
+  /// Fetch all objects with predicate in context
+  ///
+  /// - Parameters:
+  ///   - predicate: NSPredicate for search
+  ///   - sortedBy: column name to sort by
+  ///   - ascending: direction to sort by
+  ///   - delegate: NSFetchedResultsControllerDelegate
+  ///   - context: NSManagedObjectContext to fetch request
+  /// - Returns: NSFetchedResultsController
   @available(OSX 10.12, *)
-  static func fetchAll<T>(withPredicate predicate: NSPredicate, sortBy: String, ascending: Bool, inContext context: NSManagedObjectContext, delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController<T>? {
-    
-    // Initialize Fetch Request
-    let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: self.entityName)
-    
-    // Add Sort Descriptors
-    let sortDescriptor = NSSortDescriptor(key: sortBy, ascending: ascending)
+  static func fetchAll<T: NSManagedObject>(with predicate: NSPredicate, sortedBy: String, ascending: Bool, delegate: NSFetchedResultsControllerDelegate, in context: NSManagedObjectContext = NSManagedObjectContext.mainContext) -> NSFetchedResultsController<T>? {
+    let request: NSFetchRequest<T> = NSFetchRequest(entityName: entityName)
+    
+    // Sort Descriptors
+    let sortDescriptor = NSSortDescriptor(key: sortedBy, ascending: ascending)
     request.sortDescriptors = [sortDescriptor]
     
     // Add Predicate

    do {
      let results = try context.fetch(request)
      let objects = results as NSArray
      if let first = objects.firstObject as? [String: Any] {
        return first[receiverName] as? NSNumber
      }
    } catch {
      
    }
    
    return nil
  }
}

  
  // MARK: - Variables
  
  /// Name of NSManagedObject entity
  static var entityName: String {
    return String(describing: self)
  }
  
  // MARK: - Helpers
  
  /// New NSManagedObject in context
  ///
  /// - Parameter context: context for object
  /// - Returns: new object in context
  static func new<T: NSManagedObject>(in context: NSManagedObjectContext) -> T? {
    return NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) as? T
  }
  
  /// Move NSManagedObject to another context
  ///
  /// - Parameter context: context to move
  /// - Returns: object in new context
  func inContext<T: NSManagedObject>(_ context: NSManagedObjectContext) -> T? {
    if objectID.isTemporaryID {
      do {
        try managedObjectContext?.obtainPermanentIDs(for: [self])
        
      } catch {
        return nil
      }
    }
    
    do {
      return try context.existingObject(with: objectID) as? T
      
    } catch {
      return nil
    }
  }
  
  /// Truncate all data from Entity in context
  static func deleteAllObjects() {
    let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: entityName)
    
    NSManagedObjectContext.saveWithBlock({ localContext in
      do {
        let result = try localContext.fetch(request)
        
