diff -rup storm/storm.css storm-527982/storm.css
--- storm/storm.css	2009-07-17 14:59:51.000000000 +0100
+++ storm-527982/storm.css	2009-07-30 07:52:32.000000000 +0100
@@ -43,7 +43,7 @@ background-color: #fff;
 }
 
 div.storm_popup_inner {
-text-align: center;
+text-align: left;
 }
 
 div.storm_popup_inner form div div.form-item {
@@ -54,11 +54,16 @@ div.storm_popup_inner form div input.for
 margin: 5px 0 0 0;
 }
 
+div.storm_popup_inner dl {
+margin: 5px;
+}
+
 div.storm_popup_title {
 float: left;
 text-align: center;
 color: #fff;
 width: 100%;
+background: transparent url(icons/dialog_close.png) no-repeat top right;
 background-color: #5294C1;
 }
 
diff -rup storm/storm.module storm-527982/storm.module
--- storm/storm.module	2009-07-30 23:38:20.000000000 +0100
+++ storm-527982/storm.module	2009-07-30 07:52:32.000000000 +0100
@@ -125,6 +125,14 @@ function storm_admin_settings() {
     '#weight' => $w++,
   );
 
+  $form['storm_list_shortcut_menu'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show List Shortcut Menus'),
+    '#default_value' => variable_get('storm_list_shortcut_menu', false),
+    '#description' => t("Enable/Disable shortcut menus on lists."),
+    '#weight' => $w++,
+  );
+
   $form['storm_report_header'] = array(
     '#type' => 'textarea',
     '#title' => t('Report header'),
@@ -590,9 +570,12 @@ function storm_icon_delete($path, $item,
   return storm_icon_l('application_delete', $path, t('Delete'), '', $params, $attributes);
 }
 
-function storm_icon_l($icon, $path, $title, $permission='', $params=array(), $attributes=array()) {
+function storm_icon_l($icon, $path, $title, $permission='', $params=array(), $attributes=array(), $link_text='') {
   if ($permission && !user_access($permission)) return '';
   $icon = storm_icon($icon, $title);
+  if (!$link_text=='') {
+    $icon .= '&nbsp;'. $link_text;
+  }
   $attributes ['title'] = $title;
 
   $query = '';
@@ -648,6 +631,121 @@ function storm_icon($icon, $title) {
   return $o;
 }
 
+/*
+/ Storm links, used in context menus
+*/
+function storm_link_add_project($node=array(), $params=array()) {
+  if (module_exists('stormproject') && stormproject_access('create', NULL)) {
+    $v = storm_icon_l('application_add', 'node/add/stormproject', t('Add project'), '', $params, '', 'Add project');
+    return $v;
+  }
+}
+
+function storm_link_delete_project($node=array(), $params=array()) {
+  if (module_exists('stormproject') && stormproject_access('delete', $node)) {
+    $v = storm_icon_l('application_delete', 'node/'. $node->nid .'/delete', t('Delete project'), '', $params, '', 'Delete project');
+    return $v;
+  }
+}
+
+function storm_link_edit_project($node=array(), $params=array()) {
+  if (module_exists('stormproject') && stormproject_access('update', $node)) {
+    $v = storm_icon_l('application_edit', 'node/'. $node->nid .'/edit', t('Edit project'), '', $params, '', 'Edit project');
+    return $v;
+  }
+}
+
+function storm_link_view_project($node=array(), $params=array()) {
+  if (module_exists('stormproject') && stormproject_access('view', $node)) {
+    $v = storm_icon_l('projects', 'node/'. $node->nid, t('View project'), '', $params, '', 'View project');
+    return $v;
+  }
+}
+
+function storm_link_add_task($node=array(), $params=array()) {
+  if (module_exists('stormtask') && stormtask_access('create', NULL)) {
+    $v = storm_icon_l('application_add', 'node/add/stormtask', t('Add Task'), '', $params, '', 'Add Task');
+    return $v;
+  }
+}
+
+function storm_link_delete_task($node=array(), $params=array()) {
+  if (module_exists('stormtask') && stormtask_access('delete', $node)) {
+    $v = storm_icon_l('application_delete', 'node/'. $node->nid .'/delete', t('Delete Task'), '', $params, '', 'Delete task');
+    return $v;
+  }
+}
+
+function storm_link_edit_task($node=array(), $params=array()) {
+  if (module_exists('stormtask') && stormtask_access('update', $node)) {
+    $v = storm_icon_l('application_edit', 'node/'. $node->nid .'/edit', t('Edit Task'), '', $params, '', 'Edit Task');
+    return $v;
+  }
+}
+
+function storm_link_view_task($node=array(), $params=array()) {
+  if (module_exists('stormtask') && stormtask_access('view', $node)) {
+    $v = storm_icon_l('tasks', 'node/'. $node->nid, t('View Task'), '', $params, '', 'View Task');
+    return $v;
+  }
+}
+
+function storm_link_add_ticket($node=array(), $params=array()) {
+  if (module_exists('stormticket') && stormticket_access('create', $node)) {
+    $v = storm_icon_l('tickets', 'node/add/stormticket', t('Add Ticket'), '', $params, '', 'Add Ticket');
+    return $v;
+  }
+}
+
+function storm_link_delete_ticket($node=array(), $params=array()) {
+  if (module_exists('stormticket') && stormticket_access('delete', $node)) {
+    $v = storm_icon_l('application_delete', 'node/'. $node->nid .'/delete', t('Delete Ticket'), '', $params, '', 'Delete Ticket');
+    return $v;
+  }
+}
+
+function storm_link_edit_ticket($node=array(), $params=array()) {
+  if (module_exists('stormticket') && stormticket_access('update', $node)) {
+    $v = storm_icon_l('application_edit', 'node/'. $node->nid .'/edit', t('Edit Ticket'), '', $params, '', 'Edit Ticket');
+    return $v;
+  }
+}
+
+function storm_link_view_ticket($node=array(), $params=array()) {
+  if (module_exists('stormticket') && stormticket_access('view', $node)) {
+    $v = storm_icon_l('tickets', 'node/'. $node->nid, t('View Ticket'), '', $params, '', 'View Ticket');
+    return $v;
+  }
+}
+
+function storm_link_add_expense($node=array(), $params=array()) {
+  if (module_exists('stormexpense') && stormexpense_access('create', NULL)) {
+    $v = storm_icon_l('expenses', 'node/add/stormexpense', t('Add Expense'), '', $params, '', 'Add Expense');
+    return $v;
+  }
+}
+
+function storm_link_add_note($node=array(), $params=array()) {
+  if (module_exists('stormnote') && stormnote_access('create', NULL)) {
+    $v = storm_icon_l('notes', 'node/add/stormnote', t('Add Note'), '', $params, '', 'Add Note');
+    return $v;
+  }
+}
+
+function storm_link_add_teammember($node=array(), $params=array()) {
+  if (module_exists('stormteammember') && stormteammember_access('create', NULL)) {
+    $v = storm_icon_l('teammembers', 'storm/teammembers/add', t('Add Teammember'), '', $params, '', 'Add Teammember');
+    return $v;
+  }
+}
+
+function storm_link_add_timetracking($node=array(), $params=array()) {
+  if (module_exists('stormtimetracking') && stormtimetracking_access('create', NULL)) {
+    $v = storm_icon_l('timetracking', 'node/add/stormtimetracking', t('Add Timetracking'), '', $params, '', 'Add Timetracking');
+    return $v;
+  }
+}
+
 // SQL FUNCTIONS
 function storm_rewrite_sql($sql, $where=array(), $join=array()) {
   $where = empty($where) ? '' : '('. implode(') AND (', $where) .')';

diff -rup storm/stormproject/stormproject.theme.inc storm-527982/stormproject/stormproject.theme.inc
--- storm/stormproject/stormproject.theme.inc	2009-07-24 22:58:17.000000000 +0100
+++ storm-527982/stormproject/stormproject.theme.inc	2009-07-30 07:52:32.000000000 +0100
@@ -16,14 +16,25 @@ function theme_stormproject_list($header
     $n->organization_nid = $project->organization_nid;
     $n->type = 'stormproject';
 
+    if (variable_get('storm_list_shortcut_menu', true)) {
+      $actions_attrs = array(
+        'onclick' => "storm_popup(this, 'project_list_form_actions', 'Project Actions', 150, 231, 'stormproject_list_form_actions". $n->nid ."', 'l'); return false;",
+      );
+      $row_data = storm_icon_l('ui_menu', '', t('Project Actions'), '', array(), $actions_attrs) .'&nbsp;'. stormproject_list_form_actions($n);
+    }
+    else {
+      $row_data = storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET);
+    }
+
     $rows[] = array(
       storm_icon('projectcategory_'. $project->projectcategory, $project->projectcategory),
       l($project->organization_title, 'node/'. $project->organization_nid),
       l($project->title, 'node/'. $project->nid) . theme('mark', node_mark($project->nid, $project->changed)),
       storm_icon('status_'. $project->projectstatus, $project->projectstatus),
       storm_icon('priority_'. $project->projectpriority, $project->projectpriority),
+
       array(
-        'data' => storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET),
+        'data' => $row_data,
         'class' => 'storm_list_operations',
       ),
     );
@@ -99,4 +110,26 @@ function theme_stormproject_view($node, 
   $node->content['stormproject']['links']['timetrackings'] = theme_storm_link('stormproject', 'stormtimetracking', $node->nid, $w++);
   
   return $node;
-}
\ No newline at end of file
+}
+
+function stormproject_list_form_actions($node) {
+  $params = array_merge($_GET, array('project_nid' => $node->nid));
+  $r = '<div id="stormproject_list_form_actions';
+  $r .= $node->nid ;
+  $r .= '" class="storm_list_form_report">';
+  $r .= '<dl>';
+  $r .= '<dt>'. storm_link_delete_project($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_edit_project($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_view_project($node, $params) .'</dt>';
+  $r .= '<dt>&nbsp;</dt>';
+  $r .= '<dt>'. storm_link_add_expense($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_note($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_task($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_teammember($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_ticket($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_timetracking($n, $params) .'</dt>';
+  $r .= '</dl>';
+  $r .= '</div>';
+
+  return $r;
+}

diff -rup storm/stormtask/stormtask.theme.inc storm-527982/stormtask/stormtask.theme.inc
--- storm/stormtask/stormtask.theme.inc	2009-07-24 23:03:59.000000000 +0100
+++ storm-527982/stormtask/stormtask.theme.inc	2009-07-30 07:52:32.000000000 +0100
@@ -53,8 +53,19 @@ function theme_stormtask_list($header, $
     $n->nid = $task->nid;
     $n->uid = $task->uid;
     $n->organization_nid = $task->organization_nid;
+    $n->project_nid = $task->project_nid;
     $n->type = 'stormtask';
 
+    if (variable_get('storm_list_shortcut_menu', true)) {
+      $actions_attrs = array(
+        'onclick' => "storm_popup(this, 'task_list_form_actions', 'Task Actions', 150, 231, 'stormtask_list_form_actions". $n->nid ."', 'l'); return false;",
+      );
+      $row_data = storm_icon_l('ui_menu', '', t('Task Actions'), '', array(), $actions_attrs) .'&nbsp;'. stormtask_list_form_actions($n);
+    }
+    else {
+      $row_data = storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET);
+    }
+
     $rows[] = array(
       l($task->organization_title, 'node/'. $task->organization_nid),
       l($task->project_title, 'node/'. $task->project_nid),
@@ -63,7 +74,7 @@ function theme_stormtask_list($header, $
       storm_icon('status_'. $task->taskstatus, $task->taskstatus),
       storm_icon('priority_'. $task->taskpriority, $task->taskpriority),
       array(
-        'data' => storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET),
+        'data' => $row_data,
         'class' => 'storm_list_operations',
       ),
     );
@@ -133,4 +144,26 @@ function theme_stormtask_view($node, $te
   $node->content['stormtask']['links']['timetrackings'] = theme_storm_link('stormtask', 'stormtimetracking', $node->nid, $w++);
   
   return $node;
-}
\ No newline at end of file
+}
+
+function stormtask_list_form_actions($node) {
+  $params = array_merge($_GET, array('task_nid' => $node->nid));
+  $r = '<div id="stormtask_list_form_actions';
+  $r .= $node->nid ;
+  $r .= '" class="storm_list_form_report">';
+  $r .= '<dl>';
+  $r .= '<dt>'. storm_link_delete_task($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_edit_task($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_view_task($node, $params) .'</dt>';
+  $r .= '<dt>&nbsp;</dt>';
+  $r .= '<dt>'. storm_link_add_expense($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_note($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_task($node, array_merge($_GET, array('project_nid' => $node->project_nid), array('parent_nid' => $node->nid))) .'</dt>';
+  $r .= '<dt>'. storm_link_add_teammember($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_ticket($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_timetracking($n, $params) .'</dt>';
+  $r .= '</dl>';
+  $r .= '</div>';
+
+  return $r;
+}

diff -rup storm/stormticket/stormticket.theme.inc storm-527982/stormticket/stormticket.theme.inc
--- storm/stormticket/stormticket.theme.inc	2009-07-24 23:05:33.000000000 +0100
+++ storm-527982/stormticket/stormticket.theme.inc	2009-07-30 07:52:32.000000000 +0100
@@ -15,6 +15,16 @@ function theme_stormticket_list($header,
     $n->organization_nid = $ticket->organization_nid;
     $n->type = 'stormticket';
 
+    if (variable_get('storm_list_shortcut_menu', true)) {
+      $actions_attrs = array(
+        'onclick' => "storm_popup(this, 'ticket_list_form_actions', 'Ticket Actions', 150, 168, 'stormticket_list_form_actions". $n->nid ."', 'l'); return false;",
+      );
+      $row_data = storm_icon_l('ui_menu', '', t('Ticket Actions'), '', array(), $actions_attrs) .'&nbsp;'. stormticket_list_form_actions($n);
+    }
+    else {
+      $row_data = storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET);
+    }
+
     $rows[] = array(
       storm_icon('category_'. $ticket->ticketcategory, $ticket->ticketcategory),
       l($ticket->organization_title, 'node/'. $ticket->organization_nid),
@@ -24,7 +34,7 @@ function theme_stormticket_list($header,
       storm_icon('status_'. $ticket->ticketstatus, $ticket->ticketstatus),
       storm_icon('priority_'. $ticket->ticketpriority, $ticket->ticketpriority),
       array(
-        'data' => storm_icon_edit_node($n, $_GET) .'&nbsp;'. storm_icon_delete_node($n, $_GET),
+        'data' => $row_data,
         'class' => 'storm_list_operations',
       ),
     );
@@ -114,4 +124,23 @@ function theme_stormticket_view($node, $
   $node->content['stormticket']['links']['timetrackings'] = theme_storm_link('stormticket', 'stormtimetracking', $node->nid, $w++);
   
   return $node;
-}
\ No newline at end of file
+}
+
+function stormticket_list_form_actions($node) {
+  $params = array_merge($_GET, array('ticket_nid' => $node->nid));
+  $r = '<div id="stormticket_list_form_actions';
+  $r .= $node->nid ;
+  $r .= '" class="storm_list_form_report">';
+  $r .= '<dl>';
+  $r .= '<dt>'. storm_link_delete_ticket($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_edit_ticket($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_view_ticket($node, $params) .'</dt>';
+  $r .= '<dt>&nbsp;</dt>';
+  $r .= '<dt>'. storm_link_add_expense($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_teammember($node, $params) .'</dt>';
+  $r .= '<dt>'. storm_link_add_timetracking($n, $params) .'</dt>';
+  $r .= '</dl>';
+  $r .= '</div>';
+
+  return $r;
+}
