You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/02/16 14:15:49 UTC

[57/75] usergrid git commit: Major Updates. See commit details.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridRequestManager.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridRequestManager.swift b/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridRequestManager.swift
deleted file mode 100644
index ccd41e5..0000000
--- a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridRequestManager.swift
+++ /dev/null
@@ -1,156 +0,0 @@
-//
-//  UsergridRequestManager.swift
-//  UsergridSDK
-//
-//  Created by Robert Walsh on 9/22/15.
-//
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  The ASF licenses this file to You
- * under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- *
- */
-
-import Foundation
-
-final class UsergridRequestManager {
-
-    unowned let client: UsergridClient
-
-    let session: NSURLSession
-
-    var sessionDelegate : UsergridSessionDelegate {
-        return session.delegate as! UsergridSessionDelegate
-    }
-
-    init(client:UsergridClient) {
-        self.client = client
-
-        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
-
-        #if os(tvOS)
-        config.HTTPAdditionalHeaders = ["User-Agent": "usergrid-tvOS/v\(UsergridSDKVersion)"]
-        #elseif os(iOS)
-        config.HTTPAdditionalHeaders = ["User-Agent": "usergrid-ios/v\(UsergridSDKVersion)"]
-        #elseif os(watchOS)
-        config.HTTPAdditionalHeaders = ["User-Agent": "usergrid-watchOS/v\(UsergridSDKVersion)"]
-        #elseif os(OSX)
-        config.HTTPAdditionalHeaders = ["User-Agent": "usergrid-osx/v\(UsergridSDKVersion)"]
-        #endif
-
-        self.session = NSURLSession(configuration:  config,
-                                    delegate:       UsergridSessionDelegate(),
-                                    delegateQueue:  NSOperationQueue.mainQueue())
-    }
-
-    deinit {
-        session.invalidateAndCancel()
-    }
-
-    func performRequest(request:UsergridRequest, completion:UsergridResponseCompletion?) {
-        session.dataTaskWithRequest(request.buildNSURLRequest()) { [weak self] (data, response, error) -> Void in
-            completion?(response: UsergridResponse(client:self?.client, data: data, response: response as? NSHTTPURLResponse, error: error))
-        }.resume()
-    }
-}
-
-
-// MARK: - Authentication -
-extension UsergridRequestManager {
-
-    static func getTokenAndExpiryFromResponseJSON(jsonDict:[String:AnyObject]) -> (String?,NSDate?) {
-        var token: String? = nil
-        var expiry: NSDate? = nil
-        if let accessToken = jsonDict["access_token"] as? String {
-            token = accessToken
-        }
-        if let expiresIn = jsonDict["expires_in"] as? Int {
-            let expiresInAdjusted = expiresIn - 5000
-            expiry = NSDate(timeIntervalSinceNow: Double(expiresInAdjusted))
-        }
-        return (token,expiry)
-    }
-
-    func performUserAuthRequest(userAuth:UsergridUserAuth, request:UsergridRequest, completion:UsergridUserAuthCompletionBlock?) {
-        session.dataTaskWithRequest(request.buildNSURLRequest()) { (data, response, error) -> Void in
-            let dataAsJSON = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
-            if let jsonDict = dataAsJSON as? [String:AnyObject] {
-                let tokenAndExpiry = UsergridRequestManager.getTokenAndExpiryFromResponseJSON(jsonDict)
-                userAuth.accessToken = tokenAndExpiry.0
-                userAuth.expiry = tokenAndExpiry.1
-
-                var user: UsergridUser?
-                if let userDict = jsonDict[UsergridUser.USER_ENTITY_TYPE] as? [String:AnyObject] {
-                    if let createdUser = UsergridEntity.entity(jsonDict: userDict) as? UsergridUser {
-                        createdUser.auth = userAuth
-                        user = createdUser
-                    }
-                }
-                if let createdUser = user {
-                    completion?(auth: userAuth, user:createdUser, error: nil)
-                } else {
-                    let error = UsergridResponseError(jsonDictionary: jsonDict) ?? UsergridResponseError(errorName: "Auth Failed.", errorDescription: "Error Description: \(error?.localizedDescription).")
-                    completion?(auth: userAuth, user:nil, error:error)
-                }
-            } else {
-                let error = UsergridResponseError(errorName: "Auth Failed.", errorDescription: "Error Description: \(error?.localizedDescription).")
-                completion?(auth: userAuth, user:nil, error: error)
-            }
-        }.resume()
-    }
-
-    func performAppAuthRequest(appAuth: UsergridAppAuth, request: UsergridRequest, completion: UsergridAppAuthCompletionBlock?) {
-        session.dataTaskWithRequest(request.buildNSURLRequest()) { (data, response, error) -> Void in
-            let dataAsJSON = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
-            if let jsonDict = dataAsJSON as? [String:AnyObject] {
-                let tokenAndExpiry = UsergridRequestManager.getTokenAndExpiryFromResponseJSON(jsonDict)
-                appAuth.accessToken = tokenAndExpiry.0
-                appAuth.expiry = tokenAndExpiry.1
-                completion?(auth: appAuth, error: nil)
-            } else {
-                let error = UsergridResponseError(errorName: "Auth Failed.", errorDescription: "Error Description: \(error?.localizedDescription).")
-                completion?(auth: nil, error: error)
-            }
-        }.resume()
-    }
-}
-
-// MARK: - Asset Management -
-extension UsergridRequestManager {
-
-    func performAssetDownload(contentType:String, usergridRequest:UsergridRequest, progress: UsergridAssetRequestProgress? = nil, completion:UsergridAssetDownloadCompletion? = nil) {
-        let downloadTask = session.downloadTaskWithRequest(usergridRequest.buildNSURLRequest())
-        let requestWrapper = UsergridAssetRequestWrapper(session: self.session, sessionTask: downloadTask, progress: progress)  { (request) -> Void in
-            if let assetData = request.responseData where assetData.length > 0 {
-                let asset = UsergridAsset(data: assetData, contentType: contentType)
-                completion?(asset: asset, error:nil)
-            } else {
-                completion?(asset: nil, error: "Downloading asset failed.  No data was recieved.")
-            }
-        }
-        self.sessionDelegate.addRequestDelegate(requestWrapper.sessionTask, requestWrapper:requestWrapper)
-        requestWrapper.sessionTask.resume()
-    }
-
-    func performAssetUpload(usergridRequest:UsergridAssetUploadRequest, progress:UsergridAssetRequestProgress? = nil, completion: UsergridAssetUploadCompletion? = nil) {
-        let uploadTask = session.uploadTaskWithRequest(usergridRequest.buildNSURLRequest(), fromData: usergridRequest.multiPartHTTPBody)
-        let requestWrapper = UsergridAssetRequestWrapper(session: self.session, sessionTask: uploadTask, progress: progress)  { [weak self] (request) -> Void in
-            completion?(response: UsergridResponse(client: self?.client, data: request.responseData, response: request.response as? NSHTTPURLResponse, error: request.error),asset:usergridRequest.asset,error:nil)
-        }
-        self.sessionDelegate.addRequestDelegate(requestWrapper.sessionTask, requestWrapper:requestWrapper)
-        requestWrapper.sessionTask.resume()
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponse.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponse.swift b/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponse.swift
deleted file mode 100644
index 012c82f..0000000
--- a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponse.swift
+++ /dev/null
@@ -1,203 +0,0 @@
-//
-//  UsergridResponse.swift
-//  UsergridSDK
-//
-//  Created by Robert Walsh on 9/2/15.
-//
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  The ASF licenses this file to You
- * under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- *
- */
-
-import Foundation
-
-/// The completion block used in for most `UsergridClient` requests.
-public typealias UsergridResponseCompletion = (response: UsergridResponse) -> Void
-
-/**
-`UsergridResponse` is the core class that handles both successful and unsuccessful HTTP responses from Usergrid. 
-
-If a request is successful, any entities returned in the response will be automatically parsed into `UsergridEntity` objects and pushed to the `entities` property.
-
-If a request fails, the `errorName` and `errorDescription` will contain information about the problem encountered.
-*/
-public class UsergridResponse: NSObject {
-
-    // MARK: - Instance Properties -
-
-    /// The client that was responsible for the request.
-    public weak var client: UsergridClient?
-
-    /// The raw response JSON.
-    internal(set) public var responseJSON: [String:AnyObject]?
-
-    /// The query used on the request.
-    internal(set) public var query: UsergridQuery?
-
-    /// The cursor from the response.
-    internal(set) public var cursor: String?
-
-    /// The entities created from the response JSON.
-    internal(set) public var entities: [UsergridEntity]?
-
-    /// The response headers.
-    internal(set) public var headers: [String:String]?
-
-    /// The response status code.
-    internal(set) public var statusCode: Int?
-
-    /// The error object containing error information if one occurred.
-    internal(set) public var error: UsergridResponseError?
-
-    /// Returns true if the HTTP status code from the response is less than 400.
-    public var ok : Bool {
-        var isOk = false
-        if let statusCode = self.statusCode {
-            isOk = (statusCode < 400)
-        }
-        return isOk
-    }
-
-    /// The count of `entities`.
-    public var count: Int { return self.entities?.count ?? 0 }
-
-    /// The first entity in `entities`.
-    public var first: UsergridEntity? { return self.entities?.first }
-
-    /// The last entity in `entities`.
-    public var last: UsergridEntity? { return self.entities?.last }
-
-    /// The first entity in `entities`.
-    public var entity: UsergridEntity? { return self.first }
-
-    /// The `UsergridUser` entity.
-    public var user: UsergridUser? { return self.entities?.first as? UsergridUser }
-
-    /// An array of `UsergridUser` entities.
-    public var users: [UsergridUser]? { return self.entities as? [UsergridUser] }
-
-    /// Does the response have a cursor.
-    public var hasNextPage: Bool { return self.cursor != nil }
-
-    /// The string value.
-    public var stringValue : String? {
-        if let responseJSON = self.responseJSON {
-            return NSString(data: try! NSJSONSerialization.dataWithJSONObject(responseJSON, options: .PrettyPrinted), encoding: NSASCIIStringEncoding) as? String
-        } else {
-            return error?.description
-        }
-    }
-
-    /// The description.
-    public override var description : String {
-        return "Response Description: \(stringValue)."
-    }
-
-    /// The debug description.
-    public override var debugDescription : String {
-        return "Properties of Entity: \(stringValue)."
-    }
-
-    // MARK: - Initialization -
-
-    /**
-    Designated initializer for `UsergridResponse` objects that contain errors.
-    
-    These types of responses are usually created because request conditions are not met.
-
-    - parameter client:           The client responsible for the request.
-    - parameter errorName:        The error name.
-    - parameter errorDescription: The error description.
-
-    - returns: A new instance of `UsergridResponse`.
-    */
-    public init(client: UsergridClient?, errorName: String, errorDescription: String) {
-        self.client = client
-        self.error = UsergridResponseError(errorName: errorName, errorDescription: errorDescription, exception: nil)
-    }
-
-    /**
-    Designated initializer for `UsergridResponse` objects finished but still may contain errors.
-
-    - parameter client:   The client responsible for the request.
-    - parameter data:     The response data.
-    - parameter response: The `NSHTTPURLResponse` object.
-    - parameter error:    The `NSError` object.
-    - parameter query:    The query when making the request.
-
-    - returns: A new instance of `UsergridResponse`.
-    */
-    public init(client:UsergridClient?, data:NSData?, response:NSHTTPURLResponse?, error:NSError?, query:UsergridQuery? = nil) {
-        self.client = client
-        self.statusCode = response?.statusCode
-        self.headers = response?.allHeaderFields as? [String:String]
-
-        if let sessionError = error {
-            self.error = UsergridResponseError(errorName: sessionError.domain, errorDescription: sessionError.localizedDescription)
-        }
-
-        if let responseQuery = query {
-            self.query = responseQuery.copy() as? UsergridQuery
-        }
-
-        if let jsonData = data {
-            do {
-                let dataAsJSON = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)
-                if let jsonDict = dataAsJSON as? [String:AnyObject] {
-                    self.responseJSON = jsonDict
-                    if let responseError = UsergridResponseError(jsonDictionary: jsonDict) {
-                        self.error = responseError
-                    } else {
-                        if let entitiesJSONArray = jsonDict[UsergridResponse.ENTITIES] as? [[String:AnyObject]] where entitiesJSONArray.count > 0 {
-                            self.entities = UsergridEntity.entities(jsonArray: entitiesJSONArray)
-                        }
-                        if let cursor = jsonDict[UsergridResponse.CURSOR] as? String where !cursor.isEmpty {
-                            self.cursor = cursor
-                        }
-                    }
-                }
-            } catch {
-                print(error)
-            }
-        }
-    }
-
-    // MARK: - Instance Methods -
-
-    /**
-    Attempts to load the next page of `UsergridEntity` objects. 
-    
-    This requires a `cursor` to be valid as well as a `path` key within the response JSON.
-
-    - parameter completion: The completion block that is called once the request for the next page has finished.
-    */
-    public func loadNextPage(completion: UsergridResponseCompletion) {
-        if self.hasNextPage, let type = (self.responseJSON?["path"] as? NSString)?.lastPathComponent {
-            if let query = self.query?.copy() as? UsergridQuery {
-                self.client?.GET(type, query: query.cursor(self.cursor), completion:completion)
-            } else {
-                self.client?.GET(type, query: UsergridQuery(type).cursor(self.cursor), completion:completion)
-            }
-        } else {
-            completion(response: UsergridResponse(client: self.client, errorName: "No next page.", errorDescription: "No next page was found."))
-        }
-    }
-
-    static let CURSOR = "cursor"
-    static let ENTITIES = "entities"
-}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponseError.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponseError.swift b/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponseError.swift
deleted file mode 100644
index eda8a30..0000000
--- a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridResponseError.swift
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-//  UsergridResponseError.swift
-//  UsergridSDK
-//
-//  Created by Robert Walsh on 1/8/16.
-//
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  The ASF licenses this file to You
- * under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- *
- */
-
-import Foundation
-
-/// A standard error object that contains details about a request failure.
-public class UsergridResponseError: NSObject {
-
-    // MARK: - Instance Properties -
-
-    /// The error's name.
-    public let errorName : String
-
-    /// The error's description.
-    public let errorDescription: String
-
-    /// The exception.
-    public var exception: String?
-
-    /// The description.
-    public override var description : String {
-        return "Error Name: \(errorName).  Error Description: \(errorDescription).  Exception: \(exception)."
-    }
-
-    /// The debug description.
-    public override var debugDescription : String {
-        return "Error Name: \(errorName).  Error Description: \(errorDescription).  Exception: \(exception)."
-    }
-
-    // MARK: - Initialization -
-
-    /**
-    Designated initializer for `UsergridResponseError`.
-
-    - parameter errorName:        The error's name.
-    - parameter errorDescription: The error's description.
-    - parameter exception:        The exception.
-
-    - returns: A new instance of `UsergridResponseError`
-    */
-    public init(errorName:String, errorDescription:String, exception:String? = nil) {
-        self.errorName = errorName
-        self.errorDescription = errorDescription
-        self.exception = exception
-    }
-
-    /**
-     Convenience initializer for `UsergridResponseError` that determines if the given `jsonDictionary` contains an error.
-
-     - parameter jsonDictionary: The JSON dictionary that may contain error information.
-
-     - returns: A new instance of `UsergridResponseError` if the JSON dictionary did indeed contain error information.
-     */
-    public convenience init?(jsonDictionary:[String:AnyObject]) {
-        if let errorName = jsonDictionary[USERGRID_ERROR] as? String,
-               errorDescription = jsonDictionary[USERGRID_ERROR_DESCRIPTION] as? String {
-            self.init(errorName:errorName,errorDescription:errorDescription,exception:jsonDictionary[USERGRID_EXCEPTION] as? String)
-        } else {
-            self.init(errorName:"",errorDescription:"")
-            return nil
-        }
-    }
-}
-
-let USERGRID_ERROR = "error"
-let USERGRID_ERROR_DESCRIPTION = "error_description"
-let USERGRID_EXCEPTION = "exception"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridSessionDelegate.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridSessionDelegate.swift b/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridSessionDelegate.swift
deleted file mode 100644
index cb36fb7..0000000
--- a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridSessionDelegate.swift
+++ /dev/null
@@ -1,90 +0,0 @@
-//
-//  UsergridSessionDelegate.swift
-//  UsergridSDK
-//
-//  Created by Robert Walsh on 9/30/15.
-//
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  The ASF licenses this file to You
- * under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- *
- */
-
-import Foundation
-
-final class UsergridSessionDelegate: NSObject {
-
-    private var requestDelegates: [Int:UsergridAssetRequestWrapper] = [:]
-
-    func addRequestDelegate(task:NSURLSessionTask,requestWrapper:UsergridAssetRequestWrapper) {
-        requestDelegates[task.taskIdentifier] = requestWrapper
-    }
-
-    func removeRequestDelegate(task:NSURLSessionTask) {
-        requestDelegates[task.taskIdentifier] = nil
-    }
-}
-
-extension UsergridSessionDelegate : NSURLSessionTaskDelegate {
-
-    func URLSession(session: NSURLSession, task: NSURLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
-        if let progressBlock = requestDelegates[task.taskIdentifier]?.progress {
-            progressBlock(bytesFinished:totalBytesSent, bytesExpected: totalBytesExpectedToSend)
-        }
-    }
-
-    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
-        if let requestWrapper = requestDelegates[task.taskIdentifier] {
-            requestWrapper.error = error
-            requestWrapper.completion(requestWrapper: requestWrapper)
-        }
-        self.removeRequestDelegate(task)
-    }
-}
-
-extension UsergridSessionDelegate : NSURLSessionDataDelegate {
-
-    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
-        if let requestWrapper = requestDelegates[dataTask.taskIdentifier] {
-            requestWrapper.response = response
-        }
-        completionHandler(NSURLSessionResponseDisposition.Allow)
-    }
-
-    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
-        if let requestWrapper = requestDelegates[dataTask.taskIdentifier] {
-            let mutableData = requestWrapper.responseData != nil ? NSMutableData(data: requestWrapper.responseData!) : NSMutableData()
-            mutableData.appendData(data)
-            requestWrapper.responseData = mutableData
-        }
-    }
-}
-
-extension UsergridSessionDelegate : NSURLSessionDownloadDelegate {
-
-    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
-        if let progressBlock = requestDelegates[downloadTask.taskIdentifier]?.progress {
-            progressBlock(bytesFinished:totalBytesWritten, bytesExpected: totalBytesExpectedToWrite)
-        }
-    }
-
-    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
-        if let requestWrapper = requestDelegates[downloadTask.taskIdentifier] {
-            requestWrapper.responseData = NSData(contentsOfURL: location)!
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridUser.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridUser.swift b/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridUser.swift
deleted file mode 100644
index b1eedcc..0000000
--- a/sdks/swift/Samples/Push/Pods/UsergridSDK/sdks/swift/Source/UsergridUser.swift
+++ /dev/null
@@ -1,441 +0,0 @@
-//
-//  User.swift
-//  UsergridSDK
-//
-//  Created by Robert Walsh on 7/21/15.
-//
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  The ASF licenses this file to You
- * under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- *
- */
-
-import Foundation
-
-/// The completion block used for checking email and/or username availablity for new `UsergridUser` objects.
-public typealias UsergridUserAvailabilityCompletion = (error: UsergridResponseError?, available:Bool) -> Void
-
-/// The completion block used for changing the password of `UsergridUser` objects.
-public typealias UsergridUserResetPasswordCompletion = (error: UsergridResponseError?, didSucceed:Bool) -> Void
-
-/**
-`UsergridUser` is a special subclass of `UsergridEntity` that supports functions and properties unique to users.
-*/
-public class UsergridUser : UsergridEntity {
-
-    static let USER_ENTITY_TYPE = "user"
-
-    // MARK: - Instance Properties -
-
-    /// The `UsergridUserAuth` object if this user was authenticated.
-    public var auth: UsergridUserAuth?
-
-    /** 
-    Property helper method for the `UsergridUser` objects `UsergridUserProperties.Name`.
-    
-    Unlike `UsergridEntity` objects, `UsergridUser`'s can change their name property which is why we provide a getter here.
-    */
-    override public var name: String? {
-        set(name) { self[UsergridUserProperties.Name.stringValue] = name }
-        get{ return super.name }
-    }
-
-    /// Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Username`.
-    public var username: String? {
-        set(username) { self[UsergridUserProperties.Username.stringValue] = username }
-        get { return self.getUserSpecificProperty(.Username) as? String }
-    }
-
-    /// Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Password`.
-    public var password: String? {
-        set(password) { self[UsergridUserProperties.Password.stringValue] = password }
-        get { return self.getUserSpecificProperty(.Password) as? String }
-    }
-
-    /// Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Email`.
-    public var email: String? {
-        set(email) { self[UsergridUserProperties.Email.stringValue] = email }
-        get { return self.getUserSpecificProperty(.Email) as? String }
-    }
-
-    /// Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Age`.
-    public var age: NSNumber? {
-        set(age) { self[UsergridUserProperties.Age.stringValue] = age }
-        get { return self.getUserSpecificProperty(.Age) as? NSNumber }
-    }
-
-    /// Property helper method to get the username or email of the `UsergridUser`.
-    public var usernameOrEmail: String? { return self.username ?? self.email }
-
-    /** 
-    Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Activated`.
-    
-    Indicates whether the user account has been activated or not.
-    */
-    public var activated: Bool {
-        set(activated) { self[UsergridUserProperties.Activated.stringValue] = activated }
-        get { return self.getUserSpecificProperty(.Activated) as? Bool ?? false }
-    }
-
-    /// Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Disabled`.
-    public var disabled: Bool {
-        set(disabled) { self[UsergridUserProperties.Disabled.stringValue] = disabled }
-        get { return self.getUserSpecificProperty(.Disabled) as? Bool ?? false }
-    }
-
-    /**
-    Property getter and setter helpers for the `UsergridUser` objects `UsergridUserProperties.Picture`.
-    
-    URL path to user’s profile picture. Defaults to Gravatar for email address.
-    */
-    public var picture: String? {
-        set(picture) { self[UsergridUserProperties.Picture.stringValue] = picture }
-        get { return self.getUserSpecificProperty(.Picture) as? String }
-    }
-
-    /// The UUID or username property value if found.
-    public var uuidOrUsername: String? { return self.uuid ?? self.username }
-
-    // MARK: - Initialization -
-
-    /**
-    Designated initializer for `UsergridUser` objects.
-
-    - parameter name: The name of the user.  Note this is different from the `username` property.
-
-    - returns: A new instance of `UsergridUser`.
-    */
-    public init(name:String? = nil) {
-        super.init(type: UsergridUser.USER_ENTITY_TYPE, name:name, propertyDict:nil)
-    }
-
-    /**
-     The required public initializer for `UsergridEntity` subclasses.
-
-     - parameter type:         The type associated with the `UsergridEntity` object.
-     - parameter name:         The optional name associated with the `UsergridEntity` object.
-     - parameter propertyDict: The optional property dictionary that the `UsergridEntity` object will start out with.
-
-     - returns: A new `UsergridUser` object.
-     */
-    required public init(type: String, name: String?, propertyDict: [String : AnyObject]?) {
-        super.init(type: type, name: name, propertyDict: propertyDict)
-    }
-
-    /**
-    Designated initializer for `UsergridUser` objects.
-
-    - parameter name:         The name of the user.  Note this is different from the `username` property.
-    - parameter propertyDict: The optional property dictionary that the `UsergridEntity` object will start out with.
-
-    - returns: A new instance of `UsergridUser`.
-    */
-    public init(name:String,propertyDict:[String:AnyObject]? = nil) {
-        super.init(type: UsergridUser.USER_ENTITY_TYPE, name:name, propertyDict:propertyDict)
-    }
-
-    /**
-     Convenience initializer for `UsergridUser` objects.
-
-     - parameter name:     The name of the user.  Note this is different from the `username` property.
-     - parameter email:    The user's email.
-     - parameter password: The optional user's password.
-
-     - returns: A new instance of `UsergridUser`.
-     */
-    public convenience init(name:String, email:String, password:String? = nil) {
-        self.init(name:name,email:email,username:nil,password:password)
-    }
-
-    /**
-     Convenience initializer for `UsergridUser` objects.
-
-     - parameter email:    The user's email.
-     - parameter password: The optional user's password.
-
-     - returns: A new instance of `UsergridUser`.
-     */
-    public convenience init(email:String, password:String? = nil) {
-        self.init(name:nil,email:email,username:nil,password:password)
-    }
-
-    /**
-     Convenience initializer for `UsergridUser` objects.
-
-     - parameter name:     The name of the user.  Note this is different from the `username` property.
-     - parameter username: The username of the user.
-     - parameter password: The optional user's password.
-
-     - returns: A new instance of `UsergridUser`.
-     */
-    public convenience init(name:String, username:String, password:String? = nil) {
-        self.init(name:name,email:nil,username:username,password:password)
-    }
-
-    /**
-     Convenience initializer for `UsergridUser` objects.
-
-     - parameter username: The username of the user.
-     - parameter password: The optional user's password.
-
-     - returns: A new instance of `UsergridUser`.
-     */
-    public convenience init(username:String, password:String? = nil) {
-        self.init(name:nil,email:nil,username:username,password:password)
-    }
-
-    /**
-     Convenience initializer for `UsergridUser` objects.
-
-     - parameter name:     The optional name of the user.  Note this is different from the `username` property.
-     - parameter email:    The optional user's email.
-     - parameter username: The optional username of the user.
-     - parameter password: The optional user's password.
-
-     - returns: A new instance of `UsergridUser`.
-     */
-    public convenience init(name:String?, email:String?, username:String?, password:String? = nil) {
-        self.init(name:name)
-        self.email = email
-        self.username = username
-        self.password = password
-    }
-
-    // MARK: - NSCoding -
-
-    /**
-    NSCoding protocol initializer.
-
-    - parameter aDecoder: The decoder.
-
-    - returns: A decoded `UsergridUser` object.
-    */
-    required public init?(coder aDecoder: NSCoder) {
-        self.auth = aDecoder.decodeObjectForKey("auth") as? UsergridUserAuth
-        super.init(coder: aDecoder)
-    }
-
-    /**
-     NSCoding protocol encoder.
-
-     - parameter aCoder: The encoder.
-     */
-    public override func encodeWithCoder(aCoder: NSCoder) {
-        aCoder.encodeObject(self.auth, forKey: "auth")
-        super.encodeWithCoder(aCoder)
-    }
-
-    // MARK: - Class Methods -
-
-    /**
-    Checks the given email and/or username availablity for new `UsergridUser` objects using the shared instance of `UsergridClient`.
-
-    - parameter email:      The optional email address.
-    - parameter username:   The optional username.
-    - parameter completion: The completion block.
-    */
-    public static func checkAvailable(email:String?, username:String?, completion:UsergridUserAvailabilityCompletion) {
-        self.checkAvailable(Usergrid.sharedInstance, email: email, username: username, completion: completion)
-    }
-
-    /**
-     Checks the given email and/or username availablity for new `UsergridUser` objects using with the given `UsergridClient`.
-
-     - parameter client:     The client to use for checking availability.
-     - parameter email:      The optional email address.
-     - parameter username:   The optional username.
-     - parameter completion: The completion block.
-     */
-    public static func checkAvailable(client: UsergridClient, email:String?, username:String?, completion:UsergridUserAvailabilityCompletion) {
-        let query = UsergridQuery(USER_ENTITY_TYPE)
-        if let emailValue = email {
-            query.eq(UsergridUserProperties.Email.stringValue, value: emailValue)
-        }
-        if let usernameValue = username {
-            query.or().eq(UsergridUserProperties.Username.stringValue, value: usernameValue)
-        }
-        client.GET(USER_ENTITY_TYPE, query: query) { (response) -> Void in
-            completion(error: response.error, available: response.entity == nil)
-        }
-    }
-
-    // MARK: - Instance Methods -
-
-    /**
-    Creates the user object in Usergrid if the user does not already exist with the shared instance of `UsergridClient`.
-
-    - parameter completion: The optional completion block.
-    */
-    public func create(completion: UsergridResponseCompletion? = nil) {
-        self.create(Usergrid.sharedInstance, completion: completion)
-    }
-
-    /**
-    Creates the user object in Usergrid if the user does not already exist with the given `UsergridClient`.
-
-    - parameter client:     The client to use for creation.
-    - parameter completion: The optional completion block.
-    */
-    public func create(client: UsergridClient, completion: UsergridResponseCompletion? = nil) {
-        client.POST(self,completion:completion)
-    }
-
-    /**
-    Authenticates the specified user using the provided username and password with the shared instance of `UsergridClient`.
-
-    While functionally similar to `UsergridClient.authenticateUser(auth)`, this method does not automatically assign this user to `UsergridClient.currentUser`:
-
-    - parameter username:   The username.
-    - parameter password:   The password.
-    - parameter completion: The optional completion block.
-    */
-    public func login(username:String, password:String, completion: UsergridUserAuthCompletionBlock? = nil) {
-        self.login(Usergrid.sharedInstance, username: username, password: password, completion: completion)
-    }
-
-    /**
-    Authenticates the specified user using the provided username and password.
-
-    While functionally similar to `UsergridClient.authenticateUser(auth)`, this method does not automatically assign this user to `UsergridClient.currentUser`:
-
-    - parameter client:     The client to use for login.
-    - parameter username:   The username.
-    - parameter password:   The password.
-    - parameter completion: The optional completion block.
-    */
-    public func login(client: UsergridClient, username:String, password:String, completion: UsergridUserAuthCompletionBlock? = nil) {
-        let userAuth = UsergridUserAuth(username: username, password: password)
-        client.authenticateUser(userAuth,setAsCurrentUser:false) { [weak self] (auth, user, error) -> Void in
-            self?.auth = userAuth
-            completion?(auth: userAuth, user: user, error: error)
-        }
-    }
-
-     /**
-     Changes the User's current password with the shared instance of `UsergridClient`.
-
-     - parameter old:        The old password.
-     - parameter new:        The new password.
-     - parameter completion: The optional completion block.
-     */
-    public func resetPassword(old:String, new:String, completion:UsergridUserResetPasswordCompletion? = nil) {
-        self.resetPassword(Usergrid.sharedInstance, old: old, new: new, completion: completion)
-    }
-
-    /**
-     Changes the User's current password with the shared instance of `UsergridClient`.
-
-     - parameter client:     The client to use for resetting the password.
-     - parameter old:        The old password.
-     - parameter new:        The new password.
-     - parameter completion: The optional completion block
-     */
-    public func resetPassword(client: UsergridClient, old:String, new:String, completion:UsergridUserResetPasswordCompletion? = nil) {
-        client.resetPassword(self, old: old, new: new, completion: completion)
-    }
-
-    /**
-     Attmepts to reauthenticate using the user's `UsergridUserAuth` instance property with the shared instance of `UsergridClient`.
-
-     - parameter completion: The optional completion block.
-     */
-    public func reauthenticate(completion: UsergridUserAuthCompletionBlock? = nil) {
-        self.reauthenticate(Usergrid.sharedInstance, completion: completion)
-    }
-
-    /**
-     Attmepts to reauthenticate using the user's `UsergridUserAuth` instance property.
-
-     - parameter client:     The client to use for reauthentication.
-     - parameter completion: The optional completion block.
-     */
-    public func reauthenticate(client: UsergridClient, completion: UsergridUserAuthCompletionBlock? = nil) {
-        if let userAuth = self.auth {
-            client.authenticateUser(userAuth, completion: completion)
-        } else {
-            let error = UsergridResponseError(errorName: "Invalid UsergridUserAuth.", errorDescription: "No UsergridUserAuth found on the UsergridUser.")
-            completion?(auth: nil, user: self, error: error)
-        }
-    }
-
-    /**
-    Invalidates the user token locally and remotely.
-
-    - parameter completion: The optional completion block.
-    */
-    public func logout(completion:UsergridResponseCompletion? = nil) {
-        self.logout(Usergrid.sharedInstance,completion:completion)
-    }
-
-    /**
-    Invalidates the user token locally and remotely.
-
-    - parameter client:     The client to use for logout.
-    - parameter completion: The optional completion block.
-    */
-    public func logout(client: UsergridClient, completion:UsergridResponseCompletion? = nil) {
-        if self === client.currentUser {
-            client.logoutCurrentUser(completion)
-        } else if let uuidOrUsername = self.uuidOrUsername, accessToken = self.auth?.accessToken {
-            client.logoutUser(uuidOrUsername, token: accessToken) { (response) in
-                self.auth = nil
-                completion?(response: response)
-            }
-        } else {
-            completion?(response: UsergridResponse(client:client, errorName:"Logout Failed.", errorDescription:"UUID or Access Token not found on UsergridUser object."))
-        }
-    }
-
-    private func getUserSpecificProperty(userProperty: UsergridUserProperties) -> AnyObject? {
-        var propertyValue: AnyObject? = super[userProperty.stringValue]
-        NSJSONReadingOptions.AllowFragments
-        switch userProperty {
-            case .Activated,.Disabled :
-                propertyValue = propertyValue?.boolValue
-            case .Age :
-                propertyValue = propertyValue?.integerValue
-            case .Name,.Username,.Password,.Email,.Picture :
-                break
-        }
-        return propertyValue
-    }
-
-    /**
-    Subscript for the `UsergridUser` class.
-
-    - Warning: When setting a properties value must be a valid JSON object.
-
-    - Example usage:
-    ```
-    let someName = usergridUser["name"]
-    
-    usergridUser["name"] = someName
-    ```
-    */
-    override public subscript(propertyName: String) -> AnyObject? {
-        get {
-            if let userProperty = UsergridUserProperties.fromString(propertyName) {
-                return self.getUserSpecificProperty(userProperty)
-            } else {
-                return super[propertyName]
-            }
-        }
-        set(propertyValue) {
-            super[propertyName] = propertyValue
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Push.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Push.xcodeproj/project.pbxproj b/sdks/swift/Samples/Push/Push.xcodeproj/project.pbxproj
index cbd1e3e..f786e4e 100644
--- a/sdks/swift/Samples/Push/Push.xcodeproj/project.pbxproj
+++ b/sdks/swift/Samples/Push/Push.xcodeproj/project.pbxproj
@@ -7,17 +7,91 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		634855231C726A3B005FE016 /* UsergridSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 634855161C726A2D005FE016 /* UsergridSDK.framework */; };
+		634855241C726A3B005FE016 /* UsergridSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 634855161C726A2D005FE016 /* UsergridSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		637A720E1C5BF8160056545A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637A72061C5BF8160056545A /* AppDelegate.swift */; };
 		637A720F1C5BF8160056545A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 637A72071C5BF8160056545A /* Assets.xcassets */; };
 		637A72101C5BF8160056545A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 637A72081C5BF8160056545A /* LaunchScreen.storyboard */; };
 		637A72111C5BF8160056545A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 637A720A1C5BF8160056545A /* Main.storyboard */; };
 		637A72131C5BF8160056545A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637A720D1C5BF8160056545A /* ViewController.swift */; };
 		637A72161C5C06270056545A /* UsergridManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637A72151C5C06270056545A /* UsergridManager.swift */; };
