diff --git a/include/class.cron.php b/include/class.cron.php
index 257926e253fe1662b0630548b62e483bffe20e48..3aa0357c198ce61e25a22dae6bc9ea982954877e 100644
--- a/include/class.cron.php
+++ b/include/class.cron.php
@@ -35,6 +35,11 @@ class Cron {
         if($ost) $ost->purgeLogs();
     }
 
+    function PurgeDrafts() {
+        require_once(INCLUDE_DIR.'class.draft.php');
+        Draft::cleanup();
+    }
+
     function CleanOrphanedFiles() {
         require_once(INCLUDE_DIR.'class.file.php');
         AttachmentFile::deleteOrphans();
@@ -49,6 +54,7 @@ class Cron {
         self::TicketMonitor();
         self::PurgeLogs();
         self::CleanOrphanedFiles();
+        self::PurgeDrafts();
     }
 }
 ?>
diff --git a/include/class.draft.php b/include/class.draft.php
index 6796428b6d0a51ea0c5777331190c2e942e987b8..a4942ecb4bc5611fd9fa4572a3c0e1d022f893b0 100644
--- a/include/class.draft.php
+++ b/include/class.draft.php
@@ -149,6 +149,14 @@ class Draft {
             $sql .= ' AND staff_id='.db_input($staff_id);
         return (!db_query($sql) || !db_affected_rows());
     }
+
+    static function cleanup() {
+        // Keep client drafts for two weeks (14 days)
+        $sql = 'DELETE FROM '.DRAFT_TABLE
+            ." WHERE `namespace` LIKE 'ticket.client.%'
+            AND datediff(now(), updated) > 14";
+        return db_query($sql);
+    }
 }
 
 ?>
diff --git a/include/class.ticket.php b/include/class.ticket.php
index c652f8f3fed5a8fde306ce5b2e5a6e37c83e517b..692c6e53ee0315691871461b499020baa1d1636c 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -728,6 +728,7 @@ class Ticket {
 
         $this->reload();
         $this->logEvent('closed');
+        $this->deleteDrafts();
 
         return true;
     }
@@ -1676,9 +1677,15 @@ class Ticket {
         foreach (DynamicFormEntry::forTicket($this->getId()) as $form)
             $form->delete();
 
+        $this->deleteDrafts();
+
         return true;
     }
 
+    function deleteDrafts() {
+        Draft::deleteForNamespace('ticket.%.' . $this->getId());
+    }
+
     function update($vars, &$errors) {
 
         global $cfg, $thisstaff;
diff --git a/scp/tickets.php b/scp/tickets.php
index 1058b80d95f67fed03e39c191292f76e5c8b2774..c55c4f27f8fe97709b61997277a5a65de7e5d5d8 100644
--- a/scp/tickets.php
+++ b/scp/tickets.php
@@ -70,13 +70,13 @@ if($_POST && !$errors):
                 $msg='Reply posted successfully';
                 $ticket->reload();
 
-                // Cleanup drafts for the ticket. If not closed, only clean
-                // for this staff. Else clean all drafts for the ticket.
-                Draft::deleteForNamespace('ticket.%.' . $ticket->getId(),
-                    $ticket->isClosed() ? false : $thisstaff->getId());
-
                 if($ticket->isClosed() && $wasOpen)
                     $ticket=null;
+                else
+                    // Still open -- cleanup response draft for this user
+                    Draft::deleteForNamespace(
+                        'ticket.response.' . $ticket->getId(),
+                        $thisstaff->getId());
 
             } elseif(!$errors['err']) {
                 $errors['err']='Unable to post the reply. Correct the errors below and try again!';
@@ -174,17 +174,13 @@ if($_POST && !$errors):
             $wasOpen = ($ticket->isOpen());
             if(($note=$ticket->postNote($vars, $errors, $thisstaff))) {
 
-                // Cleanup drafts for the ticket. If not closed, only clean
-                // note drafts for this staff. Else clean all drafts for the ticket.
-                Draft::deleteForNamespace(
-                        sprintf('ticket.%s.%d',
-                              $ticket->isClosed() ? '%' : 'note',
-                              $ticket->getId()),
-                        $ticket->isOpen() ? $thisstaff->getId() : false);
-
                 $msg='Internal note posted successfully';
                 if($wasOpen && $ticket->isClosed())
                     $ticket = null; //Going back to main listing.
+                else
+                    // Ticket is still open -- clear draft for the note
+                    Draft::deleteForNamespace('ticket.note.'.$ticket->getId(),
+                        $thisstaff->getId());
 
             } else {