diff --git a/css/tmgmt.admin.css b/css/tmgmt.admin.css
index 1522da8..74d6f69 100644
--- a/css/tmgmt.admin.css
+++ b/css/tmgmt.admin.css
@@ -84,8 +84,10 @@ table.tmgmt-ui-review tbody th {
   text-align: center;
   border-style: solid;
   box-shadow: 0 0 4px rgba(0,0,0,0.4);
-  -moz-box-shadow: 0 0 4px rgba(0,0,0,0.4);
-  -webkit-box-shadow: 0 0 4px rgba(0,0,0,0.4);
+}
+
+.tmgmt-ui-icon img {
+  vertical-align: text-bottom;
 }
 
 /* Icon sizes. */
@@ -94,13 +96,7 @@ table.tmgmt-ui-review tbody th {
   height: 32px;
   border-width: 1px;
   line-height: 32px;
-  text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
   border-radius: 3px;
-  -moz-border-radius: 3px;
-}
-
-.tmgmt-ui-icon.tmgmt-ui-icon-32 span {
-  font-size: 23px;
 }
 
 .tmgmt-legend div {
diff --git a/sources/content/src/ContentEntitySourcePluginUi.php b/sources/content/src/ContentEntitySourcePluginUi.php
index 58003c4..856284c 100644
--- a/sources/content/src/ContentEntitySourcePluginUi.php
+++ b/sources/content/src/ContentEntitySourcePluginUi.php
@@ -177,15 +177,11 @@ class ContentEntitySourcePluginUi extends SourcePluginUiBase {
         }
       }
 
-      $array = array(
-        '#theme' => 'tmgmt_translation_language_status_single',
-        '#translation_status' => $translation_status,
-        '#job_item' => isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL,
-      );
-      $row['langcode-' . $langcode] = array(
-        'data' => \Drupal::service('renderer')->render($array),
+      $build = $this->buildTranslationStatus($translation_status, isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL);
+      $row['langcode-' . $langcode] = [
+        'data' => \Drupal::service('renderer')->render($build),
         'class' => array('langstatus-' . $langcode),
-      );
+      ];
     }
     return $row;
   }
diff --git a/sources/locale/src/LocaleSourcePluginUi.php b/sources/locale/src/LocaleSourcePluginUi.php
index 77930d3..8943875 100644
--- a/sources/locale/src/LocaleSourcePluginUi.php
+++ b/sources/locale/src/LocaleSourcePluginUi.php
@@ -235,12 +235,8 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
 
 
     foreach (\Drupal::languageManager()->getLanguages() as $langcode => $language) {
-      $array = array(
-        '#theme' => 'tmgmt_translation_language_status_single',
-        '#translation_status' => $data['translation_statuses'][$langcode],
-        '#job_item' => isset($data['current_job_items'][$langcode]) ? $data['current_job_items'][$langcode] : NULL,
-      );
-      $row['langcode-' . $langcode] = \Drupal::service('renderer')->render($array);
+      $build = $this->buildTranslationStatus($data['translation_statuses'][$langcode], isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL);
+      $row['langcode-' . $langcode] = \Drupal::service('renderer')->render($build);
     }
 
     return $row;
diff --git a/sources/tmgmt_config/src/ConfigSourcePluginUi.php b/sources/tmgmt_config/src/ConfigSourcePluginUi.php
index aadd07f..9f00505 100644
--- a/sources/tmgmt_config/src/ConfigSourcePluginUi.php
+++ b/sources/tmgmt_config/src/ConfigSourcePluginUi.php
@@ -151,15 +151,12 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
 
       // @todo Find a way to support marking configuration translations as outdated.
 
-      $array = array(
-        '#theme' => 'tmgmt_translation_language_status_single',
-        '#translation_status' => $translation_status,
-        '#job_item' => isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL,
-      );
-      $row['langcode-' . $langcode] = array(
-        'data' => \Drupal::service('renderer')->render($array),
+      $build = $this->buildTranslationStatus($translation_status, isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL);
+      $row['langcode-' . $langcode] = [
+        'data' => \Drupal::service('renderer')->render($build),
         'class' => array('langstatus-' . $langcode),
-      );
+      ];
+
     }
     return $row;
   }
@@ -198,15 +195,11 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
 
       // @todo Find a way to support marking configuration translations as outdated.
 
