diff --git a/tmgmt.module b/tmgmt.module
index 627e919..cecaae4 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -1064,17 +1064,21 @@ function _tmgmt_plugin_labels($type) {
  *
  * @see tmgmt_unflatten_data()
  */
-function tmgmt_flatten_data($data, $prefix = NULL) {
+function tmgmt_flatten_data($data, $prefix = NULL, $label = array()) {
   $flattened_data = array();
+  if (isset($data['#label'])) {
+    $label[] = $data['#label'];
+  }
   // Each element is either a text (has #text property defined) or has children,
   // not both.
   if (!empty($data['#text'])) {
     $flattened_data[$prefix] = $data;
+    $flattened_data[$prefix]['#parent_label'] = $label;
   }
   else {
-    $prefix = !empty($prefix) ? $prefix . TMGMT_ARRAY_DELIMITER : '';
+    $prefix = isset($prefix) ? $prefix . TMGMT_ARRAY_DELIMITER : '';
     foreach (element_children($data) as $key) {
-      $flattened_data += tmgmt_flatten_data($data[$key], $prefix . $key);
+      $flattened_data += tmgmt_flatten_data($data[$key], $prefix . $key, $label);
     }
   }
   return $flattened_data;
diff --git a/ui/tmgmt_ui.module b/ui/tmgmt_ui.module
index 6bf34e1..7f330e2 100644
--- a/ui/tmgmt_ui.module
+++ b/ui/tmgmt_ui.module
@@ -91,10 +91,77 @@ function tmgmt_ui_theme() {
       'render element' => 'form',
       'file' => 'includes/tmgmt_ui.controller.inc',
     ),
+    'tmgmt_ui_translator_review_form' => array(
+      'render element' => 'form',
+    ),
+    'tmgmt_ui_translator_review_form_element' => array(
+      'render element' => 'element',
+    ),
   );
 }
 
 /**
+ * Returns HTML for a review table.
+ *
+ * @param An associative array containing review data.
+ * @return HTML table.
+ */
+function theme_tmgmt_ui_translator_review_form($variables) {
+  $form = $variables['form'];
+  $head  = '<th>' . t('Status') . "</th>\n";
+  $head .= '<th>' . t('Label') . "</th>\n";
+  $head .= '<th>' . t('Source') . "</th>\n";
+  $head .= '<th>' . t('Translation') . "</th>\n";
+  $head .= '<th>' . t('Actions') . "</th>\n";
+  $head = "<tr>\n" . $head . "</tr>\n";
+  $head = "<thead>\n" . $head . "</thead>\n";
+
+  $children = drupal_render_children($form);
+  
+  return "<table class=\"tmgmt_review\">\n" . $head . "\n" . $children . "</table>\n";
+}
+
+/**
+ * Returns HTML for a group of review items.
+ *
+ * @param An associative array containing several review items.
+ * @return HTML table body fragment.
+ */
+function theme_tmgmt_ui_translator_review_form_element($variables) {
+  $element = $variables['element'];
+  $result = '';
+  $labels = '';
+  $parent_label = '';
+  foreach (element_children($element) as $key) {
+    $labels = $element[$key]['#parent_label'];
+    $parent_label = array_shift($labels);
+    $leaf_label = array_pop($labels);
+    $result .= '<tr>';
+    $result .= _theme_table_cell('');
+    $result .= _theme_table_cell($leaf_label, TRUE);
+    $result .= _theme_table_cell(drupal_render($element[$key]['source']));
+    $result .= _theme_table_cell(drupal_render($element[$key]['translation']));
+    $result .= _theme_table_cell('');
+    $result .= "</tr>\n";
+  }
+  if (!empty($labels) && count($labels) > 1) {
+    $cell = array(
+      'data' => implode(' > ', $labels),
+      'colspan' => 4,
+    );
+    $result = '<tr>' . _theme_table_cell('') . _theme_table_cell($cell, TRUE) . "</tr>\n" . $result;
+  }
+  if (!empty($parent_label)) {
+    $cell = array(
+      'data' => $parent_label,
+      'colspan' => 5,
+    );
+    $result = '<tr>' . _theme_table_cell($cell, TRUE) . "</tr>\n" . $result;
+  }
+  return "<tbody>\n" . $result . "</tbody>\n";
+}
+
+/**
  * Implements hook_forms().
  */
 function tmgmt_ui_forms() {
@@ -343,10 +410,14 @@ function tmgmt_ui_translation_review_form_defaults($form, &$form_state, TMGMTJob
   // Actually build the review form elements...
   $form['review'] = array(
     '#type' => 'container',
-    '#tree' => TRUE,
+    '#theme' => 'tmgmt_ui_translator_review_form',
   );
   // Recursively build the review form.
-  $form['review'] += _tmgmt_ui_review_form_recursive($form_state, $item->getData());
+  $data = $item->getData();
+  foreach (element_children($data) as $key) {
+    $form['review'][$key] = _tmgmt_ui_review_form_element(tmgmt_flatten_data($data[$key], $key));
+  }
+  
   // Add the form actions as well.
   $form['actions']['#type'] = 'actions';
   $form['actions']['accept'] = array(
@@ -369,6 +440,34 @@ function tmgmt_ui_translation_review_form_defaults($form, &$form_state, TMGMTJob
 }
 
 /**
+ * Helper function for building a review form.
+ */
+function _tmgmt_ui_review_form_element($data) {
+  $form = array(
+    '#theme' => 'tmgmt_ui_translator_review_form_element',
+  );
+  foreach (element_children($data) as $key) {
+    $target_key = str_replace('][', '|', $key);
+    if (isset($data[$key]['#text']) && _tmgmt_filter_data($data[$key])) {
+      $form[$target_key] = array(
+        '#tree' => TRUE,
+        '#parent_label' => $data[$key]['#parent_label']
+      );
+      $form[$target_key]['translation'] = array(
+        '#type' => 'textarea',
+        '#default_value' => $data[$key]['#translation']['#text'],
+      );
+      $form[$target_key]['source'] = array(
+        '#type' => 'textarea',
+        '#default_value' => $data[$key]['#text'],
+        '#disabled' => TRUE,
+      );
+    }
+  }
+  return $form;
+}
+
+/**
  * Form callback for the job item review form.
  *
  * @see tmgmt_ui_forms()
@@ -407,6 +506,14 @@ function tmgmt_ui_translation_review_form_submit($form, &$form_state) {
   // Then invoke the submit method on the source controller.
   $translator = tmgmt_translator_ui_controller($item->getTranslator()->plugin);
   $translator->reviewFormSubmit($form, $form_state, $item);
+  // Write changes back to item
+  $values = $form_state['values'];
+  foreach (element_children($values) as $key) {
+    $value = $values[$key];
+    if (isset($value['translation'])) {
+      $item->addTranslatedData( array( '#text' => $value['translation']), str_replace('|', '][', $key));
+    }
+  }
   // Check if the user clicked on 'Accept', 'Submit' or 'Reject'.
   if ($form_state['triggering_element']['#value'] == $form['actions']['accept']['#value']) {
     $item->acceptTranslation();
@@ -433,26 +540,6 @@ function tmgmt_ui_translation_review_form_submit($form, &$form_state) {
 }
 
 /**
- * Helper function for recursively building a review form.
- */
-function _tmgmt_ui_review_form_recursive(&$form_state, $data) {
-  $form = array();
-  foreach (element_children($data) as $key) {
-    if (isset($data[$key]['#text']) && _tmgmt_filter_data($data[$key])) {
-      $form[$key] = array(
-        '#type' => 'textarea',
-        '#title' => isset($data[$key]['#label']) ? $data[$key]['#label'] : t('Unlabelled'),
-        '#default_value' => $data[$key]['#translation']['#text'],
-      );
-    }
-    elseif (is_array($data[$key])) {
-      $form[$key] = _tmgmt_ui_review_form_recursive($form_state, $data[$key]);
-    }
-  }
-  return $form;
-}
-
-/**
  * @addtogroup tmgmt_ui_redirect_queue
  * @{
  */
