diff --git a/includes/DrupalOAuthToken.inc b/includes/DrupalOAuthToken.inc
index 531acf0..f683386 100644
--- a/includes/DrupalOAuthToken.inc
+++ b/includes/DrupalOAuthToken.inc
@@ -213,6 +213,40 @@ class DrupalOAuthToken extends OAuthToken {
   }
 
   /**
+   * Gets the token based on the service and the user id
+   *
+   * @param int $uid
+   * @param object $consumer
+   * @return Ambigous <DrupalOAuthToken, NULL>
+   */
+  public static function loadByUserService($uid, $consumer = TRUE) {
+    $fields = 't.*';
+    $join   = '';
+    $where = '';
+
+    if (!$consumer || is_object($consumer) && $consumer->provider_consumer) {
+      $fields .= ', pt.created, pt.changed, pt.services, pt.authorized';
+      $join = 'INNER JOIN {oauth_common_provider_token} pt ON pt.tid = t.tid';
+    }
+
+    // Only fetch non-provider tokens - needed for backwards compatibility with deprecated DrupalOAuthToken::load() from 6.x-3.0-beta3
+    if ($consumer === TRUE) {
+      $join = 'LEFT JOIN {oauth_common_provider_token} pt ON pt.tid = t.tid';
+      $where .= ' AND pt.tid IS NULL';
+    }
+    else if ($consumer) {
+      $where .= 't.csid = %d';
+      $values[':consumer'] = $consumer->csid;
+    }
+
+    $where .= ($where? ' AND ' : ' ') . 't.uid = %d AND expires <= %d';
+    $values[':user'] = $uid;
+    $values[':time'] = time();
+
+    return self::fromResult(db_query("SELECT " . $fields . " FROM {oauth_common_token} t " . $join . " WHERE " . $where, $values), $consumer);
+  }
+
+  /**
    * Constructs a token from a db-result resource
    *
    * @param resource $res
diff --git a/oauth_common.pages.inc b/oauth_common.pages.inc
index 7ffee8d..b3c46fe 100644
--- a/oauth_common.pages.inc
+++ b/oauth_common.pages.inc
@@ -105,6 +105,33 @@ function oauth_common_form_authorize() {
       return drupal_access_denied();
     }
 
+    // Get previous token of user for this consumer
+    $auth_token = DrupalOAuthToken::loadByUserService($user->uid, $consumer);
+
+    // If authorized, replace the token and redirect user
+    // else continue
+    if ($auth_token->authorized == 1 && !empty($consumer->callback_url))
+    {
+      $token->authorized = 1;
+      $token->uid = $user->uid;
+      $token->services = $auth_token->services;
+      $token->write(TRUE);
+
+      // Delete old token
+      $auth_token->delete();
+
+      // Pick the callback url apart and add the token parameter
+      $callback = parse_url($consumer->callback_url);
+      $query = array();
+      parse_str($callback['query'], $query);
+      $query['oauth_token'] = $token->key;
+      $callback['query'] = http_build_query($query, 'idx_', '&');
+
+      // Return to the consumer site
+      header('Location: ' . _oauth_common_glue_url($callback), TRUE, 302);
+      exit;
+    }
+
     if (!empty($context->authorization_options['automatic_authorization']) && $context->authorization_options['automatic_authorization'] && !empty($consumer->callback_url)) {
       // Authorize the request token
       $token->uid = $user->uid;
