Index: includes/nodereference_explorer.util.inc
===================================================================
--- includes/nodereference_explorer.util.inc	(revision 3418)
+++ includes/nodereference_explorer.util.inc	(working copy)
@@ -250,4 +250,17 @@
  */
 function nodereference_explorer_util_is_not_zero($var) {
   return $var != '0' ? TRUE : FALSE;
+}
+
+/**
+ * Parse the element's widget value, e. g. "test [nid:222]" into its parts, i. e. node title and id.
+ * @param $value
+ *   string in format of "NODETITLE [nid:NID]" 
+ * @return
+ *   associative array with 'nid' (node id) and 'title' keys
+ */
+function nodereference_explorer_util_parse_widget_value($value) {
+  $matches = array();
+  preg_match('/^(?:\s*|(?P<title>.*) )?\[\s*nid\s*:\s*(?P<nid>\d+)\s*\]$/', $value, $matches);
+  return $matches;
 }
\ No newline at end of file
Index: includes/nodereference_explorer.menu.inc
===================================================================
--- includes/nodereference_explorer.menu.inc	(revision 3418)
+++ includes/nodereference_explorer.menu.inc	(working copy)
@@ -271,11 +271,8 @@
  */
 function nodereference_explorer_preview($type_name, $field_name) {
   if (!empty($_GET['val'])) {
-    preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $_GET['val'], $matches);
-    if (!empty($matches)) {
-      // Explicit [nid:n].
-      list(, $title, $nid) = $matches;
-    }
+    nodereference_explorer_include('nodereference_explorer.util');
+    $value = nodereference_explorer_util_parse_widget_value($_GET['val']);
   }
   //retrieve the field by name and content type
   $field = content_fields($field_name, $type_name);
@@ -283,7 +280,7 @@
   //get the selected rendered view item
   nodereference_explorer_include('nodereference_explorer.views.class');
   $handler = new nodereference_explorer_views($field);
-  $output = $handler->get_item($nid);
+  $output = $handler->get_item($value['nid']);
   drupal_json(array('status' => TRUE, 'data' => $output));
 }
 
Index: includes/nodereference_explorer.widget.inc
===================================================================
--- includes/nodereference_explorer.widget.inc	(revision 3418)
+++ includes/nodereference_explorer.widget.inc	(working copy)
@@ -90,15 +90,15 @@
   if ($field) {
     nodereference_explorer_widget_attach_dialog_css_and_js($field);
   
-    //validate/preview function might destroy the plugin object
+    // validate and preview function might destroy the plugin object
     if ($element['#plugin'] instanceof __PHP_Incomplete_Class) { //create new plugin object if destroyed
   	  $element['#plugin'] = nodereference_explorer_plugins_load_plugin($field['type']);
   	  $element['#value_callback'] = isset($element['#plugin']->value_callback) ? $element['#plugin']->value_callback: NULL;
     }
   
     //call parent widget process function, provided by plugin (depends on CCK type)
-    $element = $element['#plugin']->widget_process($element, $edit, $form_state, $form);
-
+    $element = $element['#plugin']->widget_process($element, $edit, $form_state, $form); 
+    
     //add js settings per field only once, preventing multiple settings holds same values
     //this is compatible with the "add more" behavior
     static $added_settings;
@@ -133,7 +133,7 @@
     //add a preview if enabled (by the content type admin/editor)
     if (!empty($field['widget']['content_preview']) && $field['widget']['content_preview'] != '--') {
       $preview_weight = $field['widget']['content_preview_position'] == 'below' ?  1 : -1;
-      $preview_id = nodereference_explorer_widget_preview($element, $preview_weight);
+      $preview_id = nodereference_explorer_widget_preview($element, $field, $preview_weight);
       $components[] = $preview_id; //add preview to components
     }
 
@@ -243,6 +243,7 @@
   
   return array($add_button_id, $browse_button_id, $remove_button_id);
 }
+
 /**
  * Default preview on selected view items. Actually
  * an item of a referenced view display is shown
@@ -250,21 +251,37 @@
  *   form element
  * @param $field
  *   CCK field
+ * @param $preview_weight
+ *   number form position
  * @return
  *   id of the preview area
  */
