         NSNotificationCenter.defaultCenter().removeObserver(self, name: NSManagedObjectContextDidSaveNotification, object: self.privateQueueManagedObjectContext)
     }
     
-    init(persistentStoreCoordinator: NSPersistentStoreCoordinator, managedObjectContextConcurrencyType: NSManagedObjectContextConcurrencyType, serverURL: NSURL, entitiesByResourcePath: [String: NSEntityDescription], prettyPrintJSON: Bool?, resourceIDAttributeName: String?, dateCachedAttributeName: String?, searchPath: String?) {
-        
-        // set required values
+    public init(persistentStoreCoordinator: NSPersistentStoreCoordinator,
+        managedObjectContextConcurrencyType: NSManagedObjectContextConcurrencyType = .MainQueueConcurrencyType,
+        serverURL: NSURL,
+        entitiesByResourcePath: [String: NSEntityDescription],
+        prettyPrintJSON: Bool = false,
+        resourceIDAttributeName: String = "id",
+        dateCachedAttributeName: String?,
+        searchPath: String?) {
+        
         self.serverURL = serverURL
         self.entitiesByResourcePath = entitiesByResourcePath
-        
-        // set optional values
         self.dateCachedAttributeName = dateCachedAttributeName
         self.searchPath = searchPath
-        
-        // set values that have defaults
-        if prettyPrintJSON != nil {
-            
-            self.prettyPrintJSON = prettyPrintJSON!
-        }
-        if resourceIDAttributeName != nil {
-            
-            self.resourceIDAttributeName = resourceIDAttributeName!
-        }
-        
-        // setup contexts
-        
+        self.prettyPrintJSON = prettyPrintJSON
+        self.resourceIDAttributeName = resourceIDAttributeName
+        
+        // setup managed object contexts
         self.managedObjectContext = NSManagedObjectContext(concurrencyType: managedObjectContextConcurrencyType)
         self.managedObjectContext.undoManager = nil
         self.managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator

    
    // MARK: - Requests
    
    /** Performs a search request on the server. The supplied fetch request's predicate must be a NSComparisonPredicate. */
    public func performSearch(fetchRequest: NSFetchRequest, URLSession: NSURLSession, completionBlock: ((error: NSError?, results: [NSManagedObject]?) -> Void)) -> NSURLSessionDataTask {
        
        // build JSON request from fetch request

    public let dateCachedAttributeName: String?
    
    /** The name of the Integer attribute that holds that resource identifier. */
    public let resourceIDAttributeName: String
    
    /** The path that the NetworkObjects server uses for search requests. If not specified, doing a search request will produce an error. */
    public let searchPath: String?
    
    /** This setting determines whether JSON requests made to the server will contain whitespace or not. */
    public let prettyPrintJSON: Bool
    
    /** The URL of the NetworkObjects server that this client will connect to. */
    public let serverURL: NSURL
