diff --git a/include/class.thread.php b/include/class.thread.php
index 9b7be1bf9a0ef0d1feeccb77de144e5df84e34ba..1caeab492817e5c33bb2b450e5358650e5b5fe50 100644
--- a/include/class.thread.php
+++ b/include/class.thread.php
@@ -22,13 +22,13 @@ class Thread {
 
     var $ht;
 
-    function Thread($id) {
-        $this->load($id);
+    function Thread($criteria) {
+        $this->load($criteria);
     }
 
-    function load($id=0) {
+    function load($criteria=null) {
 
-        if (!$id && !($id=$this->getId()))
+        if (!$criteria && !($criteria=$this->getId()))
             return null;
 
         $sql='SELECT thread.* '
@@ -38,9 +38,17 @@ class Thread {
             .' LEFT JOIN '.THREAD_ENTRY_TABLE.' entry
                 ON (entry.thread_id = thread.id) '
             .' LEFT JOIN '.ATTACHMENT_TABLE.' a
-                ON (a.object_id=entry.id AND a.`type` = "H") '
-            .' WHERE thread.id='.db_input($id)
-            .' GROUP BY thread.id';
+                ON (a.object_id=entry.id AND a.`type` = "H") ';
+
+        if (is_numeric($criteria))
+            $sql.= ' WHERE thread.id='.db_input($criteria);
+        else
+            $sql.= sprintf(' WHERE thread.object_id=%d AND
+                    thread.object_type=%s',
+                    $criteria['object_id'],
+                    db_input($criteria['object_type']));
+
+        $sql.= ' GROUP BY thread.id';
 
         $this->ht = array();
         if (($res=db_query($sql)) && db_num_rows($res))
@@ -180,7 +188,10 @@ class Thread {
               .', object_id='.db_input($vars['object_id'])
               .', object_type='.db_input($vars['object_type']);
 
-        return db_query($sql) ? db_insert_id() : 0;
+        if (db_query($sql))
+            return static::lookup(db_insert_id());
+
+        return null;
     }
 
     static function lookup($id) {
@@ -1374,8 +1385,8 @@ class NoteThreadEntry extends ThreadEntry {
     }
 }
 
-// Ticket specific thread utils.
-class TicketThread extends Thread {
+// Object specific thread utils.
+class ObjectThread extends Thread {
     private $_entries = array();
 
     function __construct($id) {
@@ -1494,19 +1505,24 @@ class TicketThread extends Thread {
         }
     }
 
+    static function lookup($criteria) {
+
+        return ($criteria
+                && ($t= new static($criteria))
+                && $t->getId()
+                ) ? $t : null;
+    }
+}
+
+// Ticket thread class
+class TicketThread extends ObjectThread {
+
     static function create($ticket) {
         $id = is_object($ticket) ? $ticket->getId() : $ticket;
         return parent::create(array(
                     'object_id' => $id,
-                    'object_type' => 'T'));
-    }
-
-    static function lookup($id) {
-
-        return ($id
-                && ($t= new TicketThread($id))
-                && $t->getId()
-                ) ? $t : null;
+                    'object_type' => ObjectModel::OBJECT_TYPE_TICKET
+                    ));
     }
 }
 ?>