-      $array = array(
-        '#theme' => 'tmgmt_translation_language_status_single',
-        '#translation_status' => $translation_status,
-        '#job_item' => isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL,
-      );
-      $row['langcode-' . $langcode] = array(
-        'data' => \Drupal::service('renderer')->render($array),
+      $build = $this->buildTranslationStatus($translation_status, isset($current_job_items[$langcode]) ? $current_job_items[$langcode] : NULL);
+      $row['langcode-' . $langcode] = [
+        'data' => \Drupal::service('renderer')->render($build),
         'class' => array('langstatus-' . $langcode),
-      );
+      ];
     }
     return $row;
   }
diff --git a/src/Form/JobItemForm.php b/src/Form/JobItemForm.php
index 5a4afc5..6a9bc02 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -409,10 +409,7 @@ class JobItemForm extends TmgmtFormBase {
           '#parent_label' => $data[$key]['#parent_label'],
           '#zebra' => $zebra,
         );
-        $form[$target_key]['status'] = array(
-          '#theme' => 'tmgmt_translator_review_form_element_status',
-          '#value' => $job_item->isAccepted() ? TMGMT_DATA_ITEM_STATE_ACCEPTED : $data[$key]['#status'],
-        );
+        $form[$target_key]['status'] = $this->buildStatusRenderArray($job_item->isAccepted() ? TMGMT_DATA_ITEM_STATE_ACCEPTED : $data[$key]['#status']);
         $form[$target_key]['actions'] = array(
           '#type' => 'container',
         );
@@ -693,6 +690,52 @@ class JobItemForm extends TmgmtFormBase {
   }
 
   /**
+   * Builds the render array for the status icon.
+   *
+   * @param int $status
+   *   Data item status.
+   *
+   * @return array
+   *   The render array for the status icon.
+   */
+  protected function buildStatusRenderArray($status) {
+    $classes = array();
+    $classes[] = 'tmgmt-ui-icon';
+    // Icon size 32px square.
+    $classes[] = 'tmgmt-ui-icon-32';
+    switch ($status) {
+      case TMGMT_DATA_ITEM_STATE_ACCEPTED:
+        $title = t('Accepted');
+        $icon = 'core/misc/icons/73b355/check.svg';
+        break;
+      case TMGMT_DATA_ITEM_STATE_REVIEWED:
+        $title = t('Reviewed');
+        $icon = drupal_get_path('module', 'tmgmt') . '/icons/gray-check.svg';
+        break;
+      case TMGMT_DATA_ITEM_STATE_TRANSLATED:
+        $title = t('Translated');
+        $icon = drupal_get_path('module', 'tmgmt') . '/icons/ready.svg';
+        break;
+      case TMGMT_DATA_ITEM_STATE_PENDING:
+      default:
+        $title = t('Pending');
+        $icon = drupal_get_path('module', 'tmgmt') . '/icons/hourglass.svg';
+        break;
+    }
+
+    return [
+      '#type' => 'container',
+      '#attributes' => ['class' => $classes],
+      'icon' => [
+        '#theme' => 'image',
+        '#uri' => $icon,
+        '#title' => $title,
+        '#alt' => $title,
+      ],
+    ];
+  }
+
+  /**
    * Ajax callback for the job item review form.
    */
   function ajaxReviewForm(array $form, FormStateInterface $form_state) {
diff --git a/src/SourcePluginUiBase.php b/src/SourcePluginUiBase.php
index 9f4b5b5..25ef2f5 100644
--- a/src/SourcePluginUiBase.php
+++ b/src/SourcePluginUiBase.php
@@ -9,6 +9,7 @@ namespace Drupal\tmgmt;
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\tmgmt\Entity\JobItem;
 
 /**
  * Default ui controller class for source plugin.
@@ -178,4 +179,85 @@ class SourcePluginUiBase extends PluginBase implements SourcePluginUiInterface {
     return FALSE;
   }
 
+  /**
+   * Builds the translation status render array with source and job item status.
+   *
+   * @param int $status
+   *   The source status: original, missing, current or outofdate.
+   * @param \Drupal\tmgmt\JobItemInterface|NULL $job_item
+   *   The existing job item for the source.
+   *
+   * @return array
+   *   The render array for displaying the status.
+   */
+  function buildTranslationStatus($status, JobItemInterface $job_item = NULL) {
+    switch ($status) {
+      case 'original':
+        $label = t('Source language');
+        $icon = 'core/misc/icons/bebebe/house.svg';
+        break;
+
+      case 'missing':
+        $label = t('Not translated');
+        $icon = 'core/misc/icons/bebebe/ex.svg';
+        break;
+
+      case 'outofdate':
+        $label = t('Translation Outdated');
+        $icon = drupal_get_path('module', 'tmgmt') . '/icons/outdated.svg';
+        break;
+
+      default:
+        $label = t('Translation up to date');
+        $icon = 'core/misc/icons/73b355/check.svg';
+    }
+
+    $build['source'] = [
+      '#theme' => 'image',
+      '#uri' => $icon,
+      '#title' => $label,
+      '#alt' => $label,
+    ];
+
+    // If we have an active job item, wrap it in a link.
+    if ($job_item) {
+      $states_labels = JobItem::getStates();
+      $state_label = $states_labels[$job_item->getState()];
+      $label = t('Active job item: @state', array('@state' => $state_label));
+      $url = $job_item->toUrl();
+      $job = $job_item->getJob();
+
+      switch ($job_item->getState()) {
+        case JobItem::STATE_ACTIVE:
+          if ($job->isUnprocessed()) {
+            $url = $job->toUrl();
+            $label = t('Active job item: @state', array('@state' => $state_label));
+          }
+          $icon = drupal_get_path('module', 'tmgmt') . '/icons/hourglass.svg';
+          break;
+
+        case JobItem::STATE_REVIEW:
+          $icon = drupal_get_path('module', 'tmgmt') . '/icons/ready.svg';
+          break;
+      }
+
+      $url->setOption('query', \Drupal::destination()->getAsArray());
+      $url->setOption('attributes', array('title' => $label));
+
+      $item_icon = [
+        '#theme' => 'image',
+        '#uri' => $icon,
+        '#title' => $label,
+        '#alt' => $label,
+      ];
+
+      $build['job_item'] = [
+        '#type' => 'link',
+        '#url' => $url,
+        '#title' => $item_icon,
+      ];
+    }
+    return $build;
+  }
+
 }
