Added UsergridUser.resetPassword(), defaulted authFallback=NONE
diff --git a/lib/auth.js b/lib/auth.js
index 06033c2..3a20da3 100644
--- a/lib/auth.js
+++ b/lib/auth.js
@@ -42,4 +42,8 @@
     }
 }
 
-module.exports = UsergridAuth
\ No newline at end of file
+module.exports = UsergridAuth
+module.exports.AuthFallback = {
+    APP: 'APP',
+    NONE: 'NONE'
+}
\ No newline at end of file
diff --git a/lib/client.js b/lib/client.js
index 4f8e927..f15e340 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -5,18 +5,15 @@
     helpers = require('../helpers'),
     UsergridResponse = require('./response'),
     UsergridResponseError = require('./responseError'),
+    UsergridAuth = require('./auth'),
     UsergridAppAuth = require('./appAuth'),
     UsergridUserAuth = require('./userAuth'),
     _ = require('lodash')
 
-var AuthFallback = {
-    APP: 'APP',
-    NONE: 'NONE',
-}
-
+console.log(UsergridAuth.AuthFallback)
 var defaultOptions = {
     baseUrl: 'https://api.usergrid.com',
-    authFallback: AuthFallback.NONE,
+    authFallback: UsergridAuth.AuthFallback.NONE
 }
 
 var UsergridClient = function(options) {
@@ -68,10 +65,6 @@
     DELETE: function() {
         return new UsergridRequest(helpers.build.DELETE(this, Array.prototype.slice.call(arguments)))
     },
-    connections: {
-        DIRECTION_IN: "IN",
-        DIRECTION_OUT: "OUT"
-    },
     connect: function() {
         var Usergrid = require('../usergrid')
         if (this === Usergrid && !Usergrid.isInitialized) {
@@ -164,4 +157,8 @@
     }
 }
 
-module.exports = UsergridClient
\ No newline at end of file
+module.exports = UsergridClient
+module.exports.Connections = {
+    DIRECTION_IN: "IN",
+    DIRECTION_OUT: "OUT"
+}
\ No newline at end of file
diff --git a/lib/request.js b/lib/request.js
index 67a35de..86fd853 100644
--- a/lib/request.js
+++ b/lib/request.js
@@ -5,6 +5,7 @@
     UsergridResponse = require('../lib/response'),
     UsergridQuery = require('../lib/query'),
     util = require('util'),
+    ok = require('objectkit'),
     _ = require('lodash')
 
 var UsergridRequest = function(options) {
@@ -14,11 +15,20 @@
 
     var headers = helpers.userAgent
 
-    if (options.client.appAuth && options.client.appAuth.isValid) {
+    var UsergridAuth = require('../lib/auth')
+
+    if (ok(options).getIfExists('auth.isValid')) {
+        // Checks if an auth param was passed to the request and uses the token if applicable
+        _.assign(headers, {
+            authorization: util.format("Bearer %s", options.auth.token)
+        })
+    } else if (options.client.authFallback === UsergridAuth.AuthFallback.APP && ok(options).getIfExists('client.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", options.client.appAuth.token)
         })
     }
+
     request(helpers.build.url(options.client, options), {
         headers: headers,
         body: options.body,
diff --git a/lib/user.js b/lib/user.js
index b3d5719..d43a3d2 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -66,7 +66,6 @@
             })
         }
         var client = helpers.client.validate(args)
-        var path
         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, {
@@ -94,7 +93,37 @@
         var args = Array.prototype.slice.call(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 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,
+        }
+        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.userAgent,
+            json: true,
+            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))
+        })
+    },
 }
 
 util.inherits(UsergridUser, UsergridEntity)
