diff --git a/api/Application.class.php b/api/Application.class.php
index 1b6e75b..08b8ced 100644
--- a/api/Application.class.php
+++ b/api/Application.class.php
@@ -383,7 +383,7 @@ class CerberusApplication extends DevblocksApplication {
 	 *
 	 * @return a unique ticket mask as a string
 	 */
-	static function generateTicketMask($pattern = "LLL-NNNNN-NNN") {
+	static function generateTicketMask($pattern = "Y-M-D-NNNNN") {
 		$letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
 		$numbers = "123456789";
 
@@ -452,7 +452,11 @@ class CerberusApplication extends DevblocksApplication {
 			$category_id = $t_or_c_id; 
 		} else {
 			$team_id = $t_or_c_id;
-			$category_id = 0;
+			if($t_or_c=='a') {
+				$category_id = -1;
+			} else {
+				$category_id = 0;
+			}
 		}
 		
 		return array($team_id, $category_id);
@@ -658,6 +662,9 @@ class CerberusLicense {
 
 class CerberusSettings {
 	const DEFAULT_REPLY_FROM = 'default_reply_from'; 
+	const DEFAULT_TICKET_REPLY_STATUS = 'default_ticket_reply_status'; 
+	const DEFAULT_TICKET_OPEN_STATUS = 'default_ticket_open_status'; 
+	const DEFAULT_TICKET_SEND_STATUS = 'default_ticket_send_status'; 
 	const DEFAULT_REPLY_PERSONAL = 'default_reply_personal'; 
 	const DEFAULT_SIGNATURE = 'default_signature'; 
 	const DEFAULT_SIGNATURE_POS = 'default_signature_pos'; 
@@ -683,6 +690,9 @@ class CerberusSettings {
 	
 	private $settings = array( // defaults
 		self::DEFAULT_REPLY_FROM => '',
+		self::DEFAULT_TICKET_REPLY_STATUS => 1,
+		self::DEFAULT_TICKET_OPEN_STATUS => 1,
+		self::DEFAULT_TICKET_SEND_STATUS => 1,
 		self::DEFAULT_REPLY_PERSONAL => '',
 		self::DEFAULT_SIGNATURE => '',
 		self::DEFAULT_SIGNATURE_POS => 0,
diff --git a/api/DAO.class.php b/api/DAO.class.php
index e993650..325a2a9 100644
--- a/api/DAO.class.php
+++ b/api/DAO.class.php
@@ -400,7 +400,7 @@ class DAO_Worker extends C4_ORMHelper {
 		$sql = "SELECT a.id, a.first_name, a.last_name, a.email, a.pass, a.title, a.is_superuser, a.is_disabled, a.last_activity_date, a.last_activity ".
 			"FROM worker a ".
 			((!empty($ids) ? sprintf("WHERE a.id IN (%s) ",implode(',',$ids)) : " ").
-			"ORDER BY a.first_name, a.last_name "
+			"ORDER BY a.last_name, a.first_name "
 		);
 		$rs = $db->Execute($sql) or die(__CLASS__ . '('.__LINE__.')'. ':' . $db->ErrorMsg()); /* @var $rs ADORecordSet */
 		
@@ -4460,6 +4460,7 @@ class DAO_GroupSettings {
     const SETTING_CLOSE_REPLY = 'close_reply';
     const SETTING_CLOSE_REPLY_ENABLED = 'close_reply_enabled';
     const SETTING_INBOX_IS_ASSIGNABLE = 'inbox_is_assignable';
+    const SETTING_TICKET_REPLY_STATUS = 'ticket_reply_status';
     
 	static function set($group_id, $key, $value) {
 		$db = DevblocksPlatform::getDatabaseService();
@@ -5916,13 +5917,14 @@ class DAO_MailTemplate extends DevblocksORMHelper {
 	const TEMPLATE_TYPE = 'template_type';
 	const OWNER_ID = 'owner_id';
 	const CONTENT = 'content';
-	
+        const TEAM_ID = 'team_id';
+        
 	public static function create($fields) {
 		$db = DevblocksPlatform::getDatabaseService();
 		$id = $db->GenID('generic_seq');
 		
-		$sql = sprintf("INSERT INTO %s (id,title,description,folder,template_type,owner_id,content) ".
-			"VALUES (%d,'','','',0,0,'')",
+		$sql = sprintf("INSERT INTO %s (id,title,description,folder,template_type,owner_id,content,team_id) ".
+			"VALUES (%d,'','','',0,0,'',0)",
 			self::_TABLE,
 			$id
 		);
@@ -5993,7 +5995,7 @@ class DAO_MailTemplate extends DevblocksORMHelper {
 	public function getWhere($where=null) {
 		$db = DevblocksPlatform::getDatabaseService();
 		
-		$sql = sprintf("SELECT id,title,description,folder,template_type,owner_id,content ".
+		$sql = sprintf("SELECT id,title,description,folder,template_type,owner_id,content,team_id ".
 			"FROM %s ".
 			(!empty($where) ? ("WHERE $where ") : " ").
 			" ORDER BY folder, title ",
@@ -6032,6 +6034,7 @@ class DAO_MailTemplate extends DevblocksORMHelper {
 			$object->template_type = intval($rs->fields['template_type']);
 			$object->owner_id = intval($rs->fields['owner_id']);
 			$object->content = $rs->fields['content'];
+                        $object->team_id = intval($rs->fields['team_id']);
 			$objects[$object->id] = $object;
 			$rs->MoveNext();
 		}
diff --git a/api/Extension.class.php b/api/Extension.class.php
index 7db5889..18001d7 100644
--- a/api/Extension.class.php
+++ b/api/Extension.class.php
@@ -292,6 +292,43 @@ abstract class Extension_LoginAuthenticator extends DevblocksExtension {
 	}
 };
 
+abstract class Extension_EmailSignatureTemplate extends DevblocksExtension {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run($signature) {}
+  function render($list) {} 
+};
+
+abstract class Extension_AutoReplyNew extends DevblocksExtension {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run(CerberusTicket $ticket, $properties) {}
+  function render($list) {} 
+};
+
+
+abstract class Extension_AutoReplyClose extends DevblocksExtension {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run(CerberusTicket $ticket, $properties) {}
+  function render($list) {} 
+};
+
+abstract class Extension_EmailTemplate extends DevblocksExtension {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run($message_id, $template) {}
+  function render($type, $list) {} 
+};
+
 // [TODO] Convert to a controller extension
 abstract class CerberusCronPageExtension extends DevblocksExtension {
     const PARAM_ENABLED = 'enabled';
diff --git a/api/Model.class.php b/api/Model.class.php
index 7ea788c..6b123bc 100644
--- a/api/Model.class.php
+++ b/api/Model.class.php
@@ -3796,7 +3796,7 @@ class CerberusWorker {
 		return true;
 	}
 	
-	function getName($reverse=false) {
+	function getName($reverse=true) {
 		if(!$reverse) {
 			$name = sprintf("%s%s%s",
 				$this->first_name,
@@ -4069,48 +4069,17 @@ class Model_MailTemplate {
 	public function getRenderedContent($message_id) {
 		$raw = $this->content;
 
-		$replace = array();
-		$with = array();
-
-		$replace[] = '#timestamp#';
-		$with[] = date('r');
-		
-		if(!empty($message_id)) {
-			$message = DAO_Ticket::getMessage($message_id);
-			$ticket = DAO_Ticket::getTicket($message->ticket_id);
-			$sender = DAO_Address::get($message->address_id);
-			$sender_org = DAO_ContactOrg::get($sender->contact_org_id);
-			
-			$replace[] = '#sender_first_name#';
-			$replace[] = '#sender_last_name#';
-			$replace[] = '#sender_org#';
-	
-			$with[] = $sender->first_name;
-			$with[] = $sender->last_name;
-			$with[] = (!empty($sender_org)?$sender_org->name:"");
-			
-			$replace[] = '#ticket_id#';
-			$replace[] = '#ticket_mask#';
-			$replace[] = '#ticket_subject#';
-
-			$with[] = $ticket->id;
-			$with[] = $ticket->mask;
-			$with[] = $ticket->subject;
-		}
-			
-		if(null != ($active_worker = CerberusApplication::getActiveWorker())) {
-			$worker = DAO_Worker::getAgent($active_worker->id); // most recent info (not session)
-			
-			$replace[] = '#worker_first_name#';
-			$replace[] = '#worker_last_name#';
-			$replace[] = '#worker_title#';
-	
-			$with[] = $worker->first_name;
-			$with[] = $worker->last_name;
-			$with[] = $worker->title;
-		}
-
-		return str_replace($replace, $with, $raw);
+    $processEmailTemplate = DevblocksPlatform::getExtensions('cerberusweb.email.template', true);
+    if(!empty($processEmailTemplate)) {
+      foreach($processEmailTemplate as $run_template) { /* Run the run loop and update properties */
+      try {
+        $run_template->run($message_id, &$raw);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    return $raw;
 	}
 };
 
diff --git a/api/app/Parser.php b/api/app/Parser.php
index 936c7b0..e8cb47c 100644
--- a/api/app/Parser.php
+++ b/api/app/Parser.php
@@ -771,17 +771,27 @@ class CerberusParser {
 				&& !empty($autoreply) 
 				&& $enumSpamTraining != CerberusTicketSpamTraining::SPAM
 				) {
-					CerberusMail::sendTicketMessage(array(
-						'ticket_id' => $id,
-						'message_id' => $email_id,
-						'content' => str_replace(
-				        	array('#ticket_id#','#mask#','#subject#','#timestamp#', '#sender#','#sender_first#','#orig_body#'),
-				        	array($id, $sMask, $sSubject, date('r'), $fromAddressInst->email, $fromAddressInst->first_name, ltrim($message->body)),
-				        	$autoreply
-						),
-						'is_autoreply' => true,
-						'dont_keep_copy' => true
-					));
+          $properties = array(
+            'ticket_id' => $id,
+            'message_id' => $email_id,
+            'content' => $autoreply,
+            'is_autoreply' => true,
+            'dont_keep_copy' => true,
+            'send_autoreply' => true
+          );
+          $ticket =  DAO_Ticket::getTicket($id);
+          $processAutoReplyNew = DevblocksPlatform::getExtensions('cerberusweb.auto_reply.new', true);
+          if(!empty($processAutoReplyNew)) {
+            foreach($processAutoReplyNew as $run_filter) { /* Run the run loop and update properties */
+              try {
+                $run_filter->run($ticket, &$properties);
+              } catch(Exception $e) {
+                  // print_r($e);
+              }
+            }
+          }
+          if ((isset($properties['send_autoreply'])) && ($properties['send_autoreply']) == true)
+            CerberusMail::sendTicketMessage($properties);
 			}
 			
 		} // end bIsNew
diff --git a/framework.config.php b/framework.config.php
deleted file mode 100644
index 313c351..0000000
--- a/framework.config.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-define('APP_DB_DRIVER','');
-define('APP_DB_HOST','');
-define('APP_DB_DATABASE','');
-define('APP_DB_USER','');
-define('APP_DB_PASS','');
-define('APP_DB_PCONNECT',false);
-
-define('LANG_CHARSET_CODE','iso-8859-1'); // iso-8859-1, utf-8
-define('DB_CHARSET_CODE','latin1'); // latin1, utf8
-
-// Memcached (high-performance shared memory cache)
-// optional, memcached 1.2.x + extension must be enabled
-// list multiple servers comma-delimited: host1:port,host2:port
-//define('DEVBLOCKS_CACHE_PREFIX',''); // ONLY A-Z, a-z, 0-9 and underscore
-//define('DEVBLOCKS_MEMCACHED_SERVERS','127.0.0.1:11211');
-
-/****************************************************************************
- * [JAS]: Don't change the following unless you know what you're doing!
- ***************************************************************************/
-define('APP_DEFAULT_CONTROLLER','core.controller.page');
-define('APP_DB_PREFIX','cerb');
-define('APP_PATH',dirname(__FILE__));
-define('APP_STORAGE_PATH',APP_PATH . '/storage');
-define('APP_TEMP_PATH',APP_STORAGE_PATH . '/tmp');
-define('DEVBLOCKS_PATH',APP_PATH . '/libs/devblocks/');
-define('DEVBLOCKS_REWRITE', file_exists(dirname(__FILE__).'/.htaccess'));
-define('DEMO_MODE',false);
-define('AUTHORIZED_IPS_DEFAULTS', '');
-
-require_once(DEVBLOCKS_PATH . 'framework.defaults.php');
diff --git a/plugins/cerberusweb.auditlog/templates/display/log/log_view.tpl b/plugins/cerberusweb.auditlog/templates/display/log/log_view.tpl
index 4967468..8854704 100644
--- a/plugins/cerberusweb.auditlog/templates/display/log/log_view.tpl
+++ b/plugins/cerberusweb.auditlog/templates/display/log/log_view.tpl
@@ -70,7 +70,7 @@
 					{if isset($ticket_fields.$change_field)}
 						{$ticket_fields.$change_field->db_label|capitalize}
 					{else}
-						{$change_field}&nbsp;
+						{$translate->_($result.l_change_field)}&nbsp;
 					{/if}
 				</td>
 			{elseif $column=="l_change_value"}
diff --git a/plugins/cerberusweb.core/api/cron.classes.php b/plugins/cerberusweb.core/api/cron.classes.php
index de4e44c..def727e 100644
--- a/plugins/cerberusweb.core/api/cron.classes.php
+++ b/plugins/cerberusweb.core/api/cron.classes.php
@@ -135,7 +135,9 @@ class ParseCron extends CerberusCronPageExtension {
 		$logger->info("[Parser] Parsed! (".sprintf("%d",($time*1000))." ms) " .
 			(!empty($ticket_id) ? ("(Ticket ID: ".$ticket_id.")") : ("(Local Delivery Rejected.)")));
 
-		@unlink($full_filename);
+		If ($ticket_id != NULL) {
+			@unlink($full_filename);
+		}
 		mailparse_msg_free($mime);
 
 		//		flush();
@@ -1113,6 +1115,7 @@ class Pop3Cron extends CerberusCronPageExtension {
 				$fp = fopen($filename,'w');
 
 				if($fp) {
+          fwrite($fp,"Downloaded-From: $account->nickname\r\n");
 					fwrite($fp,$headers,strlen($headers));
 					fwrite($fp,"\r\n\r\n");
 					fwrite($fp,$body,strlen($body));
diff --git a/plugins/cerberusweb.core/api/listeners.classes.php b/plugins/cerberusweb.core/api/listeners.classes.php
index 5f9039e..11bbacb 100644
--- a/plugins/cerberusweb.core/api/listeners.classes.php
+++ b/plugins/cerberusweb.core/api/listeners.classes.php
@@ -498,6 +498,8 @@ class ChCoreEventListener extends DevblocksEventListenerExtension {
 			$tickets = DAO_Ticket::getTickets($ticket_ids);
 			
 			foreach($tickets as $ticket) { /* @var $ticket CerberusTicket */
+        $properties = array();
+        
 				if(!isset($group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY_ENABLED]))
 					continue;
 				if(1 == $ticket->is_deleted)
@@ -505,30 +507,26 @@ class ChCoreEventListener extends DevblocksEventListenerExtension {
 				
 				if($group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY_ENABLED]
 				&& !empty($group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY])) {
-					if(null != ($msg_first = DAO_Ticket::getMessage($ticket->first_message_id))) {
-						// First sender
-						$ticket_sender = '';
-						$ticket_sender_first = '';
-						if(null != ($sender_first = DAO_Address::get($msg_first->address_id))) {
-							$ticket_sender = $sender_first->email;
-							$ticket_sender_first = $sender_first->first_name;
-						}
-						
-						// First body
-						$ticket_body = $msg_first->getContent();
-					}
-					
-					CerberusMail::sendTicketMessage(array(
-						'ticket_id' => $ticket->id,
-						'message_id' => $ticket->first_message_id,
-						'content' => str_replace(
-							array('#ticket_id#', '#mask#','#subject#','#timestamp#','#sender#','#sender_first#','#orig_body#'),
-							array($ticket->id, $ticket->mask, $ticket->subject, date('r'), $ticket_sender, $ticket_sender_first, ltrim($ticket_body)),
-							$group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY]
-						),
-						'is_autoreply' => false,
-						'dont_keep_copy' => true
-					));
+          $properties = array(
+            'ticket_id' => $ticket->id,
+            'message_id' => $ticket->first_message_id,
+            'content' => $group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY],
+            'is_autoreply' => false,
+            'dont_keep_copy' => true,
+            'send_autoreply' => true
+          );
+          $processAutoReplyClose = DevblocksPlatform::getExtensions('cerberusweb.auto_reply.close', true);
+          if(!empty($processAutoReplyClose)) {
+            foreach($processAutoReplyClose as $run_filter) { /* Run the run loop and update properties */
+              try {
+                $run_filter->run($ticket, &$properties);
+              } catch(Exception $e) {
+                    // print_r($e);
+              }
+            }
+          }
+          if ((isset($properties['send_autoreply'])) && ($properties['send_autoreply']) == true)
+            CerberusMail::sendTicketMessage($properties);
 				}
 			}
 		}
diff --git a/plugins/cerberusweb.core/api/uri/config.php b/plugins/cerberusweb.core/api/uri/config.php
index a8eb6e4..f2d5f27 100644
--- a/plugins/cerberusweb.core/api/uri/config.php
+++ b/plugins/cerberusweb.core/api/uri/config.php
@@ -596,9 +596,31 @@ class ChConfigurationPage extends CerberusPageExtension  {
 		$smtp_enc = $settings->get(CerberusSettings::SMTP_ENCRYPTION_TYPE,'None');
 		$smtp_max_sends = $settings->get(CerberusSettings::SMTP_MAX_SENDS,'20');
 		
+		$default_ticket_reply_status = $settings->get(CerberusSettings::DEFAULT_TICKET_REPLY_STATUS,1);
+		$tpl->assign('default_ticket_reply_status', $default_ticket_reply_status);
+
+		$default_ticket_open_status = $settings->get(CerberusSettings::DEFAULT_TICKET_OPEN_STATUS,1);
+		$tpl->assign('default_ticket_open_status', $default_ticket_open_status);
+
+		$default_ticket_send_status = $settings->get(CerberusSettings::DEFAULT_TICKET_SEND_STATUS,1);
+		$tpl->assign('default_ticket_send_status', $default_ticket_send_status);
+
 		$pop3_accounts = DAO_Mail::getPop3Accounts();
 		$tpl->assign('pop3_accounts', $pop3_accounts);
 		
+    $sig_token = array('-- choose --');
+    $processEmailSignatureTemplate = DevblocksPlatform::getExtensions('cerberusweb.email_signature.template', true);
+    if(!empty($processEmailSignatureTemplate)) {
+      foreach($processEmailSignatureTemplate as $render_template) { /* Run the render loop and update properties */
+      try {
+        $render_template->render(&$sig_token);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    $tpl->assign('sig_token', $sig_token);
+
 		$tpl->display('file:' . $this->_TPL_PATH . 'configuration/tabs/mail/index.tpl');
 	}
 	
@@ -1657,7 +1679,7 @@ class ChConfigurationPage extends CerberusPageExtension  {
 		DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config','mail')));
 	}
 	
-	// Form Submit
+		// Form Submit
 	function saveOutgoingMailSettingsAction() {
 		$translate = DevblocksPlatform::getTranslationService();
 		$worker = CerberusApplication::getActiveWorker();
@@ -1692,8 +1714,15 @@ class ChConfigurationPage extends CerberusPageExtension  {
 		    @$smtp_auth_pass = '';
 	    }
 	    
+	    @$default_ticket_reply_status = DevblocksPlatform::importGPC($_REQUEST['default_ticket_reply_status'],'integer',1);
+	    @$default_ticket_open_status = DevblocksPlatform::importGPC($_REQUEST['default_ticket_open_status'],'integer',1);
+	    @$default_ticket_send_status = DevblocksPlatform::importGPC($_REQUEST['default_ticket_send_status'],'integer',1);
+
 	    $settings = CerberusSettings::getInstance();
 	    $settings->set(CerberusSettings::DEFAULT_REPLY_FROM, $default_reply_address);
+	    $settings->set(CerberusSettings::DEFAULT_TICKET_REPLY_STATUS, $default_ticket_reply_status);
+	    $settings->set(CerberusSettings::DEFAULT_TICKET_OPEN_STATUS, $default_ticket_open_status);
+	    $settings->set(CerberusSettings::DEFAULT_TICKET_SEND_STATUS, $default_ticket_send_status);
 	    $settings->set(CerberusSettings::DEFAULT_REPLY_PERSONAL, $default_reply_personal);
 	    $settings->set(CerberusSettings::DEFAULT_SIGNATURE, $default_signature);
 	    $settings->set(CerberusSettings::DEFAULT_SIGNATURE_POS, $default_signature_pos);
diff --git a/plugins/cerberusweb.core/api/uri/display.php b/plugins/cerberusweb.core/api/uri/display.php
index e116256..559af2c 100644
--- a/plugins/cerberusweb.core/api/uri/display.php
+++ b/plugins/cerberusweb.core/api/uri/display.php
@@ -77,7 +77,7 @@ class ChDisplayPage extends CerberusPageExtension {
 		}
 		
 		$tpl->assign('ticket', $ticket);
-
+		
 		// TicketToolbarItem Extensions
 		$ticketToolbarItems = DevblocksPlatform::getExtensions('cerberusweb.ticket.toolbaritem', true);
 		if(!empty($ticketToolbarItems))
@@ -158,6 +158,26 @@ class ChDisplayPage extends CerberusPageExtension {
 			))
 		);
 		
+		if (class_exists('Extension_TimeTrackingSource',true)):
+			// Adds total time worked per ticket to the token list.
+			$db = DevblocksPlatform::getDatabaseService();
+
+			$sql = "SELECT sum(tte.time_actual_mins) mins ";
+			$sql .= "FROM timetracking_entry tte ";
+			$sql .= sprintf("WHERE tte.source_id =  %d ", $ticket->id);
+			$sql .= "AND tte.source_extension_id = 'timetracking.source.ticket' ";
+			$sql .= "GROUP BY tte.source_id ";
+
+			$rs = $db->Execute($sql);
+		
+			if(is_a($rs,'ADORecordSet')) {
+				$total_time_all = intval($rs->fields['mins']);			
+			} else {
+				$total_time_all = 0;			
+			}
+		endif;
+
+		$tpl->assign('total_time_all', $total_time_all);
 		$tpl->display('file:' . $this->_TPL_PATH . 'display/index.tpl');
 	}
 	
@@ -583,13 +603,19 @@ class ChDisplayPage extends CerberusPageExtension {
 		        $signature = $settings->get(CerberusSettings::DEFAULT_SIGNATURE);
 			}
 
-			$tpl->assign('signature', str_replace(
-			        array('#first_name#','#last_name#','#title#'),
-			        array($worker->first_name,$worker->last_name,$worker->title),
-			        $signature
-			));
+      $processEmailSignatureTemplate = DevblocksPlatform::getExtensions('cerberusweb.email_signature.template', true);
+      if(!empty($processEmailSignatureTemplate)) {
+        foreach($processEmailSignatureTemplate as $run_template) { /* Run the run loop and update properties */
+        try {
+          $run_template->run(&$signature);
+              } catch(Exception $e) {
+                // print_r($e);
+              }
+        }
+      }
+			$tpl->assign('signature', $signature);
 			
-		    $signature_pos = $settings->get(CerberusSettings::DEFAULT_SIGNATURE_POS,0);
+		  $signature_pos = $settings->get(CerberusSettings::DEFAULT_SIGNATURE_POS,0);
 			$tpl->assign('signature_pos', $signature_pos);
 		}
 		
@@ -601,6 +627,14 @@ class ChDisplayPage extends CerberusPageExtension {
 		));
 		$tpl->assign('kb_topics', $kb_topics);
 		
+		$ticket_reply_status = DAO_GroupSettings::get($group_id,DAO_GroupSettings::SETTING_TICKET_REPLY_STATUS,255);
+		if(255==$ticket_reply_status) {
+			$reply_status = $settings->get(CerberusSettings::DEFAULT_TICKET_REPLY_STATUS,1);
+		} else {
+			$reply_status = $ticket_reply_status;
+		}
+		$tpl->assign('reply_status', $reply_status);
+
 		$tpl->cache_lifetime = "0";
 		$tpl->display('file:' . $this->_TPL_PATH . 'display/rpc/reply.tpl');
 	}
@@ -1196,6 +1230,8 @@ class ChDisplayPage extends CerberusPageExtension {
 			SearchFields_Task::SOURCE_EXTENSION,
 			SearchFields_Task::DUE_DATE,
 			SearchFields_Task::WORKER_ID,
+			SearchFields_Task::IS_COMPLETED,
+			SearchFields_Task::COMPLETED_DATE,
 		);
 		
 		$view = C4_AbstractViewLoader::getView('ticket_tasks', $defaults);
@@ -1212,6 +1248,7 @@ class ChDisplayPage extends CerberusPageExtension {
 
 	// Ajax
 	function showTemplatesPanelAction() {
+                @$active_worker = CerberusApplication::getActiveWorker();
 		@$txt_name = DevblocksPlatform::importGPC($_REQUEST['txt_name'],'string','');
 		@$reply_id = DevblocksPlatform::importGPC($_REQUEST['reply_id'],'integer');
 		@$type = DevblocksPlatform::importGPC($_REQUEST['type'],'integer',0);
@@ -1226,22 +1263,33 @@ class ChDisplayPage extends CerberusPageExtension {
 		$folders = DAO_MailTemplate::getFolders($type);
 		$tpl->assign('folders', $folders);
 
-		$where = null;
+                if (count($membership = $active_worker->getMemberships()) > 0) {
+                        foreach ($membership as $mem1) { $group_list[] = $mem1->team_id; }  unset($mem1);
+                }
+                $group_list_text = implode(',',$group_list);
+
+                $where = null;
 		if(empty($folder)) {
-			$where = sprintf("%s = %d",
+			$where = sprintf("%s = %d AND %s IN (%s,0) ",
 				DAO_MailTemplate::TEMPLATE_TYPE,
-				$type
+				$type,
+                                DAO_MailTemplate::TEAM_ID,
+                                $group_list_text
 			);
 		} 
 		
 		$templates = DAO_MailTemplate::getWhere($where);
 		$tpl->assign('templates', $templates);
 		
+		@$allowed_group_list = $active_worker->getMemberships();
+		$tpl->assign('allowed_group_list', $allowed_group_list);
+
 		$tpl->display('file:' . $this->_TPL_PATH . 'display/rpc/email_templates/templates_panel.tpl');
 	}
 	
 	// Ajax
 	function showTemplateEditPanelAction() {
+                @$active_worker = CerberusApplication::getActiveWorker();
 		@$id = DevblocksPlatform::importGPC($_REQUEST['id'],'integer');
 //		@$txt_name = DevblocksPlatform::importGPC($_REQUEST['txt_name'],'string','');		
 		@$reply_id = DevblocksPlatform::importGPC($_REQUEST['reply_id'],'integer');
@@ -1254,11 +1302,30 @@ class ChDisplayPage extends CerberusPageExtension {
 //		$tpl->assign('txt_name', $txt_name);
 		$tpl->assign('type', $type);
 		
-		$folders = DAO_MailTemplate::getFolders($type);
+                $groups = DAO_Group::getAll();
+                $tpl->assign('groups', $groups);
+                
+                @$allowed_group_list = $active_worker->getMemberships();
+                $tpl->assign('allowed_group_list', $allowed_group_list);
+
+                $folders = DAO_MailTemplate::getFolders($type);
 		$tpl->assign('folders', $folders);
 		
 		$template = DAO_MailTemplate::get($id);
 		$tpl->assign('template', $template);
+    
+    $EmailTemplateTokens = array('-- choose --');
+    $processEmailTemplate = DevblocksPlatform::getExtensions('cerberusweb.email.template', true);
+    if(!empty($processEmailTemplate)) {
+      foreach($processEmailTemplate as $render_template) { /* Run the render loop and update properties */
+      try {
+        $render_template->render($type, &$EmailTemplateTokens);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    $tpl->assign('EmailTemplateTokens', $EmailTemplateTokens);
 		
 		$tpl->display('file:' . $this->_TPL_PATH . 'display/rpc/email_templates/template_edit_panel.tpl');
 	}
@@ -1271,6 +1338,7 @@ class ChDisplayPage extends CerberusPageExtension {
 		@$folder = DevblocksPlatform::importGPC($_REQUEST['folder'],'string','');
 		@$folder_new = DevblocksPlatform::importGPC($_REQUEST['folder_new'],'string','');
 		@$content = DevblocksPlatform::importGPC($_REQUEST['template'],'string','');
+		@$group_limit = DevblocksPlatform::importGPC($_REQUEST['group_id'],'integer',0);
 		@$type = DevblocksPlatform::importGPC($_REQUEST['type'],'integer',0);
 		@$delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'],'integer',0);
 		
@@ -1284,6 +1352,7 @@ class ChDisplayPage extends CerberusPageExtension {
 				DAO_MailTemplate::CONTENT => $content,
 				DAO_MailTemplate::TEMPLATE_TYPE => $type,
 				DAO_MailTemplate::OWNER_ID => $worker->id,
+                                DAO_MailTemplate::TEAM_ID => $group_limit,
 			);
 			
 			if(empty($id)) { // new
diff --git a/plugins/cerberusweb.core/api/uri/groups.php b/plugins/cerberusweb.core/api/uri/groups.php
index 7db9274..e5dfca8 100644
--- a/plugins/cerberusweb.core/api/uri/groups.php
+++ b/plugins/cerberusweb.core/api/uri/groups.php
@@ -26,7 +26,7 @@ class ChGroupsPage extends CerberusPageExtension  {
 		$tpl = DevblocksPlatform::getTemplateService();
 		$tpl->cache_lifetime = "0";
 		$tpl->assign('path', $this->_TPL_PATH);
-
+		
 		$active_worker = CerberusApplication::getActiveWorker();
 		
 		$response = DevblocksPlatform::getHttpResponse();
@@ -70,17 +70,57 @@ class ChGroupsPage extends CerberusPageExtension  {
 			$group = DAO_Group::getTeam($group_id);
 			$tpl->assign('team', $group);
 		}
-		
+    
+    $sig_token = array('-- choose --');
+    $processEmailSignatureTemplate = DevblocksPlatform::getExtensions('cerberusweb.email_signature.template', true);
+    if(!empty($processEmailSignatureTemplate)) {
+      foreach($processEmailSignatureTemplate as $render_template) { /* Run the render loop and update properties */
+      try {
+        $render_template->render(&$sig_token);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    $tpl->assign('sig_token', $sig_token);
+
+    $autoreply_token = array('-- choose --');
+    $processAutoReplyNew = DevblocksPlatform::getExtensions('cerberusweb.auto_reply.new', true);
+    if(!empty($processAutoReplyNew)) {
+      foreach($processAutoReplyNew as $render_template) { /* Run the render loop and update properties */
+      try {
+        $render_template->render(&$autoreply_token);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    $tpl->assign('autoreply_token', $autoreply_token);
+
+    $closereply_token = array('-- choose --');
+    $processAutoReplyClose = DevblocksPlatform::getExtensions('cerberusweb.auto_reply.close', true);
+    if(!empty($processAutoReplyClose)) {
+      foreach($processAutoReplyClose as $render_template) { /* Run the render loop and update properties */
+      try {
+        $render_template->render(&$closereply_token);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+    $tpl->assign('closereply_token', $closereply_token);
+
 		$team_categories = DAO_Bucket::getByTeam($group_id);
 		$tpl->assign('categories', $team_categories);
-	    
+
 		$group_settings = DAO_GroupSettings::getSettings($group_id);
 		$tpl->assign('group_settings', $group_settings);
-		
 		@$tpl->assign('group_spam_threshold', $group_settings[DAO_GroupSettings::SETTING_SPAM_THRESHOLD]);
 		@$tpl->assign('group_spam_action', $group_settings[DAO_GroupSettings::SETTING_SPAM_ACTION]);
 		@$tpl->assign('group_spam_action_param', $group_settings[DAO_GroupSettings::SETTING_SPAM_ACTION_PARAM]);
-		
+		$ticket_reply_status = DAO_GroupSettings::get($group_id,DAO_GroupSettings::SETTING_TICKET_REPLY_STATUS,255);
+		@$tpl->assign('ticket_reply_status', $ticket_reply_status);
+
 		$tpl->display('file:' . $tpl_path . 'groups/manage/index.tpl');
 	}
 	
@@ -534,6 +574,7 @@ class ChGroupsPage extends CerberusPageExtension  {
 	    @$spam_threshold = DevblocksPlatform::importGPC($_REQUEST['spam_threshold'],'integer',80);
 	    @$spam_action = DevblocksPlatform::importGPC($_REQUEST['spam_action'],'integer',0);
 	    @$spam_moveto = DevblocksPlatform::importGPC($_REQUEST['spam_action_moveto'],'integer',0);
+	    @$ticket_reply_status = DevblocksPlatform::importGPC($_REQUEST['ticket_reply_status'],'integer',255);
 
 	    // Validate sender address
 	    if(!$validator_email->isValid($sender_address)) {
@@ -553,6 +594,7 @@ class ChGroupsPage extends CerberusPageExtension  {
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_REPLY_PERSONAL, $sender_personal);
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_REPLY_PERSONAL_WITH_WORKER, $sender_personal_with_worker);
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_SUBJECT_HAS_MASK, $subject_has_mask);
+	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_TICKET_REPLY_STATUS, $ticket_reply_status);
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_SUBJECT_PREFIX, $subject_prefix);
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_SPAM_THRESHOLD, $spam_threshold);
 	    DAO_GroupSettings::set($team_id, DAO_GroupSettings::SETTING_SPAM_ACTION, $spam_action);
diff --git a/plugins/cerberusweb.core/api/uri/tickets.php b/plugins/cerberusweb.core/api/uri/tickets.php
index 8a363ff..f3a22d2 100644
--- a/plugins/cerberusweb.core/api/uri/tickets.php
+++ b/plugins/cerberusweb.core/api/uri/tickets.php
@@ -31,6 +31,7 @@ class ChTicketsPage extends CerberusPageExtension {
 		$tpl = DevblocksPlatform::getTemplateService();
 		$tpl->assign('path', $this->_TPL_PATH);
 
+		$settings = CerberusSettings::getInstance();
 		$visit = CerberusApplication::getVisit();
 		$active_worker = $visit->getWorker();
 		
@@ -78,6 +79,24 @@ class ChTicketsPage extends CerberusPageExtension {
 					$visit->set('compose.last_ticket',null); // clear
 				}
 				
+				// If failed to send because there was no to field.
+				if($visit->exists('compose.no_to_in_ticket')) {
+					$no_to_in_ticket = $visit->get('compose.no_to_in_ticket');
+					$tpl->assign('no_to_in_ticket', $no_to_in_ticket);
+					$visit->set('compose.no_to_in_ticket',null); // clear
+				}
+				
+				$default_ticket_send_status = $settings->get(CerberusSettings::DEFAULT_TICKET_SEND_STATUS,1);
+				$tpl->assign('default_ticket_send_status', $default_ticket_send_status);
+				
+				// Groups (for custom fields)
+				$groups = DAO_Group::getAll();
+				$tpl->assign('groups', $groups);
+
+				// Custom fields
+				$fields = DAO_CustomField::getBySource(ChCustomFieldSource_Ticket::ID);
+				$tpl->assign('ticket_fields', $fields);
+
 				$tpl->display('file:' . $this->_TPL_PATH . 'tickets/compose/index.tpl');
 				break;
 				
@@ -115,7 +134,25 @@ class ChTicketsPage extends CerberusPageExtension {
 					$tpl->assign('last_ticket_mask', $ticket_mask);
 					$visit->set('compose.last_ticket',null); // clear
 				}
+
+				$default_ticket_open_status = $settings->get(CerberusSettings::DEFAULT_TICKET_OPEN_STATUS,1);
+				$tpl->assign('default_ticket_open_status', $default_ticket_open_status);
 				
+				// If failed to send because there was no to field.
+				if($visit->exists('compose.no_to_in_ticket')) {
+					$no_to_in_ticket = $visit->get('compose.no_to_in_ticket');
+					$tpl->assign('no_to_in_ticket', $no_to_in_ticket);
+					$visit->set('compose.no_to_in_ticket',null); // clear
+				}
+
+				// Groups (for custom fields)
+				$groups = DAO_Group::getAll();
+				$tpl->assign('groups', $groups);
+
+				// Custom fields
+				$fields = DAO_CustomField::getBySource(ChCustomFieldSource_Ticket::ID);
+				$tpl->assign('ticket_fields', $fields);
+
 				$tpl->display('file:' . $this->_TPL_PATH . 'tickets/create/index.tpl');
 				break;
 				
@@ -300,12 +337,14 @@ class ChTicketsPage extends CerberusPageExtension {
 		);
 		
 		// ====== Who's Online
-		$whos_online = DAO_Worker::getAllOnline();
-		if(!empty($whos_online)) {
-			$tpl->assign('whos_online', $whos_online);
-			$tpl->assign('whos_online_count', count($whos_online));
+		@$active_worker = CerberusApplication::getActiveWorker();
+		if($active_worker->hasPriv('core.ticket.view.whos_online')) {
+			$whos_online = DAO_Worker::getAllOnline();
+			if(!empty($whos_online)) {
+				$tpl->assign('whos_online', $whos_online);
+				$tpl->assign('whos_online_count', count($whos_online));
+			}
 		}
-		
         $tpl->display('file:' . $this->_TPL_PATH . 'tickets/workflow/index.tpl');
 	}
 	
@@ -481,12 +520,14 @@ class ChTicketsPage extends CerberusPageExtension {
 		);
 		
 		// ====== Who's Online
-		$whos_online = DAO_Worker::getAllOnline();
-		if(!empty($whos_online)) {
-			$tpl->assign('whos_online', $whos_online);
-			$tpl->assign('whos_online_count', count($whos_online));
+		@$active_worker = CerberusApplication::getActiveWorker();
+		if($active_worker->hasPriv('core.ticket.view.whos_online')) {
+			$whos_online = DAO_Worker::getAllOnline();
+			if(!empty($whos_online)) {
+				$tpl->assign('whos_online', $whos_online);
+				$tpl->assign('whos_online_count', count($whos_online));
+			}
 		}
-		
         $tpl->display('file:' . $this->_TPL_PATH . 'tickets/overview/index.tpl');		
 	}
 	
@@ -829,25 +870,23 @@ class ChTicketsPage extends CerberusPageExtension {
 		$settings = CerberusSettings::getInstance();
 		$group = DAO_Group::getTeam($group_id);
 
-		$active_worker = CerberusApplication::getActiveWorker();
-		$worker = DAO_Worker::getAgent($active_worker->id); // Use the most recent info (not session)
 		$sig = $settings->get(CerberusSettings::DEFAULT_SIGNATURE,'');
 
 		if(!empty($group->signature)) {
 			$sig = $group->signature;
 		}
 
-		/*
-		 * [TODO] This is the 3rd place this replace happens, we really need 
-		 * to move the signature translation into something like CerberusApplication
-		 */
-		echo sprintf("\r\n%s\r\n",
-			str_replace(
-		        array('#first_name#','#last_name#','#title#'),
-		        array($worker->first_name,$worker->last_name,$worker->title),
-		        $sig
-			)
-		);
+    $processEmailSignatureTemplate = DevblocksPlatform::getExtensions('cerberusweb.email_signature.template', true);
+    if(!empty($processEmailSignatureTemplate)) {
+      foreach($processEmailSignatureTemplate as $run_template) { /* Run the run loop and update properties */
+      try {
+        $run_template->run(&$sig);
+            } catch(Exception $e) {
+              // print_r($e);
+            }
+      }
+    }
+		echo sprintf("\r\n%s\r\n", $sig);
 	}
 	
 	// Ajax
@@ -1000,6 +1039,8 @@ class ChTicketsPage extends CerberusPageExtension {
 		}
 
 		if(empty($to)) {
+			$visit = CerberusApplication::getVisit(); /* @var CerberusVisit $visit */
+			$visit->set('compose.no_to_in_ticket', TRUE);
 			DevblocksPlatform::redirect(new DevblocksHttpResponse(array('tickets','compose')));
 			return;
 		}
@@ -1020,6 +1061,10 @@ class ChTicketsPage extends CerberusPageExtension {
 		);
 		
 		$ticket_id = CerberusMail::compose($properties);
+
+		// Custom field saves
+		@$field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array());
+		DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_Ticket::ID, $ticket_id, $field_ids);
 		
 		$ticket = DAO_Ticket::getTicket($ticket_id);
 		
@@ -1065,6 +1110,9 @@ class ChTicketsPage extends CerberusPageExtension {
 		$fromList = imap_rfc822_parse_adrlist(rtrim($reqs,', '),'');
 		
 		if(empty($fromList) || !is_array($fromList)) {
+			$visit = CerberusApplication::getVisit(); /* @var CerberusVisit $visit */
+			$visit->set('compose.no_to_in_ticket', TRUE);
+			DevblocksPlatform::redirect(new DevblocksHttpResponse(array('tickets','create')));
 			return; // abort with message
 		}
 		$from = array_shift($fromList);
@@ -1143,6 +1191,10 @@ class ChTicketsPage extends CerberusPageExtension {
 			$requester_addy = DAO_Address::lookupAddress($requester->mailbox . '@' . $host, true);
 			DAO_Ticket::createRequester($requester_addy->id, $ticket_id);
 		}
+
+		// Custom field saves
+		@$field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array());
+		DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_Ticket::ID, $ticket_id, $field_ids);
 		
 		// Worker reply
 		$properties = array(
diff --git a/plugins/cerberusweb.core/patches/4.3.1.php b/plugins/cerberusweb.core/patches/4.3.1.php
index fce5d2c..cb986b0 100644
--- a/plugins/cerberusweb.core/patches/4.3.1.php
+++ b/plugins/cerberusweb.core/patches/4.3.1.php
@@ -68,4 +68,18 @@ if(isset($columns['CONTENT'])) {
 	$datadict->ExecuteSQLArray($sql);
 }
 
+// ===========================================================================
+// Add the mail_template.team_id to mail_template so we can limit the display of templates based on group ownwership
+
+$columns = $datadict->MetaColumns('mail_template');
+$indexes = $datadict->MetaIndexes('mail_template',false);
+
+if(!isset($columns['team_id'])) {
+        $sql = $datadict->AddColumnSQL('mail_template', 'team_id I4 DEFAULT 0 NOTNULL');
+        $datadict->ExecuteSQLArray($sql);
+
+        $sql = $datadict->CreateIndexSQL('team_id','mail_template','team_id');
+        $datadict->ExecuteSQLArray($sql);
+}
+
 return TRUE;
diff --git a/plugins/cerberusweb.core/plugin.xml b/plugins/cerberusweb.core/plugin.xml
index 1e5bf61..9a38be8 100644
--- a/plugins/cerberusweb.core/plugin.xml
+++ b/plugins/cerberusweb.core/plugin.xml
@@ -163,6 +163,7 @@
 		<priv id="core.ticket.view.actions.export" label="acl.core.ticket.view.actions.export" />
 		<priv id="core.ticket.view.actions.merge" label="acl.core.ticket.view.actions.merge" />
 		<priv id="core.ticket.view.actions.pile_sort" label="acl.core.ticket.view.actions.pile_sort" />
+		<priv id="core.ticket.view.whos_online" label="acl.core.ticket.view.whos_online" />
 
 		<!-- Workspaces -->
 		<priv id="core.home.auto_refresh" label="acl.core.home.auto_refresh" />
diff --git a/plugins/cerberusweb.core/strings.xml b/plugins/cerberusweb.core/strings.xml
index 7cec87f..9e9b75c 100644
--- a/plugins/cerberusweb.core/strings.xml
+++ b/plugins/cerberusweb.core/strings.xml
@@ -501,6 +501,9 @@
 		<tu tuid='acl.core.ticket.view.actions.pile_sort'>
 			<tuv xml:lang="en_US"><seg>[Tickets] Can use the pile sorter on lists</seg></tuv>
 		</tu>
+		<tu tuid='acl.core.ticket.view.whos_online'>
+			<tuv xml:lang="en_US"><seg>[Tickets] Allows user to see who's Online</seg></tuv>
+		</tu>
 
 		<!-- Activity -->
 		
@@ -660,6 +663,21 @@
 		<tu tuid='config.mail.smtp.failed'>
 			<tuv xml:lang="en_US"><seg>SMTP Connection Failed:</seg></tuv>
 		</tu>
+		<tu tuid='config.mail.message.status'>
+			<tuv xml:lang="en_US"><seg>Default Message Status:</seg></tuv>
+		</tu>
+		<tu tuid='config.mail.message.status.default'>
+			<tuv xml:lang="en_US"><seg>Site Wide Default</seg></tuv>
+		</tu>
+		<tu tuid='config.mail.message.status.reply'>
+			<tuv xml:lang="en_US"><seg>In Replies</seg></tuv>
+		</tu>
+		<tu tuid='config.mail.message.status.open'>
+			<tuv xml:lang="en_US"><seg>In Open Ticket</seg></tuv>
+		</tu>
+		<tu tuid='config.mail.message.status.send'>
+			<tuv xml:lang="en_US"><seg>In Send Mail</seg></tuv>
+		</tu>
 		
 
 		<!-- Contact orgs -->
@@ -907,6 +925,12 @@
 		<tu tuid='display.invalid_ticket'>
 			<tuv xml:lang="en_US"><seg>Invalid Ticket!</seg></tuv>
 		</tu>
+		<tu tuid='display.error.compose'>
+			<tuv xml:lang="en_US"><seg>Message failed to send! You must enter a "To:" email address</seg></tuv>
+		</tu>
+		<tu tuid='display.error.create'>
+			<tuv xml:lang="en_US"><seg>Message failed to send! You must enter a requester(s) email address</seg></tuv>
+		</tu>
 		
 		<!-- Display: Conversation -->
 		
@@ -916,6 +940,9 @@
 		<tu tuid='display.convo.full_headers'>
 			<tuv xml:lang="en_US"><seg>full headers</seg></tuv>
 		</tu>
+		<tu tuid='display.convo.hide_headers'>
+			<tuv xml:lang="en_US"><seg>Hide headers</seg></tuv>
+		</tu>
 		<tu tuid='display.convo.no_messages'>
 			<tuv xml:lang="en_US"><seg>No messages on ticket.</seg></tuv>
 		</tu>
@@ -965,6 +992,9 @@
 		<tu tuid='display.reply.email_templates'>
 			<tuv xml:lang="en_US"><seg>E-mail Templates</seg></tuv>
 		</tu>
+                <tu tuid='display.reply.email_templates.limit_group'>
+                        <tuv xml:lang="en_US"><seg>Limit to Group: </seg></tuv>
+                </tu>
 		<tu tuid='display.reply.forward.banner'>
 			<tuv xml:lang="en_US"><seg>---- Forwarded message ----</seg></tuv>
 		</tu>		
@@ -1013,13 +1043,13 @@
 		</tu>
 		
 		<tu tuid='display.shortcut.close'>
-			<tuv xml:lang="en_US"><seg>Close this ticket (C)</seg></tuv>
+			<tuv xml:lang="en_US"><seg>Close this ticket (C) (Disabled)</seg></tuv>
 		</tu>
 		<tu tuid='display.shortcut.delete'>
-			<tuv xml:lang="en_US"><seg>Delete this ticket (X)</seg></tuv>
+			<tuv xml:lang="en_US"><seg>Delete this ticket (X) (Disabled)</seg></tuv>
 		</tu>
 		<tu tuid='display.shortcut.print'>
-			<tuv xml:lang="en_US"><seg>Print this ticket (P)</seg></tuv>
+			<tuv xml:lang="en_US"><seg>Print this ticket (P) (Disabled)</seg></tuv>
 		</tu>
 		<tu tuid='display.shortcut.read_all'>
 			<tuv xml:lang="en_US"><seg>Read all messages in chronological order (A)</seg></tuv>
@@ -1028,7 +1058,7 @@
 			<tuv xml:lang="en_US"><seg>Reload this ticket</seg></tuv>
 		</tu>
 		<tu tuid='display.shortcut.spam'>
-			<tuv xml:lang="en_US"><seg>Report this ticket as spam (S)</seg></tuv>
+			<tuv xml:lang="en_US"><seg>Report this ticket as spam (S) (Disabled)</seg></tuv>
 		</tu>
 		<tu tuid='display.shortcut.surrender'>
 			<tuv xml:lang="en_US"><seg>Unassign this ticket from yourself (U)</seg></tuv>
diff --git a/plugins/cerberusweb.core/templates/configuration/tabs/mail/outgoing_settings.tpl b/plugins/cerberusweb.core/templates/configuration/tabs/mail/outgoing_settings.tpl
index 7a37c4b..bbc610b 100644
--- a/plugins/cerberusweb.core/templates/configuration/tabs/mail/outgoing_settings.tpl
+++ b/plugins/cerberusweb.core/templates/configuration/tabs/mail/outgoing_settings.tpl
@@ -75,14 +75,7 @@
 				<textarea name="default_signature" rows="4" cols="76">{$settings->get('default_signature')|escape:"html"}</textarea><br>
 				<div style="padding-left:10px;">
 					E-mail Signature Variables: 
-					<select name="sig_vars" onchange="insertAtCursor(this.form.default_signature,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.default_signature.focus();">
-						<option value="">-- choose --</option>
-						<optgroup label="Worker">
-							<option value="#first_name#">#first_name#</option>
-							<option value="#last_name#">#last_name#</option>
-							<option value="#title#">#title#</option>
-						</optgroup>
-					</select>
+          {html_options name="sig_token" options=$sig_token onchange="insertAtCursor(this.form.default_signature,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.signature.focus();"} 
 					<br>
 					<br>
 					
@@ -94,6 +87,27 @@
 					<br>
 					<br>
 				</div>
+				<b>{$translate->_('config.mail.message.status.reply')|capitalize} {$translate->_('config.mail.message.status')|capitalize}</b><br>
+				<label><input type="radio" name="default_ticket_reply_status" value="0" {if $default_ticket_reply_status eq 0}checked{/if}> {$translate->_('status.open')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_reply_status" value="1" {if $default_ticket_reply_status eq 1}checked{/if}> {$translate->_('status.waiting')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_reply_status" value="2" {if $default_ticket_reply_status eq 2}checked{/if}> {$translate->_('status.closed')|capitalize}</label>
+				<br>
+				<br>
+
+				<b>{$translate->_('config.mail.message.status.open')|capitalize} {$translate->_('config.mail.message.status')|capitalize}</b><br>
+				<label><input type="radio" name="default_ticket_open_status" value="0" {if $default_ticket_open_status eq 0}checked{/if}> {$translate->_('status.open')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_open_status" value="1" {if $default_ticket_open_status eq 1}checked{/if}> {$translate->_('status.waiting')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_open_status" value="2" {if $default_ticket_open_status eq 2}checked{/if}> {$translate->_('status.closed')|capitalize}</label>
+				<br>
+				<br>
+
+				<b>{$translate->_('config.mail.message.status.send')|capitalize} {$translate->_('config.mail.message.status')|capitalize}</b><br>
+				<label><input type="radio" name="default_ticket_send_status" value="0" {if $default_ticket_send_status eq 0}checked{/if}> {$translate->_('status.open')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_send_status" value="1" {if $default_ticket_send_status eq 1}checked{/if}> {$translate->_('status.waiting')|capitalize}</label>
+				<label><input type="radio" name="default_ticket_send_status" value="2" {if $default_ticket_send_status eq 2}checked{/if}> {$translate->_('status.closed')|capitalize}</label>
+				<br>
+				<br>
+				<br>
 			</blockquote>
 			
 			<button type="submit"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/check.gif{/devblocks_url}" align="top"> {$translate->_('common.save_changes')|capitalize}</button>
diff --git a/plugins/cerberusweb.core/templates/configuration/tabs/scheduler/index.tpl b/plugins/cerberusweb.core/templates/configuration/tabs/scheduler/index.tpl
index f4258c7..bc9d68b 100644
--- a/plugins/cerberusweb.core/templates/configuration/tabs/scheduler/index.tpl
+++ b/plugins/cerberusweb.core/templates/configuration/tabs/scheduler/index.tpl
@@ -27,16 +27,18 @@
 	<a href="javascript:;" onclick="toggleDiv('job_{$job_id}');">{$job->manifest->name}</a>
 	
 	<div id="" style="display:block;border:1px solid rgb(200,200,200);background-color:rgb(255,255,255);padding:5px;margin:5px;">
-		{assign var=duration value=$job->getParam('duration',5)}
-		{assign var=term value=$job->getParam('term','m')}
-		Runs every: {$duration}
-		{if $term=='d'}
-			days
-		{elseif $term=='m'}
-			minutes
-		{elseif $term=='h'}
-			hours
-		{/if}<br>
+		{if $enabled}
+			{assign var=duration value=$job->getParam('duration',5)}
+			{assign var=term value=$job->getParam('term','m')}
+			Runs every: {$duration}
+			{if $term=='d'}
+				days
+			{elseif $term=='m'}
+				minutes
+			{elseif $term=='h'}
+				hours
+			{/if}<br>
+		{/if}
 		
 		Last run: {if $lastrun}{$lastrun|devblocks_date}{else}Never{/if}
 		{if $enabled && !$locked}
diff --git a/plugins/cerberusweb.core/templates/display/index.tpl b/plugins/cerberusweb.core/templates/display/index.tpl
index 4029acc..2c5a30a 100644
--- a/plugins/cerberusweb.core/templates/display/index.tpl
+++ b/plugins/cerberusweb.core/templates/display/index.tpl
@@ -18,6 +18,9 @@
 					<b>{$translate->_('common.bucket')|capitalize}:</b> {if !empty($ticket_category_id)}{$ticket_category->name}{else}{$translate->_('common.inbox')|capitalize}{/if} &nbsp; 
 					<b>{$translate->_('ticket.mask')|capitalize}:</b> {$ticket->mask} &nbsp; 
 					<b>{$translate->_('ticket.id')}:</b> {$ticket->id} &nbsp; 
+					{if isset($total_time_all) }
+						<b>Total Ticket Time Worked: </b> {$total_time_all} Mins&nbsp; 
+					{/if}
 					<br>
 					{if !empty($ticket->next_worker_id)}
 						{assign var=next_worker_id value=$ticket->next_worker_id}
@@ -108,9 +111,9 @@
 			
 			{if $pref_keyboard_shortcuts}
 			{$translate->_('common.keyboard')|lower}: 
-			{if !$ticket->is_closed && $active_worker->hasPriv('core.ticket.actions.close')}(<b>c</b>) {$translate->_('common.close')|lower} {/if}
-			{if !$ticket->spam_trained && $active_worker->hasPriv('core.ticket.actions.spam')}(<b>s</b>) {$translate->_('common.spam')|lower} {/if}
-			{if !$ticket->is_deleted && $active_worker->hasPriv('core.ticket.actions.delete')}(<b>x</b>) {$translate->_('common.delete')|lower} {/if}
+			{if !$ticket->is_closed && $active_worker->hasPriv('core.ticket.actions.close')}(<b>c</b>) {$translate->_('common.close')|lower} (disabled) {/if}
+			{if !$ticket->spam_trained && $active_worker->hasPriv('core.ticket.actions.spam')}(<b>s</b>) {$translate->_('common.spam')|lower} (disabled) {/if}
+			{if !$ticket->is_deleted && $active_worker->hasPriv('core.ticket.actions.delete')}(<b>x</b>) {$translate->_('common.delete')|lower} (disabled) {/if}
 			{if empty($ticket->next_worker_id)}(<b>t</b>) {$translate->_('mail.take')|lower} {/if}
 			{if $ticket->next_worker_id == $active_worker->id}(<b>u</b>) {$translate->_('mail.surrender')|lower} {/if}
 			{if !$expand_all}(<b>a</b>) {$translate->_('display.button.read_all')|lower} {/if} 
@@ -221,11 +224,11 @@ CreateKeyHandler(function doShortcuts(e) {
 				document.getElementById('btnReadAll').click();
 			} catch(ex){}
 			break;
-		case 67:  // (C) close
-			try {
-				document.getElementById('btnClose').click();
-			} catch(ex){}
-			break;
+//		case 67:  // (C) close
+//			try {
+//				document.getElementById('btnClose').click();
+//			} catch(ex){}
+//			break;
 		case 80:  // (P) print
 			try {
 				document.getElementById('btnPrint').click();
@@ -236,11 +239,11 @@ CreateKeyHandler(function doShortcuts(e) {
 				document.getElementById('btnReplyFirst').click();
 			} catch(ex){}
 			break;
-		case 83:  // (S) spam
-			try {
-				document.getElementById('btnSpam').click();
-			} catch(ex){}
-			break;
+//		case 83:  // (S) spam
+//			try {
+//				document.getElementById('btnSpam').click();
+//			} catch(ex){}
+//			break;
 		case 84:  // (T) take/assign
 			try {
 				document.getElementById('btnTake').click();
@@ -251,11 +254,11 @@ CreateKeyHandler(function doShortcuts(e) {
 				document.getElementById('btnSurrender').click();
 			} catch(ex){}
 			break;
-		case 88:  // (X) delete
-			try {
-				document.getElementById('btnDelete').click();
-			} catch(ex){}
-			break;
+//		case 88:  // (X) delete
+//			try {
+//				document.getElementById('btnDelete').click();
+//			} catch(ex){}
+//			break;
 		case 219:  // [ - prev page
 			try {
 				document.getElementById('btnPagePrev').click();
diff --git a/plugins/cerberusweb.core/templates/display/modules/conversation/message.tpl b/plugins/cerberusweb.core/templates/display/modules/conversation/message.tpl
index ddae4f0..8d1cda4 100644
--- a/plugins/cerberusweb.core/templates/display/modules/conversation/message.tpl
+++ b/plugins/cerberusweb.core/templates/display/modules/conversation/message.tpl
@@ -62,8 +62,14 @@
       
       {if $expanded}
       <div style="margin:2px;margin-left:10px;">
-      	 <a href="javascript:;" onclick="toggleDiv('{$message->id}sh');toggleDiv('{$message->id}h');">{$translate->_('display.convo.full_headers')|lower}</a>
-      	 | <a href="#{$message->id}act">{$translate->_('display.convo.skip_to_bottom')|lower}</a>
+      	 <div id="{$message->id}fh" style="display:block;">
+				 <a href="javascript:;" onclick="toggleDiv('{$message->id}sh');toggleDiv('{$message->id}h');toggleDiv('{$message->id}fh');toggleDiv('{$message->id}hh');">{$translate->_('display.convo.full_headers')|lower}</a>
+				 | <a href="#{$message->id}act">{$translate->_('display.convo.skip_to_bottom')|lower}</a>
+				 </div>
+      	 <div id="{$message->id}hh" style="display:none;">
+				 <a href="javascript:;" onclick="toggleDiv('{$message->id}sh');toggleDiv('{$message->id}h');toggleDiv('{$message->id}fh');toggleDiv('{$message->id}hh');">{$translate->_('display.convo.hide_headers')|lower}</a>
+				 | <a href="#{$message->id}act">{$translate->_('display.convo.skip_to_bottom')|lower}</a>
+				 </div>
       </div>
       {/if}
       
diff --git a/plugins/cerberusweb.core/templates/display/rpc/email_templates/template_edit_panel.tpl b/plugins/cerberusweb.core/templates/display/rpc/email_templates/template_edit_panel.tpl
index 9bf1d19..90c4ff4 100644
--- a/plugins/cerberusweb.core/templates/display/rpc/email_templates/template_edit_panel.tpl
+++ b/plugins/cerberusweb.core/templates/display/rpc/email_templates/template_edit_panel.tpl
@@ -34,30 +34,18 @@
 <b>Text:</b><br>
 <textarea name="template" rows="10" cols="45" style="width:100%;">{$template->content}</textarea><br>
 
-<b>Insert Placeholder:</b> <select name="token" onchange="insertAtCursor(this.form.template,selectValue(this.form.token));this.form.token.selectedIndex=0;this.form.template.focus();">
-	<option value="">-- choose --</option>
-	<optgroup label="General">
-		<option value="#timestamp#">Current Time</option>
-	</optgroup>
-	{if 2==$type}
-		<optgroup label="Sender">
-			<option value="#sender_first_name#">First Name</option>
-			<option value="#sender_last_name#">Last Name</option>
-			<option value="#sender_org#">Organization</option>
-		</optgroup>
-		<optgroup label="Ticket">
-			<option value="#ticket_id#">Internal ID</option>
-			<option value="#ticket_mask#">Reference ID (Mask)</option>
-			<option value="#ticket_subject#">Subject</option>
-		</optgroup>
-	{/if}
-	<optgroup label="Worker">
-		<option value="#worker_first_name#">First Name</option>
-		<option value="#worker_last_name#">Last Name</option>
-		<option value="#worker_title#">Title</option>
-	</optgroup>
-</select>
+<b>Insert Placeholder:</b> 
+    {html_options name="token" options=$EmailTemplateTokens onchange="insertAtCursor(this.form.template,selectValue(this.form.token));this.form.token.selectedIndex=0;this.form.template.focus();"}>
+
 <br>
+{$translate->_('display.reply.email_templates.limit_group')} 
+<select name="group_id">
+<option value="0" {if $template->team_id==$team_id}selected{/if}>{$translate->_('common.all')}</option>
+{foreach from=$allowed_group_list item=group key=team_id}
+        <option value="{$team_id}" {if $template->team_id==$team_id}selected{/if}>{$groups[$team_id]->name}</option>
+{/foreach}
+</select>
+</form>
 <br>
 
 <button type="button" onclick="saveGenericAjaxPanel('replyTemplateEditForm',true,ajax.onSaveReplyTemplate);"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/document_ok.gif{/devblocks_url}" align="top"> {$translate->_('common.save_changes')|capitalize}</button>
diff --git a/plugins/cerberusweb.core/templates/display/rpc/reply.tpl b/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
index 4d0058e..6a39e74 100644
--- a/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
+++ b/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
@@ -172,14 +172,14 @@
 					<table cellpadding="2" cellspacing="0" border="0">
 						<tr>
 							<td nowrap="nowrap" valign="top" colspan="2">
-								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('replyOpen{$message->id}','block');toggleDiv('replyClosed{$message->id}','none');">{$translate->_('status.open')|capitalize}</label>
-								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('replyOpen{$message->id}','block');toggleDiv('replyClosed{$message->id}','block');" {if !$ticket->is_closed}checked{/if}>{$translate->_('status.waiting')|capitalize}</label>
-								{if $active_worker->hasPriv('core.ticket.actions.close') || ($ticket->is_closed && !$ticket->is_deleted)}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('replyOpen{$message->id}','none');toggleDiv('replyClosed{$message->id}','block');" {if $ticket->is_closed}checked{/if}>{$translate->_('status.closed')|capitalize}</label>{/if}
+								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('replyOpen{$message->id}','block');toggleDiv('replyClosed{$message->id}','none');" {if !$ticket->is_closed && $reply_status==0} checked{/if}>{$translate->_('status.open')|capitalize}</label>
+								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('replyOpen{$message->id}','block');toggleDiv('replyClosed{$message->id}','block');"{if !$ticket->is_closed && $reply_status==1} checked{/if}>{$translate->_('status.waiting')|capitalize}</label>
+								{if $active_worker->hasPriv('core.ticket.actions.close') || ($ticket->is_closed && !$ticket->is_deleted)}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('replyOpen{$message->id}','none');toggleDiv('replyClosed{$message->id}','block');" {if $ticket->is_closed || $reply_status==2} checked{/if}>{$translate->_('status.closed')|capitalize}</label>{/if}
 								<br>
 								<br>
 								
-						      	<div id="replyClosed{$message->id}" style="display:block;margin-left:10px;">
-						      	<b>{$translate->_('display.reply.next.resume')}</b> {$translate->_('display.reply.next.resume_eg')}<br> 
+						      	<div id="replyClosed{$message->id}" style="display:{if $reply_status==0}none{else}block{/if};margin-left:10px;">
+ 						      	<b>{$translate->_('display.reply.next.resume')}</b> {$translate->_('display.reply.next.resume_eg')}<br> 
 						      	<input type="text" name="ticket_reopen" size="55" value="{if !empty($ticket->due_date)}{$ticket->due_date|devblocks_date}{/if}"><br>
 						      	{$translate->_('display.reply.next.resume_blank')}<br>
 						      	<br>
diff --git a/plugins/cerberusweb.core/templates/groups/manage/index.tpl b/plugins/cerberusweb.core/templates/groups/manage/index.tpl
index e30a3ae..7b9ed72 100644
--- a/plugins/cerberusweb.core/templates/groups/manage/index.tpl
+++ b/plugins/cerberusweb.core/templates/groups/manage/index.tpl
@@ -58,16 +58,15 @@
 	</div>
 	<textarea name="signature" rows="4" cols="76">{$team->signature}</textarea><br>
 		E-mail Tokens: 
-		<select name="sig_token" onchange="insertAtCursor(this.form.signature,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.signature.focus();">
-			<option value="">-- choose --</option>
-			<optgroup label="Worker">
-				<option value="#first_name#">First Name</option>
-				<option value="#last_name#">Last Name</option>
-				<option value="#title#">Title</option>
+
+    {html_options name="sig_token" options=$sig_token onchange="insertAtCursor(this.form.signature,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.signature.focus();"} 
+				<option value="#cf_asset#">Asset</option>
+				<option value="#cf_client#">Client</option>
 			</optgroup>
-		</select>
+			<optgroup label="Time Tracker">
+				<option value="#total_time_worked#">Total Time Worked</option>
 		
-		{if !empty($default_signature)}
+    {if !empty($default_signature)}
 		<button type="button" onclick="this.form.signature.value=this.form.default_signature.value;">set to default</button>
 		{/if}
 	<br> 
@@ -82,28 +81,7 @@
 		<textarea name="auto_reply" rows="10" cols="76">{$group_settings.auto_reply}</textarea><br>
 			<b>E-mail Tokens:</b>
 			
-			<select name="autoreply_token" onchange="insertAtCursor(this.form.auto_reply,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.auto_reply.focus();">
-				<option value="">-- choose --</option>
-				<optgroup label="General">
-					<option value="#timestamp#">Current Time</option>
-				</optgroup>
-				<optgroup label="First Requester">
-					<option value="#sender#">E-mail</option>
-					<option value="#sender_first#">First Name</option>
-				</optgroup>
-				<optgroup label="First Message">
-					<option value="#orig_body#">Message Body</option>
-				</optgroup>
-				<optgroup label="Ticket">
-					<option value="#mask#">Reference ID</option>
-					<option value="#ticket_id#">Internal ID</option>
-					<option value="#subject#">Subject</option>
-					<!-- 
-					<option value="#group#">Group Name</option>
-					<option value="#bucket#">Bucket Name</option>
-					 -->
-				</optgroup>
-			</select>
+    {html_options name="autoreply_token" options=$autoreply_token  onchange="insertAtCursor(this.form.auto_reply,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.auto_reply.focus();"}
 		<br>
 	</div> 
 	<br>
@@ -115,28 +93,21 @@
 		<b>Send the following message:</b><br>
 		<textarea name="close_reply" rows="10" cols="76">{$group_settings.close_reply}</textarea><br>
 			E-mail Tokens: 
-			<select name="closereply_token" onchange="insertAtCursor(this.form.close_reply,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.close_reply.focus();">
-				<option value="">-- choose --</option>
-				<optgroup label="General">
-					<option value="#timestamp#">Current Time</option>
-				</optgroup>
-				<optgroup label="First Requester">
-					<option value="#sender#">E-mail</option>
-					<option value="#sender_first#">First Name</option>
-				</optgroup>
-				<optgroup label="First Message">
-					<option value="#orig_body#">Message Body</option>
-				</optgroup>
-				<optgroup label="Ticket">
-					<option value="#mask#">Reference ID</option>
-					<option value="#ticket_id#">Internal ID</option>
-					<option value="#subject#">Subject</option>
-				</optgroup>
-			</select>
+
+    {html_options name="closereply_token" options=$closereply_token  onchange="insertAtCursor(this.form.close_reply,this.options[this.selectedIndex].value);this.selectedIndex=0;this.form.close_reply.focus();"} 
 		<br>
 	</div> 
 	<br>
 	
+	<h3>{$translate->_('config.mail.message.status.reply')|capitalize} {$translate->_('config.mail.message.status')|capitalize}</h3>
+	
+	<label><input type="radio" name="ticket_reply_status" value="255" {if $ticket_reply_status eq 255}checked{/if}> {$translate->_('config.mail.message.status.default')|capitalize}</label>
+	<label><input type="radio" name="ticket_reply_status" value="0" {if $ticket_reply_status eq 0}checked{/if}> {$translate->_('status.open')|capitalize}</label>
+	<label><input type="radio" name="ticket_reply_status" value="1" {if $ticket_reply_status eq 1}checked{/if}> {$translate->_('status.waiting')|capitalize}</label>
+	<label><input type="radio" name="ticket_reply_status" value="2" {if $ticket_reply_status eq 2}checked{/if}> {$translate->_('status.closed')|capitalize}</label>
+	<br>
+	<br>
+	
 	<button type="submit"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/check.gif{/devblocks_url}" align="top"> {$translate->_('common.save_changes')|capitalize}</button>
 	
 	</div>
diff --git a/plugins/cerberusweb.core/templates/tickets/compose/index.tpl b/plugins/cerberusweb.core/templates/tickets/compose/index.tpl
index c624175..3c970cc 100644
--- a/plugins/cerberusweb.core/templates/tickets/compose/index.tpl
+++ b/plugins/cerberusweb.core/templates/tickets/compose/index.tpl
@@ -6,6 +6,9 @@
 {if !empty($last_ticket_mask)}
 <div class="success">Message sent! &nbsp; &nbsp; <a href="{devblocks_url}c=display&mask={$last_ticket_mask}{/devblocks_url}" style="font-weight:normal;color:rgb(80,80,80);">View the message</a></div>
 {/if}
+{if !empty($no_to_in_ticket)}
+<div class="error">{$translate->_('display.error.compose')}</div>
+{/if}
 
 <div class="block">
 <h2>Outgoing Message</h2>
@@ -109,6 +112,87 @@
 				
 	<tr>
 		<td>
+			<div id="replyAttachments{$message->id}" style="display:block;margin:5px;padding:5px;background-color:rgb(240,240,240);">
+			<table cellpadding="0" cellspacing="0" border="0" width="100%">
+			<tr>
+				<td style="background-color:rgb(184,0,4);width:10px;"></td>
+				<td style="padding-left:5px;">
+					{* [TODO] Display by Group *}
+					<table cellpadding="2" cellspacing="1" border="0">
+					{assign var=last_group_id value=-1}
+					{foreach from=$ticket_fields item=f key=f_id}
+					{assign var=field_group_id value=$f->group_id}
+					{if $field_group_id == 0 || $field_group_id == $ticket->team_id}
+						{assign var=show_submit value=1}
+						{if $field_group_id != $last_group_id}
+							<tr>
+								<td colspan="2"><H2>{if $f->group_id==0}Global{else}{$groups.$field_group_id->name}{/if} Fields</H2></td>
+							</tr>
+						{/if}
+							<tr>
+								<td valign="top" width="1%" nowrap="nowrap">
+									<input type="hidden" name="field_ids[]" value="{$f_id}">
+									<b>{$f->name}:</b>
+								</td>
+								<td valign="top" width="99%">
+									{if $f->type=='S'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}"><br>
+									{elseif $f->type=='U'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}">
+										{if !empty($ticket_field_values.$f_id)}<a href="{$ticket_field_values.$f_id|escape}" target="_blank">URL</a>{else}<i>(URL)</i>{/if}
+									{elseif $f->type=='N'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}"><br>
+									{elseif $f->type=='T'}
+										<textarea name="field_{$f_id}" rows="4" cols="50" style="width:98%;">{$ticket_field_values.$f_id}</textarea><br>
+									{elseif $f->type=='C'}
+										<input type="checkbox" name="field_{$f_id}" value="1" {if $ticket_field_values.$f_id}checked{/if}><br>
+									{elseif $f->type=='X'}
+										{foreach from=$f->options item=opt}
+										<label><input type="checkbox" name="field_{$f_id}[]" value="{$opt|escape}" {if isset($ticket_field_values.$f_id.$opt)}checked="checked"{/if}> {$opt}</label><br>
+										{/foreach}
+									{elseif $f->type=='D'}
+										<select name="field_{$f_id}">{* [TODO] Fix selected *}
+											<option value=""></option>
+											{foreach from=$f->options item=opt}
+											<option value="{$opt|escape}" {if $opt==$ticket_field_values.$f_id}selected{/if}>{$opt}</option>
+											{/foreach}
+										</select><br>
+									{elseif $f->type=='M'}
+										<select name="field_{$f_id}[]" size="5" multiple="multiple">
+											{foreach from=$f->options item=opt}
+											<option value="{$opt|escape}" {if isset($ticket_field_values.$f_id.$opt)}selected="selected"{/if}>{$opt}</option>
+											{/foreach}
+										</select><br>
+										<i><small>{$translate->_('common.tips.multi_select')}</small></i>
+									{elseif $f->type=='E'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{if !empty($ticket_field_values.$f_id)}{$ticket_field_values.$f_id|devblocks_date}{/if}"><button type="button" onclick="ajax.getDateChooser('dateCustom{$f_id}',this.form.field_{$f_id});">&nbsp;<img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/calendar.gif{/devblocks_url}" align="top">&nbsp;</button>
+										<div id="dateCustom{$f_id}" style="display:none;position:absolute;z-index:1;"></div>
+									{elseif $f->type=='W'}
+										{if empty($workers)}
+											{php}$this->assign('workers', DAO_Worker::getAllActive());{/php}
+										{/if}
+										<select name="field_{$f_id}">
+											<option value=""></option>
+											{foreach from=$workers item=worker}
+											<option value="{$worker->id}" {if $worker->id==$ticket_field_values.$f_id}selected="selected"{/if}>{$worker->getName()}</option>
+											{/foreach}
+										</select>
+									{/if}	
+								</td>
+							</tr>
+						{assign var=last_group_id value=$f->group_id}
+					{/if}
+					{/foreach}
+					</table>
+					</td>
+				</tr>
+				</table>
+			</div>
+		</td>
+	</tr>
+				
+	<tr>
+		<td>
 		<div style="background-color:rgb(240,240,240);margin:5px;padding:5px;">
 			<table cellpadding="0" cellspacing="0" border="0" width="100%">
 			<tr>
@@ -118,13 +202,13 @@
 					<table cellpadding="2" cellspacing="0" border="0">
 						<tr>
 							<td nowrap="nowrap" valign="top" colspan="2">
-								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('ticketClosed','none');">{$translate->_('status.open')|capitalize}</label>
-								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('ticketClosed','block');" checked>{$translate->_('status.waiting')|capitalize}</label>
-								{if $active_worker->hasPriv('core.ticket.actions.close')}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('ticketClosed','block');">{$translate->_('status.closed')|capitalize}</label>{/if}
+								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('ticketClosed','none');" {if $default_ticket_send_status==0} checked{/if}>{$translate->_('status.open')|capitalize}</label>
+								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('ticketClosed','block');"{if $default_ticket_send_status==1} checked{/if}>{$translate->_('status.waiting')|capitalize}</label>
+								{if $active_worker->hasPriv('core.ticket.actions.close')}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('ticketClosed','block');"{if $default_ticket_send_status==2} checked{/if}>{$translate->_('status.closed')|capitalize}</label>{/if}
 								<br>
 								<br>
 
-								<div id="ticketClosed" style="display:block;margin-left:10px;">
+								<div id="ticketClosed" style="display:{if $default_ticket_send_status==0}none{else}block{/if};margin-left:10px;">
 								<b>{$translate->_('display.reply.next.resume')}</b> {$translate->_('display.reply.next.resume_eg')}<br> 
 								<input type="text" name="ticket_reopen" size="55" value=""><br>
 								{$translate->_('display.reply.next.resume_blank')}<br>
diff --git a/plugins/cerberusweb.core/templates/tickets/create/index.tpl b/plugins/cerberusweb.core/templates/tickets/create/index.tpl
index 0f0f8b7..2a26bd0 100644
--- a/plugins/cerberusweb.core/templates/tickets/create/index.tpl
+++ b/plugins/cerberusweb.core/templates/tickets/create/index.tpl
@@ -6,6 +6,9 @@
 {if !empty($last_ticket_mask)}
 <div class="success">Message created! &nbsp; &nbsp; <a href="{devblocks_url}c=display&mask={$last_ticket_mask}{/devblocks_url}" style="font-weight:normal;color:rgb(80,80,80);">View the message</a></div>
 {/if}
+{if !empty($no_to_in_ticket)}
+<div class="error">{$translate->_('display.error.create')}</div>
+{/if}
 
 <div class="block">
 <h2>{$translate->_('mail.log_message')|capitalize}</h2>
@@ -94,6 +97,86 @@
 			</div>
 		</td>
 	</tr>
+	<tr>
+		<td>
+			<div id="replyAttachments{$message->id}" style="display:block;margin:5px;padding:5px;background-color:rgb(240,240,240);">
+			<table cellpadding="0" cellspacing="0" border="0" width="100%">
+			<tr>
+				<td style="background-color:rgb(184,0,4);width:10px;"></td>
+				<td style="padding-left:5px;">
+					{* [TODO] Display by Group *}
+					<table cellpadding="2" cellspacing="1" border="0">
+					{assign var=last_group_id value=-1}
+					{foreach from=$ticket_fields item=f key=f_id}
+					{assign var=field_group_id value=$f->group_id}
+					{if $field_group_id == 0 || $field_group_id == $ticket->team_id}
+						{assign var=show_submit value=1}
+						{if $field_group_id != $last_group_id}
+							<tr>
+								<td colspan="2"><H2>{if $f->group_id==0}Global{else}{$groups.$field_group_id->name}{/if} Fields</H2></td>
+							</tr>
+						{/if}
+							<tr>
+								<td valign="top" width="1%" nowrap="nowrap">
+									<input type="hidden" name="field_ids[]" value="{$f_id}">
+									<b>{$f->name}:</b>
+								</td>
+								<td valign="top" width="99%">
+									{if $f->type=='S'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}"><br>
+									{elseif $f->type=='U'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}">
+										{if !empty($ticket_field_values.$f_id)}<a href="{$ticket_field_values.$f_id|escape}" target="_blank">URL</a>{else}<i>(URL)</i>{/if}
+									{elseif $f->type=='N'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{$ticket_field_values.$f_id|escape}"><br>
+									{elseif $f->type=='T'}
+										<textarea name="field_{$f_id}" rows="4" cols="50" style="width:98%;">{$ticket_field_values.$f_id}</textarea><br>
+									{elseif $f->type=='C'}
+										<input type="checkbox" name="field_{$f_id}" value="1" {if $ticket_field_values.$f_id}checked{/if}><br>
+									{elseif $f->type=='X'}
+										{foreach from=$f->options item=opt}
+										<label><input type="checkbox" name="field_{$f_id}[]" value="{$opt|escape}" {if isset($ticket_field_values.$f_id.$opt)}checked="checked"{/if}> {$opt}</label><br>
+										{/foreach}
+									{elseif $f->type=='D'}
+										<select name="field_{$f_id}">{* [TODO] Fix selected *}
+											<option value=""></option>
+											{foreach from=$f->options item=opt}
+											<option value="{$opt|escape}" {if $opt==$ticket_field_values.$f_id}selected{/if}>{$opt}</option>
+											{/foreach}
+										</select><br>
+									{elseif $f->type=='M'}
+										<select name="field_{$f_id}[]" size="5" multiple="multiple">
+											{foreach from=$f->options item=opt}
+											<option value="{$opt|escape}" {if isset($ticket_field_values.$f_id.$opt)}selected="selected"{/if}>{$opt}</option>
+											{/foreach}
+										</select><br>
+										<i><small>{$translate->_('common.tips.multi_select')}</small></i>
+									{elseif $f->type=='E'}
+										<input type="text" name="field_{$f_id}" size="45" maxlength="255" value="{if !empty($ticket_field_values.$f_id)}{$ticket_field_values.$f_id|devblocks_date}{/if}"><button type="button" onclick="ajax.getDateChooser('dateCustom{$f_id}',this.form.field_{$f_id});">&nbsp;<img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/calendar.gif{/devblocks_url}" align="top">&nbsp;</button>
+										<div id="dateCustom{$f_id}" style="display:none;position:absolute;z-index:1;"></div>
+									{elseif $f->type=='W'}
+										{if empty($workers)}
+											{php}$this->assign('workers', DAO_Worker::getAllActive());{/php}
+										{/if}
+										<select name="field_{$f_id}">
+											<option value=""></option>
+											{foreach from=$workers item=worker}
+											<option value="{$worker->id}" {if $worker->id==$ticket_field_values.$f_id}selected="selected"{/if}>{$worker->getName()}</option>
+											{/foreach}
+										</select>
+									{/if}	
+								</td>
+							</tr>
+						{assign var=last_group_id value=$f->group_id}
+					{/if}
+					{/foreach}
+					</table>
+					</td>
+				</tr>
+				</table>
+			</div>
+		</td>
+	</tr>
 				
 	<tr>
 		<td>
@@ -106,13 +189,13 @@
 					<table cellpadding="2" cellspacing="0" border="0">
 						<tr>
 							<td nowrap="nowrap" valign="top" colspan="2">
-								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('ticketClosed','none');">{$translate->_('status.open')|capitalize}</label>
-								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('ticketClosed','block');" checked>{$translate->_('status.waiting')|capitalize}</label>
-								{if $active_worker->hasPriv('core.ticket.actions.close')}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('ticketClosed','block');">{$translate->_('status.closed')|capitalize}</label>{/if}
+								<label><input type="radio" name="closed" value="0" onclick="toggleDiv('ticketClosed','none');" {if $default_ticket_open_status eq 0}checked{/if}>{$translate->_('status.open')|capitalize}</label>
+								<label><input type="radio" name="closed" value="2" onclick="toggleDiv('ticketClosed','block');" {if $default_ticket_open_status eq 1}checked{/if}>{$translate->_('status.waiting')|capitalize}</label>
+								{if $active_worker->hasPriv('core.ticket.actions.close')}<label><input type="radio" name="closed" value="1" onclick="toggleDiv('ticketClosed','block');"{if $default_ticket_open_status eq 2}checked{/if}>{$translate->_('status.closed')|capitalize}</label>{/if}
 								<br>
 								<br>
 		
-								<div id="ticketClosed" style="display:block;margin-left:10px;">
+								<div id="ticketClosed" style="display:{if $default_ticket_open_status==0}none{else}block{/if};margin-left:10px;">
 								<b>{$translate->_('display.reply.next.resume')}</b> {$translate->_('display.reply.next.resume_eg')}<br> 
 								<input type="text" name="ticket_reopen" size="55" value=""><br>
 								{$translate->_('display.reply.next.resume_blank')}<br>
@@ -195,4 +278,4 @@ YAHOO.util.Event.addListener(window,'load',function(e) {
 	ajax.cbEmailMultiplePeek(null);
 });
 {/literal}
-</script>
\ No newline at end of file
+</script>
diff --git a/plugins/cerberusweb.reports/templates/reports/worker/ticket_assignment/html.tpl b/plugins/cerberusweb.reports/templates/reports/worker/ticket_assignment/html.tpl
index 4961a8e..9afbba9 100644
--- a/plugins/cerberusweb.reports/templates/reports/worker/ticket_assignment/html.tpl
+++ b/plugins/cerberusweb.reports/templates/reports/worker/ticket_assignment/html.tpl
@@ -7,7 +7,7 @@
 	
 	
 			<tr>
-				<td colspan="3" style="border-bottom:1px solid rgb(200,200,200);padding-right:20px;"><h2>{$workers.$worker_id->first_name} {$workers.$worker_id->last_name}</h2></td>
+				<td colspan="3" style="border-bottom:1px solid rgb(200,200,200);padding-right:20px;"><h2>{$workers.$worker_id->last_name} {$workers.$worker_id->first_name}</h2></td>
 			</tr>
 	
 			{foreach from=$assigned_tickets item=ticket}
diff --git a/plugins/cerberusweb.templates/api/App.php b/plugins/cerberusweb.templates/api/App.php
new file mode 100644
index 0000000..ae3000d
--- /dev/null
+++ b/plugins/cerberusweb.templates/api/App.php
@@ -0,0 +1,188 @@
+<?php
+
+class ChCoreEmailSignatureTemplate extends Extension_EmailSignatureTemplate {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run($signature) {
+    $active_worker = CerberusApplication::getActiveWorker();
+    $worker = DAO_Worker::getAgent($active_worker->id); // Use the most recent info (not session)
+
+    $sig = $signature;
+    $signature = str_replace(
+      array('#first_name#','#last_name#','#title#'),
+      array($worker->first_name,$worker->last_name,$worker->title),
+      $sig
+    );
+  }
+  
+  function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+    $list['Worker'] = array(
+			'#first_name#' => $translate->_('worker.first_name'), 
+			'#last_name#' => $translate->_('worker.last_name'),
+			'#title#' => $translate->_('worker.title')
+			);
+    return;
+  }
+};
+
+class ChCoreAutoReplyNew extends Extension_AutoReplyNew {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run(CerberusTicket $ticket, $properties) {
+    $content = $properties['content'];
+		$message = DAO_Ticket::getMessage($ticket->first_message_id);
+		$address = DAO_Ticket::getRequestersByTicket($ticket->id);
+    $properties['content'] = str_replace(
+      array('#ticket_id#','#mask#','#subject#','#timestamp#', '#sender#','#sender_first#','#orig_body#'),
+      array($ticket->id, $ticket->mask, $ticket->subject, date('r'), $address->email, $address->first_name, ltrim($message->body)),
+      $content
+    );
+  }
+  
+	function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+		$list['General'] = array('#timestamp#' => $translate->_('template.common.current_time'));
+		$list['First Requester'] = array(
+			'#sender#' => $translate->_('common.email'),
+			'#sender_first#' => $translate->_('address.first_name')
+			);
+		$list['First Message'] = array('#orig_body#' => $translate->_('template.common.message_body'));
+		$list['Ticket'] = array(
+			'#mask#' => $translate->_('template.common.reference_id'),
+			'#ticket_id#' => $translate->_('template.common.internal_id'),
+			'#subject#' => $translate->_('message.header.subject')
+			);
+		return;
+	}
+};
+
+class ChCoreAutoReplyClose extends Extension_AutoReplyClose {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run(CerberusTicket $ticket, $properties) {
+    $content = $properties['content'];
+    $group_settings = DAO_GroupSettings::getSettings();
+
+    if(null != ($msg_first = DAO_Ticket::getMessage($ticket->first_message_id))) {
+      // First sender
+      $ticket_sender = '';
+      $ticket_sender_first = '';
+      if(null != ($sender_first = DAO_Address::get($msg_first->address_id))) {
+        $ticket_sender = $sender_first->email;
+        $ticket_sender_first = $sender_first->first_name;
+      }
+
+      // First body
+      $ticket_body = $msg_first->getContent();
+    }
+
+    $properties['content'] = str_replace(
+      array('#ticket_id#', '#mask#','#subject#','#timestamp#','#sender#','#sender_first#','#orig_body#'),
+      array($ticket->id, $ticket->mask, $ticket->subject, date('r'), $ticket_sender, $ticket_sender_first, ltrim($ticket_body)),
+      $content
+    );
+  }
+  
+  function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+		$list['General'] = array('#timestamp#' => $translate->_('template.common.current_time'));
+		$list['First Requester'] = array(
+			'#sender#' => $translate->_('common.email'),
+			'#sender_first#' => $translate->_('address.first_name')
+			);
+		$list['First Message'] = array('#orig_body#' => $translate->_('template.common.message_body'));
+		$list['Ticket'] = array(
+			'#mask#' => $translate->_('template.common.reference_id'),
+			'#ticket_id#' => $translate->_('template.common.internal_id'),
+			'#subject#' => $translate->_('message.header.subject')
+			);
+    return;
+  }
+};
+
+class ChCoreEmailTemplate extends Extension_EmailTemplate {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run($message_id, $template) {
+    $raw = $template;
+    $replace = array();
+    $with = array();
+
+    $replace[] = '#timestamp#';
+    $with[] = date('r');
+
+    if(!empty($message_id)) {
+      $message = DAO_Ticket::getMessage($message_id);
+      $ticket = DAO_Ticket::getTicket($message->ticket_id);
+      $sender = DAO_Address::get($message->address_id);
+      $sender_org = DAO_ContactOrg::get($sender->contact_org_id);
+
+      $replace[] = '#sender_first_name#';
+      $replace[] = '#sender_last_name#';
+      $replace[] = '#sender_org#';
+
+      $with[] = $sender->first_name;
+      $with[] = $sender->last_name;
+      $with[] = (!empty($sender_org)?$sender_org->name:"");
+
+      $replace[] = '#ticket_id#';
+      $replace[] = '#ticket_mask#';
+      $replace[] = '#ticket_subject#';
+
+      $with[] = $ticket->id;
+      $with[] = $ticket->mask;
+      $with[] = $ticket->subject;
+    }
+
+    if(null != ($active_worker = CerberusApplication::getActiveWorker())) {
+      $worker = DAO_Worker::getAgent($active_worker->id); // most recent info (not session)
+
+      $replace[] = '#worker_first_name#';
+      $replace[] = '#worker_last_name#';
+      $replace[] = '#worker_title#';
+
+      $with[] = $worker->first_name;
+      $with[] = $worker->last_name;
+      $with[] = $worker->title;
+    }
+
+    $template = str_replace($replace, $with, $raw);
+  }
+  
+  function render($type, $list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+		$list['General'] = array('#timestamp#' => $translate->_('template.common.current_time'));
+		if (2==$type) {
+      $list['Sender'] = array(
+				'#sender_first#' => $translate->_('address.first_name'),
+				'#sender_last_name#' =>  $translate->_('address.last_name'),
+				'#sender_org#' => $translate->_('address.contact_org_id')
+				);
+			$list['Ticket'] = array(
+				'#mask#' => $translate->_('template.common.reference_id'),
+				'#ticket_id#' => $translate->_('template.common.internal_id'),
+				'#subject#' => $translate->_('message.header.subject')
+				);
+    }
+    $list['Worker'] = array(
+			'#first_name#' => $translate->_('worker.first_name'), 
+			'#last_name#' => $translate->_('worker.last_name'),
+			'#title#' => $translate->_('worker.title')
+			);
+    return;
+  }
+};
+
diff --git a/plugins/cerberusweb.templates/api/Plugin.php b/plugins/cerberusweb.templates/api/Plugin.php
new file mode 100644
index 0000000..e96dffb
--- /dev/null
+++ b/plugins/cerberusweb.templates/api/Plugin.php
@@ -0,0 +1,12 @@
+<?php
+if (class_exists('DevblocksTranslationsExtension',true)):
+	class ChCoreTemplateTranslations extends DevblocksTranslationsExtension {
+		function __construct($manifest) {
+			parent::__construct($manifest);	
+		}
+		
+		function getTmxFile() {
+			return dirname(dirname(__FILE__)) . '/strings.xml';
+		}
+	};
+endif;
diff --git a/plugins/cerberusweb.templates/plugin.xml b/plugins/cerberusweb.templates/plugin.xml
new file mode 100644
index 0000000..fc243a7
--- /dev/null
+++ b/plugins/cerberusweb.templates/plugin.xml
@@ -0,0 +1,70 @@
+<!DOCTYPE plugin SYSTEM "../../libs/devblocks/plugin.dtd">
+<plugin>
+	<id>cerberusweb.templates.english</id>
+	<name>[Cerb4] Standard Templates</name>
+	<description>Pluggable Template items that allow you to replace text with variable data under templaces.</description>
+	<author>WebGroup Media, LLC.</author>
+	<revision>0</revision>
+	<link>http://wiki.cerb4.com/wiki/New_Changes#cerberusweb.templates</link>
+
+	<extensions>
+
+		<!-- Translations -->
+		<extension point="devblocks.i18n.strings">
+			<id>cerberusweb.templates.en..translations</id>
+			<name>[Cerb4] Standard Email Signature Templates Strings</name>
+			<class>
+				<file>api/Plugin.php</file>
+				<name>ChCoreTemplateTranslations</name>
+			</class>
+			<params>
+			</params>
+		</extension>
+
+		<extension point="cerberusweb.email_signature.template">
+      <id>cerberusweb.templates.en.email_signature</id>
+      <name>Standard Email Signature Templates</name>
+      <class>
+        <file>api/App.php</file>
+        <name>ChCoreEmailSignatureTemplate</name>
+      </class>
+      <params>
+      </params>
+    </extension>
+  
+    <extension point="cerberusweb.auto_reply.new">
+      <id>cerberusweb.templates.en.new</id>
+      <name>Standard New Templates</name>
+      <class>
+        <file>api/App.php</file>
+        <name>ChCoreAutoReplyNew</name>
+      </class>
+      <params>
+      </params>
+    </extension>
+  
+    <extension point="cerberusweb.auto_reply.close">
+      <id>cerberusweb.templates.en.close</id>
+      <name>Standard Close Templates</name>
+      <class>
+        <file>api/App.php</file>
+        <name>ChCoreAutoReplyClose</name>
+      </class>
+      <params>
+      </params>
+    </extension>
+	
+    <extension point="cerberusweb.email.template">
+      <id>cerberusweb.templates.en.email</id>
+      <name>Standard Email Templates</name>
+      <class>
+        <file>api/App.php</file>
+        <name>ChCoreEmailTemplate</name>
+      </class>
+      <params>
+      </params>
+    </extension>
+  
+	</extensions>
+	
+</plugin>
\ No newline at end of file
diff --git a/plugins/cerberusweb.templates/strings.xml b/plugins/cerberusweb.templates/strings.xml
new file mode 100644
index 0000000..c507549
--- /dev/null
+++ b/plugins/cerberusweb.templates/strings.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tmx SYSTEM "tmx14.dtd">
+<tmx version="1.4">
+	<header datatype="winres" segtype="sentence" adminlang="en-us"
+		srclang="en-us" o-tmf="abc" />
+	<body>
+
+		<tu tuid='template.common.current_time'>
+			<tuv xml:lang="en_US"><seg>Current Time</seg></tuv>
+		</tu>
+
+		<tu tuid='template.common.message_body'>
+			<tuv xml:lang="en_US"><seg>Message Body</seg></tuv>
+		</tu>
+
+		<tu tuid='template.common.reference_id'>
+			<tuv xml:lang="en_US"><seg>Reference ID</seg></tuv>
+		</tu>
+
+		<tu tuid='template.common.internal_id'>
+			<tuv xml:lang="en_US"><seg>Internal ID</seg></tuv>
+		</tu>
+
+		<tu tuid='template.common.'>
+			<tuv xml:lang="en_US"><seg></seg></tuv>
+		</tu>
+
+	</body>
+</tmx>
+<!-- 
+	
+-->
diff --git a/plugins/cerberusweb.timetracking/api/App.php b/plugins/cerberusweb.timetracking/api/App.php
index f0426aa..4805f4c 100644
--- a/plugins/cerberusweb.timetracking/api/App.php
+++ b/plugins/cerberusweb.timetracking/api/App.php
@@ -1,7 +1,7 @@
 <?php
-class ChCustomFieldSource_TimeEntry extends Extension_CustomFieldSource {
-	const ID = 'timetracking.fields.source.time_entry';
-};
+class ChCustomFieldSource_TimeEntry extends Extension_CustomFieldSource {
+	const ID = 'timetracking.fields.source.time_entry';
+};
 
 // Workspace Sources
 
@@ -238,12 +238,12 @@ class DAO_TimeTrackingEntry extends C4_ORMHelper {
 			return;
 		
 		$ids_list = implode(',', $ids);
-		
-		// Entries
+		
+		// Entries
 		$db->Execute(sprintf("DELETE FROM timetracking_entry WHERE id IN (%s)", $ids_list));
-		
-		// Custom fields
-		DAO_CustomFieldValue::deleteBySourceIds(ChCustomFieldSource_TimeEntry::ID, $ids);
+		
+		// Custom fields
+		DAO_CustomFieldValue::deleteBySourceIds(ChCustomFieldSource_TimeEntry::ID, $ids);
 		
 		return true;
 	}
@@ -260,12 +260,12 @@ class DAO_TimeTrackingEntry extends C4_ORMHelper {
      * @return array
      */
     static function search($columns, $params, $limit=10, $page=0, $sortBy=null, $sortAsc=null, $withCounts=true) {
-		$db = DevblocksPlatform::getDatabaseService();
-		$fields = SearchFields_TimeTrackingEntry::getFields();
-		
-		// Sanitize
-		if(!isset($fields[$sortBy]))
-			$sortBy=null;
+		$db = DevblocksPlatform::getDatabaseService();
+		$fields = SearchFields_TimeTrackingEntry::getFields();
+		
+		// Sanitize
+		if(!isset($fields[$sortBy]))
+			$sortBy=null;
 
         list($tables,$wheres) = parent::_parseSearchParams($params, $columns, $fields,$sortBy);
 		$start = ($page * $limit); // [JAS]: 1-based [TODO] clean up + document
@@ -300,7 +300,7 @@ class DAO_TimeTrackingEntry extends C4_ORMHelper {
 			// [JAS]: Dynamic table joins
 //			(isset($tables['o']) ? "LEFT JOIN contact_org o ON (o.id=tt.debit_org_id)" : " ").
 //			(isset($tables['mc']) ? "INNER JOIN message_content mc ON (mc.message_id=m.id)" : " ").
-
+
 		// Custom field joins
 		list($select_sql, $join_sql, $has_multiple_values) = self::_appendSelectJoinSqlForCustomFieldTables(
 			$tables,
@@ -314,7 +314,7 @@ class DAO_TimeTrackingEntry extends C4_ORMHelper {
 			(!empty($wheres) ? sprintf("WHERE %s ",implode(' AND ',$wheres)) : "");
 			
 		$sort_sql = (!empty($sortBy) ? sprintf("ORDER BY %s %s ",$sortBy,($sortAsc || is_null($sortAsc))?"ASC":"DESC") : " ");
-		
+		
 		$sql = 
 			$select_sql.
 			$join_sql.
@@ -339,12 +339,12 @@ class DAO_TimeTrackingEntry extends C4_ORMHelper {
 
 		// [JAS]: Count all
 		$total = -1;
-		if($withCounts) {
+		if($withCounts) {
 			$count_sql = 
 				($has_multiple_values ? "SELECT COUNT(DISTINCT tt.id) " : "SELECT COUNT(tt.id) ").
 				$join_sql.
 				$where_sql;
-			$total = $db->GetOne($count_sql);
+			$total = $db->GetOne($count_sql);
 		}
 		
 		return array($results,$total);
@@ -400,19 +400,19 @@ class SearchFields_TimeTrackingEntry {
 			self::SOURCE_ID => new DevblocksSearchField(self::SOURCE_ID, 'tt', 'source_id', null, $translate->_('timetracking_entry.source_id')),
 			
 			self::ORG_NAME => new DevblocksSearchField(self::ORG_NAME, 'o', 'name', null, $translate->_('contact_org.name')),
-		);
-		
-		// Custom Fields
-		$fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
-		if(is_array($fields))
-		foreach($fields as $field_id => $field) {
-			$key = 'cf_'.$field_id;
-			$columns[$key] = new DevblocksSearchField($key,$key,'field_value',null,$field->name);
-		}
+		);
+		
+		// Custom Fields
+		$fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
+		if(is_array($fields))
+		foreach($fields as $field_id => $field) {
+			$key = 'cf_'.$field_id;
+			$columns[$key] = new DevblocksSearchField($key,$key,'field_value',null,$field->name);
+		}
 		
 		// Sort by label (translation-conscious)
 		uasort($columns, create_function('$a, $b', "return strcasecmp(\$a->db_label,\$b->db_label);\n"));
-		
+		
 		return $columns;
 	}
 };
@@ -439,7 +439,7 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 	}
 
 	function getData() {
-		$objects = DAO_TimeTrackingEntry::search(
+		$objects = DAO_TimeTrackingEntry::search(
 			$this->view_columns,
 			$this->params,
 			$this->renderLimit,
@@ -450,8 +450,8 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 		return $objects;
 	}
 
-	function render() {
-		$this->_sanitize();
+	function render() {
+		$this->_sanitize();
 		
 		$tpl = DevblocksPlatform::getTemplateService();
 		$tpl->assign('id', $this->id);
@@ -465,10 +465,10 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 		
 		$sources = DAO_TimeTrackingEntry::getSources();
 		$tpl->assign('sources', $sources);		
-		
-		// Custom fields
-		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
-		$tpl->assign('custom_fields', $custom_fields);
+		
+		// Custom fields
+		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
+		$tpl->assign('custom_fields', $custom_fields);
 		
 		$tpl->cache_lifetime = "0";
 		$tpl->assign('view_fields', $this->getColumns());
@@ -478,7 +478,7 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 	function renderCriteria($field) {
 		$tpl = DevblocksPlatform::getTemplateService();
 		$tpl->assign('id', $this->id);
-
+
 		switch($field) {
 			case SearchFields_TimeTrackingEntry::NOTES:
 			case SearchFields_TimeTrackingEntry::ORG_NAME:
@@ -511,15 +511,15 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 				$tpl->assign('sources', $sources);
 				
 				$tpl->display('file:' . DEVBLOCKS_PLUGIN_PATH . 'cerberusweb.timetracking/templates/timetracking/criteria/source.tpl');
-				break;
-			default:
-				// Custom Fields
-				if('cf_' == substr($field,0,3)) {
-					$this->_renderCriteriaCustomField($tpl, substr($field,3));
-				} else {
-					echo ' ';
-				}
-				break;
+				break;
+			default:
+				// Custom Fields
+				if('cf_' == substr($field,0,3)) {
+					$this->_renderCriteriaCustomField($tpl, substr($field,3));
+				} else {
+					echo ' ';
+				}
+				break;
 		}
 	}
 
@@ -649,13 +649,13 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 			case SearchFields_TimeTrackingEntry::SOURCE_EXTENSION_ID:
 				@$source_ids = DevblocksPlatform::importGPC($_REQUEST['source_ids'],'array',array());
 				$criteria = new DevblocksSearchCriteria($field,$oper,$source_ids);
-				break;
-			default:
-				// Custom Fields
-				if(substr($field,0,3)=='cf_') {
-					$criteria = $this->_doSetCriteriaCustomField($field, substr($field,3));
-				}
-				break;
+				break;
+			default:
+				// Custom Fields
+				if(substr($field,0,3)=='cf_') {
+					$criteria = $this->_doSetCriteriaCustomField($field, substr($field,3));
+				}
+				break;
 		}
 
 		if(!empty($criteria)) {
@@ -663,67 +663,67 @@ class C4_TimeTrackingEntryView extends C4_AbstractView {
 			$this->renderPage = 0;
 		}
 	}
-
-	function doBulkUpdate($filter, $do, $ids=array()) {
-		@set_time_limit(0);
-	  
-		$change_fields = array();
-		$custom_fields = array();
-
-		// Make sure we have actions
-		if(empty($do))
-			return;
-
-		// Make sure we have checked items if we want a checked list
-		if(0 == strcasecmp($filter,"checks") && empty($ids))
-			return;
-			
-		if(is_array($do))
-		foreach($do as $k => $v) {
-			switch($k) {
-//				case 'xxxx':
-//					$change_fields[DAO_TimeTrackingEntry::XXX] = $v;
-//					break;
-				default:
-					// Custom fields
-					if(substr($k,0,3)=="cf_") {
-						$custom_fields[substr($k,3)] = $v;
-					}
-					break;
-			}
-		}
-
-		$pg = 0;
-
-		if(empty($ids))
-		do {
-			list($objects,$null) = DAO_TimeTrackingEntry::search(
-				array(),
-				$this->params,
-				100,
-				$pg++,
-				SearchFields_TimeTrackingEntry::ID,
-				true,
-				false
-			);
-			 
-			$ids = array_merge($ids, array_keys($objects));
-			 
-		} while(!empty($objects));
-
-		$batch_total = count($ids);
-		for($x=0;$x<=$batch_total;$x+=100) {
-			$batch_ids = array_slice($ids,$x,100);
-			DAO_TimeTrackingEntry::update($batch_ids, $change_fields);
-
-			// Custom Fields
-			self::_doBulkSetCustomFields(ChCustomFieldSource_TimeEntry::ID, $custom_fields, $batch_ids);
-			
-			unset($batch_ids);
-		}
-
-		unset($ids);
-	}	
+
+	function doBulkUpdate($filter, $do, $ids=array()) {
+		@set_time_limit(0);
+	  
+		$change_fields = array();
+		$custom_fields = array();
+
+		// Make sure we have actions
+		if(empty($do))
+			return;
+
+		// Make sure we have checked items if we want a checked list
+		if(0 == strcasecmp($filter,"checks") && empty($ids))
+			return;
+			
+		if(is_array($do))
+		foreach($do as $k => $v) {
+			switch($k) {
+//				case 'xxxx':
+//					$change_fields[DAO_TimeTrackingEntry::XXX] = $v;
+//					break;
+				default:
+					// Custom fields
+					if(substr($k,0,3)=="cf_") {
+						$custom_fields[substr($k,3)] = $v;
+					}
+					break;
+			}
+		}
+
+		$pg = 0;
+
+		if(empty($ids))
+		do {
+			list($objects,$null) = DAO_TimeTrackingEntry::search(
+				array(),
+				$this->params,
+				100,
+				$pg++,
+				SearchFields_TimeTrackingEntry::ID,
+				true,
+				false
+			);
+			 
+			$ids = array_merge($ids, array_keys($objects));
+			 
+		} while(!empty($objects));
+
+		$batch_total = count($ids);
+		for($x=0;$x<=$batch_total;$x+=100) {
+			$batch_ids = array_slice($ids,$x,100);
+			DAO_TimeTrackingEntry::update($batch_ids, $change_fields);
+
+			// Custom Fields
+			self::_doBulkSetCustomFields(ChCustomFieldSource_TimeEntry::ID, $custom_fields, $batch_ids);
+			
+			unset($batch_ids);
+		}
+
+		unset($ids);
+	}	
 	
 };
 
@@ -1055,17 +1055,17 @@ class ChTimeTrackingAjaxController extends DevblocksControllerExtension {
 		$tpl->assign('billable_activities', $billable_activities);
 		$nonbillable_activities = DAO_TimeTrackingActivity::getWhere(sprintf("%s=0",DAO_TimeTrackingActivity::RATE));
 		$tpl->assign('nonbillable_activities', $nonbillable_activities);
-		
-		// Custom fields
-		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID); 
-		$tpl->assign('custom_fields', $custom_fields);
-
-		$custom_field_values = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_TimeEntry::ID, $id);
-		if(isset($custom_field_values[$id]))
-			$tpl->assign('custom_field_values', $custom_field_values[$id]);
-		
-		$types = Model_CustomField::getTypes();
-		$tpl->assign('types', $types);
+		
+		// Custom fields
+		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID); 
+		$tpl->assign('custom_fields', $custom_fields);
+
+		$custom_field_values = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_TimeEntry::ID, $id);
+		if(isset($custom_field_values[$id]))
+			$tpl->assign('custom_field_values', $custom_field_values[$id]);
+		
+		$types = Model_CustomField::getTypes();
+		$tpl->assign('types', $types);
 		
 		$tpl->display('file:' . $tpl_path . 'timetracking/rpc/time_entry_panel.tpl');
 	}
@@ -1087,11 +1087,17 @@ class ChTimeTrackingAjaxController extends DevblocksControllerExtension {
 			
 		@$activity_id = DevblocksPlatform::importGPC($_POST['activity_id'],'integer',0);
 		@$time_actual_mins = DevblocksPlatform::importGPC($_POST['time_actual_mins'],'integer',0);
-		@$notes = DevblocksPlatform::importGPC($_POST['notes'],'string','');
+		@$notes_long = DevblocksPlatform::importGPC($_POST['notes'],'string','');
 		@$org_str = DevblocksPlatform::importGPC($_POST['org'],'string','');
 		@$source_extension_id = DevblocksPlatform::importGPC($_POST['source_extension_id'],'string','');
 		@$source_id = DevblocksPlatform::importGPC($_POST['source_id'],'integer',0);
 		
+		if (strlen($notes_long) > 255) {
+			@$notes=substr($notes_long,0,255);
+		} else {
+			@$notes=$notes_long;
+		}
+
 		// Translate org string into org id, if exists
 		$org_id = 0;
 		if(!empty($org_str)) {
@@ -1101,9 +1107,9 @@ class ChTimeTrackingAjaxController extends DevblocksControllerExtension {
 		// Delete entries
 		if(!empty($id) && !empty($do_delete)) {
 			if(null != ($entry = DAO_TimeTrackingEntry::get($id))) {
-				// Check privs
-				if(($active_worker->hasPriv('timetracking.actions.create') && $active_worker->id==$entry->worker_id)
-					|| $active_worker->hasPriv('timetracking.actions.update_all'))
+				// Check privs
+				if(($active_worker->hasPriv('timetracking.actions.create') && $active_worker->id==$entry->worker_id)
+					|| $active_worker->hasPriv('timetracking.actions.update_all'))
 						DAO_TimeTrackingEntry::delete($id);
 			}
 			
@@ -1126,122 +1132,167 @@ class ChTimeTrackingAjaxController extends DevblocksControllerExtension {
 			$fields[DAO_TimeTrackingEntry::WORKER_ID] = intval($active_worker->id);
 		}
 		
-		if(empty($id)) { // create
-			$id = DAO_TimeTrackingEntry::create($fields);
-			
-			// Procedurally create a comment
-			$translate = DevblocksPlatform::getTranslationService();
-			switch($source_extension_id) {
-				// If ticket, add a comment about the timeslip to the ticket
-				case 'timetracking.source.ticket':
-					$ticket_id = intval($source_id);
-					
-					if(null != ($worker_address = DAO_Address::lookupAddress($active_worker->email, false))) {
-						if(!empty($activity_id)) {
-							$activity = DAO_TimeTrackingActivity::get($activity_id);
-						}
-						
-						if(!empty($org_id))
-							$org = DAO_ContactOrg::get($org_id);
-						
-						$comment = sprintf(
-							"== %s ==\n".
-							"%s %s\n".
-							"%s %d\n".
-							"%s %s (%s)\n".
-							"%s %s\n".
-							"%s %s\n",
-							$translate->_('timetracking.ui.timetracking'),
-							$translate->_('timetracking.ui.worker'),
-							$active_worker->getName(),
-							$translate->_('timetracking.ui.comment.time_spent'),
-							$time_actual_mins,
-							$translate->_('timetracking.ui.comment.activity'),
-							(!empty($activity) ? $activity->name : ''),
-							((!empty($activity) && $activity->rate > 0.00) ? $translate->_('timetracking.ui.billable') : $translate->_('timetracking.ui.non_billable')),
-							$translate->_('timetracking.ui.comment.organization'),
-							(!empty($org) ? $org->name : $translate->_('timetracking.ui.comment.not_set')),
-							$translate->_('timetracking.ui.comment.notes'),
-							$notes
-						);
-						//timetracking.ui.billable timetracking.ui.non_billable
-						$fields = array(
-							DAO_TicketComment::ADDRESS_ID => intval($worker_address->id),
-							DAO_TicketComment::COMMENT => $comment,
-							DAO_TicketComment::CREATED => time(),
-							DAO_TicketComment::TICKET_ID => intval($ticket_id),
-						);
-						DAO_TicketComment::create($fields);
-					}
-					break;
-			}
+		if(empty($id)) { // create
+			$id = DAO_TimeTrackingEntry::create($fields);
+			
+			// Procedurally create a comment
+			$translate = DevblocksPlatform::getTranslationService();
+			switch($source_extension_id) {
+				// If ticket, add a comment about the timeslip to the ticket
+				case 'timetracking.source.ticket':
+					$ticket_id = intval($source_id);
+					
+					if(null != ($worker_address = DAO_Address::lookupAddress($active_worker->email, false))) {
+						if(!empty($activity_id)) {
+							$activity = DAO_TimeTrackingActivity::get($activity_id);
+						}
+						
+						if(!empty($org_id))
+							$org = DAO_ContactOrg::get($org_id);
+						
+						$comment = sprintf(
+							"== %s ==\n".
+							"%s %s\n".
+							"%s %d\n".
+							"%s %s (%s)\n".
+							"%s %s\n".
+							"%s %s\n",
+							$translate->_('timetracking.ui.timetracking'),
+							$translate->_('timetracking.ui.worker'),
+							$active_worker->getName(),
+							$translate->_('timetracking.ui.comment.time_spent'),
+							$time_actual_mins,
+							$translate->_('timetracking.ui.comment.activity'),
+							(!empty($activity) ? $activity->name : ''),
+							((!empty($activity) && $activity->rate > 0.00) ? $translate->_('timetracking.ui.billable') : $translate->_('timetracking.ui.non_billable')),
+							$translate->_('timetracking.ui.comment.organization'),
+							(!empty($org) ? $org->name : $translate->_('timetracking.ui.comment.not_set')),
+							$translate->_('timetracking.ui.comment.notes'),
+							$notes
+						);
+						//timetracking.ui.billable timetracking.ui.non_billable
+						$fields = array(
+							DAO_TicketComment::ADDRESS_ID => intval($worker_address->id),
+							DAO_TicketComment::COMMENT => $comment,
+							DAO_TicketComment::CREATED => time(),
+							DAO_TicketComment::TICKET_ID => intval($ticket_id),
+						);
+						DAO_TicketComment::create($fields);
+					}
+					break;
+			}
 			
 		} else { // modify
 			DAO_TimeTrackingEntry::update($id, $fields);
 		}
-		
-		// Custom field saves
-		@$field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array());
-		DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_TimeEntry::ID, $id, $field_ids);
+		
+		// Custom field saves
+		@$field_ids = DevblocksPlatform::importGPC($_POST['field_ids'], 'array', array());
+		DAO_CustomFieldValue::handleFormPost(ChCustomFieldSource_TimeEntry::ID, $id, $field_ids);
 	}
 	
 	function clearEntryAction() {
 		$this->_destroyTimer();
-	}
-	
-	function showBulkPanelAction() {
-		@$id_csv = DevblocksPlatform::importGPC($_REQUEST['ids']);
-		@$view_id = DevblocksPlatform::importGPC($_REQUEST['view_id']);
-
-		$tpl = DevblocksPlatform::getTemplateService();
-		$path = dirname(dirname(__FILE__)) . '/templates/';
-		$tpl->assign('path', $path);
-		$tpl->assign('view_id', $view_id);
-
-	    if(!empty($id_csv)) {
-	        $ids = DevblocksPlatform::parseCsvString($id_csv);
-	        $tpl->assign('ids', implode(',', $ids));
-	    }
-		
-		// Custom Fields
-		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
-		$tpl->assign('custom_fields', $custom_fields);
-		
-		$tpl->cache_lifetime = "0";
-		$tpl->display('file:' . $path . 'timetracking/time/bulk.tpl');
-	}
-	
-	function doBulkUpdateAction() {
-		// Checked rows
-	    @$ids_str = DevblocksPlatform::importGPC($_REQUEST['ids'],'string');
-		$ids = DevblocksPlatform::parseCsvString($ids_str);
-
-		// Filter: whole list or check
-	    @$filter = DevblocksPlatform::importGPC($_REQUEST['filter'],'string','');
-	    
-	    // View
-		@$view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'],'string');
-		$view = C4_AbstractViewLoader::getView($view_id);
-		
-		// Time Tracking fields
-//		@$list_id = trim(DevblocksPlatform::importGPC($_POST['list_id'],'integer',0));
-
-		$do = array();
-		
-		// Do: ...
-//		if(0 != strlen($list_id))
-//			$do['list_id'] = $list_id;
-			
-		// Do: Custom fields
-		$do = DAO_CustomFieldValue::handleBulkPost($do);
-			
-		$view->doBulkUpdate($filter, $do, $ids);
-		
-		$view->render();
-		return;
-	}
-	
+	}
+	
+	function showBulkPanelAction() {
+		@$id_csv = DevblocksPlatform::importGPC($_REQUEST['ids']);
+		@$view_id = DevblocksPlatform::importGPC($_REQUEST['view_id']);
+
+		$tpl = DevblocksPlatform::getTemplateService();
+		$path = dirname(dirname(__FILE__)) . '/templates/';
+		$tpl->assign('path', $path);
+		$tpl->assign('view_id', $view_id);
+
+	    if(!empty($id_csv)) {
+	        $ids = DevblocksPlatform::parseCsvString($id_csv);
+	        $tpl->assign('ids', implode(',', $ids));
+	    }
+		
+		// Custom Fields
+		$custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
+		$tpl->assign('custom_fields', $custom_fields);
+		
+		$tpl->cache_lifetime = "0";
+		$tpl->display('file:' . $path . 'timetracking/time/bulk.tpl');
+	}
+	
+	function doBulkUpdateAction() {
+		// Checked rows
+	    @$ids_str = DevblocksPlatform::importGPC($_REQUEST['ids'],'string');
+		$ids = DevblocksPlatform::parseCsvString($ids_str);
+
+		// Filter: whole list or check
+	    @$filter = DevblocksPlatform::importGPC($_REQUEST['filter'],'string','');
+	    
+	    // View
+		@$view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'],'string');
+		$view = C4_AbstractViewLoader::getView($view_id);
+		
+		// Time Tracking fields
+//		@$list_id = trim(DevblocksPlatform::importGPC($_POST['list_id'],'integer',0));
+
+		$do = array();
+		
+		// Do: ...
+//		if(0 != strlen($list_id))
+//			$do['list_id'] = $list_id;
+			
+		// Do: Custom fields
+		$do = DAO_CustomFieldValue::handleBulkPost($do);
+			
+		$view->doBulkUpdate($filter, $do, $ids);
+		
+		$view->render();
+		return;
+	}
+	
+};
+
+if (class_exists('Extension_AutoReplyClose')):
+class ChTimeTrackingAutoReplyClose extends Extension_AutoReplyClose {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+
+  function run(CerberusTicket $ticket, $properties) {
+    $content = $properties['content'];
+		$total_time_all = 0;
+
+    // Adds total time worked per ticket to the token list.
+    $db = DevblocksPlatform::getDatabaseService();
+
+    $sql = "SELECT sum(tte.time_actual_mins) mins ";
+    $sql .= "FROM timetracking_entry tte ";
+    $sql .= sprintf("WHERE tte.source_id =  %d ", $ticket->id);
+    $sql .= "AND tte.source_extension_id = 'timetracking.source.ticket' ";
+    $sql .= "GROUP BY tte.source_id ";
+
+    $rs = $db->Execute($sql);
+
+		if(is_a($rs,'ADORecordSet')) {
+      $total_time_all = intval($rs->fields['mins']);
+    }
+
+		$properties['content'] = str_replace(
+      array('#time_tracker_total_min#'),
+      array($total_time_all),
+      $content
+    );
+  }
+  
+  function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+    $list['TimeTracker'] = 
+			array(
+				'#time_tracker_total_min#' => $translate->_('timetracking.ui.template.total.time.all.min')
+			);
+    return;
+  }
 };
+endif;
+
 
 if (class_exists('Extension_ActivityTab')):
 class TimeTrackingActivityTab extends Extension_ActivityTab {
@@ -1305,11 +1356,11 @@ class ChTimeTrackingConfigActivityTab extends Extension_ConfigTab {
 		@$name = DevblocksPlatform::importGPC($_REQUEST['name'],'string','');
 		@$rate = floatval(DevblocksPlatform::importGPC($_REQUEST['rate'],'string',''));
 		@$do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'],'integer',0);
-
-		if(DEMO_MODE) {
-			DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config','timetracking.activities')));
-			return;
-		}		
+
+		if(DEMO_MODE) {
+			DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config','timetracking.activities')));
+			return;
+		}		
 
 		if(empty($id)) { // Add
 			$fields = array(
diff --git a/plugins/cerberusweb.timetracking/plugin.xml b/plugins/cerberusweb.timetracking/plugin.xml
index 41dd228..76fd192 100644
--- a/plugins/cerberusweb.timetracking/plugin.xml
+++ b/plugins/cerberusweb.timetracking/plugin.xml
@@ -1,11 +1,11 @@
 <!DOCTYPE plugin SYSTEM "../../libs/devblocks/plugin.dtd">
 <plugin>
-	<id>cerberusweb.timetracking</id>
+	<id>cerberusweb.timetracking</id>
 	<name>[Cerb4] Time Tracking</name>
-	<description>Track time spent on various helpdesk activities (replying to tickets, etc).  This adds a Track Time button to Display Ticket and Organizations, and a Time Tracking tab to the Activity page.</description>
+	<description>Track time spent on various helpdesk activities (replying to tickets, etc).  This adds a Track Time button to Display Ticket and Organizations, and a Time Tracking tab to the Activity page.</description>
 	<author>WebGroup Media, LLC.</author>
 	<revision>0</revision>
-	<link>http://wiki.cerb4.com/wiki/</link>
+	<link>http://wiki.cerb4.com/wiki/</link>
 	
 	<!-- Exported Classes -->
 	
@@ -14,15 +14,15 @@
 			<class name="C4_TimeTrackingEntryView" />
 		</file>
 	</class_loader>
-	
-	<acl>
-		<priv id="timetracking.actions.create" label="acl.timetracking.actions.create" />
-		<priv id="timetracking.actions.update_all" label="acl.timetracking.actions.update_all" />
-		<priv id="timetracking.report.group.time" label="acl.timetracking.report.group.time" />
-		<priv id="timetracking.view.actions.export" label="acl.timetracking.view.actions.export" />
-	</acl>
-	
-	<extensions>
+	
+	<acl>
+		<priv id="timetracking.actions.create" label="acl.timetracking.actions.create" />
+		<priv id="timetracking.actions.update_all" label="acl.timetracking.actions.update_all" />
+		<priv id="timetracking.report.group.time" label="acl.timetracking.report.group.time" />
+		<priv id="timetracking.view.actions.export" label="acl.timetracking.view.actions.export" />
+	</acl>
+	
+	<extensions>
 	
 		<!-- Patch Containers -->
 		
@@ -49,21 +49,21 @@
 			<params>
 			</params>
 		</extension>
-	
-		<!-- Http Listeners -->
+	
+		<!-- Http Listeners -->
 		
-		<!-- 
-		<extension point="devblocks.listener.http">
-			<id>simulator.listeners.tour</id>
-			<name>Simulator Tour</name>
-			<class>
-				<file>listeners.classes.php</file>
-				<name>ChSimulatorTour</name>
-			</class>
-			<params>
-			</params>
+		<!-- 
+		<extension point="devblocks.listener.http">
+			<id>simulator.listeners.tour</id>
+			<name>Simulator Tour</name>
+			<class>
+				<file>listeners.classes.php</file>
+				<name>ChSimulatorTour</name>
+			</class>
+			<params>
+			</params>
 		</extension>
-		 -->
+		 -->
 	
 		<!-- Event Listeners -->
 
@@ -122,7 +122,7 @@
 			<params>
 			</params>
 		</extension>
-	
+	
 		<!-- Ticket Display Toolbar -->	
 		
 		<extension point="cerberusweb.ticket.toolbaritem">
@@ -135,7 +135,7 @@
 			<params>
 			</params>
 		</extension>
-	
+	
 		<!-- Ticket Reply Toolbar -->
 			
 		<extension point="cerberusweb.reply.toolbaritem">
@@ -191,7 +191,7 @@
 				<param key="title" value="timetracking.activity.tab" />
 			</params>
 		</extension>
-	
+	
 		<!-- Config Tabs -->
 		
 		<extension point="cerberusweb.config.tab">
@@ -220,20 +220,31 @@
 				<param key="uri" value="timetracking" />
 			</params>
 		</extension>
-		 
-		<!-- Custom Field Source -->
-		 
-		<extension point="cerberusweb.fields.source">
-			<id>timetracking.fields.source.time_entry</id>
-			<name>Time Tracking</name>
-			<class>
-				<file>api/App.php</file>
-				<name>ChCustomFieldSource_TimeEntry</name>
-			</class>
-			<params>
-			</params>
-		</extension>
 		 
+		<!-- Custom Field Source -->
+		 
+		<extension point="cerberusweb.fields.source">
+			<id>timetracking.fields.source.time_entry</id>
+			<name>Time Tracking</name>
+			<class>
+				<file>api/App.php</file>
+				<name>ChCustomFieldSource_TimeEntry</name>
+			</class>
+			<params>
+			</params>
+		</extension>
+		 
+		<extension point="cerberusweb.auto_reply.close">
+			<id>timetracking.auto_reply.close</id>
+			<name>Time Tracking Email Auto Close Templates</name>
+			<class>
+				<file>api/App.php</file>
+				<name>ChTimeTrackingAutoReplyClose</name>
+			</class>
+			<params>
+			</params>
+		</extension>
+
 		<!-- Tabs -->
 		 
 		<!--
@@ -306,6 +317,6 @@
 			<param key="report_group" value="report.group.timetracking" />
 		</params>
 	</extension>
-	
-	</extensions>
+	
+	</extensions>
 </plugin>
\ No newline at end of file
diff --git a/plugins/cerberusweb.timetracking/strings.xml b/plugins/cerberusweb.timetracking/strings.xml
index d34447c..525d1ce 100644
--- a/plugins/cerberusweb.timetracking/strings.xml
+++ b/plugins/cerberusweb.timetracking/strings.xml
@@ -13,21 +13,21 @@
 		<tu tuid='timetracking.ui.button.track'>
 			<tuv xml:lang="en_US"><seg>Track Time</seg></tuv>
 		</tu>
-		
-		<!-- ACL -->
-		
-		<tu tuid='acl.timetracking.actions.create'>
-			<tuv xml:lang="en_US"><seg>[Time Tracking] Can track time</seg></tuv>
-		</tu>
-		<tu tuid='acl.timetracking.actions.update_all'>
-			<tuv xml:lang="en_US"><seg>[Time Tracking] Can manage everyone's time slips</seg></tuv>
-		</tu>
-		<tu tuid='acl.timetracking.report.group.time'>
-			<tuv xml:lang="en_US"><seg>[Report Group] Can view the 'Time Tracking Reports' group</seg></tuv>
-		</tu>
-		<tu tuid='acl.timetracking.view.actions.export'>
-			<tuv xml:lang="en_US"><seg>[Time Tracking] Can export time tracking lists to CSV/XML</seg></tuv>
-		</tu>
+		
+		<!-- ACL -->
+		
+		<tu tuid='acl.timetracking.actions.create'>
+			<tuv xml:lang="en_US"><seg>[Time Tracking] Can track time</seg></tuv>
+		</tu>
+		<tu tuid='acl.timetracking.actions.update_all'>
+			<tuv xml:lang="en_US"><seg>[Time Tracking] Can manage everyone's time slips</seg></tuv>
+		</tu>
+		<tu tuid='acl.timetracking.report.group.time'>
+			<tuv xml:lang="en_US"><seg>[Report Group] Can view the 'Time Tracking Reports' group</seg></tuv>
+		</tu>
+		<tu tuid='acl.timetracking.view.actions.export'>
+			<tuv xml:lang="en_US"><seg>[Time Tracking] Can export time tracking lists to CSV/XML</seg></tuv>
+		</tu>
 		
 		<!-- Common  -->
 
@@ -92,7 +92,7 @@
 			<tuv xml:lang="en_US"><seg>Note:</seg></tuv>
 		</tu>
 		<tu tuid='timetracking.ui.entry_panel.note_hint'>
-			<tuv xml:lang="en_US"><seg>(description of work performed)</seg></tuv>
+			<tuv xml:lang="en_US"><seg>(description of work performed) (255 Character Limit)</seg></tuv>
 		</tu>
 		<tu tuid='timetracking.ui.entry_panel.reference'>
 			<tuv xml:lang="en_US"><seg>Reference:</seg></tuv>
@@ -187,6 +187,16 @@
 			<tuv xml:lang="en_US"><seg>(e.g. 65.00)</seg></tuv>
 		</tu>
 		
+		<!--  Template Groups -->
+
+		<tu tuid='timetracking.ui.template.total.time.worker'>
+			<tuv xml:lang="en_US"><seg>Total time tracked for worker</seg></tuv>
+		</tu>
+
+		<tu tuid='timetracking.ui.template.total.time.all.min'>
+			<tuv xml:lang="en_US"><seg>Total time tracked in min</seg></tuv>
+		</tu>
+
 		<!--  Report Groups -->
 
 		<tu tuid='timetracking.ui.reports'>
diff --git a/plugins/cerberusweb.timetracking/templates/timetracking/rpc/time_entry_panel.tpl b/plugins/cerberusweb.timetracking/templates/timetracking/rpc/time_entry_panel.tpl
index f5903ca..8b2cbb7 100644
--- a/plugins/cerberusweb.timetracking/templates/timetracking/rpc/time_entry_panel.tpl
+++ b/plugins/cerberusweb.timetracking/templates/timetracking/rpc/time_entry_panel.tpl
@@ -5,8 +5,8 @@
 <input type="hidden" name="do_delete" value="0">
 
 <h1>{$translate->_('timetracking.ui.timetracking')}</h1>
-
-<div style="height:350px;overflow:auto;margin:2px;padding:3px;">
+
+<div style="height:350px;overflow:auto;margin:2px;padding:3px;">
 
 <table cellpadding="2" cellspacing="0" width="100%">
 	<tr>
@@ -38,7 +38,8 @@
 <br>
 
 <b>{$translate->_('timetracking.ui.entry_panel.note')}</b> {$translate->_('timetracking.ui.entry_panel.note_hint')}<br>
-<input type="text" name="notes" size="45" maxlength="255" style="width:98%;" value="{$model->notes|escape}"><br>
+<TEXTAREA name="notes" ROWS=4 style="width:98%;" >{$model->notes|escape}</TEXTAREA>
+<br>
 <br>
 
 <b>{$translate->_('timetracking.ui.entry_panel.debit_time_client')}</b> {$translate->_('timetracking.ui.entry_panel.debit_time_client_hint')}<br>
@@ -47,10 +48,10 @@
 	<div id="contactcontainer" class="yui-ac-container"></div>
 	<br>
 </div>
-<br>
-
-{include file="file:$core_tpl/internal/custom_fields/bulk/form.tpl" bulk=false}
-<br>
+<br>
+
+{include file="file:$core_tpl/internal/custom_fields/bulk/form.tpl" bulk=false}
+<br>
 
 {if !empty($source)}
 <b>{$translate->_('timetracking.ui.entry_panel.reference')}</b><br>
@@ -59,12 +60,12 @@
 <a href="{$source->getLink($model->source_id)}" target="_blank">{$source->getLinkText($model->source_id)}</a><br>
 <br>
 {/if}
-
-</div>
-
-{if ($active_worker->hasPriv('timetracking.actions.create') && (empty($model->id) || $active_worker->id==$model->worker_id))
-	|| $active_worker->hasPriv('timetracking.actions.update_all')
-	}
+
+</div>
+
+{if ($active_worker->hasPriv('timetracking.actions.create') && (empty($model->id) || $active_worker->id==$model->worker_id))
+	|| $active_worker->hasPriv('timetracking.actions.update_all')
+	}
 	{if empty($model->id)}
 		<button type="button" onclick="genericAjaxPost('frmTimeEntry','','c=timetracking&a=saveEntry',{literal}function(o){timeTrackingTimer.finish();}{/literal});"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/check.gif{/devblocks_url}" align="top"> {$translate->_('timetracking.ui.entry_panel.save_finish')}</button>
 		<button type="button" onclick="timeTrackingTimer.play();genericPanel.hide();"><img src="{devblocks_url}c=resource&p=cerberusweb.timetracking&f=images/16x16/media_play_green.png{/devblocks_url}" align="top"> {$translate->_('timetracking.ui.entry_panel.resume')}</button>
@@ -73,8 +74,8 @@
 		<button type="button" onclick="genericAjaxPost('frmTimeEntry','','c=timetracking&a=saveEntry');genericPanel.hide();"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/check.gif{/devblocks_url}" align="top"> {$translate->_('common.save_changes')|capitalize}</button>
 		<button type="button" onclick="if(confirm('Permanently delete this time tracking entry?')){literal}{{/literal}this.form.do_delete.value='1';genericAjaxPost('frmTimeEntry','','c=timetracking&a=saveEntry');genericPanel.hide();{literal}}{/literal}"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/document_delete.gif{/devblocks_url}" align="top"> {$translate->_('common.delete')|capitalize}</button>
 		<button type="button" onclick="genericPanel.hide();"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/delete.gif{/devblocks_url}" align="top"> {$translate->_('common.cancel')|capitalize}</button>
-	{/if}
-{else}
-	<div class="error">You do not have permission to modify this record.</div>
+	{/if}
+{else}
+	<div class="error">You do not have permission to modify this record.</div>
 {/if}
 </form>
\ No newline at end of file

