diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 0c3cfb7..c3c5bf8 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1346,6 +1346,9 @@ function node_build_content($node, $view_mode = 'full', $langcode = NULL) {
   // Remove previously built content, if exists.
   $node->content = array();
 
+  // Make the view mode available in the node object.
+  $node->view_mode = $view_mode;
+
   // The 'view' hook can be implemented to overwrite the default function
   // to display nodes.
   if (node_hook($node, 'view')) {
@@ -1424,6 +1427,20 @@ function node_is_page($node) {
 }
 
 /**
+ * Process variables for page.tpl.php
+ *
+ * @see page.tpl.php
+ */
+function node_preprocess_page(&$variables) {
+  // In order to have properly sectioned HTML5 markup for nodes, the title is
+  // always printed inside node.tpl.php. This code prevents it from printing in
+  // page.tpl.php as well.
+  if (!empty($variables['node']->view_mode) && $variables['node']->view_mode == 'full' && node_is_page($variables['node'])) {
+    $variables['title'] = '';
+  }
+}
+
+/**
  * Process variables for node.tpl.php
  *
  * Most themes utilize their own copy of node.tpl.php. The default is located
@@ -1476,6 +1493,12 @@ function template_preprocess_node(&$variables) {
     $variables['user_picture'] = '';
   }
 
+  // Add article ARIA role.
+  $variables['attributes_array']['role'] = 'article';
+
+  // Provide the node ID as an ID attribute. This protects from duplicate IDs.
+  $variables['attributes_array']['id'] = drupal_html_id('node-' . $node->nid);
+
   // Gather node classes.
   $variables['classes_array'][] = drupal_html_class('node-' . $node->type);
   if ($variables['promote']) {
diff --git a/core/modules/node/node.tpl.php b/core/modules/node/node.tpl.php
index 06dc199..42f460d 100644
--- a/core/modules/node/node.tpl.php
+++ b/core/modules/node/node.tpl.php
@@ -78,33 +78,27 @@
  * @see template_process()
  */
 ?>
-<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
+<article class="<?php print $classes; ?>"<?php print $attributes; ?>>
 
-  <?php print $user_picture; ?>
-
-  <?php print render($title_prefix); ?>
-  <?php if (!$page): ?>
-    <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
-  <?php endif; ?>
-  <?php print render($title_suffix); ?>
-
-  <?php if ($display_submitted): ?>
-    <div class="submitted">
-      <?php print $submitted; ?>
-    </div>
+  <?php if ($display_submitted || $user_picture || $title): ?>
+    <header>
+      <?php if ($title): ?>
+        <?php print render($title_preffix); ?>
+        <?php if ($page): ?>
+          <h1<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h1>
+        <?php else: ?>
+          <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
+        <?php endif; ?>
+        <?php print render($title_suffix); ?>
+      <?php endif; ?>
+      <?php if ($display_submitted): ?>
+        <?php print $user_picture; ?>
+        <p class="submitted"><?php print $submitted; ?></p>
+      <?php endif; ?>
+    </header>
   <?php endif; ?>
 
   <div class="content"<?php print $content_attributes; ?>>
-    <?php
-      // We hide the comments and links now so that we can render them later.
-      hide($content['comments']);
-      hide($content['links']);
-      print render($content);
-    ?>
+    <?php print render($content); ?>
   </div>
-
-  <?php print render($content['links']); ?>
-
-  <?php print render($content['comments']); ?>
-
-</div>
+</article>
