diff --git a/tokenauth.module b/tokenauth.module
--- a/tokenauth.module
+++ b/tokenauth.module
@@ -46,16 +46,7 @@ function tokenauth_menu() {
     'file' => 'tokenauth.pages.inc',
     'type' => MENU_CALLBACK
   );
-  $items['user/%user/tokenauth'] = array(
-    'title' => 'Token authentication',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('tokenauth_user_profile_form', 1),
-    'access callback' => 'tokenauth_profile_access',
-    'access arguments' => array(1),
-    'file' => 'tokenauth.pages.inc',
-    'type' => MENU_LOCAL_TASK,
-  );
-  $items['user/%user/tokenauth/reset'] = array(
+  $items['user/%user/tokenauth-reset'] = array(
     'title' => 'Reset token',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tokenauth_user_reset_confirm'),
@@ -187,6 +178,49 @@ function tokenauth_user_delete(&$edit, &$account, $category = NULL) {
 }
 
 /**
+ * Implements hook_user_view().
+ */
+function tokenauth_user_view($account) {
+  global $user;
+
+  if (!isset($account->content['tokenauth'])) {
+    $account->content['tokenauth'] = array();
+  }
+  $account->content['tokenauth'] += array(
+    '#type' => 'user_profile_category',
+    '#attributes' => array('class' => array('tokenauth-token')),
+    '#weight' => 20,
+    '#title' => t('Access token'),
+    '#access' => $user->uid == $account->uid,
+  );
+  $account->content['tokenauth']['token'] = array(
+    '#title' => t('Access token'),
+    '#type' => 'user_profile_item',
+    '#markup' => tokenauth_user_text($account),
+  );
+  $account->content['tokenauth']['reset'] = array(
+    '#title' => t('Reset'),
+    '#type' => 'user_profile_item',
+    '#markup' => l(t('Reset your token'), 'user/' . $account->uid . '/tokenauth-reset', array(
+      'query' => array(
+        'destination' => 'user/' . $account->uid,
+      )
+    )),
+  );
+}
+
+function tokenauth_user_text($account) {
+  $text = tokenauth_text_load($account, TRUE);
+  if (!module_exists('token')) {
+    $key = tokenauth_get_token_key();
+    $token = tokenauth_get_token($account->uid);
+    $text .= "<p><strong>" . t('Your token:') . "</strong> ?$key=<code>$token</code></p>";
+  }
+
+  return $text;
+}
+
+/**
  * Get the URL querystring key.
  *
  * @return string
@@ -195,6 +229,21 @@ function tokenauth_get_token_key() {
   return variable_get('tokenauth_token_key', 'token');
 }
 
+/**
+ * Implements hook_field_extra_fields().
+ */
+function tokenauth_field_extra_fields() {
+  $return['user']['user']['display'] = array(
+    'tokenauth' => array(
+      'label' => 'Access token',
+      'description' => t('Token authentication access token.'),
+      'weight' => 20,
+    ),
+  );
+
+  return $return;
+}
+
 /// Token Integration ///
 
 /**
diff --git a/tokenauth.pages.inc b/tokenauth.pages.inc
--- a/tokenauth.pages.inc
+++ b/tokenauth.pages.inc
@@ -125,18 +125,3 @@ function tokenauth_user_reset_confirm_submit($form, &$form_state) {
   drupal_set_message(t('The token has been reset.'));
   $form_state['redirect'] = 'user/' . $form['uid']['#value'] . '/tokenauth';
 }
-
-/**
- * Menu callback. Prints the token and instructions.
- */
-function tokenauth_user_profile_form($form, &$form_state, $account) {
-  drupal_set_title($account->name);
-  $token = tokenauth_get_token($account->uid);
-  $form['preamble'] = array('#markup' => tokenauth_text_load($account, TRUE));
-  if (!module_exists('token')) {
-    $key = tokenauth_get_token_key();
-    $form['preamble']['#markup'] .= "<p><strong>" . t('Your token:') . "</strong> ?$key=<code>$token</code></p>";
-  }
-  $form = array_merge($form, tokenauth_reset_user_form($account->uid, NULL, $token));
-  return $form;
-}