-function nodereference_explorer_widget_preview(&$element, $preview_weight) {
+function nodereference_explorer_widget_preview(&$element, $field, $preview_weight) {
 
   $element['preview'] = array(
     '#type' => 'markup',
     '#weight' => $preview_weight,
   );
 
-  $preview_id = $element['#id'] .'-preview';
+  $preview_id = $element['#id'] .'-preview'; // HTML id
+  // wrapper
+  $prefix = '<div id="'. $preview_id .'" class="nodereference-explorer-preview">';
+  $suffix = '</div>';
 
-  //add an empty placeholder for the preview
-  $element['preview']['#value'] = '<div id="'. $preview_id .'" class="nodereference-explorer-preview"></div>';
-
+ // The NRE plugins and their super class are responsible for providing the node id.
+ // See class nodereference_explorer_plugin_content function widget_process and subclasses
+ if ($element['#default_value']['nid']) { // load preview if node is provided
+    nodereference_explorer_include('nodereference_explorer.views.class');
+    $handler = new nodereference_explorer_views($field);
+    $output = $handler->get_item($element['#default_value']['nid']); // generates HTML preview
+    // wrap output, sometimes #prefix and #suffix might not render, 
+    // that's why we put everthing into #value
+    $element['preview']['#value'] = $prefix . $output . $suffix;
+  }
+  else { //add an empty placeholder for the preview
+    $element['preview']['#value'] = $prefix . $suffix;
+  }
+   
   nodereference_explorer_add_js('explorer.preview'); //preview behavior js
   return $preview_id;
 }
Index: includes/nodereference_explorer.views.class.inc
===================================================================
--- includes/nodereference_explorer.views.class.inc	(revision 3418)
+++ includes/nodereference_explorer.views.class.inc	(working copy)
@@ -62,11 +62,9 @@
   public function get_item($value) {
     if (is_array($value) && isset($value['nid'])) {
       // taken from nodereference_autocomplete_validate() in nodereference.module
-      preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value['nid'], $matches);
-      if (!empty($matches)) {
-        // Explicit [nid:n].
-        $nid = $matches[2];
-      }
+      nodereference_explorer_include('nodereference_explorer.util');
+      $widget_value = nodereference_explorer_util_parse_widget_value($value['nid']);
+      $nid = $widget_value['nid'];
     }
     elseif (!is_array($value)) {
       $nid = $value;
@@ -136,7 +134,7 @@
     $title = drupal_get_title();
 
     if (!empty($this->view_args)) {//view (default or custom) with arguments
-      $args = split(',', $this->view_args); //split multiple arguments by slashes
+      $args = preg_split('/,/', $this->view_args); //split multiple arguments by slashes
       //append view's name and display id as arguments 1 and 2
       array_unshift($args, $display_id);
       array_unshift($args, $view->name);
Index: plugins/content/nodereference_explorer_plugin_content.inc
===================================================================
--- plugins/content/nodereference_explorer_plugin_content.inc	(revision 3418)
+++ plugins/content/nodereference_explorer_plugin_content.inc	(working copy)
@@ -10,15 +10,33 @@
 abstract class nodereference_explorer_plugin_content {
 
   public $value_callback = NULL; //define callback function for the widget value
-
+ 
   /**
    * The parent widget to which actions and preview is assigned, e. g. autocomplete widget.
    * @param $element
    * @param $edit
    * @param $form_state
    * @param $form
+   * @return
+   *   array form element
    */
-  public abstract function widget_process($element, $edit, $form_state, $form);
+  public function widget_process($element, $edit, $form_state, $form) {
+    // Clicking the "Add another item" button triggers a POST request with the current widget values.
+    // If that is the case we have to reset the widget values for further processing, e. g. preview.
+    $field_name = $element['#field_name'];
+    $weight = $element['#delta'];
+    // The add more button AJAX call might put the post values into the $element array. We look at this
+    // data structure first, before we look up the global $_POST array. As values might be overridden
+    // in both arrays, the $_POST array can be manipualted by any PHP code whereas the $element array
+    // can only be changed by CCK and dependent modules.
+    if($element['#post'][$field_name][$weight]) { 
+	   $element['#default_value'] = $element['#post'][$field_name][$weight];
+    }
+    elseif($_POST[$field_name][$weight]) {
+	   $element['#default_value'] = $_POST[$field_name][$weight];
+    }
+    return $element;
+  }
 
   /**
    * Extended rendering function for parent widget.
Index: plugins/content/nodereference/nodereference_explorer_plugin_content_nodereference.inc
===================================================================
--- plugins/content/nodereference/nodereference_explorer_plugin_content_nodereference.inc	(revision 3418)
+++ plugins/content/nodereference/nodereference_explorer_plugin_content_nodereference.inc	(working copy)
@@ -20,8 +20,11 @@
    * @param $edit
    * @param $form_state
    * @param $form
+   * @return
+   *   array form element
    */
   public function widget_process($element, $edit, $form_state, $form) {
+    $element = parent::widget_process($element, $edit, $form_state, $form); // sanitize widget values
     $element['#value_callback'] = 'nodereference_autocomplete_value';
     return nodereference_autocomplete_process($element, $edit, $form_state, $form);
   }
Index: plugins/content/link/nodereference_explorer_plugin_content_link.inc
===================================================================
--- plugins/content/link/nodereference_explorer_plugin_content_link.inc	(revision 3418)
+++ plugins/content/link/nodereference_explorer_plugin_content_link.inc	(working copy)
@@ -18,22 +18,43 @@
    * @param $edit
    * @param $form_state
    * @param $form
+   * @return
+   *   array form element
    */
   public function widget_process($element, $edit, $form_state, $form) {
-    $element = link_process($element, $edit, $form_state, $form);
-    if (isset($element['#default_value']['title']))
-      $node = node_load(array('title' => $element['#default_value']['title']));
+    $element = parent::widget_process($element, $edit, $form_state, $form); // sanitize widget values
+    $element = link_process($element, $edit, $form_state, $form); // process parent widget
+    
+    // Identify internal node links
+    if ($element['#default_value']['value']) { // in NR autocomplete format, e. g. test [nid: 222]
+      nodereference_explorer_include('nodereference_explorer.util');
+      $value = nodereference_explorer_util_parse_widget_value($element['#default_value']['value']);
+      $node = node_load($value['nid']);
+    }
+    elseif ($element['#default_value']['url']) { // get node by path alias
+      $path = drupal_get_normal_path($element['#default_value']['url']); 
+      list (, $nid) = preg_split('/\//', $path);
+      $node = node_load($nid);
+    }
+    // internal value for JS actions
     $element['value'] = array(
       '#id' => $element['#id'],
       '#type' => 'hidden',
-      '#value' => !empty($element['#default_value']['title']) && !empty($node->nid) ? $element['#default_value']['title'] . '[nid: ' . $node->nid .']': '',
+      // set possibly overriden title and node id if existing
+      '#value' => !empty($element['#default_value']['title']) && !empty($node->nid) ? $element['#default_value']['title'] . ' [nid: ' . $node->nid .']': '',
     );
+    
+    // set nid attribute used by widget preview
+    if ($node->nid) {
+      $element['#default_value']['nid'] = $node->nid;
+    }    
+    
     //create an error element, needed for storing field name for widget settings form and
     //validates widget settings properly
     $field_key  = $element['#columns'][0];
     $element['_error_element'] = array(
       '#type' => 'value',
-      // Wrapping the element around a text_textfield element creates a
+      // Wrapping the element around a text_textfield element creates aS
       // nested element, so the final id will look like 'field-name-0-url'.
       '#value' => implode('][', array_merge($element['#parents'], array($field_key))),
     );
Index: js/explorer.preview.js
===================================================================
--- js/explorer.preview.js	(revision 3418)
+++ js/explorer.preview.js	(working copy)
@@ -25,12 +25,14 @@
       var path = settings['preview'];
       var widget = '#' + settings['widget'];
       
-      //attach change action to core widget, triggered when dialog returns a value
-      //when loading an editing node with nodereference fields
-      //  when loading a selection from a autocomplete view selection
+      // Attach change action to core widget, triggered when dialog returns a value
+      // - when loading an editing node with nodereference fields
+      // - when loading a selection from a autocomplete view selection
+      // On first load the preview is generated server side, so there's no
+      // manual trigger, i. e. $(widget).blur() necessary
       $(widget).blur(function(event) {
     	var val = $(this).val(); //current value
-    	if (val != '') {//placeholder while preview loads
+    	if (val != '') { // placeholder while preview loads
     	  $(preview).text(Drupal.t('Preview loading, please wait...'));
           Drupal.nodereference_explorer.preview.getPreview(preview, path, val);
     	}
@@ -38,7 +40,6 @@
     	  $(preview).text('');
     	}
       });
-      $(widget).blur();
     })
     .addClass('nodereference-explorer-processed');
 };
