diff -upr webform-5.x-2.7/webform.module webform-permissions/webform.module
--- webform-5.x-2.7/webform.module	2009-02-14 02:18:17.000000000 -0600
+++ webform-permissions/webform.module	2009-08-04 15:44:44.000000000 -0500
@@ -136,7 +136,7 @@ function webform_menu($may_cache) {
         'title' => t('Results'),
         'callback' => 'webform_results',
         'callback arguments' => array($node),
-        'access' => webform_results_access($node, 'access webform results'),
+        'access' => webform_results_access($node),
         'weight' => 2,
         'type' => MENU_LOCAL_TASK,
       );
@@ -145,7 +145,7 @@ function webform_menu($may_cache) {
         'title' => t('Submissions'),
         'callback' => 'webform_results',
         'callback arguments' => array($node),
-        'access' => webform_results_access($node, 'access webform results'),
+        'access' => webform_results_access($node),
         'weight' => 4,
         'type' => MENU_DEFAULT_LOCAL_TASK,
       );
@@ -154,7 +154,7 @@ function webform_menu($may_cache) {
         'title' => t('Analysis'),
         'callback' => 'webform_results',
         'callback arguments' => array($node, 'analysis'),
-        'access' => webform_results_access($node, 'access webform results'),
+        'access' => webform_results_access($node),
         'weight' => 5,
         'type' => MENU_LOCAL_TASK,
       );
@@ -163,7 +163,7 @@ function webform_menu($may_cache) {
         'title' => t('Table'),
         'callback' => 'webform_results',
         'callback arguments' => array($node, 'table'),
-        'access' => webform_results_access($node, 'access webform results'),
+        'access' => webform_results_access($node),
         'weight' => 6,
         'type' => MENU_LOCAL_TASK,
       );
@@ -172,7 +172,7 @@ function webform_menu($may_cache) {
         'title' => t('Download'),
         'callback' => 'webform_results',
         'callback arguments' => array($node, 'download'),
-        'access' => webform_results_access($node, 'access webform results'),
+        'access' => webform_results_access($node),
         'weight' => 7,
         'type' => MENU_LOCAL_TASK,
       );
@@ -181,7 +181,7 @@ function webform_menu($may_cache) {
         'title' => t('Clear'),
         'callback' => 'webform_results',
         'callback arguments' => array($node, 'clear'),
-        'access' => webform_results_access($node, 'clear webform results'),
+        'access' => webform_results_clear_access($node),
         'weight' => 8,
         'type' => MENU_LOCAL_TASK,
       );
@@ -190,7 +190,7 @@ function webform_menu($may_cache) {
         'title' => t('Submissions'),
         'callback' => 'webform_results',
         'callback arguments' => array($node, 'user_submissions'),
-        'access' => user_access('access webform results') || user_access('access webform submissions') || (user_access('access own webform submissions')  && $user->uid),
+        'access' => user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid) || user_access('access webform submissions') || (user_access('access own webform submissions')  && $user->uid),
         'weight' => 2,
         'type' => MENU_CALLBACK,
       );
@@ -241,17 +241,25 @@ function webform_menu($may_cache) {
 }
 
 /**
- * Menu access callback. Ensure a user both access and node 'view' permission.
+ * Menu access callback for viewing the results of a webform. Ensure a user has both access to webform results and node 'view' permission.
  */
