 
 class CoreDataController: NSObject {
 
-    fileprivate static let singleton = CoreDataController()
-    fileprivate var logger: LogController?
+    private var modelName: String
+    private var logger: LogController
+
+    init(_ modelName: String, _ logger: LogController) {
+        self.logger = logger
+        self.modelName = modelName
+        super.init()
+    }
 
     lazy var persistentContainer: NSPersistentContainer = {
-        let container = NSPersistentContainer(name: "Dough")
-        self.logger?.logDebug(message: String(format: "[%@] About to load persistent store.", instanceType(self)))
+        let container = NSPersistentContainer(name: modelName)
+        self.logger.logDebug(message: String(format: "[%@] About to load persistent store.", instanceType(self)))
         container.loadPersistentStores(completionHandler: { (storeDescription, error) in
             if let error = error as NSError? {
-                self.logger?.logError(message: String(format: "[%@] Failed to load persistent store.", instanceType(self)), error: error)
+                self.logger.logError(message: String(format: "[%@] Failed to load persistent store.", instanceType(self)), error: error)
             }
         })
         return container
     }()
-
-    class func setLogger(logger: LogController) {
-        singleton.logger = logger
-    }
 
 }
 
 // MARK: Access
 extension CoreDataController {
 
-    class func perform(block: ((NSManagedObjectContext) -> Void)) {
-        let context = singleton.persistentContainer.newBackgroundContext()
-        singleton.logger?.logDebug(message: String(format: "[%@] Vending new context <%@>.", classType(self), context))
+    func perform(block: ((NSManagedObjectContext) -> Void)) {
+        let context = persistentContainer.newBackgroundContext()
+        logger.logDebug(message: String(format: "[%@] Vending new context <%@>.", instanceType(self), context))
         block(context)
     }
 
-    class func fetch<T>(_ request: NSFetchRequest<T>, context: NSManagedObjectContext) -> [T] {
+    func fetch<T>(_ request: NSFetchRequest<T>, context: NSManagedObjectContext) -> [T] {
         var results = [T]()
         do {
             results.append(contentsOf: try context.fetch(request))
         } catch {
-          let message = String(format: "[%@] Error executing fetch request <%@> on context <%@>.", classType(self), request, context)
-            singleton.logger?.logError(message: message, error: error)
+          let message = String(format: "[%@] Error executing fetch request <%@> on context <%@>.", instanceType(self), request, context)
+            logger.logError(message: message, error: error)
         }
         return results
     }
 
-    class func exportData() -> Data {
+    func exportData() -> Data {
         let applicationSupportDirectory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! as NSString
 
         let sqlitePath = applicationSupportDirectory.appendingPathComponent(String(format: "%@.sqlite", Bundle.getAppName()))

            let applicationSupportDirectory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! as NSString
            let path = applicationSupportDirectory.appendingPathComponent($0.key)
            if !$0.value.write(toFile: path, atomically: true) {
                singleton.logger?.logWarning(message: String(format: "[%@] Failed to write imported data to %@.", classType(self), $0.key))
            }
        }


        var fileData = [String: NSData]()
        [ sqlitePath, sqliteWALPath, sqliteSHMPath ].forEach {
            guard let data = NSData(contentsOfFile: $0) else {
                logger.logWarning(message: String(format: "[%@] No data read from %@.", instanceType(self), $0))
                return
            }