-		93F1FDA07B9F97BFB25A2B6A /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73F3E0733C90D8FB3A70AF1A /* Pods.framework */; };
 /* End PBXBuildFile section */
 
+/* Begin PBXContainerItemProxy section */
+		634855151C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 63AF0E881BBC38FB009D4196;
+			remoteInfo = "UsergridSDK iOS";
+		};
+		634855171C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 639B4BEB1C3DD6CF005E26E7;
+			remoteInfo = "UsergridSDK watchOS";
+		};
+		634855191C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 63EE610B1C406E1600AFC2CF;
+			remoteInfo = "UsergridSDK tvOS";
+		};
+		6348551B1C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 631920451C48436500F99E86;
+			remoteInfo = "UsergridSDK OSX";
+		};
+		6348551D1C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 6319204B1C49BC0700F99E86;
+			remoteInfo = UsergridSDK_TVOS_Tests;
+		};
+		6348551F1C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 630A219F1C49BFFC008BE87F;
+			remoteInfo = UsergridSDK_OSX_Tests;
+		};
+		634855211C726A2D005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 630A21B81C49C473008BE87F;
+			remoteInfo = UsergridSDK_iOS_Tests;
+		};
+		634855251C726A3B005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 63AF0E871BBC38FB009D4196;
+			remoteInfo = "UsergridSDK iOS";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		634855271C726A3B005FE016 /* Embed Frameworks */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				634855241C726A3B005FE016 /* UsergridSDK.framework in Embed Frameworks */,
+			);
+			name = "Embed Frameworks";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
 /* Begin PBXFileReference section */
