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..4b19d65
--- /dev/null
+++ b/src/ContactFormViewBuilder.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\contact_storage\ContactFormViewBuilder.
+ */
+
+namespace Drupal\contact_storage;
+
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityViewBuilder;
+
+class ContactFormViewBuilder extends EntityViewBuilder {
+
+  /**
+   * The renderer.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
+   * The entity form builder.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
+   * The configuration factory.
+   *
+   * @var \Drupal\Core\Config\Config
+   */
+  protected $configFactory;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
+    $config = $this->config('contact.settings');
+    $message = $this->entityManager
+      ->getStorage('contact_message')
+      ->create(array(
+        'contact_form' => $entity->id(),
+      ));
+
+    $form = $this->entityFormBuilder()->getForm($message);
+    $form['#title'] = $entity->label();
+    $form['#cache']['contexts'][] = 'user.permissions';
+    $this->getRenderer()->addCacheableDependency($form, $config);
+    return $form;
+  }
+
+  /**
+   * Retrieves the entity form builder.
+   *
+   * @return \Drupal\Core\Entity\EntityFormBuilderInterface
+   *   The entity form builder.
+   */
+  protected function entityFormBuilder() {
+    if (!$this->entityFormBuilder) {
+      $this->entityFormBuilder = $this->container()->get('entity.form_builder');
+    }
+    return $this->entityFormBuilder;
+  }
+
+  /**
+   * Retrieves the renderer service.
+   *
+   * @return \Drupal\Core\Render\RendererInterface
+   *   The renderer service.
+   */
+  protected function getRenderer() {
+    if (!$this->renderer) {
+      $this->renderer = $this->container()->get('renderer');
+    }
+    return $this->renderer;
+  }
+
+  /**
+   * Retrieves a configuration object.
+   *
+   * This is the main entry point to the configuration API. Calling
+   * @code $this->config('book.admin') @endcode will return a configuration
+   * object in which the book module can store its administrative settings.
+   *
+   * @param string $name
+   *   The name of the configuration object to retrieve. The name corresponds to
+   *   a configuration file. For @code \Drupal::config('book.admin') @endcode,
+   *   the config object returned will contain the contents of book.admin
+   *   configuration file.
+   *
+   * @return \Drupal\Core\Config\Config
+   *   A configuration object.
+   */
+  protected function config($name) {
+    if (!$this->configFactory) {
+      $this->configFactory = $this->container()->get('config.factory');
+    }
+    return $this->configFactory->get($name);
+  }
+
+  /**
+   * Returns the service container.
+   *
+   * This method is marked private to prevent sub-classes from retrieving
+   * services from the container through it. Instead,
+   * \Drupal\Core\DependencyInjection\ContainerInjectionInterface should be used
+   * for injecting services.
+   *
+   * @return \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The service container.
+   */
+  private function container() {
+    return \Drupal::getContainer();
+  }
+
+}
