diff --git a/include/ajax.upgrader.php b/include/ajax.upgrader.php
index fa0b50a99c9c8271caf96e927c6032bbde4b9eee..b04dfca4f3f429ef73536fccc9929fda33e797c2 100644
--- a/include/ajax.upgrader.php
+++ b/include/ajax.upgrader.php
@@ -25,7 +25,7 @@ class UpgraderAjaxAPI extends AjaxController {
         if(!$thisstaff or !$thisstaff->isAdmin() or !$ost)
             Http::response(403, 'Access Denied');
 
-        $upgrader = new Upgrader($ost->getDBSignature(), TABLE_PREFIX, PATCH_DIR);
+        $upgrader = new Upgrader($ost->getDBSignature(), TABLE_PREFIX, SQL_DIR);
 
         //Just report the next action on the first call.
         if(!$_SESSION['ost_upgrader'] || !$_SESSION['ost_upgrader'][$upgrader->getShash()]['progress']) {
@@ -43,12 +43,17 @@ class UpgraderAjaxAPI extends AjaxController {
             //More pending tasks - doTasks returns the number of pending tasks
             Http::response(200, $upgrader->getNextAction());
             exit;
-        } 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($ost->isUpgradePending()) {
+            if($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;
+                }
+            } else { 
+                //Abort: Upgrade pending but NOT upgradable - invalid or wrong hash.
+                $upgrader->abort(sprintf('Upgrade Failed: Invalid or wrong hash [%s]',$ost->getDBSignature()));
             }
         } elseif(!$ost->isUpgradePending()) {
             $upgrader->setState('done');
diff --git a/include/class.dept.php b/include/class.dept.php
index 5a2babdd3da4021a7b81c736a79210fdf11f1d97..5516646129b348de5eba208d005c8ab87d2f4145 100644
--- a/include/class.dept.php
+++ b/include/class.dept.php
@@ -19,6 +19,9 @@ class Dept {
     var $email;
     var $sla;
     var $manager; 
+    var $members;
+    var $groups;
+
     var $ht;
   
     function Dept($id){
@@ -47,7 +50,7 @@ class Dept {
         $this->id=$this->ht['dept_id'];
         $this->email=$this->sla=$this->manager=null;
         $this->getEmail(); //Auto load email struct.
-        $this->members=array();
+        $this->members=$this->groups=array();
 
         return true;
     }
@@ -81,30 +84,39 @@ class Dept {
         return $this->ht['users'];
     }
 
-    function getNumMembers(){
-        return $this->getNumStaff();
-    }
-
+     
     function getNumUsers(){
         return $this->getNumStaff();
     }
 
-    function getAvailableMembers(){
-
-        if(!$this->members && $this->getNumStaff()){
-            $sql='SELECT m.staff_id FROM '.STAFF_TABLE.' m '
-                .'WHERE m.dept_id='.db_input($this->getId())
-                .' AND m.staff_id IS NOT NULL '
-                .'ORDER BY m.lastname, m.firstname';
-            if(($res=db_query($sql)) && db_num_rows($res)){
+    function getNumMembers(){
+        return count($this->getMembers());
+    }
+
+    function getMembers() {
+
+        if(!$this->members) {
+            $this->members = array();
+            $sql='SELECT DISTINCT s.staff_id FROM '.STAFF_TABLE.' s '
+                .' LEFT JOIN '.GROUP_DEPT_TABLE.' g ON(s.group_id=g.group_id) '
+                .' INNER JOIN '.DEPT_TABLE.' d 
+                       ON(d.dept_id=s.dept_id 
+                            OR d.manager_id=s.staff_id 
+                            OR (d.dept_id=g.dept_id AND d.group_membership=1)
+                        ) '
+                .' WHERE d.dept_id='.db_input($this->getId())
+                .' ORDER BY s.lastname, s.firstname';
+           
+            if(($res=db_query($sql)) && db_num_rows($res)) {
                 while(list($id)=db_fetch_row($res))
-                    if(($staff=Staff::lookup($id)) && $staff->isAvailable())
-                        $this->members[]= $staff;
+                    $this->members[] = Staff::lookup($id);
             }
         }
+
         return $this->members;
     }
 
+
     function getSLAId(){
         return $this->ht['sla_id'];
     }
@@ -179,6 +191,11 @@ class Dept {
     function noreplyAutoResp(){
          return ($this->ht['noreply_autoresp']);
     }
+
+
+    function isGroupMembershipEnabled() {
+        return ($this->ht['group_membership']);
+    }
    
     function getHashtable() {
         return $this->ht;
@@ -188,14 +205,53 @@ class Dept {
         return $this->getHashtable();
     }
 
-    function update($vars,&$errors){
 
-        if($this->save($this->getId(),$vars,$errors)) {
-            $this->reload();
-            return true;
+      
+    function getAllowedGroups() {
+
+        if($this->groups) return $this->groups;
+
+        $sql='SELECT group_id FROM '.GROUP_DEPT_TABLE
+            .' WHERE dept_id='.db_input($this->getId());
+
+        if(($res=db_query($sql)) && db_num_rows($res)) {
+            while(list($id)=db_fetch_row($res))
+                $this->groups[] = $id;
         }
 
-        return false;
+        return $this->groups;
+    }
+
+    function updateAllowedGroups($groups) {
+
+        if($groups && is_array($groups)) {
+            foreach($groups as $k=>$id) {
+                $sql='INSERT IGNORE INTO '.GROUP_DEPT_TABLE
+                    .' SET dept_id='.db_input($this->getId()).', group_id='.db_input($id);
+                db_query($sql);
+            }
+        }
+
+            
+        $sql='DELETE FROM '.GROUP_DEPT_TABLE.' WHERE dept_id='.db_input($this->getId());
+        if($groups && is_array($groups))  
+            $sql.=' AND group_id NOT IN('.implode(',', db_input($groups)).')';
+
+        db_query($sql);
+
+        return true;
+
+    }
+
+    function update($vars,&$errors){
+
+        if(!$this->save($this->getId(),$vars,$errors))
+            return false;
+
+        $this->updateAllowedGroups($vars['groups']);
+        $this->reload();
+        
+        return true;
     }
 
     function delete() {
@@ -214,7 +270,8 @@ class Dept {
             db_query('UPDATE '.STAFF_TABLE.' SET dept_id='.db_input($cfg->getDefaultDeptId()).' WHERE dept_id='.db_input($id));
             //make help topic using the dept default to default-dept.
             db_query('UPDATE '.TOPIC_TABLE.' SET dept_id='.db_input($cfg->getDefaultDeptId()).' WHERE dept_id='.db_input($id));
-            
+            //Delete group access
+            db_query('DELETE FROM '.GROUP_DEPT_TABLE.' WHERE dept_id='.db_input($id));
         }
 
         return $num;
@@ -267,7 +324,10 @@ class Dept {
     }
 
     function create($vars,&$errors) {
-        return Dept::save(0,$vars,$errors);
+        if(($id=self::save(0, $vars, $errors)) && ($dept=self::lookup($id)))
+            $dept->updateAllowedGroups($vars['groups']);
+
+        return $id;
     }
 
     function save($id,$vars,&$errors) {
@@ -305,6 +365,7 @@ class Dept {
             .' ,manager_id='.db_input($vars['manager_id']?$vars['manager_id']:0)
             .' ,dept_name='.db_input(Format::striptags($vars['name']))
             .' ,dept_signature='.db_input(Format::striptags($vars['signature']))
+            .' ,group_membership='.db_input(isset($vars['group_membership'])?1:0)
             .' ,ticket_auto_response='.db_input(isset($vars['ticket_auto_response'])?$vars['ticket_auto_response']:1)
             .' ,message_auto_response='.db_input(isset($vars['message_auto_response'])?$vars['message_auto_response']:1);
 
diff --git a/include/class.group.php b/include/class.group.php
index 1b21dce29e4511b469c8dfb70386e7e940626d48..b13082be9f24301e12bf298cac0d043f86b7f8d1 100644
--- a/include/class.group.php
+++ b/include/class.group.php
@@ -19,13 +19,19 @@ class Group {
     var $id;
     var $ht;
 
+    var $members;
+    var $departments;
+
     function Group($id){
 
         $this->id=0;
         return $this->load($id);
     }
 
-    function load($id){
+    function load($id=0) {
+
+        if(!$id && !($id=$this->getId()))
+            return false;
 
         $sql='SELECT grp.*,grp.group_name as name, grp.group_enabled as isactive, count(staff.staff_id) as users '
             .'FROM '.GROUP_TABLE.' grp '
@@ -37,12 +43,13 @@ class Group {
         $this->ht=db_fetch_array($res);
         $this->id=$this->ht['group_id'];
         $this->members=array();
+        $this->departments = array();
 
         return $this->id;
     }
 
     function reload(){
-        return $this->load($this->getId());
+        return $this->load();
     }
 
     function getHashtable() {
@@ -73,17 +80,86 @@ class Group {
     function isActive(){
         return $this->isEnabled();
     }
+ 
+    //Get members of the group.
+    function getMembers() {
+
+        if(!$this->members && $this->getNumUsers()) {
+            $sql='SELECT staff_id FROM '.STAFF_TABLE
+                .' WHERE group_id='.db_input($this->getId())
+                .' ORDER BY lastname, firstname';
+            if(($res=db_query($sql)) && db_num_rows($res)) {
+                while(list($id)=db_fetch_row($res))
+                    if(($staff=Staff::lookup($id)))
+                        $this->members[]= $staff;
+            }
+        }
+
+        return $this->members;
+    }
 
+    //Get departments the group is allowed to access.
+    function getDepartments() {
 
+        if(!$this->departments) {
+            $sql='SELECT dept_id FROM '.GROUP_DEPT_TABLE
+                .' WHERE group_id='.db_input($this->getId());
+            if(($res=db_query($sql)) && db_num_rows($res)) {
+                while(list($id)=db_fetch_row($res))
+                    $this->departments[]= $id;
+            }
+        }
+
+        return $this->departments;
+    }
+
+        
+    function updateDeptAccess($depts) {
 
-    function update($vars,&$errors) {
 
-        if(Group::save($this->getId(),$vars,$errors)){
-            $this->reload();
-            return true;
+        if($depts && is_array($depts)) {
+            foreach($depts as $k=>$id) {
+                $sql='INSERT IGNORE INTO '.GROUP_DEPT_TABLE
+                    .' SET group_id='.db_input($this->getId())
+                    .', dept_id='.db_input($id);
+                db_query($sql);
+            }
         }
 
-        return false;
+        $sql='DELETE FROM '.GROUP_DEPT_TABLE.' WHERE group_id='.db_input($this->getId());
+        if($depts && is_array($depts)) // just inserted departments IF any.
+            $sql.=' AND dept_id NOT IN('.implode(',', db_input($depts)).')';
+
+        db_query($sql);
+
+        return true;
+    }
+
+    function update($vars,&$errors) {
+
+        if(!Group::save($this->getId(),$vars,$errors))
+            return false;
+
+        $this->updateDeptAccess($vars['depts']);
+        $this->reload();
+        
+        return true;
+    }
+
+    function delete() {
+
+        //Can't delete with members
+        if($this->getNumUsers())
+            return false;
+
+        $res = db_query('DELETE FROM '.GROUP_TABLE.' WHERE group_id='.db_input($this->getId()).' LIMIT 1');
+        if(!$res || !db_affected_rows($res))
+            return false;
+
+        //Remove dept access entry.
+        db_query('DELETE FROM '.GROUP_DEPT_TABLE.' WHERE group_id='.db_input($this->getId()));
+
+        return true;
     }
 
     /*** Static functions ***/
@@ -99,9 +175,11 @@ class Group {
         return ($id && is_numeric($id) && ($g= new Group($id)) && $g->getId()==$id)?$g:null;
     }
 
+    function create($vars, &$errors) { 
+        if(($id=self::save(0,$vars,$errors)) && ($group=self::lookup($id)))
+            $group->updateDeptAccess($vars['depts']);
 
-    function create($vars,&$errors) { 
-        return self::save(0,$vars,$errors);
+        return $id;
     }
 
     function save($id,$vars,&$errors) {
@@ -119,19 +197,19 @@ class Group {
         
         if($errors) return false;
             
-        $sql=' SET updated=NOW(), group_name='.db_input(Format::striptags($vars['name'])).
-             ', group_enabled='.db_input($vars['isactive']).
-             ', dept_access='.db_input($vars['depts']?implode(',',$vars['depts']):'').
-             ', can_create_tickets='.db_input($vars['can_create_tickets']).
-             ', can_delete_tickets='.db_input($vars['can_delete_tickets']).
-             ', can_edit_tickets='.db_input($vars['can_edit_tickets']).
-             ', can_assign_tickets='.db_input($vars['can_assign_tickets']).
-             ', can_transfer_tickets='.db_input($vars['can_transfer_tickets']).
-             ', can_close_tickets='.db_input($vars['can_close_tickets']).
-             ', can_ban_emails='.db_input($vars['can_ban_emails']).
-             ', can_manage_premade='.db_input($vars['can_manage_premade']).
-             ', can_manage_faq='.db_input($vars['can_manage_faq']).
-             ', notes='.db_input($vars['notes']);
+        $sql=' SET updated=NOW() '
+            .', group_name='.db_input(Format::striptags($vars['name']))
+            .', group_enabled='.db_input($vars['isactive'])
+            .', can_create_tickets='.db_input($vars['can_create_tickets'])
+            .', can_delete_tickets='.db_input($vars['can_delete_tickets'])
+            .', can_edit_tickets='.db_input($vars['can_edit_tickets'])
+            .', can_assign_tickets='.db_input($vars['can_assign_tickets'])
+            .', can_transfer_tickets='.db_input($vars['can_transfer_tickets'])
+            .', can_close_tickets='.db_input($vars['can_close_tickets'])
+            .', can_ban_emails='.db_input($vars['can_ban_emails'])
+            .', can_manage_premade='.db_input($vars['can_manage_premade'])
+            .', can_manage_faq='.db_input($vars['can_manage_faq'])
+            .', notes='.db_input($vars['notes']);
             
         if($id) {
             
diff --git a/include/class.staff.php b/include/class.staff.php
index b95329fa69c3191c69fdc65006785fc420ff2ed0..b607f6eac145aa7e7c13547218d936f7662ceb8a 100644
--- a/include/class.staff.php
+++ b/include/class.staff.php
@@ -25,6 +25,8 @@ class Staff {
     var $id;
 
     var $dept;
+    var $departments;
+    var $group;
     var $teams;
     var $timezone;
     var $stats;
@@ -51,8 +53,9 @@ class Staff {
         
         $this->ht=db_fetch_array($res);
         $this->id  = $this->ht['staff_id'];
-        $this->teams = $this->ht['teams']= array();
-        $this->stats=array();
+        $this->teams = $this->ht['teams'] = array();
+        $this->group = $this->dept = null;
+        $this->departments = $this->stats = array();
 
         //WE have to patch info here to support upgrading from old versions.
         if(($time=strtotime($this->ht['passwdreset']?$this->ht['passwdreset']:$this->ht['added'])))
@@ -154,10 +157,6 @@ class Staff {
         return $this->ht['lastname'];
     }
     
-    function getGroupId() {
-        return $this->ht['group_id'];
-    }
-
     function getSignature() {
         return $this->ht['signature'];
     }
@@ -174,13 +173,46 @@ class Staff {
         return ($this->ht['change_passwd']);
     }
 
+    function getDepartments() {
+
+        if($this->departments)
+            return $this->departments;
+
+        //Departments the staff is "allowed" to access...
+        // based on the group they belong to + user's primary dept + user's managed depts.
+        $sql='SELECT DISTINCT d.dept_id FROM '.STAFF_TABLE.' s '
+            .' LEFT JOIN '.GROUP_DEPT_TABLE.' g ON(s.group_id=g.group_id) '
+            .' INNER JOIN '.DEPT_TABLE.' d ON(d.dept_id=s.dept_id OR d.manager_id=s.staff_id OR d.dept_id=g.dept_id) '
+            .' WHERE s.staff_id='.db_input($this->getId());
+
+        $depts = array();
+        if(($res=db_query($sql)) && db_num_rows($res)) {
+            while(list($id)=db_fetch_row($res))
+                $depts[] = $id;
+        } else { //Neptune help us! (fallback)
+            $depts = array_merge($this->getGroup()->getDepartments(), array($this->getDeptId()));
+        }
+
+        $this->departments = array_filter(array_unique($depts));
+
+
+        return $this->departments;
+    }
+
     function getDepts() {
-        //Departments the user is allowed to access...based on the group they belong to + user's dept.
-        return array_filter(array_unique(array_merge(explode(',', $this->ht['dept_access']), array($this->getDeptId())))); //Neptune help us
+        return $this->getDepartments();
+    }
+     
+    function getGroupId() {
+        return $this->ht['group_id'];
     }
 
-    function getDepartments() {
-        return $this->getDepts();
+    function getGroup() {
+     
+        if(!$this->group && $this->getGroupId())
+            $this->group = Group::lookup($this->getGroupId());
+
+        return $this->group;
     }
 
     function getDeptId() {
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 7e53ec51bd10247932fbd6e416e4afed1939deee..683ab25c46e69e83e0150baee01c329e90c5f7e4 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -866,7 +866,7 @@ class Ticket{
               
             //Only alerts dept members if the ticket is NOT assigned.
             if($cfg->alertDeptMembersONNewTicket() && !$this->isAssigned()) {
-                if(($members=$dept->getAvailableMembers()))
+                if(($members=$dept->getMembers()))
                     $recipients=array_merge($recipients, $members);
             }
             
@@ -877,6 +877,7 @@ class Ticket{
                 if(!is_object($staff) || !$staff->isAvailable() || in_array($staff->getEmail(),$sentlist)) continue;
                 $alert = str_replace("%staff",$staff->getFirstName(),$body);
                 $email->send($staff->getEmail(),$subj,$alert);
+                $sentlist[] = $staff->getEmail();
             }
            
            
@@ -1029,8 +1030,8 @@ class Ticket{
                 if(!is_object($staff) || !$staff->isAvailable() || in_array($staff->getEmail(),$sentlist)) continue;
                 $alert = str_replace('%staff', $staff->getFirstName(), $body);
                 $email->send($staff->getEmail(), $subj, $alert);
+                $sentlist[] = $staff->getEmail();
             }
-            print_r($sentlist);
         }
 
         return true;
@@ -1072,7 +1073,7 @@ class Ticket{
                     $recipients=array_merge($recipients, $members);
             } elseif($cfg->alertDeptMembersONOverdueTicket() && !$this->isAssigned()) {
                 //Only alerts dept members if the ticket is NOT assigned.
-                if(($members=$dept->getAvailableMembers()))
+                if(($members=$dept->getMembers()))
                     $recipients=array_merge($recipients, $members);
             }
             //Always alert dept manager??
@@ -1084,6 +1085,7 @@ class Ticket{
                 if(!is_object($staff) || !$staff->isAvailable() || in_array($staff->getEmail(),$sentlist)) continue;
                 $alert = str_replace("%staff",$staff->getFirstName(),$body);
                 $email->send($staff->getEmail(),$subj,$alert);
+                $sentlist[] = $staff->getEmail();
             }
 
         }
@@ -1200,7 +1202,7 @@ class Ticket{
                     $recipients+=$members;
             } elseif($cfg->alertDeptMembersONTransfer() && !$this->isAssigned()) {
                 //Only alerts dept members if the ticket is NOT assigned.
-                if(($members=$dept->getAvailableMembers()))
+                if(($members=$dept->getMembers()))
                     $recipients+=$members;
             }
 
@@ -1213,6 +1215,7 @@ class Ticket{
                 if(!is_object($staff) || !$staff->isAvailable() || in_array($staff->getEmail(),$sentlist)) continue;
                 $alert = str_replace("%staff",$staff->getFirstName(),$body);
                 $email->send($staff->getEmail(),$subj,$alert);
+                $sentlist[] = $staff->getEmail();
             }
          }
 
@@ -1361,7 +1364,7 @@ class Ticket{
                 if(!$staff || !$staff->getEmail() || !$staff->isAvailable() && in_array($staff->getEmail(),$sentlist)) continue;
                 $alert = str_replace("%staff",$staff->getFirstName(),$body);
                 $email->send($staff->getEmail(),$subj,$alert);
-                $sentlist[]=$staff->getEmail();
+                $sentlist[] = $staff->getEmail();
             }
         }
         
@@ -1544,7 +1547,7 @@ class Ticket{
                 if(in_array($staff->getEmail(),$sentlist) || ($thisstaff && $thisstaff->getId()==$staff->getId())) continue; 
                 $alert = str_replace('%staff',$staff->getFirstName(),$body);
                 $email->send($staff->getEmail(),$subj,$alert);
-                $sentlist[]=$staff->getEmail();
+                $sentlist[] = $staff->getEmail();
             }
         }
         
diff --git a/include/class.upgrader.php b/include/class.upgrader.php
index 4487e53b26844c8094b72406c5f739cb67702bf3..b08d319d8db65eb1dcd267e8ec43eb037d470bf1 100644
--- a/include/class.upgrader.php
+++ b/include/class.upgrader.php
@@ -275,17 +275,21 @@ class Upgrader extends SetupWizard {
                                  'desc' => 'Transitioning to db-backed sessions');
                 break;
             case '98ae1ed2-e342f869': //v1.6 RC1-4 -> v1.6 RC5
-                $task[] = array('func' => 'migrateAPIKeys',
-                                'desc' => 'Migrating API keys to a new table');
+                $tasks[] = array('func' => 'migrateAPIKeys',
+                                 'desc' => 'Migrating API keys to a new table');
+                break;
+            case '435c62c3-2e7531a2':
+                $tasks[] = array('func' => 'migrateGroupDeptAccess',
+                                 'desc' => 'Migrating group\'s department access to a new table');
                 break;
         }
 
-        //Check IF SQL cleanup is exists. 
+        //Check IF SQL cleanup exists. 
         $file=$this->getSQLDir().$phash.'.cleanup.sql';
         if(file_exists($file)) 
-            $tasks[] = array('func' => 'cleanup', 'desc' => 'Post-upgrade cleanup!',
-                        'phash' => $phash);
-
+            $tasks[] = array('func' => 'cleanup',
+                             'desc' => 'Post-upgrade cleanup!',
+                             'phash' => $phash);
 
         return $tasks;
     }
@@ -336,7 +340,7 @@ class Upgrader extends SetupWizard {
 
         list($whitelist, $key) = db_fetch_row($res);
 
-        $ips=array_filter(explode(',', ereg_replace(' ', '', $whitelist)));
+        $ips=array_filter(array_map('trim', explode(',', $whitelist)));
         foreach($ips as $ip) {
             $sql='INSERT INTO '.API_KEY_TABLE.' SET created=NOW(), updated=NOW(), isactive=1 '
                 .',ipaddr='.db_input($ip)
@@ -346,5 +350,26 @@ class Upgrader extends SetupWizard {
 
         return 0;
     }
+
+    function migrateGroupDeptAccess($taskId) {
+
+        $res = db_query('SELECT group_id, dept_access FROM '.GROUP_TABLE);
+        if(!$res || !db_num_rows($res))
+            return 0;  //No groups??
+
+        while(list($groupId, $access) = db_fetch_row($res)) {
+            $depts=array_filter(array_map('trim', explode(',', $access)));
+            foreach($depts as $deptId) {
+                $sql='INSERT INTO '.GROUP_DEPT_TABLE
+                    .' SET dept_id='.db_input($deptId).', group_id='.db_input($groupId);
+                db_query($sql);
+            }
+        }
+
+        return 0;
+
+
+
+    }
 }
 ?>
diff --git a/include/mysql.php b/include/mysql.php
index 06489242a71d78d7e8fae590ed8960ddfa74dee8..65adb6298a632ebe0d8c0a127d2c0af8982bf546 100644
--- a/include/mysql.php
+++ b/include/mysql.php
@@ -38,12 +38,12 @@
         return $dblink;	
     }
 
-    function db_close(){
+    function db_close() {
         global $dblink;
         return @mysql_close($dblink);
     }
 
-    function db_version(){
+    function db_version() {
 
         $version=0;
         if(preg_match('/(\d{1,2}\.\d{1,2}\.\d{1,2})/', 
@@ -59,7 +59,7 @@
     }
 
     function db_get_variable($variable, $type='session') {
-        $sql =sprintf('SELECT @@%s.%s',$type,$variable);
+        $sql =sprintf('SELECT @@%s.%s', $type, $variable);
         return db_result(db_query($sql));
     }
 
@@ -74,112 +74,105 @@
     }
 
     function db_create_database($database, $charset='utf8', $collate='utf8_unicode_ci') {
-        return @mysql_query(sprintf('CREATE DATABASE %s DEFAULT CHARACTER SET %s COLLATE %s',$database,$charset,$collate));
+        return @mysql_query(sprintf('CREATE DATABASE %s DEFAULT CHARACTER SET %s COLLATE %s', $database, $charset, $collate));
     }
    
 	// execute sql query
-	function db_query($query, $database="", $conn=""){
+	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);
+            $res = ($database)?mysql_db_query($database, $query, $conn):mysql_query($query, $conn);
    	    } else {
-            $result = ($database)?mysql_db_query($database, $query):mysql_query($query);
+            $res = ($database)?mysql_db_query($database, $query):mysql_query($query);
    	    }
                 
-        if(!$result && $ost) { //error reporting
+        if(!$res && $ost) { //error reporting
             $msg='['.$query.']'."\n\n".db_error();
             $ost->logDBError('DB Error #'.db_errno(), $msg);
             //echo $msg; #uncomment during debuging or dev.
         }
 
-        return $result;
+        return $res;
 	}
 
-	function db_squery($query){ //smart db query...utilizing args and sprintf
+	function db_squery($query) { //smart db query...utilizing args and sprintf
 	
 		$args  = func_get_args();
   		$query = array_shift($args);
   		$query = str_replace("?", "%s", $query);
   		$args  = array_map('db_real_escape', $args);
-  		array_unshift($args,$query);
-  		$query = call_user_func_array('sprintf',$args);
+  		array_unshift($args, $query);
+  		$query = call_user_func_array('sprintf', $args);
 		return db_query($query);
 	}
 
-	function db_count($query){		
+	function db_count($query) {		
         return db_result(db_query($query));
 	}
 
-    function db_result($result,$row=0) {
-        return ($result)?mysql_result($result,$row):NULL;
+    function db_result($res, $row=0) {
+        return ($res)?mysql_result($res, $row):NULL;
     }
 
-	function db_fetch_array($result,$mode=false) {
-   	    return ($result)?db_output(mysql_fetch_array($result,($mode)?$mode:MYSQL_ASSOC)):NULL;
+	function db_fetch_array($res, $mode=false) {
+   	    return ($res)?db_output(mysql_fetch_array($res, ($mode)?$mode:MYSQL_ASSOC)):NULL;
   	}
 
-    function db_fetch_row($result) {
-        return ($result)?db_output(mysql_fetch_row($result)):NULL;
+    function db_fetch_row($res) {
+        return ($res)?db_output(mysql_fetch_row($res)):NULL;
     }
 
-    function db_fetch_field($result) {
-        return ($result)?mysql_fetch_field($result):NULL;
+    function db_fetch_field($res) {
+        return ($res)?mysql_fetch_field($res):NULL;
     }   
 
-    function db_assoc_array($result,$mode=false) {
-	    if($result && db_num_rows($result)) {
-      	    while ($row=db_fetch_array($result,$mode))
-         	    $results[]=$row;
+    function db_assoc_array($res, $mode=false) {
+	    if($res && db_num_rows($res)) {
+      	    while ($row=db_fetch_array($res, $mode))
+         	    $result[]=$row;
         }
-        return $results;
+        return $result;
     }
 
-    function db_num_rows($result) {
-   	    return ($result)?mysql_num_rows($result):0;
+    function db_num_rows($res) {
+   	    return ($res)?mysql_num_rows($res):0;
     }
 
 	function db_affected_rows() {
       return mysql_affected_rows();
     }
 
-  	function db_data_seek($result, $row_number) {
-   	    return mysql_data_seek($result, $row_number);
+  	function db_data_seek($res, $row_number) {
+   	    return mysql_data_seek($res, $row_number);
   	}
 
-  	function db_data_reset($result) {
-   	    return mysql_data_seek($result,0);
+  	function db_data_reset($res) {
+   	    return mysql_data_seek($res,0);
   	}
 
   	function db_insert_id() {
    	    return mysql_insert_id();
   	}
 
-	function db_free_result($result) {
-   	    return mysql_free_result($result);
+	function db_free_result($res) {
+   	    return mysql_free_result($res);
   	}
   
-	function db_output($param) {
+	function db_output($var) {
 
         if(!function_exists('get_magic_quotes_runtime') || !get_magic_quotes_runtime()) //Sucker is NOT on - thanks.
-            return $param;
+            return $var;
 
-        if (is_array($param)) {
-      	    reset($param);
-      	    while(list($key, $value) = each($param))
-        	    $param[$key] = db_output($value);
+        if (is_array($var)) 
+            return array_map('db_output', $var);
 
-      	    return $param;
+        return (!is_numeric($var))?stripslashes($var):$var;
 
-    	}elseif(!is_numeric($param)) {
-            $param=trim(stripslashes($param));
-        }
-
-        return $param;
-  	}
+    }
 
     //Do not call this function directly...use db_input
-    function db_real_escape($val,$quote=false){
+    function db_real_escape($val, $quote=false) {
 
         //Magic quotes crap is taken care of in main.inc.php
         $val=mysql_real_escape_string($val);
@@ -187,29 +180,21 @@
         return ($quote)?"'$val'":$val;
     }
 
-    function db_input($param,$quote=true) {
-
-        //is_numeric doesn't work all the time...9e8 is considered numeric..which is correct...but not expected.
-        if($param && preg_match("/^\d+(\.\d+)?$/",$param))
-            return $param;
+    function db_input($var, $quote=true) {
 
-        if($param && is_array($param)) {
-            reset($param);
-            while (list($key, $value) = each($param)) {
-                $param[$key] = db_input($value,$quote);
-            }
-
-            return $param;
-        }
+        if(is_array($var))
+            return array_map('db_input', $var, array_fill(0, count($var), $quote));
+        elseif($var && preg_match("/^\d+(\.\d+)?$/", $var))
+            return $var;
 
-        return db_real_escape($param,$quote);
+        return db_real_escape($var, $quote);
     }
 
-	function db_error(){
+	function db_error() {
    	    return mysql_error();   
 	}
    
-    function db_errno(){
+    function db_errno() {
         return mysql_errno();
     }
 ?>
diff --git a/include/staff/department.inc.php b/include/staff/department.inc.php
index 521cee9bf9e9eb7446420c26c4e0ab03a1c3ad69..eb3a2e3e6c17f7bde898acefb38e5fcb5aebd2e9 100644
--- a/include/staff/department.inc.php
+++ b/include/staff/department.inc.php
@@ -2,15 +2,17 @@
 if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access Denied');
 $info=array();
 $qstr='';
-if($dept && $_REQUEST['a']!='add'){
+if($dept && $_REQUEST['a']!='add') {
     //Editing Department.
     $title='Update Department';
     $action='update';
     $submit_text='Save Changes';
     $info=$dept->getInfo();
     $info['id']=$dept->getId();
+    $info['groups'] = $dept->getAllowedGroups();
+
     $qstr.='&id='.$dept->getId();
-}else {
+} else {
     $title='Add New Department';
     $action='create';
     $submit_text='Create Dept';
@@ -128,8 +130,9 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                     <option value="0">&mdash; None &mdash;</option>
                     <option value="0" disabled="disabled">Select Department Manager (Optional)</option>
                     <?php
-                    $sql='SELECT staff_id,CONCAT_WS(" ",firstname,lastname) as name FROM '.STAFF_TABLE.' staff '.
-                         'WHERE dept_id='.db_input($dept->getId()).' ORDER by name';
+                    $sql='SELECT staff_id,CONCAT_WS(", ",lastname, firstname) as name '
+                        .' FROM '.STAFF_TABLE.' staff '
+                        .' ORDER by name';
                     if(($res=db_query($sql)) && db_num_rows($res)){
                         while(list($id,$name)=db_fetch_row($res)){
                             $selected=($info['manager_id'] && $id==$info['manager_id'])?'selected="selected"':'';
@@ -141,7 +144,18 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 &nbsp;<span class="error">&nbsp;<?php echo $errors['manager_id']; ?></span>
             </td>
         </tr>
-        <?php } ?>
+        <?php 
+        } ?>
+
+        <tr>
+            <td width="180">
+                Group Membership:
+            </td>
+            <td>
+                <input type="checkbox" name="group_membership" value="0" <?php echo $info['group_membership']?'checked="checked"':''; ?> >
+                Extend membership to groups with access. <i>(Alerts and  notices will include groups)</i>
+            </td>
+        </tr>
         <tr>
             <th colspan="2">
                 <em><strong>Auto Response Settings</strong>: Overwrite global auto-response settings for tickets routed to the Dept.</em>
@@ -189,6 +203,29 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
                 &nbsp;<span class="error">&nbsp;<?php echo $errors['autoresp_email_id']; ?></span>
             </td>
         </tr>
+        <tr>
+            <th colspan="2">
+                <em><strong>Department Access</strong>: Check all groups allowed to access department.</em>
+            </th>
+        </tr>
+        <tr><td colspan=2><em>Primary department members and manager will always have access regarless of group selection or assignment.</em></td></tr>
+        <?php
+         $sql='SELECT group_id, group_name, count(staff.staff_id) as members '
+             .' FROM '.GROUP_TABLE.' grp '
+             .' LEFT JOIN '.STAFF_TABLE. ' staff USING(group_id) '
+             .' GROUP by grp.group_id '
+             .' ORDER BY group_name';
+         if(($res=db_query($sql)) && db_num_rows($res)){
+            while(list($id, $name, $members) = db_fetch_row($res)) {
+                if($members>0) 
+                    $members=sprintf('<a href="staff.php?a=filter&gid=%d">%d</a>', $id, $members);
+
+                $ck=($info['groups'] && in_array($id,$info['groups']))?'checked="checked"':'';
+                echo sprintf('<tr><td colspan=2>&nbsp;&nbsp;<label><input type="checkbox" name="groups[]" value="%d" %s>&nbsp;%s</label> (%s)</td></tr>',
+                        $id, $ck, $name, $members);
+            }
+         }
+        ?>
         <tr>
             <th colspan="2">
                 <em><strong>Department Signature</strong>: Optional signature used on outgoing emails. &nbsp;<span class="error">&nbsp;<?php echo $errors['signature']; ?></span></em>
@@ -197,7 +234,7 @@ $info=Format::htmlchars(($errors && $_POST)?$_POST:$info);
         <tr>
             <td colspan=2>
                 <textarea name="signature" cols="21" rows="5" style="width: 60%;"><?php echo $info['signature']; ?></textarea>
-                <br><em>Signature is made available as a choice, on ticket reply, for public departments.</em>
+                <br><em>Signature is made available as a choice, for public departments, on ticket reply.</em>
             </td>
         </tr>
     </tbody>
diff --git a/include/staff/group.inc.php b/include/staff/group.inc.php
index afb574f5f3cea7ff161dc34e90c05fa77f955b51..83220475de4bf388cd2368774a9cccaba1022896 100644
--- a/include/staff/group.inc.php
+++ b/include/staff/group.inc.php
@@ -8,7 +8,7 @@ if($group && $_REQUEST['a']!='add'){
     $submit_text='Save Changes';
     $info=$group->getInfo();
     $info['id']=$group->getId();
-    $info['depts']=$info['dept_access']?explode(',',$info['dept_access']):array();
+    $info['depts']=$group->getDepartments();
     $qstr.='&id='.$group->getId();
 }else {
     $title='Add New Group';
diff --git a/include/staff/groups.inc.php b/include/staff/groups.inc.php
index ed5e3638a8d0528908584ddfad5320d885a38e4d..5c8393e994fae65d38599c52ed02fa7e991226cf 100644
--- a/include/staff/groups.inc.php
+++ b/include/staff/groups.inc.php
@@ -3,10 +3,13 @@ if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access
 
 $qstr='';
 
-$sql='SELECT grp.*,count(staff.staff_id) as users '
-     .' FROM '.GROUP_TABLE.' grp LEFT JOIN '.STAFF_TABLE.' staff USING(group_id) ';
-$sql.=' WHERE 1';
-$sortOptions=array('name'=>'grp.group_name','status'=>'grp.group_enabled','users'=>'users','created'=>'grp.created','updated'=>'grp.updated');
+$sql='SELECT grp.*,count(staff.staff_id) as users, count(dept.dept_id) as depts '
+     .' FROM '.GROUP_TABLE.' grp '
+     .' LEFT JOIN '.STAFF_TABLE.' staff ON(staff.group_id=grp.group_id) '
+     .' LEFT JOIN '.GROUP_DEPT_TABLE.' dept ON(dept.group_id=grp.group_id) '
+     .' WHERE 1';
+$sortOptions=array('name'=>'grp.group_name','status'=>'grp.group_enabled', 
+                   'users'=>'users', 'depts'=>'depts', 'created'=>'grp.created','updated'=>'grp.updated');
 $orderWays=array('DESC'=>'DESC','ASC'=>'ASC');
 $sort=($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])])?strtolower($_REQUEST['sort']):'name';
 //Sorting options...
@@ -49,9 +52,10 @@ else
     <thead>
         <tr>
             <th width="7px">&nbsp;</th>        
-            <th width="250"><a <?php echo $name_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=name">Group Name</a></th>
-            <th width="80"><a  <?php echo $status_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=status">Group Status</a></th>
+            <th width="200"><a <?php echo $name_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=name">Group Name</a></th>
+            <th width="80"><a  <?php echo $status_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=status">Status</a></th>
             <th width="80" style="text-align:center;"><a  <?php echo $users_sort; ?>href="groups.php?<?php echo $qstr; ?>&sort=users">Members</a></th>
+            <th width="80" style="text-align:center;"><a  <?php echo $depts_sort; ?>href="groups.php?<?php echo $qstr; ?>&sort=depts">Departments</a></th>
             <th width="100"><a  <?php echo $created_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=created">Created On</a></th>
             <th width="120"><a  <?php echo $updated_sort; ?> href="groups.php?<?php echo $qstr; ?>&sort=updated">Last Updated</a></th>
         </tr>
@@ -81,6 +85,9 @@ else
                     <?php } ?>
                     &nbsp;
                 </td>
+                <td style="text-align:right;padding-right:30px">&nbsp;&nbsp;
+                    <?php echo $row['depts']; ?>
+                </td>
                 <td><?php echo Format::db_date($row['created']); ?>&nbsp;</td>
                 <td><?php echo Format::db_datetime($row['updated']); ?>&nbsp;</td>
             </tr>
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index 63f2fb31c4a871f60ca13d3fff0f66e5a2c11ae9..8397a4988d504f7394afa6a6ba0a05da7584eb16 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -63,6 +63,7 @@ $qwhere ='';
 $depts=$thisstaff->getDepts();    
 $qwhere =' WHERE ( '
         .'  ticket.staff_id='.db_input($thisstaff->getId());
+
 if(!$thisstaff->showAssignedOnly())
     $qwhere.=' OR ticket.dept_id IN ('.($depts?implode(',',$depts):0).')';
 
diff --git a/include/upgrader/done.inc.php b/include/upgrader/done.inc.php
index ddd5cab75e09b7d5c654b41284860038d5d6387b..f4a55538991d4b8fd6f6814bcb7f08c31e390b7f 100644
--- a/include/upgrader/done.inc.php
+++ b/include/upgrader/done.inc.php
@@ -1,5 +1,7 @@
 <?php
 if(!defined('OSTSCPINC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access Denied');
+//Destroy the upgrader - we're done! 
+$_SESSION['ost_upgrader']=null;
 ?> 
 <div id="upgrader">
     <div id="main">
diff --git a/include/upgrader/patches/02decaa2-60fcbee1.patch.sql b/include/upgrader/sql/02decaa2-60fcbee1.patch.sql
similarity index 100%
rename from include/upgrader/patches/02decaa2-60fcbee1.patch.sql
rename to include/upgrader/sql/02decaa2-60fcbee1.patch.sql
diff --git a/include/upgrader/patches/15af7cd3-98ae1ed2.patch.sql b/include/upgrader/sql/15af7cd3-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/patches/15af7cd3-98ae1ed2.patch.sql
rename to include/upgrader/sql/15af7cd3-98ae1ed2.patch.sql
diff --git a/include/upgrader/patches/2e20a0eb-98ae1ed2.patch.sql b/include/upgrader/sql/2e20a0eb-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/patches/2e20a0eb-98ae1ed2.patch.sql
rename to include/upgrader/sql/2e20a0eb-98ae1ed2.patch.sql
diff --git a/include/upgrader/sql/435c62c3-2e7531a2.cleanup.sql b/include/upgrader/sql/435c62c3-2e7531a2.cleanup.sql
new file mode 100644
index 0000000000000000000000000000000000000000..75192e141510d052fda52b338170ea7b8bc52e4c
--- /dev/null
+++ b/include/upgrader/sql/435c62c3-2e7531a2.cleanup.sql
@@ -0,0 +1 @@
+ALTER TABLE `%TABLE_PREFIX%groups` DROP `dept_access`;
diff --git a/include/upgrader/sql/435c62c3-2e7531a2.patch.sql b/include/upgrader/sql/435c62c3-2e7531a2.patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9537d1acba838be54ec1ece8c7ab4a80545f1bc0
--- /dev/null
+++ b/include/upgrader/sql/435c62c3-2e7531a2.patch.sql
@@ -0,0 +1,31 @@
+/**
+ *  Move dept_access from group table to group_dept_access table.
+ *
+ * @version 1.7-rc1 Dept_Access
+ */
+
+-- Group department access table
+CREATE TABLE `%TABLE_PREFIX%group_dept_access` (
+  `group_id` int(10) unsigned NOT NULL default '0',
+  `dept_id` int(10) unsigned NOT NULL default '0',
+  UNIQUE KEY `group_dept`  (`group_id`,`dept_id`),
+  KEY `dept_id` (`dept_id`)
+) ENGINE=MyISAM;
+
+-- Extend membership to groups
+ALTER TABLE `%TABLE_PREFIX%department`
+    ADD `group_membership` tinyint( 1 ) unsigned NOT NULL DEFAULT '0' AFTER `ispublic`;
+
+-- Fix teams dates...
+UPDATE `%TABLE_PREFIX%team` 
+    SET `created`=IF(TO_DAYS(`created`), `created`, IF(TO_DAYS(`updated`), `updated`, NOW())),
+        `updated`=IF(TO_DAYS(`updated`), `updated`, NOW());
+
+-- Fix groups dates... 
+UPDATE `%TABLE_PREFIX%groups` 
+    SET `created`=IF(TO_DAYS(`created`), `created`, IF(TO_DAYS(`updated`), `updated`, NOW())),
+        `updated`=IF(TO_DAYS(`updated`), `updated`, NOW());
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `schema_signature`='2e7531a201b5b8650dcd43681a832ebd';
diff --git a/include/upgrader/patches/49478749-c2d2fabf.patch.sql b/include/upgrader/sql/49478749-c2d2fabf.patch.sql
similarity index 100%
rename from include/upgrader/patches/49478749-c2d2fabf.patch.sql
rename to include/upgrader/sql/49478749-c2d2fabf.patch.sql
diff --git a/include/upgrader/patches/522e5b78-02decaa2.patch.sql b/include/upgrader/sql/522e5b78-02decaa2.patch.sql
similarity index 100%
rename from include/upgrader/patches/522e5b78-02decaa2.patch.sql
rename to include/upgrader/sql/522e5b78-02decaa2.patch.sql
diff --git a/include/upgrader/patches/60fcbee1-f8856d56.patch.sql b/include/upgrader/sql/60fcbee1-f8856d56.patch.sql
similarity index 100%
rename from include/upgrader/patches/60fcbee1-f8856d56.patch.sql
rename to include/upgrader/sql/60fcbee1-f8856d56.patch.sql
diff --git a/include/upgrader/patches/7be60a84-522e5b78.patch.sql b/include/upgrader/sql/7be60a84-522e5b78.patch.sql
similarity index 100%
rename from include/upgrader/patches/7be60a84-522e5b78.patch.sql
rename to include/upgrader/sql/7be60a84-522e5b78.patch.sql
diff --git a/include/upgrader/patches/98ae1ed2-e342f869.cleanup.sql b/include/upgrader/sql/98ae1ed2-e342f869.cleanup.sql
similarity index 100%
rename from include/upgrader/patches/98ae1ed2-e342f869.cleanup.sql
rename to include/upgrader/sql/98ae1ed2-e342f869.cleanup.sql
diff --git a/include/upgrader/patches/98ae1ed2-e342f869.patch.sql b/include/upgrader/sql/98ae1ed2-e342f869.patch.sql
similarity index 100%
rename from include/upgrader/patches/98ae1ed2-e342f869.patch.sql
rename to include/upgrader/sql/98ae1ed2-e342f869.patch.sql
diff --git a/include/upgrader/patches/a67ba35e-98ae1ed2.patch.sql b/include/upgrader/sql/a67ba35e-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/patches/a67ba35e-98ae1ed2.patch.sql
rename to include/upgrader/sql/a67ba35e-98ae1ed2.patch.sql
diff --git a/include/upgrader/patches/aa4664af-b19dc97d.patch.sql b/include/upgrader/sql/aa4664af-b19dc97d.patch.sql
similarity index 100%
rename from include/upgrader/patches/aa4664af-b19dc97d.patch.sql
rename to include/upgrader/sql/aa4664af-b19dc97d.patch.sql
diff --git a/include/upgrader/patches/abe9c0cb-bbb021fb.patch.sql b/include/upgrader/sql/abe9c0cb-bbb021fb.patch.sql
similarity index 100%
rename from include/upgrader/patches/abe9c0cb-bbb021fb.patch.sql
rename to include/upgrader/sql/abe9c0cb-bbb021fb.patch.sql
diff --git a/include/upgrader/patches/aee589ab-98ae1ed2.patch.sql b/include/upgrader/sql/aee589ab-98ae1ed2.patch.sql
similarity index 100%
rename from include/upgrader/patches/aee589ab-98ae1ed2.patch.sql
rename to include/upgrader/sql/aee589ab-98ae1ed2.patch.sql
diff --git a/include/upgrader/patches/b19dc97d-435c62c3.patch.sql b/include/upgrader/sql/b19dc97d-435c62c3.patch.sql
similarity index 100%
rename from include/upgrader/patches/b19dc97d-435c62c3.patch.sql
rename to include/upgrader/sql/b19dc97d-435c62c3.patch.sql
diff --git a/include/upgrader/patches/bbb021fb-49478749.patch.sql b/include/upgrader/sql/bbb021fb-49478749.patch.sql
similarity index 100%
rename from include/upgrader/patches/bbb021fb-49478749.patch.sql
rename to include/upgrader/sql/bbb021fb-49478749.patch.sql
diff --git a/include/upgrader/patches/c00511c7-7be60a84.cleanup.sql b/include/upgrader/sql/c00511c7-7be60a84.cleanup.sql
similarity index 100%
rename from include/upgrader/patches/c00511c7-7be60a84.cleanup.sql
rename to include/upgrader/sql/c00511c7-7be60a84.cleanup.sql
diff --git a/include/upgrader/patches/c00511c7-7be60a84.patch.sql b/include/upgrader/sql/c00511c7-7be60a84.patch.sql
similarity index 100%
rename from include/upgrader/patches/c00511c7-7be60a84.patch.sql
rename to include/upgrader/sql/c00511c7-7be60a84.patch.sql
diff --git a/include/upgrader/patches/c2d2fabf-aa4664af.patch.sql b/include/upgrader/sql/c2d2fabf-aa4664af.patch.sql
similarity index 100%
rename from include/upgrader/patches/c2d2fabf-aa4664af.patch.sql
rename to include/upgrader/sql/c2d2fabf-aa4664af.patch.sql
diff --git a/include/upgrader/patches/e342f869-c00511c7.patch.sql b/include/upgrader/sql/e342f869-c00511c7.patch.sql
similarity index 100%
rename from include/upgrader/patches/e342f869-c00511c7.patch.sql
rename to include/upgrader/sql/e342f869-c00511c7.patch.sql
diff --git a/include/upgrader/patches/f8856d56-abe9c0cb.patch.sql b/include/upgrader/sql/f8856d56-abe9c0cb.patch.sql
similarity index 100%
rename from include/upgrader/patches/f8856d56-abe9c0cb.patch.sql
rename to include/upgrader/sql/f8856d56-abe9c0cb.patch.sql
diff --git a/main.inc.php b/main.inc.php
index 1de9c91a3185d6a740cf9832069be71c0a29a805..6d30b7fce585c53f346824aa3a9233bc87311094 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -57,13 +57,13 @@
     define('SETUP_DIR',INCLUDE_DIR.'setup/');
 
     define('UPGRADE_DIR', INCLUDE_DIR.'upgrader/');
-    define('PATCH_DIR', UPGRADE_DIR.'patches/');
+    define('SQL_DIR', UPGRADE_DIR.'sql/');
 
     /*############## Do NOT monkey with anything else beyond this point UNLESS you really know what you are doing ##############*/
 
     #Current version && schema signature (Changes from version to version)
     define('THIS_VERSION','1.7-DPR4'); //Shown on admin panel
-    define('SCHEMA_SIGNATURE','435c62c3b23795529bcfae7e7371d82e'); //MD5 signature of the db schema. (used to trigger upgrades)
+    define('SCHEMA_SIGNATURE','2e7531a201b5b8650dcd43681a832ebd'); //MD5 signature of the db schema. (used to trigger upgrades)
 
     #load config info
     $configfile='';
@@ -136,6 +136,7 @@
     define('DEPT_TABLE',TABLE_PREFIX.'department');
     define('TOPIC_TABLE',TABLE_PREFIX.'help_topic');
     define('GROUP_TABLE',TABLE_PREFIX.'groups');
+    define('GROUP_DEPT_TABLE', TABLE_PREFIX.'group_dept_access');
     define('TEAM_TABLE',TABLE_PREFIX.'team');
     define('TEAM_MEMBER_TABLE',TABLE_PREFIX.'team_member');
 
diff --git a/scp/groups.php b/scp/groups.php
index 7a4f959169160f6f41f0ebce70db6c6ced266695..4a0b9f157960398ddb9bfc8683629af39a83d3a6 100644
--- a/scp/groups.php
+++ b/scp/groups.php
@@ -64,7 +64,7 @@ if($_POST){
                     }
                 }elseif($_POST['delete']){
                     foreach($_POST['ids'] as $k=>$v) {
-                        if(($t=Group::lookup($v)) && $t->delete())
+                        if(($g=Group::lookup($v)) && $g->delete())
                             $i++;
                     }
 
diff --git a/scp/upgrade.php b/scp/upgrade.php
index c424f425cc019acb864c74a393a7adb89827f26d..4ca5f71561e06abaeee8fb2b4e2bb69960c1cf80 100644
--- a/scp/upgrade.php
+++ b/scp/upgrade.php
@@ -17,7 +17,7 @@ require_once 'admin.inc.php';
 require_once INCLUDE_DIR.'class.upgrader.php';
 
 //$_SESSION['ost_upgrader']=null;
-$upgrader = new Upgrader($cfg->getSchemaSignature(), TABLE_PREFIX, PATCH_DIR);
+$upgrader = new Upgrader($cfg->getSchemaSignature(), TABLE_PREFIX, SQL_DIR);
 $errors=array();
 if($_POST && $_POST['s'] && !$upgrader->isAborted()) {
     switch(strtolower($_POST['s'])) {
@@ -71,7 +71,8 @@ switch(strtolower($upgrader->getState())) {
         elseif(!$ost->isUpgradePending())
             $errors['err']='Nothing to do! System already upgraded to <b>'.$ost->getVersion().'</b> with no pending patches to apply.';
         elseif(!$upgrader->isUpgradable())
-            $errors['err']='The upgrader does NOT support upgrading from the current vesion!';
+            $errors['err']=sprintf('The upgrader does NOT support upgrading from the current patch [%s]!', $cfg->getSchemaSignature());
+
 }
 
 $nav = new AdminNav($thisstaff);
diff --git a/setup/inc/class.installer.php b/setup/inc/class.installer.php
index 7791d9f4bc8dc3ddab88852fd688db8603e19a2e..2d284ecedca1e48b25a2fdfd25ad912ec449912a 100644
--- a/setup/inc/class.installer.php
+++ b/setup/inc/class.installer.php
@@ -99,7 +99,7 @@ class Installer extends SetupWizard {
         define('ADMIN_EMAIL',$vars['admin_email']); //Needed to report SQL errors during install.
         define('PREFIX',$vars['prefix']); //Table prefix
 
-        $schemaFile =INC_DIR.'sql/osticket-v1.7-mysql.sql'; //DB dump.
+        $schemaFile =INC_DIR.'sql/osTicket-mysql.sql'; //DB dump.
         $debug = true; //XXX:Change it to true to show SQL errors.
 
         //Last minute checks.
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql b/setup/inc/sql/osTicket-mysql.sql
similarity index 97%
rename from setup/inc/sql/osticket-v1.7-mysql.sql
rename to setup/inc/sql/osTicket-mysql.sql
index ed6ea688e34b1e00a2adb0cbebdfe22a02e6f3d1..21acfcfe83efe5b52d9ba5d9b153a87a25cc7eb9 100644
--- a/setup/inc/sql/osticket-v1.7-mysql.sql
+++ b/setup/inc/sql/osTicket-mysql.sql
@@ -175,6 +175,7 @@ CREATE TABLE `%TABLE_PREFIX%department` (
   `dept_name` varchar(32) NOT NULL default '',
   `dept_signature` tinytext NOT NULL,
   `ispublic` tinyint(1) unsigned NOT NULL default '1',
+  `group_membership` tinyint(1) NOT NULL default '0',
   `ticket_auto_response` tinyint(1) NOT NULL default '1',
   `message_auto_response` tinyint(1) NOT NULL default '0',
   `updated` datetime NOT NULL,
@@ -339,7 +340,6 @@ CREATE TABLE `%TABLE_PREFIX%groups` (
   `group_id` int(10) unsigned NOT NULL auto_increment,
   `group_enabled` tinyint(1) unsigned NOT NULL default '1',
   `group_name` varchar(50) NOT NULL default '',
-  `dept_access` varchar(255) NOT NULL default '',
   `can_create_tickets` tinyint(1) unsigned NOT NULL default '1',
   `can_edit_tickets` tinyint(1) unsigned NOT NULL default '1',
   `can_delete_tickets` tinyint(1) unsigned NOT NULL default '0',
@@ -356,10 +356,21 @@ CREATE TABLE `%TABLE_PREFIX%groups` (
   KEY `group_active` (`group_enabled`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-INSERT INTO `%TABLE_PREFIX%groups` (`group_id`, `group_enabled`, `group_name`, `dept_access`, `can_create_tickets`, `can_edit_tickets`, `can_delete_tickets`, `can_close_tickets`, `can_assign_tickets`, `can_transfer_tickets`, `can_ban_emails`, `can_manage_premade`, `can_manage_faq`, `notes`) VALUES
-    (1, 1, 'Admins', '2,1', 1, 1, 1, 1, 1, 1, 1, 1, 1, 'overlords'),
-    (2, 1, 'Managers', '2,1', 1, 1, 1, 1, 1, 1, 1, 1, 1, ''),
-    (3, 1, 'Staff', '2,1', 1, 1, 0, 1, 1, 1, 0, 0, 0, '');
+INSERT INTO `%TABLE_PREFIX%groups` (`group_id`, `group_enabled`, `group_name`, `can_create_tickets`, `can_edit_tickets`, `can_delete_tickets`, `can_close_tickets`, `can_assign_tickets`, `can_transfer_tickets`, `can_ban_emails`, `can_manage_premade`, `can_manage_faq`, `notes`, `created`, `updated`) VALUES
+    (1, 1, 'Admins', 1, 1, 1, 1, 1, 1, 1, 1, 1, 'overlords', NOW(), NOW()),
+    (2, 1, 'Managers', 1, 1, 1, 1, 1, 1, 1, 1, 1, '', NOW(), NOW()),
+    (3, 1, 'Staff', 1, 1, 0, 1, 1, 1, 0, 0, 0, '', NOW(), NOW());
+
+DROP TABLE IF EXISTS `%TABLE_PREFIX%group_dept_access`;
+CREATE TABLE `%TABLE_PREFIX%group_dept_access` (
+  `group_id` int(10) unsigned NOT NULL default '0',
+  `dept_id` int(10) unsigned NOT NULL default '0',
+  UNIQUE KEY `group_dept` (`group_id`,`dept_id`),
+  KEY `dept_id`  (`dept_id`)
+) ENGINE=MyISAM;
+
+INSERT INTO `%TABLE_PREFIX%group_dept_access` (`group_id`, `dept_id`) VALUES
+    (1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2);
 
 DROP TABLE IF EXISTS `%TABLE_PREFIX%help_topic`;
 CREATE TABLE `%TABLE_PREFIX%help_topic` (
@@ -520,8 +531,8 @@ CREATE TABLE `%TABLE_PREFIX%team` (
   KEY `lead_id` (`lead_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-INSERT INTO `%TABLE_PREFIX%team` (`lead_id`, `isenabled`, `noalerts`, `name`, `notes`)
-    VALUES (0, 1, 0, 'Level I Support', '');
+INSERT INTO `%TABLE_PREFIX%team` (`lead_id`, `isenabled`, `noalerts`, `name`, `notes`, `created`, `updated`)
+    VALUES (0, 1, 0, 'Level I Support', '', NOW(), NOW());
 
 DROP TABLE IF EXISTS `%TABLE_PREFIX%team_member`;
 CREATE TABLE `%TABLE_PREFIX%team_member` (
diff --git a/setup/inc/sql/osTicket-mysql.sql.md5 b/setup/inc/sql/osTicket-mysql.sql.md5
new file mode 100644
index 0000000000000000000000000000000000000000..ad088e947dfe5eac019e5860c29e776bfabe60b1
--- /dev/null
+++ b/setup/inc/sql/osTicket-mysql.sql.md5
@@ -0,0 +1 @@
+2e7531a201b5b8650dcd43681a832ebd
diff --git a/setup/inc/sql/osticket-v1.6.sql b/setup/inc/sql/osticket-v1.6.sql
deleted file mode 100644
index 7dcf180bb27f53f9a1b1a8cccae94604848140d0..0000000000000000000000000000000000000000
--- a/setup/inc/sql/osticket-v1.6.sql
+++ /dev/null
@@ -1,509 +0,0 @@
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%api_key`;
-CREATE TABLE `%TABLE_PREFIX%api_key` (
-  `id` int(10) unsigned NOT NULL auto_increment,
-  `isactive` tinyint(1) NOT NULL default '1',
-  `ipaddr` varchar(16) NOT NULL,
-  `apikey` varchar(255) NOT NULL,
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`id`),
-  UNIQUE KEY `ipaddr` (`ipaddr`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%api_key` (`id`, `isactive`, `ipaddr`, `apikey`, `updated`, `created`) VALUES (1, 1, '192.168.1.5', 'siri!', NOW(), NOW());
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%config`;
-CREATE TABLE `%TABLE_PREFIX%config` (
-  `id` tinyint(1) unsigned NOT NULL auto_increment,
-  `isonline` tinyint(1) unsigned NOT NULL default '0',
-  `timezone_offset` float(3,1) NOT NULL default '0.0',
-  `enable_daylight_saving` tinyint(1) unsigned NOT NULL default '0',
-  `staff_ip_binding` tinyint(1) unsigned NOT NULL default '1',
-  `staff_max_logins` tinyint(3) unsigned NOT NULL default '4',
-  `staff_login_timeout` int(10) unsigned NOT NULL default '2',
-  `staff_session_timeout` int(10) unsigned NOT NULL default '30',
-  `client_max_logins` tinyint(3) unsigned NOT NULL default '4',
-  `client_login_timeout` int(10) unsigned NOT NULL default '2',
-  `client_session_timeout` int(10) unsigned NOT NULL default '30',
-  `max_page_size` tinyint(3) unsigned NOT NULL default '25',
-  `max_open_tickets` tinyint(3) unsigned NOT NULL default '0',
-  `max_file_size` int(11) unsigned NOT NULL default '1048576',
-  `autolock_minutes` tinyint(3) unsigned NOT NULL default '3',
-  `overdue_grace_period` int(10) unsigned NOT NULL default '0',
-  `alert_email_id` tinyint(4) unsigned NOT NULL default '0',
-  `default_email_id` tinyint(4) unsigned NOT NULL default '0',
-  `default_dept_id` tinyint(3) unsigned NOT NULL default '0',
-  `default_priority_id` tinyint(2) unsigned NOT NULL default '2',
-  `default_template_id` tinyint(4) unsigned NOT NULL default '1',
-  `default_smtp_id` tinyint(4) unsigned NOT NULL default '0',
-  `spoof_default_smtp` tinyint(1) unsigned NOT NULL default '0',
-  `clickable_urls` tinyint(1) unsigned NOT NULL default '1',
-  `allow_priority_change` tinyint(1) unsigned NOT NULL default '0',
-  `use_email_priority` tinyint(1) unsigned NOT NULL default '0',
-  `enable_captcha` tinyint(1) unsigned NOT NULL default '0',
-  `enable_auto_cron` tinyint(1) unsigned NOT NULL default '0',
-  `enable_mail_fetch` tinyint(1) unsigned NOT NULL default '0',
-  `enable_email_piping` tinyint(1) unsigned NOT NULL default '0',
-  `send_sql_errors` tinyint(1) unsigned NOT NULL default '1',
-  `send_mailparse_errors` tinyint(1) unsigned NOT NULL default '1',
-  `send_login_errors` tinyint(1) unsigned NOT NULL default '1',
-  `save_email_headers` tinyint(1) unsigned NOT NULL default '1',
-  `strip_quoted_reply` tinyint(1) unsigned NOT NULL default '1',
-  `log_ticket_activity` tinyint(1) unsigned NOT NULL default '1',
-  `ticket_autoresponder` tinyint(1) unsigned NOT NULL default '0',
-  `message_autoresponder` tinyint(1) unsigned NOT NULL default '0',
-  `ticket_notice_active` tinyint(1) unsigned NOT NULL default '0',
-  `ticket_alert_active` tinyint(1) unsigned NOT NULL default '0',
-  `ticket_alert_admin` tinyint(1) unsigned NOT NULL default '1',
-  `ticket_alert_dept_manager` tinyint(1) unsigned NOT NULL default '1',
-  `ticket_alert_dept_members` tinyint(1) unsigned NOT NULL default '0',
-  `message_alert_active` tinyint(1) unsigned NOT NULL default '0',
-  `message_alert_laststaff` tinyint(1) unsigned NOT NULL default '1',
-  `message_alert_assigned` tinyint(1) unsigned NOT NULL default '1',
-  `message_alert_dept_manager` tinyint(1) unsigned NOT NULL default '0',
-  `note_alert_active` tinyint(1) unsigned NOT NULL default '0',
-  `note_alert_laststaff` tinyint(1) unsigned NOT NULL default '1',
-  `note_alert_assigned` tinyint(1) unsigned NOT NULL default '1',
-  `note_alert_dept_manager` tinyint(1) unsigned NOT NULL default '0',
-  `overdue_alert_active` tinyint(1) unsigned NOT NULL default '0',
-  `overdue_alert_assigned` tinyint(1) unsigned NOT NULL default '1',
-  `overdue_alert_dept_manager` tinyint(1) unsigned NOT NULL default '1',
-  `overdue_alert_dept_members` tinyint(1) unsigned NOT NULL default '0',
-  `auto_assign_reopened_tickets` tinyint(1) unsigned NOT NULL default '1',
-  `show_assigned_tickets` tinyint(1) unsigned NOT NULL default '0',
-  `show_answered_tickets` tinyint(1) NOT NULL default '0',
-  `hide_staff_name` tinyint(1) unsigned NOT NULL default '0',
-  `overlimit_notice_active` tinyint(1) unsigned NOT NULL default '0',
-  `email_attachments` tinyint(1) unsigned NOT NULL default '1',
-  `allow_attachments` tinyint(1) unsigned NOT NULL default '0',
-  `allow_email_attachments` tinyint(1) unsigned NOT NULL default '0',
-  `allow_online_attachments` tinyint(1) unsigned NOT NULL default '0',
-  `allow_online_attachments_onlogin` tinyint(1) unsigned NOT NULL default '0',
-  `random_ticket_ids` tinyint(1) unsigned NOT NULL default '1',
-  `log_level` tinyint(1) unsigned NOT NULL default '2',
-  `log_graceperiod` int(10) unsigned NOT NULL default '12',
-  `upload_dir` varchar(255) NOT NULL default '',
-  `allowed_filetypes` varchar(255) NOT NULL default '.doc, .pdf',
-  `time_format` varchar(32) NOT NULL default ' h:i A',
-  `date_format` varchar(32) NOT NULL default 'm/d/Y',
-  `datetime_format` varchar(60) NOT NULL default 'm/d/Y g:i a',
-  `daydatetime_format` varchar(60) NOT NULL default 'D, M j Y g:ia',
-  `reply_separator` varchar(60) NOT NULL default '-- do not edit --',
-  `admin_email` varchar(125) NOT NULL default '',
-  `helpdesk_title` varchar(255) NOT NULL default 'osTicket Support Ticket System',
-  `helpdesk_url` varchar(255) NOT NULL default '',
-  `api_passphrase` varchar(125) NOT NULL default '',
-  `ostversion` varchar(16) NOT NULL default '',
-  `updated` timestamp NOT NULL default CURRENT_TIMESTAMP,
-  PRIMARY KEY  (`id`),
-  KEY `isoffline` (`isonline`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%department`;
-CREATE TABLE `%TABLE_PREFIX%department` (
-  `dept_id` int(11) unsigned NOT NULL auto_increment,
-  `tpl_id` int(10) unsigned NOT NULL default '0',
-  `email_id` int(10) unsigned NOT NULL default '0',
-  `autoresp_email_id` int(10) unsigned NOT NULL default '0',
-  `manager_id` int(10) unsigned NOT NULL default '0',
-  `dept_name` varchar(32) NOT NULL default '',
-  `dept_signature` tinytext NOT NULL,
-  `ispublic` tinyint(1) unsigned NOT NULL default '1',
-  `ticket_auto_response` tinyint(1) NOT NULL default '1',
-  `message_auto_response` tinyint(1) NOT NULL default '0',
-  `can_append_signature` tinyint(1) NOT NULL default '1',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`dept_id`),
-  UNIQUE KEY `dept_name` (`dept_name`),
-  KEY `manager_id` (`manager_id`),
-  KEY `autoresp_email_id` (`autoresp_email_id`),
-  KEY `tpl_id` (`tpl_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%department` (`dept_id`, `tpl_id`, `email_id`, `autoresp_email_id`, `manager_id`, `dept_name`, `dept_signature`, `ispublic`, `ticket_auto_response`, `message_auto_response`, `can_append_signature`, `updated`, `created`) VALUES
-(1, 0, 1, 0, 0, 'Support', 'Support Dept', 1, 1, 1, 1, NOW(), NOW()),
-(2, 0, 1, 0, 0, 'Billing', 'Billing Dept', 1, 1, 1, 1, NOW(), NOW());
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%email`;
-CREATE TABLE `%TABLE_PREFIX%email` (
-  `email_id` int(11) unsigned NOT NULL auto_increment,
-  `noautoresp` tinyint(1) unsigned NOT NULL default '0',
-  `priority_id` tinyint(3) unsigned NOT NULL default '2',
-  `dept_id` tinyint(3) unsigned NOT NULL default '0',
-  `email` varchar(125) NOT NULL default '',
-  `name` varchar(32) NOT NULL default '',
-  `userid` varchar(125) NOT NULL,
-  `userpass` varchar(125) NOT NULL,
-  `mail_active` tinyint(1) NOT NULL default '0',
-  `mail_host` varchar(125) NOT NULL,
-  `mail_protocol` enum('POP','IMAP') NOT NULL default 'POP',
-  `mail_encryption` enum('NONE','SSL') NOT NULL,
-  `mail_port` int(6) default NULL,
-  `mail_fetchfreq` tinyint(3) NOT NULL default '5',
-  `mail_fetchmax` tinyint(4) NOT NULL default '30',
-  `mail_delete` tinyint(1) NOT NULL default '0',
-  `mail_errors` tinyint(3) NOT NULL default '0',
-  `mail_lasterror` datetime default NULL,
-  `mail_lastfetch` datetime default NULL,
-  `smtp_active` tinyint(1) default '0',
-  `smtp_host` varchar(125) NOT NULL,
-  `smtp_port` int(6) default NULL,
-  `smtp_secure` tinyint(1) NOT NULL default '1',
-  `smtp_auth` tinyint(1) NOT NULL default '1',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`email_id`),
-  UNIQUE KEY `email` (`email`),
-  KEY `priority_id` (`priority_id`),
-  KEY `dept_id` (`dept_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%email_banlist`;
-CREATE TABLE `%TABLE_PREFIX%email_banlist` (
-  `id` int(11) NOT NULL auto_increment,
-  `email` varchar(255) NOT NULL default '',
-  `submitter` varchar(126) NOT NULL default '',
-  `added` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`id`),
-  UNIQUE KEY `email` (`email`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%email_banlist` (`id`, `email`, `submitter`, `added`) VALUES
-(1, 'test@example.com', 'System', NOW());
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%email_template`;
-CREATE TABLE `%TABLE_PREFIX%email_template` (
-  `tpl_id` int(11) NOT NULL auto_increment,
-  `cfg_id` int(10) unsigned NOT NULL default '0',
-  `name` varchar(32) NOT NULL default '',
-  `notes` text,
-  `ticket_autoresp_subj` varchar(255) NOT NULL default '',
-  `ticket_autoresp_body` text NOT NULL,
-  `ticket_notice_subj` varchar(255) NOT NULL,
-  `ticket_notice_body` text NOT NULL,
-  `ticket_alert_subj` varchar(255) NOT NULL default '',
-  `ticket_alert_body` text NOT NULL,
-  `message_autoresp_subj` varchar(255) NOT NULL default '',
-  `message_autoresp_body` text NOT NULL,
-  `message_alert_subj` varchar(255) NOT NULL default '',
-  `message_alert_body` text NOT NULL,
-  `note_alert_subj` varchar(255) NOT NULL,
-  `note_alert_body` text NOT NULL,
-  `assigned_alert_subj` varchar(255) NOT NULL default '',
-  `assigned_alert_body` text NOT NULL,
-  `ticket_overdue_subj` varchar(255) NOT NULL default '',
-  `ticket_overdue_body` text NOT NULL,
-  `ticket_overlimit_subj` varchar(255) NOT NULL default '',
-  `ticket_overlimit_body` text NOT NULL,
-  `ticket_reply_subj` varchar(255) NOT NULL default '',
-  `ticket_reply_body` text NOT NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`tpl_id`),
-  KEY `cfg_id` (`cfg_id`),
-  FULLTEXT KEY `message_subj` (`ticket_reply_subj`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-
-INSERT INTO `%TABLE_PREFIX%email_template` (`tpl_id`, `cfg_id`, `name`, `notes`, `ticket_autoresp_subj`, `ticket_autoresp_body`, `ticket_notice_subj`, `ticket_notice_body`, `ticket_alert_subj`, `ticket_alert_body`, `message_autoresp_subj`, `message_autoresp_body`, `message_alert_subj`, `message_alert_body`, `note_alert_subj`, `note_alert_body`, `assigned_alert_subj`, `assigned_alert_body`, `ticket_overdue_subj`, `ticket_overdue_body`, `ticket_overlimit_subj`, `ticket_overlimit_body`, `ticket_reply_subj`, `ticket_reply_body`, `created`, `updated`) VALUES
-(1, 1, 'osTicket Default Template', 'Default osTicket templates', 'Support Ticket Opened [#%ticket]', '%name,\r\n\r\nA request for support has been created and assigned ticket #%ticket. A representative will follow-up with you as soon as possible.\r\n\r\nYou can view this ticket''s progress online here: %url/view.php?e=%email&t=%ticket.\r\n\r\nIf you wish to send additional comments or information regarding this issue, please don''t open a new ticket. Simply login using the link above and update the ticket.\r\n\r\n%signature', '[#%ticket] %subject', '%name,\r\n\r\nOur customer care team has created a ticket, #%ticket on your behalf, with the following message.\r\n\r\n%message\r\n\r\nIf you wish to provide additional comments or information regarding this issue, please don''t open a new ticket. You can update or view this ticket''s progress online here: %url/view.php?e=%email&t=%ticket.\r\n\r\n%signature', 'New Ticket Alert', '%staff,\r\n\r\nNew ticket #%ticket created.\r\n-------------------\r\nName: %name\r\nEmail: %email\r\nDept: %dept\r\n\r\n%message\r\n-------------------\r\n\r\nTo view/respond to the ticket, please login to the support ticket system.\r\n\r\n- Your friendly Customer Support System - powered by osTicket.', '[#%ticket] Message Added', '%name,\r\n\r\nYour reply to support request #%ticket has been noted.\r\n\r\nYou can view this support request progress online here: %url/view.php?e=%email&t=%ticket.\r\n\r\n%signature', 'New Message Alert', '%staff,\r\n\r\nNew message appended to ticket #%ticket\r\n\r\n----------------------\r\nName: %name\r\nEmail: %email\r\nDept: %dept\r\n\r\n%message\r\n-------------------\r\n\r\nTo view/respond to the ticket, please login to the support ticket system.\r\n\r\n- Your friendly Customer Support System - powered by osTicket.', 'New Internal Note Alert', '%staff,\r\n\r\nInternal note appended to ticket #%ticket\r\n\r\n----------------------\r\nName: %name\r\n\r\n%note\r\n-------------------\r\n\r\nTo view/respond to the ticket, please login to the support ticket system.\r\n\r\n- Your friendly Customer Support System - powered by osTicket.', 'Ticket #%ticket Assigned to you', '%assignee,\r\n\r\n%assigner has assigned ticket #%ticket to you!\r\n\r\n%message\r\n\r\nTo view complete details, simply login to the support system.\r\n\r\n- Your friendly Support Ticket System - powered by osTicket.', 'Stale Ticket Alert', '%staff,\r\n\r\nA ticket, #%ticket assigned to you or in your department is seriously overdue.\r\n\r\n%url/scp/tickets.php?id=%id\r\n\r\nWe should all work hard to guarantee that all tickets are being addressed in a timely manner. Enough baby talk...please address the issue or you will hear from me again.\r\n\r\n\r\n- Your friendly (although with limited patience) Support Ticket System - powered by osTicket.', 'Support Ticket Denied', '%name\r\n\r\nNo support ticket has been created. You''ve exceeded maximum number of open tickets allowed.\r\n\r\nThis is a temporary block. To be able to open another ticket, one of your pending tickets must be closed. To update or add comments to an open ticket simply login using the link below.\r\n\r\n%url/view.php?e=%email\r\n\r\nThank you.\r\n\r\nSupport Ticket System', '[#%ticket] %subject', '%name,\r\n\r\nA customer support staff member has replied to your support request, #%ticket with the following response:\r\n\r\n%response\r\n\r\nWe hope this response has sufficiently answered your questions. If not, please do not send another email. Instead, reply to this email or login to your account for a complete archive of all your support requests and responses.\r\n\r\n%url/view.php?e=%email&t=%ticket\r\n\r\n%signature', NOW(), NOW());
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%groups`;
-CREATE TABLE `%TABLE_PREFIX%groups` (
-  `group_id` int(10) unsigned NOT NULL auto_increment,
-  `group_enabled` tinyint(1) unsigned NOT NULL default '1',
-  `group_name` varchar(50) NOT NULL default '',
-  `dept_access` varchar(255) NOT NULL default '',
-  `can_create_tickets` tinyint(1) unsigned NOT NULL default '1',
-  `can_edit_tickets` tinyint(1) unsigned NOT NULL default '1',
-  `can_delete_tickets` tinyint(1) unsigned NOT NULL default '0',
-  `can_close_tickets` tinyint(1) unsigned NOT NULL default '0',
-  `can_transfer_tickets` tinyint(1) unsigned NOT NULL default '1',
-  `can_ban_emails` tinyint(1) unsigned NOT NULL default '0',
-  `can_manage_kb` tinyint(1) unsigned NOT NULL default '0',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`group_id`),
-  KEY `group_active` (`group_enabled`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%groups` (`group_id`, `group_enabled`, `group_name`, `dept_access`, `can_create_tickets`, `can_edit_tickets`, `can_delete_tickets`, `can_close_tickets`, `can_transfer_tickets`, `can_ban_emails`, `can_manage_kb`, `created`, `updated`) VALUES
-(1, 1, 'Admins', '1', 1, 1, 1, 1, 1, 1, 1, NOW(), NOW()),
-(2, 1, 'Managers', '1', 1, 1, 0, 1, 1, 1, 1, NOW(),NOW()),
-(3, 1, 'Staff', '1', 1, 0, 0, 0, 0, 0, 0, NOW(), NOW());
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%help_topic`;
-CREATE TABLE `%TABLE_PREFIX%help_topic` (
-  `topic_id` int(11) unsigned NOT NULL auto_increment,
-  `isactive` tinyint(1) unsigned NOT NULL default '1',
-  `noautoresp` tinyint(3) unsigned NOT NULL default '0',
-  `priority_id` tinyint(3) unsigned NOT NULL default '0',
-  `dept_id` tinyint(3) unsigned NOT NULL default '0',
-  `topic` varchar(32) NOT NULL default '',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`topic_id`),
-  UNIQUE KEY `topic` (`topic`),
-  KEY `priority_id` (`priority_id`),
-  KEY `dept_id` (`dept_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-
-INSERT INTO `%TABLE_PREFIX%help_topic` (`topic_id`, `isactive`, `noautoresp`, `priority_id`, `dept_id`, `topic`, `created`, `updated`) VALUES
-(1, 1, 0, 2, 1, 'Support', NOW(), NOW()),
-(2, 1, 0, 3, 1, 'Billing', NOW(), NOW());
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%kb_premade`;
-CREATE TABLE `%TABLE_PREFIX%kb_premade` (
-  `premade_id` int(10) unsigned NOT NULL auto_increment,
-  `dept_id` int(10) unsigned NOT NULL default '0',
-  `isenabled` tinyint(1) unsigned NOT NULL default '1',
-  `title` varchar(125) NOT NULL default '',
-  `answer` text NOT NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`premade_id`),
-  UNIQUE KEY `title_2` (`title`),
-  KEY `dept_id` (`dept_id`),
-  KEY `active` (`isenabled`),
-  FULLTEXT KEY `title` (`title`,`answer`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%kb_premade` (`premade_id`, `dept_id`, `isenabled`, `title`, `answer`, `created`, `updated`) VALUES
-(1, 0, 1, 'What is osTicket (sample)?', '\r\nosTicket is a widely-used open source support ticket system, an attractive alternative to higher-cost and complex customer support systems - simple, lightweight, reliable, open source, web-based and easy to setup and use.', NOW(), NOW()),
-(2, 0, 1, 'Sample (with variables)', '\r\n%name,\r\n\r\nYour ticket #%ticket created on %createdate is in %dept department.\r\n\r\n', NOW(), NOW());
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%staff`;
-CREATE TABLE `%TABLE_PREFIX%staff` (
-  `staff_id` int(11) unsigned NOT NULL auto_increment,
-  `group_id` int(10) unsigned NOT NULL default '0',
-  `dept_id` int(10) unsigned NOT NULL default '0',
-  `username` varchar(32) NOT NULL default '',
-  `firstname` varchar(32) default NULL,
-  `lastname` varchar(32) default NULL,
-  `passwd` varchar(128) default NULL,
-  `email` varchar(128) default NULL,
-  `phone` varchar(24) NOT NULL default '',
-  `phone_ext` varchar(6) default NULL,
-  `mobile` varchar(24) NOT NULL default '',
-  `signature` tinytext NOT NULL,
-  `isactive` tinyint(1) NOT NULL default '1',
-  `isadmin` tinyint(1) NOT NULL default '0',
-  `isvisible` tinyint(1) unsigned NOT NULL default '1',
-  `onvacation` tinyint(1) unsigned NOT NULL default '0',
-  `daylight_saving` tinyint(1) unsigned NOT NULL default '0',
-  `append_signature` tinyint(1) unsigned NOT NULL default '0',
-  `change_passwd` tinyint(1) unsigned NOT NULL default '0',
-  `timezone_offset` float(3,1) NOT NULL default '0.0',
-  `max_page_size` int(11) unsigned NOT NULL default '0',
-  `auto_refresh_rate` int(10) unsigned NOT NULL default '0',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `lastlogin` datetime default NULL,
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`staff_id`),
-  UNIQUE KEY `username` (`username`),
-  KEY `dept_id` (`dept_id`),
-  KEY `issuperuser` (`isadmin`),
-  KEY `group_id` (`group_id`,`staff_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%syslog`;
-CREATE TABLE `%TABLE_PREFIX%syslog` (
-  `log_id` int(11) unsigned NOT NULL auto_increment,
-  `log_type` enum('Debug','Warning','Error') NOT NULL,
-  `title` varchar(255) NOT NULL,
-  `log` text NOT NULL,
-  `logger` varchar(64) NOT NULL,
-  `ip_address` varchar(16) NOT NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`log_id`),
-  KEY `log_type` (`log_type`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket`;
-CREATE TABLE `%TABLE_PREFIX%ticket` (
-  `ticket_id` int(11) unsigned NOT NULL auto_increment,
-  `ticketID` int(11) unsigned NOT NULL default '0',
-  `dept_id` int(10) unsigned NOT NULL default '1',
-  `priority_id` int(10) unsigned NOT NULL default '2',
-  `topic_id` int(10) unsigned NOT NULL default '0',
-  `staff_id` int(10) unsigned NOT NULL default '0',
-  `email` varchar(120) NOT NULL default '',
-  `name` varchar(32) NOT NULL default '',
-  `subject` varchar(64) NOT NULL default '[no subject]',
-  `helptopic` varchar(255) default NULL,
-  `phone` varchar(16) default NULL,
-  `phone_ext` varchar(8) default NULL,
-  `ip_address` varchar(16) NOT NULL default '',
-  `status` enum('open','closed') NOT NULL default 'open',
-  `source` enum('Web','Email','Phone','Other') NOT NULL default 'Other',
-  `isoverdue` tinyint(1) unsigned NOT NULL default '0',
-  `isanswered` tinyint(1) unsigned NOT NULL default '0',
-  `duedate` datetime default NULL,
-  `reopened` datetime default NULL,
-  `closed` datetime default NULL,
-  `lastmessage` datetime default NULL,
-  `lastresponse` datetime default NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`ticket_id`),
-  UNIQUE KEY `email_extid` (`ticketID`,`email`),
-  KEY `dept_id` (`dept_id`),
-  KEY `staff_id` (`staff_id`),
-  KEY `status` (`status`),
-  KEY `priority_id` (`priority_id`),
-  KEY `created` (`created`),
-  KEY `closed` (`closed`),
-  KEY `duedate` (`duedate`),
-  KEY `topic_id` (`topic_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_attachment`;
-CREATE TABLE `%TABLE_PREFIX%ticket_attachment` (
-  `attach_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `ref_id` int(11) unsigned NOT NULL default '0',
-  `ref_type` enum('M','R') NOT NULL default 'M',
-  `file_size` varchar(32) NOT NULL default '',
-  `file_name` varchar(128) NOT NULL default '',
-  `file_key` varchar(128) NOT NULL default '',
-  `deleted` tinyint(1) unsigned NOT NULL default '0',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime default NULL,
-  PRIMARY KEY  (`attach_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `ref_type` (`ref_type`),
-  KEY `ref_id` (`ref_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_lock`;
-CREATE TABLE `%TABLE_PREFIX%ticket_lock` (
-  `lock_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `staff_id` int(10) unsigned NOT NULL default '0',
-  `expire` datetime default NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`lock_id`),
-  UNIQUE KEY `ticket_id` (`ticket_id`),
-  KEY `staff_id` (`staff_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_message`;
-CREATE TABLE `%TABLE_PREFIX%ticket_message` (
-  `msg_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `messageId` varchar(255) default NULL,
-  `message` text NOT NULL,
-  `headers` text,
-  `source` varchar(16) default NULL,
-  `ip_address` varchar(16) default NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime default NULL,
-  PRIMARY KEY  (`msg_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `msgId` (`messageId`),
-  FULLTEXT KEY `message` (`message`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_note`;
-CREATE TABLE `%TABLE_PREFIX%ticket_note` (
-  `note_id` int(11) unsigned NOT NULL auto_increment,
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `staff_id` int(10) unsigned NOT NULL default '0',
-  `source` varchar(32) NOT NULL default '',
-  `title` varchar(255) NOT NULL default 'Generic Intermal Notes',
-  `note` text NOT NULL,
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`note_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `staff_id` (`staff_id`),
-  FULLTEXT KEY `note` (`note`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_priority`;
-CREATE TABLE `%TABLE_PREFIX%ticket_priority` (
-  `priority_id` tinyint(4) NOT NULL auto_increment,
-  `priority` varchar(60) NOT NULL default '',
-  `priority_desc` varchar(30) NOT NULL default '',
-  `priority_color` varchar(7) NOT NULL default '',
-  `priority_urgency` tinyint(1) unsigned NOT NULL default '0',
-  `ispublic` tinyint(1) NOT NULL default '1',
-  PRIMARY KEY  (`priority_id`),
-  UNIQUE KEY `priority` (`priority`),
-  KEY `priority_urgency` (`priority_urgency`),
-  KEY `ispublic` (`ispublic`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%ticket_priority` (`priority_id`, `priority`, `priority_desc`, `priority_color`, `priority_urgency`, `ispublic`) VALUES
-(1, 'low', 'Low', '#DDFFDD', 4, 1),
-(2, 'normal', 'Normal', '#FFFFF0', 3, 1),
-(3, 'high', 'High', '#FEE7E7', 2, 1),
-(4, 'emergency', 'Emergency', '#FEE7E7', 1, 0);
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%ticket_response`;
-CREATE TABLE `%TABLE_PREFIX%ticket_response` (
-  `response_id` int(11) unsigned NOT NULL auto_increment,
-  `msg_id` int(11) unsigned NOT NULL default '0',
-  `ticket_id` int(11) unsigned NOT NULL default '0',
-  `staff_id` int(11) unsigned NOT NULL default '0',
-  `staff_name` varchar(32) NOT NULL default '',
-  `response` text NOT NULL,
-  `ip_address` varchar(16) NOT NULL default '',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `updated` datetime NOT NULL default '0000-00-00 00:00:00',
-  PRIMARY KEY  (`response_id`),
-  KEY `ticket_id` (`ticket_id`),
-  KEY `msg_id` (`msg_id`),
-  KEY `staff_id` (`staff_id`),
-  FULLTEXT KEY `response` (`response`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-DROP TABLE IF EXISTS `%TABLE_PREFIX%timezone`;
-CREATE TABLE `%TABLE_PREFIX%timezone` (
-  `id` int(11) unsigned NOT NULL auto_increment,
-  `offset` float(3,1) NOT NULL default '0.0',
-  `timezone` varchar(255) NOT NULL default '',
-  PRIMARY KEY  (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
-
-INSERT INTO `%TABLE_PREFIX%timezone` (`id`, `offset`, `timezone`) VALUES
-(1, -12.0, 'Eniwetok, Kwajalein'),
-(2, -11.0, 'Midway Island, Samoa'),
-(3, -10.0, 'Hawaii'),
-(4, -9.0, 'Alaska'),
-(5, -8.0, 'Pacific Time (US & Canada)'),
-(6, -7.0, 'Mountain Time (US & Canada)'),
-(7, -6.0, 'Central Time (US & Canada), Mexico City'),
-(8, -5.0, 'Eastern Time (US & Canada), Bogota, Lima'),
-(9, -4.0, 'Atlantic Time (Canada), Caracas, La Paz'),
-(10, -3.5, 'Newfoundland'),
-(11, -3.0, 'Brazil, Buenos Aires, Georgetown'),
-(12, -2.0, 'Mid-Atlantic'),
-(13, -1.0, 'Azores, Cape Verde Islands'),
-(14, 0.0, 'Western Europe Time, London, Lisbon, Casablanca'),
-(15, 1.0, 'Brussels, Copenhagen, Madrid, Paris'),
-(16, 2.0, 'Kaliningrad, South Africa'),
-(17, 3.0, 'Baghdad, Riyadh, Moscow, St. Petersburg'),
-(18, 3.5, 'Tehran'),
-(19, 4.0, 'Abu Dhabi, Muscat, Baku, Tbilisi'),
-(20, 4.5, 'Kabul'),
-(21, 5.0, 'Ekaterinburg, Islamabad, Karachi, Tashkent'),
-(22, 5.5, 'Bombay, Calcutta, Madras, New Delhi'),
-(23, 6.0, 'Almaty, Dhaka, Colombo'),
-(24, 7.0, 'Bangkok, Hanoi, Jakarta'),
-(25, 8.0, 'Beijing, Perth, Singapore, Hong Kong'),
-(26, 9.0, 'Tokyo, Seoul, Osaka, Sapporo, Yakutsk'),
-(27, 9.5, 'Adelaide, Darwin'),
-(28, 10.0, 'Eastern Australia, Guam, Vladivostok'),
-(29, 11.0, 'Magadan, Solomon Islands, New Caledonia'),
-(30, 12.0, 'Auckland, Wellington, Fiji, Kamchatka');
diff --git a/setup/inc/sql/osticket-v1.7-mysql.sql.md5 b/setup/inc/sql/osticket-v1.7-mysql.sql.md5
deleted file mode 100644
index c3f03508703f6860c9628810c3b59ef8af0ce864..0000000000000000000000000000000000000000
--- a/setup/inc/sql/osticket-v1.7-mysql.sql.md5
+++ /dev/null
@@ -1 +0,0 @@
-435c62c3b23795529bcfae7e7371d82e
diff --git a/setup/inc/sql/v1.7-cleanup-mysql.sql b/setup/inc/sql/v1.7-cleanup-mysql.sql
deleted file mode 100644
index 6464a100101f330cc8b3425adbd27104721ac632..0000000000000000000000000000000000000000
--- a/setup/inc/sql/v1.7-cleanup-mysql.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- Drop fields we no longer need in the reference table.
-ALTER TABLE `%TABLE_PREFIX%ticket_attachment`
-    DROP `file_size`,
-    DROP `file_name`,
-    DROP `file_key`,
-    DROP `updated`,
-    DROP `isdeleted`;
-
--- Drop fields we no longer need in config table.
-ALTER TABLE `%TABLE_PREFIX%config`
-    DROP `api_passphrase`;
-
--- Drop fields we no longer need in staff table.
-ALTER TABLE `%TABLE_PREFIX%staff`
-    DROP `append_signature`,
-    DROP `timezone_offset`;
-
--- Drop fields we no longer need in department table.
-ALTER TABLE `%TABLE_PREFIX%department`
-    DROP `can_append_signature`;
-
--- Banlist table has been migrated to the email_filter_rule table
-DROP TABLE `%TABLE_PREFIX%email_banlist`;
diff --git a/setup/js/setup.js b/setup/js/setup.js
index b1f8e08c3aa48397206c43ad854fc3bf4815473c..7dd4c81aa5887c7388538e9dadd9f06927d1ac4b 100644
--- a/setup/js/setup.js
+++ b/setup/js/setup.js
@@ -18,47 +18,4 @@ jQuery(function($) {
         $('#overlay, #loading').show();
         return true;
         });
-
-    $('form#upgrade').submit(function(e) {
-        e.preventDefault();
-        var form = $(this);
-        $('input[type=submit]', this).attr('disabled', 'disabled');
-        $('#overlay, #loading').show();
-        doTasks('upgrade.php',form.serialize());
-
-        return false;
-        });
-
-    function doTasks(url, data) {
-        function _lp(count) {
-            $.ajax({
-                type: 'GET',
-                url: 'p.php',
-                async: true,
-                cache: false,
-                data: data,
-                dataType: 'text',
-                success: function(res) {
-                    if (res) { 
-                        $('#loading #msg').html(res);
-                    }
-                },
-                statusCode: {
-                    200: function() {
-                        setTimeout(function() { _lp(count+1); }, 2);
-                    },
-
-                    304: function() {
-                        $('#loading #msg').html("We're done... cleaning up!");
-                        setTimeout(function() { location.href =url;}, 3000);
-                    }
-                },
-                error: function() {
-                    $('#loading #msg').html("Something went wrong");
-                    setTimeout(function() { location.href =url;}, 1000);
-                }
-            });
-        };
-        _lp(0);
-    }
 });
diff --git a/setup/p.php b/setup/p.php
deleted file mode 100644
index 51c7055f257559099fd600ef12c31e882605873d..0000000000000000000000000000000000000000
--- a/setup/p.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/*********************************************************************
-    upgrader.php
-
-    osTicket Upgrader Helper - called via ajax.
-
-    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:
-**********************************************************************/
-function staffLoginPage($msg) {
-    Http::response(403, $msg?$msg:'Access Denied');
-    exit;
-}
-
-require '../scp/staff.inc.php';
-if(!$thisstaff or !$thisstaff->isAdmin()) {
-    staffLoginPage('Admin Access Required!');
-    exit;
-}
-
-define('SETUPINC', true);
-define('INC_DIR', './inc/');
-define('SQL_DIR', INC_DIR.'sql/');
-
-require_once INC_DIR.'class.upgrader.php';
-
-
-$upgrader = new Upgrader($cfg->getSchemaSignature(), TABLE_PREFIX, SQL_DIR);
-
-//Just report the next action on the first call.
-if(!$_SESSION['ost_upgrader'][$upgrader->getShash()]['progress']) {
-    $_SESSION['ost_upgrader'][$upgrader->getShash()]['progress'] = $upgrader->getNextAction();
-    Http::response(200, $upgrader->getNextAction());
-    exit;
-}
-
-if($upgrader->getNumPendingTasks()) {
-    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($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(!$ost->isUpgradePending()) {
-    $upgrader->setState('done');
-    session_write_close();
-    header("HTTP/1.1 304 Not Modified");
-    exit;
-}
-
-if($upgrader->isAborted() || $upgrader->getErrors()) {
-    Http::response(416, "We have a problem ... wait a sec.");
-    exit;
-}
-
-Http::response(200, $upgrader->getNextAction());
-?>