-		40784BA539B3C7FC7074887B /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
+		6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = UsergridSDK.xcodeproj; path = ../../UsergridSDK.xcodeproj; sourceTree = "<group>"; };
 		637A71F01C5BF7B10056545A /* Push.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Push.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		637A72061C5BF8160056545A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		637A72071C5BF8160056545A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -26,8 +100,6 @@
 		637A720C1C5BF8160056545A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		637A720D1C5BF8160056545A /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
 		637A72151C5C06270056545A /* UsergridManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsergridManager.swift; sourceTree = "<group>"; };
-		73F3E0733C90D8FB3A70AF1A /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		9BB4D667087D6CF002BECEB1 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -35,37 +107,33 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				93F1FDA07B9F97BFB25A2B6A /* Pods.framework in Frameworks */,
+				634855231C726A3B005FE016 /* UsergridSDK.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		11B1DE4765D09F54EEAA5FB4 /* Pods */ = {
+		6348550C1C726A2D005FE016 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				40784BA539B3C7FC7074887B /* Pods.debug.xcconfig */,
-				9BB4D667087D6CF002BECEB1 /* Pods.release.xcconfig */,
+				634855161C726A2D005FE016 /* UsergridSDK.framework */,
+				634855181C726A2D005FE016 /* UsergridSDK.framework */,
+				6348551A1C726A2D005FE016 /* UsergridSDK.framework */,
+				6348551C1C726A2D005FE016 /* UsergridSDK.framework */,
+				6348551E1C726A2D005FE016 /* UsergridSDK_TVOS_Tests.xctest */,
+				634855201C726A2D005FE016 /* UsergridSDK_OSX_Tests.xctest */,
+				634855221C726A2D005FE016 /* UsergridSDK_iOS_Tests.xctest */,
 			);
