diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d6294abcf9bc0931526b1dd2419d817679c57bde..c6f2a3f71992843f288915cbf22b82217bfb3738 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -6,6 +6,15 @@ All notable changes to this project will be documented in this file.
 The format is based on `Keep a Changelog`_,
 and this project adheres to `Semantic Versioning`_.
 
+Unreleased
+----------
+
+Changed
+~~~~~~~
+
+* Use semantically correct html elements for headings and alerts.
+
+
 `2.0b2` - 2021-06-15
 --------------------
 
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index d4b986882fe3f45352622a4987c361093182261e..ae51e5566d4d670bf91b5a2e202ec0f39599a1a3 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -524,7 +524,12 @@ ANY_JS = {
     },
     "sortablejs": {"js_url": JS_URL + "/sortablejs/Sortable.min.js"},
     "jquery-sortablejs": {"js_url": JS_URL + "/jquery-sortablejs/jquery-sortable.js"},
-    "Roboto": {"css_url": JS_URL + "/@fontsource/roboto/index.css"},
+    "Roboto100": {"css_url": JS_URL + "/@fontsource/roboto/100.css"},
+    "Roboto300": {"css_url": JS_URL + "/@fontsource/roboto/300.css"},
+    "Roboto400": {"css_url": JS_URL + "/@fontsource/roboto/400.css"},
+    "Roboto500": {"css_url": JS_URL + "/@fontsource/roboto/500.css"},
+    "Roboto700": {"css_url": JS_URL + "/@fontsource/roboto/700.css"},
+    "Roboto900": {"css_url": JS_URL + "/@fontsource/roboto/900.css"},
 }
 
 merge_app_settings("ANY_JS", ANY_JS, True)
diff --git a/aleksis/core/static/style.scss b/aleksis/core/static/style.scss
index ef58a53c387b46b89c50f1780b6b818d9127fef4..e09a5aea2cc658c5a20af203a4cbbfa16bdb590d 100644
--- a/aleksis/core/static/style.scss
+++ b/aleksis/core/static/style.scss
@@ -271,6 +271,23 @@ ul.footer-ul {
   fill: white;
 }
 
