diff --git a/field_collection.module b/field_collection.module
index a3fea96..c402ad7 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -940,6 +940,14 @@ function field_collection_field_widget_info() {
         'default value' => FIELD_BEHAVIOR_DEFAULT,
       ),
     ),
+    'field_collection_linked' => array(
+      'label' => t('Linked'),
+      'field types' => array('field_collection'),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'default value' => FIELD_BEHAVIOR_DEFAULT,
+      ),
+    ),
   );
 }
 
@@ -950,16 +958,25 @@ function field_collection_field_widget_form(&$form, &$form_state, $field, $insta
   static $recursion = 0;
 
   switch ($instance['widget']['type']) {
+  
     case 'field_collection_hidden':
+    
       return $element;
 
     case 'field_collection_embed':
+    
       // If the field collection item form contains another field collection,
-      // we might ran into a recursive loop. Prevent that.
+      // we might run into a recursive loop. Prevent that.
       if ($recursion++ > 3) {
         drupal_set_message(t('The field collection item form has not been embedded to avoid recursive loops.'), 'error');
         return $element;
       }
+    
+      // Deliberate fall-through here.
+      // TODO: Tidy up the structure of this so it's easier to follow?
+    
+    case 'field_collection_linked':
+    
       $field_parents = $element['#field_parents'];
       $field_name = $element['#field_name'];
       $language = $element['#language'];
@@ -968,16 +985,12 @@ function field_collection_field_widget_form(&$form, &$form_state, $field, $insta
       // by appending [field_name, langcode, delta] to the current parent space.
       // That way the form values of the field collection item are separated.
       $parents = array_merge($field_parents, array($field_name, $language, $delta));
-
-      $element += array(
-        '#element_validate' => array('field_collection_field_widget_embed_validate'),
-        '#parents' => $parents,
-      );
-
+      $element['#parents'] = $parents;
+      
       if ($field['cardinality'] == 1) {
         $element['#type'] = 'fieldset';
       }
-
+      
       $field_state = field_form_get_state($field_parents, $field_name, $language, $form_state);
 
       if (isset($field_state['entity'][$delta])) {
@@ -991,30 +1004,89 @@ function field_collection_field_widget_form(&$form, &$form_state, $field, $insta
         field_form_set_state($field_parents, $field_name, $language, $form_state, $field_state);
       }
 
-      field_attach_form('field_collection_item', $field_collection_item, $element, $form_state, $language);
-
-      if (empty($element['#required'])) {
-        $element['#after_build'][] = 'field_collection_field_widget_embed_delay_required_validation';
-      }
-
-      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
-        $element['remove_button'] = array(
-          '#delta' => $delta,
-          '#name' => implode('_', $parents) . '_remove_button',
-          '#type' => 'submit',
-          '#value' => t('Remove'),
-          '#validate' => array(),
-          '#submit' => array('field_collection_remove_submit'),
-          '#limit_validation_errors' => array(),
-          '#ajax' => array(
-            'path' => 'field_collection/ajax',
-            'effect' => 'fade',
-          ),
-          '#weight' => 1000,
-        );
+      switch ($instance['widget']['type']) {
+      
+        case 'field_collection_embed':
+        
+          $element['#element_validate'] = array('field_collection_field_widget_embed_validate');
+          field_attach_form('field_collection_item', $field_collection_item, $element, $form_state, $language);
+    
+          if (empty($element['#required'])) {
+            $element['#after_build'][] = 'field_collection_field_widget_embed_delay_required_validation';
+          }
+          
+          if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
+            $element['remove_button'] = array(
+              '#delta' => $delta,
+              '#name' => implode('_', $parents) . '_remove_button',
+              '#type' => 'submit',
+              '#value' => t('Remove'),
+              '#validate' => array(),
+              '#submit' => array('field_collection_remove_submit'),
+              '#limit_validation_errors' => array(),
+              '#ajax' => array(
+                'path' => 'field_collection/ajax',
+                'effect' => 'fade',
+              ),
+              '#weight' => 1000,
+            );
+          }
+      
+          $recursion--;
+          break;
+        
+        case 'field_collection_linked':
+        
+          $widget = field_widget_instance($element, $form_state);
+          $settings = $widget['display']['default']['settings'];
+          
+          if (isset($items[$delta]['value'])) {
+            // Attach custom view mode for rendering.
+            $view = field_attach_view('field_collection_item', $field_collection_item, 'parent_form');
+            
+            // Prepare edit and delete links if user has appropriate permissions.
+            foreach (array('edit', 'delete') as $op) {
+              if ($settings[$op] && field_collection_item_access($op == 'edit' ? 'update' : $op, $field_collection_item)) {
+                $links[$op] = array(
+                  'title' => $settings[$op],
+                  'href' => $field_collection_item->path() . '/' . $op,
+                  'query' => drupal_get_destination(),
+                );
+              }
+            }
+            
+            if (isset($links)) {
+              $view['links'] = array(
+                '#theme' => 'links__field_collection_parent_form',
+                '#weight' => 1000,
+                '#links' => $links,
+              );
+              $view['links']['#attributes']['class'][] = 'field-collection-parent-form-links';
+            }
+            
+            $element['display'] = array(
+              '#type' => 'item',
+              '#markup' => render($view),
+            );
+          }
+        
+        if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
+          // Format the "add" link.
+          // TODO: what if the parent is not a node?
+          if ($instance['entity_type'] == 'node' && isset($form['#node'])) {
+            $link = array();
+            $link = field_collection_field_formatter_links($link, $instance['entity_type'], $form['#node'], $field, $instance, $langcode, $items, array('settings' => $settings));
+          }
+                      
+          // Replace the "add more" button with a link.
+          // TODO: Is it possible to alter the parent form instead of doing this in jQuery?
+          $js = 'Drupal.behaviors.fieldCollectionLinked = { attach: function() { jQuery(\'.field-widget-field-collection-linked .field-add-more-submit\').before(\'' . render($link) . '\').remove(); }}';
+          drupal_add_js($js, array('type' => 'inline', 'scope' => 'footer', 'weight' => 1000));
+        }
+        
+        break;
       }
-
-      $recursion--;
+  
       return $element;
   }
 }
