diff --git a/include/staff/staffmembers.inc.php b/include/staff/staffmembers.inc.php
index 9ea2607a6db6099cdef1d28ae85ce8ac321eefe9..9360ffa6ea08ed206d5c1ec5c80892fb91dcfc1c 100644
--- a/include/staff/staffmembers.inc.php
+++ b/include/staff/staffmembers.inc.php
@@ -1,74 +1,92 @@
 <?php
-if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access Denied');
+if (!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin())
+    die('Access Denied');
+
 $qstr='';
-$select='SELECT staff.*,CONCAT_WS(" ",firstname,lastname) as name, grp.group_name, dept.dept_name as dept,count(m.team_id) as teams ';
-$from='FROM '.STAFF_TABLE.' staff '.
-      'LEFT JOIN '.GROUP_TABLE.' grp ON(staff.group_id=grp.group_id) '.
-      'LEFT JOIN '.DEPT_TABLE.' dept ON(staff.dept_id=dept.dept_id) '.
-      'LEFT JOIN '.TEAM_MEMBER_TABLE.' m ON(m.staff_id=staff.staff_id) ';
-$where='WHERE 1 ';
-
-if($_REQUEST['did'] && is_numeric($_REQUEST['did'])) {
-    $where.=' AND staff.dept_id='.db_input($_REQUEST['did']);
-    $qstr.='&did='.urlencode($_REQUEST['did']);
-}
+$sortOptions = array(
+        'name' => 'lastname',
+        'username' => 'username',
+        'status' => 'isactive',
+        'group' => 'group__name',
+        'dept' => 'dept__name',
+        'created' => 'created',
+        'login' => 'lastlogin'
+        );
 
-if($_REQUEST['gid'] && is_numeric($_REQUEST['gid'])) {
-    $where.=' AND staff.group_id='.db_input($_REQUEST['gid']);
-    $qstr.='&gid='.urlencode($_REQUEST['gid']);
-}
+$orderWays = array('DESC'=>'DESC', 'ASC'=>'ASC');
+$sort = ($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])]) ? strtolower($_REQUEST['sort']) : 'name';
 
-if($_REQUEST['tid'] && is_numeric($_REQUEST['tid'])) {
-    $where.=' AND m.team_id='.db_input($_REQUEST['tid']);
-    $qstr.='&tid='.urlencode($_REQUEST['tid']);
+if ($sort && $sortOptions[$sort]) {
+    $order_column = $sortOptions[$sort];
 }
 
-$sortOptions=array('name'=>'staff.firstname,staff.lastname','username'=>'staff.username','status'=>'isactive',
-                   'group'=>'grp.group_name','dept'=>'dept.dept_name','created'=>'staff.created','login'=>'staff.lastlogin');
-$orderWays=array('DESC'=>'DESC','ASC'=>'ASC');
-$sort=($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])])?strtolower($_REQUEST['sort']):'name';
-//Sorting options...
-if($sort && $sortOptions[$sort]) {
-    $order_column =$sortOptions[$sort];
-}
-$order_column=$order_column?$order_column:'staff.firstname,staff.lastname';
+$order_column = $order_column ? $order_column : 'lastname';
 
