diff --git a/api/Extension.class.php b/api/Extension.class.php
index 7db5889..1a58b37 100644
--- a/api/Extension.class.php
+++ b/api/Extension.class.php
@@ -292,6 +292,42 @@ abstract class Extension_LoginAuthenticator extends DevblocksExtension {
 	}
 };
 
+abstract class Extension_EmailSignatureTemplate extends DevblocksExtension {
+  function __construct($manifest) {
+    $this->DevblocksExtension($manifest,1);
+  }
+	// Ticket_id can be zero for Create / Compose
+  function run($ticket_id, $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..6a4eeb2 100644
--- a/api/Model.class.php
+++ b/api/Model.class.php
@@ -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;
+		$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 str_replace($replace, $with, $raw);
+		return $raw;
 	}
 };
 
diff --git a/api/app/Parser.php b/api/app/Parser.php
index 936c7b0..54016ca 100644
--- a/api/app/Parser.php
+++ b/api/app/Parser.php
@@ -771,19 +771,28 @@ class CerberusParser {
 				&& !empty($autoreply) 
 				&& $enumSpamTraining != CerberusTicketSpamTraining::SPAM
 				) {
-					CerberusMail::sendTicketMessage(array(
+					$properties = 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
-					));
-			}
-			
+						'content' => $autoreply,
+						'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
 		
 		unset($message);
diff --git a/plugins/cerberusweb.core/api/listeners.classes.php b/plugins/cerberusweb.core/api/listeners.classes.php
index 5f9039e..031354a 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(
+					$properties = 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]
-						),
+						'content' => $group_settings[$ticket->team_id][DAO_GroupSettings::SETTING_CLOSE_REPLY],
 						'is_autoreply' => false,
-						'dont_keep_copy' => true
-					));
+						'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..1fbac31 100644
--- a/plugins/cerberusweb.core/api/uri/config.php
+++ b/plugins/cerberusweb.core/api/uri/config.php
@@ -599,6 +599,19 @@ class ChConfigurationPage extends CerberusPageExtension  {
 		$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');
 	}
 	
diff --git a/plugins/cerberusweb.core/api/uri/display.php b/plugins/cerberusweb.core/api/uri/display.php
index e116256..be5ab42 100644
--- a/plugins/cerberusweb.core/api/uri/display.php
+++ b/plugins/cerberusweb.core/api/uri/display.php
@@ -583,11 +583,17 @@ 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($ticket->id, &$signature);
+						} catch(Exception $e) {
+							// print_r($e);
+						}
+					}
+				}
+			$tpl->assign('signature', $signature);
 			
 		    $signature_pos = $settings->get(CerberusSettings::DEFAULT_SIGNATURE_POS,0);
 			$tpl->assign('signature_pos', $signature_pos);
@@ -1259,6 +1265,19 @@ class ChDisplayPage extends CerberusPageExtension {
 		
 		$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');
 	}
diff --git a/plugins/cerberusweb.core/api/uri/groups.php b/plugins/cerberusweb.core/api/uri/groups.php
index 7db9274..bc8ed23 100644
--- a/plugins/cerberusweb.core/api/uri/groups.php
+++ b/plugins/cerberusweb.core/api/uri/groups.php
@@ -71,6 +71,45 @@ class ChGroupsPage extends CerberusPageExtension  {
 			$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);
 	    
diff --git a/plugins/cerberusweb.core/api/uri/tickets.php b/plugins/cerberusweb.core/api/uri/tickets.php
index 8a363ff..f34b8f3 100644
--- a/plugins/cerberusweb.core/api/uri/tickets.php
+++ b/plugins/cerberusweb.core/api/uri/tickets.php
@@ -825,29 +825,27 @@ class ChTicketsPage extends CerberusPageExtension {
 	
 	function getComposeSignatureAction() {
 		@$group_id = DevblocksPlatform::importGPC($_REQUEST['group_id'],'integer',0);
-		
+		@$ticket_id = DevblocksPlatform::importGPC($_REQUEST['ticket_id'],'integer',0);
 		$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($ticket_id, &$sig);
+				} catch(Exception $e) {
+					// print_r($e);
+				}
+			}
+		}
+		echo sprintf("\r\n%s\r\n", $sig);
 	}
 	
 	// Ajax
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..1fd67eb 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>
 					
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..d11cefb 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,29 +34,8 @@
 <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>
 <br>
 
diff --git a/plugins/cerberusweb.core/templates/display/rpc/reply.tpl b/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
index 4d0058e..0886682 100644
--- a/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
+++ b/plugins/cerberusweb.core/templates/display/rpc/reply.tpl
@@ -66,7 +66,7 @@
 			{assign var=ticket_team_id value=$ticket->team_id}
 			{assign var=headers value=$message->getHeaders()}
 			<button type="button" onclick="genericAjaxPanel('c=display&a=showTemplatesPanel&type=2&reply_id={$message->id}&txt_name=reply_{$message->id}',this,false,'550px');"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/text_rich.gif{/devblocks_url}" align="top"> {$translate->_('display.reply.email_templates')|capitalize}</button>
