diff --git a/stormtimetracking/stormtimetracking.module b/stormtimetracking/stormtimetracking.module
index fda4e4a..6aedc99 100644
--- a/stormtimetracking/stormtimetracking.module
+++ b/stormtimetracking/stormtimetracking.module
@@ -308,16 +308,16 @@ function stormtimetracking_form(&$node) {
       }
     }
 
-    if ($_SESSION['stormtimetracking_list_filter']['organization_nid'] && !$node->organization_nid) {
+    if (isset($_SESSION['stormtimetracking_list_filter']['organization_nid']) && !$node->organization_nid) {
       $node->organization_nid = $_SESSION['stormtimetracking_list_filter']['organization_nid'];
     }
-    if ($_SESSION['stormtimetracking_list_filter']['project_nid'] && !$node->project_nid) {
+    if (isset($_SESSION['stormtimetracking_list_filter']['project_nid']) && !$node->project_nid) {
       $node->project_nid = $_SESSION['stormtimetracking_list_filter']['project_nid'];
     }
-    if ($_SESSION['stormtimetracking_list_filter']['task_nid'] && !$node->task_nid) {
+    if (isset($_SESSION['stormtimetracking_list_filter']['task_nid']) && !$node->task_nid) {
       $node->task_nid = $_SESSION['stormtimetracking_list_filter']['task_nid'];
     }
-    if ($_SESSION['stormtimetracking_list_filter']['ticket_nid'] && !$node->ticket_nid) {
+    if (isset($_SESSION['stormtimetracking_list_filter']['ticket_nid']) && !$node->ticket_nid) {
       $node->ticket_nid = $_SESSION['stormtimetracking_list_filter']['ticket_nid'];
     }
     if (array_key_exists('organization_nid', $_GET)) $node->organization_nid = $_GET['organization_nid'];
@@ -476,13 +476,11 @@ function stormtimetracking_form(&$node) {
     '#weight' => 3,
     '#disabled' => TRUE,
   );
-  
-  $billing_duration = $node->billing_duration;
-  if ($billing_duration) $billing_duration = sprintf("%01.2f", $node->billing_duration);
+
   $form['group3']['billing_duration'] = array(
     '#type' => 'textfield',
     '#title' => t('Billing duration (h)'),
-    '#default_value' => $billing_duration,
+    '#default_value' => sprintf("%01.2f", isset($node->billing_duration) ? $node->billing_duration : 0),
     '#size' => 10,
     '#maxlength' => 5,
     '#weight' => 4,
@@ -497,14 +495,14 @@ function stormtimetracking_form(&$node) {
   $form['group4']['billable'] = array(
     '#type' => 'checkbox',
     '#title' => t('Billable'),
-    '#default_value' => $node->billable,
+    '#default_value' => isset($node->billable) ? $node->billable : TRUE,
     '#weight' => 1,
   );
   
   $form['group4']['billed'] = array(
     '#type' => 'checkbox',
     '#title' => t('Billed'),
-    '#default_value' => $node->billed,
+    '#default_value' => isset($node->billed) ? $node->billed : FALSE,
     '#weight' => 2,
   );
   
@@ -581,18 +579,18 @@ function _stormtimetracking_beforesave(&$node) {
   $s = "SELECT n.title, p.organization_title FROM {node} n INNER JOIN {stormproject} p ON n.nid=p.nid WHERE type='stormproject' AND n.nid=%d";
   $r = db_query($s, $node->project_nid);
   $p = db_fetch_object($r);
-  $node->project_title = $p->title;
+  $node->project_title = isset($p->title) ? $p->title : '';
 
   $s = "SELECT title, stepno FROM {node} n INNER JOIN {stormtask} t ON n.nid=t.nid WHERE n.type='stormtask' AND n.nid=%d";
   $r = db_query($s, $node->task_nid);
   $ta = db_fetch_object($r);
-  $node->task_title = $ta->title;
-  $node->task_stepno = $ta->stepno;
+  $node->task_title = isset($ta->title) ? $ta->title : '';
+  $node->task_stepno = isset($ta->stepno) ? $ta->stepno : '';
 
   $s = "SELECT title FROM {node} n INNER JOIN {stormticket} t ON n.nid=t.nid WHERE n.type='stormticket' AND n.nid=%d";
   $r = db_query($s, $node->ticket_nid);
   $ti = db_fetch_object($r);
-  $node->ticket_title = $ti->title;
+  $node->ticket_title = isset($ti->title) ? $ti->title : '';
 }
 
 function stormtimetracking_nodeapi(&$node, $op, $teaser, $page) {
diff --git a/stormtimetracking/stormtimetracking.test b/stormtimetracking/stormtimetracking.test
new file mode 100644
index 0000000..e5009b9
--- /dev/null
+++ b/stormtimetracking/stormtimetracking.test
@@ -0,0 +1,50 @@
+<?php
+class StormtimetrackingTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Storm Timetracking Functionality'),
+      'description' => t('Test the functionality of the Storm Timetracking module'),
+      'group' => 'Storm',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('storm', 'stormattribute', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormtimetracking');
+  }
+
+  public function testStormtimetrackingCreate() {
+    // Create and login user
+    $user = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: add', 'Storm project: view all', 'Storm task: add', 'Storm task: view all', 'Storm ticket: add', 'Storm ticket: view all', 'Storm timetracking: add', 'Storm timetracking: view all'));
+    $this->drupalLogin($user);
+
+    // Create organization and invoice
+    $org = array(
+      'title' => $this->randomName(32),
+      'body' => $this->randomName(64),
+    );
+    $prj = array(
+      'title' => $this->randomName(32),
+      'organization_nid' => '1',
+    );
+    $task = array(
+      'title' => $this->randomName(32),
+      'body' => $this->randomName(64),
+    );
+    $ticket = array(
+      'title' => $this->randomName(32),
+      'body' => $this->randomName(64),
+    );
+    $timetracking = array(
+      'title' => $this->randomName(32),
+      'body' => $this->randomName(64),
+    );
+    $this->drupalPost('node/add/stormorganization', $org, t('Save'));
+    $this->drupalPost('node/add/stormproject', $prj, t('Save'));
+    $this->drupalPost('node/add/stormtask', $task, t('Save'));
+    $this->drupalPost('node/add/stormticket', $ticket, t('Save'));
+    $this->drupalPost('node/add/stormtimetracking', $timetracking, t('Save'));
+
+    $this->assertText(t('Timetracking @title has been created.', array('@title' => $timetracking['title'])));;
+  }
+}
