diff --git a/payment/lib/Drupal/payment/Element/PaymentStatusesDisplay.php b/payment/lib/Drupal/payment/Element/PaymentStatusesDisplay.php
new file mode 100644
index 0000000..54374d6
--- /dev/null
+++ b/payment/lib/Drupal/payment/Element/PaymentStatusesDisplay.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\payment\Element\PaymentStatusesDisplay.
+ */
+
+namespace Drupal\payment\Element;
+
+use Drupal\payment\Plugin\payment\status\PaymentStatusInterface;
+
+/**
+ * Provides form callbacks for the payment_line_item form element.
+ */
+class PaymentStatusesDisplay {
+
+  /**
+   * Implements form #pre_render callback.
+   *
+   * @throws \InvalidArgumentException
+   */
+  public static function preRender(array $element) {
+    $statuses = $element['#statuses'];
+    $element['table'] = array(
+      '#empty' => t('There are no statuses.'),
+      '#header' => array(t('Status'), t('Date')),
+      '#type' => 'table',
+    );
+    foreach (array_reverse($statuses) as $i => $status) {
+      if (!($status instanceof PaymentStatusInterface)) {
+        throw new \InvalidArgumentException('A payment status does not implement \Drupal\payment\Plugin\payment\status\PaymentStatusInterface');
+      }
+      $definition = $status->getPluginDefinition();
+      $element['table']['status_' . $i] = array(
+        '#attributes' => array(
+          'class' => array(
+            'payment-status-plugin-' . $status->getPluginId(),
+          ),
+        ),
+        'label' => array(
+          '#attributes' => array(
+            'class' => array('payment-status-label'),
+          ),
+          '#markup' => $definition['label'],
+        ),
+        'created' => array(
+          '#attributes' => array(
+            'class' => array('payment-line-item-quantity'),
+          ),
+          '#markup' => format_date($status->getCreated()),
+        ),
+      );
+    }
+
+    return $element;
+  }
+}
diff --git a/payment/lib/Drupal/payment/Tests/Element/PaymentStatusesDisplayWebTest.php b/payment/lib/Drupal/payment/Tests/Element/PaymentStatusesDisplayWebTest.php
new file mode 100644
index 0000000..51355ff
--- /dev/null
+++ b/payment/lib/Drupal/payment/Tests/Element/PaymentStatusesDisplayWebTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains class \Drupal\payment\Tests\PaymentStatusesDisplayWebTest.
+ */
+
+namespace Drupal\payment\Tests\Element;
+
+use Drupal\payment\Generate;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the payment_statuses_display element.
+ */
+class PaymentStatusesDisplayWebTest extends WebTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = array('payment');
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'description' => '',
+      'name' => 'payment_statuses_display element',
+      'group' => 'Payment',
+    );
+  }
+
+  /**
+   * Tests the element.
+   */
+  protected function testElement() {
+    $payment = Generate::createPayment(2)
+      ->setStatus($this->container->get('plugin.manager.payment.status')->createInstance('payment_failed'));
+    $element = array(
+      '#statuses' => $payment->getStatuses(),
+      '#type' => 'payment_statuses_display',
+    );
+    $this->drupalSetContent(drupal_render($element));
+    $this->verbose($this->drupalGetContent());
+    $strings = array('<table', t('Status'), t('Date'), t('Created'), t('Failed'), 'payment-status-plugin-payment_created');
+    foreach ($strings as $string) {
+      $this->assertRaw($string);
+    }
+  }
+}
diff --git a/payment/payment.module b/payment/payment.module
index 5f49b0b..72e4ea0 100644
--- a/payment/payment.module
+++ b/payment/payment.module
@@ -287,6 +287,13 @@ function payment_element_info() {
     '#pre_render' => array(array('\Drupal\payment\Element\PaymentLineItemsDisplay', 'preRender')),
   );
 
+  // Payment statuses display.
+  $elements['payment_statuses_display'] = array(
+    // A \Drupal\payment\Entity\PaymentInterface object (required).
+    '#payment' => NULL,
+    '#pre_render' => array(array('\Drupal\payment\Element\PaymentStatusesDisplay', 'preRender')),
+  );
+
   return $elements;
 }
 
diff --git a/payment/payment.ui.inc b/payment/payment.ui.inc
index cc44cbc..03e6fac 100644
--- a/payment/payment.ui.inc
+++ b/payment/payment.ui.inc
@@ -192,31 +192,6 @@ function payment_form_payment_delete_submit(array $form, array &$form_state) {
 }
 
 /**
- * Return a render array containing a Payment's status items.
- *
- * @param Payment $payment
- *
- * @return array
- */
-function payment_status_items(Payment $payment) {
-  $status = payment_status_info($payment->getStatus()->status, TRUE);
-  $rows = array();
-  foreach (array_reverse($payment->statuses) as $status_item) {
-    $status = payment_status_info($status_item->status);
-    $rows[] = array($status->title, format_date($status_item->created));
-  }
-  $build['status_items'] = array(
-    '#type' => 'markup',
-    '#markup' => theme('table', array(
-      'header' => array(t('Status'), t('Date')),
-      'rows' => $rows,
-    )),
-  );
-
-  return $build;
-}
-
-/**
  * Return payment methods for use in form elements.
  *
  * @return array
