diff --git a/aleksis/core/util/forms.py b/aleksis/core/util/forms.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d7279892f89f47bccebef95786df79ce1f737f1
--- /dev/null
+++ b/aleksis/core/util/forms.py
@@ -0,0 +1,34 @@
+from collections import OrderedDict
+
+from material import Layout, Row
+
+
+class PreferenceLayout(Layout):
+    """django-material Layout object for managing preferences."""
+
+    def __init__(self, form_base_class, section=None):
+        """
+        Create Layout object for the given form_base_class.
+
+        :param form_base_class: A Form class used as the base. Must have a ``registry` attribute
+        :param section: A section where the layout builder will load preferences
+        """
+        registry = form_base_class.registry
+        if section:
+            # Try to use section param
+            preferences_obj = registry.preferences(section=section)
+        else:
+            # display all preferences in the form
+            preferences_obj = registry.preferences()
+
+        rows = OrderedDict()
+
+        for preference in preferences_obj:
+            row_name = preference.get("row", preference.identifier())
+            rows.setdefault(row_name, [])
+            rows[row_name].append(preference.identifier())
+
+        rows_material = []
+        for fields in rows.values():
+            rows_material.append(Row(*fields))
+        super().__init__(*rows_material)
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index ff23d83fde098d32f2edf77ba6e032d6279fb38d..fb7f4513edde500751dbe923bcecd4c0782d2956 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -75,6 +75,7 @@ from .tables import (
 from .util import messages
 from .util.apps import AppConfig
 from .util.core_helpers import objectgetter_optional
+from .util.forms import PreferenceLayout
 
 
 @permission_required("core.view_dashboard")
@@ -545,6 +546,9 @@ def preferences(
     # Build final form from dynamic-preferences
     form_class = preference_form_builder(form_class, instance=instance, section=section)
 
+    # Get layout
+    form_class.layout = PreferenceLayout(form_class, section=section)
+
     if request.method == "POST":
         form = form_class(request.POST, request.FILES or None)
         if form.is_valid():