diff --git a/aleksis/apps/chronos/menus.py b/aleksis/apps/chronos/menus.py
index ec6337f7404c12abe07c32f6772420fe320be14c..89fb6d8ddb6383e71c167191abb9a428fc62f25e 100644
--- a/aleksis/apps/chronos/menus.py
+++ b/aleksis/apps/chronos/menus.py
@@ -56,17 +56,6 @@ MENUS = {
                         ),
                     ],
                 },
-                {
-                    "name": _("Automatic plans"),
-                    "url": "automatic_plans",
-                    "icon": "update",
-                    "validators": [
-                        (
-                            "aleksis.core.util.predicates.permission_validator",
-                            "chronos.view_automaticplans",
-                        ),
-                    ],
-                },
             ],
         }
     ]
diff --git a/aleksis/apps/chronos/rules.py b/aleksis/apps/chronos/rules.py
index f07f014977c1f3f5dceddc2896161639de052e1f..5dcfd20aafc4048fbe23dbc5f78d004d4ac7533a 100644
--- a/aleksis/apps/chronos/rules.py
+++ b/aleksis/apps/chronos/rules.py
@@ -51,31 +51,3 @@ add_perm("chronos.view_substitutions_rule", view_substitutions_predicate)
 # View room (timetable)
 view_room_predicate = has_person & has_room_timetable_perm
 add_perm("chronos.view_room_rule", view_room_predicate)
-
-# View automatic plan list
-view_automatic_plans_predicate = has_person & has_global_perm("chronos.view_automaticplan")
-add_perm("chronos.view_automaticplans_rule", view_automatic_plans_predicate)
-
-# View automatic plan
-view_automatic_plan_predicate = has_person & (
-    has_global_perm("chronos.view_automaticplan") | has_object_perm("chronos.view_automaticplan")
-)
-add_perm("chronos.view_automaticplan_rule", view_automatic_plan_predicate)
-
-# Add automatic plan
-add_automatic_plan_predicate = view_automatic_plans_predicate & has_global_perm(
-    "chronos.add_automaticplan"
-)
-add_perm("chronos.add_automaticplan_rule", add_automatic_plan_predicate)
-
-# Edit automatic plan
-edit_automatic_plan_predicate = view_automatic_plans_predicate & has_global_perm(
-    "chronos.change_automaticplan"
-)
-add_perm("chronos.edit_automaticplan_rule", edit_automatic_plan_predicate)
-
-# Delete automatic plan
-delete_automatic_plan_predicate = view_automatic_plans_predicate & has_global_perm(
-    "chronos.delete_automaticplan"
-)
-add_perm("chronos.delete_automaticplan_rule", delete_automatic_plan_predicate)
diff --git a/aleksis/apps/chronos/tables.py b/aleksis/apps/chronos/tables.py
index 54acc9a16fe4610d8d9cc827b8ac87aed14ed736..6caff934e93157707f155dd23d5adfc9b5178610 100644
--- a/aleksis/apps/chronos/tables.py
+++ b/aleksis/apps/chronos/tables.py
@@ -42,27 +42,3 @@ class LessonsTable(tables.Table):
         attrs={"a": {"class": "btn-flat waves-effect waves-orange"}},
         verbose_name=_("Manage substitution"),
     )
-
-
-class AutomaticPlanTable(tables.Table):
-    """Table for automatic plans."""
-
-    class Meta:
-        attrs = {"class": "highlight"}
-
-    name = tables.LinkColumn("edit_automatic_plan", args=[A("id")])
-    filename = tables.LinkColumn("show_automatic_plan", args=[A("slug")])
-    last_update = tables.DateTimeColumn()
-    last_update_triggered_manually = tables.BooleanColumn()
-    edit = tables.LinkColumn(
-        "edit_automatic_plan",
-        args=[A("id")],
-        text=_("Edit"),
-        attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}},
-    )
-    delete = tables.LinkColumn(
-        "delete_automatic_plan",
-        args=[A("id")],
-        text=_("Delete"),
-        attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}},
-    )
diff --git a/aleksis/apps/chronos/urls.py b/aleksis/apps/chronos/urls.py
index 765db990959292a0fbfba4b1f9137d941a9c208c..fc6d9a868e871b303a6dd0e1b6a8cdfc50be63ed 100644
--- a/aleksis/apps/chronos/urls.py
+++ b/aleksis/apps/chronos/urls.py
@@ -54,25 +54,4 @@ urlpatterns = [
         {"is_print": True},
         name="substitutions_print_by_date",
     ),