diff --git a/tests/lib/client.connections.test.js b/tests/lib/client.connections.test.js
index c1a8036..6f4c9a9 100644
--- a/tests/lib/client.connections.test.js
+++ b/tests/lib/client.connections.test.js
@@ -48,7 +48,7 @@
 
         client.connect(entity1, relationship, entity2, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -68,7 +68,7 @@
 
         client.connect(entity1, relationship, entity2.uuid, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -88,7 +88,7 @@
 
         client.connect(entity1.type, entity1.uuid, relationship, entity2.uuid, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -108,7 +108,7 @@
 
         client.connect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -132,7 +132,7 @@
 
         client.connect(options, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, options.relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, options.relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[options.relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -176,7 +176,7 @@
 
         var relationship = "foos"
 
-        client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+        client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
             usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                 "/",
                 config.test.collection,
@@ -196,7 +196,7 @@
 
         var relationship = "foos"
 
-        client.getConnections(client.connections.DIRECTION_IN, entity2, relationship, function(err, usergridResponse) {
+        client.getConnections(UsergridClient.Connections.DIRECTION_IN, entity2, relationship, function(err, usergridResponse) {
             usergridResponse.first.metadata.connections[relationship].should.equal(urljoin(
                 "/",
                 config.test.collection,
@@ -234,7 +234,7 @@
 
         client.disconnect(entity1, relationship, entity2, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
             })
@@ -249,7 +249,7 @@
 
         client.disconnect(entity1.type, entity1.uuid, relationship, entity2.uuid, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
             })
@@ -264,7 +264,7 @@
 
         client.disconnect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
             })
@@ -283,7 +283,7 @@
 
         client.disconnect(options, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, options.relationship, function(err, usergridResponse) {
+            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/entity.test.js b/tests/lib/entity.test.js
index 47aa8fb..faee854 100644
--- a/tests/lib/entity.test.js
+++ b/tests/lib/entity.test.js
@@ -414,7 +414,7 @@
 
         entity1.connect(relationship, entity2, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -434,7 +434,7 @@
 
         entity1.connect(relationship, entity2.uuid, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -454,7 +454,7 @@
 
         entity1.connect(relationship, entity2.type, entity2.name, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                     "/",
                     config.test.collection,
@@ -498,7 +498,7 @@
 
         var relationship = "foos"
 
-        entity1.getConnections(client.connections.DIRECTION_OUT, relationship, function(err, usergridResponse) {
+        entity1.getConnections(UsergridClient.Connections.DIRECTION_OUT, relationship, function(err, usergridResponse) {
             usergridResponse.first.metadata.connecting[relationship].should.equal(urljoin(
                 "/",
                 config.test.collection,
@@ -518,7 +518,7 @@
 
         var relationship = "foos"
 
-        entity2.getConnections(client.connections.DIRECTION_IN, relationship, function(err, usergridResponse) {
+        entity2.getConnections(UsergridClient.Connections.DIRECTION_IN, relationship, function(err, usergridResponse) {
             usergridResponse.first.metadata.connections[relationship].should.equal(urljoin(
                 "/",
                 config.test.collection,
@@ -556,7 +556,7 @@
 
         entity1.disconnect(relationship, entity2, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
             })
@@ -571,7 +571,7 @@
 
         entity1.disconnect(relationship, entity2.uuid, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
                 usergridResponse.entities.should.be.an.Array().with.lengthOf(0)
                 done()
             })
@@ -586,7 +586,7 @@
 
         client.disconnect(entity1.type, entity1.name, relationship, entity2.type, entity2.name, function(err, usergridResponse) {
             usergridResponse.statusCode.should.equal(200)
-            client.getConnections(client.connections.DIRECTION_OUT, entity1, relationship, function(err, usergridResponse) {
+            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/user.test.js b/tests/lib/user.test.js
index 8a853b6..43151b9 100644
--- a/tests/lib/user.test.js
+++ b/tests/lib/user.test.js
@@ -133,12 +133,53 @@
     it("it should return an error when attempting to log out a user that does not have a valid token", function(done) {
         _user1.logout(function(err, response, success) {
             err.should.containDeep({
-                    name: 'no_valid_token'
-                })
-                // cleanup
-            _user1.remove(function(err, response) {
+                name: 'no_valid_token'
+            })
+            done()
+        })
+    })
+})
+
+describe('resetPassword()', function() {
+
+    this.slow(_slow)
+    this.timeout(_timeout)
+
+    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.body.action.should.equal("set user password")
+            done()
+        })
+    })
+
+    it(util.format("it should reset the password for '%s' by passing an object", _username1), function(done) {
+        _user1.resetPassword({
+            oldPassword: '2cool4u',
+            newPassword: config.test.password
+        }, function(err, response, success) {
+            response.statusCode.should.equal(200)
+            response.body.action.should.equal("set user password")
+            done()
+        })
+    })
+
+    it(util.format("it should not reset the password for '%s' when passing a bad old password", _username1), function(done) {
+        _user1.resetPassword({
+            oldPassword: 'BADOLDPASSWORD',
+            newPassword: config.test.password
+        }, function(err, response, success) {
+            response.statusCode.should.be.greaterThanOrEqual(400)
+            err.name.should.equal('auth_invalid_username_or_password')
+             _user1.remove(function(err, response) {
                 done()
             })
         })
     })
+
+    it("it should return an error when attempting to reset a password with missing arguments", function() {
+        should(function() {
+            _user1.resetPassword('NEWPASSWORD', function() {})
+        }).throw()
+    })
 })
\ No newline at end of file