diff -r -up webformOrig/components/captcha.inc webform/components/captcha.inc
--- webformOrig/components/captcha.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/captcha.inc	2007-12-14 11:55:36.000000000 -0500
@@ -150,7 +150,7 @@ function _webform_help_captcha($section)
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_captcha($component, $data) {
+function _webform_submission_display_captcha($component, $data, $enabled = false) {
   $form_item = array();
   return $form_item;
 }
diff -r -up webformOrig/components/date.inc webform/components/date.inc
--- webformOrig/components/date.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/date.inc	2007-12-14 11:56:28.000000000 -0500
@@ -166,7 +166,7 @@ function webform_validate_date($field, $
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_date($data, $component) {
+function _webform_submission_display_date($data, $component, $enabled = false) {
   $form_item = _webform_render_date($component);
   $form_item['month']['#default_value'] = $data['value']['0'];
   $form_item['day']['#default_value']   = $data['value']['1'];
diff -r -up webformOrig/components/email.inc webform/components/email.inc
--- webformOrig/components/email.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/email.inc	2007-12-14 11:56:48.000000000 -0500
@@ -107,7 +107,7 @@ function _webform_validate_email($formel
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_email($data, $component) {
+function _webform_submission_display_email($data, $component, $enabled = false) {
   $form_item = _webform_render_email($component);
   $form_item['#default_value'] = $data['value']['0'];
   $form_item['#attributes']    = array("disabled" => "disabled");
diff -r -up webformOrig/components/fieldset.inc webform/components/fieldset.inc
--- webformOrig/components/fieldset.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/fieldset.inc	2007-12-14 11:57:10.000000000 -0500
@@ -67,7 +67,7 @@ function _webform_render_fieldset($compo
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_fieldset($data, $component) {
+function _webform_submission_display_fieldset($data, $component, $enabled = false) {
   $form_item = _webform_render_fieldset($component);
   return $form_item;
 }
diff -r -up webformOrig/components/file.inc webform/components/file.inc
--- webformOrig/components/file.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/file.inc	2007-12-14 11:57:36.000000000 -0500
@@ -304,7 +304,7 @@ function theme_webform_mail_file($data, 
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_file($data, $component) {
+function _webform_submission_display_file($data, $component, $enabled = false) {
   $filedata = unserialize($data['value'][0]);
   $form_item = _webform_render_file($component);
   $form_item['#type'] = 'textfield';
Only in webform/components: grid.inc
diff -r -up webformOrig/components/hidden.inc webform/components/hidden.inc
--- webformOrig/components/hidden.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/hidden.inc	2007-12-17 02:26:48.515377200 -0500
@@ -58,7 +58,7 @@ function _webform_render_hidden($compone
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_hidden($data, $component) {
+function _webform_submission_display_hidden($data, $component, $enabled = false) {
   $form_item = _webform_render_hidden($component);
   $form_item['#value']         = $data['value']['0'];
   $form_item['#type']          = 'textfield';
diff -r -up webformOrig/components/markup.inc webform/components/markup.inc
--- webformOrig/components/markup.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/markup.inc	2007-12-14 11:58:36.000000000 -0500
@@ -67,7 +67,7 @@ function _webform_render_markup($compone
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_markup($data, $component) {
+function _webform_submission_display_markup($data, $component, $enabled = false) {
   $form_item = _webform_render_markup($component);
   return $form_item;
 }
diff -r -up webformOrig/components/select.inc webform/components/select.inc
--- webformOrig/components/select.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/select.inc	2007-12-14 11:59:12.000000000 -0500
@@ -171,7 +171,7 @@ function _webform_render_select($compone
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_select($data, $component) {
+function _webform_submission_display_select($data, $component, $enabled = false) {
   $form_item = _webform_render_select($component);
   if ($component['extra']['multiple'] == 'Y') {
     // Set the value as an array.
@@ -198,7 +198,8 @@ function _webform_submission_display_sel
       }
     }
   }
-  $form_item['#attributes'] = array("disabled" => "disabled");
+  $form_item['#disabled'] = !$enabled;
+  //$form_item['#attributes'] = array("disabled" => "disabled");
   return $form_item;
 }
 
diff -r -up webformOrig/components/textarea.inc webform/components/textarea.inc
--- webformOrig/components/textarea.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/textarea.inc	2007-12-14 11:59:26.000000000 -0500
@@ -91,10 +91,11 @@ function _webform_render_textarea($compo
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_textarea($data, $component) {
+function _webform_submission_display_textarea($data, $component, $enabled = false) {
   $form_item = _webform_render_textarea($component);
   $form_item['#default_value'] = $data['value']['0'];
-  $form_item['#attributes']    = array("disabled" => "disabled");
+  $form_item['#disabled'] = !$enabled;
+  //$form_item['#attributes']    = array("disabled" => "disabled");
   return $form_item;
 }
 
diff -r -up webformOrig/components/textfield.inc webform/components/textfield.inc
--- webformOrig/components/textfield.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/textfield.inc	2007-12-14 11:56:10.000000000 -0500
@@ -92,10 +92,10 @@ function _webform_render_textfield($comp
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_textfield($data, $component) {
+function _webform_submission_display_textfield($data, $component, $enabled = false) {
   $form_item = _webform_render_textfield($component);
   $form_item['#default_value'] = $data['value']['0'];
-  $form_item['#disabled'] = TRUE;
+  $form_item['#disabled'] = !$enabled;
   return $form_item;
 }
 
diff -r -up webformOrig/components/time.inc webform/components/time.inc
--- webformOrig/components/time.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/components/time.inc	2007-12-14 11:59:44.000000000 -0500
@@ -152,7 +152,7 @@ function webform_validate_time($field, $
  * @return
  *   Textual output formatted for human reading.
  */
-function _webform_submission_display_time($data, $component) {
+function _webform_submission_display_time($data, $component, $enabled = false) {
   $form_item = _webform_render_time($component);
   $form_item['minute']['#default_value']   = $data['value']['1'];
   $form_item['minute']['#attributes']      = array("disabled" => "disabled");
diff -r -up webformOrig/webform.module webform/webform.module
--- webformOrig/webform.module	2007-10-21 02:46:18.000000000 -0400
+++ webform/webform.module	2007-12-17 14:21:11.805385400 -0500
@@ -62,7 +62,7 @@ function webform_help($section= "admin/h
 }
 
 function webform_perm() {
-  return array("create webforms", "edit own webforms", "edit webforms", "access webform results", "clear webform results", "use PHP for additional processing");
+  return array("create webforms", "edit own webforms", "edit webforms", "access webform results", "clear webform results", "edit own webform submissions", "edit webform submissions", "use PHP for additional processing");
 }
 
 /**
@@ -87,6 +87,8 @@ function webform_access($op, $node) {
   switch ($op) {
     case "create":
       return user_access("create webforms");
+    case "edit":
+      return user_access("edit webform submissions") || (user_access("edit own webform submissions") && ($user->uid == $node->uid));
     case "update":
     case "delete":
       return user_access("edit webforms") || (user_access("edit own webforms") && ($user->uid == $node->uid));
@@ -330,6 +332,12 @@ function webform_menu($may_cache) {
                        'callback' => 'webform_results',
                        'access' => user_access('clear webform results'),
                        'type' => MENU_CALLBACK);
+      $items[]= array('path' => 'node/'. $node->nid .'/results/edit', 'title' => t('Edit'),
+                       'callback' => 'webform_results',
+                       //access checking is done in the function called by the webform_results function,
+                       //so just grant access here to avoid redundant code...
+                       'access' => true,
+                       'type' => MENU_CALLBACK);                       
     }
   }
 
@@ -1074,7 +1082,7 @@ function webform_view(&$node, $teaser = 
 
   global $_webform_form_list;
   $_webform_form_list[] = $node->nid;
-  $output = drupal_get_form('webform_client_form_'. $node->nid, $node, $submission);
+  $output = drupal_get_form('webform_client_form_'. $node->nid, $node, $submission, false);
 
   // Remove the surrounding <form> tag if this is a preview.
   if ($preview) {
@@ -1092,7 +1100,7 @@ function webform_view(&$node, $teaser = 
  * submission, pass in the $submission variable with the contents of the
  * submission to be displayed.
  */
-function webform_client_form(&$node, $submission = array(), $form_values = NULL) {
+function webform_client_form(&$node, $submission = array(), $enabled = false, $form_values = NULL) {
   global $user;
 
   _webform_load_components(); // Load all the components.
@@ -1129,7 +1137,7 @@ function webform_client_form(&$node, $su
     $page_num = 1;
     _webform_components_tree_build($node->webformcomponents, $component_tree, 0, $page_count);
 
-    if (!$preview && empty($submission)) {
+    if ((!$preview && empty($submission)) || ($enabled)) {
       if ($page_count > 1) {
         $next_page = t('Next Page >');
         $prev_page = t('< Previous Page');
@@ -1191,10 +1199,10 @@ function webform_client_form(&$node, $su
 
     // Recursively add components to the form.
     foreach ($component_tree['children'] as $cid => $component) {
-      _webform_client_form_add_component($cid, $component, $form['submitted'], $form, $submission, $page_num);
+      _webform_client_form_add_component($cid, $component, $form['submitted'], $form, $submission, $page_num, $enabled);
     }
     // Do not display the submit button if this is a preview or submission view.
-    if (!$preview && empty($submission)) {
+    if ((!$preview && empty($submission)) || ($enabled)) {
       // Additional hidden elements.
       $form['details']['email_subject'] = array(
         '#type'      => 'hidden',
@@ -1212,36 +1220,48 @@ function webform_client_form(&$node, $su
         '#type'      => 'value',
         '#value'     => $node->nid,
       );
+      if(array_key_exists('sid', $submission)) {
+	      $form['details']['sid'] = array(
+    	      '#type'      => 'hidden',
+              '#value'     => $submission['sid'] );
+      }      
     }
   }
 
   return $form;
 }
 
-function _webform_client_form_add_component($cid, $component, &$parent_fieldset, &$form, $submission, $page_num) {
+function _webform_client_form_add_component($cid, $component, &$parent_fieldset, &$form, $submission, $page_num, $enabled = false) {
   // Load with submission information if necessary.
-  if (!empty($submission)) {
+  if (!empty($submission) && !$enabled) {
     // This component is display only, with the value set according information
     // previously submitted in the submission numbered $sid_to_display.
     $display_function = "_webform_submission_display_". $component['type'];
     if (function_exists($display_function)) {
-      $parent_fieldset[$component['form_key']] = $display_function($submission['data'][$cid], $component);
+      $parent_fieldset[$component['form_key']] = $display_function($submission['data'][$cid], $component, $enabled);
     }
   }
   else if ($component['page_num'] == $page_num) {
     // Add this user-defined field to the form (with all the values that are always available).
-    $render_function = "_webform_render_". $component['type'];
-    if (function_exists($render_function)) {
-      $parent_fieldset[$component['form_key']] = $render_function($component); // Call the component render function.
+    if ($enabled) {
+    	$display_function = "_webform_submission_display_". $component['type'];
+    	if (function_exists($display_function)) {
+      		$parent_fieldset[$component['form_key']] = $display_function($submission['data'][$cid], $component, $enabled);
+    	}
     }
     else {
-      drupal_set_message(t("The webform component @type is not able to be displayed", array('@type' => $component['type'])));
+    	$render_function = "_webform_render_". $component['type'];
+    	if (function_exists($render_function)) {
+      		$parent_fieldset[$component['form_key']] = $render_function($component); // Call the component render function.
+    	}
+    	else {
+      		drupal_set_message(t("The webform component @type is not able to be displayed", array('@type' => $component['type'])));
+    	}
     }
   }
-
   if (is_array($component['children'])) {
     foreach ($component['children'] as $scid => $subcomponent) {
-      _webform_client_form_add_component($scid, $subcomponent, $parent_fieldset[$component['form_key']], $form, $submission, $page_num);
+      _webform_client_form_add_component($scid, $subcomponent, $parent_fieldset[$component['form_key']], $form, $submission, $page_num, $enabled);
     }
   }
 }
@@ -1338,7 +1358,13 @@ function webform_client_form_submit($for
   }
 
   // Save the submission to the database.
-  $sid = _webform_save_submission($node, $form_values['submitted']);
+  if (!$form_values['details']['sid']) {
+  	// no sid was found thus insert it in the datatabase
+    $sid = _webform_save_submission($node, $form_values['submitted']);
+  } else {
+  	// sid was found thus update the existing sid in the datatbase
+    $sid = _webform_update_submission($node, $form_values['details']['sid'], $form_values['submitted']);
+  }
 
   // Check if this form is sending an email.
   if (isset ($node->email)) {
@@ -1612,6 +1638,10 @@ function webform_results() {
       case 'download' :
         $content= _webform_results_download($nid);
         break;
+      case 'edit' :
+      	$sid= arg(4);
+      	$content= webform_submission_edit($node, $sid);
+      	break;        
       case 'submissions' :
       default :
         $content= _webform_results_submissions($nid);
@@ -1728,3 +1758,50 @@ function _webform_load_components($retur
   // Ensure only wanted components are returned, even all are loaded.
   return $return_all ? $component_list : array_intersect_assoc($component_list, $enabled_list);
 }
+
+// Display the webform for editing existing submission data.
+function webform_submission_edit(&$node, $sid) {
+  global $user;
+  include_once (drupal_get_path('module', 'webform')."/webform.inc");
+  $submission = array();
+  $node->webformcomponents = _webform_components_decode($node->webformcomponents);
+  $submission = _webform_fetch_submission($sid, $node->nid);
+  if ($sid && is_numeric($sid)) {
+    if (user_access("edit webform submissions") || (user_access("edit own webform submissions") && ($user->uid == $submission['uid']))) {
+      drupal_set_title('Submission #'.$sid);
+      $node->body = "";
+
+      global $_webform_form_list;
+      $_webform_form_list[] = $node->nid;
+      return drupal_get_form('webform_client_form_'. $node->nid, $node, $submission, true);
+    } else {
+      $sid = NULL; // This user is not allowed to access a submitted node. Deny the attempt without alert.
+      watchdog('webform', t('Unauthorized webform access attempt', array ('%name' => "<em>$user->name</em>")), WATCHDOG_WARNING); // and log the attempt
+      return drupal_access_denied();
+    }
+  }
+}
+
+function _webform_update_submission($node, $sid, $submitted) {
+  global $user;
+  //update submission by first deleting and then inserting it to the database
+  db_query("DELETE FROM {webform_submissions} WHERE sid = %d", $sid);
+  db_query("INSERT INTO {webform_submissions} (nid, sid, uid, submitted, remote_addr) "." VALUES (%d, %d, %d, %d, '%s')", $node->nid, $sid, $user->uid, time(), $_SERVER['REMOTE_ADDR']);
+  // update the submission data by first removing all this submissions data
+  db_query("DELETE FROM {webform_submitted_data} WHERE sid = %d", $sid);
+  // and then re-ad it to the database
+  foreach ($submitted as $cid => $value) {
+    if (is_array($value)) {
+      $delta = 0;
+      foreach ($value as $k => $v) {
+        db_query("INSERT INTO {webform_submitted_data} (nid, sid, cid, no, data) "."VALUES (%d, %d, %d, %d, '%s')", $node->nid, $sid, $cid, $delta, $v);
+        $delta++;
+      }
+    }
+    else {
+      db_query("INSERT INTO {webform_submitted_data} (nid, sid, cid, no, data) "."VALUES (%d, %d, %d, %d, '%s')", $node->nid, $sid, $cid, 0, $value);
+    }
+  }
+
+  return $sid;
+}
diff -r -up webformOrig/webform_report.inc webform/webform_report.inc
--- webformOrig/webform_report.inc	2007-10-20 01:39:24.000000000 -0400
+++ webform/webform_report.inc	2007-12-14 14:34:36.000000000 -0500
@@ -41,7 +41,7 @@ function theme_webform_results_submissio
  *   An array of all submissions for this webform.
  */
 function theme_webform_results_submissions($nid, $submissions) {
-
+  global $user;
   // This header has to be generated seperately so we can add the SQL necessary
   // to sort the results.
   $header = theme('webform_results_submissions_header', $nid);
@@ -55,7 +55,11 @@ function theme_webform_results_submissio
       $submission->remote_addr,
       l(t('View'), "node/$nid", NULL, "sid=". $submission->sid, NULL, FALSE),
     );
-
+    if ((user_access("edit own webform submissions") && ($user->uid == $submission->uid)) || user_access("edit webform submissions")) {
+	  $row[] = l(t('Edit'),"node/$nid/results/edit/".$submission->sid, NULL, NULL, NULL, FALSE);
+	} else {
+	  $row[] = t('Edit');
+	}
     if (user_access('clear webform results')) {
       $row[] = l(t('Delete'), "node/$nid/results/delete/". $submission->sid, NULL, NULL, NULL, FALSE);
     }
