diff --git a/contact_storage.module b/contact_storage.module
index 4ecdc25..e182cfa 100644
--- a/contact_storage.module
+++ b/contact_storage.module
@@ -106,4 +106,5 @@ function contact_storage_entity_type_alter(array &$entity_types) {
   $entity_types['contact_message']->setHandlerClass('views_data', '\Drupal\contact_storage\MessageViewsData');
   $entity_types['contact_message']->setListBuilderClass('\Drupal\Core\Entity\EntityListBuilder');
 
+  $entity_types['contact_form']->setViewBuilderClass('\Drupal\contact_storage\ContactFormViewBuilder');
 }
diff --git a/src/ContactFormViewBuilder.php b/src/ContactFormViewBuilder.php
new file mode 100644
index 0000000..67ba25b
--- /dev/null
+++ b/src/ContactFormViewBuilder.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\contact_storage\ContactFormViewBuilder.
+ */
+
+namespace Drupal\contact_storage;
+
+use Drupal\Core\Config\Config;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityFormBuilderInterface;
+use Drupal\Core\Entity\EntityHandlerInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\EntityViewBuilderInterface;
+use Drupal\Core\Field\FieldItemInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Render\RendererInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a contact form view builder.
+ *
+ * @see \Drupal\contact\Entity\ContactForm
+ */
+class ContactFormViewBuilder implements EntityViewBuilderInterface, EntityHandlerInterface {
+
+  /**
+   * The entity form builder.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
+   * The renderer.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
+   * The contact settings config object.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $config;
+
+  /**
+   * The contact message storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $contactMessageStorage;
+
+  /**
+   * Constructs a new contact form view builder.
+   *
+   * @param \Drupal\Core\Entity\EntityFormBuilderInterface $entity_form_builder
+   *   The entity form builder service.
+   * @param \Drupal\Core\Render\RendererInterface $renderer
+   *   The renderer service.
+   * @param \Drupal\Core\Config\Config $config
+   *   The contact settings config object.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $contact_message_storage
+   *   The contact message storage.
+   */
+  public function __construct(EntityFormBuilderInterface $entity_form_builder, RendererInterface $renderer, Config $config, EntityStorageInterface $contact_message_storage) {
+    $this->entityFormBuilder = $entity_form_builder;
+    $this->renderer = $renderer;
+    $this->config = $config;
+    $this->contactMessageStorage = $contact_message_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    return new static(
+      $container->get('entity.form_builder'),
+      $container->get('renderer'),
+      $container->get('config.factory')->get('contact.settings'),
+      $container->get('entity_type.manager')->getStorage('contact_message')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
+    $message = $this->contactMessageStorage->create([
+      'contact_form' => $entity->id(),
+    ]);
+
+    $form = $this->entityFormBuilder->getForm($message);
+    $form['#title'] = $entity->label();
+    $form['#cache']['contexts'][] = 'user.permissions';
+
+    $this->renderer->addCacheableDependency($form, $this->config);
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewMultiple(array $entities = [], $view_mode = 'full', $langcode = NULL) {
+    $build = [];
+    foreach ($entities as $key => $entity) {
+      $build[$key] = $this->view($entity, $view_mode, $langcode);
+    }
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function resetCache(array $entities = NULL) {
+    // Intentionally empty.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheTags() {
+    // Intentionally empty.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildComponents(array &$build, array $entities, array $displays, $view_mode) {
+    throw new \LogicException();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewField(FieldItemListInterface $items, $display_options = []) {
+    throw new \LogicException();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewFieldItem(FieldItemInterface $item, $display_options = []) {
+    throw new \LogicException();
+  }
+
+}
diff --git a/src/Tests/ContactStorageTest.php b/src/Tests/ContactStorageTest.php
index 92c4f5a..0902945 100644
--- a/src/Tests/ContactStorageTest.php
+++ b/src/Tests/ContactStorageTest.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\contact_storage\Tests;
 
-use Drupal\simpletest\WebTestBase;
-
 /**
  * Tests storing contact messages and viewing them through UI.
  *
  * @group contact_storage
  */
-class ContactStorageTest extends WebTestBase {
+class ContactStorageTest extends ContactStorageTestBase {
 
   /**
    * Modules to enable.
@@ -97,59 +95,4 @@ class ContactStorageTest extends WebTestBase {
     $this->assertEqual($this->url, $admin_user->urlInfo()->setAbsolute()->toString());
   }
 
-  /**
-   * Adds a form.
-   *
-   * @param string $id
-   *   The form machine name.
-   * @param string $label
-   *   The form label.
-   * @param string $recipients
-   *   The list of recipient email addresses.
-   * @param string $reply
-   *   The auto-reply text that is sent to a user upon completing the contact
-   *   form.
-   * @param bool $selected
-   *   A Boolean indicating whether the form should be selected by default.
-   * @param array $third_party_settings
-   *   Array of third party settings to be added to the posted form data.
-   */
-  function addContactForm($id, $label, $recipients, $reply, $selected, $third_party_settings = []) {
-    $edit = array();
-    $edit['label'] = $label;
-    $edit['id'] = $id;
-    $edit['recipients'] = $recipients;
-    $edit['reply'] = $reply;
-    $edit['selected'] = ($selected ? TRUE : FALSE);
-    $edit += $third_party_settings;
-    $this->drupalPostForm('admin/structure/contact/add', $edit, t('Save'));
-  }
-
-  /**
-   * Submits the contact form.
-   *
-   * @param string $name
-   *   The name of the sender.
-   * @param string $mail
-   *   The email address of the sender.
-   * @param string $subject
-   *   The subject of the message.
-   * @param string $id
-   *   The form ID of the message.
-   * @param string $message
-   *   The message body.
-   */
-  function submitContact($name, $mail, $subject, $id, $message) {
-    $edit = array();
-    $edit['name'] = $name;
-    $edit['mail'] = $mail;
-    $edit['subject[0][value]'] = $subject;
-    $edit['message[0][value]'] = $message;
-    if ($id == $this->config('contact.settings')->get('default_form')) {
-      $this->drupalPostForm('contact', $edit, t('Send message'));
-    }
-    else {
-      $this->drupalPostForm('contact/' . $id, $edit, t('Send message'));
-    }
-  }
 }
diff --git a/src/Tests/ContactStorageTestBase.php b/src/Tests/ContactStorageTestBase.php
new file mode 100644
index 0000000..ed85101
--- /dev/null
+++ b/src/Tests/ContactStorageTestBase.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\contact_storage\Tests\ContactStorageTestBase.
+ */
+
+namespace Drupal\contact_storage\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Defines a base-class for contact-storage tests.
+ */
+abstract class ContactStorageTestBase extends WebTestBase {
+
+  /**
+   * Adds a form.
+   *
+   * @param string $id
+   *   The form machine name.
+   * @param string $label
+   *   The form label.
+   * @param string $recipients
+   *   The list of recipient email addresses.
+   * @param string $reply
+   *   The auto-reply text that is sent to a user upon completing the contact
+   *   form.
+   * @param bool $selected
+   *   A Boolean indicating whether the form should be selected by default.
+   * @param array $third_party_settings
+   *   Array of third party settings to be added to the posted form data.
+   */
+  public function addContactForm($id, $label, $recipients, $reply, $selected, $third_party_settings = []) {
+    $edit = [];
+    $edit['label'] = $label;
+    $edit['id'] = $id;
+    $edit['recipients'] = $recipients;
+    $edit['reply'] = $reply;
+    $edit['selected'] = ($selected ? TRUE : FALSE);
+    $edit += $third_party_settings;
+    $this->drupalPostForm('admin/structure/contact/add', $edit, t('Save'));
+  }
+
+  /**
+   * Submits the contact form.
+   *
+   * @param string $name
+   *   The name of the sender.
+   * @param string $mail
+   *   The email address of the sender.
+   * @param string $subject
+   *   The subject of the message.
+   * @param string $id
+   *   The form ID of the message.
+   * @param string $message
+   *   The message body.
+   */
+  public function submitContact($name, $mail, $subject, $id, $message) {
+    $edit = [];
+    $edit['name'] = $name;
+    $edit['mail'] = $mail;
+    $edit['subject[0][value]'] = $subject;
+    $edit['message[0][value]'] = $message;
+    if ($id == $this->config('contact.settings')->get('default_form')) {
+      $this->drupalPostForm('contact', $edit, t('Send message'));
+    }
+    else {
+      $this->drupalPostForm('contact/' . $id, $edit, t('Send message'));
+    }
+  }
+
+}
diff --git a/src/Tests/ContactViewBuilderTest.php b/src/Tests/ContactViewBuilderTest.php
new file mode 100644
index 0000000..a2dfab1
--- /dev/null
+++ b/src/Tests/ContactViewBuilderTest.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\contact_storage\Tests\ContactViewBuilderTest.
+ */
+
+namespace Drupal\contact_storage\Tests;
+
+/**
+ * Tests adding contact form as entity reference and viewing them through UI.
+ *
+ * @group contact_storage
+ */
+class ContactViewBuilderTest extends ContactStorageTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'user',
+    'node',
+    'contact',
+    'field_ui',
+    'contact_test',
+    'contact_storage',
+  ];
+
+  /**
+   * An administrative user with permission administer contact forms.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create Article node type.
+    $this->drupalCreateContentType([
+      'type' => 'article',
+      'name' => 'Article',
+      'display_submitted' => FALSE,
+    ]);
+  }
+
+  /**
+   * Tests contact view builder functionality.
+   */
+  public function testContactViewBuilder() {
+    // Create test admin user.
+    $this->adminUser = $this->drupalCreateUser([
+      'administer content types',
+      'access site-wide contact form',
+      'administer contact forms',
+      'administer users',
+      'administer account settings',
+      'administer contact_message fields',
+    ]);
+
+    // Login as admin user.
+    $this->drupalLogin($this->adminUser);
+
+    // Create first valid contact form.
+    $mail = 'simpletest@example.com';
+    $this->addContactForm('test_id', 'test_label', $mail, '', TRUE);
+    $this->assertText(t('Contact form test_label has been added.'));
+
+    $field_name = 'contact';
+    $entity_type = 'node';
+    $bundle_name = 'article';
+
+    // Add a Entity Reference Contact Field to Article content type.
+    $field_storage = \Drupal::entityManager()
+      ->getStorage('field_storage_config')
+      ->create([
+        'field_name' => $field_name,
+        'entity_type' => $entity_type,
+        'type' => 'entity_reference',
+        'settings' => ['target_type' => 'contact_form'],
+      ]);
+    $field_storage->save();
+    $field = \Drupal::entityManager()
+      ->getStorage('field_config')
+      ->create([
+        'field_storage' => $field_storage,
+        'bundle' => $bundle_name,
+        'settings' => [
+          'handler' => 'default',
+        ],
+      ]);
+    $field->save();
+
+    // Configure the contact reference field form Entity form display.
+    entity_get_form_display($entity_type, $bundle_name, 'default')
+      ->setComponent($field_name, [
+        'type' => 'options_select',
+        'settings' => [
+          'weight' => 20,
+        ],
+      ])
+      ->save();
+
+    // Configure the contact reference field form Entity view display.
+    entity_get_display('node', 'article', 'default')
+      ->setComponent($field_name, [
+        'label' => 'above',
+        'type' => 'entity_reference_entity_view',
+        'weight' => 20,
+      ])
+      ->save();
+
+    // Display Article creation form.
+    $this->drupalGet('node/add/article');
+    $title_key = 'title[0][value]';
+    $body_key = 'body[0][value]';
+    $contact_key = 'contact';
+    // Create article node.
+    $edit = [];
+    $edit[$title_key] = $this->randomMachineName(8);
+    $edit[$body_key] = $this->randomMachineName(16);
+    $edit[$contact_key] = 'test_id';
+    $this->drupalPostForm('node/add/article', $edit, t('Save'));
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->drupalGet('node/' . $node->id());
+    // Some fields should be present.
+    $this->assertText(t('Your email address'));
+    $this->assertText(t('Subject'));
+    $this->assertText(t('Message'));
+    $this->assertFieldByName('subject[0][value]');
+    $this->assertFieldByName('message[0][value]');
+  }
+
+}