-function webform_results_access($node, $perm) {
-  return node_access('view', $node) && user_access($perm);
+function webform_results_access($node) {
+  global $user;
+  return (node_access('view', $node) && (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid)));
+}
+
+/**
+ * Menu access callback for clearing the results of a webform. Ensure a user has both access to clear webform results and node 'view' permission.
+ */
+function webform_results_clear_access($node) {
+  return node_access('view', $node) && user_access('clear webform results');
 }
 
 /**
  * Implementation of hook_perm().
  */
 function webform_perm() {
-  return array('create webforms', 'edit own webforms', 'edit webforms', 'access webform results', 'clear webform results', 'access own webform submissions', 'edit own webform submissions', 'edit webform submissions', 'use PHP for additional processing');
+  return array('create webforms', 'edit own webforms', 'edit webforms', 'access own webform results', 'access webform results', 'clear webform results', 'access own webform submissions', 'edit own webform submissions', 'delete own webform submissions', 'edit webform submissions', 'delete webform submissions', 'use PHP for additional processing');
 }
 
 /**
@@ -302,8 +310,10 @@ function webform_forms($args) {
  * Only allow users with view webform submissions to download files.
  */
 function webform_file_download($file) {
+  global $user;
   $file = file_check_location(file_directory_path() .'/'. $file, file_directory_path() .'/webform/');
-  if ($file && user_access('access webform results')) {
+//TODO: add support for 'access own webform results' for private file download method
+  if ($file && (user_access('access webform results'))) {
     $info = image_get_info(file_create_path($file));
     if (isset($info['mime_type'])) {
       $headers = array('Content-type: '. $info['mime_type']);
@@ -946,7 +956,7 @@ function webform_view(&$node, $teaser = 
   }
 
   // Get a count of previous submissions by this user.
-  if ($user->uid && (user_access('access own webform submissions') || user_access('access webform results') || user_access('access webform submissions'))) {
+  if ($user->uid && (user_access('access own webform submissions') || user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid) || user_access('access webform submissions'))) {
     $submission_count = db_result(db_query('SELECT count(*) FROM {webform_submissions} WHERE nid = %d AND uid = %d', $node->nid, $user->uid));
   }
 
@@ -1215,6 +1225,7 @@ function theme_webform_admin_settings($f
  *   specified when using drupal_get_form().
  */
 function webform_client_form(&$node, $submission, $enabled, $preview, $form_values = NULL) {
+  global $user;
   include_once(drupal_get_path('module', 'webform') .'/webform_components.inc');
   webform_load_components();
 
@@ -1223,7 +1234,7 @@ function webform_client_form(&$node, $su
   }
 
   // Set a header for navigating results.
-  if ($submission && user_access('access webform results')) {
+  if ($submission && (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid))) {
     // Add CSS to display submission info. Don't preprocess because this CSS file is used rarely.
     drupal_add_css(drupal_get_path('module', 'webform') .'/webform.css', 'module', 'all', FALSE);
 
diff -upr webform-5.x-2.7/webform_report.inc webform-permissions/webform_report.inc
--- webform-5.x-2.7/webform_report.inc	2009-03-03 23:05:18.000000000 -0600
+++ webform-permissions/webform_report.inc	2009-08-04 15:44:44.000000000 -0500
@@ -85,11 +85,12 @@ function theme_webform_results_per_page(
  * use it for sorting the results.
  */
 function theme_webform_results_submissions_header($node) {
+  global $user;
   $columns = array(
     array('data' => t('#'), 'field' => 'sid', 'sort' => 'asc'),
     array('data' => t('Submitted'), 'field' => 'submitted'),
   );
-  if (user_access('access webform results')) {
+  if (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
     $columns[] = array('data' => t('User'), 'field' => 'name');
     $columns[] = array('data' => t('IP Address'), 'field' => 'remote_addr');
   }
@@ -125,17 +126,16 @@ function theme_webform_results_submissio
       $sid,
       format_date($submission->submitted, 'small'),
     );
-    if (user_access('access webform results')) {
+    if (user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid)) {
       $row[] = theme('username', $submission);
       $row[] = $submission->remote_addr;
     }
     $row[] = l(t('View'), "node/$node->nid/submission/$sid");
-    if ((user_access('edit own webform submissions') && ($user->uid == $submission->uid)) || user_access('edit webform submissions')) {
+    if (webform_submission_access($node, $submission, 'edit')) {
       $row[] = l(t('Edit'), "node/$node->nid/submission/$sid/edit");
-      $row[] = l(t('Delete'), "node/$node->nid/submission/$sid/delete", NULL, drupal_get_destination());
     }
-    else {
-      $row[count($row) - 1] = array('data' => $row[count($row) - 1], 'colspan' => 3);
+    if (webform_submission_access($node, $submission, 'delete')) {
+      $row[] = l(t('Delete'), "node/$node->nid/submission/$sid/delete", NULL, drupal_get_destination());
     }
     $rows[] = $row;
   }
diff -upr webform-5.x-2.7/webform_submissions.inc webform-permissions/webform_submissions.inc
--- webform-5.x-2.7/webform_submissions.inc	2009-02-14 00:26:24.000000000 -0600
+++ webform-permissions/webform_submissions.inc	2009-08-04 15:44:44.000000000 -0500
@@ -15,11 +15,11 @@ function webform_submission_access($node
 
   switch ($op) {
     case 'view':
-      return user_access('access webform results') || (user_access('access own webform submissions') && ($account->uid == $submission->uid));
+      return user_access('access webform results') || (user_access('access own webform results') && $user->uid == $node->uid) || (user_access('access own webform submissions') && ($account->uid == $submission->uid));
     case 'edit':
       return user_access('edit webform submissions') || (user_access('edit own webform submissions') && ($account->uid == $submission->uid));
     case 'delete':
-      return user_access('edit webform submissions') || (user_access('edit own webform submissions') && ($account->uid == $submission->uid)) || user_access('clear webform results');
+      return user_access('delete webform submissions') || (user_access('delete own webform submissions') && ($account->uid == $submission->uid)) || user_access('clear webform results');
   }  
 }
 
