diff --git a/node_reference/node_reference.module b/node_reference/node_reference.module
index 9c05a6b..8d479ea 100644
--- a/node_reference/node_reference.module
+++ b/node_reference/node_reference.module
@@ -724,18 +724,28 @@ function node_reference_field_widget_error($element, $error, $form, &$form_state
  *
  * @param $field
  *   The field definition.
+ * @param $flat
+ *   Whether optgroups are allowed.
  *
  * @return
- *   An array of referenceable node titles, keyed by node id.
+ *   An array of referenceable node titles, keyed by node id. If the $flat
+ *   parameter is TRUE, the list might be nested by optgroup first.
  */
-function _node_reference_options($field) {
+function _node_reference_options($field, $flat = TRUE) {
   $references = node_reference_potential_references($field);
 
   $options = array();
   foreach ($references as $key => $value) {
     // We use the richer 'rendered' value rather than the raw title, but we must
     // take care of removing tags and leaving HTML entities unencoded.
-    $options[$key] = html_entity_decode(strip_tags($value['rendered']), ENT_QUOTES);;
+    $label = html_entity_decode(strip_tags($value['rendered']), ENT_QUOTES);
+    if (empty($value['group']) || $flat) {
+      $options[$key] = $label;
+    }
+    else {
+      $group = html_entity_decode(strip_tags($value['group']), ENT_QUOTES);
+      $options[$group][$key] = $label;
+    }
   }
 
   return $options;
@@ -983,7 +993,7 @@ function node_reference_field_prepare_translation($entity_type, $entity, $field,
  * Implements hook_options_list().
  */
 function node_reference_options_list($field) {
-  return _node_reference_options($field);
+  return _node_reference_options($field, FALSE);
 }
 
 /**
diff --git a/references.module b/references.module
index 73876f2..4314b06 100644
--- a/references.module
+++ b/references.module
@@ -70,6 +70,8 @@ function references_views_plugins() {
         'theme' => 'views_view_unformatted',
         'uses row plugin' => TRUE,
         'uses fields' => TRUE,
+        'uses options' => TRUE,
+        'uses grouping' => TRUE,
         'type' => 'references',
         'even empty' => TRUE,
       ),
diff --git a/user_reference/user_reference.module b/user_reference/user_reference.module
index 14e011f..11c0e89 100644
--- a/user_reference/user_reference.module
+++ b/user_reference/user_reference.module
@@ -758,14 +758,21 @@ function user_reference_field_widget_error($element, $error, $form, &$form_state
  * @return
  *   An array of referenceable user names, keyed by user id.
  */
-function _user_reference_options($field) {
+function _user_reference_options($field, $flat = TRUE) {
   $references = user_reference_potential_references($field);
 
   $options = array();
   foreach ($references as $key => $value) {
     // We use the richer 'rendered' value rather than the raw title, but we must
     // take care of removing tags and leaving HTML entities unencoded.
-    $options[$key] = html_entity_decode(strip_tags($value['rendered']), ENT_QUOTES);;
+    $label = html_entity_decode(strip_tags($value['rendered']), ENT_QUOTES);
+    if (empty($value['group']) || $flat) {
+      $options[$key] = $label;
+    }
+    else {
+      $group = html_entity_decode(strip_tags($value['group']), ENT_QUOTES);
+      $options[$group][$key] = $label;
+    }
   }
 
   return $options;
@@ -943,7 +950,7 @@ function user_reference_autocomplete($entity_type, $bundle, $field_name, $string
  * Implements hook_options_list().
  */
 function user_reference_options_list($field) {
-  return _user_reference_options($field);
+  return _user_reference_options($field, FALSE);
 }
 
 /**
diff --git a/views/references_plugin_style.inc b/views/references_plugin_style.inc
index 4569469..26626ce 100644
--- a/views/references_plugin_style.inc
+++ b/views/references_plugin_style.inc
@@ -36,6 +36,7 @@ class references_plugin_style extends views_plugin_style {
         // Collect the rendered row, and the raw title value.
         $results[$values->{$id_field_alias}] = array(
           'rendered' => $rendered,
+          'group' => $title,
           'title' => $this->view->field[$title_field]->get_value($values),
         );
 
