diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index 6d726f5a189631861aa7986970284563bc52e573..18aa44c4a066e5032fcf64989429cbc29501ceed 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -405,31 +405,44 @@ class TicketsAjaxAPI extends AjaxController {
     }
 
 
-    function assign($tid, $to=null) {
+    function assign($tid, $target=null) {
         global $thisstaff;
 
         if (!($ticket=Ticket::lookup($tid)))
             Http::response(404, __('No such ticket'));
 
-        if (!$ticket->checkStaffPerm($thisstaff, Ticket::PERM_ASSIGN))
+        if (!$ticket->checkStaffPerm($thisstaff, Ticket::PERM_ASSIGN)
+                || !($form = $ticket->getAssignmentForm($_POST,
+                        array('target' => $target))))
             Http::response(403, __('Permission Denied'));
 
         $errors = array();
         $info = array(
                 ':title' => sprintf(__('Ticket #%s: %s'),
                     $ticket->getNumber(),
-                    $ticket->isAssigned() ? __('Reassign') :  __('Assign')),
+                    sprintf('%s %s',
+                        $ticket->isAssigned() ?
+                            __('Reassign') :  __('Assign'),
+                        !strcasecmp($target, 'agents') ?
+                            __('to an Agent') : __('to a Team')
+                    )),
                 ':action' => sprintf('#tickets/%d/assign%s',
                     $ticket->getId(),
-                    ($to  ? "/$to": '')),
+                    ($target  ? "/$target": '')),
                 );
+
         if ($ticket->isAssigned()) {
-            $info['notice'] = sprintf(__('%s is currently assigned to %s'),
-                    __('Ticket'),
-                    $ticket->getAssigned());
+            if ($ticket->getStaffId() == $thisstaff->getId())
+                $assigned = __('you');
+            else
+                $assigned = $ticket->getAssigned();
+
+            $info['notice'] = sprintf(__('%s is currently assigned to <b>%s</b>'),
+                    __('This ticket'),
+                    Format::htmlchars($assigned)
+                    );
         }
 
-        $form = $ticket->getAssignmentForm($_POST);
         if ($_POST && $form->isValid()) {
             if ($ticket->assign($form, $errors)) {
                 $_SESSION['::sysmsgs']['msg'] = sprintf(
diff --git a/include/class.forms.php b/include/class.forms.php
index 019d0cae21484c5917be13c577427a3504ba7603..7d163f361cc77000a8437d694b457313dc2c5671 100644
--- a/include/class.forms.php
+++ b/include/class.forms.php
@@ -2233,6 +2233,10 @@ class AssigneeField extends ChoiceField {
         return true;
     }
 
+    function setChoices($choices) {
+        $this->_choices = $choices;
+    }
+
     function getChoices() {
         global $cfg;
 
@@ -3952,14 +3956,8 @@ class AssignmentForm extends Form {
 
     static $id = 'assign';
     var $_assignee = null;
-    var $_dept = null;
+    var $_assignees = array();
 
-    function __construct($source=null, $options=array()) {
-        parent::__construct($source, $options);
-        // Department of the object -- if necessary to limit assinees
-        if (isset($options['dept']))
-            $this->_dept = $options['dept'];
-    }
 
     function getFields() {
 
@@ -3977,7 +3975,6 @@ class AssignmentForm extends Form {
                         'criteria' => array(
                             'available' => true,
                             ),
-                        'dept' => $this->_dept ?: null,
                        ),
                     )
                 ),
@@ -3995,6 +3992,11 @@ class AssignmentForm extends Form {
                 ),
             );
 
+
+        if ($this->_assignees)
+            $fields['assignee']->setChoices($this->_assignees);
+
+
         $this->setFields($fields);
 
         return $this->fields;
@@ -4035,6 +4037,15 @@ class AssignmentForm extends Form {
         include $inc;
     }
 
+    function setAssignees($assignees) {
+        $this->_assignees = $assignees;
+        $this->_fields = array();
+    }
+
+    function getAssignees() {
+        return $this->_assignees;
+    }
+
     function getAssignee() {
 
         if (!isset($this->_assignee))
@@ -4043,11 +4054,9 @@ class AssignmentForm extends Form {
         return $this->_assignee;
     }
 
-    function assigneeCriteria() {
-        $dept = $this->id;
-        return function () use($dept) {
-            return array('dept_id' =>$dept);
-        };
+    function getComments() {
+        return $this->getField('comments')->getClean();
+
     }
 
 }
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 3fe355de2a1e8f807e59d3d447e5513626c526c3..a03d3bcbeb91cd87675fb34594afeef6281ae6c4 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -852,12 +852,48 @@ implements RestrictedAccess, Threadable {
 
     function getAssignmentForm($source=null, $options=array()) {
 
+        $prompt = $assignee = '';
+        // Possible assignees
+        $assignees = array();
+        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;
+                }
+
+                if (!$source && $this->isOpen() && $this->staff)
+                    $assignee = sprintf('s%d', $this->staff->getId());
+                $prompt = __('Select an Agent');
+                break;
+            case 'teams':
+                if (($teams = Team::getTeams()))
+                    foreach ($teams as $id => $name)
+                        $assignees['t'.$id] = $name;
+
+                if (!$source && $this->isOpen() && $this->team)
+                    $assignee = sprintf('s%d', $this->team->getId());
+                $prompt = __('Select a Team');
+                break;
+        }
+
+        // Default to current assignee if source is not set
         if (!$source)
-            $source = array('assignee' => array($this->getAssigneeId()));
+            $source = array('assignee' => array($assignee));
+
+        $form = AssignmentForm::instantiate($source, $options);
+
+        if ($assignees)
+            $form->setAssignees($assignees);
+
+        if ($prompt && ($f=$form->getField('assignee')))
+            $f->configure('prompt', $prompt);
+
 
-        $options += array('dept' => $this->getDept());
+        return $form;
 
-        return AssignmentForm::instantiate($source, $options);
     }
 
     function getTransferForm($source=null) {
@@ -2118,9 +2154,7 @@ implements RestrictedAccess, Threadable {
 
         $this->logEvent('assigned', $evd);
 
-        $this->onAssign($assignee,
-                $form->getField('comments')->getClean(),
-                $alert);
+        $this->onAssign($assignee, $form->getComments(), $alert);
 
         return true;
     }
diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php
index 156b2c323556a57f4de5771baae88a64eb123fc0..d89a4d5e34da99bfdc3616234cc9df39814f5632 100644
--- a/include/staff/ticket-view.inc.php
+++ b/include/staff/ticket-view.inc.php
@@ -86,13 +86,13 @@ if($ticket->isOverdue())
 
             <?php
             // Assign
-            if ($role->hasPerm(TicketModel::PERM_ASSIGN)) {?>
+            if ($ticket->isOpen() && $role->hasPerm(TicketModel::PERM_ASSIGN)) {?>
             <span class="action-button pull-right" data-dropdown="#action-dropdown-assign">
                 <i class="icon-caret-down pull-right"></i>
                 <a class="ticket-action" id="ticket-assign"
                     data-redirect="tickets.php"
                     href="#tickets/<?php echo $ticket->getId(); ?>/assign"><i class="icon-user"></i> <?php
-                    echo $ticket->isAssigned() ? __('Assign') :  __('Reassign'); ?></a>
+                    echo $ticket->isAssigned() ? __('Reassign') :  __('Assign'); ?></a>
             </span>
             <div id="action-dropdown-assign" class="action-dropdown anchor-right">
               <ul>