diff -urp cck/includes/content.token.inc cck/includes/content.token.inc
--- cck/includes/content.token.inc	2008-12-05 08:59:22.000000000 -0600
+++ cck/includes/content.token.inc	2009-03-20 13:36:35.880365700 -0500
@@ -93,7 +93,7 @@ if (module_exists('nodereference')) {
     if ($type == 'field') {
       $item = $object[0];
 
-      $title = is_numeric($item['nid']) ? _nodereference_titles($item['nid']) : '';
+      $title = $item['nid'] ? _nodereference_titles($item['nid']) : $item['value'];
       $tokens['nid']   = $item['nid'];
       $tokens['title'] = $title ? check_plain($title) : '';
       $tokens['title-raw'] = $title;
diff -urp cck/modules/nodereference/nodereference.module cck/modules/nodereference/nodereference.module
--- cck/modules/nodereference/nodereference.module	2009-03-01 08:40:35.000000000 -0600
+++ cck/modules/nodereference/nodereference.module	2009-03-20 14:14:24.745543400 -0500
@@ -77,6 +77,14 @@ function nodereference_field_settings($o
         '#default_value' => is_array($field['referenceable_types']) ? $field['referenceable_types'] : array(),
         '#options' => array_map('check_plain', node_get_types('names')),
       );
+      if ($field['widget']['type'] == 'nodereference_autocomplete'){
+        $form['allow_text'] = array(
+          '#type' => 'checkbox',
+          '#title' => t('If node doesn\'t exist allow plain text'),
+          '#default_value' => $field['allow_text'],
+        );
+      }
+
       if (module_exists('views')) {
         $views = array('--' => '--');
         $all_views = views_get_all_views();
@@ -125,7 +133,7 @@ function nodereference_field_settings($o
       return $form;
 
     case 'save':
-      $settings = array('referenceable_types');
+      $settings = array('referenceable_types', 'allow_text');
       if (module_exists('views')) {
         $settings[] = 'advanced_view';
         $settings[] = 'advanced_view_args';
@@ -135,6 +143,7 @@ function nodereference_field_settings($o
     case 'database columns':
       $columns = array(
         'nid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE),
+        'value' => array('type' => 'varchar', 'length' => 255, 'not null' => FALSE, 'sortable' => TRUE),
       );
       return $columns;
 
@@ -199,7 +208,7 @@ function nodereference_field($op, &$node
           if (is_numeric($item['nid'])) {
             $ids[] = $item['nid'];
           }
-          else {
+          else if (empty($field['allow_text'])) {
             $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
             if (is_array($item) && isset($item['_error_element'])) unset($item['_error_element']);
             form_set_error($error_element, t("%name: invalid input.", array('%name' => t($field['widget']['label']))));
@@ -220,6 +229,17 @@ function nodereference_field($op, &$node
         }
       }
       return $items;
+    case 'update':
+    case 'sanitize':
+      foreach ($items as $delta => $item) {
+        if ($item['nid'][0] == '!') {
+          $items[$delta]['value'] = substr($item['nid'],1);
+          $items[$delta]['nid'] = NULL;
+          watchdog('noderef', "sanitize: %value", array('%value' => $items[$delta]['value']));
+        }
+
+      }
+      return $items;
   }
 }
 
@@ -227,7 +247,7 @@ function nodereference_field($op, &$node
  * Implementation of hook_content_is_empty().
  */
 function nodereference_content_is_empty($item, $field) {
-  if (empty($item['nid'])) {
+  if (empty($item['nid']) && empty($item['value'])) {
     return TRUE;
   }
   return FALSE;
@@ -269,6 +289,9 @@ function theme_nodereference_formatter_d
   if (!empty($element['#item']['nid']) && is_numeric($element['#item']['nid']) && ($title = _nodereference_titles($element['#item']['nid']))) {
     $output = l($title, 'node/'. $element['#item']['nid']);
   }
+  else {
+    $output = _nodereference_text_value($element);
+  }
   return $output;
 }
 
@@ -280,9 +303,16 @@ function theme_nodereference_formatter_p
   if (!empty($element['#item']['nid']) && is_numeric($element['#item']['nid']) && ($title = _nodereference_titles($element['#item']['nid']))) {
     $output = check_plain($title);
   }
+  else {
+    $output = _nodereference_text_value($element);
+  }
   return $output;
 }
 
+function _nodereference_text_value($element) {
+  return check_plain($element['#item']['value']);
+}
+
 /**
  * Proxy theme function for 'full' and 'teaser' nodereference field formatters.
  */
@@ -310,6 +340,9 @@ function theme_nodereference_formatter_f
       $output = node_view($referenced_node, $element['#formatter'] == 'teaser');
     }
   }
+  else {
+    $output = _nodereference_text_value($element);
+  }
   return $output;
 }
 
@@ -498,12 +531,17 @@ function nodereference_widget(&$form, &$
  */
 function nodereference_autocomplete_value($element, $edit = FALSE) {
   $field_key  = $element['#columns'][0];
+  $field_text_key = $element['#columns'][1];
   if (!empty($element['#default_value'][$field_key])) {
     $nid = $element['#default_value'][$field_key];
     $value = db_result(db_query(db_rewrite_sql('SELECT n.title FROM {node} n WHERE n.nid = %d'), $nid));
     $value .= ' [nid:'. $nid .']';
     return array($field_key => $value);
   }
+  if (!empty($element['#default_value'][$field_text_key])) {
+    $value = $element['#default_value'][$field_text_key];
+    return array($field_key => $value);
+  }
   return array($field_key => NULL);
 }
 
@@ -674,9 +712,13 @@ function nodereference_autocomplete_vali
     else {
       // No explicit nid.
       $reference = _nodereference_potential_references($field, $value, 'equals', NULL, 1);
-      if (empty($reference)) {
+      if (empty($reference) && empty($field['allow_text'])) {
         form_error($element[$field_key], t('%name: found no valid post with that title.', array('%name' => t($field['widget']['label']))));
       }
+      else if (empty($reference) && !empty($field['allow_text'])) {
+        //Use '!' to identify a text value, will fix in hook_field($op = 'sanitize')
+        $nid = '!'. $value;
+      }
       else {
         // TODO:
         // the best thing would be to present the user with an additional form,