-			<button type="button" onclick="genericAjaxGet('','c=tickets&a=getComposeSignature&group_id={$ticket->team_id}',{literal}function(o){insertAtCursor(document.getElementById('reply_{/literal}{$message->id}{literal}'),o.responseText);document.getElementById('reply_{/literal}{$message->id}{literal}').focus();}{/literal});"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/document_edit.gif{/devblocks_url}" align="top"> {$translate->_('display.reply.insert_sig')|capitalize}</button>
+			<button type="button" onclick="genericAjaxGet('','c=tickets&a=getComposeSignature&group_id={$ticket->team_id}&ticket_id={$ticket->id}',{literal}function(o){insertAtCursor(document.getElementById('reply_{/literal}{$message->id}{literal}'),o.responseText);document.getElementById('reply_{/literal}{$message->id}{literal}').focus();}{/literal});"><img src="{devblocks_url}c=resource&p=cerberusweb.core&f=images/document_edit.gif{/devblocks_url}" align="top"> {$translate->_('display.reply.insert_sig')|capitalize}</button>
 			{* Plugin Toolbar *}
 			{if !empty($reply_toolbaritems)}
 				{foreach from=$reply_toolbaritems item=renderer}
diff --git a/plugins/cerberusweb.core/templates/groups/manage/index.tpl b/plugins/cerberusweb.core/templates/groups/manage/index.tpl
index e30a3ae..0239149 100644
--- a/plugins/cerberusweb.core/templates/groups/manage/index.tpl
+++ b/plugins/cerberusweb.core/templates/groups/manage/index.tpl
@@ -58,14 +58,7 @@
 	</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>
-			</optgroup>
-		</select>
+		{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();"} 
 		
 		{if !empty($default_signature)}
 		<button type="button" onclick="this.form.signature.value=this.form.default_signature.value;">set to default</button>
@@ -82,28 +75,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,24 +87,8 @@
 		<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>
diff --git a/plugins/cerberusweb.templates/api/App.php b/plugins/cerberusweb.templates/api/App.php
new file mode 100644
index 0000000..559692b
--- /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($ticket_id, $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..571e371 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');
 	}
@@ -1101,9 +1101,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,123 +1126,235 @@ 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_EmailSignatureTemplate')):
+class ChTimeTrackingEmailSignatureTemplate extends Extension_EmailSignatureTemplate {
+	function __construct($manifest) {
+		$this->DevblocksExtension($manifest,1);
+	}
+
+  function run($ticket_id, $signature) {
+    $active_worker = CerberusApplication::getActiveWorker();
+		$total_time_all = 0;
+		$total_time_worker_all = 0;
+
+		if($ticket_id==0) {
+	    $signature = str_replace(
+				array('#time_tracker_min_total#','#time_tracker_worker_min_total#'),
+				array(0, 0),
+				$signature
+			);
+			return;
+		}
+
+		// 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']);
+		}
+
+		$sql = "SELECT sum(tte.time_actual_mins) mins ";
+		$sql .= "FROM timetracking_entry tte ";
+		$sql .= sprintf("WHERE tte.source_id =  %d ", $ticket_id);
+		$sql .= sprintf("AND tte.worker_id =  %d ", $active_worker->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_worker_all = intval($rs->fields['mins']);
+		}
+		
+    $signature = str_replace(
+			array('#time_tracker_min_total#','#time_tracker_worker_min_total#'),
+			array($total_time_all, $total_time_worker_all),
+			$signature
+		);
+	}
+  
+	function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+		$list['TimeTracker'] = 
+			array(
+				'#time_tracker_min_total#' => $translate->_('timetracking.ui.template.total.time.all.min'),
+				'#time_tracker_worker_min_total#' => $translate->_('timetracking.ui.template.total.time.all.min.worker')
+			);
+		return;
+	}
+};
+endif;
+
+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_min_total#'),
+			array($total_time_all),
+			$content
+		);
+	}
+  
+	function render($list) {
+		$translate = DevblocksPlatform::getTranslationService();
+		
+		$list['TimeTracker'] = 
+			array(
+				'#time_tracker_min_total#' => $translate->_('timetracking.ui.template.total.time.all.min')
+			);
+		return;
+	}
+};
+endif;
+
 if (class_exists('Extension_ActivityTab')):
 class TimeTrackingActivityTab extends Extension_ActivityTab {
 	const VIEW_ACTIVITY_TIMETRACKING = 'activity_timetracking';
@@ -1305,11 +1417,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..620b658 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,44 @@
 				<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>
+		 
+		<!-- Signture Template -->
+		<extension point="cerberusweb.email_signature.template">
+			<id>timetracking.templates.email_signature</id>
+			<name>Timetracking Email Signature Templates</name>
+			<class>
+				<file>api/App.php</file>
+				<name>ChTimeTrackingEmailSignatureTemplate</name>
+			</class>
+			<params>
+			</params>
+		</extension>
+		
+		<!-- Auto Close Template -->
+		<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 +330,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..ae3cc7b 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  -->
 
@@ -187,6 +187,20 @@
 			<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>
+
+		<tu tuid='timetracking.ui.template.total.time.all.min.worker'>
+			<tuv xml:lang="en_US"><seg>Total time tracked for worker in min</seg></tuv>
+		</tu>
+
 		<!--  Report Groups -->
 
 		<tu tuid='timetracking.ui.reports'>