+//////////////
+// HEADINGS //
+//////////////
+
+h1 {
+  font-weight: 300;
+  font-style: normal;
+  font-size: 3.6rem;
+  line-height: 110%;
+  margin: 1.4rem 0 1.68rem 0;
+}
+
+h2 {
+  font-weight: 300;
+  font-size: 3.0rem;
+}
+
 /* Collections */
 
 ul.collection .collection-item .title {
diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index 332e641a0649bee0a21afbcfa0c9da06e0fea148..b7a67783254811e53c43c0dfb805c1282a5b7215 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -18,7 +18,12 @@
 
   {# CSS #}
   {% include_css "material-design-icons" %}
-  {% include_css "Roboto" %}
+  {% include_css "Roboto100" %}
+  {% include_css "Roboto300" %}
+  {% include_css "Roboto400" %}
+  {% include_css "Roboto500" %}
+  {% include_css "Roboto700" %}
+  {% include_css "Roboto900" %}
   <link rel="stylesheet" href="{% sass_src 'style.scss' %}">
 
   {# Add JS URL resolver #}
@@ -109,7 +114,7 @@
   {% endif %}
 
   {% block no_page_title %}
-    <h4>{% block page_title %}{% endblock %}</h4>
+    <h1>{% block page_title %}{% endblock %}</h1>
   {% endblock %}
 
   {% block content %}{% endblock %}
diff --git a/aleksis/core/templates/core/base_print.html b/aleksis/core/templates/core/base_print.html
index 9539808f963d541811d9581ca377006bd1ef74a8..7691cdf804b043b373e6a4f26802fc9cdb732205 100644
--- a/aleksis/core/templates/core/base_print.html
+++ b/aleksis/core/templates/core/base_print.html
@@ -15,7 +15,12 @@
   </title>
 
   {% include_css "material-design-icons" %}
-  {% include_css "Roboto" %}
+  {% include_css "Roboto100" %}
+  {% include_css "Roboto300" %}
+  {% include_css "Roboto400" %}
+  {% include_css "Roboto500" %}
+  {% include_css "Roboto700" %}
+  {% include_css "Roboto900" %}
   {% include_css "paper-css" %}
   <link rel="stylesheet" href="{% sass_src 'style.scss' %}"/>
   <link rel="stylesheet" href="{% static "print.css" %}"/>
diff --git a/aleksis/core/templates/core/edit_dashboard.html b/aleksis/core/templates/core/edit_dashboard.html
index 09d9afd97ee8b983ed4577267641eae77fd2f14e..da50adeea4b2380075113753a9626ef3cbb30fbe 100644
--- a/aleksis/core/templates/core/edit_dashboard.html
+++ b/aleksis/core/templates/core/edit_dashboard.html
@@ -45,20 +45,20 @@
     {% include "core/partials/save_button.html" %}
   </form>
 
-  <h5>{% trans "Available widgets" %}</h5>
+  <h2>{% trans "Available widgets" %}</h2>
   <div class="row card-panel grey lighten-3" id="not-used-widgets">
     {% for widget in not_used_widgets %}
       {% include "core/partials/edit_dashboard_widget.html" %}
     {% endfor %}
   </div>
 
-  <h5>
+  <h2>
     {% if not default_dashboard %}
       {% trans "Your dashboard" %}
     {% else %}
       {% trans "Default dashboard" %}
     {% endif %}
-  </h5>
+  </h2>
 
   <div class="row card-panel grey lighten-3" id="widgets">
     {% for widget in widgets %}
diff --git a/aleksis/core/templates/core/group/child_groups.html b/aleksis/core/templates/core/group/child_groups.html
index bb5a429f6ec09effe094e14663f86187258919d3..900df71a59f24817bbec128b5ec15748b5a9d752 100644
--- a/aleksis/core/templates/core/group/child_groups.html
+++ b/aleksis/core/templates/core/group/child_groups.html
@@ -36,7 +36,7 @@
       </a>
     </form>
 
-    <h5>{% trans "Currently selected groups" %}</h5>
+    <h2>{% trans "Currently selected groups" %}</h2>
 
     {% for group in filter.qs %}
       <div class="chip">
diff --git a/aleksis/core/templates/core/group/full.html b/aleksis/core/templates/core/group/full.html
index 32a3791d2970374fa934d64bf89b29c54e9baef2..65d94ad13a7e563302e9ae283fe4df24c6135353 100644
--- a/aleksis/core/templates/core/group/full.html
+++ b/aleksis/core/templates/core/group/full.html
@@ -9,7 +9,7 @@
 {% block browser_title %}{{ group.name }}{% endblock %}
 
 {% block content %}
-  <h4>{{ group.name }} <small class="grey-text">{{ group.short_name }}</small></h4>
+  <h1>{{ group.name }} <small class="grey-text">{{ group.short_name }}</small></h1>
 
   {% has_perm 'core.edit_group_rule' user group as can_change_group %}
   {% has_perm 'core.change_group_preferences_rule' user group as can_change_group_preferences %}
@@ -61,7 +61,7 @@
   </table>
 
   {% if can_view_group_stats %}
-    <h5>{% blocktrans %}Statistics{% endblocktrans %}</h5>
+    <h2>{% blocktrans %}Statistics{% endblocktrans %}</h2>
     <ul>
       <li>
         {% trans "Count of members" %}: {{ stats.members }}
@@ -79,10 +79,10 @@
     </ul>
   {% endif %}
 
-  <h5>{% blocktrans %}Owners{% endblocktrans %}</h5>
+  <h2>{% blocktrans %}Owners{% endblocktrans %}</h2>
   {% render_table owners_table %}
 
-  <h5>{% blocktrans %}Members{% endblocktrans %}</h5>
+  <h2>{% blocktrans %}Members{% endblocktrans %}</h2>
   {% render_table members_table %}
 
 {% endblock %}
diff --git a/aleksis/core/templates/core/group/list.html b/aleksis/core/templates/core/group/list.html
index 436b193e74f4c7e7e718fe5ba69a0b9fa0812a2b..9fe2c925f79f423cba0e8d195fb0299cca1c906b 100644
--- a/aleksis/core/templates/core/group/list.html
+++ b/aleksis/core/templates/core/group/list.html
@@ -14,7 +14,7 @@
     {% trans "Create group" %}
   </a>
 
-  <h5>{% trans "Filter groups" %}</h5>
+  <h2>{% trans "Filter groups" %}</h2>
   <form method="get">
     {% form form=groups_filter.form %}{% endform %}
     {% trans "Search" as caption %}
@@ -25,6 +25,6 @@
     </button>
   </form>
 
-  <h5>{% trans "Selected groups" %}</h5>
+  <h2>{% trans "Selected groups" %}</h2>
   {% render_table groups_table %}
 {% endblock %}
diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html
index cfc5d72141cf0aaddf879fc4888a5277eccc4fa1..4de8ddcf35ef9153d094798c5cc019aa1bb0f863 100644
--- a/aleksis/core/templates/core/index.html
+++ b/aleksis/core/templates/core/index.html
@@ -56,7 +56,7 @@
   {% if activities or notifications %}
     <div class="row">
       <div class="col s12 m6">
-        <h5>{% blocktrans %}Last activities{% endblocktrans %}</h5>
+        <h2>{% blocktrans %}Last activities{% endblocktrans %}</h2>
 
         {% if activities %}
           <ul class="collection">
@@ -79,7 +79,7 @@
       </div>
 
       <div class="col s12 m6">
-        <h5>{% blocktrans %}Recent notifications{% endblocktrans %}</h5>
+        <h2>{% blocktrans %}Recent notifications{% endblocktrans %}</h2>
 
         {% if notifications %}
           <ul class="collection">
diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html
index 2b2ba3fb0d9a47d298e3abab277ea4ae73cd01fd..6d48194665b2667df1bfdaf0a3c0d05a706c1d23 100644
--- a/aleksis/core/templates/core/person/full.html
+++ b/aleksis/core/templates/core/person/full.html
@@ -8,7 +8,7 @@
 {% block browser_title %}{{ person.first_name }} {{ person.last_name }}{% endblock %}
 
 {% block content %}
-  <h4>{{ person.first_name }} {{ person.last_name }}</h4>
+  <h1>{{ person.first_name }} {{ person.last_name }}</h1>
 
   {% has_perm 'core.edit_person_rule' user person as can_change_person %}
   {% has_perm 'core.change_person_preferences_rule' user person as can_change_person_preferences %}
@@ -47,7 +47,7 @@
     </p>
   {% endif %}
 
-  <h5>{% blocktrans %}Contact details{% endblocktrans %}</h5>
+  <h2>{% blocktrans %}Contact details{% endblocktrans %}</h2>
   <div class="row">
     <div class="col s12 m4">
       {% has_perm 'core.view_photo_rule' user person as can_view_photo %}
@@ -117,7 +117,7 @@
     </div>
     {% if person.description %}
       <div class="col s12 m12">
-        <h5>{% trans "Description" %}</h5>
+        <h2>{% trans "Description" %}</h2>
         <p>
           {{ person.description }}
         </p>
@@ -127,21 +127,21 @@
 
   {% if person.children.all and can_view_personal_details %}
     <div class="col s12 m12">
-      <h5>{% trans "Children" %}</h5>
+      <h2>{% trans "Children" %}</h2>
       {% include "core/person/collection.html" with persons=person.children.all %}
     </div>
   {% endif %}
 
   {% if person.guardians.all and can_view_personal_details %}
     <div class="col s12 m12">
-      <h5>{% trans "Guardians / Parents" %}</h5>
+      <h2>{% trans "Guardians / Parents" %}</h2>
       {% include "core/person/collection.html" with persons=person.guardians.all %}
     </div>
   {% endif %}
 
   {% has_perm 'core.view_person_groups_rule' user person as can_view_groups %}
   {% if can_view_groups %}
-    <h5>{% blocktrans %}Groups{% endblocktrans %}</h5>
+    <h2>{% blocktrans %}Groups{% endblocktrans %}</h2>
     {% render_table groups_table %}
   {% endif %}
 {% endblock %}
diff --git a/aleksis/core/templates/core/person/list.html b/aleksis/core/templates/core/person/list.html
index f91e2ef05b00f3a16fce23f67431e822aff3518a..ca441cac485847cf6a4975071d73787473804694 100644
--- a/aleksis/core/templates/core/person/list.html
+++ b/aleksis/core/templates/core/person/list.html
@@ -18,7 +18,7 @@
     </a>
   {% endif %}
 
-  <h5>{% trans "Filter persons" %}</h5>
+  <h2>{% trans "Filter persons" %}</h2>
   <form method="get">
     {% form form=persons_filter.form %}{% endform %}
     {% trans "Search" as caption %}
@@ -29,6 +29,6 @@
     </button>
   </form>
 
-  <h5>{% trans "Selected persons" %}</h5>
+  <h2>{% trans "Selected persons" %}</h2>
   {% render_table persons_table %}
 {% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application_list.html b/aleksis/core/templates/oauth2_provider/application_list.html
index 8893f3476c8c034c457adb7846b4edfd4e915af1..4b999bef22df7c158f30f83f54d8561825187131 100644
--- a/aleksis/core/templates/oauth2_provider/application_list.html
+++ b/aleksis/core/templates/oauth2_provider/application_list.html
@@ -5,7 +5,7 @@
 {% block browser_title %}{% blocktrans %}OAuth2 Applications{% endblocktrans %}{% endblock %}
 
 {% block content %}
-  <h4>{% blocktrans %}OAuth2 applications{% endblocktrans %}</h4>
+  <h1>{% blocktrans %}OAuth2 applications{% endblocktrans %}</h1>
   <a href="{% url "oauth2_provider:register" %}" class="btn green waves-effect
   waves-light">
     <i class="material-icons left">add</i>
diff --git a/aleksis/core/templates/search/search.html b/aleksis/core/templates/search/search.html
index 514661df42edecac7ca223c1c41fe4dae440b5ee..5af1e55cc1076e404a921596da1cbc0774f7dbc3 100644
--- a/aleksis/core/templates/search/search.html
+++ b/aleksis/core/templates/search/search.html
@@ -23,7 +23,7 @@
       </button>
     </p>
 
-    <h5>{% trans "Results" %}</h5>
+    <h2>{% trans "Results" %}</h2>
 
     {% if query %}
       <div class="collection">
diff --git a/aleksis/core/templates/socialaccount/connections.html b/aleksis/core/templates/socialaccount/connections.html
index 1ff2c2eb6123e21e15423ec0e6b761eefd869c34..2339be7e041609f85311ce152c4083a05ec4e651 100644
--- a/aleksis/core/templates/socialaccount/connections.html
+++ b/aleksis/core/templates/socialaccount/connections.html
@@ -34,7 +34,7 @@
     <p>{% trans 'You currently have no third-party accounts connected to this account.' %}</p>
   {% endif %}
 
-  <h5>{% trans 'Add a Third-party Account' %}</h5>
+  <h2>{% trans 'Add a Third-party Account' %}</h2>
 
   {% include "socialaccount/snippets/provider_list.html" with process="connect" %}
 
diff --git a/aleksis/core/templates/two_factor/core/backup_tokens.html b/aleksis/core/templates/two_factor/core/backup_tokens.html
index 84d6ef6802d5d6e85459eb662fe1d99f65a0dcf9..b85450747fbe00623900af8d2832c0060446a042 100644
--- a/aleksis/core/templates/two_factor/core/backup_tokens.html
+++ b/aleksis/core/templates/two_factor/core/backup_tokens.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block content %}
-  <h4>{% block title %}{% trans "Backup Tokens" %}{% endblock %}</h4>
+  <h1>{% block title %}{% trans "Backup Tokens" %}{% endblock %}</h1>
 
   <div class="alert info">
     <p>
diff --git a/aleksis/core/templates/two_factor/core/phone_register.html b/aleksis/core/templates/two_factor/core/phone_register.html
index 4eae9ebfac173a6b4fc37ed3a21b5941cc28eb71..620cdd07b4310116406fd9e5ba2a15ecad4d1260 100644
--- a/aleksis/core/templates/two_factor/core/phone_register.html
+++ b/aleksis/core/templates/two_factor/core/phone_register.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block content %}
-  <h4>{% block title %}{% trans "Add Backup Phone" %}{% endblock %}</h4>
+  <h1>{% block title %}{% trans "Add Backup Phone" %}{% endblock %}</h1>
 
   {% if wizard.steps.current == 'setup' %}
     <p>{% blocktrans %}You'll be adding a backup phone number to your
diff --git a/aleksis/core/templates/two_factor/core/setup.html b/aleksis/core/templates/two_factor/core/setup.html
index 8048403964a5bd4b7c9761d0189f18bb53524a22..a0e30472db11566a58b1c00e06b5ad6689b6e681 100644
--- a/aleksis/core/templates/two_factor/core/setup.html
+++ b/aleksis/core/templates/two_factor/core/setup.html
@@ -2,7 +2,7 @@
 {% load i18n %}
 
 {% block content %}
-  <h4>{% block title %}{% trans "Enable Two-Factor Authentication" %}{% endblock %}</h4>
+  <h1>{% block title %}{% trans "Enable Two-Factor Authentication" %}{% endblock %}</h1>
 
   {% if wizard.steps.current == 'welcome' %}
     <p class="flow-text">
diff --git a/aleksis/core/templates/two_factor/core/setup_complete.html b/aleksis/core/templates/two_factor/core/setup_complete.html
index 6520694bb0fbeda769573fa86e17bae89b514cf3..df3f5e93acb1ded3138b9aea2375ce7d529c9033 100644
--- a/aleksis/core/templates/two_factor/core/setup_complete.html
+++ b/aleksis/core/templates/two_factor/core/setup_complete.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block content %}
-  <h4>{% block title %}{% trans "Two-Factor Authentication successfully enabled" %}{% endblock %}</h4>
+  <h1>{% block title %}{% trans "Two-Factor Authentication successfully enabled" %}{% endblock %}</h1>
 
   <div class="alert success">
     <p>
diff --git a/aleksis/core/templates/two_factor/profile/disable.html b/aleksis/core/templates/two_factor/profile/disable.html
index 36fa472b7550a11c6b0d2d0d17364e11820bb5ec..56bf20164b16b75a2b1d7e0759c9d43ba8d5b242 100644
--- a/aleksis/core/templates/two_factor/profile/disable.html
+++ b/aleksis/core/templates/two_factor/profile/disable.html
@@ -6,7 +6,7 @@
 {% endblock %}
 
 {% block content %}
-  <h4>{% block title %}{% trans "Disable Two-Factor Authentication" %}{% endblock %}</h4>
+  <h1>{% block title %}{% trans "Disable Two-Factor Authentication" %}{% endblock %}</h1>
 
   <p class="flow-text">
     {% blocktrans trimmed %}
diff --git a/aleksis/core/templates/two_factor/profile/profile.html b/aleksis/core/templates/two_factor/profile/profile.html
index 4161becad1bb418d62115634edd07a128afecf22..eaaa0ff6a5a1bde9463682100dfb9cc6f6b0f3dc 100644
--- a/aleksis/core/templates/two_factor/profile/profile.html
+++ b/aleksis/core/templates/two_factor/profile/profile.html
@@ -6,9 +6,9 @@
 {% endblock %}
 
 {% block content %}
-  <h4>
+  <h1>
     {% block title %}{% trans "Account Security" %}{% endblock %}
-  </h4>
+  </h1>
 
   {% if default_device %}
     {% if default_device_type == 'TOTPDevice' %}
@@ -20,7 +20,7 @@
     {% endif %}
 
     {% if available_phone_methods %}
-      <h5>{% trans "Backup Phone Numbers" %}</h5>
+      <h2>{% trans "Backup Phone Numbers" %}</h2>
       <p>{% blocktrans %}If your primary method is not available, we are able to
         send backup tokens to the phone numbers listed below.{% endblocktrans %}</p>
       <ul class="collection">
@@ -43,7 +43,7 @@
       </p>
     {% endif %}
 
-    <h5>{% trans "Backup Tokens" %}</h5>
+    <h2>{% trans "Backup Tokens" %}</h2>
     <p>
       {% blocktrans %}If you don't have any device with you, you can access
         your account using backup tokens.{% endblocktrans %}
@@ -60,7 +60,7 @@
       </a>
     </p>
 
-    <h5>{% trans "Disable Two-Factor Authentication" %}</h5>
+    <h2>{% trans "Disable Two-Factor Authentication" %}</h2>
     <p>
       {% blocktrans %}
         However we strongly discourage you to do so, you can