diff --git a/tests/WebformPermissionsTestCase.test b/tests/WebformPermissionsTestCase.test
index 9779ab7..691a5dd 100644
--- a/tests/WebformPermissionsTestCase.test
+++ b/tests/WebformPermissionsTestCase.test
@@ -42,4 +42,71 @@ class WebformPermissionsTestCase extends WebformTestCase {
     // Something in SimpleTest isn't handling the string correctly.
     $this->assertText('to view this form.', t('Anonymous user is not allowed to submit form.'), t('Webform'));
   }
+
+  public function testWebformClosedSubmissionEditAccess() {
+    $this->webformReset();
+    $node = $this->webformForm();
+    node_save($node);
+
+    // Make a submission as the authenticated user.
+    // Record the submission ID for later.
+    $this->drupalLogin($this->webform_users['userEdit']);
+    $this->drupalGet('node/' . $node->nid);
+    $this->drupalPost(NULL, array(), 'Submit');
+    $matches = array();
+    preg_match('/sid=([0-9]+)/', $this->getUrl(), $matches);
+    $sid = $matches[1];
+    $this->drupalLogout();
+
+    // Now, close the webform.
+    $node->webform['status'] = 0;
+    node_save($node);
+
+    // Test that the authenticated user cannot access submissions.
+    $this->drupalLogin($this->webform_users['userEdit']);
+    $this->drupalGet('node/' . $node->nid . '/submission/' . $sid . '/edit');
+    $this->assertResponse(403);
+    $this->drupalLogout();
+
+    // Test that the administrative user can access submissions.
+    $this->drupalLogin($this->webform_users['admin']);
+    $this->drupalGet('node/' . $node->nid . '/submission/' . $sid . '/edit');
+    $this->assertResponse(200);
+  }
+
+  public function testWebformClosedSubmissionCreateAccess() {
+    $this->webformReset();
+    $node = $this->webformForm();
+    $node->webform['allow_draft'] = 1;
+    node_save($node);
+
+    // Make a submission as the authenticated user.
+    $this->drupalLogin($this->webform_users['userEdit']);
+    $this->drupalGet('node/' . $node->nid);
+    $this->drupalPost(NULL, array(), 'Save Draft');
+    $this->drupalLogout();
+
+    // Make a submission as the admin.
+    $this->drupalLogin($this->webform_users['admin']);
+    $this->drupalGet('node/' . $node->nid);
+    $this->drupalPost(NULL, array(), 'Save Draft');
+    $this->drupalLogout();
+
+    // Close the form.
+    $node->webform['status'] = 0;
+    node_save($node);
+
+    // Test that the authenticated user cannot access submissions.
+    $this->drupalLogin($this->webform_users['userEdit']);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertResponse(200);
+    $this->assertNoFieldByName('submitted[textarea]');
+    $this->drupalLogout();
+
+    // Test that the administrative user can access submissions.
+    $this->drupalLogin($this->webform_users['admin']);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertFieldByName('submitted[textarea]');
+    $this->assertResponse(200);
+  }
 }
diff --git a/tests/WebformTestCase.test b/tests/WebformTestCase.test
index 4d12f42..d48efbf 100644
--- a/tests/WebformTestCase.test
+++ b/tests/WebformTestCase.test
@@ -70,6 +70,7 @@ class WebformTestCase extends DrupalWebTestCase {
       'access all webform results',
       'edit all webform submissions',
       'delete all webform submissions',
+      'edit or delete webform submissions when webform is closed',
     );
 
     foreach ($permissions as $user_key => $role_permissions) {
diff --git a/webform.module b/webform.module
index 48a1516..1555843 100644
--- a/webform.module
+++ b/webform.module
@@ -648,16 +648,43 @@ function webform_submission_access($node, $submission, $op = 'view', $account =
   }
 
   $module_access = count(array_filter(module_invoke_all('webform_submission_access', $node, $submission, $op, $account))) > 0;
+  $closed = empty($node->webform['status']);
 
   switch ($op) {
     case 'view':
       return $module_access || $general_access;
 
     case 'edit':
-      return $module_access || ($general_access && (user_access('edit all webform submissions', $account) || (user_access('edit own webform submissions', $account) && $account->uid == $submission->uid)));
+      return $module_access || (
+        $general_access &&
+        (
+          (
+            user_access('edit all webform submissions', $account) &&
+            (!$closed || user_access('edit or delete webform submissions when webform is closed', $account))
+          ) ||
+          (
+            user_access('edit own webform submissions', $account) &&
+            $account->uid == $submission->uid &&
+            (!$closed || user_access('edit or delete webform submissions when webform is closed', $account))
+          )
+        )
+      );
 
     case 'delete':
-      return $module_access || ($general_access && (user_access('delete all webform submissions', $account) || (user_access('delete own webform submissions', $account) && $account->uid == $submission->uid)));
+      return $module_access || (
+        $general_access &&
+        (
+          (
+            user_access('delete all webform submissions', $account) &&
+            (!$closed || user_access('edit or delete webform submissions when webform is closed', $account))
+          ) ||
+          (
+            user_access('delete own webform submissions', $account) &&
+            $account->uid == $submission->uid &&
+            (!$closed || user_access('edit or delete webform submissions when webform is closed', $account))
+          )
+        )
+      );
 
     case 'list':
       return $module_access || user_access('access all webform results', $account) || (user_access('access own webform submissions', $account) && ($account->uid || isset($_SESSION['webform_submission']))) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
@@ -761,6 +788,10 @@ function webform_permission() {
     'delete own webform submissions' => array(
       'title' => t('Delete own webform submissions'),
     ),
+    'edit or delete webform submissions when webform is closed' => array(
+      'title' => t('Edit or delete webform submissions when webform is closed'),
+      'description' => t('Must be used together with other webform submission edit/delete permissions to explicitly account for when the form is closed.'),
+    ),
     'edit webform components' => array(
       'title' => t('Content authors: access and edit webform components and settings'),
       'description' => t('Grants additional access to the webform components and settings to users who can edit the content. Generally an authenticated user permission.'),
@@ -2045,8 +2076,13 @@ function webform_node_view($node, $view_mode) {
     if ($draft_sid = _webform_fetch_draft_sid($node->nid, $user->uid)) {
       module_load_include('inc', 'webform', 'includes/webform.submissions');
       $submission = webform_get_submission($node->nid, $draft_sid);
-      $enabled = TRUE;
-      $resume_draft = TRUE;
+
+      // If we have a draft, and the webform is closed,
+      // check the edit/delete submission permission first.
+      if (user_access('edit or delete webform submissions when webform is closed', $user)) {
+        $enabled = TRUE;
+        $resume_draft = TRUE;
+      }
     }
   }
 
@@ -2982,7 +3018,13 @@ function webform_client_form_prevalidate($form, &$form_state) {
   // is no submission yet (hence isn't being edited) or the user isn't an admin.
   // Another way to consider this is that the form is open when its status is
   // open OR there is a submission and the user is an admin.
-  $closed = empty($node->webform['status']) && (empty($form['#submission']) || !user_access('edit all webform submissions'));
+  $closed = empty($node->webform['status']) && (
+    empty($form['#submission']) ||
+    (
+      !user_access('edit all webform submissions') &&
+      !user_access('edit or delete webform submissions when webform is closed')
+    )
+  );
 
   // Prevent submission by throwing an error.
   if ((!$allowed_role || $total_limit_exceeded || $user_limit_exceeded || $closed)) {
