diff --git theme/viewfield.theme.inc theme/viewfield.theme.inc
index 4de252a..0807824 100644
--- theme/viewfield.theme.inc
+++ theme/viewfield.theme.inc
@@ -7,39 +7,44 @@
  */
 
 /**
- * Return a themed view avoiding viewfield recursion.
+ * Return a themed view avoiding infinite viewfield recursion.
  */
-function theme_viewfield_formatter_default($element) {
+function theme_viewfield_formatter_default($variables) {
   global $_viewfield_stack;
+  $item = $variables['item'];
+  $entity_type = $variables['entity_type'];
+  $entity_info = entity_get_info($entity_type);
+  $entity_id_key = $entity_info['entity keys']['id'];
+  $entity = $variables['entity'];
+  $id = isset($entity) ? $entity->{$entity_id_key} : NULL;
+  $viewstack_key = $id ? $entity_type . $id : NULL;
+  // We display up to 2 levels of viewfields as a compromise between fidelity
+  // and performance.
+  if (!isset($_viewfield_stack[$viewstack_key]) && count($_viewfield_stack) <= 2) {
+    list($view_name, $display) = explode('|', $item['vname'], 2);
+    $view_args = _viewfield_get_view_args($item['vargs'], $entity_type, $entity_id_key, $entity);
 
-  $node = $element['#node'];
-  // For safety's sake, we can only display 2 levels of viewfields.
-  if (!isset($_viewfield_stack[$node->nid]) && count($_viewfield_stack) <= 2) {
-    list($view_name, $display) = explode('|', $element['#item']['vname'], 2);
-    $view_args = _viewfield_get_view_args($element['#item']['token_enabled'], $element['#item']['vargs'], $element['#node']);
-
-    // Prevent infinite recursion.
-    if ($node->nid) {
-      $_viewfield_stack[$node->nid] = $node->nid;
+    // Stash a record of the current entity to prevent infinite recursion.
+    if ($viewstack_key) {
+      $_viewfield_stack[$viewstack_key] = $viewstack_key;
     }
 
-    // Render the view like Views would do.
+    // Render the view.
     // @see views_embed_view()
     $view = views_get_view($view_name);
     if ($view && $view->access($display)) {
       // Override the view's path to the current path. Otherwise, exposed views
       // filters would submit to the front page.
       $view->override_path = $_GET['q'];
-
       $output = $view->preview($display, $view_args);
     }
 
-    // This node is "safe" again.
-    if ($node->nid) {
-      unset($_viewfield_stack[$node->nid]);
+    // Unwind record of current entity.
+    if ($viewstack_key) {
+      unset($_viewfield_stack[$viewstack_key]);
     }
 
-    // Only return an actual view result to not break empty value behavior.
+    // Only return an actual view result respecting proper empty value behavior.
     if (isset($output)) {
       return $output;
     }
@@ -47,14 +52,14 @@ function theme_viewfield_formatter_default($element) {
 }
 
 /**
- * Perform argument replacement
+ * Perform token argument replacement
  */
-function _viewfield_get_view_args($token_enabled, $vargs, $node) {
+function _viewfield_get_view_args($vargs, $entity_type, $entity_id_key, $entity) {
   $args = array();
-  // Prevent token_replace() from running this function a second time
-  // before it completes the first time.
-  static $tokens = TRUE;
-  if ($tokens && !empty($vargs)) {
+  // Prevent token_replace() from running this function a second time before it
+  // completes the first time.
+  static $replacing_tokens = FALSE;
+  if (!$replacing_tokens && !empty($vargs)) {
     $pos = 0;
     while ($pos < strlen($vargs)) {
       $found = FALSE;
@@ -83,34 +88,52 @@ function _viewfield_get_view_args($token_enabled, $vargs, $node) {
         $pos = strlen($vargs);
       }
     }
-    if ($token_enabled) {
-      $tokens = FALSE;
-      // If the view field is being loaded as a "view field" of "view row",
-      // instead of a simple "node field", the node object is not fully populated:
-      // we need a full node to perform a correct replacement.
-      $node_values = node_load($node->nid);
-      $args = token_replace($args, 'node', $node_values);
-      $tokens = TRUE;
-    }
-    // For backwards compatibility, we scan for %nid, etc.
+
+    $replacing_tokens = TRUE;
+    $token_data = array($entity_type => $entity);
+    $entity_loaded = FALSE;
     foreach ($args as $key => $value) {
-      $args[$key] = strtr($value, array(
-        '%nid' => $node->nid,
-        '%author' => isset($node->uid) ? $node->uid : (isset($node_values->uid) ? $node_values->uid : NULL),
-        '%viewer' => $GLOBALS['user']->uid,
-      ));
+      // Load the full entity only when required.
+      if (!$entity_loaded && _viewfield_token_requires_load($value, $entity_type, $entity_id_key)) {
+        $id = $entity->{$entity_id_key};
+        $entities = entity_load($entity_type, array($id));
+        $token_data = array($entity_type => $entities[$id]);
+        $entity_loaded = TRUE;
+      }
+     $args[$key] = token_replace($value, $token_data);
     }
+    $replacing_tokens = FALSE;
   }
   return $args;
 }
 
-function theme_viewfield_select($element) {
+/**
+ *  Detect if a token requires a full entity to be loaded.
+ *  We conservatively require a load if a token refers to the entity type but
+ *  the token key is not the entity id. For example, if the $entity_type == '
+ *  node' and $entity_id_key == 'nid', we are searching for tokens of the
+ *  form [node:some-key] where some-key != 'nid'.
+ *  Global tokens (e.g., [current-user:uid]) never require entity loading.
+ */
+function _viewfield_token_requires_load($text, $entity_type, $entity_id_key) {
+  $pattern = '/^\[' . $entity_type . ':(.*)\]$/';
+  if (preg_match($pattern, $text, $matches)) {
+    return ($entity_id_key !== $matches[1]);
+  }
+  return FALSE;
+}
+
+/**
+ * Theme viewfield settings.
+ */
+function theme_viewfield_select($variables) {
+  $element = $variables['element'];
   if (!empty($element['#children'])) {
-    $field = $element['#field_info'][$element['#field_name']];
-    if ($field['multiple'] && $element['#delta'] == 0) {
+    $field = field_info_field($element['#field_name']);
+    if ($field['cardinality'] > 1 && $element['#delta'] == 0) {
       // This is needed only for multiple viewfields.
-      drupal_add_css(drupal_get_path('module', 'viewfield') .'/theme/viewfield.css');
+      drupal_add_css(drupal_get_path('module', 'viewfield') . '/theme/viewfield.css');
     }
-    return '<div class="viewfield-select">'. $element['#children'] .'</div>';
+    return '<div class="viewfield-select">' . $element['#children'] . '</div>';
   }
 }
diff --git viewfield.info viewfield.info
index 86a2245..3776de1 100644
--- viewfield.info
+++ viewfield.info
@@ -1,14 +1,11 @@
 ; $Id: viewfield.info,v 1.5 2010/08/24 23:58:27 sun Exp $
 name = Viewfield
 description = Defines a field type to display a view.
-package = CCK
+core = 7.x
+package = Fields
 dependencies[] = views
-dependencies[] = content
-core = 6.x
-
-; Information added by drupal.org packaging script on 2010-11-12
-version = "6.x-1.x-dev"
-core = "6.x"
-project = "viewfield"
-datestamp = "1289564874"
 
+files[] = viewfield.install
+files[] = viewfield.module
+files[] = includes/viewfield.views.inc
+files[] = theme/viewfield.theme.inc
diff --git viewfield.install viewfield.install
index ecbf56d..3e68e53 100644
--- viewfield.install
+++ viewfield.install
@@ -3,78 +3,37 @@
 
 /**
  * @file
- * Installation functions.
+ * Install file for the viewfield module.
  */
 
 /**
- * Implementation of hook_install().
- */
-function viewfield_install() {
-  drupal_load('module', 'content');
-  content_notify('install', 'viewfield');
-}
-
-/**
- * Implementation of hook_uninstall().
- */
-function viewfield_uninstall() {
-  drupal_load('module', 'content');
-  content_notify('uninstall', 'viewfield');
+* Implements hook_field_schema().
+*/
+function viewfield_field_schema($field) {
+  return array(
+    'columns' => array(
+       'vname' => array(
+         'type' => 'varchar',
+         'not null' => FALSE,
+         'length' => 32
+       ),
+       'vargs' => array(
+         'type' => 'varchar',
+         'not null' => FALSE,
+         'length' => 255
+       ),
+     ),
+  );
 }
 
 /**
- * Implementation of hook_enable().
+ * Initial D7 port
  *
- * Notify content module when this module is enabled.
+ *  Designed to work in any fieldable entity.
+ *  Legacy tokens (%nid, %author, %viewer) are gone since they don't play
+ *  well with entities. [node:nid] and [current-user:uid] do not cause an extra
+ *  entity load, so these tokens should perform similarly to %nid and %viewer.
+ *  Token module must be enabled for the construction of Placeholder Token list
+ *  used in editing, but the module need not be enabled to render the field
+ *  itself.
  */
-function viewfield_enable() {
-  drupal_load('module', 'content');
-  content_notify('enable', 'viewfield');
-}
-
-/**
- * Implementation of hook_disable().
- *
- * Notify content module when this module is disabled.
- */
-function viewfield_disable() {
-  drupal_load('module', 'content');
-  content_notify('disable', 'viewfield');
-}
-
-/**
- * Implementation of hook_update_N().
- */
-function viewfield_update_6000() {
-  if ($abort = content_check_update('viewfield')) {
-    return $abort;
-  }
-  $ret = array();
-  $result = db_query("SELECT * FROM {content_node_field} WHERE type = 'viewfield'");
-  while ($field = db_fetch_array($result)) {
-    $field_result = db_query("SELECT * FROM {content_node_field_instance} WHERE field_name = '%s'", $field['field_name']);
-    while ($instance = db_fetch_array($field_result)) {
-      $instance['widget_settings'] = unserialize($instance['widget_settings']);
-      $widget_settings = serialize(array('force_default' => $instance['widget_settings']['force_default']));
-      $instance['display_settings'] = unserialize($instance['display_settings']);
-      foreach ($instance['display_settings'] as $display_context => $display_setting) {
-        $instance['display_settings'][$display_context]['format'] = $display_setting['format'] == 'hidden' ? $display_setting['format'] : 'default';
-      }
-      $display_settings = serialize($instance['display_settings']);
-      $update = db_query("UPDATE {content_node_field_instance} SET widget_settings = '%s', display_settings = '%s' WHERE field_name = '%s' AND type_name = '%s'", $widget_settings, $display_settings, $instance['field_name'], $instance['type_name']);
-      $ret[] = array('success' => $result !== FALSE, 'query' => "UPDATE {content_node_field_instance} SET widget_settings = '$widget_settings', display_settings = '$display_settings' WHERE field_name = '$instance[field_name]' AND type_name = '$instance[type_name]'");
-    }
-    $display = $display_setting['format'] == 'block' ? 'block_1' : 'default';
-    $field['global_settings'] = unserialize($field['global_settings']);
-    $field['global_settings']['token_enabled'] = TRUE;
-    $super_default_widget = $field['global_settings']['super_default_widget'][0][$field['field_name']];
-    $field['global_settings']['super_default_widget'] = array(
-      'vname' => empty($super_default_widget['vnames']) ? NULL : $super_default_widget['vnames'] .'|'. $display,
-      'vargs' => $super_default_widget['vargs'],
-    );
-    $global_settings = serialize($field['global_settings']);
-    $update = db_query("UPDATE {content_node_field} SET global_settings = '%s' WHERE field_name = '%s'", $global_settings, $field['field_name']);
-    $ret[] = array('success' => $update !== FALSE, 'query' => "UPDATE {content_node_field} SET global_settings = '$global_settings' WHERE field_name = '$field[field_name]'");
-  }
-  return $ret;
-}
diff --git viewfield.module viewfield.module
old mode 100755
new mode 100644
index aabd20e..94b1320
--- viewfield.module
+++ viewfield.module
@@ -4,10 +4,12 @@
 /**
  * @file
  * Core functions.
+ *
+ * @todo Double-check potential performance issues mentioned in code comments.
  */
 
 /**
- * Implementation of hook_field_info().
+ * Implements hook_field_info().
  */
 function viewfield_field_info() {
   return array(
@@ -16,331 +18,263 @@ function viewfield_field_info() {
       // languages due to missing string translation contexts.
       'label' => t('Views'),
       'description' => t('Displays a selected view in a node.'),
-      'callbacks' => array(
-        'tables' => CONTENT_CALLBACK_NONE,
-        'arguments' => CONTENT_CALLBACK_NONE,
-      ),
+      'settings' => array('allowed_views' => array()),
+      'default_widget' => 'viewfield_select',
+      'default_formatter' => 'default',
     ),
   );
 }
 
 /**
- * Implementation of hook_field_settings().
- */
-function viewfield_field_settings($op, $field) {
-  switch ($op) {
-    case 'form':
-      $form['allowed_views'] = array(
-        '#type' => 'checkboxes',
-        '#title' => t('Allowed values'),
-        '#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(),
-        '#options' => drupal_map_assoc(array_keys(views_get_all_views())),
-        '#description' => t('Only selected views will be available for content authors. Leave empty to allow all.'),
-      );
-      $form['super_default'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Use a common default value for all nodes if the user does not override it on the node form.'),
-        '#default_value' => $field['super_default'],
-      );
-      $form['token_enabled'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Replace token placeholders'),
-        '#description' => t('Negatively affects site performance in combination with %fields row style.', array('%fields' => t('Fields'))),
-        '#default_value' => $field['token_enabled'],
-        '#access' => module_exists('token'),
-      );
-      $form_state = NULL;
-      $form['#node'] = (object) array('type' => $field['type_name']);
-      module_load_include('inc', 'content', 'includes/content.node_form');
-      $field_form = content_field_form($form, $form_state, $field, 0);
-      $form['super_default_widget'] = &$field_form[$field['field_name']][0];
-      $form['super_default_widget']['#tree'] = TRUE;
-      unset($form['super_default_widget']['#weight']);
-      return $form;
-
-    case 'validate':
-      if ($field['force_default'] && $field['multiple']) {
-        form_set_error('multiple', t('Multiple views are not supported if force default is enabled.'));
-      }
-      break;
-
-    case 'save':
-      return array('allowed_views', 'super_default', 'token_enabled', 'super_default_widget');
-
-    case 'database columns':
-      return array(
-        'vname' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 32),
-        'vargs' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 255),
-      );
-  }
+* Implements hook_field_settings_form().
+*/
+function viewfield_field_settings_form($field, $instance, $has_data) {
+  $form['allowed_views'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Allowed values'),
+    '#options' => drupal_map_assoc(array_keys(views_get_all_views())),
+    '#default_value' => is_array($field['settings']['allowed_views']) ? $field['settings']['allowed_views'] : array(),
+    '#description' => t('Only selected views will be available for content authors. Leave empty to allow all.'),
+  );
+  return $form;
 }
 
 /**
- * Implementation of hook_field().
+ * Implements hook_field_presave().
  */
-function viewfield_field($op, &$node, $field, &$items, $teaser, $page) {
-  switch ($op) {
-    case 'presave':
-      foreach ($items as $delta => $item) {
-        if ($field['super_default'] && empty($item['override_default']) || $field['widget']['force_default']) {
-          $items[$delta] = array('vname' => NULL, 'vargs' => NULL);
-        }
-        elseif (empty($item['vname'])) {
-          unset($items[$delta]);
-        }
-      }
-      break;
-
-    case 'sanitize':
-      foreach ($items as $delta => $item) {
-        $item = empty($item['vname']) || $field['widget']['force_default'] ? $field['super_default_widget'] : $item;
-        if ($field['super_default']) {
-          $item['override_default'] = !empty($item['vname']);
-        }
-        $item['token_enabled'] = _viewfield_token_enabled($field);
-        $items[$delta] = $item;
-      }
-      return array($field['field_name'] => $items);
+function viewfield_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  foreach ($items as $delta => $item) {
+    if (empty($item['vname'])) {
+      unset($items[$delta]);
+    }
   }
 }
 
 /**
- * Implementation of hook_content_is_empty().
+ * Implements hook_field_is_empty().
  */
-function viewfield_content_is_empty($item, $field) {
+function viewfield_field_is_empty($item, $field) {
   return empty($item['vname']);
 }
 
 /**
- * Implementation of hook_field_formatter_info().
+ * Implements hook_field_formatter_info().
  */
 function viewfield_field_formatter_info() {
   return array(
     'default' => array(
       'label' => t('Default'),
-      'field types' => array('viewfield')
+      'field types' => array('viewfield'),
     ),
   );
 }
 
 /**
- * Implementation of hook_widget_info().
+ * Implements hook_field_formatter_view().
+ */
+function viewfield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  include_once(drupal_get_path('module', 'viewfield') . '/theme/viewfield.theme.inc');
+  $elements = array();
+  $entity_data = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity
+  );
+  switch ($display['type']) {
+    case 'default':
+      foreach ($items as $delta => $item) {
+        $elements[$delta] = array(
+          '#markup' => theme('viewfield_formatter_default', array('item' => $item) + $entity_data),
+        );
+      }
+      break;
+  }
+  return $elements;
+}
+
+/**
+ * Implements hook_field_widget_info().
  */
-function viewfield_widget_info() {
+function viewfield_field_widget_info() {
   return array(
     'viewfield_select' => array(
       'label' => 'Select List',
       'field types' => array('viewfield'),
-      'multiple_values' => CONTENT_HANDLE_CORE,
-      'callbacks' => array(
-        'default value' => CONTENT_CALLBACK_NONE,
-      ),
+      'settings' => array('force_default' => FALSE),
     ),
   );
 }
 
 /**
- * Implementation of hook_widget_settings().
+ * Implements hook_field_widget_settings_form().
  */
-function viewfield_widget_settings($op, $widget) {
-  switch ($op) {
-    case 'form':
-      $form['force_default'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Always use default value'),
-        '#default_value' => $widget['force_default'],
-        '#description' => t('Hides this field in forms and forces the default value defined below.'),
-      );
-      return $form;
+function viewfield_field_widget_settings_form($field, $instance) {
+  $form['force_default'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Always use default value'),
+    '#default_value' => $instance['widget']['settings']['force_default'],
+    '#description' => t('Hides this field in forms and forces the default value defined below.'),
+  );
+  $form['#element_validate'] = array('viewfield_field_widget_settings_form_validate');
+  return $form;
+}
 
-    case 'save':
-      return array('force_default');
+/**
+* Implements the #element_validate callback for viewfield_field_widget_settings_form().
+*/
+function viewfield_field_widget_settings_form_validate($form, &$form_state) {
+  $field = $form_state['values']['field'];
+  $settings = $form_state['values']['instance']['widget']['settings'];
+  if ($settings['force_default'] && $field['cardinality'] != 1) {
+    form_set_error('instance][widget][settings][force_default', t('Multiple views are not supported if force default is enabled.'));
   }
 }
 
 /**
- * Implementation of hook_widget().
- */
-function viewfield_widget(&$form, &$form_state, $field, $items, $delta = 0) {
-  // Since tabledrag.js currently cannot handle nested tables, if we are
-  // adding/editing a node we have to show the token help just below the
-  // viewfield select widget.
-  if ($delta == 0 && $field['multiple'] && !$field['widget']['force_default'] && _viewfield_token_enabled($field)) {
-    $form['token_help'] = _viewfield_get_token_help($field);
-    $form['token_help']['#weight'] = $field['widget']['weight'] + 1;
-  }
-  $element = array(
-    '#type' => $field['widget']['type'],
-    '#default_value' => isset($items[$delta]) ? $items[$delta] : $field['super_default_widget'],
+* Implements hook_field_widget_form().
+*/
+function viewfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $element += array(
+    '#type' => $instance['widget']['type'],
+    '#default_value' => isset($items[$delta]) ? $items[$delta] : NULL,
   );
   return $element;
 }
 
 /**
- * Implementation of FAPI hook_elements().
+ * Implements hook_element_info().
  */
-function viewfield_elements() {
+function viewfield_element_info() {
   return array(
     'viewfield_select' => array(
       '#input' => TRUE,
-      '#columns' => array('vname', 'vargs'),
       '#delta' => 0,
+      '#columns' => array('vname', 'vargs'),
       '#process' => array('viewfield_select_process'),
+      '#theme_wrappers' => array('viewfield_select'),
     ),
   );
 }
 
-function viewfield_select_process($element, $edit, $form_state, $form) {
-  $field = $form['#field_info'][$element['#field_name']];
-  $element['#field_info'] = $form['#field_info'];
+/**
+ * Implements the #process callback for viewfield_element_info().
+ */
+function viewfield_select_process($element, &$form_state, $complete_form) {
   // This form is used for both the default value field in the admin as well as
   // the node edit form, so we have to make sure we show the default value field
   // always.
-  $node = isset($form['#node']) ? $form['#node'] : (object) array('type' => $field['type_name']);
-  $field_settings = !isset($node->uid);
+  $is_field_settings_form = !isset($complete_form['#node']);
 
-  if ($field['widget']['force_default'] && !$field_settings) {
-    $element['vname'] = array(
-      '#type' => 'value',
-      '#value' => $element['#default_value']['vname'],
-    );
-    $element['vargs'] = array(
-      '#type' => 'value',
-      '#value' => $element['#default_value']['vargs'], // All views share args (for now).
-    );
+  $field = field_widget_field($element, $form_state);
+  $instance = field_widget_instance($element, $form_state);
+  $widget = $instance['widget'];
+  $element['#field'] = $field;
+  // Display the form to let the user pick a view.
+  $options = _viewfield_potential_references($field, $instance, $element['#delta']);
+  $element['vname'] = array(
+    '#type' => 'select',
+    '#title' => $element['#title'],
+    '#options' => $options,
+    '#default_value' => $element['#default_value']['vname'],
+    '#required' => $instance['required'],
+    '#access' => $is_field_settings_form || !$widget['settings']['force_default'],
+    '#description' => $element['#description'],
+  );
+  // If there is only one option, only show arguments.
+  if (count($options) == 1 && !$is_field_settings_form) {
+    list($key, $label) = each($options);
+    $element['vname']['#access'] = FALSE;
+    $element['vname']['#default_value'] = $key;
   }
-  else {
-    // Display the form to let the user pick a view.
-    $options = _viewfield_potential_references($field, $element['#delta']);
-    // Provide our own overriding of defaults.
-    if ($field['super_default'] && !$field_settings) {
-      $element['override_default'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Override default'),
-        '#default_value' => $element['#value']['override_default'],
+
+  $element['vargs'] = array(
+    '#type' => 'textfield',
+    '#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array(
+      '%field' => $instance['label'],
+      '@value' => $label,
+    )),
+    '#default_value' => $element['#default_value']['vargs'],
+    '#access' => $is_field_settings_form || !$widget['settings']['force_default'],
+    '#description' => t('A comma separated list of arguments to pass to the selected view. Wrap arguments containing commas in double quotes. Replace double quotes in arguments with two double quotes.'),
+  );
+
+  if (module_exists('token')) {
+    $element['vargs']['#description'] .=
+      '<br />' . t('Available tokens: any token from the placeholder token list.')
+      . '<br />' . t('Note: Using placeholder tokens in combination with the %fields row style may negatively affect site performance.', array('%fields' => t('Fields')));
+    // Only show token help for first value or in field settings form.
+    if ($element['#delta'] == 0 && !$widget['settings']['force_default']) {
+      $element['token_help'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Placeholder tokens'),
+        '#collapsible' => TRUE,
+        '#collapsed' => TRUE,
       );
-    }
-    if (count($options) > 1) {
-      $element['vname'] = array(
-        '#type' => 'select',
-        '#options' => $options,
-        '#default_value' => $element['#default_value']['vname'],
-        '#title' => $element['#title'],
-        '#required' => $element['#required'],
-        '#description' => $element['#description'],
+      $token_types = array(
+        'token_types' => array($element['#entity_type']),
+        'global_types' => TRUE,
       );
-    }
-    else {
-      // There's only the one view, so only show the arguments.
-      list($key, $label) = each($options);
-      $element['vname'] = array(
-        '#type' => 'value',
-        '#value' => $key,
+      $element['token_help']['tokens'] = array(
+        '#markup' => theme('token_tree', $token_types),
       );
     }
-    $element['vargs'] = array(
-      '#type' => 'textfield',
-      '#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array(
-        '%field' => $field['widget']['label'],
-        '@value' => $label,
-      )),
-      '#default_value' => $element['#default_value']['vargs'],
-      '#required' => FALSE,
-      '#description' => t('Provide a comma separated list of arguments to pass to the view. These arguments will be passed to EACH selected view. If an argument contains commas or double quotes, enclose it in double quotes. Replace double quotes that are part of the argument with pairs of double quotes.'),
-    );
-    $token_desc = ($token_enabled = _viewfield_token_enabled($field)) ?
-      t('Use the syntax [token] if you want to insert a replacement pattern.') :
-      t('You may use %nid for the node id of the current node. %author for the node author and %viewer for user viewing the node.');
-    $element['vargs']['#description'] .= "<br/>\n$token_desc";
-    // Since tabledrag.js currently cannot handle nested tables, we show the
-    // token help inside the fieldset only in the field settings form or in
-    // single-value mode.
-    if ($token_enabled && ($field_settings || !$field['multiple'])) {
-      $element['token_help'] = _viewfield_get_token_help($field);
-    }
   }
+  else {
+    $entity_info = entity_get_info($element['#entity_type']);
+    $entity_id_token = '[' . $element['#entity_type'] . ':' . $entity_info['entity keys']['id'] . ']';
+    $element['vargs']['#description'] .=
+    '<br />' . t('You may use %entity-id-token for the id of the current entity.', array('%entity-id-token' => $entity_id_token))
+    . '<br />' . t('Enable the %token module to get a complete listing of replacement tokens.', array('%token' => t('Token')));
+  }
+
   return $element;
 }
 
 /**
  * Prepare a list of views for selection.
  */
-function _viewfield_potential_references($field, $delta = 0) {
+function _viewfield_potential_references($field, $instance, $delta = 0) {
   $options = array();
-  if (isset($field['allowed_views']) && is_array($field['allowed_views'])) {
-    $field['allowed_views'] = array_filter($field['allowed_views']);
+  if (isset($field['settings']['allowed_views']) && is_array($field['settings']['allowed_views'])) {
+    $field['settings']['allowed_views'] = array_filter($field['settings']['allowed_views']);
   }
   else {
-    $field['allowed_views'] = array_keys(views_get_all_views());
+    $field['settings']['allowed_views'] = array_keys(views_get_all_views());
   }
-  foreach ($field['allowed_views'] as $view_name) {
+  foreach ($field['settings']['allowed_views'] as $view_name) {
     $view = views_get_view($view_name);
     foreach ($view->display as $display) {
-      $options[$view->name .'|'. $display->id] = $view->name .' - '. $display->display_title;
+      $options[$view->name . '|' . $display->id] = $view->name . ' - ' . $display->display_title;
     }
   }
   // Add a '0' option for non-required or subsequent values of multiple fields.
-  if (!$field['required'] || ($field['multiple'] && $delta > 0)) {
-    array_unshift($options, '<'. t('none') .'>');
+  if (!$instance['required'] || ($field['cardinality'] > 1 && $delta > 0)) {
+    array_unshift($options, '<' . t('none') . '>');
   }
   return $options;
 }
 
 /**
- * Return the token replacement help
- */
-function _viewfield_get_token_help($field) {
-  // TODO: Token support right now is a bit hacked on, needs better integration,
-  // eventually a checkbox to enable/disable use of token-module here.
-  $token_help = array(
-    '#title' => t('Token replacement patterns'),
-    '#type' => 'fieldset',
-    '#collapsible' => TRUE,
-    '#collapsed' => TRUE,
-    '#weight' => $field['widget']['weight']
-  );
-  $token_help['help'] = array(
-    '#value' => theme('token_help', 'node'),
-  );
-  return $token_help;
-}
-
-/**
- * Implementation of hook_theme().
+ * Implements hook_theme().
  */
 function viewfield_theme() {
   return array(
     'viewfield_select' => array(
-      'arguments' => array('element' => NULL),
+      'render element' => 'element',
       'file' => 'theme/viewfield.theme.inc',
     ),
     'viewfield_formatter_default' => array(
-      'arguments' => array('element' => NULL),
+      'render element' => 'element',
       'file' => 'theme/viewfield.theme.inc',
     ),
   );
 }
 
 /**
- * Implementation of hook_views_api().
+ * Implements hook_views_api().
  */
 function viewfield_views_api() {
   return array(
     'api' => 2.0,
-    'path' => drupal_get_path('module', 'viewfield') .'/includes',
+    'path' => drupal_get_path('module', 'viewfield') . '/includes',
   );
 }
-
-/**
- * If the super defaults are enabled return them, otherwise return blank values
- */
-function _viewfield_get_super_defaults($field) {
-  return $field['super_default'] ? $field['super_default_widget'] : array('vname' => NULL, 'vargs' => NULL);
-}
-
-/**
- * Check if the token replacements are enabled
- */
-function _viewfield_token_enabled($field) {
-  return $field['token_enabled'] && module_exists('token');
-}