-			name = Pods;
-			sourceTree = "<group>";
-		};
-		40B8DB4D5F8684F52D86AD13 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				73F3E0733C90D8FB3A70AF1A /* Pods.framework */,
-			);
-			name = Frameworks;
+			name = Products;
 			sourceTree = "<group>";
 		};
 		637A71E71C5BF7B10056545A = {
 			isa = PBXGroup;
 			children = (
+				6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */,
 				637A72051C5BF8160056545A /* Source */,
 				637A71F11C5BF7B10056545A /* Products */,
-				11B1DE4765D09F54EEAA5FB4 /* Pods */,
-				40B8DB4D5F8684F52D86AD13 /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -106,16 +174,15 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 637A72021C5BF7B10056545A /* Build configuration list for PBXNativeTarget "Push" */;
 			buildPhases = (
-				07DB92FBF16075B01449F26B /* Check Pods Manifest.lock */,
 				637A71EC1C5BF7B10056545A /* Sources */,
 				637A71ED1C5BF7B10056545A /* Frameworks */,
 				637A71EE1C5BF7B10056545A /* Resources */,
-				9A01B8F77A9D4469391D8826 /* Embed Pods Frameworks */,
-				EA12798F3DFFB01F69B53C53 /* Copy Pods Resources */,
+				634855271C726A3B005FE016 /* Embed Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
+				634855261C726A3B005FE016 /* PBXTargetDependency */,
 			);
 			name = Push;
 			productName = Push;
@@ -148,6 +215,12 @@
 			mainGroup = 637A71E71C5BF7B10056545A;
 			productRefGroup = 637A71F11C5BF7B10056545A /* Products */;
 			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = 6348550C1C726A2D005FE016 /* Products */;
+					ProjectRef = 6348550B1C726A2D005FE016 /* UsergridSDK.xcodeproj */;
+				},
+			);
 			projectRoot = "";
 			targets = (
 				637A71EF1C5BF7B10056545A /* Push */,
@@ -155,6 +228,58 @@
 		};
 /* End PBXProject section */
 