diff --git a/tmgmt.module b/tmgmt.module
index deb0792..72012e8 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -539,16 +539,6 @@ function tmgmt_theme() {
       'file' => 'tmgmt.theme.inc',
       'function' => 'theme_tmgmt_translator_review_form_element',
     ),
-    'tmgmt_translator_review_form_element_status' => array(
-      'render element' => 'status',
-      'file' => 'tmgmt.theme.inc',
-      'function' => 'theme_tmgmt_translator_review_form_element_status',
-    ),
-    'tmgmt_translation_language_status_single' => array(
-      'file' => 'tmgmt.theme.inc',
-      'variables' => array('translation_status' => NULL, 'job_item' => NULL),
-      'function' => 'theme_tmgmt_translation_language_status_single',
-    ),
     'tmgmt_progress_bar' => array(
       'variables' => array(
         'title' => NULL,
diff --git a/tmgmt.theme.inc b/tmgmt.theme.inc
index e27e610..80b0ae3 100644
--- a/tmgmt.theme.inc
+++ b/tmgmt.theme.inc
@@ -5,143 +5,11 @@
  * Theme file stub for tmgmt.
  */
 
-use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Template\Attribute;
-use Drupal\Core\Url;
-use Drupal\tmgmt\Entity\JobItem;
 use Drupal\Core\Render\Element;
 
 /**
- * Generic theme function for use with Render API.
- *
- * Renders the #title and #attributes properties if they are present.
- */
-function theme_tmgmt_element($variables) {
-  $element = $variables['element'];
-
-  // Use the #title attribute.
-  $title = '';
-  if (!empty($element['#title'])) {
-    $title = '<h3>' . Html::escape($element['#title']) . '</h3>';
-  }
-
-  // Use #attributes to customize a wrapper <div>.
-  $attributes = '';
-  if (!empty($element['#attributes'])) {
-    // @todo: Convert the source.
-    $attributes = new Attribute(($element['#attributes']));
-  }
-
-  // Render any child items.
-  if (!$element['#children']) {
-    $element['#children'] = drupal_render_children($element);
-  }
-
-  // Build simple output.
-  $output = "<div{$attributes}>{$title}{$element['#children']}</div>";
-  return $output;
-}
-
-/**
- * Gets translation language status.
- *
- * @param array $variables
- *   - 'translation_status': A flag that determines the status. Possible values:
- *     original, missing, outofdate.
- *   - 'job_item': Current job item entity associated with translation.
- *
- * @return string
- *   Icon or a link icon that explains the translation status and possibly
- *   links to an active translation job.
- */
-function theme_tmgmt_translation_language_status_single($variables) {
-  switch ($variables['translation_status']) {
-    case 'original':
-      $label = t('Source language');
-      $icon = 'core/misc/icons/bebebe/house.svg';
-      break;
-
-    case 'missing':
-      $label = t('Not translated');
-      $icon = 'core/misc/icons/bebebe/ex.svg';
-     break;
-
-    case 'outofdate':
-      $label = t('Translation Outdated');
-      $icon = drupal_get_path('module', 'tmgmt') . '/icons/outdated.svg';
-      break;
-
-    default:
-      $label = t('Translation up to date');
-      $icon = 'core/misc/icons/73b355/check.svg';
-  }
-
-  $status = SafeMarkup::format('<img src="@s" title="@l"><span></span></img>', array("@s" => file_create_url($icon), "@l" => $label));
-
-  // If we have an active job item, wrap it in a link.
-  if (!empty($variables['job_item'])) {
-    $states_labels = JobItem::getStates();
-    $state_label = $states_labels[$variables['job_item']->getState()];
-    $label = t('Active job item: @state', array('@state' => $state_label));
-    $uri = $variables['job_item']->urlInfo();
-    /** @var \Drupal\tmgmt\JobInterface $job */
-    $job = $variables['job_item']->getJob();
-
-    switch ($variables['job_item']->getState()) {
-      case JobItem::STATE_ACTIVE:
-        if ($job->isUnprocessed()) {
-          $uri = $job->urlInfo();
-          $label = t('Active job item: @state', array('@state' => $state_label));
-        }
-        $icon = drupal_get_path('module', 'tmgmt') . '/icons/hourglass.svg';
-        break;
-
-      case JobItem::STATE_REVIEW:
-        $icon = drupal_get_path('module', 'tmgmt') . '/icons/ready.svg';
-        break;
-    }
-
-    $job_status = SafeMarkup::format('<img src="@s" title="@l"><span></span></img>', array("@s" => file_create_url($icon), "@l" => $label));
-
-    $uri->setOption('query', array('destination' => Url::fromRoute('<current>')->getInternalPath()));
-    $uri->setOption('attributes', array('title' => $label));
-    $uri->setOption('html', TRUE);
-    $status .= \Drupal::l(['#markup' => $job_status], $uri);
-  }
-  return $status;
-}
-
-/**
- * Renders a data item status as an HTML/CSS icon.
- */
-function theme_tmgmt_translator_review_form_element_status($variables) {
-  $classes = array();
-  $classes[] = 'tmgmt-ui-icon';
-  $classes[] = 'tmgmt-ui-icon-32'; // Icon size 32px square.
-  switch ($variables['status']['#value']) {
-    case TMGMT_DATA_ITEM_STATE_ACCEPTED:
-      $title = t('Accepted');
-      $icon = 'core/misc/icons/73b355/check.svg';
-      break;
-    case TMGMT_DATA_ITEM_STATE_REVIEWED:
-      $title = t('Reviewed');
-      $icon = drupal_get_path('module', 'tmgmt') . '/icons/gray-check.svg';
-      break;
-    case TMGMT_DATA_ITEM_STATE_TRANSLATED:
-      $title = t('Translated');
-      $icon = drupal_get_path('module', 'tmgmt') . '/icons/ready.svg';
-      break;
-    case TMGMT_DATA_ITEM_STATE_PENDING:
-    default:
-      $title = t('Pending');
-      $icon = drupal_get_path('module', 'tmgmt') . '/icons/hourglass.svg';
-      break;
-  }
-  return SafeMarkup::format('<div class="@c"><img src="@s" alt="@t"/><span></span></div>', array("@c" => implode(' ', $classes), "@s" => file_create_url($icon), "@t" => $title));
-}
-
-/**
  * Render one single data item as a table row.
  */
 function theme_tmgmt_translator_review_form_element($variables) {
