diff --git a/core/includes/common.inc b/core/includes/common.inc
index 107e515..af13018 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -4058,6 +4058,21 @@ function _drupal_render_process_post_render_cache(array &$elements) {
     // identify the placeholder in the markup.
     $modified_elements = $elements;
     foreach ($elements['#post_render_cache'] as $callback => $options) {
+      // We support service callbacks in the form
+      // array('@{service_id}', 'method');
+      if (is_array($callback) && $callback[0][1] == '@') {
+        // This is a service.
+        if (($service = \Drupal::service($callback[0], -1)) && method_exists($service, $callback[1])) {
+          // Refactor the callback into the a callable format.
+          $callback = array($service, $callback[1]);
+        }
+        else {
+          throw new Exception(t('Post render callback service %service either does not exist or has no %method method', array(
+            '%service' => $callback[0],
+            '%method' => $callback[1],
+          )));
+        }
+      }
       foreach ($elements['#post_render_cache'][$callback] as $token => $context) {
         // The advanced option, when setting #post_render_cache directly.
         if (is_numeric($token)) {
diff --git a/core/modules/comment/comment.services.yml b/core/modules/comment/comment.services.yml
index 76fdbc4..9ba97a5 100644
--- a/core/modules/comment/comment.services.yml
+++ b/core/modules/comment/comment.services.yml
@@ -18,3 +18,7 @@ services:
       arguments: ['@entity.manager']
       tags:
         - { name: route_enhancer}
+
+  comment.post_render_cache:
+      class: Drupal\comment\CommentPostRenderCache
+      arguments: ['@entity.manager', '@entity.form_builder]
diff --git a/core/modules/comment/lib/Drupal/comment/CommentPostRenderCache.php b/core/modules/comment/lib/Drupal/comment/CommentPostRenderCache.php
new file mode 100644
index 0000000..476e5bb
--- /dev/null
+++ b/core/modules/comment/lib/Drupal/comment/CommentPostRenderCache.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\comment\CommentPostRenderCache.
+ */
+
+namespace Drupal\comment;
+
+use Drupal\Core\Entity\EntityFormBuilderInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+
+/**
+ * Defines a service for comment post render cache callbacks.
+ */
+class CommentPostRenderCache {
+
+  /**
+   * The entity manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * The entity form builder service.
+   *
+   * @var \Drupal\Core\Entity\EntityFormBuilderInterface
+   */
+  protected $entityFormBuilder;
+
+  /**
+   * Constructs a new CommentPostRenderCache object.
+   *
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager service.
+   * @param \Drupal\Core\Entity\EntityFormBuilderInterface $entity_form_builder
+   *   The entity form builder service.
+   */
+  public function __construct(EntityManagerInterface $entity_manager, EntityFormBuilderInterface $entity_form_builder) {
+    $this->entityManager = $entity_manager;
+    $this->entityFormBuilder = $entity_form_builder;
+  }
+  /**
+   * #post_render_cache callback; replaces placeholder with comment form.
+   *
+   * @param array $context
+   *   An array with the following keys:
+   *   - entity_type: an entity type
+   *   - entity_id: an entity ID
+   *   - field_name: a comment field name
+   *
+   * @return array
+   *   A renderable array containing the comment form.
+   */
+  public function renderForm($context) {
+    $storage = $this->entityManager->getStorage($context['entity_type']);
+    $entity = $storage->load($context['entity_id']);
+    $values = array(
+      'entity_type' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+      'field_id' => $entity->getEntityTypeId() . '__' . $context['field_name'],
+      'pid' => NULL,
+    );
+    $comment = $storage->create($values);
+    return $this->entityFormBuilder->getForm($comment);
+  }
+
+}
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
index 639cbb0..5c478c2 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldFormatter/CommentDefaultFormatter.php
@@ -164,7 +164,7 @@ public function viewElements(FieldItemListInterface $items) {
           else {
             $output['comment_form'] = array(
               '#type' => 'render_cache_placeholder',
-              '#callback' => '\Drupal\comment\Plugin\Field\FieldFormatter\CommentDefaultFormatter::renderForm',
+              '#callback' => array('@comment.post_render_cache', 'renderForm'),
               '#context' => array(
                 'entity_type' => $entity->getEntityTypeId(),
                 'entity_id' => $entity->id(),
@@ -188,23 +188,6 @@ public function viewElements(FieldItemListInterface $items) {
   }
 
   /**
-   * #post_render_cache callback; replaces placeholder with comment form.
-   *
-   * @param array $context
-   *   An array with the following keys:
-   *   - entity_type: an entity type
-   *   - entity_id: an entity ID
-   *   - field_name: a comment field name
-   *
-   * @return array
-   *   A renderable array containing the comment form.
-   */
-  public static function renderForm(array $context) {
-    $entity = entity_load($context['entity_type'], $context['entity_id']);
-    return comment_add($entity, $context['field_name']);
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function settingsForm(array $form, array &$form_state) {
