--- revision_moderation.module.orig	2010-08-03 21:27:55.000000000 +0200
+++ revision_moderation.module	2010-08-03 22:02:42.000000000 +0200
@@ -60,6 +60,13 @@
 }
 
 /**
+ * Implementation of hook_perm().
+ */
+function revision_moderation_perm() {
+  return array('edit own content without moderation');
+}
+
+/**
  * Menu permission callback.
  */
 function revision_moderation_admin_perm($nid) {
@@ -191,14 +198,15 @@
   // Only do this logic for non-admin users on nodes with revision moderation
   // turned on.
   // And not editing a chose revision
+  global $user;
+  $update_goes_live = user_access('edit own content without moderation') && ($node->uid == $user->uid);
   if ($node->nid && $node->revision_moderation == 1 && arg(2) != 'revisions'
-    && (!user_access('administer nodes') || !variable_get('revision_moderation_exempt', 1))) {
+    && (!user_access('administer nodes') || !variable_get('revision_moderation_exempt', 1)) && !$update_goes_live) {
     switch ($op) {
       case 'prepare':
         // If user has a pending revision for this node, load the latest version of
         // it instead.
         if ($revisions = revision_moderation_get_node_pending_revisions($node->nid)) {
-          global $user;
           foreach ($revisions as $revision) {
             if ($revision->uid == $user->uid) {
               drupal_set_message(t('Editing your latest revision, which is still pending moderation.'));
@@ -231,7 +239,7 @@
         break;
     }
   }
-  else if ($node->nid && $node->revision_moderation == 1 && end($args) == 'edit') {
+  else if ($node->nid && $node->revision_moderation == 1 && end($args) == 'edit' && !$update_goes_live) {
     switch ($op) {
       case 'prepare':
 		$revision_author = user_load($node->revision_uid);
