diff --git a/setup/inc/sql/f8856d56-abe9c0cb.patch.sql b/setup/inc/sql/f8856d56-abe9c0cb.patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a5f54aa8516aaaaf268e363b8ae58674725b61af
--- /dev/null
+++ b/setup/inc/sql/f8856d56-abe9c0cb.patch.sql
@@ -0,0 +1,109 @@
+/**
+ * Merge ticket thread tables into one
+ *  
+ * Replace the ticket_{message,response,note} tables with a single
+ * ticket_thread table that will contain data for all three current message
+ * types. This simplifies much of the ticket thread code and paves the way 
+ * for other types of messages in the future.
+ * 
+ * This patch automagically moves the data from the three federated tables
+ * into the one combined table.
+ */
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_thread`;
+CREATE TABLE `%TABLE_PREFIX%ticket_thread` (
+  `id` int(11) unsigned NOT NULL auto_increment,
+  `pid` int(11) unsigned NOT NULL default '0',
+  `ticket_id` int(11) unsigned NOT NULL default '0',
+  `staff_id` int(11) unsigned NOT NULL default '0',
+  `thread_type` enum('M','R','N') NOT NULL,
+  `poster` varchar(128) NOT NULL default '',
+  `source` varchar(32) NOT NULL default '',
+  `title` varchar(255),
+  `body` text NOT NULL,
+  `ip_address` varchar(64) NOT NULL default '',
+  `created` datetime NOT NULL,
+  `updated` datetime NOT NULL,
+  -- Temporary columns for conversion
+  `old_pk` int(11) unsigned NOT NULL,
+  `old_pid` int(11) unsigned,
+  PRIMARY KEY  (`id`),
+  KEY `ticket_id` (`ticket_id`),
+  KEY `staff_id` (`staff_id`),
+  FULLTEXT KEY `body` (`body`)
+) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_email_info`;
+CREATE TABLE `%TABLE_PREFIX%ticket_email_info` (
+  `message_id` int(11) unsigned NOT NULL,
+  `email_mid` varchar(255) NOT NULL,
+  `headers` text,
+  KEY `message_id` (`email_mid`)
+) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+
+-- Transfer messages
+INSERT INTO `%TABLE_PREFIX%ticket_thread`
+  (`ticket_id`, `thread_type`, `body`, `ip_address`,
+    `created`, `updated`, `old_pk`)
+  SELECT `ticket_id`, 'M', `message`, `ip_address`,
+    `created`, COALESCE(`updated`, NOW()), `msg_id`
+    FROM `%TABLE_PREFIX%ticket_message`;
+
+-- Transfer responses
+INSERT INTO `%TABLE_PREFIX%ticket_thread`
+  (`ticket_id`, `staff_id`, `thread_type`, `poster`, `body`, `ip_address`,
+    `created`, `updated`, `old_pk`, `old_pid`)
+  SELECT `ticket_id`, `staff_id`, 'R', `staff_name`, `response`, `ip_address`,
+    `created`, COALESCE(`updated`, NOW()), `response_id`, `msg_id` 
+    FROM `%TABLE_PREFIX%ticket_response`;
+
+-- Connect responses to (new) messages
+CREATE TABLE `%TABLE_PREFIX%T_resp_links`
+    SELECT `id`, `old_pk`, `old_pid` FROM `%TABLE_PREFIX%ticket_thread`;
+
+UPDATE `%TABLE_PREFIX%ticket_thread`
+    SET `pid` = ( SELECT T2.`id` FROM `%TABLE_PREFIX%T_resp_links` T2
+                  WHERE `old_pid` = T2.`old_pk` )
+    WHERE `thread_type` = 'R'
+      AND `old_pid` IS NOT NULL;
+
+DROP TABLE `%TABLE_PREFIX%T_resp_links`;
+
+-- Transfer notes
+INSERT INTO `%TABLE_PREFIX%ticket_thread`
+  (`ticket_id`, `staff_id`, `thread_type`, `body`, `title`,
+    `source`, `poster`, `created`, `updated`, `old_pk`)
+  SELECT `ticket_id`, `staff_id`, 'N', `note`, `title`,
+    `source`, ( SELECT CONCAT_WS(' ', T2.`firstname`, T2.`lastname`)
+                FROM `%TABLE_PREFIX%staff` T2
+                WHERE T2.`staff_id` = `staff_id` ),
+    `created`, NOW(), `note_id`
+    FROM `%TABLE_PREFIX%ticket_note`;
+
+-- Transfer email information from messages
+INSERT INTO `%TABLE_PREFIX%ticket_email_info`
+    (`message_id`, `email_mid`, `headers`)
+    SELECT ( SELECT T2.`id` FROM `%TABLE_PREFIX%ticket_thread` T2
+             WHERE `msg_id` = T2.`old_pk`
+               AND `thread_type` = 'M' ),
+         `messageId`, `headers`
+    FROM `%TABLE_PREFIX%ticket_message`
+    WHERE `messageId` IS NOT NULL;
+
+-- Update attachment table
+UPDATE `%TABLE_PREFIX%ticket_attachment`
+    SET `ref_id` = ( SELECT T2.`id` FROM `%TABLE_PREFIX%ticket_thread` T2
+                     WHERE `ref_id` = T2.`old_pk`
+                       AND `ref_type` = T2.`thread_type` );
+
+-- Drop temporary columns
+ALTER TABLE `%TABLE_PREFIX%ticket_thread` DROP COLUMN `old_pk`;
+ALTER TABLE `%TABLE_PREFIX%ticket_thread` DROP COLUMN `old_pid`;
+
+-- Drop old tables
+DROP TABLE `%TABLE_PREFIX%ticket_message`;
+DROP TABLE `%TABLE_PREFIX%ticket_response`;
+DROP TABLE `%TABLE_PREFIX%ticket_note`;
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='abe9c0cb845be52c10fcd7b3e626a589';
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql b/setup/inc/sql/osticket-v1.7-mysql.sql
index 7a31d814e1ad8544066830ad2d5d782aaf2da426..fbd2059bab92027cac455a893689ddc9e80445ca 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql
@@ -598,6 +598,14 @@ CREATE TABLE `%TABLE_PREFIX%ticket_lock` (
   KEY `staff_id` (`staff_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_email_info`;
+CREATE TABLE `%TABLE_PREFIX%ticket_email_info` (
+  `message_id` int(11) unsigned NOT NULL,
+  `email_mid` varchar(255) NOT NULL,
+  `headers` text,
+  KEY `message_id` (`email_mid`)
+) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+
 DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_event`;
 CREATE TABLE `%TABLE_PREFIX%ticket_event` (
   `ticket_id` int(11) unsigned NOT NULL default '0',
@@ -612,38 +620,6 @@ CREATE TABLE `%TABLE_PREFIX%ticket_event` (
   KEY `ticket_stats` (`timestamp`, `state`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_message`;
-CREATE TABLE `%TABLE_PREFIX%ticket_message` (
-  `msg_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `messageId` varchar(255) default NULL,
-  `message` text NOT NULL,
-  `headers` text,
-  `source` varchar(16) default NULL,
-  `ip_address` varchar(16) default NULL,
-  `created` datetime NOT NULL,
-  `updated` datetime default NULL,
-  PRIMARY KEY  (`msg_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `msgId` (`messageId`),
-  FULLTEXT KEY `message` (`message`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_note`;
-CREATE TABLE `%TABLE_PREFIX%ticket_note` (
-  `note_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `staff_id` int(10) unsigned NOT NULL default '0',
-  `source` varchar(32) NOT NULL default '',
-  `title` varchar(255) NOT NULL default 'Generic Intermal Notes',
-  `note` text NOT NULL,
-  `created` datetime NOT NULL,
-  PRIMARY KEY  (`note_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `staff_id` (`staff_id`),
-  FULLTEXT KEY `note` (`note`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
 DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_priority`;
 CREATE TABLE `%TABLE_PREFIX%ticket_priority` (
   `priority_id` tinyint(4) NOT NULL auto_increment,
@@ -664,22 +640,24 @@ INSERT INTO `%TABLE_PREFIX%ticket_priority` (`priority_id`, `priority`, `priorit
     (3, 'high', 'High', '#FEE7E7', 2, 1),
     (4, 'emergency', 'Emergency', '#FEE7E7', 1, 0);
 
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_response`;
-CREATE TABLE `%TABLE_PREFIX%ticket_response` (
-  `response_id` int(11) unsigned NOT NULL auto_increment,
-  `msg_id` int(11) unsigned NOT NULL default '0',
+DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_thread`;
+CREATE TABLE `%TABLE_PREFIX%ticket_thread` (
+  `id` int(11) unsigned NOT NULL auto_increment,
+  `pid` int(11) unsigned NOT NULL default '0',
   `ticket_id` int(11) unsigned NOT NULL default '0',
   `staff_id` int(11) unsigned NOT NULL default '0',
-  `staff_name` varchar(32) NOT NULL default '',
-  `response` text NOT NULL,
-  `ip_address` varchar(16) NOT NULL default '',
+  `thread_type` enum('M','R','N') NOT NULL,
+  `poster` varchar(128) NOT NULL default '',
+  `source` varchar(32) NOT NULL default '',
+  `title` varchar(255),
+  `body` text NOT NULL,
+  `ip_address` varchar(64) NOT NULL default '',
   `created` datetime NOT NULL,
   `updated` datetime NOT NULL,
-  PRIMARY KEY  (`response_id`),
+  PRIMARY KEY  (`id`),
   KEY `ticket_id` (`ticket_id`),
-  KEY `msg_id` (`msg_id`),
   KEY `staff_id` (`staff_id`),
-  FULLTEXT KEY `response` (`response`)
+  FULLTEXT KEY `body` (`body`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
 DROP TABLE IF EXISTS `%TABLE_PREFIX%timezone`;
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql.md5 b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
index 73090636d948f041c1a368ef416674c6269a309a..23011d006ad5e19d75630760bff1cfa872db12ec 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql.md5
+++ b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
@@ -1 +1 @@
-f8856d56e51c5cc3416389de78b54515
+abe9c0cb845be52c10fcd7b3e626a589