diff --git a/src/Plugin/Block/WorkbenchModerationLatestBlock.php b/src/Plugin/Block/WorkbenchModerationLatestBlock.php
new file mode 100644
index 0000000..6d874de
--- /dev/null
+++ b/src/Plugin/Block/WorkbenchModerationLatestBlock.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\workbench_moderation\Plugin\Block\WorkbenchModerationLatestBlock.
+ */
+
+namespace Drupal\workbench_moderation\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Form\FormBuilderInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\workbench_moderation\Form\EntityModerationForm;
+use Drupal\workbench_moderation\ModerationInformationInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a block to display the 'Latest version' of a node.
+ *
+ * @Block(
+ *   id = "workbench_moderation_latest_block",
+ *   admin_label = @Translation("Latest version")
+ * )
+ */
+class WorkbenchModerationLatestBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The form builder.
+   *
+   * @var \Drupal\Core\Form\FormBuilderInterface
+   */
+  protected $formBuilder;
+
+  /**
+   * @var \Drupal\workbench_moderation\ModerationInformationInterface
+   */
+  protected $moderationInfo;
+
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * Constructs a new WorkbenchModerationLatestBlock object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
+   *   The form builder.
+   * @param \Drupal\workbench_moderation\ModerationInformationInterface $moderation_info
+   *   Moderation information service.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, FormBuilderInterface $form_builder, ModerationInformationInterface $moderation_info, RouteMatchInterface $route_match) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->formBuilder = $form_builder;
+    $this->moderationInfo = $moderation_info;
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('form_builder'),
+      $container->get('workbench_moderation.moderation_information'),
+      $container->get('current_route_match')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $build = array();
+
+    if ($node = $this->routeMatch->getParameter('node')) {
+      if ($this->moderationInfo->isModeratableEntity($node)) {
+        $build = $this->formBuilder->getForm(EntityModerationForm::class, $node);
+      }
+    }
+
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheMaxAge() {
+    return 0;
+  }
+}
diff --git a/src/Tests/ModerationFormTest.php b/src/Tests/ModerationFormTest.php
index 077f13f..4ee3e43 100644
--- a/src/Tests/ModerationFormTest.php
+++ b/src/Tests/ModerationFormTest.php
@@ -87,4 +87,74 @@ class ModerationFormTest extends ModerationStateTestBase {
     $this->assertText('Needs Review', 'Correct status found on the latest-version page.');
   }
 
+  /**
+   * Tests the moderation form block.
+   */
+  public function testModerationFormBlock() {
+    // Place workbench moderation 'latest version' block to test using the
+    // moderation form in a block.
+    $this->drupalPlaceBlock('workbench_moderation_latest_block');
+
+    // Create new moderated content in draft.
+    $this->drupalPostForm('node/add/moderated_content', [
+      'title[0][value]' => 'Some moderated content',
+      'body[0][value]' => 'First version of the content.',
+    ], t('Save and Create New Draft'));
+
+    $node = $this->drupalGetNodeByTitle('Some moderated content');
+    $canonical_path = sprintf('node/%d', $node->id());
+    $edit_path = sprintf('node/%d/edit', $node->id());
+    $latest_version_path = sprintf('node/%d/latest', $node->id());
+
+    $this->assertTrue($this->adminUser->hasPermission('edit any moderated_content content'));
+
+    // For the first revision, the block should show the content in draft
+    // awaiting review.
+    $this->drupalGet($canonical_path);
+    $this->assertResponse(200);
+    $this->assertText('First version of the content.');
+    $this->assertText('Status', 'Form text found in the latest-version block.');
+    $this->assertText('Request Review', 'Correct status found in the latest-version block.');
+
+    // Make a new forward revision; after saving, the block should show
+    // information on the new revision while on the 'Latest version' page.
+    $this->drupalPostForm($edit_path, [
+      'body[0][value]' => 'Second version of the content.',
+    ], t('Save and Request Review'));
+    $this->drupalGet($latest_version_path);
+    $this->assertResponse(200);
+    $this->assertText('Second version of the content.');
+    $this->assertText('Status', 'Form text found on the latest-version page.');
+    $this->assertText('Needs Review', 'Correct status found on the latest-version page.');
+
+    // Return to the current version of the content and verify that the block
+    // shows the status of the first revision.
+    $this->drupalGet($canonical_path);
+    $this->assertResponse(200);
+    $this->assertText('Status', 'Form text found in the latest-version block.');
+    $this->assertText('Request Review', 'Correct status found in the latest-version block.');
+
+    // Make a new published revision; after saving, check that the block shows
+    // the content as published and verify by checking that the 'Latest version'
+    // page is unavailable.
+    $this->drupalPostForm($edit_path, [
+      'body[0][value]' => 'Third version of the content.',
+    ], t('Save and Publish'));
+    $this->drupalGet($canonical_path);
+    $this->assertResponse(200);
+    $this->assertText('Status', 'Form text found in the latest-version block.');
+    $this->assertText('Published', 'Correct status found in the latest-version block.');
+    $this->drupalGet($latest_version_path);
+    $this->assertResponse(403);
+
+    // Submit the moderation form to change status. Verify that a new draft was
+    // actually created by checking that the 'Latest version' page is now
+    // available.
+    $this->drupalPostForm($canonical_path, [
+      'new_state' => 'draft',
+    ], t('Apply'));
+    $this->drupalGet($latest_version_path);
+    $this->assertResponse(200);
+  }
+
 }
