diff --git a/drafty.info b/drafty.info
index 519a3c6..a8edfe0 100644
--- a/drafty.info
+++ b/drafty.info
@@ -4,6 +4,8 @@ core = 7.x
 
 dependencies[] = entity
 
+configure = admin/config/system/drafty
+
 test_dependencies[] = field_collection
 test_dependencies[] = entity_translation
 test_dependencies[] = title (>7.x-1.0-alpha7)
diff --git a/drafty.module b/drafty.module
index db34632..52dd772 100644
--- a/drafty.module
+++ b/drafty.module
@@ -5,6 +5,35 @@
  */
 
 /**
+ * Implements hook_menu().
+ */
+function drafty_menu() {
+  $items = array();
+
+  $items['admin/config/system/drafty'] = array(
+    'title' => 'Drafty',
+    'description' => 'Manage Drafty settings.',
+    'type' => MENU_NORMAL_ITEM,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('drafty_form'),
+    'access arguments' => array('administer drafty'),
+    'file' => 'includes/drafty.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function drafty_permission() {
+  return array(
+    'administer drafty' => array(
+      'title' => t('Administer Drafty'),
+    ),
+  );
+}
+
+/**
  * Implements hook_module_implements_alter().
  */
 function drafty_module_implements_alter(&$implementations) {
@@ -81,6 +110,54 @@ function drafty_field_attach_load($entity_type, $entities, $age, $options) {
 }
 
 /**
+ * Callback function to delete a single temporary-draft revision.
+ *
+ * Could be called either from a batch job or from a cron-queue.
+ */
+function drafty_queue_delete_revision($drafty_queue_item, &$context = NULL) {
+  try {
+    entity_revision_delete($drafty_queue_item['entity_type'], $drafty_queue_item['revision_id']);
+    if (!empty($context) && isset($context['results'])){
+      // Document the successful batch operation for the batch-finished function to use.
+      $context['results'][] = $drafty_queue_item;
+    }
+  }
+  catch (Exception $ex){
+    // Log the problem
+    $message = 'An error occurred while deleting temporary revision: @args. Exception details: @error';
+    $args = array(
+      '@args' => print_r($drafty_queue_item, TRUE),
+      '@error' => print_r($ex, TRUE),
+    );
+    watchdog('drafty', $message, $args, WATCHDOG_ERROR);
+    throw $ex;  // Batch API will pass $success = FALSE.
+  }
+}
+
+
+/**
+ * Implements hook_cron_queue_info().
+ */
+function drafty_cron_queue_info() {
+  $queues['drafty_revision_delete'] = array(
+    'worker callback' => 'drafty_queue_delete_revision',
+    'time' => 60,
+  );
+  return $queues;
+}
+
+/**
+ * Batch completion callback for when draft-deletes happen in a batch job.
+ * $results contains info about successfully deleted revisions, and
+ * exception objects for revision-delete options that caused problems.
+ * $operations contains the operations that remained unprocessed.
+ */
+function drafty_delete_batch_finished($success, $results, $operations) {
+  // TODO: Display a message about temporary-revision-cleanup here?
+  // Note that logging of failed deletes is handled by the operation callback.
+}
+
+/**
  * Factory function for the DraftyTracker class.
  */
 function drafty() {
@@ -241,20 +318,49 @@ class Drafty {
    * Publish revisions previously set with setRevisionToBePublished().
    */
   public function restorePublishedRevisions() {
+    $delete_old_revisions = variable_get('drafty_delete_old_revisions', FALSE);
+    $delete_with_cron = variable_get('drafty_delete_with_cron', TRUE);
+    $queue = NULL;
+    $operations = array();
     foreach ($this->revisionsToPublish as $type => $value) {
       foreach ($value as $id => $vid) {
         unset($this->revisionsToPublish[$type][$id]);
         $this->publishRevision($type, $id, $vid);
         // Now that the revision is deleted, there are two identical copies of
         // the revision in the system. The original 'draft' revision and the
-        // newly saved published revision. Delete the draft revision now since
-        // it's not needed.
-        // @todo: make this configurable?
+        // newly saved published revision.
+        if ($delete_old_revisions) {
+          // Deletion must be done on a different request thread, or any other
+          // hooks called for the revision-to-be-deleted will fail.
+          $drafty_queue_item = array(
+            'entity_type' => $type,
+            'entity_id' => $id,
+            'revision_id' => $vid,
+          );
+          if ($delete_with_cron) {
+            if (empty($queue)) {
+              $queue = DrupalQueue::get('drafty_revision_delete');
+            }
+            $queue->createItem($drafty_queue_item);
+          }
+          else {
+            $operations[] = array(
+              'drafty_queue_delete_revision',
+              array($drafty_queue_item),
+            );
+          }
+        }
         // @todo: when restoring a published revision, should the revision
         // timestamp be set to the old value?
-        // @todo: move this to a queue since the deletion doesn't strictly have
-        // to happen inline.
       }
     }
+    if (!empty($operations)) {
+      $batch = array(
+        'operations' => $operations,
+        'finished' => 'drafty_delete_batch_finished',
+      );
+      batch_set($batch);
+    }
   }
+
 }
diff --git a/modules/drafty_1992010/drafty_1992010.test b/modules/drafty_1992010/drafty_1992010.test
index d1da900..bf20327 100644
--- a/modules/drafty_1992010/drafty_1992010.test
+++ b/modules/drafty_1992010/drafty_1992010.test
@@ -28,22 +28,6 @@ class Drafty1992010Test extends EntityTranslationTestCase {
   }
 
   /**
-   * Temporary Field UI access fix.
-   *
-   * @todo Remove when Entity Translation reach 7.x-1.0-beta6 or higher.
-   * @see http://cgit.drupalcode.org/entity_translation/commit/?id=a8ae1e78c57c6dd917d611dc1b956f289a8e2f31
-   *
-   * @param array $permissions
-   * @return false|object
-   */
-  function getAdminUser(array $permissions = array()) {
-    $permissions = array(
-      'administer fields',
-    );
-    return parent::getAdminUser($permissions);
-  }
-
-  /**
    * Create a translation.
    *
    * This overrides because with drafty, asserting an 'edit' link for a
diff --git a/tests/drafty.entity_translation.test b/tests/drafty.entity_translation.test
index 6a5560b..35d8dd2 100644
--- a/tests/drafty.entity_translation.test
+++ b/tests/drafty.entity_translation.test
@@ -28,22 +28,6 @@ class DraftyEntityTranslationTest extends EntityTranslationTestCase {
   }
 
   /**
-   * Temporary Field UI access fix.
-   *
-   * @todo Remove when Entity Translation reach 7.x-1.0-beta6 or higher.
-   * @see http://cgit.drupalcode.org/entity_translation/commit/?id=a8ae1e78c57c6dd917d611dc1b956f289a8e2f31
-   *
-   * @param array $permissions
-   * @return false|object
-   */
-  function getAdminUser(array $permissions = array()) {
-    $permissions = array(
-      'administer fields',
-    );
-    return parent::getAdminUser($permissions);
-  }
-
-  /**
    * Create a translation.
    *
    * This overrides because with drafty, asserting an 'edit' link for a
diff --git a/tests/drafty.test b/tests/drafty.test
index 9c2ce75..8dc25c4 100644
--- a/tests/drafty.test
+++ b/tests/drafty.test
@@ -81,4 +81,53 @@ class DraftyTestCase extends DraftyWebTestCase {
     $this->assertEqual($node->title, 'Title B');
     $this->assertNotEqual($node->vid, $draft_vid);
   }
+
+  /**
+   * Create a published node. Then create a draft and check if the previous
+   * published revision was cleaned by cron.
+   */
+  function testDraftyRevisionCleanup() {
+    $node = new stdClass();
+    $node->title = 'Title A';
+    $node->type = 'article';
+    $node->status = 1;
+    $this->setRevision($node);
+    node_save($node);
+
+    // Save the vid for later comparison.
+    $first_published_vid = $node->vid;
+
+    // Save a new draft.
+    $node = node_load($node->nid);
+    $node->title = 'Title B';
+    $this->setRevision($node);
+    $node->is_draft_revision = TRUE;
+    node_save($node);
+
+    $node = node_load($node->nid);
+    $second_published_vid = $node->vid;
+
+    // Run cron
+    $this->cronRun();
+
+    // Check that the $first_published_vid is still present
+    $nodes = node_load_multiple(array($node->nid), array('vid' => $first_published_vid));
+    $this->assertTrue(!empty($nodes), 'Old published revision is still present.');
+
+    // Configure drafty to clean old published revisions
+    variable_set('drafty_delete_old_revisions', TRUE);
+
+    // Create new draft revision
+    $node->title = 'Title C';
+    $this->setRevision($node);
+    $node->is_draft_revision = TRUE;
+    node_save($node);
+
+    // Run cron
+    $this->cronRun();
+
+    // Confirm the the second published revision has been deleted.
+    $nodes = node_load_multiple(array($node->nid), array('vid' => $second_published_vid));
+    $this->assertTrue(empty($nodes), 'Old published revision has been deleted.');
+  }
 }
 
diff --git a/includes/drafty.admin.inc b/includes/drafty.admin.inc
new file mode 100755
index 0000000..6dcdb9e
--- /dev/null
+++ b/includes/drafty.admin.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Drafty Admin settings file
+ */
+
+/**
+ * Drafty Form.
+ */
+function drafty_form($form, &$form_state) {
+  $form['revision_cleanup'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('This is a list of configuration settings for Drafty.'),
+  );
+
+  $form['revision_cleanup']['drafty_delete_old_revisions'] = array(
+    '#title' => 'Delete old revisions instantly',
+    '#type' => 'checkbox',
+    '#default_value' => variable_get('drafty_delete_old_revisions', FALSE),
+    '#description' => t('Selecting this delete older revision on save.'),
+  );
+
+  $form['revision_cleanup']['drafty_delete_with_cron'] = array(
+    '#title' => 'Delete old revisions on cron',
+    '#type' => 'checkbox',
+    '#default_value' => variable_get('drafty_delete_with_cron', FALSE),
+    '#description' => t('Selecting this will delete older revisions when cron runs.'),
+  );
+
+  $form['revision_cleanup']['delete_now'] = array(
+    '#type' => 'submit',
+    '#value' => t('Remove revisions now'),
+    '#description' => t('Instantly delete revisions left behind by drafty (those that are mare published->published but not current).'),
+    '#submit' => array('drafty_delete_now_submit'),
+  );
+
+  return system_settings_form($form);
+}
+
+function drafty_delete_now_submit($form, &$form_state) {
+  $workbench_query = "(SELECT vid FROM {workbench_moderation_node_history} WHERE is_current = :is_current and published = :published and nid = nr.nid)";
+  $node_query = "(SELECT vid from {node} WHERE status = :status and nid = nr.nid)";
+  $results = db_query('SELECT nr.nid, nr.vid FROM {node_revision} nr WHERE vid > ' . $workbench_query . '  AND vid < ' . $node_query . '', array(
+    ':is_current' => 1,
+    ':published' => 0,
+    ':status' => 1
+    )
+  );
+
+  foreach ($results as $record) {
+   entity_revision_delete('node', $record->vid);
+   // Also want to remove the record from the workbench_moderation_node_history table
+   db_delete('workbench_moderation_node_history')
+     ->condition('nid', $record->nid)
+     ->condition('vid', $record->vid)
+     ->execute();
+  }
+}
+
 