+/* Begin PBXReferenceProxy section */
+		634855161C726A2D005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855151C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855181C726A2D005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855171C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348551A1C726A2D005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855191C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348551C1C726A2D005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 6348551B1C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348551E1C726A2D005FE016 /* UsergridSDK_TVOS_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_TVOS_Tests.xctest;
+			remoteRef = 6348551D1C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855201C726A2D005FE016 /* UsergridSDK_OSX_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_OSX_Tests.xctest;
+			remoteRef = 6348551F1C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855221C726A2D005FE016 /* UsergridSDK_iOS_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_iOS_Tests.xctest;
+			remoteRef = 634855211C726A2D005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
 /* Begin PBXResourcesBuildPhase section */
 		637A71EE1C5BF7B10056545A /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
@@ -168,54 +293,6 @@
 		};
 /* End PBXResourcesBuildPhase section */
 
-/* Begin PBXShellScriptBuildPhase section */
-		07DB92FBF16075B01449F26B /* Check Pods Manifest.lock */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Check Pods Manifest.lock";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
-			showEnvVarsInLog = 0;
-		};
-		9A01B8F77A9D4469391D8826 /* Embed Pods Frameworks */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Embed Pods Frameworks";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-		EA12798F3DFFB01F69B53C53 /* Copy Pods Resources */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Copy Pods Resources";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-/* End PBXShellScriptBuildPhase section */
-
 /* Begin PBXSourcesBuildPhase section */
 		637A71EC1C5BF7B10056545A /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
@@ -229,6 +306,14 @@
 		};
 /* End PBXSourcesBuildPhase section */
 
