diff --git a/CHANGELOG.md b/CHANGELOG.md
index 00e7ab5db83a80c60608a8d53436d66e0737445b..1eb43b6a80156666d79048918b05be4ce5c2541b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,28 @@ Pico Default Theme Changelog
           refer to both the UPGRADE and NEWS sections of the docs for more
           details.
 
+### Version 2.1.0
+Released: 2019-11-24
+
+```
+* [New] Add Pico's official logo and tagline
+* [New] Add some utility classes for typography and images
+* [Changed] Improve documentation of `pico-theme.yml`
+* [Changed] Various small improvements
+```
+
+### Version 2.1.0-beta.1
+Released: 2019-11-03
+
+```
+* [Changed] Add basic `pico-theme.yml` to use API v3, enable Twig's autoescape
+            feature (no changes necessary) and register `Social` meta header
+* [Changed] Use Pico's `pages` Twig function to create the main navigation
+* [Changed] Improve formatting of definition lists and inline code snippets
+* [Changed] Improve JSDoc class docs
+* [Changed] Various small improvements
+```
+
 ### Version 2.0.5-beta.1
 Released: 2019-01-03
 
diff --git a/README.md b/README.md
index b1923dd10c1e347e58c7bdd8939f16a71bc7648a..56bf903eb13efb1b6356c03543802c9da9251987 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ Please refer to [`picocms/Pico`](https://github.com/picocms/Pico) to get info ab
 Screenshot
 ----------
 
-![Pico Screenshot](https://picocms.github.io/screenshots/pico-20.png)
+![Pico Screenshot](https://picocms.github.io/screenshots/pico-21.png)
 
 Install
 -------
@@ -36,11 +36,13 @@ theme: my_theme
 
 You can now edit the theme's stylesheets and JavaScript to fit your needs. If you rather want to use a third-party theme, simply add the theme's directory to your `themes/` directory (e.g. `themes/some_other_theme/`) and update your `config/config.yml` accordingly. Pico's default theme is now completely disabled and won't ever interfere with your custom theme or your website in general anymore. If you want to use Pico's default theme again, either remove the line or replace it by `theme: default`.
 
-Anyway, since Pico's default theme is meant to be a starting point for your own theme, it demonstrates how themes can allow one to tweak a theme's behavior. For this reason it supports a "Widescreen" mode: By adding `theme_config.widescreen: true` to your `config/config.yml`, the theme's main container grows from 768px to 1152px breadth due to adding `class="widescreen"` to the website's `<body>` element. Pico's default theme furthermore supports adding social buttons to its footer. Rather than using Pico's config for this, it uses the YAML Frontmatter of the `content/_meta.md` Markdown file. Here's `content/_meta.md` from Pico's sample contents:
+Anyway, since Pico's default theme is meant to be a starting point for your own theme, it demonstrates how themes can allow one to tweak a theme's behavior. For this reason it supports a "Widescreen" mode: By adding `theme_config.widescreen: true` to your `config/config.yml`, the theme's main container grows from 768px to 1152px breadth due to adding `class="widescreen"` to the website's `<body>` element. Pico's default theme furthermore supports displaying both a logo and a tagline in its header, as well as adding social buttons to its footer. Rather than using Pico's config for this, it uses the YAML Frontmatter of the `content/_meta.md` Markdown file. Here's `content/_meta.md` from Pico's sample contents:
 
 ```yaml
 ---
-social:
+Logo: %theme_url%/img/pico-white.svg
+Tagline: Making the web easy.
+Social:
     - title: Visit us on GitHub
       url: https://github.com/picocms/Pico
       icon: octocat
@@ -50,6 +52,8 @@ social:
 ---
 ```
 
+You should also check out the theme's `pico-theme.yml`: First of all it tells Pico to use the latest API version for themes and adjusts Pico's default Twig config. But more importantly it also registers the mentioned `widescreen` theme config as well as the meta headers `Logo`, `Tagline` and `Social`.
+
 Getting Help
 ------------
 
diff --git a/composer.json b/composer.json
index 2c898d81dbc5e4eca219b98d59a59f76dbea0a1b..308f40ea4d3dc1d6fb126917fc4e363dd1deb54c 100644
--- a/composer.json
+++ b/composer.json
@@ -6,6 +6,11 @@
     "homepage": "http://picocms.org/",
     "license": "MIT",
     "authors": [
+        {
+            "name": "Daniel Rudolf",
+            "email": "picocms.org@daniel-rudolf.de",
+            "role": "Lead Developer"
+        },
         {
             "name": "The Pico Community",
             "homepage": "http://picocms.org/"
@@ -26,7 +31,8 @@
     "extra": {
         "installer-name": "default",
         "branch-alias": {
-            "dev-master": "2.0.x-dev"
+            "dev-master": "2.0.x-dev",
+            "dev-pico-2.1": "2.1.x-dev"
         }
     }
 }
diff --git a/css/style.css b/css/style.css
index a90d7fe865ed8da8a0d9405ee06663b7c2617e16..3fe40d3d513cffa19e3380f97f030608241a4ca6 100644
--- a/css/style.css
+++ b/css/style.css
@@ -11,7 +11,7 @@
  * @author  Daniel Rudolf
  * @link    http://picocms.org
  * @license http://opensource.org/licenses/MIT The MIT License
- * @version 2.0
+ * @version 2.1
  */
 
 * {
@@ -65,17 +65,24 @@ body { display: flex; flex-direction: column; }
 
 #header { background: #2EAE9B; }
 
-#header h1 {
+#title, #logo {
     float: left;
-    font-size: 2rem;
-    margin: 0;
-    padding: 1.5em 1em 1.5em 0;
+    padding: 3em 3em 3em 0;
 }
-#header h1 a, #header h1 a:hover { color: #fff; }
+
+#title * { margin: 0; color: #fff; }
+#title p { font-style: italic; }
+
+#logo { height: 10.8em; }
+#logo * { display: block; height: 100%; }
+#logo img { min-width: 4.8em; }
+
+#logo + #title h1 { margin: 0.8rem 0; }
+#logo + #title.tagline h1 { margin: 0; }
 
 #nav {
-    text-align: right;
     padding: 3em 0;
+    text-align: right;
 }
 #nav ul {
     list-style: none;
@@ -127,13 +134,11 @@ body { display: flex; flex-direction: column; }
 @media (max-width: 767px) {
     #main { padding: 2em 0 1em; }
 
-    #header h1 {
-        float: none;
-        padding: 0.5em 0;
-    }
+    #title, #logo { padding: 2em 1.5em 2em 0; }
+    #logo { height: 8.8em; }
 
     #nav {
-        clear: right;
+        clear: both;
         padding: 0;
     }
     #nav ul {
@@ -153,7 +158,7 @@ body { display: flex; flex-direction: column; }
         display: block;
         float: right;
         width: 2em;
-        margin: 0.6667em 0 0.6667em 1.3333em;
+        margin: 0.6667em 0;
         font-size: 1.5rem;
         line-height: 2em;
         text-align: center;
@@ -185,7 +190,7 @@ p, td, th, li, dd {
     word-wrap: break-word;
 }
 
-p, hr, table, .table-responsive, ol, ul, dl, pre, blockquote, fieldset {
+p, hr, table, .table-responsive, ol, ul, dl, dd, pre, blockquote, fieldset {
     margin-bottom: 1em;
 }
 
@@ -219,6 +224,29 @@ hr {
 
 abbr { text-decoration: underline dotted; }
 
+/*** UTILITIES ***/
+
+.align-left { text-align: left; }
+.align-center { text-align: center; }
+.align-right { text-align: right; }
+.align-justify { text-align: justify; }
+
+.image { display: block; margin: 0 auto; }
+.image.xsmall { width: 20%; }
+.image.small { width: 40%; }
+.image.large { width: 60%; }
+.image.xlarge { width: 80%; }
+.image.float-left { float: left; margin: 1em 2em 1em 0; }
+.image.float-right { float: right; margin: 1em 0 1em 2em; }
+.image img { display: block; width: 100%; }
+
+@media (max-width: 767px) {
+    .image.xsmall { width: 60%; }
+    .image.small { width: 80%; }
+    .image.large, .image.xlarge { width: 100%; }
+    .image.float-left, .image.float-right { float: none; margin: 0 auto; }
+}
+
 /*** TABLES ***/
 
 table { border-spacing: 0; }
@@ -269,7 +297,8 @@ code {
     border-radius: 0.3em;
     background: #f5f5f5;
     font-family: 'Droid Sans Mono', 'Courier New', 'Courier', monospace;
-    font-size: 0.9rem;
+    font-size: 0.85rem;
+    line-height: 1.9824;
 }
 
 pre {
@@ -277,7 +306,6 @@ pre {
     border: 1px solid #ccc;
     border-radius: 0.3em;
     background: #f5f5f5;
-    line-height: 1.4;
 }
 pre code {
     display: block;
@@ -286,6 +314,7 @@ pre code {
     border: 0 none;
     background: transparent;
     overflow-x: auto;
+    line-height: 1.4;
 }
 
 /*** BLOCKQUOTE ***/
diff --git a/img/pico-white.svg b/img/pico-white.svg
new file mode 100644
index 0000000000000000000000000000000000000000..972f72b841c883f28f77b373897045c207c5c1c8
--- /dev/null
+++ b/img/pico-white.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200"><path d="m298.4 194.7q0-14.15-.8-31.2l-.85-14.25h-51.05v89.95l8 1.1q9.6 1.05 17.6 1.05 7.95 0 17.5-1.05 4.8-.55 7.95-1.1 1.65-22.2 1.65-44.5m-69.75-45.8h-49.3v182.45l7.7.85q9.3.8 17 .8 12.3 0 24.6-1.65z" fill="#ffffff" transform="translate(-138.85 -140.95)"/></svg>
diff --git a/img/pico.svg b/img/pico.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7294c2ea530ea5d376606924df9c278cb4349611
--- /dev/null
+++ b/img/pico.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200"><path d="m298.4 194.7q0-14.15-.8-31.2l-.85-14.25h-51.05v89.95l8 1.1q9.6 1.05 17.6 1.05 7.95 0 17.5-1.05 4.8-.55 7.95-1.1 1.65-22.2 1.65-44.5m-69.75-45.8h-49.3v182.45l7.7.85q9.3.8 17 .8 12.3 0 24.6-1.65z" fill="#2eae9b" transform="translate(-138.85 -140.95)"/></svg>
diff --git a/index.twig b/index.twig
index 4f527f9026e6ad9d7a95b868a012b5ed8d5e4008..41d0055e40a2e4e3f9f6d8fdcb6fd1ee1e31ac98 100644
--- a/index.twig
+++ b/index.twig
@@ -7,7 +7,8 @@
     <title>{% if meta.title %}{{ meta.title }} | {% endif %}{{ site_title }}</title>
     {% if meta.description %}
         <meta name="description" content="{{ meta.description|striptags }}" />
-    {% endif %}{% if meta.robots %}
+    {% endif %}
+    {% if meta.robots %}
         <meta name="robots" content="{{ meta.robots }}" />
     {% endif %}
 
@@ -21,31 +22,38 @@
 </head>
 <body{% if config.theme_config.widescreen %} class="widescreen"{% endif %}>
 
-    <div id="header">
+    <div id="header" role="banner">
         <div class="container">
             <a id="nav-toggle" title="Toggle Menu" role="button" aria-controls="nav" aria-expanded="false" tabindex="1">
                 <span class="icon-menu" aria-hidden="true"></span>
                 <span class="sr-only">Toggle Menu</span>
             </a>
-            <h1>
-                <a href="{{ "index"|link }}">{{ site_title }}</a>
-            </h1>
-            <div id="nav" role="region" tabindex="-1">
+            {% if pages["_meta"].meta.logo %}
+                <div id="logo" aria-hidden="true">
+                    <a href="{{ "index"|link }}">
+                        <img src="{{ pages["_meta"].meta.logo|url }}" alt="" />
+                    </a>
+                </div>
+            {% endif %}
+            <div id="title"{{ pages["_meta"].meta.tagline ? ' class="tagline"' }}>
+                <a href="{{ "index"|link }}">
+                    <h1>{{ site_title }}</h1>
+                    {{ pages["_meta"].meta.tagline|markdown }}
+                </a>
+            </div>
+            <div id="nav" role="navigation" tabindex="-1">
                 <ul>
-                    {% for page in pages if page.title and not page.hidden %}
-                        {% set pageDepth = page.id|split('/')|length %}
-                        {% if (pageDepth == 2) and (page.id ends with "/index") or (pageDepth == 1) %}
-                            <li{% if page.id == current_page.id %} class="active"{% endif %}>
-                                <a href="{{ page.url }}">{{ page.title }}</a>
-                            </li>
-                        {% endif %}
+                    {% for page in pages(depthOffset=-1) if page.title and not page.hidden %}
+                        <li{% if page.id == current_page.id %} class="active"{% endif %}>
+                            <a href="{{ page.url }}">{{ page.title }}</a>
+                        </li>
                     {% endfor %}
                 </ul>
             </div>
         </div>
     </div>
 
-    <div id="main">
+    <div id="main" role="main">
         <div class="container">
             {{ content }}
         </div>
@@ -54,7 +62,7 @@
     <div id="footer">
         <div class="container">
             <div class="social">
-                {% for social in pages._meta.meta.social %}
+                {% for social in pages["_meta"].meta.social %}
                     <a href="{{ social.url }}" title="{{ social.title }}" role="button">
                         <span class="icon-{{ social.icon }}" aria-hidden="true"></span>
                         <span class="sr-only">{{ social.title }}</span>
diff --git a/js/pico.js b/js/pico.js
index 492829d807c33536322c00e849a909dbd1f4dbaa..4ddb6adc7aed98a082998e719621b1d88bcc95d4 100644
--- a/js/pico.js
+++ b/js/pico.js
@@ -6,7 +6,7 @@
  * @author  Daniel Rudolf
  * @link    http://picocms.org
  * @license http://opensource.org/licenses/MIT The MIT License
- * @version 2.0
+ * @version 2.1
  */
 
 function main()
diff --git a/js/utils.js b/js/utils.js
index 09e3432bc79e24daed9a045c9daa7fd9bbf76d2c..62b65cce4c6c354420ba4219977273bcb623e61a 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -6,7 +6,7 @@
  * @author  Daniel Rudolf
  * @link    http://picocms.org
  * @license http://opensource.org/licenses/MIT The MIT License
- * @version 2.0
+ * @version 2.1
  */
 
 utils = {};
@@ -14,7 +14,7 @@ utils = {};
 /**
  * Checks whether the client's browser is able to slide elements or not
  *
- * @return boolean TRUE when the browser supports sliding, FALSE otherwise
+ * @return {bool} TRUE when the browser supports sliding, FALSE otherwise
  */
 utils.canSlide = function ()
 {
@@ -24,11 +24,10 @@ utils.canSlide = function ()
 /**
  * Slides a element up (i.e. hide a element by changing its height to 0px)
  *
- * @param  HTMLElement element        the element to slide up
- * @param  function    finishCallback function to call when the animation has
+ * @param {HTMLElement} element        the element to slide up
+ * @param {function}    finishCallback function to call when the animation has
  *     been finished (i.e. the element is hidden)
- * @param  function    startCallback  function to call when the animation starts
- * @return void
+ * @param {function}    startCallback  function to call when the animation starts
  */
 utils.slideUp = function (element, finishCallback, startCallback)
 {
@@ -72,11 +71,10 @@ utils.slideUp = function (element, finishCallback, startCallback)
 /**
  * Slides a element down (i.e. show a hidden element)
  *
- * @param  HTMLElement element        the element to slide down
- * @param  function    finishCallback function to call when the animation has
+ * @param {HTMLElement} element        the element to slide down
+ * @param {function}    finishCallback function to call when the animation has
  *     been finished (i.e. the element is visible)
- * @param  function    startCallback  function to call when the animation starts
- * @return void
+ * @param {function}    startCallback  function to call when the animation starts
  */
 utils.slideDown = function (element, finishCallback, startCallback)
 {
@@ -126,8 +124,9 @@ utils.slideDown = function (element, finishCallback, startCallback)
 /**
  * Checks whether a element is visible or not
  *
- * @param  HTMLElement element the element to check
- * @return boolean             TRUE when the element is visible, FALSE otherwise
+ * @param {HTMLElement} element the element to check
+ *
+ * @return {bool} TRUE when the element is visible, FALSE otherwise
  */
 utils.isElementVisible = function (element)
 {
diff --git a/pico-theme.yml b/pico-theme.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fc65b28e6e59b06a682264bb2bf4a30bc5a63030
--- /dev/null
+++ b/pico-theme.yml
@@ -0,0 +1,14 @@
+api_version: 3                  # Use Pico's latest API version for themes
+
+meta:                           # Register meta headers used by this theme
+    Logo: logo                  # The URL to your website's logo (value is passed to Pico's "url" Twig filter)
+    Tagline: tagline            # Your website's tag line, shown right below your site title (supports Markdown)
+    Social: social              # A list of social icons that will be shown in your website's footer;
+                                #     You must specify a "title", "url" and "icon" per entry
+
+twig_config:                    # Twig template engine config
+    autoescape: html            # Let Twig escape variables by default
+    strict_variables: false     # If set to true, Twig will bail out when unset variables are being used
+    charset: utf-8              # The charset used by Twig templates
+
+widescreen: false               # Use more horicontal space (i.e. make the site container wider)