diff -upr ../../../all/modules/time/includes/time_entry.inc ./includes/time_entry.inc
--- ../../../all/modules/time/includes/time_entry.inc	2010-01-11 23:30:03.000000000 +0100
+++ ./includes/time_entry.inc	2010-10-08 22:11:17.000000000 +0200
@@ -1,4 +1,4 @@
-<?php // $Id: time_entry.inc,v 1.4 2010/01/11 22:30:03 vauxia Exp $
+<?php // $Id$
 
 class time_entry {
   var $tpid;
@@ -128,6 +128,13 @@ class time_entry {
       '#type' => 'submit',
       '#value' => t('Save'),
     );
+    if ($this->teid) {
+      $form['delete'] = array(
+        '#type' => 'submit',
+        '#value' => t('Delete'),
+        '#access' => $this->uid == $GLOBALS['user']->uid || user_access('administer time tracking'),
+      );
+    }
 
     return $form;
   }
@@ -146,6 +153,33 @@ class time_entry {
     }
   }
 
+  function delete_form() {
+    $description = $this->timestamp();
+    if ($node = $this->node()) {
+      $description = check_plain($node->title) . ', ' . $description;
+    }
+    $description .= ': ' . $this->duration();
+    if ($this->note()) {
+      $description .= '<br />' . theme_placeholder($this->note());
+    }
+    if (!empty($_REQUEST['destination'])) {
+      $return_path = $_REQUEST['destination'];
+    }
+    elseif (!empty($this->nid)) {
+      $return_path = 'node/' . $this->nid . '/time/' . $this->teid . '/edit';
+    }
+    else {
+      $return_path = '/time/' . $this->teid . '/edit';
+    }
+    return confirm_form($form, t('Are you sure you want to delete this time entry?'), $return_path, $description, t('Delete'), t('Cancel'));
+  }
+
+  function delete() {
+    if ($this->teid) {
+      db_query('DELETE FROM {time_entry} WHERE teid = %d', $this->teid);
+    }
+  }
+
   function save_profile() {
     $update = isset($this->tpid) ? 'tpid' : NULL;
     $this->handler = get_class($this);
diff -upr ../../../all/modules/time/time.module ./time.module
--- ../../../all/modules/time/time.module	2010-01-11 23:33:41.000000000 +0100
+++ ./time.module	2010-10-08 22:07:53.000000000 +0200
@@ -76,6 +76,14 @@ function time_menu() {
     'file' => 'time.admin.inc',
     'file path' => drupal_get_path('module', 'time') .'/includes',
   );
+  $items['time/%time/delete'] = array(
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('time_delete', 1),
+    'access callback' => 'time_access',
+    'access arguments' => array(NULL, NULL, 1),
+    'title' => t('Delete time'),
+    'type' => MENU_CALLBACK,
+  );
   $items['time/%time_profile/%time/edit'] = array(
     'page callback' => 'drupal_get_form',
     'page arguments' => array('time_form', 2),
@@ -257,7 +265,32 @@ function time_form_validate($form, &$for
  */
 function time_form_submit($form, &$form_state) {
   $time_entry = $form['time']['#time_entry'];
-  return $time_entry->save($form_state['values']['time']);
+  if ($time_entry && $form_state['values']['op'] == t('Delete')) {
+    $dest = $_REQUEST['destination'];
+    unset($_REQUEST['destination']);
+    drupal_goto('time/' . $time_entry->teid . '/delete', 'destination=' . $dest);
+  }
+  else {
+    return $time_entry->save($form_state['values']['time']);
+  }
+}
+
+/**
+ * Time entry deletion form.
+ */
+function time_delete($form_state, $time_entry = NULL) {
+  return $time_entry->delete_form();
+}
+
+/**
+ * Submit handler for time_delete().
+ */
+function time_delete_submit($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Delete')) {
+    $time_entry = $form['#parameters'][2];
+    $time_entry->delete();
+    drupal_set_message(t('The time entry has been deleted.'));
+  }
 }
 
 /**