-if($_REQUEST['order'] && $orderWays[strtoupper($_REQUEST['order'])]) {
-    $order=$orderWays[strtoupper($_REQUEST['order'])];
+if ($_REQUEST['order'] && isset($orderWays[strtoupper($_REQUEST['order'])])) {
+    $order = $orderWays[strtoupper($_REQUEST['order'])];
+} else {
+    $order = 'ASC';
 }
 
-$order=$order?$order:'ASC';
-if($order_column && strpos($order_column,',')){
+if ($order_column && strpos($order_column,',')) {
     $order_column=str_replace(','," $order,",$order_column);
 }
 $x=$sort.'_sort';
 $$x=' class="'.strtolower($order).'" ';
-$order_by="$order_column $order ";
 
-$total=db_count('SELECT count(DISTINCT staff.staff_id) '.$from.' '.$where);
-$page=($_GET['p'] && is_numeric($_GET['p']))?$_GET['p']:1;
-$pageNav=new Pagenate($total,$page,PAGE_LIMIT);
-$pageNav->setURL('staff.php',$qstr.'&sort='.urlencode($_REQUEST['sort']).'&order='.urlencode($_REQUEST['order']));
-//Ok..lets roll...create the actual query
+//Filers
+$filters = array();
+if ($_REQUEST['did'] && is_numeric($_REQUEST['did'])) {
+    $filters += array('dept_id' => $_REQUEST['did']);
+    $qstr.='&did='.urlencode($_REQUEST['did']);
+}
+
+if ($_REQUEST['gid'] && is_numeric($_REQUEST['gid'])) {
+    $filters += array('group_id' => $_REQUEST['gid']);
+    $qstr.='&gid='.urlencode($_REQUEST['gid']);
+}
+
+if ($_REQUEST['tid'] && is_numeric($_REQUEST['tid'])) {
+    $filters += array('teams__team_id' => $_REQUEST['tid']);
+    $qstr.='&tid='.urlencode($_REQUEST['tid']);
+}
+
+//agents objects
+$agents = Staff::objects()
+    ->annotate(array(
+            'teams_count'=>SqlAggregate::COUNT('teams', true),
+    ))
+    ->order_by(sprintf('%s%s',
+                strcasecmp($order, 'DESC') ? '' : '-',
+                $order_column));
+
+if ($filters)
+    $agents->filter($filters);
+
+// paginate
+$page = ($_GET['p'] && is_numeric($_GET['p'])) ? $_GET['p'] : 1;
+$count = $agents->count();
+$pageNav = new Pagenate($count, $page, PAGE_LIMIT);
+$_qstr = $qstr.'&sort='.urlencode($_REQUEST['sort']).'&order='.urlencode($_REQUEST['order']);
+$pageNav->setURL('staff.php', $_qstr);
+$showing = $pageNav->showing().' '._N('agent', 'agents', $count);
 $qstr.='&order='.($order=='DESC'?'ASC':'DESC');
-$query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ".$pageNav->getStart().",".$pageNav->getLimit();
-//echo $query;
+
+// add limits.
+$agents->limit($pageNav->getLimit())->offset($pageNav->getStart());
 ?>
 <h2><?php echo __('Agents');?></h2>
+
 <div class="pull-left" style="width:700px;">
     <form action="staff.php" method="GET" name="filter">
      <input type="hidden" name="a" value="filter" >
         <select name="did" id="did">
              <option value="0">&mdash; <?php echo __('All Department');?> &mdash;</option>
              <?php
-             $sql='SELECT dept.dept_id, dept.dept_name,count(staff.staff_id) as users  '.
-                  'FROM '.DEPT_TABLE.' dept '.
-                  'INNER JOIN '.STAFF_TABLE.' staff ON(staff.dept_id=dept.dept_id) '.
-                  'GROUP By dept.dept_id HAVING users>0 ORDER BY dept_name';
-             if(($res=db_query($sql)) && db_num_rows($res)){
-                 while(list($id,$name, $users)=db_fetch_row($res)){
+             if (($depts=Dept::getDepartments())) {
+                 foreach ($depts as $id => $name) {
                      $sel=($_REQUEST['did'] && $_REQUEST['did']==$id)?'selected="selected"':'';
-                     echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users);
+                     echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name);
                  }
              }
              ?>
@@ -76,14 +94,10 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ".
         <select name="gid" id="gid">
             <option value="0">&mdash; <?php echo __('All Groups');?> &mdash;</option>
              <?php
-             $sql='SELECT grp.group_id, group_name,count(staff.staff_id) as users '.
-                  'FROM '.GROUP_TABLE.' grp '.
-                  'INNER JOIN '.STAFF_TABLE.' staff ON(staff.group_id=grp.group_id) '.
-                  'GROUP BY grp.group_id ORDER BY group_name';
-             if(($res=db_query($sql)) && db_num_rows($res)){
-                 while(list($id,$name,$users)=db_fetch_row($res)){
+             if (($groups=Group::getGroups())) {
+                 foreach ($groups as $id => $name) {
                      $sel=($_REQUEST['gid'] && $_REQUEST['gid']==$id)?'selected="selected"':'';
-                     echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users);
+                     echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name);
                  }
              }
              ?>
@@ -91,13 +105,10 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ".
         <select name="tid" id="tid">
             <option value="0">&mdash; <?php echo __('All Teams');?> &mdash;</option>
              <?php
-             $sql='SELECT team.team_id, team.name, count(member.staff_id) as users FROM '.TEAM_TABLE.' team '.
-                  'INNER JOIN '.TEAM_MEMBER_TABLE.' member ON(member.team_id=team.team_id) '.
-                  'GROUP BY team.team_id ORDER BY team.name';
-             if(($res=db_query($sql)) && db_num_rows($res)){
-                 while(list($id,$name,$users)=db_fetch_row($res)){
+             if (($teams=Team::getTeams())) {
+                 foreach ($teams as $id => $name) {
                      $sel=($_REQUEST['tid'] && $_REQUEST['tid']==$id)?'selected="selected"':'';
-                     echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users);
+                     echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name);
                  }
              }
              ?>
@@ -108,13 +119,6 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ".
  </div>
 <div class="pull-right flush-right" style="padding-right:5px;"><b><a href="staff.php?a=add" class="Icon newstaff"><?php echo __('Add New Agent');?></a></b></div>
 <div class="clear"></div>
-<?php
-$res=db_query($query);
-if($res && ($num=db_num_rows($res)))
-    $showing=$pageNav->showing() . ' ' . _N('agent', 'agents', $num);
-else
-    $showing=__('No agents found!');
-?>
 <form action="staff.php" method="POST" name="staff" >
  <?php csrf_token(); ?>
  <input type="hidden" name="do" value="mass_process" >
@@ -135,31 +139,38 @@ else
     </thead>
     <tbody>
     <?php
-        if($res && db_num_rows($res)):
-            $ids=($errors && is_array($_POST['ids']))?$_POST['ids']:null;
-            while ($row = db_fetch_array($res)) {
+        if ($count):
+            $ids = ($errors && is_array($_POST['ids'])) ? $_POST['ids'] : null;
+            foreach ($agents as $agent) {
+                $id = $agent->getId();
                 $sel=false;
-                if($ids && in_array($row['staff_id'],$ids))
+                if ($ids && in_array($id, $ids))
                     $sel=true;
                 ?>
-               <tr id="<?php echo $row['staff_id']; ?>">
+               <tr id="<?php echo $id; ?>">
                 <td width=7px>
-                  <input type="checkbox" class="ckb" name="ids[]" value="<?php echo $row['staff_id']; ?>" <?php echo $sel?'checked="checked"':''; ?> >
-                <td><a href="staff.php?id=<?php echo $row['staff_id']; ?>"><?php echo Format::htmlchars($row['name']); ?></a>&nbsp;</td>
-                <td><?php echo $row['username']; ?></td>
-                <td><?php echo $row['isactive']?__('Active'):'<b>'.__('Locked').'</b>'; ?>&nbsp;<?php echo $row['onvacation']?'<small>(<i>'.__('vacation').'</i>)</small>':''; ?></td>
-                <td><a href="groups.php?id=<?php echo $row['group_id']; ?>"><?php echo Format::htmlchars($row['group_name']); ?></a></td>
-                <td><a href="departments.php?id=<?php echo $row['dept_id']; ?>"><?php echo Format::htmlchars($row['dept']); ?></a></td>
-                <td><?php echo Format::date($row['created']); ?></td>
-                <td><?php echo Format::datetime($row['lastlogin']); ?>&nbsp;</td>
+                  <input type="checkbox" class="ckb" name="ids[]"
+                  value="<?php echo $id; ?>" <?php echo $sel ? 'checked="checked"' : ''; ?> >
+                <td><a href="staff.php?id=<?php echo $id; ?>"><?php echo
+                Format::htmlchars($agent->getName()); ?></a>&nbsp;</td>
+                <td><?php echo $agent->getUserName(); ?></td>
+                <td><?php echo $agent->isActive() ? __('Active') :'<b>'.__('Locked').'</b>'; ?>&nbsp;<?php
+                    echo $agent->onvacation ? '<small>(<i>'.__('vacation').'</i>)</small>' : ''; ?></td>
+                <td><a href="groups.php?id=<?php echo $agent->getGroupId(); ?>"><?php
+                    echo Format::htmlchars('FIXME'/*$agent->group->getName()*/); ?></a></td>
+                <td><a href="departments.php?id=<?php echo
+                    $agent->getDeptId(); ?>"><?php
+                    echo Format::htmlchars((string) $agent->dept); ?></a></td>
+                <td><?php echo Format::date($agent->created); ?></td>
+                <td><?php echo Format::datetime($agent->lastlogin); ?>&nbsp;</td>
                </tr>
             <?php
-            } //end of while.
+            } //end of foreach
         endif; ?>
     <tfoot>
      <tr>
         <td colspan="8">
-            <?php if($res && $num){ ?>
+            <?php if ($count) { ?>
             <?php echo __('Select');?>:&nbsp;
             <a id="selectAll" href="#ckb"><?php echo __('All');?></a>&nbsp;&nbsp;
             <a id="selectNone" href="#ckb"><?php echo __('None');?></a>&nbsp;&nbsp;
@@ -172,7 +183,7 @@ else
     </tfoot>
 </table>
 <?php
-if($res && $num): //Show options..
+if ($count): //Show options..
     echo '<div>&nbsp;'.__('Page').':'.$pageNav->getPageLinks().'&nbsp;</div>';
 ?>
 <p class="centered" id="actions">
diff --git a/scp/staff.php b/scp/staff.php
index 384af7df0771efdeafd05a8684aa03114950b899..17a106e93c41cbe16da59755ffb0b7fdefd9563b 100644
--- a/scp/staff.php
+++ b/scp/staff.php
@@ -52,10 +52,13 @@ if($_POST){
                 $count=count($_POST['ids']);
                 switch(strtolower($_POST['a'])) {
                     case 'enable':
-                        $sql='UPDATE '.STAFF_TABLE.' SET isactive=1 '
-                            .' WHERE staff_id IN ('.implode(',', db_input($_POST['ids'])).')';
+                        $num = Staff::objects()->filter(array(
+                            'staff_id__in' => $_POST['ids']
+                        ))->update(array(
+                            'isactive' => 1
+                        ));
 
-                        if(db_query($sql) && ($num=db_affected_rows())) {
+                        if ($num) {
                             if($num==$count)
                                 $msg = sprintf('Successfully activated %s',
                                     _N('selected agent', 'selected agents', $count));
@@ -68,10 +71,13 @@ if($_POST){
                         }
                         break;
                     case 'disable':
-                        $sql='UPDATE '.STAFF_TABLE.' SET isactive=0 '
-                            .' WHERE staff_id IN ('.implode(',', db_input($_POST['ids'])).') AND staff_id!='.db_input($thisstaff->getId());
+                        $num = Staff::objects()->filter(array(
+                            'staff_id__in' => $_POST['ids']
+                        ))->update(array(
+                            'isactive' => 0
+                        ));
 
-                        if(db_query($sql) && ($num=db_affected_rows())) {
+                        if ($num) {
                             if($num==$count)
                                 $msg = sprintf('Successfully disabled %s',
                                     _N('selected agent', 'selected agents', $count));
@@ -84,6 +90,7 @@ if($_POST){
                         }
                         break;
                     case 'delete':
+                        $i = 0;
                         foreach($_POST['ids'] as $k=>$v) {
                             if($v!=$thisstaff->getId() && ($s=Staff::lookup($v)) && $s->delete())
                                 $i++;