+/* Begin PBXTargetDependency section */
+		634855261C726A3B005FE016 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "UsergridSDK iOS";
+			targetProxy = 634855251C726A3B005FE016 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
 /* Begin PBXVariantGroup section */
 		637A72081C5BF8160056545A /* LaunchScreen.storyboard */ = {
 			isa = PBXVariantGroup;
@@ -266,6 +351,7 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = dwarf;
@@ -310,6 +396,7 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -332,10 +419,10 @@
 		};
 		637A72031C5BF7B10056545A /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 40784BA539B3C7FC7074887B /* Pods.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				INFOPLIST_FILE = Source/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.usergrid.usergridpushsample;
@@ -346,11 +433,11 @@
 		};
 		637A72041C5BF7B10056545A /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 9BB4D667087D6CF002BECEB1 /* Pods.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				INFOPLIST_FILE = Source/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.usergrid.usergridpushsample;

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Push.xcworkspace/contents.xcworkspacedata
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Push.xcworkspace/contents.xcworkspacedata b/sdks/swift/Samples/Push/Push.xcworkspace/contents.xcworkspacedata
index d4ed8a6..268a2da 100644
--- a/sdks/swift/Samples/Push/Push.xcworkspace/contents.xcworkspacedata
+++ b/sdks/swift/Samples/Push/Push.xcworkspace/contents.xcworkspacedata
@@ -4,7 +4,4 @@
    <FileRef
       location = "group:Push.xcodeproj">
    </FileRef>
-   <FileRef
-      location = "group:Pods/Pods.xcodeproj">
-   </FileRef>
 </Workspace>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Push.xcworkspace/xcshareddata/Push.xcscmblueprint
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Push.xcworkspace/xcshareddata/Push.xcscmblueprint b/sdks/swift/Samples/Push/Push.xcworkspace/xcshareddata/Push.xcscmblueprint
deleted file mode 100644
index bec49ab..0000000
--- a/sdks/swift/Samples/Push/Push.xcworkspace/xcshareddata/Push.xcscmblueprint
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "E28DB29D4B8B9FB468FB340D2257B16682332D89",
-  "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
-
-  },
-  "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
-    "E28DB29D4B8B9FB468FB340D2257B16682332D89" : 0,
-    "AD57BFF635DD66DF5DF78257082332592EB51D31" : 0
-  },
-  "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "ADB99685-1C5E-4D1B-99F9-59253396C726",
-  "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
-    "E28DB29D4B8B9FB468FB340D2257B16682332D89" : "swift\/",
-    "AD57BFF635DD66DF5DF78257082332592EB51D31" : ".."
-  },
-  "DVTSourceControlWorkspaceBlueprintNameKey" : "Push",
-  "DVTSourceControlWorkspaceBlueprintVersion" : 204,
-  "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Samples\/Push\/Push.xcworkspace",
-  "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
-    {
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:RobertWalsh\/usergrid.git",
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "AD57BFF635DD66DF5DF78257082332592EB51D31"
-    },
-    {
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:RobertWalsh\/UsergridSDK.git",
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
-      "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "E28DB29D4B8B9FB468FB340D2257B16682332D89"
-    }
-  ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Push/Readme.md
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Push/Readme.md b/sdks/swift/Samples/Push/Readme.md
new file mode 100644
index 0000000..488509c
--- /dev/null
+++ b/sdks/swift/Samples/Push/Readme.md
@@ -0,0 +1,21 @@
+#Push
+
+## Running the Sample
+
+To run the sample app, simply open the `Push.xcworkspace` file in Xcode.
+
+Two targets in Xcode specific to this application will be available:
+
+- **Push Target**
+
+	This will run the iOS sample application.
+	
+##Configuring the Sample Apps
+
+Before running the sample applications you will need to configure each sample application. 
+
+Each sample application should include a source file named `UsergridManager.swift`.  This source file is used to contain interaction with the UsergridSDK within a single source file.  In doing so, the interactions within the sample apps can be easily seen and examined.
+
+Within the `UsergridManager.swift` source there will be at least two different static vars named `ORG_ID` and `APP_ID`.  You will need to configure those values in order to run the applications in your environment.    
+
+Applications which utilize push notifications will require a valid provisioning profile and device for the push services to work correctly.   

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/Readme.md
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/Readme.md b/sdks/swift/Samples/Readme.md
index 4c5601f..fbfacdb 100644
--- a/sdks/swift/Samples/Readme.md
+++ b/sdks/swift/Samples/Readme.md
@@ -2,7 +2,7 @@
 
 The sample apps in this directory are intended to show basic usage of some of the major features of the UsergridSDK.
 
-Each sample application utilizes `Cocoapods` to interact with the UsergridSDK.
+> Each sample application installs the UsergridSDK by embedding the framework directly.  A sample application integrating the UsergridSDK via `Cocoapods` will be coming in the near future.
 
 ##Samples Apps
 
@@ -10,6 +10,12 @@ Each sample application utilizes `Cocoapods` to interact with the UsergridSDK.
 
 * **Push** - An app that registers for and sends push notifications. 
 
+## Running the Sample Apps
+
+To run the sample apps, simply open the `<SAMPLE APP NAME>.xcworkspace` file in Xcode, then run the app.
+
+> Note that some applications utilize `Cocoapods` (such as the `ActivityFeed` sample) and you will need to run the `$ pod install` command from within the root folder of the sample project in order for the sample to run properly.
+
 ##Configuring the Sample Apps
 
 Before running the sample applications you will need to configure each sample application. 
@@ -19,7 +25,3 @@ Each sample application should include a source file named `UsergridManager.swif
 Within the `UsergridManager.swift` source there will be at least two different static vars named `ORG_ID` and `APP_ID`.  You will need to configure those values in order to run the applications in your environment.    
 
 Applications which utilize push notifications will require a valid provisioning profile and device for the push services to work correctly.   
-
-## Running the Sample Apps
-
-To run the sample apps, simply open the <SAMPLE APP NAME>.xcworkspace file in Xcode, then run the app.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Source/Usergrid.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Source/Usergrid.swift b/sdks/swift/Source/Usergrid.swift
index 78769ae..1049a62 100644
--- a/sdks/swift/Source/Usergrid.swift
+++ b/sdks/swift/Source/Usergrid.swift
@@ -72,13 +72,25 @@ public class Usergrid: NSObject {
     /// The currently logged in `UsergridUser` of the shared instance of `UsergridClient`.
     public static var currentUser: UsergridUser?  { return Usergrid.sharedInstance.currentUser }
 
+    /// Whether or not the current user will be saved and restored from the keychain using the shared instance of `UsergridClient`.
+    public static var persistCurrentUserInKeychain: Bool {
+        get { return Usergrid.sharedInstance.persistCurrentUserInKeychain }
+        set(persist) { Usergrid.sharedInstance.persistCurrentUserInKeychain = persist }
+    }
+
     /// The `UsergridUserAuth` which consists of the token information from the `currentUser` property of the shared instance of `UsergridClient`.
     public static var userAuth: UsergridUserAuth?  { return Usergrid.sharedInstance.userAuth }
 
     /// The application level `UsergridAppAuth` object of the shared instance of `UsergridClient`.
     public static var appAuth: UsergridAppAuth?  {
-        get{ return Usergrid.sharedInstance.appAuth }
-        set{ Usergrid.sharedInstance.appAuth = newValue }
+        get { return Usergrid.sharedInstance.appAuth }
+        set(auth) { Usergrid.sharedInstance.appAuth = auth }
+    }
+
+    /// The `UsergridAuthFallback` value used to determine what type of token will be sent of the shared instance of `UsergridClient`, if any.
+    public static var authFallback: UsergridAuthFallback {
+        get { return Usergrid.sharedInstance.authFallback }
+        set(authFallback) { Usergrid.sharedInstance.authFallback = authFallback }
     }
 
     // MARK: - Initialization -
@@ -162,12 +174,6 @@ public class Usergrid: NSObject {
 
     // MARK: - Authorization -
 
-    /// The `UsergridAuthFallback` value used to determine what type of token will be sent of the shared instance of `UsergridClient`, if any.
-    public static var authFallback: UsergridAuthFallback {
-        get{ return Usergrid.sharedInstance.authFallback }
-        set { Usergrid.sharedInstance.authFallback = newValue }
-    }
-
     /**
      Sets the shared `UsergridClient`'s `tempAuth` property using the passed in `UsergridAuth`.
 
@@ -305,14 +311,23 @@ public class Usergrid: NSObject {
     }
 
     /**
-    Gets a group of `UsergridEntity` objects of a given type with an optional query using the shared instance of `UsergridCient`.
+     Gets a group of `UsergridEntity` objects of a given type  using the shared instance of `UsergridCient`.
 
-    - parameter type:       The `UsergridEntity` type.
-    - parameter query:      The optional query to use when gathering `UsergridEntity` objects.
-    - parameter completion: The completion block that will be called once the request has completed.
+     - parameter type:       The `UsergridEntity` type.
+     - parameter completion: The optional completion block that will be called once the request has completed.
+     */
+    public static func GET(type: String, completion: UsergridResponseCompletion? = nil) {
+        Usergrid.sharedInstance.GET(type,completion:completion)
+    }
+
+    /**
+    Gets a group of `UsergridEntity` objects with a given query using the shared instance of `UsergridCient`.
+
+    - parameter query:           The query to use when gathering `UsergridEntity` objects.
+    - parameter queryCompletion: The completion block that will be called once the request has completed.
     */