-    path("automatic_plans/", views.AutomaticPlanListView.as_view(), name="automatic_plans"),
-    path(
-        "automatic_plans/create/",
-        views.AutomaticPlanCreateView.as_view(),
-        name="create_automatic_plan",
-    ),
-    path(
-        "automatic_plans/<int:pk>/edit/",
-        views.AutomaticPlanEditView.as_view(),
-        name="edit_automatic_plan",
-    ),
-    path(
-        "automatic_plans/<int:pk>/delete/",
-        views.AutomaticPlanDeleteView.as_view(),
-        name="delete_automatic_plan",
-    ),
-    path(
-        "automatic_plans/<str:slug>.pdf",
-        views.AutomaticPlanShowView.as_view(),
-        name="show_automatic_plan",
-    ),
 ]
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index 2829ddc43f860e012f469f2798f913f305a2fa1a..5c2dab29d2c30e538c8bfc110497a69b9f25a846 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -1,31 +1,26 @@
 from datetime import datetime, timedelta
-from typing import Any, Optional
+from typing import Optional
 
 from django.db.models import Q
-from django.http import FileResponse, HttpRequest, HttpResponse, HttpResponseNotFound
+from django.http import HttpRequest, HttpResponse, HttpResponseNotFound
 from django.shortcuts import get_object_or_404, redirect, render
-from django.urls import reverse, reverse_lazy
+from django.urls import reverse
 from django.utils import timezone
-from django.utils.decorators import method_decorator
 from django.utils.translation import ugettext as _
-from django.views import View
 from django.views.decorators.cache import never_cache
-from django.views.generic.detail import SingleObjectMixin
 
-from django_tables2 import RequestConfig, SingleTableView
-from reversion.views import RevisionMixin
-from rules.contrib.views import PermissionRequiredMixin, permission_required
+from django_tables2 import RequestConfig
+from rules.contrib.views import permission_required
 
-from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
 from aleksis.core.models import Announcement, Group
 from aleksis.core.util import messages
 from aleksis.core.util.core_helpers import get_site_preferences, has_person
 from aleksis.core.util.pdf import render_pdf
 
-from .forms import AutomaticPlanForm, LessonSubstitutionForm
+from .forms import LessonSubstitutionForm
 from .managers import TimetableType
-from .models import Absence, AutomaticPlan, Holiday, LessonPeriod, LessonSubstitution, TimePeriod
-from .tables import AutomaticPlanTable, LessonsTable
+from .models import Absence, Holiday, LessonPeriod, LessonSubstitution, TimePeriod
+from .tables import LessonsTable
 from .util.build import build_substitutions_list, build_timetable, build_weekdays
 from .util.chronos_helpers import (
     get_classes,
@@ -386,58 +381,3 @@ def substitutions(
         return render(request, "chronos/substitutions.html", context)
     else:
         return render_pdf(request, "chronos/substitutions_print.html", context)
-
-
-class AutomaticPlanListView(PermissionRequiredMixin, SingleTableView):
-    """Table of all automatic plans."""
-
-    model = AutomaticPlan
-    table_class = AutomaticPlanTable
-    permission_required = "chronos.view_automaticplans_rule"
-    template_name = "chronos/automatic_plan/list.html"
-
-
-@method_decorator(never_cache, name="dispatch")
-class AutomaticPlanCreateView(PermissionRequiredMixin, AdvancedCreateView):
-    """Create view for automatic plans."""
-
-    model = AutomaticPlan
-    form_class = AutomaticPlanForm
-    permission_required = "chronos.add_automaticplan_rule"
-    template_name = "chronos/automatic_plan/create.html"
-    success_url = reverse_lazy("automatic_plans")
-    success_message = _("The automatic plan has been created.")
-
-
-@method_decorator(never_cache, name="dispatch")
-class AutomaticPlanEditView(PermissionRequiredMixin, AdvancedEditView):
-    """Edit view for automatic plans."""
-
-    model = AutomaticPlan
-    form_class = AutomaticPlanForm
-    permission_required = "chronos.edit_automaticplan_rule"
-    template_name = "chronos/automatic_plan/edit.html"
-    success_url = reverse_lazy("automatic_plans")
-    success_message = _("The automatic plan has been saved.")
-
-
-@method_decorator(never_cache, name="dispatch")
-class AutomaticPlanDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView):
-    """Delete view for automatic plans."""
-
-    model = AutomaticPlan
-    permission_required = "chronos.delete_automaticplan_rule"
-    template_name = "core/pages/delete.html"
-    success_url = reverse_lazy("automatic_plans")
-    success_message = _("The automatic plan has been deleted.")
-
-
-class AutomaticPlanShowView(PermissionRequiredMixin, SingleObjectMixin, View):
-    """Show the current version of the automatic plan."""
-
-    model = AutomaticPlan
-    permission_required = "resint.view_automaticplan_rule"
-
-    def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> FileResponse:
-        automatic_plan = self.get_object()
-        return FileResponse(automatic_plan.get_current_file(), content_type="application/pdf")