diff --git a/helpers/build.js b/helpers/build.js
index 8d46952..b83fc86 100644
--- a/helpers/build.js
+++ b/helpers/build.js
@@ -21,24 +21,25 @@
             _.isString(options.uuidOrName) ? options.uuidOrName : ""
         )
     },
-    headers: function(client, auth) {
+    headers: function(client) {
         var headers = {
             'User-Agent': util.format("usergrid-nodejs/v%s", version)
         }
-        if (ok(auth).getIfExists('isValid')) {
-            // checks if an auth param was passed to the request and uses the token if applicable
-            _.assign(headers, {
-                authorization: util.format("Bearer %s", auth.token)
-            })
+        var token
+        if (ok(client).getIfExists('tempAuth.isValid')) {
+            // if ad-hoc authentication was set in the client, get the token and destroy the auth
+            token = client.tempAuth.token
+            client.tempAuth.destroy()
         } else if (ok(client).getIfExists('authFallback') === UsergridAuth.AuthFallback.APP && ok(client).getIfExists('appAuth.isValid')) {
             // if auth-fallback is set to APP, this request will make a call using the application token
-            _.assign(headers, {
-                authorization: util.format("Bearer %s", client.appAuth.token)
-            })
+            token = client.appAuth.token
         } else if (ok(client).getIfExists('currentUser.auth.isValid')) {
             // defaults to using the current user's token
+            token = client.currentUser.auth.token
+        }
+        if (token) {
             _.assign(headers, {
-                authorization: util.format("Bearer %s", client.currentUser.auth.token)
+                authorization: util.format("Bearer %s", token)
             })
         }
         return headers
diff --git a/helpers/client.js b/helpers/client.js
index 94da11e..f278178 100644
--- a/helpers/client.js
+++ b/helpers/client.js
@@ -6,9 +6,10 @@
 module.exports = {
     validate: function(args) {
         var client
-        if (args[0] instanceof UsergridClient) {
+        if (args instanceof UsergridClient) {
+            client = args
+        } else if (args[0] instanceof UsergridClient) {
             client = args[0]
-            args.shift()
         } else if (Usergrid.isInitialized) {
             client = Usergrid
         } else {
diff --git a/lib/auth.js b/lib/auth.js
index 7d8eefa..672637b 100644
--- a/lib/auth.js
+++ b/lib/auth.js
@@ -3,21 +3,21 @@
 var UsergridAuth = function(token, expiry) {
     var self = this
 
-    self.token = token || undefined
+    self.token = token
     self.expiry = expiry || 0
 
     var usingToken = (token) ? true : false
 
     Object.defineProperty(self, "hasToken", {
         get: function() {
-            return (typeof self.token === 'string' && self.token.length > 0)
+            return (self.token) ? true : false
         },
         configurable: true
     })
 
     Object.defineProperty(self, "isExpired", {
         get: function() {
-            return usingToken || (Date.now() >= self.expiry)
+            return (usingToken) ? false : (Date.now() >= self.expiry)
         },
         configurable: true
     })
@@ -30,7 +30,8 @@
     })
 
     Object.defineProperty(self, 'tokenTtl', {
-        configurable: true
+        configurable: true,
+        writable: true
     })
 
     return self
diff --git a/lib/client.js b/lib/client.js
index 898478c..a6fb920 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -9,7 +9,6 @@
     UsergridUserAuth = require('./userAuth'),
     _ = require('lodash')
 
-console.log(UsergridAuth.AuthFallback)
 var defaultOptions = {
     baseUrl: 'https://api.usergrid.com',
     authFallback: UsergridAuth.AuthFallback.NONE
@@ -19,6 +18,8 @@
     var self = this
 
     var __appAuth
+    self.tempAuth = undefined
+    self.isSharedInstance = false
 
     if (arguments.length === 2) {
         self.orgId = arguments[0]
@@ -74,7 +75,7 @@
         return new UsergridRequest(helpers.build.getConnections(this, helpers.args(arguments)))
     },
     setAppAuth: function(options) {
-        this.appAuth = (typeof options === 'string') ? helpers.args(arguments) : options
+        this.appAuth = (_.isString(options)) ? helpers.args(arguments) : options
     },
     authenticateApp: function(options) {
         var self = this
@@ -87,14 +88,12 @@
             throw new Error('authenticateApp() failed because clientId or clientSecret are missing')
         }
 
-        var options = {
+        return new UsergridRequest({
             client: self,
             path: 'token',
             method: 'POST',
             body: helpers.build.appLoginBody(auth)
-        }
-
-        return new UsergridRequest(options, function(error, usergridResponse, body) {
+        }, function(error, usergridResponse, body) {
             if (usergridResponse.ok) {
                 if (!self.appAuth) {
                     self.appAuth = auth
@@ -118,6 +117,12 @@
             }
             callback(error, usergridResponse, token)
         })
+    },
+    usingAuth: function(auth) {
+        if (auth instanceof UsergridAuth) {
+            this.tempAuth = auth
+        }
+        return this
     }
 }
 
diff --git a/lib/entity.js b/lib/entity.js
index 3983f84..97dd01c 100644
--- a/lib/entity.js
+++ b/lib/entity.js
@@ -88,7 +88,7 @@
             helpers.setWritable(this, ['uuid', 'name', 'type', 'created'])
             _.assign(this, usergridResponse.entity)
             helpers.setReadOnly(this, ['uuid', 'name', 'type', 'created'])
-            callback(err || usergridResponse.error, usergridResponse, this)
+            callback(usergridResponse.error, usergridResponse, this)
         }.bind(this))
     },
     save: function() {
@@ -99,7 +99,7 @@
             helpers.setWritable(this, ['uuid', 'name', 'type', 'created'])
             _.assign(this, usergridResponse.entity)
             helpers.setReadOnly(this, ['uuid', 'name', 'type', 'created'])
-            callback(err || usergridResponse.error, usergridResponse, this)
+            callback(usergridResponse.error, usergridResponse, this)
         }.bind(this))
     },
     remove: function() {
@@ -107,7 +107,7 @@
         var client = helpers.client.validate(args)
         var callback = helpers.cb(args)
         client.DELETE(this, function(err, usergridResponse) {
-            callback(err || usergridResponse.error, usergridResponse, this)
+            callback(usergridResponse.error, usergridResponse, this)
         }.bind(this))
     },
     attachAsset: function() {},
diff --git a/lib/request.js b/lib/request.js
index a387a5c..641f7ad 100644
--- a/lib/request.js
+++ b/lib/request.js
@@ -9,7 +9,6 @@
     _ = require('lodash')
 
 var UsergridRequest = function(options) {
-
     var client = helpers.client.validate(options.client)
     var callback = helpers.cb(helpers.args(arguments))
 
diff --git a/lib/user.js b/lib/user.js
index 81bcb6e..dd106af 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -63,10 +63,9 @@
     login: function() {
         var self = this
         var args = helpers.args(arguments)
-        var client = helpers.client.validate(args)
         var callback = helpers.cb(args)
         return new UsergridRequest({
-            client: self,
+            client: helpers.client.validate(args),
             path: 'token',
             method: 'POST',
             body: helpers.build.userLoginBody(self)
@@ -92,11 +91,10 @@
             })
         }
         
-        var client = helpers.client.validate(args)
         var revokeAll = _.first(args.filter(_.isBoolean)) || false
 
         return new UsergridRequest({
-            client: self,
+            client: helpers.client.validate(args),
             path: util.format("users/%s/revoketoken%s", helpers.user.uniqueId(self), (revokeAll) ? "s" : ""),
             method: 'PUT',
             qs: (!revokeAll) ? {
@@ -116,7 +114,6 @@
         var self = this
         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,
             newpassword: _.isPlainObject(args[0]) ? args[0].newPassword : _.isString(args[1]) ? args[1] : undefined
@@ -125,7 +122,7 @@
             throw new Error('"oldPassword" and "newPassword" properties are required when resetting a user password')
         }
         return new UsergridRequest({
-            client: self,
+            client: helpers.client.validate(args),
             path: util.format('users/%s/password', helpers.user.uniqueId(self)),
             method: 'PUT',
             body: body
diff --git a/tests/lib/client.auth.test.js b/tests/lib/client.auth.test.js
index a247948..7797323 100644
--- a/tests/lib/client.auth.test.js
+++ b/tests/lib/client.auth.test.js
@@ -11,6 +11,7 @@
     UsergridAuth = require('../../lib/auth'),
     UsergridAppAuth = require('../../lib/appAuth'),
     UsergridUserAuth = require('../../lib/userAuth'),
+    UsergridUser = require('../../lib/user'),
     _ = require('lodash')
 
 var _uuid,
@@ -132,7 +133,8 @@
     this.slow(_slow)
     this.timeout(_timeout)
 
-    var response, token, email = util.format("%s@%s.com", chance.word(), chance.word()), client = new UsergridClient()
+    var response, token, email = util.format("%s@%s.com", chance.word(), chance.word()),
+        client = new UsergridClient()
     before(function(done) {
         client.authenticateUser({
             username: config.test.username,
@@ -185,7 +187,7 @@
 
     it('should support passing a UsergridUserAuth instance with a custom ttl', function(done) {
         var newClient = new UsergridClient()
-        var ttlInMilliseconds = 500000        
+        var ttlInMilliseconds = 500000
         var userAuth = new UsergridUserAuth(config.test.username, config.test.password, ttlInMilliseconds)
         client.authenticateUser(userAuth, function(err, response, token) {
             response.ok.should.be.true()
@@ -230,4 +232,36 @@
         client.appAuth = new UsergridAppAuth(config.clientId, config.clientSecret, config.tokenTtl)
         client.appAuth.should.be.instanceof(UsergridAppAuth)
     })
+})
+
+describe('usingAuth()', function() {
+
+    this.slow(_slow + 500)
+    this.timeout(_timeout)
+
+    var client = new UsergridClient()
+
+    it('should authenticate using an ad-hoc token', function(done) {
+        
+        client.authenticateUser({
+            username: config.test.username,
+            password: config.test.password
+        }, function(err, response, token) {
+            var authFromToken = new UsergridAuth(token)
+            authFromToken.isValid.should.be.true()
+            authFromToken.should.have.property('token')
+            client.usingAuth(authFromToken).GET({
+                path: '/users/me'
+            }, function(error, usergridResponse) {
+                usergridResponse.ok.should.be.true()
+                usergridResponse.should.have.property('user').which.is.an.instanceof(UsergridUser)
+                usergridResponse.user.should.have.property('uuid').which.is.a.uuid()
+                done()
+            })
+        })
+    })
+
+    it('client.tempAuth should be invalid after making a request ad-hoc authentication', function() {
+        client.tempAuth.isValid.should.be.false()
+    })
 })
\ No newline at end of file
diff --git a/tests/lib/user.test.js b/tests/lib/user.test.js
index 8a59787..42e2b35 100644
--- a/tests/lib/user.test.js
+++ b/tests/lib/user.test.js
@@ -65,7 +65,7 @@
             err.should.containDeep({
                 name: 'duplicate_unique_property_exists'
             })
-            usergridResponse.statusCode.should.be.greaterThanOrEqual(400)
+            usergridResponse.ok.should.be.false()
             done()
         })
     })
@@ -172,7 +172,7 @@
             oldPassword: 'BADOLDPASSWORD',
             newPassword: config.test.password
         }, function(err, response, success) {
-            response.statusCode.should.be.greaterThanOrEqual(400)
+            response.ok.should.be.false()
             err.name.should.equal('auth_invalid_username_or_password')
             _user1.remove(function(err, response) {
                 done()
diff --git a/tests/lib/usergrid.singleton.test.js b/tests/lib/usergrid.singleton.test.js
index f2d0360..aa74e72 100644
--- a/tests/lib/usergrid.singleton.test.js
+++ b/tests/lib/usergrid.singleton.test.js
@@ -5,4 +5,5 @@
 
 it('should be initialized when defined in another module', function() {
     Usergrid.isInitialized.should.be.true()
+    Usergrid.isSharedInstance.should.be.true()
 })
\ No newline at end of file
diff --git a/tests/main.test.js b/tests/main.test.js
index 8cd06c0..f4bc035 100644
--- a/tests/main.test.js
+++ b/tests/main.test.js
@@ -14,6 +14,8 @@
 })
 // end module config
 
+/* skip the following test using describe() in order to validate that
+   new tests added pass when the shared instance is not initialized */
 describe('Usergrid', function() {
     return require('./lib/usergrid.test')
 })
diff --git a/usergrid.js b/usergrid.js
index 2698c3a..eb5eb5f 100644
--- a/usergrid.js
+++ b/usergrid.js
@@ -11,6 +11,7 @@
         Object.setPrototypeOf(Usergrid, new UsergridClient(options))
         UsergridClient.call(self)
         self.isInitialized = true
+        self.isSharedInstance = true
     }
 }
 
