diff --git a/sites/all/modules/campaignmonitor/lib/campaignmonitor.class.inc b/sites/all/modules/campaignmonitor/lib/campaignmonitor.class.inc
index 7affacc..0be1522 100644
--- a/sites/all/modules/campaignmonitor/lib/campaignmonitor.class.inc
+++ b/sites/all/modules/campaignmonitor/lib/campaignmonitor.class.inc
@@ -782,6 +782,57 @@ class CampaignMonitor {
     }
     return FALSE;
   }
+  
+  /**
+   * Updates the subscriber information in a given set of newsletter lists.
+   * 
+   * @param array $listIds
+   *   An array with newsletter list ids.
+   * 
+   * @param string $old_email
+   *   The old email of the user.
+   * 
+   * @param string $new_email
+   *   The new email of the user.
+   * 
+   * @param string $name
+   *   Optional, the new name of the user. If empty, it will be ignored.
+   * 
+   * @param array $customFields
+   *   Optional, an array with custom fields.
+   */
+  public function update($listIds = array(), $old_email, $new_email, $name = '', $customFields = array()) {
+    // If there are no listIds, we consider all of them.
+    if (empty ($listIds)) {
+      $lists = $this->getLists();
+      foreach ($lists as $list_id) {
+          $listIds[] = $list_id;
+      }
+    }
+    if (!empty ($listIds)) {
+      foreach ($listIds as $listId) {
+        if ($obj = $this->createSubscriberObj($listId)) {
+          $subscriber = array(
+            'EmailAddress' => $new_email,
+            'Resubscribe' => TRUE,
+          );
+          if (!empty ($name)) {
+            $subscriber['Name'] = $name;
+          }
+          if (!empty ($customFields)) {
+            $subscriber['customFields'] = $customFields;
+          }
+          $result = $obj->update($old_email, $subscriber);
+          if (!$result->was_successful()) {
+            $this->addError(WATCHDOG_ERROR, $result->response->Message, $result->http_status_code);
+            continue;
+          }
+          $this->removeSubscriberFromCache($listId, $old_email);
+          $this->removeSubscriberFromCache($listId, $new_email);
+        }
+      }
+    }
+  }
 
   /**
    * Clears all the caches used by this wrapper object.
diff --git a/sites/all/modules/campaignmonitor/modules/campaignmonitor_user/campaignmonitor_user.module b/sites/all/modules/campaignmonitor/modules/campaignmonitor_user/campaignmonitor_user.module
index 04eaf24..2833c4f 100644
--- a/sites/all/modules/campaignmonitor/modules/campaignmonitor_user/campaignmonitor_user.module
+++ b/sites/all/modules/campaignmonitor/modules/campaignmonitor_user/campaignmonitor_user.module
@@ -38,6 +38,49 @@ function campaignmonitor_user_menu() {
 }
 
 /**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function campaignmonitor_form_campaignmonitor_admin_settings_general_alter(&$form, $form_state) {
+  $defaults = variable_get('campaignmonitor_general', array());
+  $form['campaignmonitor_general']['campaignmonitor_user_synchronize_on_update'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Synchronize the user email when updating the user account.'),
+    '#default_value' => isset($defaults['campaignmonitor_user_synchronize_on_update'])?$defaults['campaignmonitor_user_synchronize_on_update']:0,
+    '#description' => t('If checked, when the users will update their accounts and change their email addresses, they will be synchronized with the Campaign Monitor.')
+  );
+}
+
+/**
+ * Implements hook_user_update().
+ */
+function campaignmonitor_user_update(&$edit, $account, $category) {
+  // In $edit['mail'] we have the new email address, and in
+  // $account->original->mail the old one. If they are equal, do nothing.
+  if (isset ($edit['mail']) && $edit['mail'] != $account->original->mail && $category == 'account') {
+    $settings = variable_get('campaignmonitor_general', array());
+    if (isset ($settings['campaignmonitor_user_synchronize_on_update']) && $settings['campaignmonitor_user_synchronize_on_update']) {
+      $cm = CampaignMonitor::getConnector();
+      $lists = $cm->getLists();
+      $lists_to_update = array();
+      foreach ($lists as $list_id => $list) {
+        // Check if the list is selected to be shown.
+        $list_options = variable_get('campaignmonitor_list_' . $list_id, array());
+        if (campaignmonitor_is_list_enabled($list_id) && isset($list_options['display']['user']) && $list_options['display']['user']) {
+          // Check if the user is subscribed to the current list, but not yet
+          // subscribed with the new email.
+          if ($cm->isSubscribed($list_id, $account->original->mail) && !$cm->isSubscribed($list_id, $edit['mail'])) {
+            $lists_to_update[] = $list_id;
+          }
+        }
+      }
+      if (!empty ($lists_to_update)) {
+        $cm->update($lists_to_update, $account->original->mail, $edit['mail']);
+      }
+    }
+  }
+}
+
+/**
  * Access callback for the user newsletters page.
  */
 function campaignmonitor_user_access($account) {