-    public static func GET(type: String, query: UsergridQuery? = nil, completion: UsergridResponseCompletion? = nil) {
-        Usergrid.sharedInstance.GET(type,query:query,completion:completion)
+    public static func GET(query: UsergridQuery, queryCompletion: UsergridResponseCompletion? = nil) {
+        Usergrid.sharedInstance.GET(query,queryCompletion:queryCompletion)
     }
 
     // MARK: - PUT -

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Source/UsergridClient.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Source/UsergridClient.swift b/sdks/swift/Source/UsergridClient.swift
index cbb416f..9cb6aa7 100644
--- a/sdks/swift/Source/UsergridClient.swift
+++ b/sdks/swift/Source/UsergridClient.swift
@@ -53,13 +53,21 @@ public class UsergridClient: NSObject, NSCoding {
     /// The constructed URL string based on the `UsergridClient`'s `baseUrl`, `orgId`, and `appId`.
     internal var clientAppURL : String { return "\(baseUrl)/\(orgId)/\(appId)" }
 
+    /// Whether or not the current user will be saved and restored from the keychain.
+    public var persistCurrentUserInKeychain: Bool {
+        get { return config.persistCurrentUserInKeychain }
+        set(persist) { config.persistCurrentUserInKeychain = persist }
+    }
+
     /// The currently logged in `UsergridUser`.
     internal(set) public var currentUser: UsergridUser? = nil {
         didSet {
-            if let newUser = self.currentUser {
-                UsergridUser.saveCurrentUserKeychainItem(self,currentUser:newUser)
-            } else if oldValue != nil {
-                UsergridUser.deleteCurrentUserKeychainItem(self)
+            if persistCurrentUserInKeychain {
+                if let newUser = self.currentUser {
+                    UsergridUser.saveCurrentUserKeychainItem(self,currentUser:newUser)
+                } else if oldValue != nil {
+                    UsergridUser.deleteCurrentUserKeychainItem(self)
+                }
             }
         }
     }
@@ -72,14 +80,14 @@ public class UsergridClient: NSObject, NSCoding {
 
     /// The application level `UsergridAppAuth` object.  Can be set manually but must call `authenticateApp` to retrive token.
     public var appAuth: UsergridAppAuth? {
-        set { config.appAuth = newValue }
         get { return config.appAuth }
+        set(auth) { config.appAuth = auth }
     }
 
     /// The `UsergridAuthFallback` value used to determine what type of token will be sent, if any.
     public var authFallback: UsergridAuthFallback {
-        set { config.authFallback = newValue }
         get { return config.authFallback }
+        set(fallback) { config.authFallback = fallback }
     }
 
     // MARK: - Initialization -
@@ -119,7 +127,10 @@ public class UsergridClient: NSObject, NSCoding {
     public init(configuration:UsergridClientConfig) {
         self.config = configuration
         super.init()
-        self.currentUser = UsergridUser.getCurrentUserFromKeychain(self) // Attempt to get the current user from the saved keychain data.
+        if persistCurrentUserInKeychain {
+            self.currentUser = UsergridUser.getCurrentUserFromKeychain(self) // Attempt to get the current user from the saved keychain data.
+        }
+        UsergridDevice.sharedDevice.save(self)
     }
 
     // MARK: - NSCoding -
@@ -145,9 +156,11 @@ public class UsergridClient: NSObject, NSCoding {
         if let currentUser = aDecoder.decodeObjectForKey("currentUser") as? UsergridUser {
             self.currentUser = currentUser
         } else {
-            // If we didn't decode a current user, attempt to get the current user from the saved keychain data.
-            self.currentUser = UsergridUser.getCurrentUserFromKeychain(self)
+            if persistCurrentUserInKeychain {
+                self.currentUser = UsergridUser.getCurrentUserFromKeychain(self)
+            }
         }
+        UsergridDevice.sharedDevice.save(self)
     }
 
     /**
@@ -183,7 +196,7 @@ public class UsergridClient: NSObject, NSCoding {
     */
     public func applyPushToken(device: UsergridDevice, pushToken: NSData, notifierID: String, completion: UsergridResponseCompletion? = nil) {
         device.applyPushToken(pushToken, notifierID: notifierID)
-        PUT(UsergridDevice.DEVICE_ENTITY_TYPE, jsonBody: device.jsonObjectValue, completion: completion)
+        device.save(self, completion: completion)
     }
 
     // MARK: - Authorization and User Management -
@@ -415,15 +428,31 @@ public class UsergridClient: NSObject, NSCoding {
     }
 
     /**
-    Gets a group of `UsergridEntity` objects of a given type with an optional query.
+     Gets a group of `UsergridEntity` objects of a given type.
 
-    - parameter type:       The `UsergridEntity` type.
-    - parameter query:      The optional query to use when gathering `UsergridEntity` objects.
-    - parameter completion: The optional completion block that will be called once the request has completed.
+     - parameter type:       The `UsergridEntity` type.
+     - parameter completion: The optional completion block that will be called once the request has completed.
+     */
+    public func GET(type: String, completion: UsergridResponseCompletion? = nil) {
+        let request = UsergridRequest(method: .Get, baseUrl: self.clientAppURL, paths: [type], query: nil, auth: self.authForRequests())
+        self.sendRequest(request, completion: completion)
+    }
+
+    /**
+    Gets a group of `UsergridEntity` objects using a given query.
+
+    - parameter query:           The query to use when gathering `UsergridEntity` objects.
+    - parameter queryCompletion: The optional completion block that will be called once the request has completed.
     */
-    public func GET(type: String, query: UsergridQuery? = nil, completion: UsergridResponseCompletion? = nil) {
+    public func GET(query: UsergridQuery, queryCompletion: UsergridResponseCompletion? = nil) {
+        guard let type = query.collectionName
+            else {
+                queryCompletion?(response: UsergridResponse(client:self, errorName: "Query collection name missing.", errorDescription: "Query collection name is missing."))
+                return
+        }
+
         let request = UsergridRequest(method: .Get, baseUrl: self.clientAppURL, paths: [type], query: query, auth: self.authForRequests())
-        self.sendRequest(request, completion: completion)
+        self.sendRequest(request, completion: queryCompletion)
     }
 
     // MARK: - PUT -

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Source/UsergridClientConfig.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Source/UsergridClientConfig.swift b/sdks/swift/Source/UsergridClientConfig.swift
index c79b6b2..2719610 100644
--- a/sdks/swift/Source/UsergridClientConfig.swift
+++ b/sdks/swift/Source/UsergridClientConfig.swift
@@ -45,9 +45,12 @@ public class UsergridClientConfig : NSObject, NSCoding {
     public var baseUrl: String = UsergridClient.DEFAULT_BASE_URL
 
     /// The `UsergridAuthFallback` value used to determine what type of token will be sent, if any.
-    public var authFallback: UsergridAuthFallback = .App
+    public var authFallback: UsergridAuthFallback = .None
 
-    /** 
+    /// Whether or not the `UsergridClient` current user will be saved and restored from the keychain.
+    public var persistCurrentUserInKeychain: Bool = true
+
+    /**
     The application level `UsergridAppAuth` object.
     
     Note that you still need to call the authentication methods within `UsergridClient` once it has been initialized.
@@ -86,16 +89,18 @@ public class UsergridClientConfig : NSObject, NSCoding {
     /**
     Convenience initializer for `UsergridClientConfig`.
 
-    - parameter orgId:        The organization identifier.
-    - parameter appId:        The application identifier.
-    - parameter baseUrl:      The base URL that all calls will be made with.
-    - parameter authFallback: The `UsergridAuthFallback` value used to determine what type of token will be sent, if any.
-    - parameter appAuth:      The application level `UsergridAppAuth` object.
+    - parameter orgId:                          The organization identifier.
+    - parameter appId:                          The application identifier.
+    - parameter baseUrl:                        The base URL that all calls will be made with.
+    - parameter authFallback:                   The `UsergridAuthFallback` value used to determine what type of token will be sent, if any.
+    - parameter persistCurrentUserInKeychain:   Whether or not the `UsergridClient` current user will be saved and restored from the keychain.
+    - parameter appAuth:                        The application level `UsergridAppAuth` object.
 
     - returns: A new instance of `UsergridClientConfig`.
     */
-    public convenience init(orgId: String, appId: String, baseUrl:String, authFallback:UsergridAuthFallback, appAuth:UsergridAppAuth? = nil) {
+    public convenience init(orgId: String, appId: String, baseUrl:String, authFallback:UsergridAuthFallback, persistCurrentUserInKeychain: Bool = true, appAuth:UsergridAppAuth? = nil) {
         self.init(orgId:orgId,appId:appId,baseUrl:baseUrl)
+        self.persistCurrentUserInKeychain = persistCurrentUserInKeychain
         self.authFallback = authFallback
         self.appAuth = appAuth
     }
@@ -123,6 +128,7 @@ public class UsergridClientConfig : NSObject, NSCoding {
         self.orgId = orgId
         self.baseUrl = baseUrl
         self.appAuth = aDecoder.decodeObjectForKey("appAuth") as? UsergridAppAuth
+        self.persistCurrentUserInKeychain = aDecoder.decodeBoolForKey("persistCurrentUserInKeychain") ?? true
         self.authFallback = UsergridAuthFallback(rawValue:aDecoder.decodeIntegerForKey("authFallback")) ?? .App
         super.init()
     }
@@ -137,6 +143,7 @@ public class UsergridClientConfig : NSObject, NSCoding {
         aCoder.encodeObject(self.orgId, forKey: "orgId")
         aCoder.encodeObject(self.baseUrl, forKey: "baseUrl")
         aCoder.encodeObject(self.appAuth, forKey: "appAuth")
+        aCoder.encodeBool(self.persistCurrentUserInKeychain, forKey: "persistCurrentUserInKeychain")
         aCoder.encodeInteger(self.authFallback.rawValue, forKey: "authFallback")
     }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Source/UsergridDevice.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Source/UsergridDevice.swift b/sdks/swift/Source/UsergridDevice.swift
index c08fcf6..995470c 100644
--- a/sdks/swift/Source/UsergridDevice.swift
+++ b/sdks/swift/Source/UsergridDevice.swift
@@ -58,10 +58,10 @@ public class UsergridDevice : UsergridEntity {
     /// Property helper method for the `UsergridDevice` objects device operating system version.
     public var osVersion: String { return super[UsergridDeviceProperties.OSVersion.stringValue] as! String }
 
-    // MARK: - Initialization -
-
     /// The shared instance of `UsergridDevice`.
-    public static var sharedDevice: UsergridDevice = UsergridDevice()
+    public static var sharedDevice: UsergridDevice = UsergridDevice.getOrCreateSharedDeviceFromKeychain()
+
+    // MARK: - Initialization -
 
     /**
     Designated Initializer for `UsergridDevice` objects
@@ -71,25 +71,7 @@ public class UsergridDevice : UsergridEntity {
     - returns: A new instance of `UsergridDevice`.
     */
     public init() {
-        var deviceEntityDict: [String:AnyObject] = [:]
-        deviceEntityDict[UsergridEntityProperties.EntityType.stringValue] = UsergridDevice.DEVICE_ENTITY_TYPE
-        deviceEntityDict[UsergridEntityProperties.UUID.stringValue] = UsergridDevice.usergridDeviceUUID()
-
-        #if os(watchOS)
-            deviceEntityDict[UsergridDeviceProperties.Model.stringValue] = WKInterfaceDevice.currentDevice().model
-            deviceEntityDict[UsergridDeviceProperties.Platform.stringValue] = WKInterfaceDevice.currentDevice().systemName
-            deviceEntityDict[UsergridDeviceProperties.OSVersion.stringValue] = WKInterfaceDevice.currentDevice().systemVersion
-        #elseif os(iOS) || os(tvOS)
-            deviceEntityDict[UsergridDeviceProperties.Model.stringValue] = UIDevice.currentDevice().model
-            deviceEntityDict[UsergridDeviceProperties.Platform.stringValue] = UIDevice.currentDevice().systemName
-            deviceEntityDict[UsergridDeviceProperties.OSVersion.stringValue] = UIDevice.currentDevice().systemVersion
-        #elseif os(OSX)
-            deviceEntityDict[UsergridDeviceProperties.Model.stringValue] = "Mac"
-            deviceEntityDict[UsergridDeviceProperties.Platform.stringValue] = "OSX"
-            deviceEntityDict[UsergridDeviceProperties.OSVersion.stringValue] = NSProcessInfo.processInfo().operatingSystemVersionString
-        #endif
-
-        super.init(type: UsergridDevice.DEVICE_ENTITY_TYPE, propertyDict: deviceEntityDict)
+        super.init(type: UsergridDevice.DEVICE_ENTITY_TYPE, propertyDict: UsergridDevice.commonDevicePropertyDict())
     }
 
     /**
@@ -101,7 +83,7 @@ public class UsergridDevice : UsergridEntity {
 
      - returns: A new `UsergridDevice` object.
      */
-    required public init(type: String, name: String?, propertyDict: [String : AnyObject]?) {
+    required public init(type:String, name:String? = nil, propertyDict:[String:AnyObject]? = nil) {
         super.init(type: type, name: name, propertyDict: propertyDict)
     }
 
@@ -148,6 +130,34 @@ public class UsergridDevice : UsergridEntity {
         }
     }
 
+    // MARK: - Class Helper Methods -
+
+    /**
+    Creates a property dictionary that contains the common properties for `UsergridDevice` objects.
+
+    - returns: A property dictionary with the common properties set.
+    */
+    public static func commonDevicePropertyDict() -> [String:AnyObject] {
+        var commonDevicePropertyDict: [String:AnyObject] = [:]
+        commonDevicePropertyDict[UsergridEntityProperties.EntityType.stringValue] = UsergridDevice.DEVICE_ENTITY_TYPE
+
+        #if os(watchOS)
+            commonDevicePropertyDict[UsergridDeviceProperties.Model.stringValue] = WKInterfaceDevice.currentDevice().model
+            commonDevicePropertyDict[UsergridDeviceProperties.Platform.stringValue] = WKInterfaceDevice.currentDevice().systemName
+            commonDevicePropertyDict[UsergridDeviceProperties.OSVersion.stringValue] = WKInterfaceDevice.currentDevice().systemVersion
+        #elseif os(iOS) || os(tvOS)
+            commonDevicePropertyDict[UsergridDeviceProperties.Model.stringValue] = UIDevice.currentDevice().model
+            commonDevicePropertyDict[UsergridDeviceProperties.Platform.stringValue] = UIDevice.currentDevice().systemName
+            commonDevicePropertyDict[UsergridDeviceProperties.OSVersion.stringValue] = UIDevice.currentDevice().systemVersion
+        #elseif os(OSX)
+            commonDevicePropertyDict[UsergridDeviceProperties.Model.stringValue] = "Mac"
+            commonDevicePropertyDict[UsergridDeviceProperties.Platform.stringValue] = "OSX"
+            commonDevicePropertyDict[UsergridDeviceProperties.OSVersion.stringValue] = NSProcessInfo.processInfo().operatingSystemVersionString
+        #endif
+
+        return commonDevicePropertyDict
+    }
+
     // MARK: - Push Token Handling -
 
     /**

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Source/UsergridEntity.swift
----------------------------------------------------------------------
diff --git a/sdks/swift/Source/UsergridEntity.swift b/sdks/swift/Source/UsergridEntity.swift
index 4b6fe8f..5baaba4 100644
--- a/sdks/swift/Source/UsergridEntity.swift
+++ b/sdks/swift/Source/UsergridEntity.swift
@@ -73,7 +73,7 @@ public class UsergridEntity: NSObject, NSCoding {
     /// Property helper method for the `UsergridEntity` objects `UsergridEntityProperties.Location`.
     public var location: CLLocation? {
         get { return self.getEntitySpecificProperty(.Location) as? CLLocation }
-        set { self[UsergridEntityProperties.Location.stringValue] = newValue }
+        set(newLocation) { self[UsergridEntityProperties.Location.stringValue] = newLocation }
     }
 
     /// Property helper method to get the UUID or name of the `UsergridEntity`.
@@ -89,7 +89,7 @@ public class UsergridEntity: NSObject, NSCoding {
     public var jsonObjectValue : [String:AnyObject] { return self.properties }
 
     /// The string value.
-    public var stringValue : String { return NSString(data: try! NSJSONSerialization.dataWithJSONObject(self.jsonObjectValue, options: .PrettyPrinted), encoding: NSASCIIStringEncoding) as! String }
+    public var stringValue : String { return NSString(data: try! NSJSONSerialization.dataWithJSONObject(self.jsonObjectValue, options: .PrettyPrinted), encoding: NSUTF8StringEncoding) as! String }
 
     /// The description.
     public override var description : String {
@@ -127,12 +127,10 @@ public class UsergridEntity: NSObject, NSCoding {
         }
     }
 
-    private func copyInternalsFromEntity(entity:UsergridEntity) {
+    internal func copyInternalsFromEntity(entity:UsergridEntity) {
         self.properties = entity.properties
-        self.asset = entity.asset ?? self.asset
     }
 
-
     /**
      Used for custom mapping subclasses to a given `Usergrid` type.
 
@@ -434,7 +432,7 @@ public class UsergridEntity: NSObject, NSCoding {
                 completion?(response: response)
             }
         } else {
-            completion?(response: UsergridResponse(client: client, errorName: "Entity cannot be reloaded.", errorDescription: "Entity has neither an UUID or specified."))
+            completion?(response: UsergridResponse(client: client, errorName: "Entity cannot be reloaded.", errorDescription: "Entity has neither an UUID or name specified."))
         }
     }