diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index 5722a76a78dac30cb36667808fc32e47c8fc8924..755c9336c3b8df7c6b2d9c9042a83644d573d2c1 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -102,14 +102,16 @@ class TicketsAjaxAPI extends AjaxController {
 
         $result=array();
         $select = 'SELECT ticket.ticket_id';
-        $from = ' FROM '.TICKET_TABLE.' ticket ';
+        $from = ' FROM '.TICKET_TABLE.' ticket
+                  LEFT JOIN '.TICKET_STATUS_TABLE.' status
+                    ON (status.id = ticket.status_id) ';
         //Access control.
         $where = ' WHERE ( (ticket.staff_id='.db_input($thisstaff->getId())
-                    .' AND ticket.status="open" )';
+                    .' AND status.state="open" )';
 
         if(($teams=$thisstaff->getTeams()) && count(array_filter($teams)))
             $where.=' OR (ticket.team_id IN ('.implode(',', db_input(array_filter($teams)))
-                   .' ) AND ticket.status="open")';
+                   .' ) AND status.state="open" )';
 
         if(!$thisstaff->showAssignedOnly() && ($depts=$thisstaff->getDepts()))
             $where.=' OR ticket.dept_id IN ('.implode(',', db_input($depts)).')';
@@ -127,16 +129,19 @@ class TicketsAjaxAPI extends AjaxController {
         //Status
         switch(strtolower($req['status'])) {
             case 'open':
-                $where.=' AND ticket.status="open" ';
+                $where.=' AND status.state="open" ';
                 break;
             case 'answered':
-                $where.=' AND ticket.status="open" AND ticket.isanswered=1 ';
+                $where.=' AND status.state="open" AND ticket.isanswered=1 ';
                 break;
             case 'overdue':
-                $where.=' AND ticket.status="open" AND ticket.isoverdue=1 ';
+                $where.=' AND status.state="open" AND ticket.isoverdue=1 ';
+                break;
+            case 'resolved':
+                $where.=' AND status.state="resolved" ';
                 break;
             case 'closed':
-                $where.=' AND ticket.status="closed" ';
+                $where.=' AND status.state="closed" ';
                 break;
         }
 
@@ -144,7 +149,7 @@ class TicketsAjaxAPI extends AjaxController {
         if(isset($req['assignee']) && strcasecmp($req['status'], 'closed'))  {
             $id=preg_replace("/[^0-9]/", "", $req['assignee']);
             $assignee = $req['assignee'];
-            $where.= ' AND ( ( ticket.status="open" ';
+            $where.= ' AND ( ( status.state="open" ';
             if($assignee[0]=='t')
                 $where.=' AND ticket.team_id='.db_input($id);
             elseif($assignee[0]=='s')
@@ -155,13 +160,15 @@ class TicketsAjaxAPI extends AjaxController {
             $where.=')';
 
             if($req['staffId'] && !$req['status']) //Assigned TO + Closed By
-                $where.= ' OR (ticket.staff_id='.db_input($req['staffId']). ' AND ticket.status="closed") ';
+                $where.= ' OR (ticket.staff_id='.db_input($req['staffId']).
+                    ' AND status.state IN("resolved", "closed")) ';
             elseif(isset($req['staffId'])) // closed by any
-                $where.= ' OR ticket.status="closed" ';
+                $where.= ' OR status.state IN("resolved", "closed") ';
 
             $where.= ' ) ';
         } elseif($req['staffId']) {
-            $where.=' AND (ticket.staff_id='.db_input($req['staffId']).' AND ticket.status="closed") ';
+            $where.=' AND (ticket.staff_id='.db_input($req['staffId']).' AND
+                status.state IN("resolved", "closed")) ';
         }
 
         //dates
@@ -210,7 +217,8 @@ class TicketsAjaxAPI extends AjaxController {
         $cdata_search = false;
         foreach (TicketForm::getInstance()->getFields() as $f) {
             if (isset($req[$f->getFormName()])
-                    && ($val = $req[$f->getFormName()])) {
+                    && ($val = $req[$f->getFormName()])
+                    && strlen(trim($val))) {
                 $name = $f->get('name') ? $f->get('name')
                     : 'field_'.$f->get('id');
                 if ($f->getImpl()->hasIdValue() && is_numeric($val))
diff --git a/include/class.client.php b/include/class.client.php
index 9f29b0e10ee6118b9ba19ff860e447ec85c0bcd0..3b9e09674152510815ff23e3c39e36cb558ed2f2 100644
--- a/include/class.client.php
+++ b/include/class.client.php
@@ -248,13 +248,20 @@ class  EndUser extends AuthenticatedUser {
     }
 
     function getNumTickets() {
-        return ($stats=$this->getTicketStats())?($stats['open']+$stats['closed']):0;
+        if (!($stats=$this->getTicketStats()))
+            return 0;
+
+        return $stats['open']+$stats['resolved']+ $stats['closed'];
     }
 
     function getNumOpenTickets() {
         return ($stats=$this->getTicketStats())?$stats['open']:0;
     }
 
+    function getNumResolvedTickets() {
+        return ($stats=$this->getTicketStats())?$stats['resolved']:0;
+    }
+
     function getNumClosedTickets() {
         return ($stats=$this->getTicketStats())?$stats['closed']:0;
     }
@@ -269,19 +276,44 @@ class  EndUser extends AuthenticatedUser {
 
     private function getStats() {
 
-        $sql='SELECT count(open.ticket_id) as open, count(closed.ticket_id) as closed '
-            .' FROM '.TICKET_TABLE.' ticket '
-            .' LEFT JOIN '.TICKET_TABLE.' open
-                ON (open.ticket_id=ticket.ticket_id AND open.status=\'open\') '
-            .' LEFT JOIN '.TICKET_TABLE.' closed
-                ON (closed.ticket_id=ticket.ticket_id AND closed.status=\'closed\')'
-            .' LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab
-                ON (collab.ticket_id=ticket.ticket_id
-                    AND collab.user_id = '.db_input($this->getId()).' )'
-            .' WHERE ticket.user_id = '.db_input($this->getId())
-            .' OR collab.user_id = '.db_input($this->getId());
-
-        return db_fetch_array(db_query($sql));
+        $where = ' WHERE ticket.user_id = '.db_input($this->getId())
+                .' OR collab.user_id = '.db_input($this->getId()).' ';
+
+        $join  =  'LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab
+                    ON (collab.ticket_id=ticket.ticket_id
+                            AND collab.user_id = '.db_input($this->getId()).' ) ';
+
+        $sql =  'SELECT \'open\', count( ticket.ticket_id ) AS tickets '
+                .'FROM ' . TICKET_TABLE . ' ticket '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'open\') '
+                . $join
+                . $where
+
+                .'UNION SELECT \'resolved\', count( ticket.ticket_id ) AS tickets '
+                .'FROM ' . TICKET_TABLE . ' ticket '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'resolved\') '
+                . $join
+                . $where
+
+                .'UNION SELECT \'closed\', count( ticket.ticket_id ) AS tickets '
+                .'FROM ' . TICKET_TABLE . ' ticket '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'closed\' ) '
+                . $join
+                . $where;
+
+        $res = db_query($sql);
+        $stats = array();
+        while($row = db_fetch_row($res)) {
+            $stats[$row[0]] = $row[1];
+        }
+
+        return $stats;
     }
 }
 
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 2535f16be9f8dfa81297559ecc4422b43b8e6c12..b2676b7f2c8f4af97635a7f8d8ab0f838bc07b6b 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -2162,12 +2162,13 @@ class Ticket {
         if(!$staff || (!is_object($staff) && !($staff=Staff::lookup($staff))) || !$staff->isStaff())
             return null;
 
-        $where = array('(ticket.staff_id='.db_input($staff->getId()) .' AND ticket.status="open")');
+        $where = array('(ticket.staff_id='.db_input($staff->getId()) .' AND
+                    status.state="open")');
         $where2 = '';
 
         if(($teams=$staff->getTeams()))
             $where[] = ' ( ticket.team_id IN('.implode(',', db_input(array_filter($teams)))
-                        .') AND ticket.status="open")';
+                        .') AND status.state="open")';
 
         if(!$staff->showAssignedOnly() && ($depts=$staff->getDepts())) //Staff with limited access just see Assigned tickets.
             $where[] = 'ticket.dept_id IN('.implode(',', db_input($depts)).') ';
@@ -2179,31 +2180,50 @@ class Ticket {
 
         $sql =  'SELECT \'open\', count( ticket.ticket_id ) AS tickets '
                 .'FROM ' . TICKET_TABLE . ' ticket '
-                .'WHERE ticket.status = \'open\' '
-                .'AND ticket.isanswered =0 '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'open\') '
+                .'WHERE ticket.isanswered = 0 '
                 . $where . $where2
 
                 .'UNION SELECT \'answered\', count( ticket.ticket_id ) AS tickets '
                 .'FROM ' . TICKET_TABLE . ' ticket '
-                .'WHERE ticket.status = \'open\' '
-                .'AND ticket.isanswered =1 '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'open\') '
+                .'WHERE ticket.isanswered = 1 '
                 . $where
 
                 .'UNION SELECT \'overdue\', count( ticket.ticket_id ) AS tickets '
                 .'FROM ' . TICKET_TABLE . ' ticket '
-                .'WHERE ticket.status = \'open\' '
-                .'AND ticket.isoverdue =1 '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'open\') '
+                .'WHERE ticket.isoverdue =1 '
                 . $where
 
                 .'UNION SELECT \'assigned\', count( ticket.ticket_id ) AS tickets '
                 .'FROM ' . TICKET_TABLE . ' ticket '
-                .'WHERE ticket.status = \'open\' '
-                .'AND ticket.staff_id = ' . db_input($staff->getId()) . ' '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'open\') '
+                .'WHERE ticket.staff_id = ' . db_input($staff->getId()) . ' '
+                . $where
+
+                .'UNION SELECT \'resolved\', count( ticket.ticket_id ) AS tickets '
+                .'FROM ' . TICKET_TABLE . ' ticket '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'resolved\') '
+                .'WHERE 1 '
                 . $where
 
                 .'UNION SELECT \'closed\', count( ticket.ticket_id ) AS tickets '
                 .'FROM ' . TICKET_TABLE . ' ticket '
-                .'WHERE ticket.status = \'closed\' '
+                .'INNER JOIN '.TICKET_STATUS_TABLE. ' status
+                    ON (ticket.status_id=status.id
+                            AND status.state=\'closed\' ) '
+                .'WHERE 1 '
                 . $where;
 
         $res = db_query($sql);
diff --git a/include/client/tickets.inc.php b/include/client/tickets.inc.php
index 2c7a9f2317743e6ff170236a06ec39ce2355df23..bfc9d38933a80dd8e3955f9ff11a57e799829f5d 100644
--- a/include/client/tickets.inc.php
+++ b/include/client/tickets.inc.php
@@ -19,7 +19,7 @@ if(isset($_REQUEST['status'])) { //Query string status has nothing to do with th
 }
 
 $sortOptions=array('id'=>'`number`', 'subject'=>'subject.value',
-                    'status'=>'ticket.status', 'dept'=>'dept_name','date'=>'ticket.created');
+                    'status'=>'status.name', 'dept'=>'dept_name','date'=>'ticket.created');
 $orderWays=array('DESC'=>'DESC','ASC'=>'ASC');
 //Sorting options...
 $order_by=$order=null;
@@ -40,7 +40,7 @@ $$x=' class="'.strtolower($order).'" ';
 
 $qselect='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,isanswered, '
     .'dept.ispublic, subject.value as subject,'
-    .'dept_name,ticket. status, ticket.source, ticket.created ';
+    .'dept_name,status.name as status, ticket.source, ticket.created ';
 
 $dynfields='(SELECT entry.object_id, value FROM '.FORM_ANSWER_TABLE.' ans '.
          'LEFT JOIN '.FORM_ENTRY_TABLE.' entry ON entry.id=ans.entry_id '.
@@ -49,6 +49,8 @@ $dynfields='(SELECT entry.object_id, value FROM '.FORM_ANSWER_TABLE.' ans '.
 $subject_sql = sprintf($dynfields, 'subject');
 
 $qfrom='FROM '.TICKET_TABLE.' ticket '
+      .' LEFT JOIN '.TICKET_STATUS_TABLE.' status
+            ON (status.id = ticket.status_id) '
       .' LEFT JOIN '.DEPT_TABLE.' dept ON (ticket.dept_id=dept.dept_id) '
       .' LEFT JOIN '.TICKET_COLLABORATOR_TABLE.' collab
         ON (collab.ticket_id = ticket.ticket_id
@@ -58,8 +60,12 @@ $qfrom='FROM '.TICKET_TABLE.' ticket '
 $qwhere = sprintf(' WHERE ( ticket.user_id=%d OR collab.user_id=%d )',
             $thisclient->getId(), $thisclient->getId());
 
-if($status){
-    $qwhere.=' AND ticket.status='.db_input($status);
+$states = array(
+        'open' => 'open',
+        'resolved' => 'resolved',
+        'closed' => 'closed');
+if($status && isset($states[$status])){
+    $qwhere.=' AND status.state='.db_input($states[$status]);
 }
 
 $search=($_REQUEST['a']=='search' && $_REQUEST['q']);
@@ -110,6 +116,14 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting
         <option value="">&mdash; Any Status &mdash;</option>
         <option value="open"
             <?php echo ($status=='open')?'selected="selected"':'';?>>Open (<?php echo $thisclient->getNumOpenTickets(); ?>)</option>
+        <?php
+        if($thisclient->getNumResolvedTickets()) {
+            ?>
+        <option value="resolved"
+            <?php echo ($status=='resolved')?'selected="selected"':'';?>> Resolved (<?php echo $thisclient->getNumResolvedTickets(); ?>)</option>
+        <?php
+        } ?>
+
         <?php
         if($thisclient->getNumClosedTickets()) {
             ?>
diff --git a/include/staff/templates/tickets.tmpl.php b/include/staff/templates/tickets.tmpl.php
index abf3314ef753f97742d97d7a2398a8f9ef73d919..703a78135ffe27dd0a22f2558846c107dd0ac678 100644
--- a/include/staff/templates/tickets.tmpl.php
+++ b/include/staff/templates/tickets.tmpl.php
@@ -1,7 +1,7 @@
 <?php
 
 $select ='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,ticket.staff_id,ticket.team_id, ticket.user_id '
-        .' ,dept.dept_name,ticket.status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created '
+        .' ,dept.dept_name,status.name as status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created '
         .' ,CAST(GREATEST(IFNULL(ticket.lastmessage, 0), IFNULL(ticket.reopened, 0), ticket.created) as datetime) as effective_date '
         .' ,CONCAT_WS(" ", staff.firstname, staff.lastname) as staff, team.name as team '
         .' ,IF(staff.staff_id IS NULL,team.name,CONCAT_WS(" ", staff.lastname, staff.firstname)) as assigned '
@@ -9,6 +9,8 @@ $select ='SELECT ticket.ticket_id,ticket.`number`,ticket.dept_id,ticket.staff_id
         .' ,cdata.priority_id, cdata.subject, user.name, email.address as email';
 
 $from =' FROM '.TICKET_TABLE.' ticket '
+      .' LEFT JOIN '.TICKET_STATUS_TABLE.' status
+        ON status.id = ticket.status_id '
       .' LEFT JOIN '.USER_TABLE.' user ON user.id = ticket.user_id '
       .' LEFT JOIN '.USER_EMAIL_TABLE.' email ON user.id = email.user_id '
       .' LEFT JOIN '.USER_ACCOUNT_TABLE.' account ON (ticket.user_id=account.user_id) '
@@ -119,9 +121,6 @@ if ($results) { ?>
             $assigned=' ';
 
         $status = ucfirst($row['status']);
-        if(!strcasecmp($row['status'], 'open'))
-            $status = "<b>$status</b>";
-
         $tid=$row['number'];
         $subject = Format::htmlchars(Format::truncate($row['subject'],40));
         $threadcount=$row['thread_count'];
diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php
index e8a78540f68aa5c0b4c9d532eaa6b51913666c4d..0e8159f3f2229509aac33f775ac86755618f10e4 100644
--- a/include/staff/ticket-view.inc.php
+++ b/include/staff/ticket-view.inc.php
@@ -191,8 +191,17 @@ if($ticket->isOverdue())
                                     if(($open=$user->getNumOpenTickets()))
                                         echo sprintf('<li><a href="tickets.php?a=search&status=open&uid=%s"><i class="icon-folder-open-alt icon-fixed-width"></i> %d Open Tickets</a></li>',
                                                 $user->getId(), $open);
+
+                                    if(($resolved=$user->getNumResolvedTickets()))
+                                        echo sprintf('<li><a href="tickets.php?a=search&status=resolved&uid=%d"><i
+                                                class="icon-folder-close-alt icon-fixed-width"></i> %d Resolved Tickets</a></li>',
+                                                $user->getId(), $resolved);
+
+
+
                                     if(($closed=$user->getNumClosedTickets()))
-                                        echo sprintf('<li><a href="tickets.php?a=search&status=closed&uid=%d"><i class="icon-folder-close-alt icon-fixed-width"></i> %d Closed Tickets</a></li>',
+                                        echo sprintf('<li><a href="tickets.php?a=search&status=closed&uid=%d"><i
+                                                class="icon-folder-close-alt icon-fixed-width"></i> %d Closed Tickets</a></li>',
                                                 $user->getId(), $closed);
                                     ?>
                                     <li><a href="tickets.php?a=search&uid=<?php echo $ticket->getOwnerId(); ?>"><i class="icon-double-angle-right icon-fixed-width"></i> All Tickets</a></li>
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index ce2728dd2adc70580a663146a02de4aa8e476920..83b97b62c541ea28284c3b3a0e6a865913d0cd3b 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -33,6 +33,10 @@ switch(strtolower($_REQUEST['status'])){ //Status is overloaded
         $status='closed';
         $showassigned=true; //closed by.
         break;
+    case 'resolved':
+        $status='resolved';
+        $showassigned=true;
+        break;
     case 'overdue':
         $status='open';
         $showoverdue=true;
@@ -62,20 +66,26 @@ $qwhere ='';
 $depts=$thisstaff->getDepts();
 $qwhere =' WHERE ( '
         .'  ( ticket.staff_id='.db_input($thisstaff->getId())
-        .' AND ticket.status="open")';
+        .' AND status.state="open") ';
 
 if(!$thisstaff->showAssignedOnly())
     $qwhere.=' OR ticket.dept_id IN ('.($depts?implode(',', db_input($depts)):0).')';
 
 if(($teams=$thisstaff->getTeams()) && count(array_filter($teams)))
     $qwhere.=' OR (ticket.team_id IN ('.implode(',', db_input(array_filter($teams)))
-            .') AND ticket.status="open")';
+            .') AND status.state="open") ';
 
 $qwhere .= ' )';
 
-//STATUS
-if($status) {
-    $qwhere.=' AND ticket.status='.db_input(strtolower($status));
+//STATUS to states
+$states = array(
+    'open' => array('open'),
+    'resolved' => array('resolved'),
+    'closed' => array('closed'));
+
+if($status && isset($states[$status])) {
+    $qwhere.=' AND status.state IN (
+                '.implode(',', db_input($states[$status])).' ) ';
 }
 
 if (isset($_REQUEST['uid']) && $_REQUEST['uid']) {
@@ -148,7 +158,7 @@ if ($_REQUEST['advsid'] && isset($_SESSION['adv_'.$_REQUEST['advsid']])) {
 
 $sortOptions=array('date'=>'effective_date','ID'=>'ticket.`number`',
     'pri'=>'pri.priority_urgency','name'=>'user.name','subj'=>'cdata.subject',
-    'status'=>'ticket.status','assignee'=>'assigned','staff'=>'staff',
+    'status'=>'status.name','assignee'=>'assigned','staff'=>'staff',
     'dept'=>'dept.dept_name');
 
 $orderWays=array('DESC'=>'DESC','ASC'=>'ASC');
@@ -201,9 +211,11 @@ if($_GET['limit'])
 $qselect ='SELECT ticket.ticket_id,tlock.lock_id,ticket.`number`,ticket.dept_id,ticket.staff_id,ticket.team_id '
     .' ,user.name'
     .' ,email.address as email, dept.dept_name '
-         .' ,ticket.status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created ';
+         .' ,status.name as status,ticket.source,ticket.isoverdue,ticket.isanswered,ticket.created ';
 
 $qfrom=' FROM '.TICKET_TABLE.' ticket '.
+       ' LEFT JOIN '.TICKET_STATUS_TABLE. ' status
+            ON (status.id = ticket.status_id) '.
        ' LEFT JOIN '.USER_TABLE.' user ON user.id = ticket.user_id'.
        ' LEFT JOIN '.USER_EMAIL_TABLE.' email ON user.id = email.user_id'.
        ' LEFT JOIN '.DEPT_TABLE.' dept ON ticket.dept_id=dept.dept_id ';
diff --git a/include/upgrader/streams/core.sig b/include/upgrader/streams/core.sig
index 38957a6f8ddce35874167253151dc6df18d48120..60006234be056b68a04d03386e06f8a0309358a3 100644
--- a/include/upgrader/streams/core.sig
+++ b/include/upgrader/streams/core.sig
@@ -1 +1 @@
-cbf8c933d6d2eaaa971042eb2efce247
+e50ba63f5256e82517670e066b654978
diff --git a/scp/tickets.php b/scp/tickets.php
index 16b9d4cde3518968d6fe70a1b345c83c539d5d37..4f3930aef75a424ae3510912145a43ebc878b42d 100644
--- a/scp/tickets.php
+++ b/scp/tickets.php
@@ -163,22 +163,12 @@ if($_POST && !$errors):
              }
             break;
         case 'postnote': /* Post Internal Note */
-            //Make sure the staff can set desired state
-            if($_POST['state']) {
-                if($_POST['state']=='closed' && !$thisstaff->canCloseTickets())
-                    $errors['state'] = "You don't have permission to close tickets";
-                elseif(in_array($_POST['state'], array('overdue', 'notdue', 'unassigned'))
-                        && (!($dept=$ticket->getDept()) || !$dept->isManager($thisstaff)))
-                    $errors['state'] = "You don't have permission to set the state";
-            }
-
             $vars = $_POST;
             if($_FILES['attachments'])
                 $vars['files'] = AttachmentFile::format($_FILES['attachments']);
 
             $wasOpen = ($ticket->isOpen());
             if(($note=$ticket->postNote($vars, $errors, $thisstaff))) {
-
                 $msg='Internal note posted successfully';
                 if($wasOpen && $ticket->isClosed())
                     $ticket = null; //Going back to main listing.
@@ -235,40 +225,43 @@ if($_POST && !$errors):
                         $errors['err'] = 'Permission Denied. You are not allowed to close tickets.';
                     } elseif($ticket->isClosed()) {
                         $errors['err'] = 'Ticket is already closed!';
-                    } elseif($ticket->close()) {
+                    } elseif (!($status=TicketStatus::lookup($_POST['status_id']))) {
+                        $errors['err'] = 'Unknown status';
+                    } elseif (!in_array($status->getState(), array('resolved', 'closed'))) {
+                        $errors['err'] = 'Invalid status';
+                    } elseif ($ticket->setStatus($status)) {
                         $msg='Ticket #'.$ticket->getNumber().' status set to CLOSED';
-                        //Log internal note
-                        if($_POST['ticket_status_notes'])
-                            $note = $_POST['ticket_status_notes'];
-                        else
-                            $note='Ticket closed (without comments)';
-
-                        $ticket->logNote('Ticket Closed', $note, $thisstaff);
-
+                        if($_POST['ticket_status_notes']) {
+                            $ticket->logNote(
+                                    'Ticket Closed',
+                                    $_POST['ticket_status_notes'],
+                                    $thisstaff);
+                        }
                         //Going back to main listing.
                         TicketLock::removeStaffLocks($thisstaff->getId(), $ticket->getId());
                         $page=$ticket=null;
-
                     } else {
                         $errors['err']='Problems closing the ticket. Try again';
                     }
                     break;
                 case 'reopen':
                     //if staff can close or create tickets ...then assume they can reopen.
-                    if(!$thisstaff->canCloseTickets() && !$thisstaff->canCreateTickets()) {
+                    if (!$thisstaff->canCloseTickets() && !$thisstaff->canCreateTickets()) {
                         $errors['err']='Permission Denied. You are not allowed to reopen tickets.';
-                    } elseif($ticket->isOpen()) {
+                    } elseif ($ticket->isOpen()) {
                         $errors['err'] = 'Ticket is already open!';
-                    } elseif($ticket->reopen()) {
+                    } elseif (!($status=TicketStatus::lookup($_POST['status_id']))) {
+                        $errors['err'] = 'Unknown status';
+                    } elseif (strcasecmp($status->getState(), 'open')) {
+                        $errors['err'] = 'Invalid status';
+                    } elseif ($ticket->setStatus($status)) {
                         $msg='Ticket REOPENED';
-
-                        if($_POST['ticket_status_notes'])
-                            $note = $_POST['ticket_status_notes'];
-                        else
-                            $note='Ticket reopened (without comments)';
-
-                        $ticket->logNote('Ticket Reopened', $note, $thisstaff);
-
+                        if($_POST['ticket_status_notes']) {
+                            $ticket->logNote(
+                                    'Ticket Reopened',
+                                    $_POST['ticket_status_notes'],
+                                    $thisstaff);
+                        }
                     } else {
                         $errors['err']='Problems reopening the ticket. Try again';
                     }
@@ -419,24 +412,7 @@ if($_POST && !$errors):
                             }
                             break;
                         case 'close':
-                            if($thisstaff->canCloseTickets()) {
-                                $note='Ticket closed without response by '.$thisstaff->getName();
-                                foreach($_POST['tids'] as $k=>$v) {
-                                    if(($t=Ticket::lookup($v)) && $t->isOpen() && @$t->close()) {
-                                        $i++;
-                                        $t->logNote('Ticket Closed', $note, $thisstaff);
-                                    }
-                                }
-
-                                if($i==$count)
-                                    $msg ="Selected tickets ($i) closed succesfully";
-                                elseif($i)
-                                    $warn = "$i of $count selected tickets closed";
-                                else
-                                    $errors['err'] = 'Unable to close selected tickets';
-                            } else {
-                                $errors['err'] = 'You do not have permission to close tickets';
-                            }
+                            $errors['err'] = 'Support coming soon!';
                             break;
                         case 'mark_overdue':
                             $note='Ticket flagged as overdue by '.$thisstaff->getName();
@@ -567,7 +543,13 @@ if($thisstaff->showAssignedOnly() && $stats['closed']) {
                         ($_REQUEST['status']=='closed'));
 } else {
 
-    $nav->addSubMenu(array('desc'=>'Closed Tickets ('.number_format($stats['closed']).')',
+    $nav->addSubMenu(array('desc'=>'Resolved ('.number_format($stats['resolved']).')',
+                           'title'=>'Resolved Tickets',
+                           'href'=>'tickets.php?status=resolved',
+                           'iconclass'=>'closedTickets'),
+                        ($_REQUEST['status']=='resolved'));
+
+    $nav->addSubMenu(array('desc'=>'Closed ('.number_format($stats['closed']).')',
                            'title'=>'Closed Tickets',
                            'href'=>'tickets.php?status=closed',
                            'iconclass'=>'closedTickets'),