diff --git a/fb.module b/fb.module
index 7c1f4ed..1bf928e 100644
--- a/fb.module
+++ b/fb.module
@@ -1517,26 +1517,36 @@ function fb_format_username($account) {
  * hook_username_alter().
  *
  * Return a user's facebook name, instead of local username.
- * @TODO cache, because drupal doesn't, and calls this often.
  */
 function fb_username_alter(&$name, $account) {
+  static $fb_username;
   // This function can be called very early in the bootstrap process, before
   // the modules are initialized, in which case we will fail to alter the
   // name.
   if (isset($GLOBALS['_fb']) && $fbu = fb_get_fbu($account)) { // @TODO - is fb_get_fbu() a performance hit here?
-    try {
-      // Use fql query instead of graph api, because it will succeed more often.
-      $data = fb_fql_query($GLOBALS['_fb'], "SELECT name FROM user WHERE uid=$fbu", array(
-                             'access_token' => fb_get_token($GLOBALS['_fb']),
-                           ));
-      if (count($data) && isset($data[0]['name'])) {
-        $name = $data[0]['name'];
+    if (!isset($fb_usernames[$fbu])) {
+      if (($cache = cache_get("fb_usernames_$fbu")) && (!empty($cache->data))) {
+        $fb_usernames[$fbu] = unserialize($cache->data);
+      }
+      else {
+        try {
+          // Use fql query instead of graph api, because it will succeed more often.
+          $data = fb_fql_query($GLOBALS['_fb'], "SELECT name FROM user WHERE uid=$fbu", array(
+                                 'access_token' => fb_get_token($GLOBALS['_fb']),
+                               ));
+          if (count($data) && isset($data[0]['name'])) {
+            $fb_usernames[$fbu] = $data[0]['name'];
+            cache_set("fb_username_$fbu", $fb_username[$fbu]);
+          }
+        }
+        catch (Exception $e) {
+          fb_log_exception($e, t('Failed to alter username for facebook user %fbu', array(
+                                   '%fbu' => $fbu)));
+          return;
+        }
       }
     }
-    catch (Exception $e) {
-      fb_log_exception($e, t('Failed to alter username for facebook user %fbu', array(
-                               '%fbu' => $fbu)));
-    }
+    $name = $fb_username[$fbu];
   }
 }
 
