diff --git a/api/api.inc.php b/api/api.inc.php
index d209860d5c60bff7d55c3032144ea675b4de6767..926a0e2a9ddb4b0464c5f1385e56665312339d8e 100644
--- a/api/api.inc.php
+++ b/api/api.inc.php
@@ -36,13 +36,13 @@ define('OSTAPIINC',TRUE); // Define tag that included files can check
 $remotehost=(isset($_SERVER['HTTP_HOST']) || isset($_SERVER['REMOTE_ADDR']))?TRUE:FALSE;
 /* API exit helper */
 function api_exit($code,$msg='') {
-    global $remotehost,$cfg;
+    global $remotehost, $ost;
     
     if($code!=EX_SUCCESS) {
         //Error occured...
         $_SESSION['api']['errors']+=1;
         $_SESSION['api']['time']=time();
-        Sys::log(LOG_WARNING,"API error - code #$code",$msg);
+        $ost->logWarning("API error - code #$code",$msg);
         //echo "API Error:.$msg";
     }
     if($remotehost){
diff --git a/api/cron.php b/api/cron.php
index 86de02cdb6e32a4f3f61e5fc87a2567133694f82..a8874e3b7eb45eb246145e756db8f85c91c1e47a 100644
--- a/api/cron.php
+++ b/api/cron.php
@@ -17,5 +17,5 @@
 require('api.inc.php');
 require_once(INCLUDE_DIR.'class.cron.php');
 Cron::run();
-Sys::log(LOG_DEBUG,'Cron Job','External cron job executed ['.$_SERVER['REMOTE_ADDR'].']');
+$ost->logDebug('Cron Job','External cron job executed ['.$_SERVER['REMOTE_ADDR'].']');
 ?>
diff --git a/client.inc.php b/client.inc.php
index 3b450e9e2491653ec44c65f346ef79758cc1d1a8..1908eaa1b5d5172fffaccfbee69f6f17e4871d1e 100644
--- a/client.inc.php
+++ b/client.inc.php
@@ -29,7 +29,7 @@ define('OSTCLIENTINC',TRUE);
 define('ASSETS_PATH',ROOT_PATH.'assets/default/');
 
 //Check the status of the HelpDesk.
-if(!is_object($cfg) || !$cfg->getId() || $cfg->isHelpDeskOffline() || $cfg->isUpgradePending()) {
+if(!is_object($ost) || !$ost->isSystemOnline()) {
     include('./offline.php');
     exit;
 }
diff --git a/include/class.config.php b/include/class.config.php
index 626e11c9a0e3eb466046f3539b9ed16ecb7c0c7e..cb7cd40aed575013ee1db136d15037438d6b34fb 100644
--- a/include/class.config.php
+++ b/include/class.config.php
@@ -44,39 +44,28 @@ class Config {
             
         $this->config=db_fetch_array($res);
         $this->id=$this->config['id'];
+        $this->setMysqlTZ(db_timezone());
 
         return true;
     }
 
-    //Initialize some default values.
-    function init() {
-        list($mysqltz)=db_fetch_row(db_query('SELECT @@session.time_zone '));
-        $this->setMysqlTZ($mysqltz);
-    }
-    
     function reload() {
         if(!$this->load($this->getId()))
             return false;
 
-        $this->init();
-
         return true;
     }
 
     function isHelpDeskOffline() {
-        return !$this->isSystemOnline();
+        return !$this->isOnline();
     }
 
     function isHelpDeskOnline() {
-        return $this->isSystemOnline();
+        return $this->isOnline();
     }
 
-    function isSystemOnline() {
-        return ($this->config['isonline'] && !$this->isUpgradePending());
-    }
-
-    function isUpgradePending() {
-        return (defined('SCHEMA_SIGNATURE') && strcasecmp($this->getSchemaSignature(), SCHEMA_SIGNATURE));
+    function isOnline() {
+        return ($this->config['isonline']);
     }
 
     function isKnowledgebaseEnabled() {
@@ -132,6 +121,14 @@ class Config {
     function getId() {
         return $this->id;
     }
+
+    function getConfigId() {
+        return $this->getId();
+    }
+
+    function getConfigInfo() {
+        return $this->config;
+    }
    
     function getTitle() {
         return $this->config['helpdesk_title'];
@@ -145,10 +142,6 @@ class Config {
         return rtrim($this->getUrl(),'/');
     }
 
-    function getConfig() {
-        return $this->config;
-    }
-
     function getTZOffset() {
         return $this->config['timezone_offset'];
     }
@@ -584,7 +577,7 @@ class Config {
         return false;
     }
 
-    function updateGeneralSetting($vars,&$errors) {
+    function updateGeneralSetting($vars, &$errors) {
 
         $f=array();
         $f['helpdesk_url']=array('type'=>'string',   'required'=>1, 'error'=>'Helpdesk URl required');
@@ -594,29 +587,29 @@ class Config {
         $f['staff_session_timeout']=array('type'=>'int',   'required'=>1, 'error'=>'Enter idle time in minutes');
         $f['client_session_timeout']=array('type'=>'int',   'required'=>1, 'error'=>'Enter idle time in minutes');
 
-        if(!Validator::process($f,$vars,$errors) || $errors)
+        if(!Validator::process($f, $vars, $errors) || $errors)
             return false;
 
-        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-             ',isonline='.db_input($vars['isonline']).
-             ',helpdesk_title='.db_input($vars['helpdesk_title']).
-             ',helpdesk_url='.db_input($vars['helpdesk_url']).
-             ',default_dept_id='.db_input($vars['default_dept_id']).
-             ',default_template_id='.db_input($vars['default_template_id']).
-             ',max_page_size='.db_input($vars['max_page_size']).
-             ',log_level='.db_input($vars['log_level']).
-             ',log_graceperiod='.db_input($vars['log_graceperiod']).
-             ',passwd_reset_period='.db_input($vars['passwd_reset_period']).
-             ',staff_max_logins='.db_input($vars['staff_max_logins']).
-             ',staff_login_timeout='.db_input($vars['staff_login_timeout']).
-             ',staff_session_timeout='.db_input($vars['staff_session_timeout']).
-             ',staff_ip_binding='.db_input(isset($vars['staff_ip_binding'])?1:0).
-             ',client_max_logins='.db_input($vars['client_max_logins']).
-             ',client_login_timeout='.db_input($vars['client_login_timeout']).
-             ',client_session_timeout='.db_input($vars['client_session_timeout']).
-             ',clickable_urls='.db_input(isset($vars['clickable_urls'])?1:0).
-             ',enable_auto_cron='.db_input(isset($vars['enable_auto_cron'])?1:0).
-             ' WHERE id='.$this->getId();
+        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+            .',isonline='.db_input($vars['isonline'])
+            .',helpdesk_title='.db_input($vars['helpdesk_title'])
+            .',helpdesk_url='.db_input($vars['helpdesk_url'])
+            .',default_dept_id='.db_input($vars['default_dept_id'])
+            .',default_template_id='.db_input($vars['default_template_id'])
+            .',max_page_size='.db_input($vars['max_page_size'])
+            .',log_level='.db_input($vars['log_level'])
+            .',log_graceperiod='.db_input($vars['log_graceperiod'])
+            .',passwd_reset_period='.db_input($vars['passwd_reset_period'])
+            .',staff_max_logins='.db_input($vars['staff_max_logins'])
+            .',staff_login_timeout='.db_input($vars['staff_login_timeout'])
+            .',staff_session_timeout='.db_input($vars['staff_session_timeout'])
+            .',staff_ip_binding='.db_input(isset($vars['staff_ip_binding'])?1:0)
+            .',client_max_logins='.db_input($vars['client_max_logins'])
+            .',client_login_timeout='.db_input($vars['client_login_timeout'])
+            .',client_session_timeout='.db_input($vars['client_session_timeout'])
+            .',clickable_urls='.db_input(isset($vars['clickable_urls'])?1:0)
+            .',enable_auto_cron='.db_input(isset($vars['enable_auto_cron'])?1:0)
+            .' WHERE id='.db_input($this->getId());
         
         return (db_query($sql));
     }
@@ -633,14 +626,14 @@ class Config {
         if(!Validator::process($f,$vars,$errors) || $errors)
             return false;
 
-        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-             ',time_format='.db_input($vars['time_format']).
-             ',date_format='.db_input($vars['date_format']).
-             ',datetime_format='.db_input($vars['datetime_format']).
-             ',daydatetime_format='.db_input($vars['daydatetime_format']).
-             ',default_timezone_id='.db_input($vars['default_timezone_id']).
-             ',enable_daylight_saving='.db_input(isset($vars['enable_daylight_saving'])?1:0).
-             ' WHERE id='.$this->getId();
+        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+            .',time_format='.db_input($vars['time_format'])
+            .',date_format='.db_input($vars['date_format'])
+            .',datetime_format='.db_input($vars['datetime_format'])
+            .',daydatetime_format='.db_input($vars['daydatetime_format'])
+            .',default_timezone_id='.db_input($vars['default_timezone_id'])
+            .',enable_daylight_saving='.db_input(isset($vars['enable_daylight_saving'])?1:0)
+            .' WHERE id='.db_input($this->getId());
 
         return (db_query($sql));
     }
@@ -665,22 +658,23 @@ class Config {
         if(!Validator::process($f,$vars,$errors) || $errors)
             return false;
 
-        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-             ',random_ticket_ids='.db_input($vars['random_ticket_ids']).
-             ',default_priority_id='.db_input($vars['default_priority_id']).
-             ',default_sla_id='.db_input($vars['default_sla_id']).
-             ',max_open_tickets='.db_input($vars['max_open_tickets']).
-             ',autolock_minutes='.db_input($vars['autolock_minutes']).
-             ',allow_priority_change='.db_input(isset($vars['allow_priority_change'])?1:0).
-             ',use_email_priority='.db_input(isset($vars['use_email_priority'])?1:0).
-             ',enable_captcha='.db_input(isset($vars['enable_captcha'])?1:0).
-             ',log_ticket_activity='.db_input(isset($vars['log_ticket_activity'])?1:0).
-             ',auto_assign_reopened_tickets='.db_input(isset($vars['auto_assign_reopened_tickets'])?1:0).
-             ',show_assigned_tickets='.db_input(isset($vars['show_assigned_tickets'])?1:0).
-             ',show_answered_tickets='.db_input(isset($vars['show_answered_tickets'])?1:0).
-             ',show_related_tickets='.db_input(isset($vars['show_related_tickets'])?1:0).
-             ',show_notes_inline='.db_input(isset($vars['show_notes_inline'])?1:0).
-             ',hide_staff_name='.db_input(isset($vars['hide_staff_name'])?1:0);
+        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+            .',random_ticket_ids='.db_input($vars['random_ticket_ids'])
+            .',default_priority_id='.db_input($vars['default_priority_id'])
+            .',default_sla_id='.db_input($vars['default_sla_id'])
+            .',max_open_tickets='.db_input($vars['max_open_tickets'])
+            .',autolock_minutes='.db_input($vars['autolock_minutes'])
+            .',allow_priority_change='.db_input(isset($vars['allow_priority_change'])?1:0)
+            .',use_email_priority='.db_input(isset($vars['use_email_priority'])?1:0)
+            .',enable_captcha='.db_input(isset($vars['enable_captcha'])?1:0)
+            .',log_ticket_activity='.db_input(isset($vars['log_ticket_activity'])?1:0)
+            .',auto_assign_reopened_tickets='.db_input(isset($vars['auto_assign_reopened_tickets'])?1:0)
+            .',show_assigned_tickets='.db_input(isset($vars['show_assigned_tickets'])?1:0)
+            .',show_answered_tickets='.db_input(isset($vars['show_answered_tickets'])?1:0)
+            .',show_related_tickets='.db_input(isset($vars['show_related_tickets'])?1:0)
+            .',show_notes_inline='.db_input(isset($vars['show_notes_inline'])?1:0)
+            .',hide_staff_name='.db_input(isset($vars['hide_staff_name'])?1:0)
+            .' WHERE id='.db_input($this->getId());
 
         return (db_query($sql));
     }
@@ -702,15 +696,18 @@ class Config {
         if(!Validator::process($f,$vars,$errors) || $errors)
             return false;
 
-        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-             ',default_email_id='.db_input($vars['default_email_id']).
-             ',alert_email_id='.db_input($vars['alert_email_id']).
-             ',default_smtp_id='.db_input($vars['default_smtp_id']).
-             ',admin_email='.db_input($vars['admin_email']).
-             ',enable_mail_polling='.db_input(isset($vars['enable_mail_polling'])?1:0).
-             ',enable_email_piping='.db_input(isset($vars['enable_email_piping'])?1:0).
-             ',strip_quoted_reply='.db_input(isset($vars['strip_quoted_reply'])?1:0).
-             ',reply_separator='.db_input($vars['reply_separator']);
+        $sql='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+            .',default_email_id='.db_input($vars['default_email_id'])
+            .',alert_email_id='.db_input($vars['alert_email_id'])
+            .',default_smtp_id='.db_input($vars['default_smtp_id'])
+            .',admin_email='.db_input($vars['admin_email'])
+            .',enable_mail_polling='.db_input(isset($vars['enable_mail_polling'])?1:0)
+            .',enable_email_piping='.db_input(isset($vars['enable_email_piping'])?1:0)
+            .',strip_quoted_reply='.db_input(isset($vars['strip_quoted_reply'])?1:0)
+            .',reply_separator='.db_input($vars['reply_separator'])
+            .' WHERE id='.db_input($this->getId());
+
+
         
         return (db_query($sql));
     }
@@ -741,36 +738,33 @@ class Config {
 
         if($errors) return false;
 
-        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-              ',allow_attachments='.db_input(isset($vars['allow_attachments'])?1:0).
-              ',allowed_filetypes='.db_input(strtolower(preg_replace("/\n\r|\r\n|\n|\r/", '',trim($vars['allowed_filetypes'])))).
-              ',max_file_size='.db_input($vars['max_file_size']).
-              ',max_user_file_uploads='.db_input($vars['max_user_file_uploads']).
-              ',max_staff_file_uploads='.db_input($vars['max_staff_file_uploads']).
-              ',email_attachments='.db_input(isset($vars['email_attachments'])?1:0).
-              ',allow_email_attachments='.db_input(isset($vars['allow_email_attachments'])?1:0).
-              ',allow_online_attachments='.db_input(isset($vars['allow_online_attachments'])?1:0).
-              ',allow_online_attachments_onlogin='.db_input(isset($vars['allow_online_attachments_onlogin'])?1:0).
-              ' WHERE id='.db_input($this->getId());
-        
+        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+             .',allow_attachments='.db_input(isset($vars['allow_attachments'])?1:0)
+             .',allowed_filetypes='.db_input(strtolower(preg_replace("/\n\r|\r\n|\n|\r/", '',trim($vars['allowed_filetypes']))))
+             .',max_file_size='.db_input($vars['max_file_size'])
+             .',max_user_file_uploads='.db_input($vars['max_user_file_uploads'])
+             .',max_staff_file_uploads='.db_input($vars['max_staff_file_uploads'])
+             .',email_attachments='.db_input(isset($vars['email_attachments'])?1:0)
+             .',allow_email_attachments='.db_input(isset($vars['allow_email_attachments'])?1:0)
+             .',allow_online_attachments='.db_input(isset($vars['allow_online_attachments'])?1:0)
+             .',allow_online_attachments_onlogin='.db_input(isset($vars['allow_online_attachments_onlogin'])?1:0)
+             .' WHERE id='.db_input($this->getId());
 
         return (db_query($sql));
-
     }
 
-
     function updateAutoresponderSetting($vars,&$errors) {
 
         if($errors) return false;
 
-        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-              ',ticket_autoresponder='.db_input($vars['ticket_autoresponder']).
-              ',message_autoresponder='.db_input($vars['message_autoresponder']).
-              ',ticket_notice_active='.db_input($vars['ticket_notice_active']).
-              ',overlimit_notice_active='.db_input($vars['overlimit_notice_active']);
+        $sql ='UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+             .',ticket_autoresponder='.db_input($vars['ticket_autoresponder'])
+             .',message_autoresponder='.db_input($vars['message_autoresponder'])
+             .',ticket_notice_active='.db_input($vars['ticket_notice_active'])
+             .',overlimit_notice_active='.db_input($vars['overlimit_notice_active'])
+             .' WHERE id='.db_input($this->getId());
 
         return (db_query($sql));
-
     }
 
 
@@ -778,10 +772,11 @@ class Config {
 
         if($errors) return false;
 
-        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-              ',enable_kb='.db_input(isset($vars['enable_kb'])?1:0).
-              ',enable_premade='.db_input(isset($vars['enable_premade'])?1:0);
-    
+        $sql = 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+              .',enable_kb='.db_input(isset($vars['enable_kb'])?1:0)
+              .',enable_premade='.db_input(isset($vars['enable_premade'])?1:0)
+              .' WHERE id='.db_input($this->getId());
+
         return (db_query($sql));
     }
 
@@ -832,38 +827,44 @@ class Config {
 
         if($errors) return false;
         
-        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '.
-              ',ticket_notice_active='.db_input($vars['ticket_notice_active']).
-              ',ticket_alert_active='.db_input($vars['ticket_alert_active']).
-              ',ticket_alert_admin='.db_input(isset($vars['ticket_alert_admin'])?1:0).
-              ',ticket_alert_dept_manager='.db_input(isset($vars['ticket_alert_dept_manager'])?1:0).
-              ',ticket_alert_dept_members='.db_input(isset($vars['ticket_alert_dept_members'])?1:0).
-              ',message_alert_active='.db_input($vars['message_alert_active']).
-              ',message_alert_laststaff='.db_input(isset($vars['message_alert_laststaff'])?1:0).
-              ',message_alert_assigned='.db_input(isset($vars['message_alert_assigned'])?1:0).
-              ',message_alert_dept_manager='.db_input(isset($vars['message_alert_dept_manager'])?1:0).
-              ',note_alert_active='.db_input($vars['note_alert_active']).
-              ',note_alert_laststaff='.db_input(isset($vars['note_alert_laststaff'])?1:0).
-              ',note_alert_assigned='.db_input(isset($vars['note_alert_assigned'])?1:0).
-              ',note_alert_dept_manager='.db_input(isset($vars['note_alert_dept_manager'])?1:0).
-              ',assigned_alert_active='.db_input($vars['assigned_alert_active']).
-              ',assigned_alert_staff='.db_input(isset($vars['assigned_alert_staff'])?1:0).
-              ',assigned_alert_team_lead='.db_input(isset($vars['assigned_alert_team_lead'])?1:0).
-              ',assigned_alert_team_members='.db_input(isset($vars['assigned_alert_team_members'])?1:0).
-              ',transfer_alert_active='.db_input($vars['transfer_alert_active']).
-              ',transfer_alert_assigned='.db_input(isset($vars['transfer_alert_assigned'])?1:0).
-              ',transfer_alert_dept_manager='.db_input(isset($vars['transfer_alert_dept_manager'])?1:0).
-              ',transfer_alert_dept_members='.db_input(isset($var['transfer_alert_dept_members'])?1:0).
-              ',overdue_alert_active='.db_input($vars['overdue_alert_active']).
-              ',overdue_alert_assigned='.db_input(isset($vars['overdue_alert_assigned'])?1:0).
-              ',overdue_alert_dept_manager='.db_input(isset($vars['overdue_alert_dept_manager'])?1:0).
-              ',overdue_alert_dept_members='.db_input(isset($var['overdue_alert_dept_members'])?1:0).
-              ',send_sys_errors='.db_input(isset($vars['send_sys_errors'])?1:0).
-              ',send_sql_errors='.db_input(isset($vars['send_sql_errors'])?1:0).
-              ',send_login_errors='.db_input(isset($vars['send_login_errors'])?1:0);
+        $sql= 'UPDATE '.CONFIG_TABLE.' SET updated=NOW() '
+             .',ticket_notice_active='.db_input($vars['ticket_notice_active'])
+             .',ticket_alert_active='.db_input($vars['ticket_alert_active'])
+             .',ticket_alert_admin='.db_input(isset($vars['ticket_alert_admin'])?1:0)
+             .',ticket_alert_dept_manager='.db_input(isset($vars['ticket_alert_dept_manager'])?1:0)
+             .',ticket_alert_dept_members='.db_input(isset($vars['ticket_alert_dept_members'])?1:0)
+             .',message_alert_active='.db_input($vars['message_alert_active'])
+             .',message_alert_laststaff='.db_input(isset($vars['message_alert_laststaff'])?1:0)
+             .',message_alert_assigned='.db_input(isset($vars['message_alert_assigned'])?1:0)
+             .',message_alert_dept_manager='.db_input(isset($vars['message_alert_dept_manager'])?1:0)
+             .',note_alert_active='.db_input($vars['note_alert_active'])
+             .',note_alert_laststaff='.db_input(isset($vars['note_alert_laststaff'])?1:0)
+             .',note_alert_assigned='.db_input(isset($vars['note_alert_assigned'])?1:0)
+             .',note_alert_dept_manager='.db_input(isset($vars['note_alert_dept_manager'])?1:0)
+             .',assigned_alert_active='.db_input($vars['assigned_alert_active'])
+             .',assigned_alert_staff='.db_input(isset($vars['assigned_alert_staff'])?1:0)
+             .',assigned_alert_team_lead='.db_input(isset($vars['assigned_alert_team_lead'])?1:0)
+             .',assigned_alert_team_members='.db_input(isset($vars['assigned_alert_team_members'])?1:0)
+             .',transfer_alert_active='.db_input($vars['transfer_alert_active'])
+             .',transfer_alert_assigned='.db_input(isset($vars['transfer_alert_assigned'])?1:0)
+             .',transfer_alert_dept_manager='.db_input(isset($vars['transfer_alert_dept_manager'])?1:0)
+             .',transfer_alert_dept_members='.db_input(isset($var['transfer_alert_dept_members'])?1:0)
+             .',overdue_alert_active='.db_input($vars['overdue_alert_active'])
+             .',overdue_alert_assigned='.db_input(isset($vars['overdue_alert_assigned'])?1:0)
+             .',overdue_alert_dept_manager='.db_input(isset($vars['overdue_alert_dept_manager'])?1:0)
+             .',overdue_alert_dept_members='.db_input(isset($var['overdue_alert_dept_members'])?1:0)
+             .',send_sys_errors='.db_input(isset($vars['send_sys_errors'])?1:0)
+             .',send_sql_errors='.db_input(isset($vars['send_sql_errors'])?1:0)
+             .',send_login_errors='.db_input(isset($vars['send_login_errors'])?1:0)
+             .' WHERE id='.db_input($this->getId());
 
         return (db_query($sql));
 
     }
+
+    /** static **/
+    function lookup($id) {
+        return ($id && ($cfg = new Config($id)) && $cfg->getId()==$id)?$cfg:null;
+    }
 }
 ?>
diff --git a/include/class.cron.php b/include/class.cron.php
index ddc4d2973e77ff93f6f83a4a3fefd6b4b9b82814..c8e3a81def985b99eb0f21eaea8751362e1ced05 100644
--- a/include/class.cron.php
+++ b/include/class.cron.php
@@ -31,7 +31,8 @@ class Cron {
     }
 
     function PurgeLogs() {
-        Sys::purgeLogs();
+        global $ost;
+        if($ost) $ost->purgeLogs();
     }
 
     function CleanOrphanedFiles() {
diff --git a/include/class.email.php b/include/class.email.php
index 0b4317f7e6e6dc82866288fc88631ff601b5753f..dba9a45d5d4c569c9a5e7b2c17c4254f12abdcee 100644
--- a/include/class.email.php
+++ b/include/class.email.php
@@ -122,7 +122,7 @@ class Email {
     }
 
     function send($to, $subject, $message, $attachments=null, $options=null) {
-        global $cfg;
+        global $cfg, $ost;
 
         //Get SMTP info IF enabled!
         $smtp=array();
@@ -149,11 +149,12 @@ class Email {
         $headers = array ('From' => $from,
                           'To' => $to,
                           'Subject' => $subject,
-                          'Date'=>date('D,d M Y H:i:s O'),
+                          'Date'=>date('D, d M Y H:i:s O'),
                           'Message-ID' =>'<'.Misc::randCode(6).''.time().'-'.$this->getEmail().'>',
                           'X-Mailer' =>'osTicket v1.7',
                           'Content-Type' => 'text/html; charset="UTF-8"'
                           );
+
         $mime = new Mail_mime();
         $mime->setTXTBody($body);
         //XXX: Attachments
@@ -189,8 +190,9 @@ class Email {
             if(!PEAR::isError($result))
                 return true;
 
+            //SMTP failed - log error.
             $alert=sprintf("Unable to email via %s:%d [%s]\n\n%s\n",$smtp['host'],$smtp['port'],$smtp['username'],$result->getMessage());
-            Sys::log(LOG_ALERT,'SMTP Error',$alert,false);
+            $ost->logError('SMTP Error', $alert, false); //NOTE: email alert overwrite - don't email when having email trouble.
             //print_r($result);
         }
 
@@ -292,6 +294,7 @@ class Email {
         //very basic checks
 
         $vars['name']=Format::striptags(trim($vars['name']));
+        $vars['email']=trim($vars['email']);
 
         if($id && $id!=$vars['id'])
             $errors['err']='Internal error. Get technical help.';
@@ -300,7 +303,7 @@ class Email {
             $errors['email']='Valid email required';
         }elseif(($eid=Email::getIdByEmail($vars['email'])) && $eid!=$id) {
             $errors['email']='Email already exits';
-        }elseif($cfg && !strcasecmp($cfg->getAdminEmail(),$vars['email'])) {
+        }elseif($cfg && !strcasecmp($cfg->getAdminEmail(), $vars['email'])) {
             $errors['email']='Email already used as admin email!';
         }elseif(Staff::getIdByEmail($vars['email'])) { //make sure the email doesn't belong to any of the staff 
             $errors['email']='Email in-use by a staff member';
diff --git a/include/class.format.php b/include/class.format.php
index a3461bf9d615c857382763c62b8ff49562352648..2c0993c459b108fdbd1bbf3394fb2e7f9ecdff95 100644
--- a/include/class.format.php
+++ b/include/class.format.php
@@ -200,7 +200,7 @@ class Format {
     }
 
     function userdate($format,$gmtime) {
-        return Format::date($format,$gmtime,$_SESSION['TZ_OFFSET'],$_SESSION['daylight']);
+        return Format::date($format,$gmtime,$_SESSION['TZ_OFFSET'],$_SESSION['TZ_DST']);
     }
     
     function date($format,$gmtimestamp,$offset=0,$daylight=false){
diff --git a/include/class.mailfetch.php b/include/class.mailfetch.php
index f25d72b26236471dd6b14e365a1745067ffe6f3e..a353b690be55c3f9cbd3740b6edcc7164dabc16e 100644
--- a/include/class.mailfetch.php
+++ b/include/class.mailfetch.php
@@ -255,7 +255,7 @@ class MailFetcher {
     }
 
     function createTicket($mid,$emailid=0){
-        global $cfg;
+        global $cfg, $ost;
 
         $mailinfo=$this->getHeaderInfo($mid);
 
@@ -265,11 +265,11 @@ class MailFetcher {
             return true;
         }
 
-	//Is the email address banned?
+	    //Is the email address banned?
         if($mailinfo['from']['email'] && EmailFilter::isBanned($mailinfo['from']['email'])) {
-	    //We need to let admin know...
-            Sys::log(LOG_WARNING,'Ticket denied','Banned email - '.$mailinfo['from']['email']);
-	    return true;
+	        //We need to let admin know...
+            $ost->logWarning('Ticket denied', 'Banned email - '.$mailinfo['from']['email']);
+	        return true;
         }
 	
 
@@ -370,15 +370,15 @@ class MailFetcher {
     }
 
     function fetchMail(){
-        global $cfg;
+        global $ost, $cfg;
       
         if(!$cfg->canFetchMail())
             return;
 
         //We require imap ext to fetch emails via IMAP/POP3
         if(!function_exists('imap_open')) {
-            $msg='PHP must be compiled with IMAP extension enabled for IMAP/POP3 fetch to work!';
-            Sys::log(LOG_WARN,'Mail Fetch Error',$msg);
+            $msg='osTicket requires PHP IMAP extension enabled for IMAP/POP3 fetch to work!';
+            $ost->logWarning('Mail Fetch Error', $msg);
             return;
         }
 
@@ -393,7 +393,7 @@ class MailFetcher {
 
         //TODO: Lock the table here??
         while($row=db_fetch_array($accounts)) {
-            $fetcher = new MailFetcher($row['userid'],Misc::decrypt($row['userpass'],SECRET_SALT),
+            $fetcher = new MailFetcher($row['userid'], Mcrypt::decrypt($row['userpass'],SECRET_SALT),
                                        $row['mail_host'],$row['mail_port'],$row['mail_protocol'],$row['mail_encryption']);
             if($fetcher->connect()){   
                 $fetcher->fetchTickets($row['email_id'],$row['mail_fetchmax'],$row['mail_delete']?true:false,$row['mail_archivefolder']);
@@ -410,7 +410,7 @@ class MailFetcher {
                         "\nError: ".$fetcher->getLastError().
                         "\n\n ".$errors.' consecutive errors. Maximum of '.$MAX_ERRORS. ' allowed'.
                         "\n\n This could be connection issues related to the host. Next delayed login attempt in aprox. 10 minutes";
-                    Sys::alertAdmin('Mail Fetch Failure Alert',$msg,true);
+                    $ost->alertAdmin('Mail Fetch Failure Alert', $msg, true);
                 }
             }
         }
diff --git a/include/class.mcrypt.php b/include/class.mcrypt.php
index a6a9791019d92ea2165b92c4ccd7e7e908380b6e..13d56a7df32e22ffe5abff5c5a6bf195cc58749d 100644
--- a/include/class.mcrypt.php
+++ b/include/class.mcrypt.php
@@ -15,20 +15,25 @@
 **********************************************************************/
 class Mcrypt {
     
-    function encrypt($text, $salt){
+    function encrypt($text, $salt) {
+        global $ost;
+        
+        //if mcrypt extension is not installed--simply return unencryted text and log a warning (if enabled).
+        if(!function_exists('mcrypt_encrypt') || !function_exists('mcrypt_decrypt')) {
+            if($ost) {
+                $msg='Cryptography extension mcrypt is not enabled or installed. Important text/data is being stored as plain text in database.';
+                $ost->logWarning('mcrypt module missing', $msg);
+            }
 
-        //if mcrypt extension is not installed--simply return unencryted text and log a warning.
-        if(!function_exists('mcrypt_encrypt') || !function_exists('mcrypt_decrypt')){
-            $msg='Cryptography extension mcrypt is not enabled or installed. Important text/data is being stored as plain text in database.';
-            Sys::log(LOG_WARN,'mcrypt module missing',$msg);
             return $text;
         }
 
-        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$salt, $text, MCRYPT_MODE_ECB,
+        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB,
                          mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
     }
 
-    function decrypt($text, $salt){
+    function decrypt($text, $salt) {
+
         if(!function_exists('mcrypt_encrypt') || !function_exists('mcrypt_decrypt'))
             return $text;
 
diff --git a/include/class.misc.php b/include/class.misc.php
index d9f59f47858b23c9c47c2de6ea6c3cedfda61df1..409e4bac6f84eee1c73b1d040eda18455c0f4954 100644
--- a/include/class.misc.php
+++ b/include/class.misc.php
@@ -29,27 +29,6 @@ class Misc {
         return mt_rand($start,$end);
     }
 
-    function encrypt($text, $salt) {
-
-        //if mcrypt extension is not installed--simply return unencryted text and log a warning.
-        if(!function_exists('mcrypt_encrypt') || !function_exists('mcrypt_decrypt')) {
-            $msg='Cryptography extension mcrypt is not enabled or installed. IMAP/POP passwords are being stored as plain text in database.';
-            Sys::log(LOG_WARN,'mcrypt missing',$msg);
-            return $text;
-        }
-
-        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$salt, $text, MCRYPT_MODE_ECB,
-                         mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
-    }
-
-    function decrypt($text, $salt) {
-        if(!function_exists('mcrypt_encrypt') || !function_exists('mcrypt_decrypt'))
-            return $text;
-
-        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB,
-                        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
-    }
-
     /* misc date helpers...this will go away once we move to php 5 */ 
     function db2gmtime($var){
         global $cfg;
@@ -67,7 +46,7 @@ class Misc {
             $time=Misc::gmtime(); //gm time.
         else{ //user time to GM.
             $time=is_int($var)?$var:strtotime($var);
-            $offset=$_SESSION['TZ_OFFSET']+($_SESSION['daylight']?date('I',$time):0);
+            $offset=$_SESSION['TZ_OFFSET']+($_SESSION['TZ_DST']?date('I',$time):0);
             $time=$time-($offset*3600);
         }
         //gm to db time
diff --git a/include/class.osticket.php b/include/class.osticket.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb1b0361971176c00673ee61a0f23f1c17f0fa7e
--- /dev/null
+++ b/include/class.osticket.php
@@ -0,0 +1,228 @@
+<?php
+/*************************************************************************
+    class.osticket.php
+
+    osTicket (sys) -> Config.
+
+    Core osTicket object: loads congfig and provides loggging facility.
+
+    Use osTicket::start(configId)
+
+    Peter Rotich <peter@osticket.com>
+    Copyright (c)  2006-2012 osTicket
+    http://www.osticket.com
+
+    Released under the GNU General Public License WITHOUT ANY WARRANTY.
+    See LICENSE.TXT for details.
+
+    vim: expandtab sw=4 ts=4 sts=4:
+**********************************************************************/
+
+require_once(INCLUDE_DIR.'class.config.php'); //Config helper
+define('LOG_WARN',LOG_WARNING);
+
+class osTicket {
+
+    var $loglevel=array(1=>'Error','Warning','Debug');
+    var $errors;
+    var $warning;
+    var $message;
+
+    var $headers;
+
+    var $config;
+    var $session;
+
+    function osTicket($cfgId) {
+        $this->config = Config::lookup($cfgId);
+        $this->session = osTicketSession::start(SESSION_TTL); // start_session 
+    }
+
+    function isSystemOnline() {
+        return ($this->getConfig() && $this->getConfig()->isHelpdeskOnline() && !$this->isUpgradePending());
+    }
+
+    function isUpgradePending() {
+        return (defined('SCHEMA_SIGNATURE') && strcasecmp($this->getConfig()->getSchemaSignature(), SCHEMA_SIGNATURE));
+    }
+
+    function getSession() {
+        return $this->session;
+    }
+
+    function getConfig() {
+        return $this->config;
+    }
+
+    function getConfigId() {
+
+        return $this->getConfig()?$this->getConfig()->getId():0;
+    }
+
+    function addExtraHeader($header) {
+        $this->headers[md5($header)] = $header;
+    }
+
+    function getExtraHeaders() {
+        return $this->headers;
+    }
+
+    function getErrors() {
+        return $this->errors;
+    }
+
+    function setErrors($errors) {
+        if(!is_array($errors))
+            return  $this->setError($errors);
+
+        $this->errors = $errors;
+    }
+
+    function getError() {
+        return $this->errors['err'];
+    }
+
+    function setError($error) {
+        $this->errors['err'] = $error;
+    }
+
+    function clearError() {
+        $this->setError('');
+    }
+
+    function getWarning() {
+        return $this->warning;
+    }
+
+    function setWarning($warn) {
+        $this->warning = $warn;
+    }
+
+    function clearWarning() {
+        $this->setWarning('');
+    }
+
+
+    function getMessage() {
+        return $this->message;
+    }
+
+    function setMessage($msg) {
+        $this->message = $msg;
+    }
+
+    function clearMessage() {
+        $this->setMessage('');
+    }
+
+
+    function alertAdmin($subject, $message, $log=false) {
+                
+        //Set admin's email address
+        if(!($to=$this->getConfig()->getAdminEmail()))
+            $to=ADMIN_EMAIL;
+
+        //Try getting the alert email.
+        $email=null;
+        if(!($email=$this->getConfig()->getAlertEmail())) 
+            $email=$this->getConfig()->getDefaultEmail(); //will take the default email.
+
+        if($email) {
+            $email->send($to, $subject, $message);
+        } else {//no luck - try the system mail.
+            Email::sendmail($to, $subject, $message, sprintf('"osTicket Alerts"<%s>',$to));
+        }
+
+        //log the alert? Watch out for loops here.
+        if($log)
+            $this->log(LOG_CRIT, $subject, $message, false); //Log the entry...and make sure no alerts are resent.
+
+    }
+
+    function logDebug($title, $message, $alert=false) {
+        return $this->log(LOG_DEBUG, $title, $message, $alert);
+    }
+
+    function logInfo($title, $message, $alert=false) {
+        return $this->log(LOG_INFO, $title, $message, $alert);
+    }
+
+    function logWarning($title, $message, $alert=true) {
+        return $this->log(LOG_WARN, $title, $message, $alert);
+    }
+    
+    function logError($title, $error, $alert=true) {
+        return $this->log(LOG_ERR, $title, $error, $alert);
+    }
+
+    function log($priority, $title, $message, $alert=false) {
+
+        //We are providing only 3 levels of logs. Windows style.
+        switch($priority) {
+            case LOG_EMERG:
+            case LOG_ALERT: 
+            case LOG_CRIT: 
+            case LOG_ERR:
+                $level=1; //Error
+                break;
+            case LOG_WARN:
+            case LOG_WARNING:
+                $level=2; //Warning
+                break;
+            case LOG_NOTICE:
+            case LOG_INFO:
+            case LOG_DEBUG:
+            default:
+                $level=3; //Debug
+        }
+
+        //Alert admin if enabled...
+        if($alert)
+            $this->alertAdmin($title, $message);
+
+
+        if($this->getConfig()->getLogLevel()<$level)
+            return false;
+
+        //Save log based on system log level settings.
+        $loglevel=array(1=>'Error','Warning','Debug');
+        $sql='INSERT INTO '.SYSLOG_TABLE.' SET created=NOW(), updated=NOW() '.
+            ',title='.db_input($title).
+            ',log_type='.db_input($loglevel[$level]).
+            ',log='.db_input($message).
+            ',ip_address='.db_input($_SERVER['REMOTE_ADDR']);
+        
+        mysql_query($sql); //don't use db_query to avoid possible loop.
+        
+        return true;
+    }
+
+    function purgeLogs() {
+
+        if(!($gp=$this->getConfig()->getLogGracePeriod()) || !is_numeric($gp))
+            return false;
+
+        //System logs
+        $sql='DELETE  FROM '.SYSLOG_TABLE.' WHERE DATE_ADD(created, INTERVAL '.$gp.' MONTH)<=NOW()';
+        db_query($sql);
+        
+        //TODO: Activity logs
+
+        return true;
+    }
+
+    /**** static functions ****/
+    function start($configId) {
+
+        if(!$configId || !($ost = new osTicket($configId)) || $ost->getConfigId()!=$configId)
+            return null;
+
+        //Set default time zone... user/staff settting will overwrite it (on login).
+        $_SESSION['TZ_OFFSET'] = $ost->getConfig()->getTZoffset();
+        $_SESSION['TZ_DST'] = $ost->getConfig()->observeDaylightSaving();
+
+        return $ost;
+    }
+}
+
+?>
diff --git a/include/class.ostsession.php b/include/class.ostsession.php
index ccbae6e03f90147f06b24a79b0e1468faae4f821..0bcd9449fb234c6b9a895da6b046527f7a7909a4 100644
--- a/include/class.ostsession.php
+++ b/include/class.ostsession.php
@@ -53,9 +53,11 @@ class osTicketSession {
         return (true);
     }
  
-    function read($session_id){
+    function read($id){
         $data="";
-        $sql='SELECT session_data FROM '.SESSION_TABLE.' WHERE session_id='.db_input($session_id).' AND session_expire>NOW()';
+        $sql='SELECT session_data FROM '.SESSION_TABLE
+            .' WHERE session_id='.db_input($id)
+            .'  AND session_expire>NOW()';
         if(($res=db_query($sql)) && db_num_rows($res))
             list($data)=db_fetch_row($res);
 
@@ -63,7 +65,7 @@ class osTicketSession {
     }
 
     function write($id, $data){
-        global $cfg,$thisstaff;
+        global $thisstaff;
 
         $sql='REPLACE INTO '.SESSION_TABLE.' SET session_updated=NOW() '.
              ',session_id='.db_input($id).
@@ -98,8 +100,9 @@ class osTicketSession {
             $sql.=" AND TIME_TO_SEC(TIMEDIFF(NOW(),session_updated))<$sec";
 
         $users=array();
-        if(($res=db_query($sql)) && db_num_rows($res)){
-            list($users[])=db_fetch_row($res);
+        if(($res=db_query($sql)) && db_num_rows($res)) {
+            while(list($uid)=db_fetch_row($res))
+                $users[] = $uid;
         }
 
         return $users;
diff --git a/include/class.staff.php b/include/class.staff.php
index 00554157935ba0d82aa77596bf9c912f0fcf5ad5..bd7379ed95e659fbf0c2c527735376f831238e89 100644
--- a/include/class.staff.php
+++ b/include/class.staff.php
@@ -95,7 +95,8 @@ class Staff {
     /* check if passwd reset is due. */
     function isPasswdResetDue() {
         global $cfg;
-        return ($cfg && $cfg->getPasswdResetPeriod() && $this->ht['passwd_change_sec']>($cfg->getPasswdResetPeriod()*30*24*60*60));
+        return ($cfg && $cfg->getPasswdResetPeriod() 
+                    && $this->ht['passwd_change_sec']>($cfg->getPasswdResetPeriod()*30*24*60*60));
     }
 
     function isPasswdChangeDue() {
@@ -495,7 +496,7 @@ class Staff {
     }
 
     function login($username, $passwd, &$errors, $strike=true) {
-        global $cfg, $session;
+        global $ost, $cfg;
 
 
         if($_SESSION['_staff']['laststrike']) {
@@ -520,13 +521,16 @@ class Staff {
             $_SESSION['_staff']['userID']=$username;
             $user->refreshSession(); //set the hash.
             $_SESSION['TZ_OFFSET']=$user->getTZoffset();
-            $_SESSION['daylight']=$user->observeDaylight();
-            Sys::log(LOG_DEBUG,'Staff login',sprintf("%s logged in [%s]", $user->getUserName(), $_SERVER['REMOTE_ADDR'])); //Debug.
+            $_SESSION['TZ_DST']=$user->observeDaylight();
+
+            $ost->logDebug('Staff login', 
+                    sprintf("%s logged in [%s]", $user->getUserName(), $_SERVER['REMOTE_ADDR'])); //Debug.
             $sid=session_id(); //Current ID
             session_regenerate_id(TRUE);
             //Destroy old session ID - needed for PHP version < 5.1.0 TODO: remove when we move to php 5.3 as min. requirement.
-            if($session && is_object($session) && $sid)
+            if(($session=$ost->getSession()) && is_object($session) && $sid)
                 $session->destroy($sid);
+
             session_write_close();
         
             return $user;
@@ -540,12 +544,12 @@ class Staff {
             $alert='Excessive login attempts by a staff member?'."\n".
                    'Username: '.$_POST['username']."\n".'IP: '.$_SERVER['REMOTE_ADDR']."\n".'TIME: '.date('M j, Y, g:i a T')."\n\n".
                    'Attempts #'.$_SESSION['_staff']['strikes']."\n".'Timeout: '.($cfg->getStaffLoginTimeout()/60)." minutes \n\n";
-            Sys::log(LOG_ALERT,'Excessive login attempts ('.$_POST['username'].')', $alert,($cfg->alertONLoginError()));
+            $ost->logWarning('Excessive login attempts ('.$_POST['username'].')', $alert, ($cfg->alertONLoginError()));
     
         } elseif($_SESSION['_staff']['strikes']%2==0) { //Log every other failed login attempt as a warning.
             $alert='Username: '.$_POST['username']."\n".'IP: '.$_SERVER['REMOTE_ADDR'].
                    "\n".'TIME: '.date('M j, Y, g:i a T')."\n\n".'Attempts #'.$_SESSION['_staff']['strikes'];
-            Sys::log(LOG_WARNING,'Failed staff login attempt ('.$_POST['username'].')', $alert);
+            $ost->logWarning('Failed staff login attempt ('.$_POST['username'].')', $alert, false);
         }
 
         return false;
diff --git a/include/class.sys.php b/include/class.sys.php
deleted file mode 100644
index 33b5c830407f1b56fb1ef8eff47657e1296bb97a..0000000000000000000000000000000000000000
--- a/include/class.sys.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/*************************************************************************
-    class.sys.php
-
-    System core helper.
-
-    Peter Rotich <peter@osticket.com>
-    Copyright (c)  2006-2012 osTicket
-    http://www.osticket.com
-
-    Released under the GNU General Public License WITHOUT ANY WARRANTY.
-    See LICENSE.TXT for details.
-
-    vim: expandtab sw=4 ts=4 sts=4:
-**********************************************************************/
-
-require_once(INCLUDE_DIR.'class.config.php'); //Config helper
-
-define('LOG_WARN',LOG_WARNING);
-
-class Sys {
-
-    var $loglevel=array(1=>'Error','Warning','Debug');
-
-
-    //Load configuration info.
-    function getConfig() {
-        $cfg= new Config(1);
-        return ($cfg && $cfg->getId())?$cfg:null;
-    }
-
-
-    function alertAdmin($subject,$message,$log=false) {
-        global $cfg;
-                
-        //Set admin's email address
-        if(!$cfg || !($to=$cfg->getAdminEmail()))
-            $to=ADMIN_EMAIL;
-
-        //Try getting the alert email.
-        $email=null;
-        if($cfg && !($email=$cfg->getAlertEmail())) 
-            $email=$cfg->getDefaultEmail(); //will take the default email.
-
-        if($email) {
-            $email->send($to,$subject,$message);
-        }else {//no luck - try the system mail.
-            Email::sendmail($to,$subject,$message,sprintf('"osTicket Alerts"<%s>',$to));
-        }
-
-        //log the alert? Watch out for loops here.
-        if($log && is_object($cfg)) { //if $cfg is not set then it means we don't have DB connection.
-            Sys::log(LOG_CRIT,$subject,$message,false); //Log the entry...and make sure no alerts are resent.
-        }
-
-    }
-
-    function log($priority,$title,$message,$alert=true) {
-        global $cfg;
-
-        switch($priority){ //We are providing only 3 levels of logs. Windows style.
-            case LOG_EMERG:
-            case LOG_ALERT: 
-            case LOG_CRIT: 
-            case LOG_ERR:
-                $level=1;
-                if($alert) {
-                    Sys::alertAdmin($title,$message);
-                }
-                break;
-            case LOG_WARN:
-            case LOG_WARNING:
-                //Warning...
-                $level=2;
-                break;
-            case LOG_NOTICE:
-            case LOG_INFO:
-            case LOG_DEBUG:
-            default:
-                $level=3;
-                //debug
-        }
-        //Save log based on system log level settings.
-        if($cfg && $cfg->getLogLevel()>=$level){
-            $loglevel=array(1=>'Error','Warning','Debug');
-            $sql='INSERT INTO '.SYSLOG_TABLE.' SET created=NOW(),updated=NOW() '.
-                 ',title='.db_input($title).
-                 ',log_type='.db_input($loglevel[$level]).
-                 ',log='.db_input($message).
-                 ',ip_address='.db_input($_SERVER['REMOTE_ADDR']);
-            //echo $sql;
-            mysql_query($sql); //don't use db_query to avoid possible loop.
-        }
-    }
-
-    function purgeLogs(){
-        global $cfg;
-
-        if($cfg && ($gp=$cfg->getLogGracePeriod()) && is_numeric($gp)) {
-            $sql='DELETE  FROM '.SYSLOG_TABLE.' WHERE DATE_ADD(created, INTERVAL '.$gp.' MONTH)<=NOW()';
-            db_query($sql);
-        }
-
-    }
-}
-
-?>
diff --git a/include/class.template.php b/include/class.template.php
index 36d9b2f4845d3ca14ad564c9a8c829c11b9ab083..fa8d070d544c4bf5eda0da758fed814f106c529d 100644
--- a/include/class.template.php
+++ b/include/class.template.php
@@ -91,11 +91,12 @@ class Template {
         return (db_query($sql) && db_affected_rows());
     }
 
-    function getMsgTemplate($name){
+    function getMsgTemplate($name) {
+        global $ost;
 
         //TODO: Don't preload - do ondemand fetch!
         $tpl=array();
-        switch(strtolower($name)){
+        switch(strtolower($name)) {
             case 'ticket_autoresp':
                  $tpl=array('subj'=>$this->ht['ticket_autoresp_subj'],'body'=>$this->ht['ticket_autoresp_body']);
                  break;
@@ -130,7 +131,7 @@ class Template {
                  $tpl=array('subj'=>$this->ht['ticket_overdue_subj'],'body'=>$this->ht['ticket_overdue_body']);
                  break;
             default:
-                 Sys::log(LOG_WARNING,'Template Fetch Error',"Unable to fetch '$name' template - id #".$this->getId());
+                 $ost->logWarning('Template Fetch Error', "Unable to fetch '$name' template - id #".$this->getId());
                  $tpl=array();
         }
 
@@ -197,7 +198,7 @@ class Template {
         if($errors) return false;
 
         $sql='UPDATE '.EMAIL_TEMPLATE_TABLE.' SET updated=NOW() ';
-        switch(strtolower($vars['tpl'])){
+        switch(strtolower($vars['tpl'])) {
             case 'ticket_autoresp':
                 $sql.=',ticket_autoresp_subj='.db_input($vars['subj']).',ticket_autoresp_body='.db_input($vars['body']);
                 break;
@@ -326,8 +327,8 @@ class Template {
         return ($id && is_numeric($id) && ($t= new Template($id)) && $t->getId()==$id)?$t:null;
     }
 
-    function save($id,$vars,&$errors) {
-        global $cfg;
+    function save($id, $vars, &$errors) {
+        global $ost;
 
         $tpl=null;
         $vars['name']=Format::striptags(trim($vars['name']));
@@ -354,12 +355,14 @@ class Template {
             $sql='UPDATE '.EMAIL_TEMPLATE_TABLE.' SET '.$sql.' WHERE tpl_id='.db_input($id);
             if(db_query($sql))
                 return true;
+
             $errors['err']='Unable to update the template. Internal error occurred';
-        }elseif($tpl && ($info=$tpl->getInfo())){
+        
+        } elseif($tpl && ($info=$tpl->getInfo())) {
 
             $sql='INSERT INTO '.EMAIL_TEMPLATE_TABLE.' SET '.$sql
                 .' ,created=NOW() '
-                .' ,cfg_id='.db_input($cfg->getId())
+                .' ,cfg_id='.db_input($ost->getConfigId())
                 .' ,ticket_autoresp_subj='.db_input($info['ticket_autoresp_subj'])
                 .' ,ticket_autoresp_body='.db_input($info['ticket_autoresp_body'])
                 .' ,ticket_notice_subj='.db_input($info['ticket_notice_subj'])
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 6a27d981bb24bdc7f05a6c8adec30615f0f7ed24..8be88bee75840140feced0586d520a615b845f52 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -885,11 +885,11 @@ class Ticket{
     }
 
     function onOpenLimit($sendNotice=true) {
-        global $cfg;
+        global $ost, $cfg;
 
         //Log the limit notice as a warning for admin.
         $msg=sprintf('Max open tickets (%d) reached  for %s ', $cfg->getMaxOpenTickets(), $this->getEmail());
-        sys::log(LOG_WARNING, 'Max. Open Tickets Limit ('.$this->getEmail().')', $msg);
+        $ost->logWarning('Max. Open Tickets Limit ('.$this->getEmail().')', $msg);
 
         if(!$sendNotice || !$cfg->sendOverLimitNotice()) return true;
 
@@ -916,7 +916,7 @@ class Ticket{
             .'Open ticket: '.$client->getNumOpenTickets()."\n"
             .'Max Allowed: '.$cfg->getMaxOpenTickets()."\n\nNotice sent to the user.";
             
-        Sys::alertAdmin('Overlimit Notice',$msg);
+        $ost->alertAdmin('Overlimit Notice', $msg);
        
         return true;
     }
@@ -1803,7 +1803,7 @@ class Ticket{
      *  $autorespond and $alertstaff overwrites config settings...
      */      
     function create($vars, &$errors, $origin, $autorespond=true, $alertstaff=true) {
-        global $cfg,$thisclient,$_FILES;
+        global $ost, $cfg, $thisclient, $_FILES;
 
         //Check for 403
         if ($vars['email']  && Validator::is_email($vars['email'])) {
@@ -1811,7 +1811,7 @@ class Ticket{
             //Make sure the email address is not banned
             if(EmailFilter::isBanned($vars['email'])) {
                 $errors['err']='Ticket denied. Error #403';
-                Sys::log(LOG_WARNING,'Ticket denied','Banned email - '.$vars['email']);
+                $ost->logWarning('Ticket denied', 'Banned email - '.$vars['email']);
                 return 0;
             }
 
@@ -1822,8 +1822,9 @@ class Ticket{
                     && ($openTickets>=$cfg->getMaxOpenTickets()) ) {
 
                 $errors['err']="You've reached the maximum open tickets allowed.";
-                Sys::log(LOG_WARNING, 'Ticket denied -'.$vars['email'], 
-                        sprintf('Max open tickets (%d) reached for %s ', $cfg->getMaxOpenTickets(), $vars['email']));
+                $ost->logWarning('Ticket denied -'.$vars['email'], 
+                        sprintf('Max open tickets (%d) reached for %s ', 
+                            $cfg->getMaxOpenTickets(), $vars['email']));
 
                 return 0;
             }
@@ -1832,9 +1833,10 @@ class Ticket{
         if (($email_filter=new EmailFilter($vars))
                 && ($filter=$email_filter->shouldReject())) {
             $errors['err']='Ticket denied. Error #403';
-            Sys::log(LOG_WARNING,'Ticket denied',
-                sprintf('Banned email - %s by filter "%s"', $vars['email'],
-                    $filter->getName()));
+            $ost->logWarning('Ticket denied', 
+                    sprintf('Banned email - %s by filter "%s"', 
+                        $vars['email'], $filter->getName()));
+
             return 0;
         }
 
diff --git a/include/mysql.php b/include/mysql.php
index 47f5ab5c8854e7ce4f6cdea47cd5ebd7dccd2fc4..85be9829966500b99fecb4714cb3be53e09c41ec 100644
--- a/include/mysql.php
+++ b/include/mysql.php
@@ -16,8 +16,6 @@
     vim: expandtab sw=4 ts=4 sts=4:
 **********************************************************************/
 
-    require_once(INCLUDE_DIR.'class.sys.php');
-
     function db_connect($host, $user, $passwd, $db = "") {
         
         //Assert
@@ -53,7 +51,11 @@
 
         return $version;
     }
-    
+
+    function db_timezone() {
+        return db_get_variable('time_zone');
+    }
+
     function db_get_variable($variable, $type='session') {
         $sql =sprintf('SELECT @@%s.%s',$type,$variable);
         return db_result(db_query($sql));
@@ -74,18 +76,18 @@
     }
    
 	// execute sql query
-	function db_query($query, $database="",$conn=""){
-        global $cfg;
+	function db_query($query, $database="", $conn=""){
+        global $ost;
        
 		if($conn) { /* connection is provided*/
-            $result = ($database)?mysql_db_query($database,$query,$conn):mysql_query($query,$conn);
+            $result = ($database)?mysql_db_query($database, $query, $conn):mysql_query($query, $conn);
    	    } else {
-            $result = ($database)?mysql_db_query($database,$query):mysql_query($query);
+            $result = ($database)?mysql_db_query($database, $query):mysql_query($query);
    	    }
                 
-        if(!$result) { //error reporting
+        if(!$result && $ost) { //error reporting
             $alert='['.$query.']'."\n\n".db_error();
-            Sys::log(LOG_ALERT,'DB Error #'.db_errno(),$alert,($cfg && $cfg->alertONSQLError()));
+            $ost->logError('DB Error #'.db_errno(), $alert, ($ost->alertONSQLError()));
             //echo $alert; #uncomment during debuging or dev.
         }
 
diff --git a/include/staff/attachment.inc.php b/include/staff/attachment.inc.php
index 5951b87c0b0788767b34c98d1a7290a7c1debcdd..6027678123ca55684c721ae72f98133135f603f7 100644
--- a/include/staff/attachment.inc.php
+++ b/include/staff/attachment.inc.php
@@ -1,7 +1,7 @@
 <?php
 if(!defined('OSTADMININC') || !$thisstaff->isAdmin()) die('Access Denied');
 //Get the config info.
-$config=($errors && $_POST)?Format::input($_POST):$cfg->getConfig();
+$config=($errors && $_POST)?Format::input($_POST):$cfg->getConfigInfo();
 ?>
 <table width="100%" border="0" cellspacing=0 cellpadding=0>
     <form action="admin.php?t=attach" method="post">
diff --git a/include/staff/header.inc.php b/include/staff/header.inc.php
index 46722948c5aae7309c921623dfeaa57aa2c32a0b..c48ee8b360070be6f82cf74e073f8122aa0ff897 100644
--- a/include/staff/header.inc.php
+++ b/include/staff/header.inc.php
@@ -1,87 +1,88 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-    <?php
-    if(defined('AUTO_REFRESH') && is_numeric(AUTO_REFRESH_RATE) && AUTO_REFRESH_RATE>0){ //Refresh rate
-    echo '<meta http-equiv="refresh" content="'.AUTO_REFRESH_RATE.'" />';
-    }
-    ?>
-    <title>osTicket Staff Control Panel</title>
-    <!--[if IE]>
-    <style type="text/css">
-        .tip_shadow { display:block !important; }
-    </style>
-    <![endif]-->
-    <script type="text/javascript" src="../js/jquery-1.7.2.min.js"></script>
-    <script type="text/javascript" src="../js/jquery-ui-1.8.18.custom.min.js"></script>
-    <script type="text/javascript" src="./js/tips.js"></script>
-    <script type="text/javascript" src="./js/nicEdit.js"></script>
-    <script type="text/javascript" src="./js/bootstrap-typeahead.js"></script>
-    <script type="text/javascript" src="./js/scp.js"></script>
-    <link rel="stylesheet" href="./css/scp.css" media="screen">
-    <link rel="stylesheet" href="./css/typeahead.css" media="screen">
-    <link type="text/css" href="../css/ui-lightness/jquery-ui-1.8.18.custom.css" rel="stylesheet" />   
-</head>
-<body>
-<div id="container">
-    <div id="header">
-        <a href="index.php" id="logo">osTicket - Customer Support System</a>
-        <p id="info">Howdy, <strong><?php echo $thisstaff->getUserName(); ?></strong>
-           <?php
-            if($thisstaff->isAdmin() && !defined('ADMINPAGE')) { ?>
-            | <a href="admin.php">Admin Panel</a>
-            <?php }else{ ?>
-            | <a href="index.php">Staff Panel</a>
-            <?php } ?>
-            | <a href="profile.php">My Preferences</a> | <a href="logout.php">Log Out</a>
-        </p>
-    </div>
-    <ul id="nav">
-        <?php
-        if(($tabs=$nav->getTabs()) && is_array($tabs)){
-            foreach($tabs as $name =>$tab) {
-                echo sprintf('<li class="%s"><a href="%s">%s</a>',$tab['active']?'active':'inactive',$tab['href'],$tab['desc']);
-                if(!$tab['active'] && ($subnav=$nav->getSubMenu($name))){
-                    echo "<ul>\n";
-                    foreach($subnav as $item) {
-                        echo sprintf('<li><a class="%s" href="%s" title="%s" >%s</a></li>',
-                                $item['iconclass'],$item['href'],$item['title'],$item['desc']);
-                    }
-                    echo "\n</ul>\n";
-                }
-                echo "\n</li>\n";
-            }
-        } ?>
-    </ul>
-    <ul id="sub_nav">
-        <?php
-        if(($subnav=$nav->getSubMenu()) && is_array($subnav)){
-            $activeMenu=$nav->getActiveMenu();
-            if($activeMenu>0 && !isset($subnav[$activeMenu-1]))
-                $activeMenu=0;
-            foreach($subnav as $k=> $item) {
-                if($item['droponly']) continue;
-                $class=$item['iconclass'];
-                if ($activeMenu && $k+1==$activeMenu 
-                        or (!$activeMenu 
-                            && (strpos(strtoupper($item['href']),strtoupper(basename($_SERVER['SCRIPT_NAME']))) !== false
-                                or ($item['urls']
-                                    && in_array(basename($_SERVER['SCRIPT_NAME']),$item['urls'])
-                                    )
-                                )))
-                    $class="$class active";
-
-                echo sprintf('<li><a class="%s" href="%s" title="%s" >%s</a></li>',$class,$item['href'],$item['title'],$item['desc']);
-            }
-        }
-        ?>
-    </ul>
-    <div id="content">
-        <?php if($errors['err']) { ?>
-            <div id="msg_error"><?php echo $errors['err']; ?></div>
-        <?php }elseif($msg) { ?>
-            <div id="msg_notice"><?php echo $msg; ?></div>
-        <?php }elseif($warn) { ?>
-            <div id="msg_warning"><?php echo $warn; ?></div>
-        <?php } ?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <title>osTicket Staff Control Panel</title>
+    <!--[if IE]>
+    <style type="text/css">
+        .tip_shadow { display:block !important; }
+    </style>
+    <![endif]-->
+    <script type="text/javascript" src="../js/jquery-1.7.2.min.js"></script>
+    <script type="text/javascript" src="../js/jquery-ui-1.8.18.custom.min.js"></script>
+    <script type="text/javascript" src="./js/tips.js"></script>
+    <script type="text/javascript" src="./js/nicEdit.js"></script>
+    <script type="text/javascript" src="./js/bootstrap-typeahead.js"></script>
+    <script type="text/javascript" src="./js/scp.js"></script>
+    <link rel="stylesheet" href="./css/scp.css" media="screen">
+    <link rel="stylesheet" href="./css/typeahead.css" media="screen">
+    <link type="text/css" href="../css/ui-lightness/jquery-ui-1.8.18.custom.css" rel="stylesheet" />   
+    <?php
+    if($ost && ($headers=$ost->getExtraHeaders())) {
+        echo "\n\t".implode("\n\t", $headers)."\n";
+    }
+    ?>
+</head>
+<body>
+<div id="container">
+    <div id="header">
+        <a href="index.php" id="logo">osTicket - Customer Support System</a>
+        <p id="info">Howdy, <strong><?php echo $thisstaff->getUserName(); ?></strong>
+           <?php
+            if($thisstaff->isAdmin() && !defined('ADMINPAGE')) { ?>
+            | <a href="admin.php">Admin Panel</a>
+            <?php }else{ ?>
+            | <a href="index.php">Staff Panel</a>
+            <?php } ?>
+            | <a href="profile.php">My Preferences</a> | <a href="logout.php">Log Out</a>
+        </p>
+    </div>
+    <ul id="nav">
+        <?php
+        if(($tabs=$nav->getTabs()) && is_array($tabs)){
+            foreach($tabs as $name =>$tab) {
+                echo sprintf('<li class="%s"><a href="%s">%s</a>',$tab['active']?'active':'inactive',$tab['href'],$tab['desc']);
+                if(!$tab['active'] && ($subnav=$nav->getSubMenu($name))){
+                    echo "<ul>\n";
+                    foreach($subnav as $item) {
+                        echo sprintf('<li><a class="%s" href="%s" title="%s" >%s</a></li>',
+                                $item['iconclass'],$item['href'],$item['title'],$item['desc']);
+                    }
+                    echo "\n</ul>\n";
+                }
+                echo "\n</li>\n";
+            }
+        } ?>
+    </ul>
+    <ul id="sub_nav">
+        <?php
+        if(($subnav=$nav->getSubMenu()) && is_array($subnav)){
+            $activeMenu=$nav->getActiveMenu();
+            if($activeMenu>0 && !isset($subnav[$activeMenu-1]))
+                $activeMenu=0;
+            foreach($subnav as $k=> $item) {
+                if($item['droponly']) continue;
+                $class=$item['iconclass'];
+                if ($activeMenu && $k+1==$activeMenu 
+                        or (!$activeMenu 
+                            && (strpos(strtoupper($item['href']),strtoupper(basename($_SERVER['SCRIPT_NAME']))) !== false
+                                or ($item['urls']
+                                    && in_array(basename($_SERVER['SCRIPT_NAME']),$item['urls'])
+                                    )
+                                )))
+                    $class="$class active";
+
+                echo sprintf('<li><a class="%s" href="%s" title="%s" >%s</a></li>',$class,$item['href'],$item['title'],$item['desc']);
+            }
+        }
+        ?>
+    </ul>
+    <div id="content">
+        <?php if($errors['err']) { ?>
+            <div id="msg_error"><?php echo $errors['err']; ?></div>
+        <?php }elseif($msg) { ?>
+            <div id="msg_notice"><?php echo $msg; ?></div>
+        <?php }elseif($warn) { ?>
+            <div id="msg_warning"><?php echo $warn; ?></div>
+        <?php } ?>
+
diff --git a/include/staff/preference.inc.php b/include/staff/preference.inc.php
index 054d592a7555f8d16f436f9cc5c9c66a91b6f27b..6eb27354b0d4cd019964b460b58a3c4b0db1110e 100644
--- a/include/staff/preference.inc.php
+++ b/include/staff/preference.inc.php
@@ -2,7 +2,7 @@
 if(!defined('OSTADMININC') || !$thisstaff->isAdmin()) die('Access Denied');
 
 //Get the config info.
-$config=($errors && $_POST)?Format::input($_POST):Format::htmlchars($cfg->getConfig());
+$config=($errors && $_POST)?Format::input($_POST):Format::htmlchars($cfg->getConfigInfo());
 //Basic checks for warnings...
 $warn=array();
 if($config['allow_attachments'] && !$config['upload_dir']) {
diff --git a/login.php b/login.php
index 48dc9ec4aea9a5ab7c427cacc30b17c8005944b5..823c48a030d494f2b6ae4f06bbbcf35c8de8918d 100644
--- a/login.php
+++ b/login.php
@@ -53,10 +53,10 @@ if($_POST && (!empty($_POST['lemail']) && !empty($_POST['lticket']))):
             $_SESSION['_client']['key']      =$ticket->getExtId(); //Ticket ID --acts as password when used with email. See above.
             $_SESSION['_client']['token']    =$user->getSessionToken();
             $_SESSION['TZ_OFFSET']=$cfg->getTZoffset();
-            $_SESSION['daylight']=$cfg->observeDaylightSaving();
+            $_SESSION['TZ_DST']=$cfg->observeDaylightSaving();
             //Log login info...
             $msg=sprintf("%s/%s logged in [%s]",$ticket->getEmail(),$ticket->getExtId(),$_SERVER['REMOTE_ADDR']);
-            Sys::log(LOG_DEBUG,'User login',$msg);
+            $ost->logDebug('User login', $msg);
             //Redirect tickets.php
             session_write_close();
             session_regenerate_id();
@@ -75,11 +75,11 @@ if($_POST && (!empty($_POST['lemail']) && !empty($_POST['lticket']))):
                 'Email: '.$_POST['lemail']."\n".'Ticket#: '.$_POST['lticket']."\n".
                 'IP: '.$_SERVER['REMOTE_ADDR']."\n".'Time:'.date('M j, Y, g:i a T')."\n\n".
                 'Attempts #'.$_SESSION['_client']['strikes'];
-        Sys::log(LOG_ALERT,'Excessive login attempts (client)',$alert,($cfg->alertONLoginError()));
+        $ost->logError('Excessive login attempts (client)', $alert, ($cfg->alertONLoginError()));
     }elseif($_SESSION['_client']['strikes']%2==0){ //Log every other failed login attempt as a warning.
         $alert='Email: '.$_POST['lemail']."\n".'Ticket #: '.$_POST['lticket']."\n".'IP: '.$_SERVER['REMOTE_ADDR'].
                "\n".'TIME: '.date('M j, Y, g:i a T')."\n\n".'Attempts #'.$_SESSION['_client']['strikes'];
-        Sys::log(LOG_WARNING,'Failed login attempt (client)',$alert);
+        $ost->logWarning('Failed login attempt (client)', $alert);
     }
 endif;
 
diff --git a/main.inc.php b/main.inc.php
index 0bfcf903a91866cd9c046f3d90020e3539cd935a..57769d32c5fc1d55a6b6d4857aa48cc5da8587fb 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -65,7 +65,7 @@
         $configfile=INCLUDE_DIR.'settings.php';
     elseif(file_exists(INCLUDE_DIR.'ost-config.php')) //NEW config file v 1.6 stable ++
         $configfile=INCLUDE_DIR.'ost-config.php';
-    elseif(file_exists(ROOT_DIR.'include/'))
+    elseif(file_exists(ROOT_DIR.'setup/'))
         header('Location: '.ROOT_PATH.'setup/');
 
     if(!$configfile || !file_exists($configfile)) die('<b>Error loading settings. Contact admin.</b>');
@@ -86,10 +86,10 @@
    
 
     #include required files
+    require(INCLUDE_DIR.'class.osticket.php');
     require(INCLUDE_DIR.'class.ostsession.php');
     require(INCLUDE_DIR.'class.usersession.php');
     require(INCLUDE_DIR.'class.pagenate.php'); //Pagenate helper!
-    require(INCLUDE_DIR.'class.sys.php'); //system loader & config & logger.    
     require(INCLUDE_DIR.'class.log.php');
     require(INCLUDE_DIR.'class.mcrypt.php');
     require(INCLUDE_DIR.'class.misc.php');
@@ -158,26 +158,25 @@
     $ferror=null;
     if (!db_connect(DBHOST,DBUSER,DBPASS) || !db_select_database(DBNAME)) {
         $ferror='Unable to connect to the database';
-    }elseif(!($cfg=Sys::getConfig())){
+    } elseif(!($ost=osTicket::start(1)) || !($cfg = $ost->getConfig())) {
         $ferror='Unable to load config info from DB. Get tech support.';
     }
-    if($ferror){ //Fatal error
-        Sys::alertAdmin('osTicket Fatal Error',$ferror); //try alerting admin.
-        die("<b>Fatal Error:</b> Contact system administrator."); //Generic error.
+
+    if($ferror) { //Fatal error
+        //try alerting admin using email in config file
+        $msg=$ferror."\n\n".THISPAGE;
+        Email::sendmail(ADMIN_EMAIL, 'osTicket Fatal Error', $msg, sprintf('"osTicket Alerts"<%s>', ADMIN_EMAIL));
+        //Display generic error to the user
+        die("<b>Fatal Error:</b> Contact system administrator.");
         exit;
     }
+    
     //Init
-    $cfg->init();
+    $session = $ost->getSession();
 
     //System defaults we might want to make global//
     #pagenation default - user can overwrite it!
-    define('DEFAULT_PAGE_LIMIT',$cfg->getPageSize()?$cfg->getPageSize():25);
-
-    //Start session handler!
-    $session=osTicketSession::start(SESSION_TTL); // start_session 
-    //Set default timezone...staff will overwrite it.
-    $_SESSION['TZ_OFFSET']=$cfg->getTZoffset();
-    $_SESSION['daylight']=$cfg->observeDaylightSaving();
+    define('DEFAULT_PAGE_LIMIT', $cfg->getPageSize()?$cfg->getPageSize():25);
 
     #Cleanup magic quotes crap.
     if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
diff --git a/scp/admin.inc.php b/scp/admin.inc.php
index 5f6f5e7633422251ca7bbf8960f69461a8afbc35..89e234e2f13e14204701348fa2222ae195930ea2 100644
--- a/scp/admin.inc.php
+++ b/scp/admin.inc.php
@@ -15,16 +15,16 @@
 **********************************************************************/
 require('staff.inc.php');
 //Make sure config is loaded and the staff is set and of admin type
-if(!$cfg or !$thisstaff or !$thisstaff->isAdmin()){
+if(!$ost or !$thisstaff or !$thisstaff->isAdmin()){
     header('Location: index.php');
     require('index.php'); // just in case!
     exit;
 }
 
 //Some security related warnings - bitch until fixed!!! :)
-if($cfg->isUpgradePending()) {
+if($ost->isUpgradePending()) {
     $errors['err']=$sysnotice='System upgrade is pending <a href="../setup/upgrade.php">Upgrade Now</a>';
-} elseif(!$cfg->isHelpDeskOffline()) {
+} else {
     
     if(file_exists('../setup/')) {
         $sysnotice='Please take a minute to delete <strong>setup/install</strong> directory (../setup/) for security reasons.';
diff --git a/scp/autocron.php b/scp/autocron.php
index 589ea416e85d0ef5524d1bd8d9f28ce590bce0ef..366351c9defedffd2bccd478b1d3c8bd2e349ba4 100644
--- a/scp/autocron.php
+++ b/scp/autocron.php
@@ -35,8 +35,9 @@ require_once(INCLUDE_DIR.'class.cron.php');
 Cron::TicketMonitor(); //Age tickets: We're going to age tickets ever regardless of cron settings. 
 if($cfg && $cfg->enableAutoCron()){ //ONLY fetch tickets if autocron is enabled!
     Cron::MailFetcher();  //Fetch mail.
-    Sys::log(LOG_DEBUG,'Autocron','cron job executed ['.$thisstaff->getUserName().']');
-}    
+    $ost->logDebug('Autocron', 'Cron job executed ['.$thisstaff->getUserName().']');
+} 
+
 $_SESSION['lastcroncall']=time();
 endif;
 $output = ob_get_contents();
diff --git a/scp/logout.php b/scp/logout.php
index e02e4be1609d387d43b3e59d1693a291d80677cb..32d62d14abb29363df9a7da033a1f0873821cbc9 100644
--- a/scp/logout.php
+++ b/scp/logout.php
@@ -15,7 +15,9 @@
     vim: expandtab sw=4 ts=4 sts=4:
 **********************************************************************/
 require('staff.inc.php');
-Sys::log(LOG_DEBUG,'Staff logout',sprintf("%s logged out [%s]",$thisstaff->getUserName(),$_SERVER['REMOTE_ADDR'])); //Debug.
+$ost->logDebug('Staff logout',
+        sprintf("%s logged out [%s]", 
+            $thisstaff->getUserName(), $_SERVER['REMOTE_ADDR'])); //Debug.
 $_SESSION['_staff']=array();
 session_unset();
 session_destroy();
diff --git a/scp/profile.php b/scp/profile.php
index f9dd42a5f19a597e6b40c0e68774dce58d2a4a02..e6506fa6ece8bd0686550cae4810e17a2c76cd6f 100644
--- a/scp/profile.php
+++ b/scp/profile.php
@@ -29,7 +29,7 @@ if(!$errors && $_POST) { //Handle post
         $thisstaff->reload();
         $staff->reload();
         $_SESSION['TZ_OFFSET']=$thisstaff->getTZoffset();
-        $_SESSION['daylight']=$thisstaff->observeDaylight();
+        $_SESSION['TZ_DST']=$thisstaff->observeDaylight();
     }elseif(!$errors['err'])
         $errors['err']='Profile update error. Try correcting the errors below and try again!';
 }
diff --git a/scp/settings.php b/scp/settings.php
index d7809d63751039c61639efd448c5718a888cb7ac..9058fe42ca52c4f9b428bbc52f2ed2cb61f80a8a 100644
--- a/scp/settings.php
+++ b/scp/settings.php
@@ -57,7 +57,7 @@ require(STAFFINC_DIR.'header.inc.php');
     </form>
 </div>
 <?php
-$config=($errors && $_POST)?Format::input($_POST):Format::htmlchars($cfg->getConfig());
+$config=($errors && $_POST)?Format::input($_POST):Format::htmlchars($cfg->getConfigInfo());
 include_once(STAFFINC_DIR."settings-$target.inc.php");
 include_once(STAFFINC_DIR.'footer.inc.php');
 ?>
diff --git a/scp/staff.inc.php b/scp/staff.inc.php
index 7a4dfb9e3a596fcc480894c60ecf2bede2304181..a28cf1d63a288ad39697527bd10c7d4fbbd28611 100644
--- a/scp/staff.inc.php
+++ b/scp/staff.inc.php
@@ -71,7 +71,7 @@ if(!$thisstaff->isAdmin()) {
     }
 
     //Staff are not allowed to login in offline mode!!
-    if($cfg->isHelpDeskOffline() || $cfg->isUpgradePending()) {
+    if(!$ost->isSystemOffline() || $ost->isUpgradePending()) {
         staffLoginPage('System Offline');
         exit;
     }
@@ -83,17 +83,16 @@ $thisstaff->refreshSession();
 /******* SET STAFF DEFAULTS **********/
 //Set staff's timezone offset.
 $_SESSION['TZ_OFFSET']=$thisstaff->getTZoffset();
-$_SESSION['daylight']=$thisstaff->observeDaylight();
+$_SESSION['TZ_DST']=$thisstaff->observeDaylight();
 
-define('AUTO_REFRESH_RATE',$thisstaff->getRefreshRate()*60);
-define('PAGE_LIMIT',$thisstaff->getPageLimit()?$thisstaff->getPageLimit():DEFAULT_PAGE_LIMIT);
+define('PAGE_LIMIT', $thisstaff->getPageLimit()?$thisstaff->getPageLimit():DEFAULT_PAGE_LIMIT);
 
 //Clear some vars. we use in all pages.
 $errors=array();
 $msg=$warn=$sysnotice='';
 $tabs=array();
 $submenu=array();
-if($cfg->isUpgradePending()) {
+if($ost->isUpgradePending()) {
     $errors['err']=$sysnotice='System upgrade is pending <a href="../setup/upgrade.php">Upgrade Now</a>';
 } elseif($cfg->isHelpDeskOffline()) {
     $sysnotice='<strong>System is set to offline mode</strong> - Client interface is disabled and ONLY admins can access staff control panel.';
diff --git a/scp/tickets.php b/scp/tickets.php
index 567c3f69755525aca1146ce8433a44e2485c6fc3..03b95b3f71e8d8c972a40f036007173adc565d79 100644
--- a/scp/tickets.php
+++ b/scp/tickets.php
@@ -485,7 +485,7 @@ if($ticket) {
 
     //set refresh rate if the user has it configured
     if(!$_POST && $_REQUEST['a']!='search'  && ($min=$thisstaff->getRefreshRate()))
-        define('AUTO_REFRESH', $min*60); 
+        $ost->addExtraHeader('<meta http-equiv="refresh" content="'.($min*60).'" />');
 }
 
 require_once(STAFFINC_DIR.'header.inc.php');
diff --git a/setup/inc/class.upgrader.php b/setup/inc/class.upgrader.php
index 73af7e6066cddf41140d7bd6f2c2618431dfe83f..891d472d9264a78501bac8ec6d7a4d28abf8553c 100644
--- a/setup/inc/class.upgrader.php
+++ b/setup/inc/class.upgrader.php
@@ -50,8 +50,9 @@ class Upgrader extends SetupWizard {
     }
 
     function onError($error) {
+        global $ost;
 
-        Sys::log(LOG_ERR, 'Upgrader Error', $error);
+        $ost->logError('Upgrader Error', $error);
         $this->setError($error);
         $this->setState('aborted');
     }
@@ -191,6 +192,7 @@ class Upgrader extends SetupWizard {
     }
     
     function upgrade() {
+        global $ost;
 
         if($this->getPendingTasks() || !($patches=$this->getPatches()))
             return false;
@@ -209,7 +211,7 @@ class Upgrader extends SetupWizard {
             if(($info = $this->readPatchInfo($patch)) && $info['version'])
                 $logMsg.= ' ('.$info['version'].') ';
 
-            Sys::log(LOG_DEBUG, 'Upgrader - Patch applied', $logMsg);
+            $ost->logDebug('Upgrader - Patch applied', $logMsg);
             
             //Check if the said patch has scripted tasks
             if(!($tasks=$this->getTasksForPatch($phash)))
diff --git a/setup/p.php b/setup/p.php
index babeebb866f198e7fc78516a34133164d72a9b47..51c7055f257559099fd600ef12c31e882605873d 100644
--- a/setup/p.php
+++ b/setup/p.php
@@ -41,19 +41,19 @@ if(!$_SESSION['ost_upgrader'][$upgrader->getShash()]['progress']) {
 }
 
 if($upgrader->getNumPendingTasks()) {
-    if($upgrader->doTasks() && !$upgrader->getNumPendingTasks() && $cfg->isUpgradePending()) {
+    if($upgrader->doTasks() && !$upgrader->getNumPendingTasks() && $ost->isUpgradePending()) {
         //Just reporting done...with tasks - break in between patches!
         header("HTTP/1.1 304 Not Modified");
         exit;
     }
-} elseif($cfg->isUpgradePending() && $upgrader->isUpgradable()) {
+} elseif($ost->isUpgradePending() && $upgrader->isUpgradable()) {
     $version = $upgrader->getNextVersion();
     if($upgrader->upgrade()) {
         //We're simply reporting progress here - call back will report next action'
         Http::response(200, "Upgraded to $version ... post-upgrade checks!");
         exit;
     }
-} elseif(!$cfg->isUpgradePending()) {
+} elseif(!$ost->isUpgradePending()) {
     $upgrader->setState('done');
     session_write_close();
     header("HTTP/1.1 304 Not Modified");
diff --git a/setup/upgrade.php b/setup/upgrade.php
index 0406383707cfe245fd11aae9323ee1422d6d679e..e5fd21084ccb534167d681ee6288793d5a683296 100644
--- a/setup/upgrade.php
+++ b/setup/upgrade.php
@@ -48,7 +48,7 @@ if($_POST && $_POST['s'] && !$upgrader->isAborted()) {
     switch(strtolower($_POST['s'])) {
         case 'prereq':
             //XXX: check if it's upgradable version??
-            if(!$cfg->isUpgradePending())
+            if(!$ost->isUpgradePending())
                 $errors['err']=' Nothing to do! System already upgraded to the current version';
             elseif(!$upgrader->isUpgradable())
                 $errors['err']='The upgrader does NOT support upgrading from the current vesion!';
@@ -60,9 +60,9 @@ if($_POST && $_POST['s'] && !$upgrader->isAborted()) {
         case 'upgrade': //Manual upgrade.... when JS (ajax) is not supported.
             if($upgrader->getNumPendingTasks()) {
                 $upgrader->doTasks();
-            } elseif($cfg->isUpgradePending() && $upgrader->isUpgradable()) {
+            } elseif($ost->isUpgradePending() && $upgrader->isUpgradable()) {
                 $upgrader->upgrade();
-            } elseif(!$cfg->isUpgradePending()) {
+            } elseif(!$ost->isUpgradePending()) {
                 $upgrader->setState('done');
             }
 
@@ -89,7 +89,7 @@ switch(strtolower($upgrader->getState())) {
         $inc='upgrade-prereq.inc.php';
         if($upgrader->isAborted())
             $inc='upgrade-aborted.inc.php';
-        elseif(!$cfg->isUpgradePending())
+        elseif(!$ost->isUpgradePending())
             $errors['err']='Nothing to do! System already upgraded to the latest version';
         elseif(!$upgrader->isUpgradable())
             $errors['err']='The upgrader does NOT support upgrading from the current vesion!';