diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index a46793f6b4c4c58f3dfa65b749027a29bc0e1959..955b96f9c2c7e6189fa13c6cbe08c9daccfba01a 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -12,6 +12,7 @@ Unreleased
 Added
 ~~~~~
 
+* Add iconify icons
 * Use identicons where avatars are missing.
 * Display personal photos instead of avatars based on a site preference.
 * Add an account menu in the top navbar.
@@ -33,6 +34,11 @@ Fixed
 
 * The ``reset password`` button on the login site used to overflow the card on smaller devices.
 
+Deprecated
+~~~~~~~~~~
+
+* Legacy material icon font will be removed in AlekSIS-Core 3.0
+
 `2.7.4`_ - 2022-02-09
 ---------------------
 
diff --git a/aleksis/core/menus.py b/aleksis/core/menus.py
index da2d102535b5daa91c8484475ec843c16e4d66aa..4d2a2d08328de7a4f9c3ce52d91a088d90dd1a88 100644
--- a/aleksis/core/menus.py
+++ b/aleksis/core/menus.py
@@ -8,13 +8,13 @@ MENUS = {
         {
             "name": _("Login"),
             "url": settings.LOGIN_URL,
-            "icon": "lock_open",
+            "svg_icon": "mdi:login-variant",
             "validators": ["menu_generator.validators.is_anonymous"],
         },
         {
             "name": _("Sign up"),
             "url": "account_signup",
-            "icon": "how_to_reg",
+            "svg_icon": "mdi:account-plus-outline",
             "validators": [
                 "menu_generator.validators.is_anonymous",
                 ("aleksis.core.util.predicates.permission_validator", "core.can_register"),
@@ -23,7 +23,7 @@ MENUS = {
         {
             "name": _("Accept invitation"),
             "url": "enter_invitation_code",
-            "icon": "vpn_key",
+            "svg_icon": "mdi:key-outline",
             "validators": [
                 "menu_generator.validators.is_anonymous",
                 ("aleksis.core.util.predicates.permission_validator", "core.invite_enabled"),
@@ -32,7 +32,7 @@ MENUS = {
         {
             "name": _("Dashboard"),
             "url": "index",
-            "icon": "home",
+            "svg_icon": "mdi:home-outline",
             "validators": [
                 ("aleksis.core.util.predicates.permission_validator", "core.view_dashboard_rule")
             ],
@@ -40,7 +40,7 @@ MENUS = {
         {
             "name": _("Notifications"),
             "url": "notifications",
-            "icon": "notifications",
+            "svg_icon": "mdi:bell-outline",
             "badge": unread_notifications_badge,
             "validators": [
                 (
@@ -49,10 +49,90 @@ MENUS = {
                 ),
             ],
         },
+        {
+            "name": _("Account"),
+            "url": "#",
+            "svg_icon": "mdi:account-outline",
+            "root": True,
+            "validators": ["menu_generator.validators.is_authenticated"],
+            "submenu": [
+                {
+                    "name": _("Stop impersonation"),
+                    "url": "impersonate-stop",
+                    "svg_icon": "mdi:stop",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        "aleksis.core.util.core_helpers.is_impersonate",
+                    ],
+                },
+                {
+                    "name": _("Logout"),
+                    "url": "logout",
+                    "svg_icon": "mdi:logout-variant",
+                    "validators": ["menu_generator.validators.is_authenticated"],
+                },
+                {
+                    "name": _("2FA"),
+                    "url": "two_factor:profile",
+                    "svg_icon": "mdi:two-factor-authentication",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                    ],
+                },
+                {
+                    "name": _("Change password"),
+                    "url": "account_change_password",
+                    "svg_icon": "mdi:form-textbox-password",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "core.can_change_password",
+                        ),
+                    ],
+                },
+                {
+                    "name": _("Me"),
+                    "url": "person",
+                    "svg_icon": "mdi:emoticon-outline",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        "aleksis.core.util.core_helpers.has_person",
+                    ],
+                },
+                {
+                    "name": _("Preferences"),
+                    "url": "preferences_person",
+                    "svg_icon": "mdi:cog-outline",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        "aleksis.core.util.core_helpers.has_person",
+                    ],
+                },
+                {
+                    "name": _("Third-party accounts"),
+                    "url": "socialaccount_connections",
+                    "svg_icon": "mdi:earth",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        "aleksis.core.util.core_helpers.has_person",
+                    ],
+                },
+                {
+                    "name": _("Authorized applications"),
+                    "url": "oauth2_provider:authorized-token-list",
+                    "svg_icon": "mdi:gesture-tap-hold",
+                    "validators": [
+                        "menu_generator.validators.is_authenticated",
+                        "aleksis.core.util.core_helpers.has_person",
+                    ],
+                },
+            ],
+        },
         {
             "name": _("Admin"),
             "url": "#",
-            "icon": "security",
+            "svg_icon": "mdi:security",
             "validators": [
                 ("aleksis.core.util.predicates.permission_validator", "core.view_admin_menu"),
             ],
@@ -60,7 +140,7 @@ MENUS = {
                 {
                     "name": _("Announcements"),
                     "url": "announcements",
-                    "icon": "announcement",
+                    "svg_icon": "mdi:message-alert-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -71,7 +151,7 @@ MENUS = {
                 {
                     "name": _("School terms"),
                     "url": "school_terms",
-                    "icon": "date_range",
+                    "svg_icon": "mdi:calendar-range-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -82,7 +162,7 @@ MENUS = {
                 {
                     "name": _("Dashboard widgets"),
                     "url": "dashboard_widgets",
-                    "icon": "dashboard",
+                    "svg_icon": "mdi:view-dashboard-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -93,7 +173,7 @@ MENUS = {
                 {
                     "name": _("Data management"),
                     "url": "data_management",
-                    "icon": "view_list",
+                    "svg_icon": "mdi:chart-donut",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -104,7 +184,7 @@ MENUS = {
                 {
                     "name": _("System status"),
                     "url": "system_status",
-                    "icon": "power_settings_new",
+                    "svg_icon": "mdi:power-settings",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -115,7 +195,7 @@ MENUS = {
                 {
                     "name": _("Configuration"),
                     "url": "preferences_site",
-                    "icon": "settings",
+                    "svg_icon": "mdi:tune",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -126,13 +206,13 @@ MENUS = {
                 {
                     "name": _("Data checks"),
                     "url": "check_data",
-                    "icon": "done_all",
+                    "svg_icon": "mdi:list-status",
                     "validators": ["menu_generator.validators.is_superuser"],
                 },
                 {
                     "name": _("Manage permissions"),
                     "url": "manage_user_global_permissions",
-                    "icon": "shield",
+                    "svg_icon": "mdi:shield-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -143,7 +223,7 @@ MENUS = {
                 {
                     "name": _("Backend Admin"),
                     "url": "admin:index",
-                    "icon": "settings",
+                    "svg_icon": "mdi:database-cog-outline",
                     "validators": [
                         "menu_generator.validators.is_superuser",
                     ],
@@ -151,7 +231,7 @@ MENUS = {
                 {
                     "name": _("OAuth2 Applications"),
                     "url": "oauth2_applications",
-                    "icon": "touch_app",
+                    "svg_icon": "mdi:gesture-tap-hold",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -164,7 +244,7 @@ MENUS = {
         {
             "name": _("People"),
             "url": "#",
-            "icon": "people",
+            "svg_icon": "mdi:account-group-outline",
             "root": True,
             "validators": [
                 ("aleksis.core.util.predicates.permission_validator", "core.view_people_menu_rule")
@@ -173,7 +253,7 @@ MENUS = {
                 {
                     "name": _("Persons"),
                     "url": "persons",
-                    "icon": "person",
+                    "svg_icon": "mdi:account-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -184,7 +264,7 @@ MENUS = {
                 {
                     "name": _("Groups"),
                     "url": "groups",
-                    "icon": "group",
+                    "svg_icon": "mdi:account-multiple-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -195,7 +275,7 @@ MENUS = {
                 {
                     "name": _("Group types"),
                     "url": "group_types",
-                    "icon": "category",
+                    "svg_icon": "mdi:shape-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -206,7 +286,7 @@ MENUS = {
                 {
                     "name": _("Groups and child groups"),
                     "url": "groups_child_groups",
-                    "icon": "group_add",
+                    "svg_icon": "mdi:account-multiple-plus-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -217,7 +297,7 @@ MENUS = {
                 {
                     "name": _("Additional fields"),
                     "url": "additional_fields",
-                    "icon": "style",
+                    "svg_icon": "mdi:palette-swatch-outline",
                     "validators": [
                         (
                             "aleksis.core.util.predicates.permission_validator",
@@ -228,7 +308,7 @@ MENUS = {
                 {
                     "name": _("Invite person"),
                     "url": "invite_person",
-                    "icon": "card_giftcard",
+                    "svg_icon": "mdi:account-plus-outline",
                     "validators": [
                         "menu_generator.validators.is_authenticated",
                         ("aleksis.core.util.predicates.permission_validator", "core.can_invite"),
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 00c0a6605e5c58d0c8078150d567362a73611ee3..966adca96ca4d34a98510185c925433e54021cb7 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -147,6 +147,7 @@ INSTALLED_APPS = [
     "django_filters",
     "oauth2_provider",
     "rest_framework",
+    "dj_iconify.apps.DjIconifyConfig",
 ]
 
 merge_app_settings("INSTALLED_APPS", INSTALLED_APPS, True)
@@ -565,6 +566,8 @@ YARN_INSTALLED_APPS = [
     "sortablejs",
     "@sentry/tracing",
     "luxon",
+    "@iconify/iconify",
+    "@iconify/json",
 ]
 
 merge_app_settings("YARN_INSTALLED_APPS", YARN_INSTALLED_APPS, True)
@@ -598,6 +601,7 @@ ANY_JS = {
     "Sentry": {"js_url": JS_URL + "/@sentry/tracing/build/bundle.tracing.js"},
     "cleavejs": {"js_url": JS_URL + "/cleave.js/dist/cleave.min.js"},
     "luxon": {"js_url": JS_URL + "/luxon/build/global/luxon.min.js"},
+    "iconify": {"js_url": JS_URL + "/@iconify/iconify/dist/iconify.min.js"},
 }
 
 merge_app_settings("ANY_JS", ANY_JS, True)
@@ -617,6 +621,8 @@ SASS_PROCESSOR_INCLUDE_DIRS = [
     os.path.join(STATIC_ROOT, "public"),
 ]
 
+ICONIFY_JSON_ROOT = os.path.join(JS_ROOT, "@iconify", "json")
+
 ADMINS = _settings.get(
     "contact.admins", [(AUTH_INITIAL_SUPERUSER["username"], AUTH_INITIAL_SUPERUSER["email"])]
 )
diff --git a/aleksis/core/static/js/main.js b/aleksis/core/static/js/main.js
index afc7b50fd530574753bc71f3c81cdd53c769e0a4..b735e2bb53d4a3c6a8f5b1edc9a9bb307214e1b4 100644
--- a/aleksis/core/static/js/main.js
+++ b/aleksis/core/static/js/main.js
@@ -192,6 +192,6 @@ $(document).ready(function () {
 const channel = new BroadcastChannel("cache-or-not");
 channel.addEventListener("message", event => {
     if ((event.data) && !($("#cache-alert").length)) {
-        $("main").prepend('<div id="cache-alert" class="alert warning"><p><i class="material-icons left">warning</i>' + gettext("This page may contain outdated information since there is no internet connection.") + '</p> </div>')
+        $("main").prepend('<div id="cache-alert" class="alert warning"><p><i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>' + gettext("This page may contain outdated information since there is no internet connection.") + '</p> </div>')
     }
 });
diff --git a/aleksis/core/static/js/progress.js b/aleksis/core/static/js/progress.js
index 0b2509006029421273159617c9ff2646bb12800b..5fa0213f8466738466158a56ca6e1df50654a811 100644
--- a/aleksis/core/static/js/progress.js
+++ b/aleksis/core/static/js/progress.js
@@ -9,11 +9,11 @@ const STYLE_CLASSES = {
 };
 
 const ICONS = {
-    10: 'info',
-    20: 'info',
-    25: 'check_circle',
-    30: 'warning',
-    40: 'error',
+    10: 'mdi:information',
+    20: 'mdi:information',
+    25: 'mdi:check-circle',
+    30: 'mdi:alert-outline',
+    40: 'mdi:alert-octagon-outline',
 };
 
 function setProgress(progress) {
@@ -21,7 +21,7 @@ function setProgress(progress) {
 }
 
 function renderMessageBox(level, text) {
-    return '<div class="alert ' + STYLE_CLASSES[level] + '"><p><i class="material-icons left">' + ICONS[level] + '</i>' + text + '</p></div>';
+    return '<div class="alert ' + STYLE_CLASSES[level] + '"><p><i class="material-icons iconify left" data-icon="' + ICONS[level] + '"></i>' + text + '</p></div>';
 }
 
 function customProgress(progressBarElement, progressBarMessageElement, progress) {
@@ -44,7 +44,7 @@ function customProgress(progressBarElement, progressBarMessageElement, progress)
 function customSuccess(progressBarElement, progressBarMessageElement) {
     setProgress(100);
     $("#result-alert").addClass("success");
-    $("#result-icon").text("check_circle");
+    $("#result-icon").attr("data-icon", "mdi:check-circle-outline");
     $("#result-text").text(OPTIONS.success);
     $("#result-box").show();
     $("#result-button").show();
@@ -57,7 +57,7 @@ function customSuccess(progressBarElement, progressBarMessageElement) {
 function customError(progressBarElement, progressBarMessageElement) {
     setProgress(100);
     $("#result-alert").addClass("error");
-    $("#result-icon").text("error");
+    $("#result-icon").attr("data-icon", "mdi:alert-octagon-outline");
     $("#result-text").text(OPTIONS.error);
     $("#result-box").show();
 }
diff --git a/aleksis/core/static/public/style.scss b/aleksis/core/static/public/style.scss
index 888dad2b0bdaa3b6832c41c039c21bc084954696..26ac19ca5d715923f279e9eb07b8e172110aa4bf 100644
--- a/aleksis/core/static/public/style.scss
+++ b/aleksis/core/static/public/style.scss
@@ -429,41 +429,17 @@ th.orderable > a {
   height: inherit;
 }
 
-th.orderable > a::after {
-  @extend .material-icons;
-  font-family: 'Material Icons';
-  font-weight: normal;
-  font-style: normal;
-  font-size: 24px;
-  display: inline-block;
-  line-height: 1;
-  text-transform: none;
-  letter-spacing: normal;
-  word-wrap: normal;
-  white-space: nowrap;
-  direction: ltr;
-  -webkit-font-smoothing: antialiased;
-  text-rendering: optimizeLegibility;
-  -moz-osx-font-smoothing: grayscale;
-  font-feature-settings: 'liga';
-  float: right;
-  content: "unfold_more";
+th.orderable {
+  background: no-repeat right center;
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z' /%3E%3C/svg%3E");
 }
 
-th.orderable.asc > a {
-  color: inherit;
-
-  &::after {
-    content: "expand_less";
-  }
+th.orderable.asc {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z' /%3E%3C/svg%3E");
 }
 
-th.orderable.desc > a {
-  color: inherit;
-
-  &::after {
-    content: "expand_more";
-  }
+th.orderable.desc {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' /%3E%3C/svg%3E");
 }
 
 /*+++++++*/
@@ -980,6 +956,14 @@ i.material-icons.new-notification {
   object-fit: cover;
 }
 
+svg.iconify {
+  @extend i;
+}
+
+.btn .iconify.material-icons, .btn-flat .iconify.material-icons{
+  height: $button-height;
+}
+
 // Login Page
 .login-card-action {
   display: grid;
diff --git a/aleksis/core/templates/403.html b/aleksis/core/templates/403.html
index cbc962a93da9f8e8efd91d1af1b493c254834281..03e600b49e533de68bd25e8f07ea6ed4dbc8fb51 100644
--- a/aleksis/core/templates/403.html
+++ b/aleksis/core/templates/403.html
@@ -6,7 +6,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <i class="material-icons small left">error_outline</i>
+        <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">
         {% if exception %}
           {{ exception }}
diff --git a/aleksis/core/templates/404.html b/aleksis/core/templates/404.html
index cf68c12bf63624ecf40107ee6f3994b288548c3c..969166bea0fb127705f19d8462569a60b4ae88ea 100644
--- a/aleksis/core/templates/404.html
+++ b/aleksis/core/templates/404.html
@@ -6,7 +6,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <i class="material-icons small left">error_outline</i>
+        <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">{{ exception }}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html
index bf56e08db5b6fd6d6052585ce216bd50cbea3796..fee566258f556cf5ea2922abd170873d3c212733 100644
--- a/aleksis/core/templates/500.html
+++ b/aleksis/core/templates/500.html
@@ -6,7 +6,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <i class="material-icons small left">error_outline</i>
+        <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">{% trans "Error" %} (500): {% blocktrans %}An unexpected error has
           occured.{% endblocktrans %}</span>
         <p>
diff --git a/aleksis/core/templates/503.html b/aleksis/core/templates/503.html
index 97d76caa4fab9e641bf522779f7c282a9ab2d2dd..21578e63238f09081e35081b4ed45cf1e0a47a1c 100644
--- a/aleksis/core/templates/503.html
+++ b/aleksis/core/templates/503.html
@@ -6,7 +6,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <i class="material-icons small left">error_outline</i>
+        <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">{% blocktrans %}The maintenance mode is currently enabled. Please try again
           later.{% endblocktrans %}</span>
         <p>
diff --git a/aleksis/core/templates/account/account_inactive.html b/aleksis/core/templates/account/account_inactive.html
index 5c328abcfbca48c6499f71b4b11fac5f1f91ccad..e5fc162e6eea9c1a3418d2a151880dfcdd9003f9 100644
--- a/aleksis/core/templates/account/account_inactive.html
+++ b/aleksis/core/templates/account/account_inactive.html
@@ -10,7 +10,7 @@
     <div class="card red">
       <div class="card-content white-text">
         <div class="card-title">
-          <i class="material-icons small left">error_outline</i>
+          <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
           {% blocktrans %}Account inactive.{% endblocktrans %}
         </div>
         <p>
diff --git a/aleksis/core/templates/account/email_confirm.html b/aleksis/core/templates/account/email_confirm.html
index 0f560556b6567f0a2133d0efb5c324730761243c..189df8516b9446550783fd8ecb7d2751e38dd2d3 100644
--- a/aleksis/core/templates/account/email_confirm.html
+++ b/aleksis/core/templates/account/email_confirm.html
@@ -15,13 +15,13 @@
       {% csrf_token %}
       {% form form=form %}{% endform %}
       {% trans "Confirm" as caption %}
-      {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %}
+      {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-plus-outline" %}
     </form>
   {% else %}
     {% url "account_email" as email_url %}
     <div class="alert warning">
       <p>
-        <i class="material-icons left">warning</i>
+        <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
         {% blocktrans %}This e-mail confirmation link expired or is invalid. Please <a href="{{ email_url }}">issue a new e-mail confirmation request</a>.{% endblocktrans %}
       </p>
     </div>
diff --git a/aleksis/core/templates/account/password_change.html b/aleksis/core/templates/account/password_change.html
index be331751b31187a792b72cf97a178ddddf4de42b..3bcf728890412e39f69929db3d85c945343a5126 100644
--- a/aleksis/core/templates/account/password_change.html
+++ b/aleksis/core/templates/account/password_change.html
@@ -8,7 +8,7 @@
 {% block content %}
   <div class="alert warning">
     <p>
-      <i class="material-icons left">warning</i>
+      <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
       {% trans "Forgot your current password? Click here to reset it:" %} <a href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>.
     </p>
   </div>
@@ -17,7 +17,7 @@
     {% csrf_token %}
     {% form form=form %}{% endform %}
     {% trans "Change password" as caption %}
-    {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %}
+    {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %}
   </form>
 
 {% endblock %}
diff --git a/aleksis/core/templates/account/password_change_disabled.html b/aleksis/core/templates/account/password_change_disabled.html
index 131df489102ec8d257f584892ceb94f04d8e93b1..996ecfa9fa6368ab45772be4064dc058ac59567f 100644
--- a/aleksis/core/templates/account/password_change_disabled.html
+++ b/aleksis/core/templates/account/password_change_disabled.html
@@ -9,7 +9,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <div class="material-icons small left">error_outline</div>
+        <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
         <span class="card-title">{% blocktrans %}Changing of password disabled.{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/account/password_reset.html b/aleksis/core/templates/account/password_reset.html
index 4e93262643e0e28919e405c9b2f0465bf2a2bcf8..6253e0df3643b9fb6434bee35944583c40056b15 100644
--- a/aleksis/core/templates/account/password_reset.html
+++ b/aleksis/core/templates/account/password_reset.html
@@ -15,13 +15,13 @@
             <div class="card-title">{% trans "Reset password" %}</div>
               <p class="margin-bottom">
                 {% blocktrans %}Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it.{% endblocktrans %}
-              </p> 
+              </p>
               {% csrf_token %}
               {% form form=form %}{% endform %}
-            </div>  
+            </div>
           <div class="card-action-light">
             {% trans "Reset password" as caption %}
-            {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %}
+            {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %}
           </div>
         </form>
       </div>
diff --git a/aleksis/core/templates/account/password_reset_done.html b/aleksis/core/templates/account/password_reset_done.html
index ddd8b3871c242e8ee2eb9b22cc472778a3b096b9..f97816fea191b4435d53ea6ea61884186883ccbb 100644
--- a/aleksis/core/templates/account/password_reset_done.html
+++ b/aleksis/core/templates/account/password_reset_done.html
@@ -11,7 +11,7 @@
     <div class="card green">
       <div class="card-content white-text">
         <div class="card-title">
-          <i class="material-icons small left">check_circle</i>
+          <i class="material-icons iconify small left" data-icon="mdi:check-circle-outline"></i>
           {% blocktrans %}Password reset mail sent{% endblocktrans %}
         </div>
         <p>
diff --git a/aleksis/core/templates/account/password_reset_from_key.html b/aleksis/core/templates/account/password_reset_from_key.html
index 4b2b91a28c875e7c1337fd0543646eae881da356..7afae12f4b0141d0a8a9af2ba2ecb33e893c41a0 100644
--- a/aleksis/core/templates/account/password_reset_from_key.html
+++ b/aleksis/core/templates/account/password_reset_from_key.html
@@ -11,7 +11,7 @@
       <div class="card red">
         <div class="card-content white-text">
           <div class="card-title">
-            <i class="material-icons small left">error_outline</i>
+            <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
             {% blocktrans %}Bad token{% endblocktrans %}
           </div>
           <p>
@@ -44,7 +44,7 @@
                 {% form form=form %}{% endform %}
               <div class="card-action-light">
                 {% trans "Change password" as caption %}
-                {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %}
+                {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %}
               </div>
             </div>
           </form>
@@ -52,7 +52,7 @@
       </div>
       <div class="alert success">
         <p>
-          <i class="material-icons left">success</i>
+          <i class="material-icons iconify left" data-icon="mdi:check"></i>
           {% blocktrans %}
             Your password is now changed!
           {% endblocktrans %}
diff --git a/aleksis/core/templates/account/password_reset_from_key_done.html b/aleksis/core/templates/account/password_reset_from_key_done.html
index b32538e53ee5b1b0f2115e645d0f955d235ba958..8fdd9232f065d093549358c485b523a40d83a996 100644
--- a/aleksis/core/templates/account/password_reset_from_key_done.html
+++ b/aleksis/core/templates/account/password_reset_from_key_done.html
@@ -9,7 +9,7 @@
   <div class="container">
     <div class="card green">
       <div class="card-content white-text">
-        <div class="material-icons small left">success</div>
+        <i class="material-icons iconify small left" data-icon="mdi:check"></i>
         <span class="card-title">{% blocktrans %}Password changed!{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/account/password_set.html b/aleksis/core/templates/account/password_set.html
index 08819c1e0904f53e62f11d86bd2e82ccef7b2469..2c550502354719da4959adb7c9b12739378b1c23 100644
--- a/aleksis/core/templates/account/password_set.html
+++ b/aleksis/core/templates/account/password_set.html
@@ -10,7 +10,7 @@
     {% csrf_token %}
     {% form form=form %}{% endform %}
     {% trans "Set password" as caption %}
-    {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %}
+    {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %}
   </form>
 
 {% endblock %}
diff --git a/aleksis/core/templates/account/signup.html b/aleksis/core/templates/account/signup.html
index 8885e3902af13c609a69a595df3d125b66dc79ce..eb606114eae4fbbab8cab0543a59ce549e7bb35d 100644
--- a/aleksis/core/templates/account/signup.html
+++ b/aleksis/core/templates/account/signup.html
@@ -8,7 +8,7 @@
 {% block content %}
   <div class="alert warning">
     <p>
-      <i class="material-icons left">warning</i>
+      <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
       {% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}
     </p>
   </div>
@@ -20,7 +20,7 @@
       <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
     {% endif %}
     {% trans "Sign up" as caption %}
-    {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %}
+    {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-plus-outline" %}
   </form>
 
 {% endblock %}
diff --git a/aleksis/core/templates/account/signup_closed.html b/aleksis/core/templates/account/signup_closed.html
index 0d5cbd51095e9c24fceacbc4ba8f6a510a5705a9..ca0a124ec3922d6a530bec9548863cb981a0b629 100644
--- a/aleksis/core/templates/account/signup_closed.html
+++ b/aleksis/core/templates/account/signup_closed.html
@@ -10,7 +10,7 @@
     <div class="card red">
       <div class="card-content white-text">
         <div class="card-title">
-        <i class="material-icons small left">error_outline</i>
+        <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
           {% blocktrans %}Signup closed.{% endblocktrans %}
         </div>
         <p>
diff --git a/aleksis/core/templates/account/verification_email_required.html b/aleksis/core/templates/account/verification_email_required.html
index b1a4a482a3ee64b0f2c6339e76ed44c66b29ef50..d1f826fff71270f8b207e03e070ac1373ec85924 100644
--- a/aleksis/core/templates/account/verification_email_required.html
+++ b/aleksis/core/templates/account/verification_email_required.html
@@ -10,7 +10,7 @@
   <div class="container">
     <div class="card green">
       <div class="card-content white-text">
-        <div class="material-icons small left">success</div>
+        <div class="material-icons iconify small left" data-icon="mdi:check"></div>
         <span class="card-title">{% blocktrans %}Password reset mail sent!{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/account/verification_sent.html b/aleksis/core/templates/account/verification_sent.html
index df3ae47c82911a01997ac9f4d7919c9e1b95a36e..65bb4c188c3279a5d2bf4bdab37edf92b9fa7760 100644
--- a/aleksis/core/templates/account/verification_sent.html
+++ b/aleksis/core/templates/account/verification_sent.html
@@ -10,7 +10,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <div class="material-icons small left">error_outline</div>
+        <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
         <span class="card-title">{% blocktrans %}Verify your email!{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/components/materialize-chips.html b/aleksis/core/templates/components/materialize-chips.html
index e02662adc354dcb1e3784804fdf46783b282ea39..c4bea23ae6ec79b4e3598053b81348cb6286254f 100644
--- a/aleksis/core/templates/components/materialize-chips.html
+++ b/aleksis/core/templates/components/materialize-chips.html
@@ -3,10 +3,10 @@
     <img class="{{ img_classes }}" src="{{ img }}" alt="{{ alt }}">
   {% endif %}
   {% if icon %}
-    <i class="material-icons left">{{ icon }}</i>
+    <i class="material-icons iconify left" data-icon="{{ icon }}"></i>
   {% endif %}
   {{ content }}
   {% if close %}
-    <i class="close material-icons"></i>
+    <i class="material-icons iconify" data-icon="mdi:close"></i>
   {% endif %}
 </div>
diff --git a/aleksis/core/templates/components/msgbox.html b/aleksis/core/templates/components/msgbox.html
index 8903ebd1a750f1965326cd59499605872b997fc0..de7b12e5eafdfa0974989c20a86dfda3c8372517 100644
--- a/aleksis/core/templates/components/msgbox.html
+++ b/aleksis/core/templates/components/msgbox.html
@@ -2,7 +2,7 @@
   <div class="alert {{ status }}">
     <div>
       {% if icon != "" %}
-        <i class="material-icons left">{{ icon }}</i>
+        <i class="material-icons iconify left" data-icon="{{ icon }}"></i>
       {% endif %}
       {{ msg }}
     </div>
diff --git a/aleksis/core/templates/components/pagination.html b/aleksis/core/templates/components/pagination.html
index 5eb33cdf8fff272d766a628e1656c109ed87e32c..03d05ecf053ddb498d6ab5181f1b774b24e9884a 100644
--- a/aleksis/core/templates/components/pagination.html
+++ b/aleksis/core/templates/components/pagination.html
@@ -5,7 +5,7 @@
     {% if page.has_previous %}
       <li class="waves-effect">
         <a href="?page={{ page.previous_page_number }}" class="page-link">
-          <i class="material-icons">chevron_left</i>
+          <i class="material-icons iconify" data-icon="mdi:chevron-right"></i>
         </a>
       </li>
     {% endif %}
@@ -21,7 +21,7 @@
     {% if page.has_next %}
       <li class="waves-effect">
         <a href="?page={{ page.next_page_number }}" class="page-link">
-          <i class="material-icons">chevron_right</i>
+          <i class="material-icons iconify" data-icon="mdi:chevron-right"></i>
         </a>
       </li>
     {% endif %}
diff --git a/aleksis/core/templates/components/text_collapsible.html b/aleksis/core/templates/components/text_collapsible.html
index 7096e8e9311d7fdcd5f6cffb6af0934fa9d56977..bceac0eb58eb83cc9def914fce97d625ac13802a 100644
--- a/aleksis/core/templates/components/text_collapsible.html
+++ b/aleksis/core/templates/components/text_collapsible.html
@@ -3,11 +3,11 @@
       {% include template with item=qs.first %} –
       {% include template with item=qs.last %}
     </span>
-    <i class="material-icons open-icon" title="Show more">add_circle_outline</i>
+    <i class="material-icons iconify open-icon" title="Show more">plus-circle-outline</i>
     <span class="b">
       {% for item in qs %}
         {% include template with item=item %}
       {% endfor %}
     </span>
-    <i class="material-icons close-icon" title="Show less">remove_circle_outline</i>
+    <i class="material-icons iconify close-icon" title="Show less">minus-circle-outline</i>
 </span>
diff --git a/aleksis/core/templates/core/additional_field/list.html b/aleksis/core/templates/core/additional_field/list.html
index 1ba2a77a32c528b8443f4dc5a4c201b5739414fe..13f320520f2c695e315dd28cec9c78d367d1b6bf 100644
--- a/aleksis/core/templates/core/additional_field/list.html
+++ b/aleksis/core/templates/core/additional_field/list.html
@@ -10,7 +10,7 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url 'create_additional_field' %}">
-    <i class="material-icons left">add</i>
+    <i class="material-icons left iconify" data-icon="mdi:add"></i>
     {% trans "Create additional field" %}
   </a>
 
diff --git a/aleksis/core/templates/core/announcement/form.html b/aleksis/core/templates/core/announcement/form.html
index 44d60280c6d358f74c60cb9c5ccff2c7aba89b07..f085758a3395ca74de1dba8e0affec9fb453cc03 100644
--- a/aleksis/core/templates/core/announcement/form.html
+++ b/aleksis/core/templates/core/announcement/form.html
@@ -30,7 +30,7 @@
     {% form form=form %}{% endform %}
 
     <button type="submit" class="btn green waves-effect waves-light">
-      <i class="material-icons left">save</i>
+      <i class="material-icons left iconify" data-icon="mdi:content-save-outline"></i>
       {% trans "Save und publish announcement" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/core/announcement/list.html b/aleksis/core/templates/core/announcement/list.html
index 9f84617e255c78b7ee37e502c212e0704aa1da5e..763f4f10cce6c240f80812502c7a378bbdb3a0f7 100644
--- a/aleksis/core/templates/core/announcement/list.html
+++ b/aleksis/core/templates/core/announcement/list.html
@@ -9,7 +9,7 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url "add_announcement" %}">
-    <i class="material-icons left">add</i>
+    <i class="material-icons left iconify" data-icon="mdi:add"></i>
     {% trans "Publish new announcement" %}
   </a>
   <table class="highlight">
@@ -32,13 +32,13 @@
         <td>
           <a class="btn-flat waves-effect waves-orange orange-text"
              href="{% url "edit_announcement" announcement.id %}">
-            <i class="material-icons left">edit</i>
+            <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i>
             {% trans "Edit" %}
           </a>
           <form action="{% url "delete_announcement" announcement.id %}" method="post">
             {% csrf_token %}
             <button class="btn-flat waves-effect waves-re red-text" type="submit">
-              <i class="material-icons left">delete</i>
+              <i class="material-icons left iconify" data-icon="mdi:delete-outline"></i>
               {% trans "Delete" %}
             </button>
           </form>
diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index d3a1ada6436769ab7a449b27051823ee49897c44..7337baa58280ec7b6f7034f752f4181803afcf21 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -53,6 +53,12 @@
     </script>
   {% endif %}
 
+  <script type="text/javascript" src="{% url 'config.js' %}"></script>
+  {% include_js "iconify" %}
+
+  <script type="text/javascript" src="{% url 'config.js' %}"></script>
+  {% include_js "iconify" %}
+
   {# Include jQuery early to provide $(document).ready #}
   {% include_js "jQuery" %}
 
@@ -61,6 +67,13 @@
 <body {% if no_menu %}class="without-menu"{% endif %}>
 
 <header>
+  <!-- Menu button (sidenav) -->
+  <div class="container">
+    <a href="#" data-target="slide-out" class="top-nav sidenav-trigger hide-on-large-only">
+      <i class="material-icons iconify" data-icon="mdi:menu"></i>
+    </a>
+  </div>
+
   <!-- Nav bar (logged in as, logout) -->
   <nav class="nav-extended">
     <div class="nav-wrapper">
@@ -131,7 +144,7 @@
             <div class="search-wrapper">
               <input id="search" name="q" type="search" enterkeyhint="search" placeholder="{% trans "Search" %}">
               <button class="btn btn-flat search-button" type="submit" aria-label="{% trans "Search" %}">
-                <i class="material-icons">search</i>
+                <i class="material-icons iconify" data-icon="mdi:search">search</i>
               </button>
               <div class="progress" id="search-loader">
                 <div class="indeterminate"></div>
@@ -154,16 +167,16 @@
   {% if messages %}
     {% for message in messages %}
       <figure class="alert {% if message.tags %}{{ message.tags }}{% else %}info{% endif %}">
-          {% if message.tags == "success" %}
-            <i class="material-icons left">check_circle</i>
-          {% elif  message.tags == "info" %}
-            <i class="material-icons left">info</i>
-          {% elif  message.tags == "warning" %}
-            <i class="material-icons left">warning</i>
-          {% elif  message.tags == "error" %}
-            <i class="material-icons left">error</i>
-          {% endif %}
-          {{ message }}
+        {% if message.tags == "success" %}
+          <i class="material-icons left iconify" data-icon="mdi:check-circle-outline"></i>
+        {% elif message.tags == "info" %}
+          <i class="material-icons left iconify" data-icon="mdi:information-outline"></i>
+        {% elif message.tags == "warning" %}
+          <i class="material-icons left iconify" data-icon="mdi:alert-outline"></i>
+        {% elif message.tags == "error" %}
+          <i class="material-icons left iconify" data-icon="mdi:alert-octagon-outline"></i>
+        {% endif %}
+        {{ message }}
       </figure>
     {% endfor %}
   {% endif %}
diff --git a/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html b/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html
index 23a18714637bf90d9610547210b412eec6fae729..950f925e138e1f3583e0099926fbcbaf79f581e3 100644
--- a/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html
+++ b/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html
@@ -2,7 +2,7 @@
 
 <div class="card horizontal">
   <div class="card-image">
-    <i class="material-icons large red-text stacked-card-icon">assignment_late</i>
+    <i class="material-icons large red-text stacked-card-icon iconify" data-icon="mdi:clipboard-alert-outline"></i>
   </div>
   <div class="card-stacked">
     <div class="card-content">
diff --git a/aleksis/core/templates/core/dashboard_widget/list.html b/aleksis/core/templates/core/dashboard_widget/list.html
index ec5fac70d20c3997d2a02128691b947719eb4309..78356cfed3e3b3cce6358855cbdf615d07712a0d 100644
--- a/aleksis/core/templates/core/dashboard_widget/list.html
+++ b/aleksis/core/templates/core/dashboard_widget/list.html
@@ -11,7 +11,7 @@
 {% block content %}
 
   <a class="btn green waves-effect waves-light dropdown-trigger" href="#" data-target="widget-dropdown">
-    <i class="material-icons left">add</i>
+    <i class="material-icons left iconify" data-icon="mdi:add"></i>
     {% trans "Create dashboard widget" %}
   </a>
   <ul id="widget-dropdown" class="dropdown-content">
@@ -28,7 +28,7 @@
   {% has_perm "core.edit_default_dashboard_rule" user as can_edit_default_dashboard %}
   {% if can_edit_default_dashboard %}
     <a class="btn orange waves-effect waves-light" href="{% url "edit_default_dashboard" %}">
-      <i class="material-icons left">edit</i>
+      <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i>
       {% trans "Edit default dashboard" %}
     </a>
   {% endif %}
diff --git a/aleksis/core/templates/core/data_check/list.html b/aleksis/core/templates/core/data_check/list.html
index 36d83d4cd7d3c917db98c104586bd2aa9c82c139..b192dcdc1623a05fa3ad7b3568b4b8bdc3622abf 100644
--- a/aleksis/core/templates/core/data_check/list.html
+++ b/aleksis/core/templates/core/data_check/list.html
@@ -11,14 +11,14 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url "data_check_run" %}">
-    <i class="material-icons left">refresh</i>
+    <i class="material-icons left iconify" data-icon="mdi:refresh"></i>
     {% trans "Check data again" %}
   </a>
 
   {% if results %}
     <div class="card">
       <div class="card-content">
-        <i class="material-icons left medium red-text">warning</i>
+        <i class="material-icons left medium red-text iconify" data-icon="mdi:alert-outline"></i>
         <span class="card-title">{% trans "The system detected some problems with your data." %}</span>
         <p>{% blocktrans %}Please go through all data and check whether some extra action is
           needed.{% endblocktrans %}</p>
@@ -27,7 +27,7 @@
   {% else %}
     <div class="card">
       <div class="card-content">
-        <i class="material-icons left medium green-text">check_circle</i>
+        <i class="material-icons left medium green-text iconify" data-icon="mdi:check-circle-outline"></i>
         <span class="card-title">{% trans "Everything is fine." %}</span>
         <p>{% blocktrans %}The system hasn't detected any problems with your data.{% endblocktrans %}</p>
       </div>
@@ -86,7 +86,7 @@
       <div class="card-title">{% trans "Registered checks" %}</div>
       <div class="alert primary">
         <div>
-          <i class="material-icons left">info</i>
+          <i class="material-icons left iconify" data-icon="mdi:information-outline"></i>
           {% blocktrans %}
             The system will check for the following problems:
           {% endblocktrans %}
@@ -95,7 +95,7 @@
       <ul class="collection">
         {% for check in registered_checks %}
           <li class="collection-item">
-            <i class="material-icons left">check</i>
+            <i class="material-icons left iconify" data-icon="mdi:check"></i>
             {{ check.verbose_name }}
           </li>
         {% endfor %}
diff --git a/aleksis/core/templates/core/edit_dashboard.html b/aleksis/core/templates/core/edit_dashboard.html
index da50adeea4b2380075113753a9626ef3cbb30fbe..ba4614db61abf50ba8c4bfbabb5383175351c8d8 100644
--- a/aleksis/core/templates/core/edit_dashboard.html
+++ b/aleksis/core/templates/core/edit_dashboard.html
@@ -19,7 +19,7 @@
 {% block content %}
   <div class="alert primary">
     <p>
-      <i class="material-icons left">info</i>
+      <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
       {% if not default_dashboard %}
         {% blocktrans %}
           On this page you can arrange your personal dashboard. You can drag any items from "Available widgets" to "Your
diff --git a/aleksis/core/templates/core/group/child_groups.html b/aleksis/core/templates/core/group/child_groups.html
index 900df71a59f24817bbec128b5ec15748b5a9d752..a9b93355b8d775b32d3c20123980828fdcae0fd7 100644
--- a/aleksis/core/templates/core/group/child_groups.html
+++ b/aleksis/core/templates/core/group/child_groups.html
@@ -14,7 +14,7 @@
   {% if not page %}
     <div class="alert info">
       <p>
-        <i class="material-icons left">info</i>
+        <i class="material-icons left iconify" data-icon="mdi:information-outline"></i>
         {% blocktrans %}
           You can use this to assign child groups to groups. Please use the filters below to select groups you want to
           change and click "Next".
@@ -27,11 +27,11 @@
       {% form form=filter.form %}{% endform %}
 
       <button type="submit" class="btn green waves-effect waves-light">
-        <i class="material-icons left">refresh</i>
+        <i class="material-icons left iconify" data-icon="mdi:refresh"></i>
         {% trans "Update selection" %}
       </button>
       <a href="{% url "groups_child_groups" %}" class="btn red waves-effect waves-light">
-        <i class="material-icons left">clear</i>
+        <i class="material-icons left iconify" data-icon="mdi:close"></i>
         {% trans "Clear all filters" %}
       </a>
     </form>
@@ -50,14 +50,14 @@
         {% csrf_token %}
         <button class="btn btn-primary waves-effect waves-light" type="submit" name="page" value="1">
           {% trans "Start assigning child groups for this groups" %}
-          <i class="material-icons right">arrow_forward</i>
+          <i class="material-icons left iconify" data-icon="mdi:arrow-right"></i>
         </button>
       </form>
       </p>
     {% else %}
       <div class="alert warning">
         <p>
-          <i class="material-icons left">warning</i>
+          <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i>
           {% blocktrans %}
             Please select some groups in order to go on with assigning.
           {% endblocktrans %}
diff --git a/aleksis/core/templates/core/group/full.html b/aleksis/core/templates/core/group/full.html
index 65d94ad13a7e563302e9ae283fe4df24c6135353..3c6e5488d6174e30847eabcfda2e97b244112938 100644
--- a/aleksis/core/templates/core/group/full.html
+++ b/aleksis/core/templates/core/group/full.html
@@ -20,21 +20,21 @@
     <p>
       {% if can_change_group %}
         <a href="{% url 'edit_group_by_id' group.id %}" class="btn waves-effect waves-light">
-          <i class="material-icons left">edit</i>
+          <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i>
           {% trans "Edit" %}
         </a>
       {% endif %}
 
       {% if can_delete_group %}
         <a href="{% url 'delete_group_by_id' group.id %}" class="btn waves-effect waves-light red">
-          <i class="material-icons left">delete</i>
+          <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
           {% trans "Delete" %}
         </a>
       {% endif %}
 
       {% if can_change_group_preferences %}
         <a href="{% url "preferences_group" group.id %}" class="btn waves-effect waves-light">
-          <i class="material-icons left">settings</i>
+          <i class="material-icons iconify left" data-icon="mdi:cog-outline"></i>
           {% trans "Change preferences" %}
         </a>
       {% endif %}
@@ -44,7 +44,7 @@
   <table>
     <tr>
       <th>
-        <i class="material-icons center" title="{% trans "Group type" %}">category</i>
+        <i class="material-icons iconify center" data-icon="mdi:shape-outline" title="{% trans "Group type" %}"></i>
       </th>
       <td>
         {{ group.group_type }}
@@ -52,7 +52,7 @@
     </tr>
     <tr>
       <th>
-        <i class="material-icons center" title="{% trans "Parent groups" %}">vertical_align_top</i>
+        <i class="material-icons iconify center" data-icon="mdi:format-vertical-align-top" title="{% trans "Parent groups" %}"></i>
       </th>
       <td>
         {{ group.parent_groups.all|join:", " }}
diff --git a/aleksis/core/templates/core/group/list.html b/aleksis/core/templates/core/group/list.html
index 9fe2c925f79f423cba0e8d195fb0299cca1c906b..38391cad82a3ff007b02bdca0f6cdda06d53ca2c 100644
--- a/aleksis/core/templates/core/group/list.html
+++ b/aleksis/core/templates/core/group/list.html
@@ -10,7 +10,7 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url 'create_group' %}">
-    <i class="material-icons left">add</i>
+    <i class="material-icons iconify left" data-icon="mdi:add"></i>
     {% trans "Create group" %}
   </a>
 
@@ -20,7 +20,7 @@
     {% trans "Search" as caption %}
     {% include "core/partials/save_button.html" with caption=caption icon="search" %}
     <button type="reset" class="btn red waves-effect waves-light">
-      <i class="material-icons left">clear</i>
+      <i class="material-icons iconify left" data-icon="mdi:close"></i>
       {% trans "Clear" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/core/group_type/list.html b/aleksis/core/templates/core/group_type/list.html
index 6344416b1a8292fd5400e57d63c056e1b2839ef8..e862cb0191533178546b7b481b0db3ce26fa70a0 100644
--- a/aleksis/core/templates/core/group_type/list.html
+++ b/aleksis/core/templates/core/group_type/list.html
@@ -10,7 +10,7 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url 'create_group_type' %}">
-    <i class="material-icons left">add</i>
+    <i class="material-icons iconify left" data-icon="mdi:add"></i>
     {% trans "Create group type" %}
   </a>
 
diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html
index 7c9c018ca8102172dbd6e46c41048bcbcff4d46f..766c88278ca688381356c35e79b3424b7fb5ce75 100644
--- a/aleksis/core/templates/core/index.html
+++ b/aleksis/core/templates/core/index.html
@@ -13,7 +13,7 @@
   {% if can_edit_dashboard and show_edit_dashboard_button %}
     <div class="row no-margin">
       <a class="btn-flat waves-effect waves-light right" href="{% url "edit_dashboard" %}">
-        <i class="material-icons left">edit</i>
+        <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i>
         {% trans "Edit dashboard" %}
       </a>
     </div>
@@ -21,11 +21,11 @@
 
   {% for notification in unread_notifications %}
     <figure class="alert primary scale-transition">
-        <i class="material-icons left">info</i>
+        <i class="material-icons left iconify" data-icon="mdi:information-outline"></i>
 
         <div class="right">
           <a class="btn-flat waves-effect" href="{% url "notification_mark_read" notification.id %}">
-            <i class="material-icons center">close</i>
+            <i class="material-icons center iconify" data-icon="mdi:close"></i>
           </a>
         </div>
 
@@ -65,7 +65,7 @@
                 <span class="badge new primary-color">{{ activity.app }}</span>
                 <span class="title">{{ activity.title }}</span>
                 <p>
-                  <i class="material-icons left">access_time</i> {{ activity.created }}
+                  <i class="material-icons left iconify" data-icon="mdi:clock-outline"></i> {{ activity.created }}
                 </p>
                 <p>
                   {{ activity.description }}
@@ -88,7 +88,7 @@
                 <span class="badge new primary-color">{{ notification.sender }}</span>
                 <span class="title">{{ notification.title }}</span>
                 <p>
-                  <i class="material-icons left">access_time</i> {{ notification.created }}
+                  <i class="material-icons left iconify" data-icon="mdi:clock-outline"></i> {{ notification.created }}
                 </p>
                 <p>
                   {{ notification.description }}
diff --git a/aleksis/core/templates/core/notifications.html b/aleksis/core/templates/core/notifications.html
index 499bbcc4c866142ce9062efd75fab039dbd303f6..60640670e6ca02ae788c4c37ff5f65d7c9969e2d 100644
--- a/aleksis/core/templates/core/notifications.html
+++ b/aleksis/core/templates/core/notifications.html
@@ -13,7 +13,7 @@
           <span class="badge new primary-color">{{ notification.sender }}</span>
           <span class="title">{{ notification.title }}</span>
           <p>
-            <i class="material-icons left">access_time</i> {{ notification.created }}
+            <i class="material-icons iconify left" data-icon="mdi:clock-outline"></i> {{ notification.created }}
           </p>
           <p>
             {{ notification.description|linebreaks }}
diff --git a/aleksis/core/templates/core/pages/delete.html b/aleksis/core/templates/core/pages/delete.html
index db64ee8fc3b977ed9cb74333e1a25834ce3e58b7..9cbe50ca73913a6cd06ac1eca32b39f88941ee78 100644
--- a/aleksis/core/templates/core/pages/delete.html
+++ b/aleksis/core/templates/core/pages/delete.html
@@ -18,7 +18,7 @@
   <form method="post" action="">
     {% csrf_token %}
     <button type="submit" class="btn red waves-effect waves-light">
-      <i class="material-icons left">delete</i>
+      <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
       {% trans "Delete" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/core/pages/progress.html b/aleksis/core/templates/core/pages/progress.html
index fca1ddfc2ebe5980ee132de77bdf1baafce24ae0..dc12869c8130a26bf2d5d96f1d30e8a83444bd61 100644
--- a/aleksis/core/templates/core/pages/progress.html
+++ b/aleksis/core/templates/core/pages/progress.html
@@ -23,32 +23,32 @@
       <noscript>
         <div class="alert warning">
           <p>
-            <i class="material-icons left">warning</i>
+            <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
             {% blocktrans %}
               Without activated JavaScript the progress status can't be updated.
             {% endblocktrans %}
           </p>
         </div>
       </noscript>
-    
+
       <div id="messages"></div>
 
       <div id="result-box" style="display: none;">
         <div class="alert" id="result-alert">
           <div>
-            <i class="material-icons left" id="result-icon">check_circle</i>
+            <i class="material-icons iconify left" id="result-icon" data-icon="mdi:check-circle-outline"></i>
             <p id="result-text"></p>
           </div>
         </div>
 
         {% url "index" as index_url %}
         <a class="btn waves-effect waves-light" href="{{ back_url|default:index_url }}">
-          <i class="material-icons left">arrow_back</i>
+          <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
           {% trans "Go back" %}
         </a>
         {% if additional_button %}
           <a class="btn waves-effect waves-light" href="{{ additional_button.href }}" id="result-button" style="display: none;">
-            <i class="material-icons left">{{ additional_button.icon|default:"" }}</i>
+            <i class="material-icons iconify left" data-icon="{{ additional_button.icon|default:"" }}"></i>
             {{ additional_button.caption }}
           </a>
         {% endif %}
diff --git a/aleksis/core/templates/core/pages/system_status.html b/aleksis/core/templates/core/pages/system_status.html
index 89c6ed65e3982a0318838a66ef7f6716935d0af3..4eee117807c2b2a45a1271e1f4aa9673189d105d 100644
--- a/aleksis/core/templates/core/pages/system_status.html
+++ b/aleksis/core/templates/core/pages/system_status.html
@@ -15,8 +15,9 @@
       <div class="row">
         {% if maintenance_mode %}
           <a class="btn-flat btn-flat-medium right waves-effect waves-red no-padding"
-             href="{% url 'maintenance_mode_off' %}"><i
-                  class="material-icons small red-text center">power_settings_new</i></a>
+             href="{% url 'maintenance_mode_off' %}">
+            <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i>
+          </a>
           <div>
             <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p>
             <p class="grey-text">
@@ -28,8 +29,9 @@
           <span class="badge badge-danger mdi mdi-power"><a href="{% url 'maintenance_mode_off' %}"></a></span>
         {% else %}
           <a class="btn-flat btn-flat-medium right waves-effect waves-green no-padding"
-             href="{% url 'maintenance_mode_on' %}"><i
-                  class="material-icons small green-text center">power_settings_new</i></a>
+             href="{% url 'maintenance_mode_on' %}">
+            <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i>
+          </a>
           <div>
             <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p>
             <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p>
@@ -40,7 +42,7 @@
       {# Debug mode #}
       <div class="row">
         {% if DEBUG %}
-          <i class="material-icons small red-text right">power_settings_new</i>
+          <i class="material-icons iconify small red-text right" data-icon="mdi:power"></i>
           <div>
             <p class="flow-text">{% blocktrans %}Debug mode enabled{% endblocktrans %}</p>
             <p class="grey-text">
@@ -49,7 +51,7 @@
               {% endblocktrans %}</p>
           </div>
         {% else %}
-          <i class="material-icons small green-text right">power_settings_new</i>
+          <i class="material-icons iconify small green-text right" data-icon="mdi:power"></i>
           <div>
             <p class="flow-text">{% blocktrans %}Debug mode disabled{% endblocktrans %}</p>
             <p class="grey-text">
@@ -82,11 +84,13 @@
             <tr>
               <td>
                 <a class="tooltipped" data-position="top" data-tooltip="{{ plugin.pretty_status }}">
-                {% if plugin.status %}
-                  <i class="material-icons green-text" aria-hidden="true" title="{{ plugin.pretty_status }}">check</i>
-                {% else %}
-                  <i class="material-icons red-text" aria-hidden="true" title="{{ plugin.pretty_status }}">warning</i>
-                {% endif %}
+                  {% if plugin.status %}
+                    <i class="material-icons iconify green-text" aria-hidden="true" title="{{ plugin.pretty_status }}"
+                       data-icon="mdi:check"></i>
+                  {% else %}
+                    <i class="material-icons iconify red-text" aria-hidden="true" title="{{ plugin.pretty_status }}"
+                       data-icon="mdi:alert-outline"></i>
+                  {% endif %}
                 </a>
               </td>
               <td>{{ plugin.identifier }}</td>
@@ -126,32 +130,32 @@
                     {% if task.status == "PENDING" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons orange-text">hourglass_empty</i>
+                        <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand-empty"></i>
                       </a>
                     {% elif task.status == "STARTED" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons orange-text">directions_run</i>
+                        <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand"></i>
                       </a>
                     {% elif task.status == "SUCCESS" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons green-text">done</i>
+                        <i class="material-icons iconify green-text" data-icon="mdi:check"></i>
                       </a>
                     {% elif task.status == "FAILURE" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons red-text">error</i>
+                        <i class="material-icons iconify red-text" data-icon="mdi:alert-octagon-outline"></i>
                       </a>
                     {% elif task.status == "RETRY" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons orange-text">hourglass_full</i>
+                        <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand-full"></i>
                       </a>
                     {% elif task.status == "REVOKED" %}
                       <a class="tooltipped" data-position="top"
                       data-tooltip="{{ task.status }}">
-                        <i class="material-icons red-text">clear</i>
+                        <i class="material-icons iconify red-text" data-icon="mdi:close"></i>
                       </a>
                     {% endif %}
                   </td>
diff --git a/aleksis/core/templates/core/pages/test_pdf.html b/aleksis/core/templates/core/pages/test_pdf.html
index f0c0a6169c85a6f37252136b3777dc0967350e43..1730d10e655759ad193cd7282654374795951721 100644
--- a/aleksis/core/templates/core/pages/test_pdf.html
+++ b/aleksis/core/templates/core/pages/test_pdf.html
@@ -10,7 +10,7 @@
 {% block content %}
   <div class="alert primary">
     <p>
-      <i class="material-icons left">info</i>
+      <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
       {% blocktrans %}
         This simple view can be used to ensure the correct function of the built-in PDF generation system.
       {% endblocktrans %}
diff --git a/aleksis/core/templates/core/partials/announcements.html b/aleksis/core/templates/core/partials/announcements.html
index e3dcd5165f4149e3d5fa2016487ef771ad84f12d..4a286a5d79224023995f48dc38a43fb27f2988d7 100644
--- a/aleksis/core/templates/core/partials/announcements.html
+++ b/aleksis/core/templates/core/partials/announcements.html
@@ -16,7 +16,7 @@
         </em>
       {% endif %}
 
-      <i class="material-icons left">announcement</i>
+      <i class="material-icons iconify left" data-icon="mdi:message-alert-outline"></i>
 
       {% if show_recipients and announcement.recipients %}
         <p>
diff --git a/aleksis/core/templates/core/partials/crud_events.html b/aleksis/core/templates/core/partials/crud_events.html
index b0edf14d154690e33a2fac523f5fa38429fcdb5e..d0eba480a1cceec09117f96d7e18c4141729be45 100644
--- a/aleksis/core/templates/core/partials/crud_events.html
+++ b/aleksis/core/templates/core/partials/crud_events.html
@@ -5,9 +5,9 @@
     <div class="collection-item">
       <div class="left" style="margin-right: 10px;">
         {% if forloop.first %}
-          <i class="material-icons">add_circle</i>
+          <i class="material-icons iconify" data-icon="mdi:plus-circle-outline"></i>
         {% else %}
-          <i class="material-icons">edit</i>
+          <i class="material-icons iconify" data-icon="mdi:pencil-circle-outline"></i>
         {% endif %}
       </div>
       <strong>
diff --git a/aleksis/core/templates/core/partials/edit_dashboard_widget.html b/aleksis/core/templates/core/partials/edit_dashboard_widget.html
index b842c0937f05c4e90a4d7337871460130fa43012..1a469c9cee2a129334bc93779521084c6297074c 100644
--- a/aleksis/core/templates/core/partials/edit_dashboard_widget.html
+++ b/aleksis/core/templates/core/partials/edit_dashboard_widget.html
@@ -2,7 +2,7 @@
      data-pk="{{ widget.pk }}">
   <div class="card placeholder">
     <div class="card-content">
-      <i class="material-icons left small">drag_handle</i>
+      <i class="material-icons iconify left small" data-icon="mdi:drag-horizontal-variant"></i>
       <span class="card-title">{{ widget.title }}</span>
     </div>
   </div>
diff --git a/aleksis/core/templates/core/partials/footer-menu.html b/aleksis/core/templates/core/partials/footer-menu.html
index 5a1d268ea2916899bb3d5bddd47e26d4962734ba..2db2689efed0b3488dc7ba4362d2ff6747863f0e 100644
--- a/aleksis/core/templates/core/partials/footer-menu.html
+++ b/aleksis/core/templates/core/partials/footer-menu.html
@@ -3,7 +3,7 @@
 {% for item in FOOTER_MENU.items.all %}
   <a class="blue-text text-lighten-4 btn-flat" href="{{ item.url }}">
     {% if item.icon %}
-      <i class="material-icons footer-icon left">{{ item.icon }}</i>
+      <i class="material-icons iconify footer-icon left" data-icon="{{ item.icon }}">{{ item.icon }}</i>
     {% endif %}
     {{ item.name }}
   </a>
diff --git a/aleksis/core/templates/core/partials/no_person.html b/aleksis/core/templates/core/partials/no_person.html
index 62b398a1af779b0fc17eef8aa2c0e845760a4e5d..d99a1e0cbcbd0d6a39ea8565bbcadcb39d7482ce 100644
--- a/aleksis/core/templates/core/partials/no_person.html
+++ b/aleksis/core/templates/core/partials/no_person.html
@@ -5,7 +5,7 @@
 {% if user.person.is_dummy or not user.person and not user.is_anonymous %}
   <div class="alert error">
     <div>
-      <i class="material-icons left">error</i>
+      <i class="material-icons iconify left" data-icon="mdi:alert-octagon-outline"></i>
 
       {% if user.person.is_dummy %}
         <p>
diff --git a/aleksis/core/templates/core/partials/save_button.html b/aleksis/core/templates/core/partials/save_button.html
index ebc48f2db3d4529f292e3352dbf0cd45ccec2868..3a43323677c44ab6e393c818b451c2b8b846610c 100644
--- a/aleksis/core/templates/core/partials/save_button.html
+++ b/aleksis/core/templates/core/partials/save_button.html
@@ -1,5 +1,6 @@
 {% load i18n %}
 <button type="submit" class="btn waves-effect waves-light green">
   {% trans "Save" as default %}
-  <i class="material-icons left">{{ icon|default:"save" }}</i> {{ caption|default:default }}
+  <i class="material-icons left iconify" data-icon="{{ icon|default:"mdi:content-save-outline" }}"></i>
+  {{ caption|default:default }}
 </button>
diff --git a/aleksis/core/templates/core/partials/sidenav.html b/aleksis/core/templates/core/partials/sidenav.html
index 9b3be97059ca834238d39a4dd6f6bfe35205a9d2..0120f6b71b0f505e6376e4b3a36894d71b38b914 100644
--- a/aleksis/core/templates/core/partials/sidenav.html
+++ b/aleksis/core/templates/core/partials/sidenav.html
@@ -14,6 +14,8 @@
             <i class="{{ item.icon_class }}"></i>
           {% elif item.icon %}
             <i class="material-icons">{{ item.icon }}</i>
+          {% elif item.svg_icon %}
+            <i class="material-icons iconify" data-icon="{{item.svg_icon}}"></i>
           {% endif %}
           {{ item.name }}
           {% build_badge item as badge %}
@@ -30,6 +32,8 @@
             <i class="{{ item.icon_class }}"></i>
           {% elif item.icon %}
             <i class="material-icons">{{ item.icon }}</i>
+          {% elif item.svg_icon %}
+            <i class="material-icons iconify" data-icon="{{item.svg_icon}}"></i>
           {% endif %}
           {{ item.name }}
           {% build_badge item as badge %}
@@ -46,6 +50,8 @@
                     <i class="{{ menu.icon_class }}"></i>
                   {% elif menu.icon %}
                     <i class="material-icons">{{ menu.icon }}</i>
+                  {% elif menu.svg_icon %}
+                    <i class="material-icons iconify" data-icon="{{menu.svg_icon}}"></i>
                   {% endif %}
                   {{ menu.name }}
                   {% build_badge item as badge %}
diff --git a/aleksis/core/templates/core/partials/turnable.html b/aleksis/core/templates/core/partials/turnable.html
index e122b2fa4396282fe0941376161fe3086cda4deb..dabfcbb93ddce6d9323a84757c3753e713c8efea 100644
--- a/aleksis/core/templates/core/partials/turnable.html
+++ b/aleksis/core/templates/core/partials/turnable.html
@@ -2,9 +2,9 @@
 
 <div class="row">
   <a href="{{ url_prev }}" class="btn-flat left">
-    <i class="material-icons small">chevron_left</i>
+    <i class="material-icons iconify small"data-icon="mdi:chevron-left"></i>
   </a>
   <a href="{{ url_next }}" class="btn-flat right">
-    <i class="material-icons small">chevron_right</i>
+    <i class="material-icons iconify small" data-icon="mdi:chevron-right"></i>
   </a>
 </div>
diff --git a/aleksis/core/templates/core/perms/assign.html b/aleksis/core/templates/core/perms/assign.html
index 1833ece952d04f01f2f38440cc0fe8fc1d509bf7..75ca29dbad18c1b84e79638cf1c192a7b6b9707d 100644
--- a/aleksis/core/templates/core/perms/assign.html
+++ b/aleksis/core/templates/core/perms/assign.html
@@ -22,7 +22,7 @@
     <input type="hidden" name="step" value="{{ step }}">
     {% form form=form %}{% endform %}
     <button type="submit" class="btn green waves-effect waves-light">
-      <i class="material-icons left">save</i>
+      <i class="material-icons left iconify" data-icon="mdi:content-save-outline"></i>
       {% trans "Assign" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/core/perms/list.html b/aleksis/core/templates/core/perms/list.html
index 73dcfb8730d5e2235b3b398a4ef0f0fd70c8c31b..319b00285f10753a966047df23669ac40d5b4c95 100644
--- a/aleksis/core/templates/core/perms/list.html
+++ b/aleksis/core/templates/core/perms/list.html
@@ -54,7 +54,7 @@
         {% csrf_token %}
         {% form form=filter.form %}{% endform %}
         <button type="submit" class="btn waves-effect waves-light">
-          <i class="material-icons left">refresh</i>
+          <i class="material-icons left iconify" data-icon="mdi:refresh"></i>
           {% trans "Update" %}
         </button>
       </form>
diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html
index 3972661fa81828e12b47fa606a3fc59b37ba9e69..9a58951118e4bdafe3278cb7e4280e455fa99943 100644
--- a/aleksis/core/templates/core/person/full.html
+++ b/aleksis/core/templates/core/person/full.html
@@ -22,35 +22,35 @@
       <p class="person-buttons hide-on-med-and-down">
         {% if can_change_person %}
           <a href="{% url 'edit_person_by_id' person.id %}" class="btn waves-effect waves-light">
-            <i class="material-icons left">edit</i>
+            <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i>
             {% trans "Edit" %}
           </a>
         {% endif %}
 
         {% if can_delete_person %}
           <a href="{% url 'delete_person_by_id' person.id %}" class="btn waves-effect waves-light red">
-            <i class="material-icons left">delete</i>
+            <i class="material-icons left iconify" data-icon="mdi:delete-outline"></i>
             {% trans "Delete" %}
           </a>
         {% endif %}
 
         {% if can_change_person_preferences %}
           <a href="{% url 'preferences_person' person.id %}" class="btn waves-effect waves-light">
-            <i class="material-icons left">settings</i>
+            <i class="material-icons left iconify" data-icon="mdi:cog-outline"></i>
             {% trans "Change preferences" %}
           </a>
         {% endif %}
 
         {% if can_impersonate and person.user %}
           <a href="{% url 'impersonate-start' person.user.id %}" class="btn waves-effect waves-light">
-            <i class="material-icons left">portrait</i>
+            <i class="material-icons left iconify" data-icon="mdi:account-box-outline"></i>
             {% trans "Impersonate" %}
           </a>
         {% endif %}
 
         {% if invite_enabled and can_invite and not person.user %}
           <a href="{% url "invite_person_by_id" person.id %}" class="btn waves-effect waves-light">
-            <i class="material-icons left">card_giftcard</i>
+            <i class="material-icons iconify left" data-icon="mdi:account-plus-outline"></i>
             {% trans "Invite user" %}
           </a>
         {% endif %}
@@ -82,35 +82,35 @@
         <div class="collection">
           {% if can_change_person %}
             <a href="{% url 'edit_person_by_id' person.id %}" class="collection-item waves-effect waves-dark">
-              <i class="material-icons left">edit</i>
+              <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i>
               {% trans "Edit" %}
             </a>
           {% endif %}
 
           {% if can_delete_person %}
             <a href="{% url 'delete_person_by_id' person.id %}" class="collection-item waves-effect waves-red red-text">
-              <i class="material-icons left">delete</i>
+              <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
               {% trans "Delete" %}
             </a>
           {% endif %}
 
           {% if can_change_person_preferences %}
             <a href="{% url 'preferences_person' person.id %}" class="collection-item waves-effect waves-dark">
-              <i class="material-icons left">settings</i>
+              <i class="material-icons iconify left" data-icon="mdi:cog-outline"></i>
               {% trans "Change preferences" %}
             </a>
           {% endif %}
 
         {% if can_impersonate and person.user %}
             <a href="{% url 'impersonate-start' person.user.id %}" class="collection-item waves-effect waves-dark">
-              <i class="material-icons left">portrait</i>
+              <i class="material-icons iconify left" data-icon="mdi:account-box-outline"></i>
               {% trans "Impersonate" %}
             </a>
           {% endif %}
 
         {% if can_invite and not person.user %}
           <a href="{% url "invite_person_by_id" person.id %}" class="collection-item waves-effect waves-light">
-            <i class="material-icons left">card_giftcard</i>
+            <i class="material-icons iconify left" data-icon="mdi:account-plus-outline"></i>
             {% trans "Invite user" %}
           </a>
         {% endif %}
@@ -123,13 +123,13 @@
         <table class="highlight">
         <tr>
           <td>
-            <i class="material-icons small">person</i>
+            <i class="material-icons small iconify" data-icon="mdi:account-outline"></i>
           </td>
           <td>{{ person.first_name }} {{ person.additional_name }} {{ person.last_name }}</td>
         </tr>
         <tr>
           <td>
-            <i class="material-icons small">face</i>
+            <i class="material-icons small iconify" data-icon="mdi:human-non-binary"></i>
           </td>
           <td>{% firstof person.get_sex_display "–" %}</td>
         </tr>
@@ -137,7 +137,7 @@
         {% if can_view_address %}
           <tr>
             <td rowspan="2">
-              <i class="material-icons small">home</i>
+              <i class="material-icons small iconify" data-icon="mdi:map-marker-outline"></i>
             </td>
             <td>{% firstof person.street "–" %} {{ person.housenumber }}</td>
           </tr>
@@ -149,7 +149,7 @@
         {% if can_view_contact_details %}
           <tr>
             <td rowspan="2">
-              <i class="material-icons small">phone</i>
+              <i class="material-icons small iconify" data-icon="mdi:phone-outline"></i>
             </td>
             <td>
               {% if person.phone_number %}
@@ -172,7 +172,7 @@
           </tr>
           <tr>
             <td>
-              <i class="material-icons small">email</i>
+              <i class="material-icons small iconify" data-icon="mdi:email-outline"></i>
             </td>
             <td>
               {% if person.email %}
@@ -187,7 +187,7 @@
         {% if can_view_personal_details %}
           <tr>
             <td>
-              <i class="material-icons small">cake</i>
+              <i class="material-icons small iconify" data-icon="mdi:cake"></i>
             </td>
             <td>
               <time datetime="{{ person.date_of_birth|date:'c' }}">{{ person.date_of_birth|date }}</time>
@@ -206,7 +206,7 @@
             <span class="card-title">{{ person.first_name }} {{ person.last_name }}</span>
           </div>
         </div>
-      {% elif person.avatr and can_view_avatar %}
+      {% elif person.avatar and can_view_avatar %}
         <div class="card">
           <div class="card-image">
             <img src="{{ person.avatar.url }}"
@@ -214,6 +214,11 @@
             <span class="card-title">{{ person.first_name }} {{ person.last_name }} ({% trans "Avatar" %})</span>
           </div>
         </div>
+      {% else %}
+        <div class="card-panel">
+          <i class="material-icons iconify left" data-icon="mdi:image-off-outline"></i>
+          {% trans "This person didn't upload a personal photo." %}
+        </div>
       {% endif %}
     </div>
 
diff --git a/aleksis/core/templates/core/person/list.html b/aleksis/core/templates/core/person/list.html
index ca441cac485847cf6a4975071d73787473804694..acafd75bad5762e3367f4f00b50010987c4f3fae 100644
--- a/aleksis/core/templates/core/person/list.html
+++ b/aleksis/core/templates/core/person/list.html
@@ -13,7 +13,7 @@
 
   {% if can_create_person %}
     <a class="btn green waves-effect waves-light" href="{% url 'create_person' %}">
-      <i class="material-icons left">add</i>
+      <i class="material-icons iconify left" data-icon="mdi:add"></i>
       {% trans "Create person" %}
     </a>
   {% endif %}
@@ -22,9 +22,9 @@
   <form method="get">
     {% form form=persons_filter.form %}{% endform %}
     {% trans "Search" as caption %}
-    {% include "core/partials/save_button.html" with caption=caption icon="search" %}
+    {% include "core/partials/save_button.html" with caption=caption icon="mdi:search" %}
     <button type="reset" class="btn red waves-effect waves-light">
-      <i class="material-icons left">clear</i>
+      <i class="material-icons iconify left" data-icon="mdi:close"></i>
       {% trans "Clear" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/core/school_term/list.html b/aleksis/core/templates/core/school_term/list.html
index 14aa2f0a697a3efd54b27154b431ef3f424923de..9df6af9727b868e13d43a75c42730b375ff6aa47 100644
--- a/aleksis/core/templates/core/school_term/list.html
+++ b/aleksis/core/templates/core/school_term/list.html
@@ -10,7 +10,7 @@
 
 {% block content %}
   <a class="btn green waves-effect waves-light" href="{% url 'create_school_term' %}">
-    <i class="material-icons left">add</i>
+    <i class="material-icons left iconify" data-icon="mdi:add"></i>
     {% trans "Create school term" %}
   </a>
 
diff --git a/aleksis/core/templates/django_tables2/materialize.html b/aleksis/core/templates/django_tables2/materialize.html
index 8901c2d5d9dfddf14934195dee11641bca9bcb8d..b472a5b0c9d5e185482959c7536c5c6dd513f211 100644
--- a/aleksis/core/templates/django_tables2/materialize.html
+++ b/aleksis/core/templates/django_tables2/materialize.html
@@ -66,7 +66,7 @@
               <li class="waves-effect">
                 <a href="{% querystring table.prefixed_page_field=table.page.previous_page_number %}"
                    class="page-link">
-                  <i class="material-icons">chevron_left</i>
+                  <i class="material-icons iconify" data-icon="mdi:chevron-left"></i>
                 </a>
               </li>
             {% endblock pagination.previous %}
@@ -86,7 +86,7 @@
             {% block pagination.next %}
               <li class="waves-effect">
                 <a href="{% querystring table.prefixed_page_field=table.page.next_page_number %}" class="page-link">
-                  <i class="material-icons">chevron_right</i>
+                  <i class="material-icons iconify" data-icon="mdi:chevron-right"></i>
                 </a>
               </li>
             {% endblock pagination.next %}
diff --git a/aleksis/core/templates/material/fields/colorfield_colorwidget.html b/aleksis/core/templates/material/fields/colorfield_colorwidget.html
index ab8bc7f955126d365be64085b7be740ef70a398f..5fff8c00ac913134abcb8e869464aeb7fe1e6330 100644
--- a/aleksis/core/templates/material/fields/colorfield_colorwidget.html
+++ b/aleksis/core/templates/material/fields/colorfield_colorwidget.html
@@ -2,7 +2,7 @@
 {% part bound_field.field %}
   <div class="row">
     <div class="input-field col s12{% if widget.attrs.required %} required{% endif %}">
-    <i class="material-icons prefix" id="{{ bound_field.html_name }}_preview" style="color: {% firstof bound_field.value field.widget.attrs.default '' %};">color_lens</i>
+    <i class="material-icons iconify prefix" id="{{ bound_field.html_name }}_preview" style="color: {% firstof bound_field.value field.widget.attrs.default '' %};" data-icon="mdi:palette-outline"></i>
       {% part field prefix %}{% endpart %}{% part field control %}
         <input
           type="text"
diff --git a/aleksis/core/templates/material/non_field_errors.html b/aleksis/core/templates/material/non_field_errors.html
index c8a92eb7ef813325580738a7819fccf6da2dfa70..b64aa87982a9285f6ee023cff210bbff1ae6b67a 100644
--- a/aleksis/core/templates/material/non_field_errors.html
+++ b/aleksis/core/templates/material/non_field_errors.html
@@ -1,7 +1,7 @@
 {% if form.non_field_errors %}
   <div class="alert error">
     {% for error in form.non_field_errors %}
-      <div><i class="material-icons left">error</i> {{ error }}</div>
+      <div><i class="material-icons iconify left" data-icon="mdi:alert-octagon-outline"></i> {{ error }}</div>
     {% endfor %}
   </div>
 {% endif %}
diff --git a/aleksis/core/templates/oauth2_provider/application/create.html b/aleksis/core/templates/oauth2_provider/application/create.html
index 73b94677206d38fca163858551536d575b2dce3d..683c81fa25966dea43c5737537ff090b4b042f01 100644
--- a/aleksis/core/templates/oauth2_provider/application/create.html
+++ b/aleksis/core/templates/oauth2_provider/application/create.html
@@ -11,7 +11,7 @@
     {% form form=form %}{% endform %}
     {% include "core/partials/save_button.html" %}
     <a class="btn waves-effect red waves-light" href="{% url "oauth2_applications" %}">
-      <i class="material-icons left">clear</i> {% trans "Cancel" %}
+      <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %}
     </a>
   </form>
 {% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application/detail.html b/aleksis/core/templates/oauth2_provider/application/detail.html
index 28e2af7d70ff4b6dd5d93b46b8ec52d31bc36538..1a7709f14dacdef5ab414d516ec35d72cbc1e5f8 100644
--- a/aleksis/core/templates/oauth2_provider/application/detail.html
+++ b/aleksis/core/templates/oauth2_provider/application/detail.html
@@ -6,18 +6,18 @@
 {% block page_title %}
   <a href="{% url "oauth2_applications" %}"
      class="btn-flat primary-color-text waves-light waves-effect">
-    <i class="material-icons left">chevron_left</i> {% trans "Back" %}
+    <i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Back" %}
   </a>
   {{ application.name }}
 {% endblock %}
 
 {% block content %}
   <a class="btn orange waves-effect waves-light btn-margin" href="{% url "edit_oauth2_application" application.id %}">
-    <i class="material-icons left">edit</i>
+    <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i>
     {% trans "Edit" %}
   </a>
   <a class="btn red waves-effect waves-light btn-margin" href="{% url "delete_oauth2_application" application.id %}">
-    <i class="material-icons left">delete</i>
+    <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
     {% trans "Delete" %}
   </a>
   <table class="responsive-table">
@@ -79,7 +79,7 @@
         {% trans "Skip Authorisation" %}
       </th>
       <td>
-        <i class="material-icons">{{ application.skip_authorization|yesno:"check,close" }}</i>
+        <i class="material-icons iconify" data-icon="mdi:{{ application.skip_authorization|yesno:"check,close" }}"></i>
       </td>
     </tr>
     </tbody>
diff --git a/aleksis/core/templates/oauth2_provider/application/edit.html b/aleksis/core/templates/oauth2_provider/application/edit.html
index 30f50fff94e330e941d7b4730fe7d875b039d74e..e4d837a32d713ef07b05656425e97979efef92cd 100644
--- a/aleksis/core/templates/oauth2_provider/application/edit.html
+++ b/aleksis/core/templates/oauth2_provider/application/edit.html
@@ -11,7 +11,7 @@
     {% form form=form %}{% endform %}
     {% include "core/partials/save_button.html" %}
     <a class="btn waves-effect red waves-light" href="{% url "oauth2_application" application.id %}">
-      <i class="material-icons left">clear</i> {% trans "Cancel" %}
+      <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %}
     </a>
   </form>
 {% endblock %}
diff --git a/aleksis/core/templates/oauth2_provider/application/list.html b/aleksis/core/templates/oauth2_provider/application/list.html
index ced7d718dfe1b561c2ea8253e25658a9f449024d..1525dc99c28326701d5b91a59c1992a23abff439 100644
--- a/aleksis/core/templates/oauth2_provider/application/list.html
+++ b/aleksis/core/templates/oauth2_provider/application/list.html
@@ -7,7 +7,7 @@
 
 {% block content %}
   <a href="{% url "register_oauth_application" %}" class="btn green waves-effect waves-light">
-    <i class="material-icons left">add</i>
+    <i class="material-icons iconify left" data-icon="mdi:add"></i>
     {% blocktrans %}Register new application{% endblocktrans %}
   </a>
   <div class="collection">
diff --git a/aleksis/core/templates/oauth2_provider/authorize.html b/aleksis/core/templates/oauth2_provider/authorize.html
index c90d5e8dd9d3d72cff9e19ce167487900e904636..09293713fc126ec63fadec4e470206f78177a475 100644
--- a/aleksis/core/templates/oauth2_provider/authorize.html
+++ b/aleksis/core/templates/oauth2_provider/authorize.html
@@ -25,7 +25,7 @@
           <p class="margin-bottom">{% trans "The application requests access to the following scopes:" %}</p>
           {% for scope in scopes_descriptions %}
             <p class="margin-bottom">
-              <i class="material-icons left">check</i>
+              <i class="material-icons iconify left" data-icon="mdi:check"></i>
               {{ scope }}
             </p>
           {% endfor %}
@@ -37,10 +37,10 @@
               {% part form.allow %}<input type="hidden" value="true" name="allow">{% endpart %}
             {% endform %}
             <button type="submit" class="btn green waves-effect waves-light btn-margin">
-              <i class="material-icons left">done_all</i> {% trans "Allow" %}
+              <i class="material-icons iconify left" data-icon="mdi:check-all"></i> {% trans "Allow" %}
             </button>
             <a class="btn red waves-effect waves-light btn-margin" href="{% block app-form-back-url %}{% url "oauth2_application" application.id %}{% endblock app-form-back-url %}">
-              <i class="material-icons left">cancel</i> {% trans "Disallow" %}
+              <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Disallow" %}
             </a>
           </form>
         </div>
@@ -50,7 +50,7 @@
     <div class="container">
       <div class="card red">
         <div class="card-content white-text">
-          <div class="material-icons small left">error_outline</div>
+          <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
           <span class="card-title">{% trans "Error" %}: {{ error.error }}</span>
           <p>
             {{ error.description }}
diff --git a/aleksis/core/templates/oauth2_provider/authorized-oob.html b/aleksis/core/templates/oauth2_provider/authorized-oob.html
index 3e95b0bf3a25691e0fc84e36dbcf71559cf86dc1..892ae5c9f863dcc32259210e652d18cfa3a27598 100644
--- a/aleksis/core/templates/oauth2_provider/authorized-oob.html
+++ b/aleksis/core/templates/oauth2_provider/authorized-oob.html
@@ -8,7 +8,7 @@
     <div class="container">
       <div class="card green">
         <div class="card-content white-text">
-          <div class="material-icons small left">check</div>
+          <div class="material-icons iconify small left" data-icon="mdi:check"></div>
           <span class="card-title">{% blocktrans %}Success!{% endblocktrans %}</span>
           <p>
             {% trans "Please return to your application and enter this code:" %} {{ code }}
@@ -20,7 +20,7 @@
     <div class="container">
       <div class="card red">
         <div class="card-content white-text">
-          <div class="material-icons small left">error_outline</div>
+          <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
           <span class="card-title">{% trans "Error" %}: {{ error.error }}</span>
           <p>
             {{ error.description }}
diff --git a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html
index 7f6f25920bebcbbaad7bb93fd486db617f25d662..ece2011b6e6170bd8ed845f8464302bb1e6fb8fb 100644
--- a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html
+++ b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html
@@ -8,7 +8,7 @@
 {% block content %}
   <div class="alert info">
     <p>
-      <i class="material-icons left">warning</i>
+      <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
       {% trans "Are you sure to revoke the access for this application?" %}
     </p>
   </div>
@@ -16,11 +16,11 @@
   <form method="post">
     {% csrf_token %}
     <a class="btn waves-effect waves-light red" href="{% url "oauth2_applications" %}">
-      <i class="material-icons left">delete</i>
+      <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i>
       {% trans "Revoke" %}
     </a>
     <a class="btn waves-effect waves-light" href="{% url "oauth2_applications" %}">
-      <i class="material-icons left">cancel</i>
+      <i class="material-icons iconify left" data-icon="mdi:close"></i>
       {% trans "Cancel" %}
     </a>
   </form>
diff --git a/aleksis/core/templates/oauth2_provider/authorized-tokens.html b/aleksis/core/templates/oauth2_provider/authorized-tokens.html
index 46b0ce570a5ec1077825b283a244b6652045c437..dfe058056fb4ffaabd2a44eaac04adaa8aa3ad3b 100644
--- a/aleksis/core/templates/oauth2_provider/authorized-tokens.html
+++ b/aleksis/core/templates/oauth2_provider/authorized-tokens.html
@@ -29,7 +29,7 @@
   {% else %}
     <div class="alert info">
       <p>
-        <i class="material-icons left">info</i>
+        <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
         {% trans "No authorized applications." %}
       </p>
     </div>
diff --git a/aleksis/core/templates/offline.html b/aleksis/core/templates/offline.html
index bd741268a8902ac6708f33e353337695c03158a3..a386d40c1f9eb3d900676427f05904957f03211b 100644
--- a/aleksis/core/templates/offline.html
+++ b/aleksis/core/templates/offline.html
@@ -5,8 +5,10 @@
 {% block browser_title %}{% blocktrans %}Network error{% endblocktrans %}{% endblock %}
 
 {% block content %}
-  <h3><i class="material-icons left medium" style="font-size: 2.92rem;">signal_wifi_off</i>{% blocktrans %}No internet
-    connection.{% endblocktrans %}</h3>
+  <h3>
+    <i class="material-icons iconify left medium" style="font-size: 2.92rem;" data-icon="mdi:wifi-strength-alert-outline"></i>
+    {% blocktrans %}No internet connection.{% endblocktrans %}
+  </h3>
 
   <p class="flow-text">
     {% blocktrans %}
diff --git a/aleksis/core/templates/search/search.html b/aleksis/core/templates/search/search.html
index 5af1e55cc1076e404a921596da1cbc0774f7dbc3..ca32339d6d88010d2f4dab4d9e7557cd191705fe 100644
--- a/aleksis/core/templates/search/search.html
+++ b/aleksis/core/templates/search/search.html
@@ -18,7 +18,7 @@
 
     <p>
       <button type="submit" class="btn waves-effect waves-light green">
-        <i class="material-icons left">search</i>
+        <i class="material-icons iconify left" data-icon="mdi:search"></i>
         {% blocktrans %}Search{% endblocktrans %}
       </button>
     </p>
@@ -29,7 +29,7 @@
       <div class="collection">
         {% for result in page_obj.object_list %}
           <a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item">
-            <i class="material-icons left">{{ result.object.icon_ }}</i>
+            <i class="material-icons iconify left" data-icon="mdi:{{ result.object.icon_ }}"></i>
             {{ result.object }}
           </a>
         {% empty %}
@@ -46,12 +46,12 @@
           {% if page_obj.has_previous %}
             <li class="waves-effect">
               <a href="?q={{ query }}&amp;page={{ page_obj.previous_page_number }}">
-                <i class="material-icons">chevron_left</i>
+                <i class="material-icons iconify" data-icon="mdi:chevron-left"></i>
               </a>
             </li>
           {% else %}
             <li class="disabled">
-              <a href="#"><i class="material-icons">chevron_left</i></a>
+              <a href="#"><i class="material-icons iconify" data-icon="mdi:chevron-left"></i></a>
             </li>
           {% endif %}
 
@@ -70,12 +70,12 @@
           {% if page_obj.has_next %}
             <li class="waves-effect">
               <a href="?q={{ query }}&amp;page={{ page_obj.next_page_number }}">
-                <i class="material-icons">chevron_right</i>
+                <i class="material-icons iconify" data-icon="mdi:chevron-right"></i>
               </a>
             </li>
           {% else %}
             <li class="disabled">
-              <a href="#"><i class="material-icons">chevron_right</i></a>
+              <a href="#"><i class="material-icons iconify" data-icon="mdi:chevron-right"></i></a>
             </li>
           {% endif %}
         </ul>
diff --git a/aleksis/core/templates/search/searchbar_snippet.html b/aleksis/core/templates/search/searchbar_snippet.html
index b5b7188c6a1e0381fd30f41b6fccc7e587949a30..d2a401c4f874d6a2c2a71c5b122eb3879cd83d57 100644
--- a/aleksis/core/templates/search/searchbar_snippet.html
+++ b/aleksis/core/templates/search/searchbar_snippet.html
@@ -1,4 +1,4 @@
 <a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item search-item">
   {{ result.object }}
-  <i class="material-icons secondary-content search-result-icon">{{ result.object.icon_ }}</i>
+  <i class="material-icons secondary-content search-result-icon" data-icon="mdi:{{ result.object.icon_ }}"></i>
 </a>
diff --git a/aleksis/core/templates/socialaccount/authentication_error.html b/aleksis/core/templates/socialaccount/authentication_error.html
index 00901daf7fc3542ba07490381f7903e8f6d14048..43288dbc00e6ce84139254bf1b15d0781074d9eb 100644
--- a/aleksis/core/templates/socialaccount/authentication_error.html
+++ b/aleksis/core/templates/socialaccount/authentication_error.html
@@ -9,7 +9,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <div class="material-icons small left">error_outline</div>
+        <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
         <span class="card-title">{% blocktrans %}Third-party Account Login Failure.{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/socialaccount/login.html b/aleksis/core/templates/socialaccount/login.html
index 1630b01fa4104f563a92663bc7fd386a2abd5266..6f9747e82978371eda6bbda59d1e195d399fc782 100644
--- a/aleksis/core/templates/socialaccount/login.html
+++ b/aleksis/core/templates/socialaccount/login.html
@@ -8,7 +8,7 @@
 {% block content %}
 {% if process == "connect" %}
     <p class="flow-text">
-       <i class="material-icons left">info</i>
+       <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
        {% blocktrans with provider.name as provider %}You are about to connect a new third party account from {{ provider }}.{% endblocktrans %}
     </p>
     <form method="post">
@@ -19,7 +19,7 @@
     </form>
 {% else %}
     <p class="flow-text">
-       <i class="material-icons left small">info</i>
+       <i class="material-icons iconify left small" data-icon="mdi:information-outline"></i>
        {% blocktrans with provider.name as provider %}You are about to sign in using a third party account from {{ provider }}.{% endblocktrans %}
     </p>
     <form method="post">
diff --git a/aleksis/core/templates/socialaccount/login_cancelled.html b/aleksis/core/templates/socialaccount/login_cancelled.html
index bc1ebb6cb31a6b15a9d448cb93fa40a7cccb7d26..cb56d41b013e43c56853a3816ad63d8047e08a29 100644
--- a/aleksis/core/templates/socialaccount/login_cancelled.html
+++ b/aleksis/core/templates/socialaccount/login_cancelled.html
@@ -9,7 +9,7 @@
   <div class="container">
     <div class="card red">
       <div class="card-content white-text">
-        <div class="material-icons small left">error_outline</div>
+        <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div>
         <span class="card-title">{% blocktrans %}Login cancelled{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
diff --git a/aleksis/core/templates/socialaccount/signup.html b/aleksis/core/templates/socialaccount/signup.html
index df79ecce459fa0ea7bcd8fe83ea21f530944c49b..7b11a3c40537933c4c4425a51b8c8913d3d0f8aa 100644
--- a/aleksis/core/templates/socialaccount/signup.html
+++ b/aleksis/core/templates/socialaccount/signup.html
@@ -8,7 +8,7 @@
 {% block content %}
   <div class="alert success">
     <p>
-      <i class="material-icons left">check_circle_outline</i>
+      <i class="material-icons iconify left" data-icon="mdi:check-circle-outline"></i>
         {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to
         {{site_name}}. As a final step, please complete the following form:{% endblocktrans %}
     </p>
diff --git a/aleksis/core/templates/socialaccount/snippets/provider_list.html b/aleksis/core/templates/socialaccount/snippets/provider_list.html
index 706e81b877936c946c9498201d8af46e95ffdb2e..ea75c04fbd6d323308144e11a511a9e2fa7d4770 100644
--- a/aleksis/core/templates/socialaccount/snippets/provider_list.html
+++ b/aleksis/core/templates/socialaccount/snippets/provider_list.html
@@ -5,7 +5,7 @@
     {% for provider in socialaccount_providers %}
       {% if provider.id == "openid" %}
         {% for brand in provider.get_brands %}
-            <a title="{{brand.name}}" 
+            <a title="{{brand.name}}"
               class="socialaccount_provider {{provider.id}} {{brand.id}}
               btn-large waves-effect waves-light primary-color margin-bottom"
               href="{% provider_login_url provider.id openid=brand.openid_url process=process %}">
@@ -26,7 +26,7 @@
   {% else %}
     <div class="alert primary">
       <div>
-        <i class="material-icons left">info</i>
+        <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
         {% blocktrans %}
           No third-party account providers available.
         {% endblocktrans %}
diff --git a/aleksis/core/templates/two_factor/_wizard_actions.html b/aleksis/core/templates/two_factor/_wizard_actions.html
index 95be950552fe6abf47e481bd507e6c28899986b0..dc4a046d6ce3ac4aa1a390b444f0080267a865d4 100644
--- a/aleksis/core/templates/two_factor/_wizard_actions.html
+++ b/aleksis/core/templates/two_factor/_wizard_actions.html
@@ -2,7 +2,7 @@
 
 {% if cancel_url %}
   <a href="{{ cancel_url }}" class="btn red waves-effect waves-light">
-    <i class="material-icons left">cancel</i>
+    <i class="material-icons iconify left" data-icon="mdi:close"></i>
     {% trans "Cancel" %}
   </a>
 {% endif %}
@@ -11,17 +11,17 @@
   <button name="wizard_goto_step" type="submit"
           value="{{ wizard.steps.prev }}"
           class="btn grey waves-effect waves-light">
-    <i class="material-icons left">arrow_back</i>
+    <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
     {% trans "Back" %}
   </button>
 {% else %}
   <button disabled name="" type="button" class="btn grey disabled">
-    <i class="material-icons left">arrow_back</i>
+    <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
     {% trans "Back" %}
   </button>
 {% endif %}
 
 <button type="submit" class="btn green waves-effect waves-light">
-  <i class="material-icons right">arrow_forward</i>
+  <i class="material-icons iconify right" data-icon="mdi:arrow-right"></i>
   {% trans "Next" %}
 </button>
diff --git a/aleksis/core/templates/two_factor/core/backup_tokens.html b/aleksis/core/templates/two_factor/core/backup_tokens.html
index b85450747fbe00623900af8d2832c0060446a042..94631e14d0bd993341bd51b3fdb493254fbb23e3 100644
--- a/aleksis/core/templates/two_factor/core/backup_tokens.html
+++ b/aleksis/core/templates/two_factor/core/backup_tokens.html
@@ -10,7 +10,7 @@
 
   <div class="alert info">
     <p>
-      <i class="material-icons left">info</i>
+      <i class="material-icons iconify left" data-icon="mdi:information-outline"></i>
       {% blocktrans %}
         Backup tokens can be used when your primary and backup
         phone numbers aren't available. The backup tokens below can be used
@@ -29,7 +29,7 @@
     </ul>
     <div class="alert warning">
       <p>
-        <i class="material-icons left">warning</i>
+        <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
         {% blocktrans %}
           Print these tokens and keep them somewhere safe.
         {% endblocktrans %}
@@ -41,11 +41,11 @@
 
   <form method="post">{% csrf_token %}{{ form }}
     <a href="{% url 'two_factor:profile' %}" class="btn primary waves-effect waves-light">
-      <i class="material-icons left">arrow_back</i>
+      <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
       {% trans "Back to Account Security" %}
     </a>
     <button class="btn green waves-effect waves-light" type="submit">
-      <i class="material-icons left">vpn_key</i>
+      <i class="material-icons iconify left" data-icon="mdi:key-outline"></i>
       {% trans "Generate Tokens" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/two_factor/core/setup_complete.html b/aleksis/core/templates/two_factor/core/setup_complete.html
index df3f5e93acb1ded3138b9aea2375ce7d529c9033..afd9f1722b168bfe30807f5e8a4d4cb49c4bc900 100644
--- a/aleksis/core/templates/two_factor/core/setup_complete.html
+++ b/aleksis/core/templates/two_factor/core/setup_complete.html
@@ -10,7 +10,7 @@
 
   <div class="alert success">
     <p>
-      <i class="material-icons left">check_circle</i>
+      <i class="material-icons iconify left" data-icon="mdi:check-circle-outline"></i>
       {% blocktrans %}
         Congratulations, you've successfully enabled two-factor authentication.
       {% endblocktrans %}
@@ -20,17 +20,17 @@
   {% if not phone_methods %}
     <a href="{% url 'two_factor:profile' %}"
        class="btn btn-primary waves-effect waves-light">
-      <i class="material-icons left">arrow_back</i>
+      <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
       {% trans "Back to Profile" %}
     </a>
     <a href="{% url 'two_factor:backup_tokens' %}" class="btn green waves-effect waves-light">
-      <i class="material-icons left">vpn_key</i>
+      <i class="material-icons iconify left" data-icon="mdi:key-outline"></i>
       {% trans "Generate backup codes" %}
     </a>
   {% else %}
     <div class="warning">
       <p>
-        <i class="material-icons left">warning</i>
+        <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
         {% blocktrans %}
           However, it might happen that you don't have access to
           your primary token device. To enable account recovery, generate backup codes
@@ -40,15 +40,15 @@
     </div>
     <a href="{% url 'two_factor:profile' %}"
        class="btn btn-primary waves-effect waves-light">
-      <i class="material-icons left">arrow_back</i>
+      <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
       {% trans "Back to Profile" %}
     </a>
     <a href="{% url 'two_factor:backup_tokens' %}" class="btn green waves-effect waves-light">
-      <i class="material-icons left">vpn_key</i>
+      <i class="material-icons iconify left" data-icon="mdi:key-outline"></i>
       {% trans "Generate backup codes" %}
     </a>
     <a href="{% url 'two_factor:phone_create' %}" class="btn green waves-effect waves-light">
-      <i class="material-icons left">add</i>
+      <i class="material-icons iconify left" data-icon="mdi:phone-plus"></i>
       {% trans "Add Phone Number" %}
     </a>
   {% endif %}
diff --git a/aleksis/core/templates/two_factor/profile/disable.html b/aleksis/core/templates/two_factor/profile/disable.html
index 56bf20164b16b75a2b1d7e0759c9d43ba8d5b242..4fe45187e3bbb9ae4ffadb5807f0d26a8bafff9a 100644
--- a/aleksis/core/templates/two_factor/profile/disable.html
+++ b/aleksis/core/templates/two_factor/profile/disable.html
@@ -22,7 +22,7 @@
     </p>
 
     <button class="btn red waves-effect waves-light" type="submit">
-      <i class="material-icons left">power_settings_new</i>
+      <i class="material-icons iconify left" data-icon="mdi:power"></i>
       {% trans "Disable" %}
     </button>
   </form>
diff --git a/aleksis/core/templates/two_factor/profile/profile.html b/aleksis/core/templates/two_factor/profile/profile.html
index eaaa0ff6a5a1bde9463682100dfb9cc6f6b0f3dc..dd9472e7fb9a09051b35d7be57f59dcab1549dae 100644
--- a/aleksis/core/templates/two_factor/profile/profile.html
+++ b/aleksis/core/templates/two_factor/profile/profile.html
@@ -37,7 +37,7 @@
       </ul>
       <p>
         <a href="{% url 'two_factor:phone_create' %}" class="btn green waves-effect waves-light">
-          <i class="material-icons left">add</i>
+          <i class="material-icons iconify left" data-icon="mdi:phone-plus"></i>
           {% trans "Add Phone Number" %}
         </a>
       </p>
@@ -55,7 +55,7 @@
     </p>
     <p>
       <a href="{% url 'two_factor:backup_tokens' %}" class="btn primary waves-effect waves-light">
-        <i class="material-icons left">vpn_key</i>
+        <i class="material-icons iconify left" data-icon="mdi:key-outline"></i>
         {% trans "Show Codes" %}
       </a>
     </p>
@@ -69,7 +69,7 @@
     </p>
     <p>
       <a class="btn red waves-effect waves-light" href="{% url 'two_factor:disable' %}">
-        <i class="material-icons left">power_settings_new</i>
+        <i class="material-icons iconify left" data-icon="mdi:power"></i>
         {% trans "Disable Two-Factor Authentication" %}
       </a>
     </p>
@@ -84,6 +84,7 @@
 
     <p>
       <a href="{% url 'two_factor:setup' %}" class="green btn waves-effect waves-light ">
+        <i class="material-icons iconify left" data-icon="mdi:key-outline"></i>
         {% trans "Enable Two-Factor Authentication" %}
       </a>
     </p>
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index 0795dfa93f3aaf106abe7db43a3af2371b566b10..f39808e0ef0ed22e9c3b94e91fc5c1161beccdb9 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -320,6 +320,7 @@ urlpatterns = [
         name="assign_permission",
     ),
     path("pdfs/<int:pk>/", views.RedirectToPDFFile.as_view(), name="redirect_to_pdf_file"),
+    path("__icons__/", include("dj_iconify.urls")),
 ]
 
 # Use custom server error handler to get a request object in the template
diff --git a/docs/conf.py b/docs/conf.py
index 2acaa4acf472ffb6ea2a1124d9371644186cc5c6..7ce65bcd98683c01f7ae33999ee15fc67d3cbd5e 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team"
 author = "The AlekSIS Team"
 
 # The short X.Y version
-version = "2.7"
+version = "2.8"
 # The full version, including alpha/beta/rc tags
-release = "2.7.5.dev0"
+release = "2.8.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/docs/dev/04_materialize_templates.rst b/docs/dev/04_materialize_templates.rst
index b997c32f293e6268a2deae5b69001abaf9a84e10..b49677252af51905bf46084f42eb6a5811f173d7 100644
--- a/docs/dev/04_materialize_templates.rst
+++ b/docs/dev/04_materialize_templates.rst
@@ -56,13 +56,13 @@ Furthermore, you can use tabs with integrated icons that are higher, but more co
         <ul class="tabs tabs-transparent tabs-icons tabs-fixed-width">
             <li class="tab">
                 <a href="#test1">
-                    <i class="material-icons">speaker_notes</i>
+	            <i class="material-icons iconify" data-icon="mdi:speaker_notes"></i>
                     Test 1
                 </a>
             </li>
             <li class="tab">
                 <a href="#test2">
-                    <i class="material-icons">people</i>
+                    <i class="material-icons iconify" data-icon="mdi:people"></i>
                     Test 2
                 </a>
             </li>
diff --git a/pyproject.toml b/pyproject.toml
index b67b071d64728be1cf835a1c1e7c0067c81c51f8..f0b31a7093dada82e5dfde5b9025ac09c2dcdb6a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-Core"
-version = "2.7.5.dev0"
+version = "2.8.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -126,6 +126,7 @@ python-gnupg = "^0.4.7"
 sentry-sdk = {version = "^1.4.3", optional = true}
 django-cte = "^1.1.5"
 pycountry = "^22.0.0"
+django-iconify = "^0.1.0"
 customidenticon = "^0.1.5"
 
 [tool.poetry.extras]