diff --git a/helpers/args.js b/helpers/args.js
new file mode 100644
index 0000000..ecef57b
--- /dev/null
+++ b/helpers/args.js
@@ -0,0 +1,7 @@
+'use strict'
+
+var _ = require('lodash')
+
+module.exports = function(args) {
+    return _.flattenDeep(Array.prototype.slice.call(args))
+}
\ No newline at end of file
diff --git a/helpers/build.js b/helpers/build.js
index c23e81d..8d46952 100644
--- a/helpers/build.js
+++ b/helpers/build.js
@@ -12,12 +12,12 @@
     _ = require('lodash')
 
 module.exports = {
-    url: function(client, options) {
+    uri: function(client, options) {
         return urljoin(
             client.baseUrl,
             client.orgId,
             client.appId,
-            options.type,
+            options.path || options.type,
             _.isString(options.uuidOrName) ? options.uuidOrName : ""
         )
     },
@@ -84,7 +84,8 @@
 
         var options = {
             client: client,
-            method: 'GET'
+            method: 'GET',
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
@@ -92,8 +93,6 @@
             _.assign(options, args[0])
         }
 
-        options.callback = helpers.cb(_.last(args.filter(_.isFunction)))
-
         options.type = _.first([options.type, ok(args).getIfExists('0._type'), args[0]].filter(_.isString))
 
         options.query = _.first([options.query, args[0]].filter(function(property) {
@@ -131,7 +130,8 @@
 
         var options = {
             client: client,
-            method: 'PUT'
+            method: 'PUT',
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
@@ -139,8 +139,6 @@
             _.assign(options, args[0])
         }
 
-        options.callback = helpers.cb(_.last(args.filter(_.isFunction)))
-
         options.body = _.first([options.entity, options.body, args[2], args[1], args[0]].filter(function(property) {
             return _.isObject(property) && !_.isFunction(property) && !(property instanceof UsergridQuery)
         }))
@@ -179,7 +177,8 @@
 
         var options = {
             client: client,
-            method: 'POST'
+            method: 'POST',
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
@@ -187,8 +186,6 @@
             _.assign(options, args[0])
         }
 
-        options.callback = helpers.cb(_.last(args.filter(_.isFunction)))
-
         options.body = _.first([options.entities, options.entity, options.body, args[1], args[0]].filter(function(property) {
             return _.isArray(property) && _.isObject(property[0]) && !_.isFunction(property[0]) || _.isObject(property) && !_.isFunction(property)
         }))
@@ -219,7 +216,8 @@
 
         var options = {
             client: client,
-            method: 'DELETE'
+            method: 'DELETE',
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
@@ -227,7 +225,6 @@
             _.assign(options, args[0])
         }
 
-        options.callback = helpers.cb(_.last(args.filter(_.isFunction)))
         options.type = _.first([options.type, ok(options).getIfExists('entity.type'), args[0]._type, args[0]].filter(_.isString))
         options.entity = _.first([options.entity, args[0]].filter(function(property) {
             return (property instanceof UsergridEntity)
@@ -245,7 +242,7 @@
 
         return options
     },
-    connection: function(client, args) {
+    connection: function(client, method, args) {
 
         /* connect supports the following constructor patterns:
 
@@ -277,9 +274,11 @@
         */
 
         var options = {
+            client: client,
+            method: method,
             entity: {},
             to: {},
-            callback: helpers.cb(_.last(args.filter(_.isFunction)))
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
@@ -367,7 +366,9 @@
         */
 
         var options = {
-            callback: helpers.cb(_.last(args.filter(_.isFunction)))
+            client: client,
+            method: 'GET',
+            callback: helpers.cb(args)
         }
 
         // if a preformatted options argument passed, assign it to options
diff --git a/helpers/cb.js b/helpers/cb.js
index 21ed2f7..8c62591 100644
--- a/helpers/cb.js
+++ b/helpers/cb.js
@@ -1,7 +1,10 @@
 'use strict'
 
-var _ = require('lodash')
+var ok = require('objectkit'),
+    _ = require('lodash')
 
-module.exports = function(callback) {
-    return _.isFunction(callback) ? callback : function() {}
+module.exports = function() {
+    var args = _.flattenDeep(Array.prototype.slice.call(arguments))
+    var emptyFunc = function() {}
+    return _.first(_.flattenDeep([args.reverse(), ok(args).getIfExists('0.callback'), emptyFunc]).filter(_.isFunction))
 }
\ No newline at end of file
diff --git a/helpers/client.js b/helpers/client.js
index d91849e..94da11e 100644
--- a/helpers/client.js
+++ b/helpers/client.js
@@ -12,7 +12,7 @@
         } else if (Usergrid.isInitialized) {
             client = Usergrid
         } else {
-            throw new Error("This method requires a valid UsergridClient instance (or the Usergrid shared instance) to be initialized")
+            throw new Error("This method requires a valid UsergridClient instance as an argument (or the Usergrid shared instance to be initialized)")
         } 
         return client
     }
diff --git a/helpers/index.js b/helpers/index.js
index cc4f20e..954e353 100644
--- a/helpers/index.js
+++ b/helpers/index.js
@@ -1,22 +1,26 @@
 'use strict'
 
-var client = require('./client'),
+var args = require('./args'),
+    client = require('./client'),
     cb = require('./cb'),
     build = require('./build'),
     query = require('./query'),
     config = require('./config'),
     time = require('./time'),
     mutability = require('./mutability'),
+    user = require('./user'),
     _ = require('lodash')
 
 // by mixing this in here, lodash-uuid is available everywhere lodash is used.
 _.mixin(require('lodash-uuid'))
 
 module.exports = _.assign(module.exports, {
+    args: args,
     client: client,
     cb: cb,
     build: build,
     query: query,
     config: config,
-    time: time
+    time: time,
+    user: user
 }, mutability)
\ No newline at end of file
diff --git a/helpers/user.js b/helpers/user.js
new file mode 100644
index 0000000..470cf06
--- /dev/null
+++ b/helpers/user.js
@@ -0,0 +1,9 @@
+'use strict'
+
+var _ = require('lodash')
+
+module.exports = {
+    uniqueId: function(user) {
+        return _.first([user.uuid, user.username, user.email].filter(_.isString))
+    }
+}
\ No newline at end of file
diff --git a/lib/appAuth.js b/lib/appAuth.js
index 493415d..157db3e 100644
--- a/lib/appAuth.js
+++ b/lib/appAuth.js
@@ -1,12 +1,13 @@
 'use strict'
 
 var UsergridAuth = require('./auth'),
+    helpers = require('../helpers'),
     util = require('util'),
     _ = require('lodash')
 
 var UsergridAppAuth = function(options) {
     var self = this
-    var args = _.flatten(Array.prototype.slice.call(arguments), true)
+    var args = _.flattenDeep(helpers.args(arguments))
     if (_.isPlainObject(args[0])) {
         options = args[0]
     }
diff --git a/lib/auth.js b/lib/auth.js
index 3a20da3..7d8eefa 100644
--- a/lib/auth.js
+++ b/lib/auth.js
@@ -1,10 +1,12 @@
 'use strict'
 
-var UsergridAuth = function() {
+var UsergridAuth = function(token, expiry) {
     var self = this
 
-    self.token = undefined
-    self.expiry = 0
+    self.token = token || undefined
+    self.expiry = expiry || 0
+
+    var usingToken = (token) ? true : false
 
     Object.defineProperty(self, "hasToken", {
         get: function() {
@@ -15,7 +17,7 @@
 
     Object.defineProperty(self, "isExpired", {
         get: function() {
-            return (Date.now() >= self.expiry)
+            return usingToken || (Date.now() >= self.expiry)
         },
         configurable: true
     })
diff --git a/lib/client.js b/lib/client.js
index d8c8843..898478c 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -1,8 +1,7 @@
 'use strict'
 
-var UsergridRequest = require('./request'),
-    request = require('request'),
-    helpers = require('../helpers'),
+var helpers = require('../helpers'),
+    UsergridRequest = require('./request'),
     UsergridResponse = require('./response'),
     UsergridResponseError = require('./responseError'),
     UsergridAuth = require('./auth'),
@@ -54,64 +53,32 @@
 
 UsergridClient.prototype = {
     GET: function() {
-        return new UsergridRequest(helpers.build.GET(this, Array.prototype.slice.call(arguments)))
+        return new UsergridRequest(helpers.build.GET(this, helpers.args(arguments)))
     },
     PUT: function() {
-        return new UsergridRequest(helpers.build.PUT(this, Array.prototype.slice.call(arguments)))
+        return new UsergridRequest(helpers.build.PUT(this, helpers.args(arguments)))
     },
     POST: function() {
-        return new UsergridRequest(helpers.build.POST(this, Array.prototype.slice.call(arguments)))
+        return new UsergridRequest(helpers.build.POST(this, helpers.args(arguments)))
     },
     DELETE: function() {
-        return new UsergridRequest(helpers.build.DELETE(this, Array.prototype.slice.call(arguments)))
+        return new UsergridRequest(helpers.build.DELETE(this, helpers.args(arguments)))
     },
     connect: function() {
-        var Usergrid = require('../usergrid')
-        if (this === Usergrid && !Usergrid.isInitialized) {
-            throw new Error('The Usergrid shared instance has not been initialized')
-        }
-        var options = helpers.build.connection(this, Array.prototype.slice.call(arguments))
-        request({
-            uri: options.uri,
-            headers: helpers.build.headers(this),
-            method: 'POST',
-            json: true
-        }, function(error, response) {
-            var usergridResponse = new UsergridResponse(response)
-            options.callback(error || usergridResponse.error, usergridResponse, usergridResponse.entities)
-        })
+        return new UsergridRequest(helpers.build.connection(this, 'POST', helpers.args(arguments)))
     },
     disconnect: function() {
-        var options = helpers.build.connection(this, Array.prototype.slice.call(arguments))
-        request({
-            uri: options.uri,
-            headers: helpers.build.headers(this),
-            method: 'DELETE',
-            json: true
-        }, function(error, response) {
-            var usergridResponse = new UsergridResponse(response)
-            options.callback(error || usergridResponse.error, usergridResponse, usergridResponse.entities)
-        })
+        return new UsergridRequest(helpers.build.connection(this, 'DELETE', helpers.args(arguments)))
     },
-    getConnections: function() {
-        var options = helpers.build.getConnections(this, Array.prototype.slice.call(arguments))
-        request({
-            uri: options.uri,
-            headers: helpers.build.headers(this),
-            method: 'GET',
-            json: true
-        }, function(error, response) {
-            var usergridResponse = new UsergridResponse(response)
-            options.callback(error || usergridResponse.error, usergridResponse, usergridResponse.entities)
-        })
+    getConnections: function() {        
+        return new UsergridRequest(helpers.build.getConnections(this, helpers.args(arguments)))
     },
     setAppAuth: function(options) {
-        this.appAuth = (typeof options === 'string') ? Array.prototype.slice.call(arguments) : options
+        this.appAuth = (typeof options === 'string') ? helpers.args(arguments) : options
     },
-    authenticateApp: function(options, callback) {
+    authenticateApp: function(options) {
         var self = this
-        callback = helpers.cb(callback || options)
-
+        var callback = helpers.cb(helpers.args(arguments))
         var auth = (options instanceof UsergridAppAuth) ? options : self.appAuth || new UsergridAppAuth(options)
 
         if (!(auth instanceof UsergridAppAuth)) {
@@ -120,39 +87,36 @@
             throw new Error('authenticateApp() failed because clientId or clientSecret are missing')
         }
 
-        auth.type = 'token'
-
-        request({
-            uri: helpers.build.url(self, auth),
-            headers: helpers.build.headers(self),
-            body: helpers.build.appLoginBody(auth),
+        var options = {
+            client: self,
+            path: 'token',
             method: 'POST',
-            json: true
-        }, function(error, response, body) {
-            if (response.statusCode === 200) {
+            body: helpers.build.appLoginBody(auth)
+        }
+
+        return new UsergridRequest(options, function(error, usergridResponse, body) {
+            if (usergridResponse.ok) {
                 if (!self.appAuth) {
                     self.appAuth = auth
                 }
                 self.appAuth.token = body.access_token
                 self.appAuth.expiry = helpers.time.expiry(body.expires_in)
                 self.appAuth.tokenTtl = body.expires_in
-            } else {
-                error = new UsergridResponseError(response.body)
             }
-            callback(error, response, body.access_token)
+            callback(error, usergridResponse, body.access_token)
         })
     },
-    authenticateUser: function(options, callback) {
+    authenticateUser: function(options) {
         var self = this
-        callback = helpers.cb(callback || options)
+        var callback = helpers.cb(helpers.args(arguments))
 
         var UsergridUser = require('./user')
         var currentUser = new UsergridUser(options)
-        currentUser.login(self, function(error, response, token) {
-            if (response.statusCode === 200) {
+        currentUser.login(self, function(error, usergridResponse, token) {
+            if (usergridResponse.ok) {
                 self.currentUser = currentUser
             }
-            callback(error, response, token)
+            callback(error, usergridResponse, token)
         })
     }
 }
diff --git a/lib/entity.js b/lib/entity.js
index 20c4669..3983f84 100644
--- a/lib/entity.js
+++ b/lib/entity.js
@@ -8,7 +8,7 @@
 var UsergridEntity = function() {
     var self = this
 
-    var args = Array.prototype.slice.call(arguments)
+    var args = helpers.args(arguments)
 
     if (!args[0]) {
         throw new Error('A UsergridEntity object was initialized using an empty argument')
@@ -81,9 +81,9 @@
         }
     },
     reload: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var callback = helpers.cb(args)
         client.GET(this, function(err, usergridResponse) {
             helpers.setWritable(this, ['uuid', 'name', 'type', 'created'])
             _.assign(this, usergridResponse.entity)
@@ -92,9 +92,9 @@
         }.bind(this))
     },
     save: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var callback = helpers.cb(args)
         client.PUT(this, function(err, usergridResponse) {
             helpers.setWritable(this, ['uuid', 'name', 'type', 'created'])
             _.assign(this, usergridResponse.entity)
@@ -103,9 +103,9 @@
         }.bind(this))
     },
     remove: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var callback = helpers.cb(args)
         client.DELETE(this, function(err, usergridResponse) {
             callback(err || usergridResponse.error, usergridResponse, this)
         }.bind(this))
@@ -114,19 +114,19 @@
     uploadAsset: function() {},
     downloadAsset: function() {},
     connect: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
         args.unshift(this)
         return client.connect.apply(client, args)
     },
     disconnect: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
         args.unshift(this)
         return client.disconnect.apply(client, args)
     },
     getConnections: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
         args.splice(1, 0, this)
         return client.getConnections.apply(client, args)
diff --git a/lib/request.js b/lib/request.js
index bfda17c..a387a5c 100644
--- a/lib/request.js
+++ b/lib/request.js
@@ -9,12 +9,21 @@
     _ = require('lodash')
 
 var UsergridRequest = function(options) {
-    if (!_.isString(options.type)) {
-        throw new Error('"type" (collection name) parameter is required when making a request')
+
+    var client = helpers.client.validate(options.client)
+    var callback = helpers.cb(helpers.args(arguments))
+
+    if (!_.isString(options.type) && !_.isString(options.path) && !_.isString(options.uri)) {
+        throw new Error('one of "type" (collection name), "path", or "uri" parameters are required when initializing a UsergridRequest')
+    }
+    if (!_.includes(['GET', 'PUT', 'POST', 'DELETE'], options.method)) {
+        throw new Error('"method" parameter is required when initializing a UsergridRequest')
     }
 
-    request(helpers.build.url(options.client, options), {
-        headers: helpers.build.headers(options.client),
+    var uri = options.uri || helpers.build.uri(client, options)
+
+    request(uri, {
+        headers: helpers.build.headers(client),
         body: options.body,
         json: true,
         method: options.method,
@@ -22,10 +31,10 @@
             ql: options.query._ql || undefined,
             limit: options.query._limit,
             cursor: options.query._cursor
-        } : undefined
+        } : options.qs
     }, function(error, response) {
         var usergridResponse = new UsergridResponse(response)
-        options.callback(error || usergridResponse.error, usergridResponse, usergridResponse.entities)
+        callback(error || usergridResponse.error, usergridResponse, usergridResponse.entities || usergridResponse.body)
     })
 }
 
diff --git a/lib/response.js b/lib/response.js
index 6cc6997..63a4b20 100644
--- a/lib/response.js
+++ b/lib/response.js
@@ -8,40 +8,46 @@
 
 var UsergridResponse = function(response) {
     var self = this
+    self.ok = false
     if (!response) {
         return
-    } else if (ok(response.body).has('entities') && response.statusCode < 400) {
+    } else if (response.statusCode < 400) {
+        self.ok = true
         var UsergridEntity = require('./entity.js'),
             UsergridUser = require('./user.js')
+        
+        _.assign(self, response)
 
-        var entities = response.body.entities.map(function(en) {
-            var entity = new UsergridEntity(en)
-            if (entity.isUser) {
-                entity = new UsergridUser(entity)
+        if (ok(response.body).has('entities')) {
+            var entities = response.body.entities.map(function(en) {
+                var entity = new UsergridEntity(en)
+                if (entity.isUser) {
+                    entity = new UsergridUser(entity)
+                }
+                return entity
+            })
+
+            _.assign(self, {
+                metadata: _.cloneDeep(response.body),
+                entities: entities
+            })
+            delete self.metadata.entities
+            self.first = _.first(entities) || undefined
+            self.entity = self.first
+            self.last = _.last(entities) || undefined   
+            if (ok(self).getIfExists('metadata.path') === '/users') {
+                self.user = self.first
+                self.users = self.entities
             }
-            return entity
-        })
 
-        _.assign(self, response, {
-            metadata: _.cloneDeep(response.body),
-            entities: entities
-        })
-        delete self.metadata.entities
-        self.first = _.first(entities) || undefined
-        self.entity = self.first
-        self.last = _.last(entities) || undefined   
-        if (ok(self).getIfExists('metadata.path') === '/users') {
-            self.user = self.first
-            self.users = self.entities
+            Object.defineProperty(self, 'hasNextPage', {
+                get: function() {
+                    return ok(self).has('metadata.cursor')
+                }
+            })
+
+            helpers.setReadOnly(self.metadata)
         }
-
-        Object.defineProperty(self, 'hasNextPage', {
-            get: function() {
-                return ok(self).has('metadata.cursor')
-            }
-        })
-
-        helpers.setReadOnly(self.metadata)
     } else {
         _.assign(self, response, {
             error: new UsergridResponseError(response.body)
@@ -52,8 +58,8 @@
 
 UsergridResponse.prototype = {
     loadNextPage: function() {
-        var args = Array.prototype.slice.call(arguments)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var args = helpers.args(arguments)
+        var callback = helpers.cb(args)
         if (!this.metadata.cursor) {
             callback()
         }
diff --git a/lib/user.js b/lib/user.js
index 82ea568..81bcb6e 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -3,8 +3,8 @@
 var UsergridEntity = require('./entity'),
     UsergridQuery = require('./query'),
     UsergridUserAuth = require('./userAuth'),
+    UsergridRequest = require('./request'),
     UsergridResponseError = require('./responseError'),
-    request = require('request'),
     helpers = require('../helpers'),
     ok = require('objectkit'),
     util = require('util'),
@@ -28,9 +28,9 @@
 
 var CheckAvailable = function() {
     var self = this
-    var args = Array.prototype.slice.call(arguments)
+    var args = helpers.args(arguments)
     var client = helpers.client.validate(args)
-    var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+    var callback = helpers.cb(args)
     var checkQuery
 
     if (args[0].username && args[0].email) {
@@ -51,76 +51,71 @@
 UsergridUser.prototype = {
     create: function() {
         var self = this
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
-        client.POST(self, function(err, usergridResponse) {
+        var callback = helpers.cb(args)
+        client.POST(self, function(error, usergridResponse) {
             delete self.password
-            _.assign(self, usergridResponse.entity)
-            callback(err || usergridResponse.error, usergridResponse, usergridResponse.user)
+            _.assign(self, usergridResponse.user)
+            callback(error, usergridResponse, usergridResponse.user)
         }.bind(self))
     },
     login: function() {
         var self = this
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         var client = helpers.client.validate(args)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
-        client.POST('token', helpers.build.userLoginBody(self), function(error, response) {
+        var callback = helpers.cb(args)
+        return new UsergridRequest({
+            client: self,
+            path: 'token',
+            method: 'POST',
+            body: helpers.build.userLoginBody(self)
+        }, function(error, usergridResponse, body) {
             delete self.password
-            if (response.statusCode === 200) {
-                self.auth = new UsergridUserAuth(response.body.user)
-                self.auth.token = response.body.access_token
-                self.auth.expiry = helpers.time.expiry(response.body.expires_in)
-                self.auth.tokenTtl = response.body.expires_in
-            } else {
-                error = new UsergridResponseError(response.body)
+            if (usergridResponse.ok) {
+                self.auth = new UsergridUserAuth(body.user)
+                self.auth.token = body.access_token
+                self.auth.expiry = helpers.time.expiry(body.expires_in)
+                self.auth.tokenTtl = body.expires_in
             }
-            callback(error || response.error, response, response.body.access_token)
-        }.bind(self))
+            callback(usergridResponse.error, usergridResponse, body.access_token)
+        })
     },
     logout: function() {
         var self = this
-        var args = _.flatten(Array.prototype.slice.call(arguments), true)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var args = helpers.args(arguments)
+        var callback = helpers.cb(args)
         if (!self.auth || !self.auth.isValid) {
             return callback({
                 name: 'no_valid_token',
                 description: 'this user does not have a valid token'
             })
         }
+        
         var client = helpers.client.validate(args)
         var revokeAll = _.first(args.filter(_.isBoolean)) || false
-        var userId = _.first([self.uuid, self.username, self.email].filter(_.isString))
-        var url = util.format("%s%s/revoketoken%s", helpers.build.url(client, {
-            type: 'user'
-        }), userId, (revokeAll) ? "s" : "")
-        request(url, {
-            headers: helpers.build.headers(client),
-            json: true,
+
+        return new UsergridRequest({
+            client: self,
+            path: util.format("users/%s/revoketoken%s", helpers.user.uniqueId(self), (revokeAll) ? "s" : ""),
             method: 'PUT',
             qs: (!revokeAll) ? {
                 token: self.auth.token
             } : undefined
-        }, function(error, response) {
-            var UsergridResponse = require('./response'),
-                usergridResponse = new UsergridResponse(response)
-            if (usergridResponse.statusCode === 200) {
-                self.auth.destroy()
-            } else {
-                error = new UsergridResponseError(response.body)
-            }
-            callback(error || usergridResponse.error, usergridResponse, (usergridResponse.statusCode === 200))
+        }, function(error, usergridResponse, body) {
+            self.auth.destroy()
+            callback(error, usergridResponse, usergridResponse.ok)
         })
     },
     logoutAllSessions: function() {
-        var args = Array.prototype.slice.call(arguments)
+        var args = helpers.args(arguments)
         args.unshift(true)
         return this.logout.apply(this, args)
     },
     resetPassword: function() {
         var self = this
-        var args = _.flatten(Array.prototype.slice.call(arguments), true)
-        var callback = helpers.cb(_.last(args.filter(_.isFunction)))
+        var args = helpers.args(arguments)
+        var callback = helpers.cb(args)
         var client = helpers.client.validate(args)
         var body = {
             oldpassword: _.isPlainObject(args[0]) ? args[0].oldPassword : _.isString(args[0]) ? args[0] : undefined,
@@ -129,22 +124,13 @@
         if (!body.oldpassword || !body.newpassword) {
             throw new Error('"oldPassword" and "newPassword" properties are required when resetting a user password')
         }
-        var userId = _.first([self.uuid, self.username, self.email].filter(_.isString))
-        var url = util.format("%s%s/password", helpers.build.url(client, {
-            type: 'user'
-        }), userId)
-        request(url, {
-            headers: helpers.build.headers(client),
-            json: true,
+        return new UsergridRequest({
+            client: self,
+            path: util.format('users/%s/password', helpers.user.uniqueId(self)),
             method: 'PUT',
             body: body
-        }, function(error, response) {
-            var UsergridResponse = require('./response'),
-                usergridResponse = new UsergridResponse(response)
-            if (usergridResponse.statusCode >= 400) {
-                error = new UsergridResponseError(response.body)
-            }
-            callback(error || usergridResponse.error, usergridResponse, (usergridResponse.statusCode < 400))
+        }, function(error, usergridResponse, body) {
+            callback(error, usergridResponse, usergridResponse.ok)
         })
     }
 }
diff --git a/lib/userAuth.js b/lib/userAuth.js
index 33cde69..e6fa8ff 100644
--- a/lib/userAuth.js
+++ b/lib/userAuth.js
@@ -1,12 +1,13 @@
 'use strict'
 
 var UsergridAuth = require('./auth'),
+    helpers = require('../helpers'),
     util = require('util'),
     _ = require('lodash')
 
 var UsergridUserAuth = function(options) {
     var self = this
-    var args = _.flatten(Array.prototype.slice.call(arguments), true)
+    var args = _.flattenDeep(helpers.args(arguments))
     if (_.isPlainObject(args[0])) {
         options = args[0]
     }
diff --git a/tests/lib/client.auth.test.js b/tests/lib/client.auth.test.js
index 41c0d92..a247948 100644
--- a/tests/lib/client.auth.test.js
+++ b/tests/lib/client.auth.test.js
@@ -13,8 +13,6 @@
     UsergridUserAuth = require('../../lib/userAuth'),
     _ = require('lodash')
 
-_.mixin(require('lodash-uuid'))
-
 var _uuid,
     _slow = 500,
     _timeout = 4000
@@ -34,8 +32,8 @@
         })
     })
 
-    it('should return a 200 ok', function() {
-        response.statusCode.should.equal(200)
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
     })
 
     it('should have a valid token', function() {
@@ -154,8 +152,8 @@
         }).throw()
     })
 
-    it('should return a 200 ok', function() {
-        response.statusCode.should.equal(200)
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
     })
 
     it('should have a valid token', function() {
@@ -190,7 +188,7 @@
         var ttlInMilliseconds = 500000        
         var userAuth = new UsergridUserAuth(config.test.username, config.test.password, ttlInMilliseconds)
         client.authenticateUser(userAuth, function(err, response, token) {
-            response.statusCode.should.equal(200)
+            response.ok.should.be.true()
             client.currentUser.auth.token.should.equal(token)
             response.body.expires_in.should.equal(ttlInMilliseconds / 1000)
             done()
diff --git a/tests/lib/client.connections.test.js b/tests/lib/client.connections.test.js
index 6f4c9a9..1a1d7ec 100644
--- a/tests/lib/client.connections.test.js
+++ b/tests/lib/client.connections.test.js
@@ -47,7 +47,7 @@
         var relationship = "foos"
 
         client.connect(entity1, relationship, entity2, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -67,7 +67,7 @@
         var relationship = "bars"
 
         client.connect(entity1, relationship, entity2.uuid, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -87,7 +87,7 @@
         var relationship = "bazzes"
 
         client.connect(entity1.type, entity1.uuid, relationship, entity2.uuid, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -107,7 +107,7 @@
         var relationship = "quxes"
 
         client.connect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -131,7 +131,7 @@
         }
 
         client.connect(options, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, options.relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[options.relationship].should.equal(urljoin(
                     "/",
@@ -233,7 +233,7 @@
         var relationship = "foos"
 
         client.disconnect(entity1, relationship, entity2, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
@@ -248,7 +248,7 @@
         var relationship = "bars"
 
         client.disconnect(entity1.type, entity1.uuid, relationship, entity2.uuid, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
@@ -263,7 +263,7 @@
         var relationship = "bazzes"
 
         client.disconnect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
@@ -282,7 +282,7 @@
         }
 
         client.disconnect(options, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, options.relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
diff --git a/tests/lib/client.init.test.js b/tests/lib/client.init.test.js
index 407132b..827863f 100644
--- a/tests/lib/client.init.test.js
+++ b/tests/lib/client.init.test.js
@@ -10,8 +10,6 @@
     UsergridAppAuth = require('../../lib/appAuth'),
     _ = require('lodash')
 
-_.mixin(require('lodash-uuid'))
-
 describe('initialization', function() {
     it('should fail to initialize without an orgId and appId', function() {
         should(function() {
diff --git a/tests/lib/client.rest.test.js b/tests/lib/client.rest.test.js
index ead846a..c3a1e3b 100644
--- a/tests/lib/client.rest.test.js
+++ b/tests/lib/client.rest.test.js
@@ -10,8 +10,6 @@
     UsergridAppAuth = require('../../lib/appAuth'),
     _ = require('lodash')
 
-_.mixin(require('lodash-uuid'))
-
 var _uuid,
     _slow = 500,
     _timeout = 4000
@@ -34,8 +32,8 @@
         client.GET(config.test.collection)
     })
 
-    it('should return a 200 ok', function() {
-        response.statusCode.should.equal(200)
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
     })
 
     it('response.entities should be an array', function() {
@@ -93,8 +91,8 @@
         client.POST(config.test.collection, {})
     })
 
-    it('should return a 200 ok', function() {
-        response.statusCode.should.equal(200)
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
     })
 
     it('response.entities should be an array', function() {
@@ -223,8 +221,8 @@
         client.PUT(config.test.collection, _uuid, {})
     })
 
-    it('should return a 200 ok', function() {
-        response.statusCode.should.equal(200)
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
     })
 
     it('response.entities should be an array with a single entity', function() {
diff --git a/tests/lib/client.test.js b/tests/lib/client.test.js
new file mode 100644
index 0000000..a6bc370
--- /dev/null
+++ b/tests/lib/client.test.js
@@ -0,0 +1,184 @@
+'use strict'
+
+var should = require('should'),
+    urljoin = require('url-join'),
+    config = require('../../helpers').config,
+    UsergridClient = require('../../lib/client'),
+    UsergridEntity = require('../../lib/entity'),
+    UsergridQuery = require('../../lib/query'),
+    UsergridAuth = require('../../lib/auth'),
+    UsergridAppAuth = require('../../lib/appAuth'),
+    _ = require('lodash')
+
+var _uuid,
+    _slow = 500,
+    _timeout = 4000
+
+describe('authenticateApp()', function() {
+
+    this.slow(_slow)
+    this.timeout(_timeout)
+
+    var response, token, client = new UsergridClient()
+    before(function(done) {
+        client.setAppAuth(config.clientId, config.clientSecret)
+        client.authenticateApp(function(err, r, t) {
+            response = r
+            token = t
+            done()
+        })
+    })
+
+    it('should fail when called without a clientId and clientSecret', function() {
+        should(function() {
+            var client = new UsergridClient()
+            client.setAppAuth(undefined, undefined, 0)
+            client.authenticateApp()
+        }).throw()
+    })
+
+    it('should authenticate by passing clientId and clientSecret in an object', function(done) {
+        var isolatedClient = new UsergridClient()
+        isolatedClient.authenticateApp(config, function(err, reponse, token) {
+            isolatedClient.appAuth.should.have.property('token').equal(token)
+            done()
+        })
+    })
+
+    it('should not set client.appAuth when authenticating with a bad UsergridAppAuth instance (using an object)', function(done) {
+        var failClient = new UsergridClient()
+        failClient.authenticateApp(new UsergridAppAuth({
+            clientId: 'BADCLIENTID',
+            clientSecret: 'BADCLIENTSECRET'
+        }), function(e, r, token) {
+            should(token).be.undefined()
+            should(failClient.appAuth).be.undefined()
+            done()
+        })
+    })
+
+    it('should not set client.appAuth when authenticating with a bad UsergridAppAuth instance (using arguments)', function(done) {
+        var failClient = new UsergridClient()
+        failClient.authenticateApp(new UsergridAppAuth('BADCLIENTID', 'BADCLIENTSECRET'), function(e, r, token) {
+            should(token).be.undefined()
+            should(failClient.appAuth).be.undefined()
+            done()
+        })
+    })
+
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
+    })
+
+    it('should have a valid token', function() {
+        token.should.be.a.String()
+        token.length.should.be.greaterThan(10)
+    })
+
+    it('client.appAuth.token should be set to the token returned from Usergrid', function() {
+        client.appAuth.should.have.property('token').equal(token)
+    })
+
+    it('client.appAuth.isValid should be true', function() {
+        client.appAuth.should.have.property('isValid').which.is.true()
+    })
+
+    it('client.appAuth.expiry should be set to a future date', function() {
+        client.appAuth.should.have.property('expiry').greaterThan(Date.now())
+    })
+})
+
+describe('authenticateUser()', function() {
+
+    this.slow(_slow)
+    this.timeout(_timeout)
+
+    var response, token, client = new UsergridClient()
+    before(function(done) {
+        client.authenticateUser({
+            username: config.test.username,
+            password: config.test.password
+        }, function(err, r, t) {
+            response = r
+            token = t
+            done()
+        })
+    })
+
+    it('should fail when called without a email (or username) and password', function() {
+        should(function() {
+            var client = new UsergridClient()
+            client.authenticateUser({})
+        }).throw()
+    })
+
+    it('response.ok should be true', function() {
+        response.ok.should.be.true()
+    })
+
+    it('should have a valid token', function() {
+        token.should.be.a.String()
+        token.length.should.be.greaterThan(10)
+    })
+
+    it('client.currentUser.auth.token should be set to the token returned from Usergrid', function() {
+        client.currentUser.auth.should.have.property('token').equal(token)
+    })
+
+    it('client.currentUser.auth.isValid should be true', function() {
+        client.currentUser.auth.should.have.property('isValid').which.is.true()
+    })
+
+    it('client.currentUser.auth.expiry should be set to a future date', function() {
+        client.currentUser.auth.should.have.property('expiry').greaterThan(Date.now())
+    })
+
+    it('client.currentUser should have a username', function() {
+        client.currentUser.should.have.property('username')
+    })
+
+    it('client.currentUser should have an email', function() {
+        client.currentUser.should.have.property('email')
+    })
+
+    it('client.currentUser and client.currentUser.auth should not store password', function() {
+        client.currentUser.should.not.have.property('password')
+        client.currentUser.auth.should.not.have.property('password')
+    })
+})
+
+describe('appAuth, setAppAuth()', function() {
+    it('should initialize by passing a list of arguments', function() {
+        var client = new UsergridClient()
+        client.setAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
+        client.appAuth.should.be.instanceof(UsergridAppAuth)
+    })
+
+    it('should be a subclass of UsergridAuth', function() {
+        var client = new UsergridClient()
+        client.setAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
+        client.appAuth.should.be.instanceof(UsergridAuth)
+    })
+
+    it('should initialize by passing an object', function() {
+        var client = new UsergridClient()
+        client.setAppAuth({
+            clientId: config.clientId,
+            clientSecret: config.clientSecret,
+            tokenTtl: config.tokenTtl
+        })
+        client.appAuth.should.be.instanceof(UsergridAppAuth)
+    })
+
+    it('should initialize by passing an instance of UsergridAppAuth', function() {
+        var client = new UsergridClient()
+        client.setAppAuth(new UsergridAppAuth(config.clientId, config.clientSecret, config.tokenTtl))
+        client.appAuth.should.be.instanceof(UsergridAppAuth)
+    })
+
+    it('should initialize by setting to an instance of UsergridAppAuth', function() {
+        var client = new UsergridClient()
+        client.appAuth = new UsergridAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
+        client.appAuth.should.be.instanceof(UsergridAppAuth)
+    })
+})
\ No newline at end of file
diff --git a/tests/lib/entity.test.js b/tests/lib/entity.test.js
index faee854..94e69e9 100644
--- a/tests/lib/entity.test.js
+++ b/tests/lib/entity.test.js
@@ -358,7 +358,7 @@
         }, function(err, postResponse) {
             var entity = new UsergridEntity(postResponse.first)
             entity.remove(function(err, deleteResponse) {
-                deleteResponse.statusCode.should.equal(200)
+                deleteResponse.ok.should.be.true()
                     // best practice is to delete the entity object here, because it no longer exists on the server
                 entity = null
                 done()
@@ -373,7 +373,7 @@
         }, function(err, postResponse) {
             var entity = new UsergridEntity(postResponse.first)
             entity.remove(client, function(err, deleteResponse) {
-                deleteResponse.statusCode.should.equal(200)
+                deleteResponse.ok.should.be.true()
                 // best practice is to delete the entity object here, because it no longer exists on the server
                 entity = null
                 done()
@@ -413,7 +413,7 @@
         var relationship = "foos"
 
         entity1.connect(relationship, entity2, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -433,7 +433,7 @@
         var relationship = "bars"
 
         entity1.connect(relationship, entity2.uuid, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -453,7 +453,7 @@
         var relationship = "bazzes"
 
         entity1.connect(relationship, entity2.type, entity2.name, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
@@ -555,7 +555,7 @@
         var relationship = "foos"
 
         entity1.disconnect(relationship, entity2, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
@@ -570,7 +570,7 @@
         var relationship = "bars"
 
         entity1.disconnect(relationship, entity2.uuid, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
@@ -585,7 +585,7 @@
         var relationship = "bazzes"
 
         client.disconnect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
diff --git a/tests/lib/response.test.js b/tests/lib/response.test.js
index 2672153..e24f2c5 100644
--- a/tests/lib/response.test.js
+++ b/tests/lib/response.test.js
@@ -39,6 +39,12 @@
     })
 })
 
+describe('ok', function() {
+    it('should be a bool', function() {
+        _response.ok.should.be.a.Boolean()
+    })
+})
+
 describe('metadata', function() {
     it('should be a read-only object', function() {
         _response.metadata.should.be.an.Object().with.any.properties(['action', 'application', 'path', 'uri', 'timestamp', 'duration'])
@@ -70,9 +76,9 @@
     it('response.users should be an array of UsergridUser objects', function(done) {
         client.setAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
         client.authenticateApp(function(err, response) {
-            should(err).be.null()
+            should(err).be.undefined()
             client.GET('users', function(err, usergridResponse) {
-                usergridResponse.statusCode.should.equal(200)
+                usergridResponse.ok.should.be.true()
                 usergridResponse.users.should.be.an.Array()
                 usergridResponse.users.forEach(function(user) {
                     user.should.be.an.instanceof(UsergridUser)
@@ -93,7 +99,7 @@
     it('response.user should be a UsergridUser object and have a valid uuid matching the first object in response.users', function(done) {
         client.setAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
         client.authenticateApp(function(err) {
-            should(err).be.null()
+            should(err).be.undefined()
             client.GET('users', function(err, usergridResponse) {
                 user = usergridResponse.user
                 user.should.be.an.instanceof(UsergridUser).with.property('uuid').equal(_.first(usergridResponse.entities).uuid)
diff --git a/tests/lib/responseError.test.js b/tests/lib/responseError.test.js
index 27a7967..6e0c3c9 100644
--- a/tests/lib/responseError.test.js
+++ b/tests/lib/responseError.test.js
@@ -25,11 +25,11 @@
     })
 
     it('response.statusCode should be greater than or equal to 400', function() {
-        _response.statusCode.should.be.greaterThanOrEqual(400)
+        _response.ok.should.be.false()
     })
 
     it('response.error should be a UsergridResponseError object with name, description, and exception keys', function() {
-        _response.statusCode.should.not.equal(200)
+        _response.ok.should.be.false()
         _response.error.should.be.an.instanceof(UsergridResponseError).with.keys(['name', 'description', 'exception'])
     })
 })
@@ -39,7 +39,7 @@
         this.slow(_slow)
         this.timeout(_timeout)
         client.GET(config.test.collection, function(err, usergridResponse) {
-            usergridResponse.statusCode.should.equal(200)
+            usergridResponse.ok.should.be.true()
             should(usergridResponse.error).be.undefined()
             done()
         })
diff --git a/tests/lib/user.test.js b/tests/lib/user.test.js
index abcfa81..8a59787 100644
--- a/tests/lib/user.test.js
+++ b/tests/lib/user.test.js
@@ -10,8 +10,6 @@
     UsergridQuery = require('../../lib/query'),
     _ = require('lodash')
 
-_.mixin(require('lodash-uuid'))
-
 var _slow = 1500,
     _timeout = 4000,
     _username1 = chance.word(),
@@ -25,8 +23,13 @@
     this.slow(_slow)
     this.timeout(_timeout)
 
-    _user1.create(function(err, usergridResponse, user) {
-        done()
+    var client = new UsergridClient()
+    var query = new UsergridQuery('users').not.eq('username', config.test.username).limit(20)
+    // clean up old user entities as the UsergridResponse tests rely on this collection containing less than 10 entities
+    client.DELETE(query, function() {
+        _user1.create(function(err, usergridResponse, user) {
+            done()
+        })
     })
 })
 
@@ -111,7 +114,7 @@
 
     it(util.format("it should log out '%s' and destroy the saved UsergridUserAuth instance", _username1), function(done) {
         _user1.logout(function(err, response, success) {
-            response.statusCode.should.equal(200)
+            response.ok.should.be.true()
             response.body.action.should.equal("revoked user token")
             _user1.auth.isValid.should.be.false()
             done()
@@ -122,7 +125,7 @@
         _user1.password = config.test.password
         _user1.login(function(err, response, token) {
             _user1.logoutAllSessions(function(err, response, success) {
-                response.statusCode.should.equal(200)
+                response.ok.should.be.true()
                 response.body.action.should.equal("revoked user tokens")
                 _user1.auth.isValid.should.be.false()
                 done()
@@ -147,7 +150,7 @@
 
     it(util.format("it should reset the password for '%s' by passing parameters", _username1), function(done) {
         _user1.resetPassword(config.test.password, '2cool4u', function(err, response, success) {
-            response.statusCode.should.equal(200)
+            response.ok.should.be.true()
             response.body.action.should.equal("set user password")
             done()
         })
@@ -158,7 +161,7 @@
             oldPassword: '2cool4u',
             newPassword: config.test.password
         }, function(err, response, success) {
-            response.statusCode.should.equal(200)
+            response.ok.should.be.true()
             response.body.action.should.equal("set user password")
             done()
         })
diff --git a/tests/main.test.js b/tests/main.test.js
index 7814a5c..8cd06c0 100644
--- a/tests/main.test.js
+++ b/tests/main.test.js
@@ -10,7 +10,7 @@
     this.params = {
         operator: 'to be a valid uuid'
     };
-    this.assert(_.isUuid(this.obj));
+    this.assert(_.isUuid(this.obj))
 })
 // end module config
 
