diff --git a/resources/user_resource.inc b/resources/user_resource.inc
index 8050696..c15e190 100644
--- a/resources/user_resource.inc
+++ b/resources/user_resource.inc
@@ -147,7 +147,6 @@ function _user_resource_definition() {
           'access callback' => 'services_access_menu',
           'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/user_resource'),
         ),
-
         'logout' => array(
           'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/user_resource'),
           'help' => 'Logout a user session',
@@ -164,6 +163,21 @@ function _user_resource_definition() {
           'access callback' => 'services_access_menu',
           'help' => t('Returns the CSRF token.'),
         ),
+        'request_new_password' => array(
+          'help' => 'Request a new password, given a user name or e-mail address',
+          'callback' => '_user_resource_request_new_password',
+          'args' => array(
+            array(
+              'name' => 'name',
+              'type' => 'string',
+              'description' => 'A valid user name or e-mail address',
+              'source' => array('data' => 'name'),
+              'optional' => FALSE,
+            ),
+          ),
+          'access callback' => 'services_access_menu',
+          'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/user_resource'),
+        ),
       ),
       'targeted_actions' => array(
         'cancel' => array(
@@ -595,6 +609,40 @@ function _user_resource_logout_1_1() {
 }
 
 /**
+ * Request a new password given a user name or e-mail address.
+ *
+ * @param $name
+ *   The username or e-mail address of the requesting account.
+ *
+ * @see https://api.drupal.org/api/drupal/modules!user!user.pages.inc/function/user_pass_validate/7
+ * @see https://api.drupal.org/api/drupal/modules!user!user.pages.inc/function/user_pass_submit/7
+ */
+function _user_resource_request_new_password($name) {
+  $name = trim($name);
+  // Try to load by email.
+  $users = user_load_multiple(array(), array('mail' => $name, 'status' => '1'));
+  $account = reset($users);
+  if (!$account) {
+    // No success, try to load by name.
+    $users = user_load_multiple(array(), array('name' => $name, 'status' => '1'));
+    $account = reset($users);
+  }
+  if (!isset($account->uid)) {
+    return services_error(t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $name)), 406);
+  }
+  // Mail one time login URL and instructions using current language.
+  global $language;
+  $mail = _user_mail_notify('password_reset', $account, $language);
+  if (!empty($mail)) {
+    watchdog('user', 'Password reset instructions mailed to %name at %email.', array('%name' => $account->name, '%email' => $account->mail));
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
  * Send a password reset email for the specified user.
  */
 function _user_resource_password_reset($uid) {
diff --git a/tests/functional/ServicesResourceUserTests.test b/tests/functional/ServicesResourceUserTests.test
index 3752a8c..7c84774 100644
--- a/tests/functional/ServicesResourceUserTests.test
+++ b/tests/functional/ServicesResourceUserTests.test
@@ -194,7 +194,7 @@ class ServicesResourceUsertests extends ServicesWebtestCase {
   function testUpdateUserName() {
     // Create user.
     $account = $this->drupalCreateUser();
-	$name = $this->randomName();
+    $name = $this->randomName();
     // Update mail of the user.
     $updated_account = array(
       'name' => $name,
@@ -636,4 +636,39 @@ class ServicesResourceUsertests extends ServicesWebtestCase {
     $this->assertTrue(strpos($response['status'], 'User is not logged in'),
       'User cannot logout when is anonymous', 'UserResource: Logout');
   }
+
+  /**
+   * Test request_new_password method.
+   */
+  function testRequestNewPassword() {
+    // Create user.
+    $account = $this->drupalCreateUser(array('administer services'));
+
+    // Request new password for user by name.
+    $data = array('name' => $account->name);
+    $response = $this->servicesPost($this->endpoint->path . '/user/request_new_password', $data);
+    $this->assertTrue($response['body'],
+      'Resource to request a new password for user name has been called successfully.',
+      'UserResource: request_new_password');
+
+    // Request new password for user by e-mail address.
+    $data = array('name' => $account->mail);
+    $response = $this->servicesPost($this->endpoint->path . '/user/request_new_password', $data);
+    $this->assertTrue($response['body'],
+      'Resource to request a new password for user name has been called successfully.',
+      'UserResource: request_new_password');
+
+    // Assert 406 response for user that does not exist.
+    $data = array('name' => $this->randomName(10) . '@example.com');
+    $response = $this->servicesPost($this->endpoint->path . '/user/request_new_password', $data);
+    $this->assertEqual(406, $response['code'],
+      'Resource to request new password for non-existing user name returned content not acceptable.',
+      'UserResource: request_new_password');
+
+    // Assert that 2 e-mails were sent in this test. The drupalGetMails()
+    // method does not provide immediate feedback about e-mails sent during the
+    // test, and so this assertion can only be done at this point.
+    $mails = $this->drupalGetMails();
+    $this->assertEqual(2, count($mails), 'Only 2 e-mails were sent during this test.');
+  }
 }
diff --git a/tests/services.test b/tests/services.test
index ee5131e..d34e52c 100644
--- a/tests/services.test
+++ b/tests/services.test
@@ -501,6 +501,9 @@ class ServicesWebTestCase extends DrupalWebTestCase {
           'register' => array(
             'enabled' => 1,
           ),
+          'request_new_password' => array(
+            'enabled' => 1,
+          ),
         ),
         'targeted_actions' => array(
           'cancel' => array(
