diff --git a/token.install b/token.install
index c2b57fd..e43e2ad 100644
--- a/token.install
+++ b/token.install
@@ -269,7 +269,7 @@ function token_get_token_problems() {
   //  }
   //}
 
-  $token_info = token_info();
+  $token_info = _token_info();
   $token_problems = array(
     'not-array' => array(
       'label' => t('The following tokens or token types are not defined as arrays:'),
@@ -319,7 +319,14 @@ function token_get_token_problems() {
           $token_problems['missing-info']['problems'][] = "\$info['tokens']['$type']['$token']";
         }
         elseif (is_array($tokens[$token]['name']) || is_array($tokens[$token]['description'])) {
-          $token_problems['duplicate']['problems'][] = "\$info['tokens']['$type']['$token']";
+          $modules = array_unique($tokens[$token]['module']);
+          foreach ($modules as &$module) {
+            $module = $module . '_token_info()';
+          }
+          $defined_by = implode(', ', $modules);
+          $message = "\$info['tokens']['$type']['$token'] - "
+              . t('Defined in !functions', array('!functions' => $defined_by));
+          $token_problems['duplicate']['problems'][] = $message;
         }
       }
     }
@@ -330,3 +337,28 @@ function token_get_token_problems() {
 
   return $token_problems;
 }
+
+function _token_info() {
+  $data = &drupal_static(__FUNCTION__);
+  if (!isset($data)) {
+    $data = array();
+    foreach (module_implements('token_info') as $module) {
+      $function = $module . '_token_info';
+      if (function_exists($function)) {
+        $result = $function();
+        if (isset($result) && is_array($result)) {
+          if (isset($result['tokens'])) {
+            foreach ($result['tokens'] as $token_type => $tokens) {
+              foreach ($tokens as $token => $info) {
+                $result['tokens'][$token_type][$token]['module'] = $module;
+              }
+            }
+          }
+          $data = array_merge_recursive($data, $result);
+        }
+      }
+    }
+    drupal_alter('token_info', $data);
+  }
+  return $data;
+}
