diff --git a/aleksis/apps/untis/forms.py b/aleksis/apps/untis/forms.py
index fee160cf7165d1d8102c77cf11af3090757d37e5..81fc0a57ac0329a84b5bd8967fe5864b0ac16637 100644
--- a/aleksis/apps/untis/forms.py
+++ b/aleksis/apps/untis/forms.py
@@ -5,11 +5,36 @@ from constance import config
 from material import Fieldset
 
 from aleksis.core.forms import EditGroupForm
+from aleksis.core.models import Group
 
 
 class UntisUploadForm(forms.Form):
     untis_xml = forms.FileField(label=_("Untis XML export"))
 
 
+class GroupSubjectForm(forms.ModelForm):
+    child_groups = forms.ModelMultipleChoiceField(queryset=Group.objects.all())
+
+    class Meta:
+        model = Group
+        fields = [
+            "name",
+            "short_name",
+            "untis_subject",
+        ]
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.fields["name"].widget = forms.HiddenInput()
+        self.fields["short_name"].widget = forms.HiddenInput()
+
+
+GroupSubjectFormset = forms.modelformset_factory(
+    Group, form=GroupSubjectForm, max_num=0, extra=0
+)
+
+
+
+
 if config.UNTIS_IMPORT_MYSQL_USE_COURSE_GROUPS:
     EditGroupForm.add_node_to_layout(Fieldset(_("UNTIS import"), "untis_subject"))
diff --git a/aleksis/apps/untis/menus.py b/aleksis/apps/untis/menus.py
index 7e4cbd69476ea51e978df1f488957871b383dd95..e4a817190119561c9c47508261ac2acf53f53ccd 100644
--- a/aleksis/apps/untis/menus.py
+++ b/aleksis/apps/untis/menus.py
@@ -10,6 +10,15 @@ MENUS = {
                 "menu_generator.validators.is_superuser",
                 "aleksis.core.util.core_helpers.has_person",
             ],
-        }
+        },
+        {
+            "name": _("Link subjects to groups (for UNTIS MySQL import)"),
+            "url": "untis_groups_subjects",
+            "validators": [
+                "menu_generator.validators.is_authenticated",
+                "menu_generator.validators.is_superuser",
+                "aleksis.core.util.core_helpers.has_person",
+            ],
+        },
     ]
 }
diff --git a/aleksis/apps/untis/templates/untis/groups_subjects.html b/aleksis/apps/untis/templates/untis/groups_subjects.html
new file mode 100644
index 0000000000000000000000000000000000000000..7f58b1ac4ae69050e8bf9c89283404aff0946293
--- /dev/null
+++ b/aleksis/apps/untis/templates/untis/groups_subjects.html
@@ -0,0 +1,69 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+
+{% load i18n %}
+
+{% block browser_title %}{% blocktrans %}Assign subjects to groups{% endblocktrans %}{% endblock %}
+{% block page_title %}
+  {% blocktrans %}Assign subjects to groups{% endblocktrans %}
+{% endblock %}
+
+
+{% block content %}
+  <div class="alert info">
+    <p>
+      <i class="material-icons left">info</i>
+      {% blocktrans %}
+        You can use this form to assign subjects to groups. Please enter the exact names of the subjects as they are
+        saved in UNTIS (case-insensitive). These values are only used to match course groups while importing from MySQL.
+      {% endblocktrans %}
+    </p>
+  </div>
+
+  <div class="alert warning">
+    <p>
+      <i class="material-icons left">warning</i>
+      {% blocktrans %}
+        If there are more than 100 groups, this table will have multiple pages. That means that you must save your
+        changes on every page. <strong>Please don't change the page before you saved your changes!</strong>
+      {% endblocktrans %}
+    </p>
+  </div>
+
+  <form method="post">
+    {% csrf_token %}
+    {{ formset.management_form }}
+
+    {% include "core/save_button.html" %}
+
+    {% include "components/pagination.html" %}
+
+    <table>
+      <tr>
+        <th>{% blocktrans %}Group{% endblocktrans %}</th>
+        <th>{% blocktrans %}Subject{% endblocktrans %}</th>
+      </tr>
+      {% for form in formset %}
+        {{ form.id }}
+        <tr>
+          <td>
+            {{ form.name }} {{ form.short_name }}
+            {{ form.name.value }} {% if form.short_name.value %}({{ form.short_name.value }}){% endif %}
+          </td>
+          <td>{{ form.untis_subject }}</td>
+        </tr>
+      {% endfor %}
+    </table>
+
+    {% include "components/pagination.html" %}
+
+    {% include "core/save_button.html" %}
+
+    <div class="fixed-action-btn">
+      <button class="btn-floating btn-large green" type="submit">
+        <i class="large material-icons">save</i>
+      </button>
+    </div>
+  </form>
+{% endblock %}
diff --git a/aleksis/apps/untis/urls.py b/aleksis/apps/untis/urls.py
index 1a5119ea3c6195ab915588b2e3fd684891294b0b..db389b6ac1056d854064d4d517c5668b8dd8417f 100644
--- a/aleksis/apps/untis/urls.py
+++ b/aleksis/apps/untis/urls.py
@@ -4,4 +4,5 @@ from . import views
 
 urlpatterns = [
     path("import/xml/", views.xml_import, name="untis_xml_import"),
+    path("groups_subjects", views.groups_subjects, name="untis_groups_subjects"),
 ]
diff --git a/aleksis/apps/untis/views.py b/aleksis/apps/untis/views.py
index 2221a3b02156b5bf6dddee0c58a246d82ea6aff5..d1d86e4e45bedeb7bda92bc078f3a5ed8bc7cc62 100644
--- a/aleksis/apps/untis/views.py
+++ b/aleksis/apps/untis/views.py
@@ -1,10 +1,14 @@
+from django.contrib import messages
 from django.contrib.auth.decorators import login_required
+from django.core.paginator import Paginator
 from django.http import HttpRequest, HttpResponse
 from django.shortcuts import render
+from django.utils.translation import gettext as _
 
 from aleksis.core.decorators import admin_required
+from aleksis.core.models import Group
 
-from .forms import UntisUploadForm
+from .forms import UntisUploadForm, GroupSubjectFormset
 from .util.xml.xml import untis_import_xml
 
 
@@ -24,3 +28,37 @@ def xml_import(request: HttpRequest) -> HttpResponse:
     context["upload_form"] = upload_form
 
     return render(request, "untis/xml_import.html", context)
+
+
+# FIXME: Rule must check if setting is enabled
+@admin_required
+def groups_subjects(request: HttpRequest) -> HttpResponse:
+    """ Assign subjects to groups (for matching by MySQL importer) """
+    context = {}
+
+    groups_qs = Group.objects.all()
+
+    # Paginate
+    paginator = Paginator(groups_qs, 100)
+    page_number = request.GET.get("page")
+    page = paginator.get_page(page_number)
+    groups_paged = groups_qs.filter(id__in=[g.id for g in page])
+
+    # Create filtered queryset
+    group_subject_formset = GroupSubjectFormset(
+        request.POST or None, queryset=groups_paged
+    )
+
+    # Check if form is submitted and valid, then save
+    if request.method == "POST":
+        if group_subject_formset.is_valid():
+            group_subject_formset.save()
+            messages.success(request, _("Your changes were successfully saved."))
+
+    context["formset"] = group_subject_formset
+    context["page"] = page
+    context["paginator"] = paginator
+
+    return render(request, "untis/groups_subjects.html", context)
+
+