diff -u flexinode/field_textfield.inc flexinode-patch/field_textfield.inc
--- flexinode/field_textfield.inc	2006-03-24 13:04:21.410646024 -0500
+++ flexinode-patch/field_textfield.inc	2006-03-24 13:12:10.481336440 -0500
@@ -44,6 +44,9 @@
     ));
 }
 
+function flexinode_field_textfield_can_be_title() { 
+  return 'TRUE';
+}
 
 /**
  * @addtogroup themeable
diff -u flexinode/field_timestamp.inc flexinode-patch/field_timestamp.inc
--- flexinode/field_timestamp.inc	2006-03-24 13:04:54.562606160 -0500
+++ flexinode-patch/field_timestamp.inc	2006-03-24 13:12:42.169519104 -0500
@@ -5,6 +5,10 @@
   return t('date/time');
 }
 
+function flexinode_field_timestamp_can_be_title() {
+  return 'TRUE';
+}
+
 function flexinode_field_timestamp_form($field, $node) {
   $fieldname = 'flexinode_'. $field->field_id;
   return flexinode_form_date($node->$fieldname, $field);
diff -u flexinode/flexinode.module flexinode-patch/flexinode.module
--- flexinode/flexinode.module	2006-03-24 13:06:25.788737680 -0500
+++ flexinode-patch/flexinode.module	2006-03-24 13:59:40.966996752 -0500
@@ -287,14 +287,13 @@
     $rows[] = $row;
   }
   if ($rows) {
-    $output .= theme('table', $header, $rows);
-    $output .= theme('pager', NULL, 20, 0, tablesort_pager());
+  $output .= theme('table', $header, $rows);
+  $output .= theme('pager', NULL, 20, 0, tablesort_pager());
     drupal_set_title(t('%type search results', array('%type' => t($ctype->name))));
   }
   else {
      $output .= theme('box', t('Your search yielded no results'), search_help('search#noresults'));
   }
-
   drupal_set_title(t('%type search results', array('%type' => t($ctype->name))));
   return $output;
 }
@@ -577,16 +576,21 @@
       $form[$key] = $item;
     }
   }
+  // check if field is set as title and remove title if it is.
+  $result = db_query("SELECT field_id, label, use_as_title FROM flexinode_field WHERE ctype_id = '$node->ctype_id' AND use_as_title=1");
 
-  $form['title'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Title'),
-    '#default_value' => $node->title,
-    '#size' => 60,
-    '#maxlength' => 128,
-    '#required' => TRUE,
-    );
+  $uat = db_fetch_object($result);
 
+  if ($uat->use_as_title != 1) {
+    $form['title'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Title'),
+      '#default_value' => $node->title,
+      '#size' => 60,
+      '#maxlength' => 128,
+      '#required' => TRUE,
+    );
+  }
   $form['ctype_id'] = array(
     '#type' => 'hidden',
     '#value' => $node->ctype_id,
@@ -599,8 +603,18 @@
  * Implementation of hook_validate().
  */
 function flexinode_validate($node) {
-  node_validate_title($node);
-
+// validate title, unless it is set by flexinode.
+  if (isset($node->title)) {
+    node_validate_title($node);
+  }
+  elseif (isset($node->ctype_id)) {
+    $ctype = flexinode_load_content_type($node->ctype_id);
+    foreach ($ctype->fields as $field) {
+      if ($field->use_as_title != 1) {
+        node_validate_title($node);
+      }
+    }
+  }
   if (isset($node->ctype_id)) {
     $ctype = flexinode_load_content_type($node->ctype_id);
     foreach ($ctype->fields as $field) {
@@ -619,10 +633,28 @@
 function flexinode_submit(&$node) {
   if (isset($node->ctype_id)) {
     $ctype = flexinode_load_content_type($node->ctype_id);
+    
     foreach ($ctype->fields as $field) {
+      $fieldname = 'flexinode_'. $field->field_id;
+      if ($field->use_as_title == 1) {
+        $titlep = flexinode_check_title_usage($node->ctype_id, $field->field_id);
+        if ($titlep == 'primary') {
+          $title1 = $node->$fieldname;
+        }
+        if ($titlep == 'secondary') {
+          $title2 = $node->$fieldname;
+        }
+        if (isset($title2)) {
+          $title = $title1 .' - ' .$title2;
+        }
+        else {
+          $title = $title1;
+        }
+        $title_strp =  truncate_utf8(check_plain($title), 128); 
+        $node->title = $title_strp;  
+      }
       if ($result = flexinode_invoke('execute', $field, $node)) {
-        $fieldname = 'flexinode_'. $field->field_id;
-        $node->$fieldname = $result;
+        $node->$fieldname = $result;	
       }
     }
     // Pre-render the body and teaser fields, so the Drupal search works.
@@ -951,7 +983,6 @@
   else {
     $field->field_type = $field_id;
   }
-
   $form['label'] = array(
     '#type' => 'textfield',
     '#title' => t('Field label'),
@@ -973,6 +1004,25 @@
     '#default_value' => $field->required,
     '#description' => t('Whether the user must fill in the field when creating content.'),
     );
+  // add checkbox for custom titles. 
+  if (flexinode_can_be_title($field) == 'TRUE') {
+    if (flexinode_check_title_usage($field->ctype_id, $field_id) == 'primary') {
+    $form['use_as_title'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use as Title'),
+      '#default_value' => $field->use_as_title,
+      '#description' => t('Should this field be used as the Title for the Node. This will also set the field to required'),
+      );
+    }
+    if (flexinode_check_title_usage($field->ctype_id, $field_id) == 'secondary') {
+    $form['use_as_title_2'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use Second Part of Title'),
+      '#default_value' => $field->use_as_title_2,
+      '#description' => t('Use this field to form the second part of the title. This will also set the field to required'),
+      );
+    }
+  }
   $form['show_teaser'] = array(
     '#type' => 'checkbox',
     '#title' => t('Show in teaser'),
@@ -1098,21 +1148,91 @@
 
   if ($edit['field_id']) {
     $field_id = $edit['field_id'];
-
-    db_query("UPDATE {flexinode_field} SET label = '%s', default_value = '%s', rows = %d, required = %d, show_teaser = %d, show_table = %d, weight = %d, ctype_id = %d, field_type = '%s', options = '%s', description = '%s' WHERE field_id = %d", $edit['label'], $edit['default_value'], $edit['rows'], $edit['required'], $edit['show_teaser'], $edit['show_table'], $edit['weight'], $edit['ctype_id'], $edit['field_type'], serialize($options), $edit['description'], $field_id);
+    // set field as required if it is being used as a title
+    if ($edit['use_as_title'] == 1) {
+      $edit['required'] = 1;
+    }
+    if ($edit['use_as_title_2'] == 1 ) {
+      $edit['required'] = 1;
+      $edit['use_as_title'] = 1;  
+    }
+    db_query("UPDATE {flexinode_field} SET label = '%s', default_value = '%s', rows = %d, required = %d, use_as_title = %d, use_as_title_2 = %d, show_teaser = %d, show_table = %d, weight = %d, ctype_id = %d, field_type = '%s', options = '%s', description = '%s' WHERE field_id = %d", $edit['label'], $edit['default_value'], $edit['rows'], $edit['required'], $edit['use_as_title'], $edit['use_as_title_2'], $edit['show_teaser'], $edit['show_table'], $edit['weight'], $edit['ctype_id'], $edit['field_type'], serialize($options), $edit['description'], $field_id);
 
     drupal_set_message(t('updated field "%name".', array('%name' => $edit['label'])));
   }
   else {
     $field_id = db_next_id('{flexinode_field}');
 
-    db_query("INSERT INTO {flexinode_field} (label, default_value, rows, required, show_teaser, show_table, weight, ctype_id, field_type, options, description, field_id) VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d, '%s', '%s', '%s', %d)", $edit['label'], $edit['default_value'], $edit['rows'], $edit['required'], $edit['show_teaser'], $edit['show_table'], $edit['weight'], $edit['ctype_id'], $edit['field_type'], serialize($options), $edit['description'], $field_id);
+    // set field as required if it is being used as a title
+    if ($edit['use_as_title'] == 1 OR $edit['use_as_title_2']) {
+      $edit['required'] = 1;
+    }
+    if ($edit['use_as_title_2'] == 1 ) {
+      $edit['required'] = 1;
+      $edit['use_as_title'] = 1;  
+    }
+    db_query("INSERT INTO {flexinode_field} (label, default_value, rows, required, use_as_title, use_as_title_2, show_teaser, show_table, weight, ctype_id, field_type, options, description, field_id) VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d, %d, %d, '%s', '%s', '%s', %d)", $edit['label'], $edit['default_value'], $edit['rows'], $edit['required'], $edit['use_as_title'], $edit['use_as_title_2'], $edit['show_teaser'], $edit['show_table'], $edit['weight'], $edit['ctype_id'], $edit['field_type'], serialize($options), $edit['description'], $field_id);
 
     drupal_set_message(t('created new field "%name".', array('%name' => $edit['label'])));
   }
 
   return $field_id;
 }
+/**
+ * Functions for Custom Titles
+ */
+function flexinode_can_be_title($field) {
+  if (flexinode_invoke('can_be_title', $field) == 'TRUE') {
+    $field_can_be_title = 'TRUE';
+  }
+  else {
+    $field_can_be_title = 'FALSE';
+  }
+  return $field_can_be_title;
+}
+
+function flexinode_check_title_usage($ctype_id, $field_id) {
+  $query = db_query("SELECT field_id FROM flexinode_field WHERE use_as_title=1 AND ctype_id = '$ctype_id'");
+  $result = db_fetch_object($query);
+
+  $query2 = db_query("SELECT use_as_title, use_as_title_2 FROM flexinode_field WHERE use_as_title=1 AND ctype_id = '$ctype_id' AND field_id = '$field_id'");
+  $result2 = db_fetch_object($query2);
+  
+  $query3 = db_query("SELECT use_as_title_2 FROM flexinode_field WHERE use_as_title=1 AND ctype_id = '$ctype_id' AND use_as_title_2=1"); 
+  
+  if (db_num_rows($query) > 2) {
+    $title_usage = 'error';
+  }
+  if (db_num_rows($query) == 0) {
+    $title_usage = 'primary';
+  }
+  if (db_num_rows($query) == 1) {
+    if ($result->field_id == $field_id) {
+      $title_usage = 'primary';
+    }
+    if ($result->field_id != $field_id && $result2->use_as_title_2 == 0) {
+      $title_usage = 'primary';
+    }
+    if (db_num_rows($query3) == 0 && $result->field_id != $field_id) {
+      $title_usage = 'secondary';
+    }
+    if ($result->field_id == $field_id && $result2->use_as_title_2 == 1) {
+      $title_usage = 'secondary';
+    }
+  }
+  if (db_num_rows($query) == 2) {
+    if ($result2->use_as_title_2 == 0 && $result2->use_as_title == 1) {
+      $title_usage = 'primary';
+    }
+    if ($result2->use_as_title_2 == 1 && $result2->use_as_title == 1) {
+      $title_usage = 'secondary';
+    }
+    if ($result2->use_as_title_2 == 0 && $result2->use_as_title != 1) {
+      $title_usage = 'error';
+    }
+  }
+  return $title_usage;  
+}
 
 /**
  * Return a field object.
diff -u flexinode/flexinode.mysql flexinode-patch/flexinode.mysql
--- flexinode/flexinode.mysql	2006-03-24 13:05:49.583241752 -0500
+++ flexinode-patch/flexinode.mysql	2006-03-24 13:20:25.838030776 -0500
@@ -1,35 +1,46 @@
--- $Id: flexinode.mysql,v 1.5 2004/07/15 12:52:57 JonBob Exp $
+CREATE TABLE `flexinode_field` (
+  `field_id` int(10) unsigned NOT NULL default '0',
+  `ctype_id` int(10) unsigned NOT NULL default '0',
+  `label` varchar(255) NOT NULL default '',
+  `default_value` mediumtext NOT NULL,
+  `weight` int(10) NOT NULL default '0',
+  `required` int(1) NOT NULL default '0',
+  `use_as_title` int(1) NOT NULL default '0',
+  `use_as_title_2` int(1) NOT NULL default '0',
+  `show_teaser` int(1) NOT NULL default '0',
+  `show_table` int(1) NOT NULL default '0',
+  `rows` int(10) unsigned NOT NULL default '0',
+  `field_type` varchar(255) NOT NULL default '',
+  `options` text NOT NULL,
+  `description` varchar(255) NOT NULL default '',
+  PRIMARY KEY  (`field_id`),
+  KEY `ctype_id` (`ctype_id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `flexinode_type`
+--
 
-CREATE TABLE flexinode_field (
-  field_id int(10) unsigned NOT NULL default '0',
-  ctype_id int(10) unsigned NOT NULL default '0',
-  label varchar(255) NOT NULL default '',
-  default_value mediumtext NOT NULL default '',
-  weight int(10) NOT NULL default '0',
-  required int(1) NOT NULL default '0',
-  show_teaser int(1) NOT NULL default '0',
-  show_table int(1) NOT NULL default '0',
-  rows int(10) unsigned NOT NULL default '0',
-  field_type varchar(255) NOT NULL default '',
-  options text NOT NULL default '',
-  description varchar(255) NOT NULL default '',
-  PRIMARY KEY field_id (field_id),
-  KEY ctype_id (ctype_id)
+CREATE TABLE `flexinode_type` (
+  `ctype_id` int(10) unsigned NOT NULL default '0',
+  `name` varchar(255) NOT NULL default '',
+  `description` varchar(255) NOT NULL default '',
+  `help` text NOT NULL,
+  PRIMARY KEY  (`ctype_id`)
 ) TYPE=MyISAM;
 
-CREATE TABLE flexinode_type (
-  ctype_id int(10) unsigned NOT NULL default '0',
-  name varchar(255) NOT NULL default '',
-  description varchar(255) NOT NULL default '',
-  help text NOT NULL default '',
-  PRIMARY KEY ctype_id (ctype_id)
+--
+-- Table structure for table `flexinode_data`
+--
+
+CREATE TABLE `flexinode_data` (
+  `nid` int(10) unsigned NOT NULL default '0',
+  `field_id` int(10) unsigned NOT NULL default '0',
+  `textual_data` mediumtext NOT NULL,
+  `numeric_data` int(10) unsigned NOT NULL default '0',
+  `serialized_data` mediumtext NOT NULL,
+  PRIMARY KEY  (`nid`,`field_id`)
 ) TYPE=MyISAM;
 
-CREATE TABLE flexinode_data (
-  nid int(10) unsigned NOT NULL default '0',
-  field_id int(10) unsigned NOT NULL default '0',
-  textual_data mediumtext NOT NULL default '',
-  numeric_data int(10) unsigned NOT NULL default '0',
-  serialized_data mediumtext NOT NULL default '',
-  PRIMARY KEY id (nid,field_id)
-) TYPE=MyISAM;
\ No newline at end of file
+
+
diff -u flexinode/flexinode.pgsql flexinode-patch/flexinode.pgsql
--- flexinode/flexinode.pgsql	2006-03-24 13:05:33.653663416 -0500
+++ flexinode-patch/flexinode.pgsql	2006-03-24 13:20:35.891502416 -0500
@@ -7,6 +7,8 @@
   default_value text NOT NULL default '',
   weight int NOT NULL default '0',
   required int NOT NULL default '0',
+  use_as_title int NOT NULL default '0',
+  use_as_title_2 int NOT NULL default '0',
   show_teaser int NOT NULL default '0',
   show_table int NOT NULL default '0',
   rows int NOT NULL default '0',
