diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/area/Messages.php b/core/modules/views/lib/Drupal/views/Plugin/views/area/Messages.php
new file mode 100644
index 0000000..e00739f
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/area/Messages.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\views\area\Messages.
+ */
+
+namespace Drupal\views\Plugin\views\area;
+
+/**
+ * Provides an area for messages.
+ *
+ * @ingroup views_area_handlers
+ *
+ * @PluginID("messages")
+ */
+class Messages extends AreaPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    // Set the default to TRUE so it shows on empty pages by default.
+    $options['empty']['default'] = TRUE;
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render($empty = FALSE) {
+    if (!$empty || !empty($this->options['empty'])) {
+      return array(
+        '#theme' => 'status_messages',
+      );
+    }
+    return array();
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/AreaMessageTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/AreaMessageTest.php
new file mode 100644
index 0000000..6ae1d88
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/AreaMessageTest.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Handler\AreaMessageTest.
+ */
+
+namespace Drupal\views\Tests\Handler;
+
+use Drupal\views\Views;
+use Drupal\views\Tests\ViewUnitTestBase;
+
+/**
+ * Tests the messages area handler.
+ *
+ * @see \Drupal\views\Plugin\views\area\Messages
+ */
+class AreaMessageTest extends ViewUnitTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_view');
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Area: Messages',
+      'description' => 'Test the Messages area handler.',
+      'group' => 'Views Handlers',
+    );
+  }
+
+  /**
+   * Tests rendering the Messages area handler.
+   */
+  public function testMessages() {
+    $view = Views::getView('test_view');
+    $view->setDisplay();
+
+    // Add the messages handler.
+    $view->displayHandlers->get('default')->overrideOption('empty', array(
+      'messages' => array(
+        'id' => 'messages',
+        'table' => 'views',
+        'field' => 'messages',
+      ),
+    ));
+
+    // Execute the view.
+    $this->executeView($view);
+
+    // The handler is configured to show with empty views by default, so should
+    // appear.
+    $this->assertEqual(array('#theme' => 'status_messages'), $view->display_handler->handlers['empty']['messages']->render(), 'The expected render array was returned.');
+
+    // Turn empty off, and make sure it isn't rendered.
+    $view->display_handler->handlers['empty']['messages']->options['empty'] = FALSE;
+    // $empty parameter passed to render will still be FALSE, so should still
+    // appear.
+    $this->assertEqual(array('#theme' => 'status_messages'), $view->display_handler->handlers['empty']['messages']->render());
+    // Should now be empty as both the empty option and parameter are empty.
+    $this->assertEqual(array(), $view->display_handler->handlers['empty']['messages']->render(TRUE));
+  }
+
+}
diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index d11c4d7..da571e2 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -90,6 +90,14 @@ function views_views_data() {
     ),
   );
 
+  $data['views']['messages'] = array(
+    'title' => t('Messages'),
+    'help' => t('Displays messages in an area.'),
+    'area' => array(
+      'id' => 'messages',
+    ),
+  );
+
   $data['views']['http_status_code'] = array(
     'title' => t('Response status code'),
     'help' => t('Alter the HTTP response status code used by this view, mostly helpful for empty results.'),
