diff --git a/includes/tmgmt.entity.inc b/includes/tmgmt.entity.inc
index fe2ef2d..9103a6d 100755
--- a/includes/tmgmt.entity.inc
+++ b/includes/tmgmt.entity.inc
@@ -464,17 +464,27 @@ class TMGMTJobItem extends Entity {
    * - #translation: The translated data. Set by the translator plugin.
    *
    * The key can be an alphanumeric string.
+   * @param $key
+   *   If present, only the subarray identified by key is returned.
+   * @param $index
+   *   Optional index of an attribute below $key.
    *
    * @return array
    *   A structured data array.
    */
-  public function getData() {
+  public function getData(array $key = array(), $index = null) {
     if (empty($this->data)) {
       // Load the data from the source if it has not been set yet.
       $this->data = $this->getSourceData();
       $this->save();
     }
-    return $this->data;
+    if (empty($key)) {
+      return $this->data;
+    }
+    if ($index) {
+      $key = array_merge($key, array($index));
+    }
+    return drupal_array_get_nested_value($this->data, $key);
   }
 
   /**
@@ -674,13 +684,17 @@ class TMGMTJobItem extends Entity {
    *   one, e.g. array('key1', 'key2', 'key2'). Defaults to an empty array which
    *   means that it will replace the whole translated data array.
    */
-  protected function addTranslatedDataRecursive($translation, $key = array()) {
+  protected function addTranslatedDataRecursive($translation, array $key = array()) {
     if (isset($translation['#text'])) {
-      $values = array(
-        '#translation' => $translation,
-        '#status' => TMGMT_DATA_ITEM_STATE_TRANSLATED,
-      );
-      $this->updateData($key, $values);
+      $status = $this->getData($key, '#status');
+      if (!$status || $status == TMGMT_DATA_ITEM_STATE_PENDING) {
+        dpm($status, tmgmt_ensure_keys_string($key));
+        $values = array(
+          '#translation' => $translation,
+          '#status' => TMGMT_DATA_ITEM_STATE_TRANSLATED,
+        );
+        $this->updateData($key, $values);
+      }
       return;
     }
     foreach (element_children($translation) as $item) {
@@ -1458,18 +1472,29 @@ class TMGMTJob extends Entity {
   /**
    * Returns the source data of all job items.
    *
-   * @param $reset
-   *   Whether the source data should be regenerated from the source objects.
-   *
+   * @param $key
+   *   If present, only the subarray identified by key is returned.
+   * @param $index
+   *   Optional index of an attribute below $key.
    * @return array
    *   A nested array with the source data where the most upper key is the job
    *   item id.
    */
-  public function getData($reset = FALSE) {
+  public function getData(array $key = array(), $index = null) {
     $data = array();
-    foreach ($this->getItems() as $key => $item) {
-      $data[$key] = $item->getData($reset);
+    if (!empty($key)) {
+      $tjiid = array_shift($key);
+      $job_item = entity_load_single('tmgmt_job_item', $tjiid);
+      if ($job_item) {
+        $data[$tjiid] = $job_item->getData($key, $index);
+      }
+    }
+    else {
+      foreach ($this->getItems() as $key => $item) {
+        $data[$key] = $item->getData();
+      }
     }
+    debug($data);
     return $data;
   }
 
@@ -1516,12 +1541,8 @@ class TMGMTJob extends Entity {
    *   upper key entry needs to be the job id (tjiid).
    */
   public function addTranslatedData($data, $key = NULL) {
-    if (empty($key)) {
-      $key = array();
-    }
-    if (!is_array($key)) {
-      $key = explode(TMGMT_ARRAY_DELIMITER, $key);
-    }
+    $key = tmgmt_ensure_keys_array($key);
+    debug($data, $key);
     $items = $this->getItems();
     // If there is a key, get the specific item and forward the call.
     if (!empty($key)) {
diff --git a/includes/tmgmt.plugin.inc b/includes/tmgmt.plugin.inc
index 35eb78f..0d50419 100755
--- a/includes/tmgmt.plugin.inc
+++ b/includes/tmgmt.plugin.inc
@@ -307,7 +307,28 @@ interface TMGMTTranslatorRejectDataItem {
    *   In case of an error, it is the responsibility of the translator to
    *   provide informations about the faliure.
    */
-  public function rejectDataItem(TMGMTJobItem $job_item, array $key);
+  public function rejectDataItem(TMGMTJobItem $job_item, array $key, array $values = NULL);
+
+  /**
+   * Reject form.
+   *
+   * This method gets call by tmgmt_ui_translation_review_form_reject_confirm
+   * and allows the translator to add aditional form elements in order to
+   * collect data needed for the reject prozess.
+   *
+   * @param $form
+   *   The form array containing a confirm form.
+   *   $form['item'] holds the job item to which the to berejected data item
+   *   belongs to.
+   *   $form['item'] holds key of the approved data item as an array of keys of
+   *   a nested array hierarchy.
+   * @param $form_state
+   *   The form state.
+   *
+   * @return
+   *   The resulting form array.
+   */
+  public function rejectForm($form, &$form_state);
 }
 
 /**
diff --git a/sources/node/views/handlers/tmgmt_node_handler_field_translation_language_status.inc b/sources/node/views/handlers/tmgmt_node_handler_field_translation_language_status.inc
index 863cd9d..516212a 100644
--- a/sources/node/views/handlers/tmgmt_node_handler_field_translation_language_status.inc
+++ b/sources/node/views/handlers/tmgmt_node_handler_field_translation_language_status.inc
@@ -53,17 +53,26 @@ class tmgmt_node_handler_field_translation_language_status extends views_handler
       $nids[] = $tnid;
     }
     if ($nodes = node_load_multiple($nids)) {
-      $result = db_select('node', 'n')
-        ->fields('n', array('tnid', 'language'))
-        ->condition('tnid', $nids)
-        ->execute()
-        ->fetchAll();
+      $vids = array();
+      foreach ($nodes as $node) {
+        $vids[] = $node->vid;
+      }
+
+      $select = db_select('node', 'n');
+      $select->leftJoin('tmgmt_job_item', 'tji', "n.vid = tji.item_id AND tji.plugin = 'node' AND tji.item_type = 'node'");
+      $select->leftJoin('tmgmt_job', 'tj', 'tji.tjid = tj.tjid');
+      $select->condition('tji.item_id', $vids);
+      $select->fields('n', array('vid', 'nid'));
+      $select->fields('tj', array('target_language'));
+      $select->addExpression('MAX(tji.item_id)');
+      $select->groupBy('n.vid');
+      $select->groupBy('tj.target_language');
 
       $this->language_items = array();
-      foreach ($result as $tnode) {
-          $this->language_items[$tnode->tnid][$tnode->language] = 1;
+      $result = $select->execute();
+      foreach ($result as $row) {
+        $this->language_items[$row->nid][$row->target_language] = 1;
       }
-
     }
   }
 
diff --git a/tests/tmgmt_test.plugin.inc b/tests/tmgmt_test.plugin.inc
index 49d57e2..ea9b80a 100755
--- a/tests/tmgmt_test.plugin.inc
+++ b/tests/tmgmt_test.plugin.inc
@@ -122,11 +122,18 @@ class TMGMTTestTranslatorPluginController extends TMGMTDefaultTranslatorPluginCo
   /**
    * Overrides TMGMTTranslatorRejectDataItem::rejectDataItem().
    */
-  public function rejectDataItem(TMGMTJobItem $job_item, array $key) {
+  public function rejectDataItem(TMGMTJobItem $job_item, array $key, array $values = NULL) {
     $key = '[' . implode('][', $key) . ']';
     $job_item->addMessage('Rejected data item @key for job item @item in job @job.', array('@key' => $key, '@item' => $job_item->tjiid, '@job' => $job_item->tjid));
     return TRUE;
   }
+
+  /**
+   * Implements TMGMTTranslatorRejectDataItem::rejectForm().
+   */
+  public function rejectForm($form, &$form_state) {
+    return $form;
+  }
 }
 
 class TMGMTTestSourcePluginController extends TMGMTDefaultSourcePluginController {
diff --git a/tmgmt.module b/tmgmt.module
index 483c774..c3a51fc 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -1099,6 +1099,7 @@ function tmgmt_flatten_data($data, $prefix = NULL, $label = array()) {
   }
   return $flattened_data;
 }
+
 /**
  * Converts string keys to array keys.
  *
@@ -1123,6 +1124,28 @@ function tmgmt_ensure_keys_array($key) {
 }
 
 /**
+ * Converts keys array to string key.
+ *
+ * There are three conventions for data keys in use. This function accepts each
+ * of it an ensures a sting keys.
+ *
+ * @param $key
+ *   The key can be either be an array containing the keys of a nested array
+ *   hierarchy path or a string.
+ * @param
+ *   Delimiter to be use in the keys string. Default is ']['.
+ *
+ * @return
+ *  Keys string.
+ */
+function tmgmt_ensure_keys_string($key, $delimiter = TMGMT_ARRAY_DELIMITER) {
+  if (is_array($key)) {
+    $key = implode($delimiter, $key);
+  }
+  return $key;
+}
+
+/**
  * Converts a flattened data structure into a nested array.
  *
  * This function can be used by translators to help with the data conversion.
diff --git a/translators/file/tmgmt_file.module b/translators/file/tmgmt_file.module
index 07a1546..224b9d4 100644
--- a/translators/file/tmgmt_file.module
+++ b/translators/file/tmgmt_file.module
@@ -57,6 +57,7 @@ function tmgmt_file_import_form_submit($form, &$form_state) {
           // Validation successful, start import.
           $job->addTranslatedData($controller->import($file->uri));
           $job->addMessage('Sucessfully imported file.');
+          debug($job->dataItems());
         } catch (Exception $e) {
           $job->addMessage('File import failed with the following message: @message', array('@message' => $e->getMessage()), 'error');
         }
diff --git a/translators/nativy/tmgmt_nativy.module b/translators/nativy/tmgmt_nativy.module
index 3a86ec8..c3b17ff 100755
--- a/translators/nativy/tmgmt_nativy.module
+++ b/translators/nativy/tmgmt_nativy.module
@@ -64,11 +64,21 @@ function tmgmt_nativy_process_callback(TMGMTJob $job) {
     return;
   }
 
-  if ($controller->retrieveTranslation($job)) {
-    $job->addMessage('Successfully retrieved translation.');
+  if (!empty($_GET['text_to_key'])) {
+    if ($success = $controller->nativyRetrieveSingleTranslation($job, tmgmt_ensure_keys_array($_GET['text_to_key']))) {
+      $job->addMessage('Successfully retrieved single translation.');
+    }
+    else {
+      $job->addMessage('Failed to retrieve single translation.', 'warning');
+    }
   }
   else {
-    $job->addMessage('Failed to retrieve the translation.', 'warning');
+    if ($success = $controller->retrieveTranslation($job)) {
+      $job->addMessage('Successfully retrieved translation.');
+    }
+    else {
+      $job->addMessage('Failed to retrieve the translation.', 'warning');
+    }
   }
 }
 
diff --git a/translators/nativy/tmgmt_nativy.plugin.inc b/translators/nativy/tmgmt_nativy.plugin.inc
index dd2dfd2..2783eed 100755
--- a/translators/nativy/tmgmt_nativy.plugin.inc
+++ b/translators/nativy/tmgmt_nativy.plugin.inc
@@ -8,7 +8,7 @@
 /**
  * Nativy translator plugin controller.
  */
-class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPluginController {
+class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPluginController implements TMGMTTranslatorRejectDataItem {
 
   protected $live_site = 'http://nativy.com/';
   protected $test_site = 'http://test.nativy.com/';
@@ -26,9 +26,8 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
    * @return
    *   The service response.
    */
-  protected function get(TMGMTTranslator $translator, $method, array $query = array()) {
-    $data = $this->request(url($this->getURL($translator, $method), array('query' => $query, 'absolute' => TRUE)));
-    return json_decode($data);
+  protected function get(TMGMTTranslator $translator, $method, array $query = array(), &$status = NULL) {
+    return $this->request(url($this->getURL($translator, $method), array('query' => $query, 'absolute' => TRUE)), array(), $status);
   }
 
   /**
@@ -42,7 +41,7 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
    * @return
    *   The JSON
    */
-  protected function request($url, $options = array()) {
+  protected function request($url, $options = array(), &$status = NULL) {
     $start = microtime(TRUE);
     $request = drupal_http_request($url, $options);
 
@@ -55,7 +54,7 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
 
     db_insert('tmgmt_nativy_log')
       ->fields(array(
-        'url' => $url,
+        'url' => substr($url, 0, 255),
         'request' => $request->request,
         'response_code' => $request->code,
         'response_data' => isset($request->data) ? $request->data : '',
@@ -64,7 +63,9 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
       ))
       ->execute();
 
-    return isset($request->data) ? $request->data : '';
+    $status = $request->code;
+
+    return isset($request->data) ? json_decode($request->data) : '';
   }
 
   /**
@@ -80,7 +81,7 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
    * @return
    *   The returned, json decoded object.
    */
-  protected function post(TMGMTTranslator $translator, $method, $query = array()) {
+  protected function post(TMGMTTranslator $translator, $method, $query = array(), &$status = NULL) {
     $url = url($this->getURL($translator, $method), array($query));
     $options = array(
       'headers' => array(
@@ -89,7 +90,31 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
       'method' => 'POST',
       'data' => $query,
     );
-    return json_decode($this->request($url, $options));
+    return $this->request($url, $options, $status);
+  }
+
+  /**
+   * Executes a put request.
+   *
+   * @param $translator
+   *   The translator entity.
+   * @param $method
+   *   The method to call.
+   * @param $query
+   *   The PUT data to submit.
+   *
+   * @return
+   *   The returned, json decoded object.
+   */
+  protected function put(TMGMTTranslator $translator, $method, $query = array(), &$status = NULL) {
+    $url = url($this->getURL($translator, $method), array('query' => $query));
+    $options = array(
+      'headers' => array(
+        'Content-type' => 'application/json',
+      ),
+      'method' => 'PUT',
+    );
+    return $this->request($url, $options, $status);
   }
 
   /**
@@ -214,6 +239,23 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
   }
 
   /**
+   * Retrieves an order object from the Nativy service.
+   *
+   * @param TMGMTJob $job
+   *   The job for which the order should be retrieved.
+   * @param $key
+   *   The key of the reviewd data item.
+   *   The key is an array containing the keys of a nested array hierarchy path.
+   *
+   * @return
+   *   The nativy order object.
+   */
+  public function nativyRetrieveSingleTranslation(TMGMTJob $job, array $key) {
+    $query = $this->getAuthenticationQuery($job->getTranslator());
+    return $this->get($job->getTranslator(), $this->reviewMethod($job, $key), $query);
+  }
+
+  /**
    * Retrieve job when ready (we got an email with a link?)
    */
   public function retrieveTranslation(TMGMTJob $job) {
@@ -233,6 +275,25 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
   }
 
   /**
+   * Retrieve review when ready
+   */
+  public function retrieveSingleTranslation(TMGMTJob $job, array $key) {
+    if ($document = $this->nativyRetrieveSingleTranslation($job, $key)) {
+      $translation = array();
+      foreach ($document->text_to as $text) {
+        $key = $text->Key;
+        $text = $text->Value;
+        $translation[$key] = array(
+          '#text' => $text,
+        );
+      }
+      $job->addTranslatedData($translation);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  /**
    * Implements TMGMTTranslatorPluginControllerInterface::getSupportedTargetLanguages().
    */
   public function getSupportedTargetLanguages(TMGMTTranslator $translator, $source_language) {
@@ -245,4 +306,47 @@ class TMGMTNativyTranslatorPluginController extends TMGMTDefaultTranslatorPlugin
     return $languages;
   }
 
+  /**
+   * Implements TMGMTTranslatorRejectDataItem::rejectDataItem().
+   */
+  public function rejectDataItem(TMGMTJobItem $job_item, array $key, array $values = NULL) {
+    array_unshift($key, $job_item->tjiid);
+    $query = $this->getAuthenticationQuery($job_item->getTranslator());
+    $query['comment'] = $values['comment'];
+    $this->put($job_item->getTranslator(), $this->reviewMethod($job_item->getJob(), $key), $query, $status);
+    if ($status != 200) {
+      $job_item->addMessage('Reject failed', array(), 'error');
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Implements TMGMTTranslatorRejectDataItem::rejectForm().
+   */
+  public function rejectForm($form, &$form_state) {
+    $form['comment'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Comment'),
+      '#description' => t('Provide a reason for your rejection.'),
+      '#required' => TRUE,
+    );
+    return $form;
+  }
+
+  /**
+   * Build a method string to acces a review.
+   *
+   * @param TMGMTJob $job
+   *   The job associated to the review.
+   * @param $key
+   *   The key of the reviewd data item.
+   *   The key is an array containing the keys of a nested array hierarchy path.
+   *
+   * @return
+   *   Method string to be used in a API request.
+   */
+  private function reviewMethod(TMGMTJob $job, array $key) {
+    return 'order/' . $job->reference . '/review/' . urlencode(tmgmt_ensure_keys_string($key));
+  }
 }
diff --git a/ui/includes/tmgmt_ui.controller.inc b/ui/includes/tmgmt_ui.controller.inc
index 8196e08..e8b0eaf 100644
--- a/ui/includes/tmgmt_ui.controller.inc
+++ b/ui/includes/tmgmt_ui.controller.inc
@@ -290,6 +290,17 @@ class TMGMTJobItemUIController extends EntityDefaultUIController {
       'file' => $this->entityInfo['admin ui']['file'],
       'file path' => $this->entityInfo['admin ui']['file path'],
     );
+    $items[$this->path . '/' . $wildcard . '/review/%/reject'] = array(
+      'title' => 'Reject',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('tmgmt_ui_translation_review_form_reject_confirm', $id_count, $id_count + 2),
+      'load arguments' => array($this->entityType),
+      'access callback' => 'tmgmt_job_item_review_access',
+      'access arguments' => array($id_count),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => $this->entityInfo['admin ui']['file'],
+      'file path' => $this->entityInfo['admin ui']['file path'],
+    );
     // Menu item for operations like cancel.
     $items[$this->path . '/' . $wildcard . '/%'] = array(
       'page callback' => 'drupal_get_form',
diff --git a/ui/tmgmt_ui.module b/ui/tmgmt_ui.module
index 148f04a..6f5750d 100644
--- a/ui/tmgmt_ui.module
+++ b/ui/tmgmt_ui.module
@@ -447,7 +447,9 @@ function _tmgmt_ui_review_form_element($data, TMGMTJobItem $job_item, &$zebra) {
       if ($data[$key]['#status'] != TMGMT_DATA_ITEM_STATE_APPROVED) {
       $form[$target_key]['actions']['approve'] = array(
         '#type' => 'submit',
-        '#value' => t('Approve'),
+        // Unicode character &#x2713 CHECK MARK
+        '#value' => '✓',
+        '#attributes' => array('title' => t('Approve')),
         '#name' => 'approve-' . $target_key,
         '#submit' => array('tmgmt_ui_translation_review_form_update_state', 'tmgmt_ui_translation_review_form_submit'),
         '#ajax' => array(
@@ -459,13 +461,11 @@ function _tmgmt_ui_review_form_element($data, TMGMTJobItem $job_item, &$zebra) {
       if ($job_item->getTranslatorController() instanceof TMGMTTranslatorRejectDataItem && $data[$key]['#status'] != TMGMT_DATA_ITEM_STATE_PENDING) {
         $form[$target_key]['actions']['reject'] = array(
           '#type' => 'submit',
-          '#value' => t('Reject'),
+          // Unicode character &#x2717 BALLOT X
+          '#value' => '✗',
+          '#attributes' => array('title' => t('Reject')),
           '#name' => 'reject-' . $target_key,
-          '#submit' => array('tmgmt_ui_translation_review_form_update_state', 'tmgmt_ui_translation_review_form_submit'),
-          '#ajax' => array(
-            'callback' => 'tmgmt_ui_translation_review_form_ajax',
-            'wrapper' => $form[$target_key]['#ajaxid'],
-          ),
+          '#submit' => array('tmgmt_ui_translation_review_form_update_state'),
         );
       }
       $form[$target_key]['translation'] = array(
@@ -533,7 +533,7 @@ function tmgmt_ui_translation_review_form_submit($form, &$form_state) {
     }
   }
   // Check if the user clicked on 'Accept', 'Submit' or 'Reject'.
-  if ($form_state['triggering_element']['#value'] == $form['actions']['accept']['#value']) {
+  if (!empty($form['actions']['accept']) && $form_state['triggering_element']['#value'] == $form['actions']['accept']['#value']) {
     $item->acceptTranslation();
     // Check if the item could be saved and accepted successfully and redirect
     // to the job item view if that is the case.
@@ -560,7 +560,6 @@ function tmgmt_ui_translation_review_form_submit($form, &$form_state) {
  * Callback for the action at the job item review form.
  */
 function tmgmt_ui_translation_review_form_update_state($form, &$form_state) {
-  $form_state['rebuild'] = TRUE;
   $matches = array();
   // We should have an #name element
   // and the name should beginn with approve-
@@ -568,35 +567,43 @@ function tmgmt_ui_translation_review_form_update_state($form, &$form_state) {
   preg_match("/^(?P<action>[^-]+)-(?P<key>.+)/i", $form_state['triggering_element']['#name'], $matches);
   $values = $form_state['values'];
   $data = array();
-  $item = $form_state['item'];
-  foreach ($values as $key => $value) {
-    if ($key == $matches['key']) {
-      if (key_exists('translation', $value)) {
-        $data['#tranlsation'] = array(
-          '#text' => $value['translation'],
-        );
-      }
-      $controller = $item->getTranslatorController();
-      $success = TRUE;
-      switch ($matches['action']) {
-        case 'approve':
-          $data['#status'] = TMGMT_DATA_ITEM_STATE_APPROVED;
-          $success = $controller->approveDataItem($item, tmgmt_ensure_keys_array($key));
-          break;
-        case 'reject':
-          if ($controller instanceof TMGMTTranslatorRejectDataItem) {
-            $success = $item->getTranslatorController()->rejectDataItem($item, tmgmt_ensure_keys_array($key));
-          }
-        default:
-          $data['#status'] = TMGMT_DATA_ITEM_STATE_PENDING;
-          break;
+  $job_item = $form_state['item'];
+
+  $controller = $job_item->getTranslatorController();
+  $success = TRUE;
+  switch ($matches['action']) {
+    case 'approve':
+      $form_state['rebuild'] = TRUE;
+      $data['#status'] = TMGMT_DATA_ITEM_STATE_APPROVED;
+      $success = $controller->approveDataItem($item, tmgmt_ensure_keys_array($key));
+      break;
+    case 'reject':
+      if (empty($values['confirm'])) {
+        if (isset($_GET['destination'])) {
+          $destination = $_GET['destination'];
+          unset($_GET['destination']);
+        }
+        else {
+          $destination = '';
+        }
+        tmgmt_ui_redirect_queue_set(array(current_path()), $destination);
+        $form_state['redirect'] = current_path() . '/' . $matches['key'] . '/reject';
+        $success = FALSE;
       }
-      if ($success) {
-        $item->updateData($key, $data);
+      else {
+        $form_state['redirect'] = array(tmgmt_ui_redirect_queue_dequeue(), array( 'query' => array('destination' => tmgmt_ui_redirect_queue_destination())));
+        if ($controller instanceof TMGMTTranslatorRejectDataItem) {
+            $success = $job_item->getTranslatorController()->rejectDataItem($job_item, tmgmt_ensure_keys_array($matches['key']), $values);
+        }
       }
+    default:
+      $data['#status'] = TMGMT_DATA_ITEM_STATE_PENDING;
       break;
-    }
   }
+  if ($success) {
+    $job_item->updateData($matches['key'], $data);
+  }
+  tmgmt_ui_write_request_messages($job_item->getJob());
 }
 
 /**
@@ -613,6 +620,30 @@ function tmgmt_ui_translation_review_form_ajax($form, &$form_state) {
 }
 
 /**
+ * Form callback for the reject confirm form.
+ */
+function tmgmt_ui_translation_review_form_reject_confirm($form, &$form_state, TMGMTJobItem $job_item, $key) {
+  // Path of job item review form.
+  $path = explode('/', current_path());
+  $path = implode('/', array_slice($path, 0, count($path) - 2));
+  
+  $args = array(
+    '@data_item' => $job_item->getData(tmgmt_ensure_keys_array($key), '#label'),
+    '@job_item' => $job_item->label(),
+  );
+
+  $form = confirm_form( $form, t('Confirm rejection of @data_item in @job_item', $args), $path, '');
+  $form_state['item'] = $job_item;
+  $form['key'] = array('#type' => 'value', '#value' => $key);
+  $form['actions']['submit']['#name'] = 'reject-' . $key;
+  $form['actions']['submit']['#submit'] = array('tmgmt_ui_translation_review_form_update_state', 'tmgmt_ui_translation_review_form_submit');
+
+  $form = $job_item->getTranslatorController()->rejectForm($form, $form_state);
+  
+  return $form;
+}
+
+/**
  * @addtogroup tmgmt_ui_redirect_queue
  * @{
  */
