diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index fd4c6b1cae6aa0f0148ad12274a9b46d287fb7cd..5fa62c3465e86fb11c657d1a02c2c3cb61d5df77 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -572,22 +572,29 @@ class TicketsAjaxAPI extends AjaxController {
 
             $form = AssignmentForm::instantiate($_POST);
 
-
             $assignCB = function($t, $f, $e) {
                 return $t->assign($f, $e);
             };
 
-            $assignees = array();
+            $assignees = null;
             switch ($w) {
                 case 'agents':
                     $prompt  = __('Select an Agent');
+                    $assignees = array();
                     foreach (Staff::getAvailableStaffMembers() as $id => $name)
                         $assignees['s'.$id] = $name;
+
+                    if (!$assignees)
+                        $info['warn'] =  __('No agents available for assignment');
                     break;
                 case 'teams':
+                    $assignees = array();
                     $prompt = __('Select a Team');
                     foreach (Team::getActiveTeams() as $id => $name)
                         $assignees['t'.$id] = $name;
+
+                    if (!$assignees)
+                        $info['warn'] =  __('No teams available for assignment');
                     break;
                 case 'me':
                     $info[':action'] = '#tickets/mass/claim';
@@ -606,7 +613,7 @@ class TicketsAjaxAPI extends AjaxController {
                     break;
             }
 
-            if ($assignees)
+            if ($assignees != null)
                 $form->setAssignees($assignees);
 
             if ($prompt && ($f=$form->getField('assignee')))
diff --git a/include/class.dept.php b/include/class.dept.php
index 0f74f4cf8e0f02f1fcff3491ba4455ab7a0e0b7c..5e916a8167cafdf8e8a7c8e8e4bbe273bd5d2bfc 100644
--- a/include/class.dept.php
+++ b/include/class.dept.php
@@ -205,6 +205,17 @@ implements TemplateVariable {
         return $this->getMembers(array('available'=>1));
     }
 
+    // Get members  eligible members only
+    function getAssignees() {
+
+        $members = clone $this->getAvailableMembers();
+        // If restricted then filter to primary members ONLY!
+        if ($this->assignMembersOnly())
+            $members->filter(array('dept_id' => $this->getId()));
+
+        return $members;
+    }
+
     function getMembersForAlerts() {
         if ($this->isGroupMembershipEnabled() == self::ALERTS_DISABLED) {
             // Disabled for this department
diff --git a/include/class.forms.php b/include/class.forms.php
index 39f44a5df3c580ccf7410fc4b3eaefbce29b8a05..bacd0dd799683209bcb890780cf29d923b7cd919 100644
--- a/include/class.forms.php
+++ b/include/class.forms.php
@@ -2240,7 +2240,7 @@ class AssigneeField extends ChoiceField {
     function getChoices() {
         global $cfg;
 
-        if (!$this->_choices) {
+        if (!isset($this->_choices)) {
             $config = $this->getConfiguration();
             $choices = array(
                     __('Agents') => new ArrayObject(),
@@ -2261,7 +2261,7 @@ class AssigneeField extends ChoiceField {
 
             next($choices);
             $T = current($choices);
-            if (($teams = Team::getTeams()))
+            if (($teams = Team::getActiveTeams()))
                 foreach ($teams as $id => $name)
                     $T['t'.$id] = $name;
 
@@ -3243,7 +3243,9 @@ class ChoicesWidget extends Widget {
     }
 
     function emitComplexChoices($choices, $values=array(), $have_def=false, $def_key=null) {
-        foreach ($choices as $label => $group) { ?>
+        foreach ($choices as $label => $group) {
+            if (!count($group)) continue;
+            ?>
             <optgroup label="<?php echo $label; ?>"><?php
             foreach ($group as $key => $name) {
                 if (!$have_def && $key == $def_key)
@@ -3956,7 +3958,7 @@ class AssignmentForm extends Form {
 
     static $id = 'assign';
     var $_assignee = null;
-    var $_assignees = array();
+    var $_assignees = null;
 
 
     function getFields() {
@@ -3993,7 +3995,7 @@ class AssignmentForm extends Form {
             );
 
 
-        if ($this->_assignees)
+        if (isset($this->_assignees))
             $fields['assignee']->setChoices($this->_assignees);
 
 
@@ -4002,21 +4004,31 @@ class AssignmentForm extends Form {
         return $this->fields;
     }
 
+    function getField($name) {
+
+        if (($fields = $this->getFields())
+                && isset($fields[$name]))
+            return $fields[$name];
+    }
+
     function isValid() {
 
-        if (!parent::isValid())
+        if (!parent::isValid() || !($f=$this->getField('assignee')))
             return false;
 
         // Do additional assignment validation
         if (!($assignee = $this->getAssignee())) {
-            $this->getField('assignee')->addError(
-                    __('Unknown assignee'));
+            $f->addError(__('Unknown assignee'));
         } elseif ($assignee instanceof Staff) {
             // Make sure the agent is available
             if (!$assignee->isAvailable())
-                $this->getField('assignee')->addError(
-                        __('Agent is unavailable for assignment')
-                        );
+                $f->addError(__('Agent is unavailable for assignment'));
+        } elseif ($assignee instanceof Team) {
+            // Make sure the team is active and has members
+            if (!$assignee->isActive())
+                $f->addError(__('Team is disabled'));
+            elseif (!$assignee->getNumMembers())
+                $f->addError(__('Team does not have members'));
         }
 
         return !$this->errors();
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 64e275559d71616a3182b5366d3b9ea0d7f21f36..b8e6b55828ccc48744fd19a67688b57a40c64d5c 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -858,18 +858,15 @@ implements RestrictedAccess, Threadable {
         switch (strtolower($options['target'])) {
             case 'agents':
                 $dept = $this->getDept();
-                $criteria = array('available' => true);
-                if (($members = $dept->getMembers($criteria))) {
-                    foreach ($members as $member)
-                        $assignees['s'.$member->getId()] = $member;
-                }
+                foreach ($dept->getAssignees() as $member)
+                    $assignees['s'.$member->getId()] = $member;
 
                 if (!$source && $this->isOpen() && $this->staff)
                     $assignee = sprintf('s%d', $this->staff->getId());
                 $prompt = __('Select an Agent');
                 break;
             case 'teams':
-                if (($teams = Team::getTeams()))
+                if (($teams = Team::getActiveTeams()))
                     foreach ($teams as $id => $name)
                         $assignees['t'.$id] = $name;
 
@@ -2142,6 +2139,7 @@ implements RestrictedAccess, Threadable {
         $evd = array();
         $assignee = $form->getAssignee();
         if ($assignee instanceof Staff) {
+            $dept = $this->getDept();
             if ($this->getStaffId() == $assignee->getId()) {
                 $errors['assignee'] = sprintf(__('%s already assigned to %s'),
                         __('Ticket'),
@@ -2149,6 +2147,8 @@ implements RestrictedAccess, Threadable {
                         );
             } elseif(!$assignee->isAvailable()) {
                 $errors['assignee'] = __('Agent is unavailable for assignment');
+            } elseif ($dept->assignMembersOnly() && !$dept->isMember($assignee)) {
+                $errors['err'] = __('Permission denied');
             } else {
                 $this->staff_id = $assignee->getId();
                 if ($thisstaff && $thisstaff->getId() == $assignee->getId())
@@ -3358,7 +3358,7 @@ implements RestrictedAccess, Threadable {
 
         // Assign ticket to staff or team (new ticket by staff)
         if ($vars['assignId']) {
-            $asnform = new AssignmentForm(array('assignee' => $vars['assignId']));
+            $asnform = $ticket->AssignmentForm(array('assignee' => $vars['assignId']));
             $ticket->assign($asnform, $vars['note']);
         }
         else {
diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php
index 1247affaeec2de653dba27af260f163e50379b11..29a2d1fc1e490e094a7bfe27dd9fb4559ff0dc3d 100644
--- a/include/staff/ticket-view.inc.php
+++ b/include/staff/ticket-view.inc.php
@@ -112,7 +112,10 @@ if($ticket->isOverdue())
               <ul>
                 <?php
                 // Agent can claim team assigned ticket
-                if (!$ticket->getStaff()) { ?>
+                if (!$ticket->getStaff()
+                        && (!$dept->assignMembersOnly()
+                            || $dept->isMember($thisstaff))
+                        ) { ?>
                  <li><a class="no-pjax ticket-action"
                     data-redirect="tickets.php"
                     href="#tickets/<?php echo $ticket->getId(); ?>/claim"><i