diff -urpN ../storm/stormexpense/stormexpense.module ./stormexpense/stormexpense.module
--- ../storm/stormexpense/stormexpense.module	2010-10-11 11:40:13.000000000 -0400
+++ ./stormexpense/stormexpense.module	2011-01-13 13:45:35.931102000 -0500
@@ -307,16 +307,16 @@ function stormexpense_form(&$node) {
       }
     }
 
-    if ($_SESSION['stormexpense_list_filter']['organization_nid'] && !$node->organization_nid) {
+    if (isset($_SESSION['stormexpense_list_filter']['organization_nid']) && (!isset($node->organization_nid))) {
       $node->organization_nid = $_SESSION['stormexpense_list_filter']['organization_nid'];
     }
-    if ($_SESSION['stormexpense_list_filter']['project_nid'] && !$node->project_nid) {
+    if (isset($_SESSION['stormexpense_list_filter']['project_nid']) && (!isset($node->project_nid))) {
       $node->project_nid = $_SESSION['stormexpense_list_filter']['project_nid'];
     }
-    if ($_SESSION['stormexpense_list_filter']['task_nid'] && !$node->task_nid) {
+    if (isset($_SESSION['stormexpense_list_filter']['task_nid']) && (!isset($node->task_nid))) {
       $node->task_nid = $_SESSION['stormexpense_list_filter']['task_nid'];
     }
-    if ($_SESSION['stormexpense_list_filter']['ticket_nid'] && !$node->ticket_nid) {
+    if (isset($_SESSION['stormexpense_list_filter']['ticket_nid']) && (!isset($node->ticket_nid))) {
       $node->ticket_nid = $_SESSION['stormexpense_list_filter']['ticket_nid'];
     }
     if (array_key_exists('organization_nid', $_GET)) $node->organization_nid = $_GET['organization_nid'];
@@ -359,9 +359,13 @@ function stormexpense_form(&$node) {
   $s_org = db_rewrite_sql($s_org);
   $r = db_query($s_org);
   $organizations = array();
-  while ($organization = db_fetch_object($r)) {
-    $organizations[$organization->nid] = $organization->title;
-    if (!$node->organization_nid) $node->organization_nid = $organization->nid;
+  if ($r->num_rows > 0) {
+    while ($organization = db_fetch_object($r)) {
+      $organizations[$organization->nid] = $organization->title;
+      if (!isset($node->organization_nid)) {
+        $node->organization_nid = $organization->nid;
+      }
+    }
   }
   $form['group1']['organization_nid'] = array(
     '#type' => 'select',
@@ -385,37 +389,41 @@ function stormexpense_form(&$node) {
   $form['group1']['project_nid'] = array(
     '#type' => 'select',
     '#title' => t('Project'),
-    '#default_value' => $node->project_nid,
+    '#default_value' => (isset($node->project_nid)) ? $node->project_nid : NULL,
     '#options' => $projects,
     '#process' => array('storm_dependent_select_process'),
     '#attributes' => array('onchange' => "stormticket_project_task_tickets(this, 'edit-organization-nid', 'edit-task-nid', 'edit-ticket-nid', true, '-')"),
   );
-
-  $tree = _stormtask_get_tree($node->project_nid);
-  $tasks = _stormtask_plain_tree($tree);
-  $tasks = array(0 => '-') + $tasks;
-  $form['group1']['task_nid'] = array(
-    '#type' => 'select',
-    '#title' => t('Task'),
-    '#default_value' => $node->task_nid,
-    '#options' => $tasks,
-    '#process' => array('storm_dependent_select_process'),
-    '#attributes' => array('onchange' => "stormticket_task_tickets(this, 'edit-organization-nid', 'edit-project-nid', 'edit-ticket-nid', true, '-')"),
-  );
+  
+  if (isset($node->project_nid)) {
+    $tree = _stormtask_get_tree($node->project_nid);
+    $tasks = _stormtask_plain_tree($tree);
+    $tasks = array(0 => '-') + $tasks;
+    $form['group1']['task_nid'] = array(
+      '#type' => 'select',
+      '#title' => t('Task'),
+      '#default_value' => (isset($node->task_nid)) ? $node->task_nid : NULL,
+      '#options' => $tasks,
+      '#process' => array('storm_dependent_select_process'),
+      '#attributes' => array('onchange' => "stormticket_task_tickets(this, 'edit-organization-nid', 'edit-project-nid', 'edit-ticket-nid', true, '-')"),
+    );
+  }
 
   $tickets = array();
   $s = "SELECT n.nid, n.title FROM {node} AS n INNER JOIN {stormticket} AS sti ON sti.vid=n.vid WHERE n.status=1 AND n.type='stormticket'
   AND sti.organization_nid=%d AND sti.project_nid=%d AND sti.task_nid=%d ORDER BY n.title";
   $s = stormticket_access_sql($s);
   $s = db_rewrite_sql($s);
-  $r = db_query($s, $node->organization_nid, $node->project_nid, $node->task_nid);
+  if (isset($node->organization_nid) && (isset($node->project_nid))) {
+    $r = db_query($s, $node->organization_nid, $node->project_nid, $node->task_nid);
+  }
   while ($ticket = db_fetch_object($r)) {
     $tickets[$ticket->nid] = $ticket->title;
   }
   $form['group1']['ticket_nid'] = array(
     '#type' => 'select',
     '#title' => t('Ticket'),
-    '#default_value' => $node->ticket_nid,
+    '#default_value' => (isset($node->ticket_nid)) ? $node->ticket_nid : NULL,
     '#options' => array(0 => '-') + $tickets,
     '#process' => array('storm_dependent_select_process'),
   );
@@ -436,7 +444,7 @@ function stormexpense_form(&$node) {
     '#type' => 'textfield',
     '#title' => t('Provider'),
     '#size' => 50,
-    '#default_value' => $node->provider_title,
+    '#default_value' => (isset($node->provider_title)) ? $node->provider_title : NULL,
     '#autocomplete_path' => 'storm/expenses/provider_autocomplete',
   );
   
@@ -449,7 +457,7 @@ function stormexpense_form(&$node) {
   $form['group3']['amount'] = array(
     '#type' => 'textfield',
     '#title' => t('Amount'),
-    '#default_value' => $node->amount,
+    '#default_value' => (isset($node->amount)) ? $node->amount : NULL,
     '#size' => 15,
   );
 
@@ -536,9 +544,9 @@ function stormexpense_insert($node) {
     %d, '%s', '%s', %d, '%s',
     %d, '%s', %d, %f, %d, %f, 
     %f, %f, %d, %f, %f, %f)",
-    $node->vid, $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title, 
-    $node->task_nid, $node->task_title, $node->task_stepno, $node->ticket_nid, $node->ticket_title, 
-    $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
+    $node->vid, $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, (isset($node->project_title)) ? $node->project_title : NULL, 
+    (isset($node->task_nid)) ? $node->task_nid : NULL, (isset($node->task_title)) ? $node->task_title : NULL, (isset($node->task_stepno)) ? $node->task_stepno : NULL, $node->ticket_nid, (isset($node->ticket_title)) ? $node->ticket_title : NULL, 
+    (isset($node->provider_nid)) ? $node->provider_nid : NULL, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
     $node->tax1, $node->subtotal, $node->tax2app, $node->tax2percent, $node->tax2, $node->total);
 }
 
@@ -552,11 +560,11 @@ function stormexpense_update($node) {
     db_query("UPDATE {stormexpense} SET
       organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s',
       task_nid=%d, task_title='%s', task_stepno='%s', ticket_nid=%d, ticket_title='%s',
-      provider_nid=%d, provider_title='%s', expensedate=%d, amount=%f, tax1app=%d, tax1percent=%f, 
+      provider_nid=%d, provider_title='%s', expensedate=%d, amount=%f, tax1app=%d, tax1percent=%f,
       tax1=%f, subtotal=%f, tax2app=%d, tax2percent=%f, tax2=%f, total=%f WHERE vid = %d",
       $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title,
       $node->task_nid, $node->task_title, $node->task_stepno, $node->ticket_nid, $node->ticket_title,
-      $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
+      $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent,
       $node->tax1, $node->subtotal, $node->tax2app, $node->tax2percent, $node->tax2, $node->total, $node->vid);
   }
 }
@@ -583,18 +591,30 @@ function _stormexpense_beforesave(&$node
     WHERE type='stormproject' AND n.nid=%d";
   $r = db_query($s, $node->project_nid);
   $p = db_fetch_object($r);
-  $node->project_title = $p->title;
+  if (!empty($p)) {
+    $node->project_title = $p->title;
+  }
 
   $s = "SELECT title, stepno FROM {node} AS n INNER JOIN {stormtask} AS t ON n.vid=t.vid WHERE n.type='stormtask' AND n.nid=%d";
-  $r = db_query($s, $node->task_nid);
+  if (isset($node->task_nid)) {
+    $r = db_query($s, $node->task_nid);
+  }
   $ta = db_fetch_object($r);
-  $node->task_title = $ta->title;
-  $node->task_stepno = $ta->stepno;
+  if (isset($ta->title)) {
+    $node->task_title = $ta->title;
+  }
+  if (isset($ta->stepno)) {
+    $node->task_stepno = $ta->stepno;
+  }
 
   $s = "SELECT title FROM {node} AS n INNER JOIN {stormticket} AS t ON n.vid=t.vid WHERE n.type='stormticket' AND n.nid=%d";
-  $r = db_query($s, $node->ticket_nid);
+  if (isset($node->ticket_nid)) {
+    $r = db_query($s, $node->ticket_nid);
+  }
   $ti = db_fetch_object($r);
-  $node->ticket_title = $ti->title;
+  if (isset($ti->title)) {
+    $node->ticket_title = $ti->title;
+  }
 }
 
 function stormexpense_nodeapi(&$node, $op, $teaser, $page) {
diff -urpN ../storm/stormexpense/stormexpense.test ./stormexpense/stormexpense.test
--- ../storm/stormexpense/stormexpense.test	1969-12-31 19:00:00.000000000 -0500
+++ ./stormexpense/stormexpense.test	2011-01-13 12:33:24.511100000 -0500
@@ -0,0 +1,38 @@
+<?php
+class StormexpenseTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Storm Expense Functionality'),
+      'description' => t('Test the functionality of the Storm Expense module'),
+      'group' => 'Storm',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('storm', 'stormattribute', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormexpense');
+  }
+
+  public function testStormexpenseCreate() {
+    // Create and login user
+    $user = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: add', 'Storm expense: view all', 'Storm project: view all', 'Storm task: view all'));
+    $this->drupalLogin($user);
+
+    // Create a team
+    $org = array(
+      'title' => $this->randomName(32),
+    );
+
+    $expense = array(
+      'organization_nid' => '1',
+      'title' => $this->randomName(32),
+    );
+
+    $this->drupalPost('node/add/stormorganization', $org, t('Save'));
+
+    $this->drupalPost('node/add/stormexpense', $expense, t('Save'));
+
+    $this->assertText(t('Expense @title has been created.', array('@title' => $expense['title'])));
+  }
+}
+
diff -urpN ../storm/storm_expense_simple_test.patch ./storm_expense_simple_test.patch
--- ../storm/storm_expense_simple_test.patch	1969-12-31 19:00:00.000000000 -0500
+++ ./storm_expense_simple_test.patch	2011-01-13 13:47:27.011108646 -0500
@@ -0,0 +1,222 @@
+diff -urpN ../storm/stormexpense/stormexpense.module ./stormexpense/stormexpense.module
+--- ../storm/stormexpense/stormexpense.module	2010-10-11 11:40:13.000000000 -0400
++++ ./stormexpense/stormexpense.module	2011-01-13 13:45:35.931102000 -0500
+@@ -307,16 +307,16 @@ function stormexpense_form(&$node) {
+       }
+     }
+ 
+-    if ($_SESSION['stormexpense_list_filter']['organization_nid'] && !$node->organization_nid) {
++    if (isset($_SESSION['stormexpense_list_filter']['organization_nid']) && (!isset($node->organization_nid))) {
+       $node->organization_nid = $_SESSION['stormexpense_list_filter']['organization_nid'];
+     }
+-    if ($_SESSION['stormexpense_list_filter']['project_nid'] && !$node->project_nid) {
++    if (isset($_SESSION['stormexpense_list_filter']['project_nid']) && (!isset($node->project_nid))) {
+       $node->project_nid = $_SESSION['stormexpense_list_filter']['project_nid'];
+     }
+-    if ($_SESSION['stormexpense_list_filter']['task_nid'] && !$node->task_nid) {
++    if (isset($_SESSION['stormexpense_list_filter']['task_nid']) && (!isset($node->task_nid))) {
+       $node->task_nid = $_SESSION['stormexpense_list_filter']['task_nid'];
+     }
+-    if ($_SESSION['stormexpense_list_filter']['ticket_nid'] && !$node->ticket_nid) {
++    if (isset($_SESSION['stormexpense_list_filter']['ticket_nid']) && (!isset($node->ticket_nid))) {
+       $node->ticket_nid = $_SESSION['stormexpense_list_filter']['ticket_nid'];
+     }
+     if (array_key_exists('organization_nid', $_GET)) $node->organization_nid = $_GET['organization_nid'];
+@@ -359,9 +359,13 @@ function stormexpense_form(&$node) {
+   $s_org = db_rewrite_sql($s_org);
+   $r = db_query($s_org);
+   $organizations = array();
+-  while ($organization = db_fetch_object($r)) {
+-    $organizations[$organization->nid] = $organization->title;
+-    if (!$node->organization_nid) $node->organization_nid = $organization->nid;
++  if ($r->num_rows > 0) {
++    while ($organization = db_fetch_object($r)) {
++      $organizations[$organization->nid] = $organization->title;
++      if (!isset($node->organization_nid)) {
++        $node->organization_nid = $organization->nid;
++      }
++    }
+   }
+   $form['group1']['organization_nid'] = array(
+     '#type' => 'select',
+@@ -385,37 +389,41 @@ function stormexpense_form(&$node) {
+   $form['group1']['project_nid'] = array(
+     '#type' => 'select',
+     '#title' => t('Project'),
+-    '#default_value' => $node->project_nid,
++    '#default_value' => (isset($node->project_nid)) ? $node->project_nid : NULL,
+     '#options' => $projects,
+     '#process' => array('storm_dependent_select_process'),
+     '#attributes' => array('onchange' => "stormticket_project_task_tickets(this, 'edit-organization-nid', 'edit-task-nid', 'edit-ticket-nid', true, '-')"),
+   );
+-
+-  $tree = _stormtask_get_tree($node->project_nid);
+-  $tasks = _stormtask_plain_tree($tree);
+-  $tasks = array(0 => '-') + $tasks;
+-  $form['group1']['task_nid'] = array(
+-    '#type' => 'select',
+-    '#title' => t('Task'),
+-    '#default_value' => $node->task_nid,
+-    '#options' => $tasks,
+-    '#process' => array('storm_dependent_select_process'),
+-    '#attributes' => array('onchange' => "stormticket_task_tickets(this, 'edit-organization-nid', 'edit-project-nid', 'edit-ticket-nid', true, '-')"),
+-  );
++  
++  if (isset($node->project_nid)) {
++    $tree = _stormtask_get_tree($node->project_nid);
++    $tasks = _stormtask_plain_tree($tree);
++    $tasks = array(0 => '-') + $tasks;
++    $form['group1']['task_nid'] = array(
++      '#type' => 'select',
++      '#title' => t('Task'),
++      '#default_value' => (isset($node->task_nid)) ? $node->task_nid : NULL,
++      '#options' => $tasks,
++      '#process' => array('storm_dependent_select_process'),
++      '#attributes' => array('onchange' => "stormticket_task_tickets(this, 'edit-organization-nid', 'edit-project-nid', 'edit-ticket-nid', true, '-')"),
++    );
++  }
+ 
+   $tickets = array();
+   $s = "SELECT n.nid, n.title FROM {node} AS n INNER JOIN {stormticket} AS sti ON sti.vid=n.vid WHERE n.status=1 AND n.type='stormticket'
+   AND sti.organization_nid=%d AND sti.project_nid=%d AND sti.task_nid=%d ORDER BY n.title";
+   $s = stormticket_access_sql($s);
+   $s = db_rewrite_sql($s);
+-  $r = db_query($s, $node->organization_nid, $node->project_nid, $node->task_nid);
++  if (isset($node->organization_nid) && (isset($node->project_nid))) {
++    $r = db_query($s, $node->organization_nid, $node->project_nid, $node->task_nid);
++  }
+   while ($ticket = db_fetch_object($r)) {
+     $tickets[$ticket->nid] = $ticket->title;
+   }
+   $form['group1']['ticket_nid'] = array(
+     '#type' => 'select',
+     '#title' => t('Ticket'),
+-    '#default_value' => $node->ticket_nid,
++    '#default_value' => (isset($node->ticket_nid)) ? $node->ticket_nid : NULL,
+     '#options' => array(0 => '-') + $tickets,
+     '#process' => array('storm_dependent_select_process'),
+   );
+@@ -436,7 +444,7 @@ function stormexpense_form(&$node) {
+     '#type' => 'textfield',
+     '#title' => t('Provider'),
+     '#size' => 50,
+-    '#default_value' => $node->provider_title,
++    '#default_value' => (isset($node->provider_title)) ? $node->provider_title : NULL,
+     '#autocomplete_path' => 'storm/expenses/provider_autocomplete',
+   );
+   
+@@ -449,7 +457,7 @@ function stormexpense_form(&$node) {
+   $form['group3']['amount'] = array(
+     '#type' => 'textfield',
+     '#title' => t('Amount'),
+-    '#default_value' => $node->amount,
++    '#default_value' => (isset($node->amount)) ? $node->amount : NULL,
+     '#size' => 15,
+   );
+ 
+@@ -536,9 +544,9 @@ function stormexpense_insert($node) {
+     %d, '%s', '%s', %d, '%s',
+     %d, '%s', %d, %f, %d, %f, 
+     %f, %f, %d, %f, %f, %f)",
+-    $node->vid, $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title, 
+-    $node->task_nid, $node->task_title, $node->task_stepno, $node->ticket_nid, $node->ticket_title, 
+-    $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
++    $node->vid, $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, (isset($node->project_title)) ? $node->project_title : NULL, 
++    (isset($node->task_nid)) ? $node->task_nid : NULL, (isset($node->task_title)) ? $node->task_title : NULL, (isset($node->task_stepno)) ? $node->task_stepno : NULL, $node->ticket_nid, (isset($node->ticket_title)) ? $node->ticket_title : NULL, 
++    (isset($node->provider_nid)) ? $node->provider_nid : NULL, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
+     $node->tax1, $node->subtotal, $node->tax2app, $node->tax2percent, $node->tax2, $node->total);
+ }
+ 
+@@ -552,11 +560,11 @@ function stormexpense_update($node) {
+     db_query("UPDATE {stormexpense} SET
+       organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s',
+       task_nid=%d, task_title='%s', task_stepno='%s', ticket_nid=%d, ticket_title='%s',
+-      provider_nid=%d, provider_title='%s', expensedate=%d, amount=%f, tax1app=%d, tax1percent=%f, 
++      provider_nid=%d, provider_title='%s', expensedate=%d, amount=%f, tax1app=%d, tax1percent=%f,
+       tax1=%f, subtotal=%f, tax2app=%d, tax2percent=%f, tax2=%f, total=%f WHERE vid = %d",
+       $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title,
+       $node->task_nid, $node->task_title, $node->task_stepno, $node->ticket_nid, $node->ticket_title,
+-      $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent, 
++      $node->provider_nid, $node->provider_title, $node->expensedate, $node->amount, $node->tax1app, $node->tax1percent,
+       $node->tax1, $node->subtotal, $node->tax2app, $node->tax2percent, $node->tax2, $node->total, $node->vid);
+   }
+ }
+@@ -583,18 +591,30 @@ function _stormexpense_beforesave(&$node
+     WHERE type='stormproject' AND n.nid=%d";
+   $r = db_query($s, $node->project_nid);
+   $p = db_fetch_object($r);
+-  $node->project_title = $p->title;
++  if (!empty($p)) {
++    $node->project_title = $p->title;
++  }
+ 
+   $s = "SELECT title, stepno FROM {node} AS n INNER JOIN {stormtask} AS t ON n.vid=t.vid WHERE n.type='stormtask' AND n.nid=%d";
+-  $r = db_query($s, $node->task_nid);
++  if (isset($node->task_nid)) {
++    $r = db_query($s, $node->task_nid);
++  }
+   $ta = db_fetch_object($r);
+-  $node->task_title = $ta->title;
+-  $node->task_stepno = $ta->stepno;
++  if (isset($ta->title)) {
++    $node->task_title = $ta->title;
++  }
++  if (isset($ta->stepno)) {
++    $node->task_stepno = $ta->stepno;
++  }
+ 
+   $s = "SELECT title FROM {node} AS n INNER JOIN {stormticket} AS t ON n.vid=t.vid WHERE n.type='stormticket' AND n.nid=%d";
+-  $r = db_query($s, $node->ticket_nid);
++  if (isset($node->ticket_nid)) {
++    $r = db_query($s, $node->ticket_nid);
++  }
+   $ti = db_fetch_object($r);
+-  $node->ticket_title = $ti->title;
++  if (isset($ti->title)) {
++    $node->ticket_title = $ti->title;
++  }
+ }
+ 
+ function stormexpense_nodeapi(&$node, $op, $teaser, $page) {
+diff -urpN ../storm/stormexpense/stormexpense.test ./stormexpense/stormexpense.test
+--- ../storm/stormexpense/stormexpense.test	1969-12-31 19:00:00.000000000 -0500
++++ ./stormexpense/stormexpense.test	2011-01-13 12:33:24.511100000 -0500
+@@ -0,0 +1,38 @@
++<?php
++class StormexpenseTestCase extends DrupalWebTestCase {
++
++  public static function getInfo() {
++    return array(
++      'name' => t('Storm Expense Functionality'),
++      'description' => t('Test the functionality of the Storm Expense module'),
++      'group' => 'Storm',
++    );
++  }
++
++  public function setUp() {
++    parent::setUp('storm', 'stormattribute', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormexpense');
++  }
++
++  public function testStormexpenseCreate() {
++    // Create and login user
++    $user = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: add', 'Storm expense: view all', 'Storm project: view all', 'Storm task: view all'));
++    $this->drupalLogin($user);
++
++    // Create a team
++    $org = array(
++      'title' => $this->randomName(32),
++    );
++
++    $expense = array(
++      'organization_nid' => '1',
++      'title' => $this->randomName(32),
++    );
++
++    $this->drupalPost('node/add/stormorganization', $org, t('Save'));
++
++    $this->drupalPost('node/add/stormexpense', $expense, t('Save'));
++
++    $this->assertText(t('Expense @title has been created.', array('@title' => $expense['title'])));
++  }
++}
++
