diff --git a/app/admin/routes.py b/app/admin/routes.py
index 011de1bb0dabd490a8369dd0eddb07146794055b..38ad92536166014b720fcf2fc74ad834203eaa51 100644
--- a/app/admin/routes.py
+++ b/app/admin/routes.py
@@ -6,7 +6,6 @@ from app.decorators import admin_required
 from app.models import Role, User, UserSettingJobStatusMailNotificationLevel
 from app.settings.forms import (
     EditGeneralSettingsForm,
-    EditInterfaceSettingsForm,
     EditNotificationSettingsForm
 )
 from . import bp
@@ -55,9 +54,6 @@ def edit_user(user_id):
         user,
         prefix='edit-general-settings-form'
     )
-    edit_interface_settings_form = EditInterfaceSettingsForm(
-        prefix='edit-interface-settings-form'
-    )
     edit_notification_settings_form = EditNotificationSettingsForm(
         prefix='edit-notification-settings-form'
     )
@@ -76,12 +72,6 @@ def edit_user(user_id):
         db.session.commit()
         flash('Your changes have been saved')
         return redirect(url_for('.edit_user', user_id=user.id))
-    if (edit_interface_settings_form.submit.data
-            and edit_interface_settings_form.validate()):
-        user.setting_dark_mode = edit_interface_settings_form.dark_mode.data
-        db.session.commit()
-        flash('Your changes have been saved')
-        return redirect(url_for('.edit_user', user_id=user.id))
     if (edit_notification_settings_form.submit.data
             and edit_notification_settings_form.validate()):
         user.setting_job_status_mail_notification_level = \
@@ -93,13 +83,11 @@ def edit_user(user_id):
         return redirect(url_for('.edit_user', user_id=user.id))
     admin_edit_user_form.prefill(user)
     edit_general_settings_form.prefill(user)
-    edit_interface_settings_form.prefill(user)
     edit_notification_settings_form.prefill(user)
     return render_template(
         'admin/edit_user.html.j2',
         admin_edit_user_form=admin_edit_user_form,
         edit_general_settings_form=edit_general_settings_form,
-        edit_interface_settings_form=edit_interface_settings_form,
         edit_notification_settings_form=edit_notification_settings_form,
         title='Edit user',
         user=user
diff --git a/app/api/schemas.py b/app/api/schemas.py
index 9474bd1a3cec00eba9697edbc9da984e99e17e96..7abb56de79536da5334f13173edb11f843959048 100644
--- a/app/api/schemas.py
+++ b/app/api/schemas.py
@@ -150,7 +150,6 @@ class UserSchema(ma.SQLAlchemySchema):
     last_seen = ma.auto_field(dump_only=True)
     password = ma.String(load_only=True)
     last_seen = ma.auto_field(dump_only=True)
-    setting_dark_mode = ma.auto_field()
     setting_job_status_mail_notification_level = ma.String(
         validate=validate.OneOf(list(UserSettingJobStatusMailNotificationLevel.__members__.keys()))
     )
diff --git a/app/contributions/forms.py b/app/contributions/forms.py
index 04030fd0df0a2edf857fe3c1984975cd2b8c1933..b30c578e21e4b56992d418b4425003f591ca49e6 100644
--- a/app/contributions/forms.py
+++ b/app/contributions/forms.py
@@ -13,7 +13,7 @@ from wtforms.validators import InputRequired, Length
 from app.services import SERVICES
 
 
-class CreateContributionBaseForm(FlaskForm):
+class ContributionBaseForm(FlaskForm):
     title = StringField(
         'Title',
         validators=[InputRequired(), Length(max=64)]
@@ -48,7 +48,7 @@ class CreateContributionBaseForm(FlaskForm):
     submit = SubmitField()
 
 
-class CreateTesseractOCRPipelineModelForm(CreateContributionBaseForm):
+class CreateTesseractOCRPipelineModelForm(ContributionBaseForm):
     tesseract_model_file = FileField(
         'File',
         validators=[FileRequired()]
@@ -72,7 +72,7 @@ class CreateTesseractOCRPipelineModelForm(CreateContributionBaseForm):
         self.compatible_service_versions.default = ''
 
 
-class CreateSpaCyNLPPipelineModelForm(CreateContributionBaseForm):
+class CreateSpaCyNLPPipelineModelForm(ContributionBaseForm):
     spacy_model_file = FileField(
         'File',
         validators=[FileRequired()]
@@ -100,17 +100,8 @@ class CreateSpaCyNLPPipelineModelForm(CreateContributionBaseForm):
         self.compatible_service_versions.default = ''
 
 
-class EditContributionBaseForm(CreateContributionBaseForm):
-    def prefill(self, model_file):
-        ''' Pre-fill the form with data of an exististing corpus file '''
-        self.title.data = model_file.title
-        self.description.data = model_file.description
-        self.publisher.data = model_file.publisher
-        self.publishing_year.data = model_file.publishing_year
-        self.publisher_url.data = model_file.publisher_url
-        self.publishing_url.data = model_file.publishing_url
-        self.version.data = model_file.version
-        self.shared.data = model_file.shared
+class EditContributionBaseForm(ContributionBaseForm):
+    pass
 
 
 class EditTesseractOCRPipelineModelForm(EditContributionBaseForm):
@@ -122,7 +113,3 @@ class EditSpaCyNLPPipelineModelForm(EditContributionBaseForm):
         'Pipeline name',
         validators=[InputRequired(), Length(max=64)]
     )
-
-    def prefill(self, model_file):
-        super().prefill(model_file)
-        self.pipeline_name.data = model_file.pipeline_name
diff --git a/app/contributions/routes.py b/app/contributions/routes.py
index 67f1854ca572079a8c528d1850c03595861e3e12..cd9cdb4b5811085d338db212ddcfd6783aee62d4 100644
--- a/app/contributions/routes.py
+++ b/app/contributions/routes.py
@@ -1,4 +1,12 @@
-from flask import abort, current_app, flash, Markup, render_template, url_for
+from flask import (
+    abort,
+    current_app,
+    flash,
+    Markup,
+    redirect,
+    render_template,
+    url_for
+)
 from flask_login import login_required, current_user
 from threading import Thread
 from app import db
@@ -43,33 +51,17 @@ def tesseract_ocr_pipeline_models():
 @bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['GET', 'POST'])
 def tesseract_ocr_pipeline_model(tesseract_ocr_pipeline_model_id):
     tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id)
-    form = EditTesseractOCRPipelineModelForm(prefix='edit-tesseract-ocr-pipeline-model-form')
+    form = EditTesseractOCRPipelineModelForm(
+        obj=tesseract_ocr_pipeline_model,
+        prefix='edit-tesseract-ocr-pipeline-model-form'
+    )
     if form.validate_on_submit():
-        if tesseract_ocr_pipeline_model.title != form.title.data:
-            tesseract_ocr_pipeline_model.title = form.title.data
-        if tesseract_ocr_pipeline_model.description != form.description.data:
-            tesseract_ocr_pipeline_model.description = form.description.data
-        if tesseract_ocr_pipeline_model.publisher != form.publisher.data:
-            tesseract_ocr_pipeline_model.publisher = form.publisher.data
-        if tesseract_ocr_pipeline_model.publishing_year != form.publishing_year.data:
-            tesseract_ocr_pipeline_model.publishing_year = form.publishing_year.data
-        if tesseract_ocr_pipeline_model.publisher_url != form.publisher_url.data:
-            tesseract_ocr_pipeline_model.publisher_url = form.publisher_url.data
-        if tesseract_ocr_pipeline_model.publishing_url != form.publishing_url.data:
-            tesseract_ocr_pipeline_model.publishing_url = form.publishing_url.data
-        if tesseract_ocr_pipeline_model.version != form.version.data:
-            tesseract_ocr_pipeline_model.version = form.version.data
-        if tesseract_ocr_pipeline_model.shared != form.shared.data:
-            tesseract_ocr_pipeline_model.shared = form.shared.data
-        db.session.commit()
-        tesseract_ocr_pipeline_model_url = url_for(
-            '.tesseract_ocr_pipeline_model',
-            tesseract_ocr_pipeline_model_id=tesseract_ocr_pipeline_model.id
-        )
-        message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model_url}">{tesseract_ocr_pipeline_model.title}</a>" updated')
-        flash(message)
-        return {}, 201, {'Location': tesseract_ocr_pipeline_model_url}
-    form.prefill(tesseract_ocr_pipeline_model)
+        form.populate_obj(tesseract_ocr_pipeline_model)
+        if db.session.is_modified(tesseract_ocr_pipeline_model):
+            message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model.url}">{tesseract_ocr_pipeline_model.title}</a>" updated')
+            flash(message)
+            db.session.commit()
+        return redirect(url_for('.tesseract_ocr_pipeline_models'))
     return render_template(
         'contributions/tesseract_ocr_pipeline_model.html.j2',
         form=form,
@@ -155,36 +147,17 @@ def spacy_nlp_pipeline_models():
 @bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>', methods=['GET', 'POST'])
 def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id):
     spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id)
-    form = EditSpaCyNLPPipelineModelForm(prefix='edit-spacy-nlp-pipeline-model-form')
+    form = EditSpaCyNLPPipelineModelForm(
+        obj=spacy_nlp_pipeline_model,
+        prefix='edit-spacy-nlp-pipeline-model-form'
+    )
     if form.validate_on_submit():
-        if spacy_nlp_pipeline_model.title != form.title.data:
-            spacy_nlp_pipeline_model.title = form.title.data
-        if spacy_nlp_pipeline_model.description != form.description.data:
-            spacy_nlp_pipeline_model.description = form.description.data
-        if spacy_nlp_pipeline_model.pipeline_name != form.pipeline_name.data:
-            spacy_nlp_pipeline_model.pipeline_name = form.pipeline_name.data
-        if spacy_nlp_pipeline_model.publisher != form.publisher.data:
-            spacy_nlp_pipeline_model.publisher = form.publisher.data
-        if spacy_nlp_pipeline_model.publishing_year != form.publishing_year.data:
-            spacy_nlp_pipeline_model.publishing_year = form.publishing_year.data
-        if spacy_nlp_pipeline_model.publisher_url != form.publisher_url.data:
-            spacy_nlp_pipeline_model.publisher_url = form.publisher_url.data
-        if spacy_nlp_pipeline_model.publishing_url != form.publishing_url.data:
-            spacy_nlp_pipeline_model.publishing_url = form.publishing_url.data
-        if spacy_nlp_pipeline_model.version != form.version.data:
-            spacy_nlp_pipeline_model.version = form.version.data
-        if spacy_nlp_pipeline_model.shared != form.shared.data:
-            spacy_nlp_pipeline_model.shared = form.shared.data
-        current_app.logger.warning(db.session.dirty)
-        db.session.commit()
-        spacy_nlp_pipeline_model_url = url_for(
-            '.spacy_nlp_pipeline_model',
-            spacy_nlp_pipeline_model_id=spacy_nlp_pipeline_model.id
-        )
-        message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model_url}">{spacy_nlp_pipeline_model.title}</a>" updated')
-        flash(message)
-        return {}, 201, {'Location': url_for('.contributions')}
-    form.prefill(spacy_nlp_pipeline_model)
+        form.populate_obj(spacy_nlp_pipeline_model)
+        if db.session.is_modified(spacy_nlp_pipeline_model):
+            message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model.url}">{spacy_nlp_pipeline_model.title}</a>" updated')
+            flash(message)
+            db.session.commit()
+        return redirect(url_for('.spacy_nlp_pipeline_models'))
     return render_template(
         'contributions/spacy_nlp_pipeline_model.html.j2',
         form=form,
diff --git a/app/corpora/forms.py b/app/corpora/forms.py
index 73002edc9c2e2c3a67d9f003b6049ef2225b03c3..db46b0ad77131ffcdf1cac7cae5572a3cfa62699 100644
--- a/app/corpora/forms.py
+++ b/app/corpora/forms.py
@@ -47,20 +47,7 @@ class CreateCorpusFileForm(CorpusFileBaseForm):
 
 
 class EditCorpusFileForm(CorpusFileBaseForm):
-    def prefill(self, corpus_file):
-        ''' Pre-fill the form with data of an exististing corpus file '''
-        self.address.data = corpus_file.address
-        self.author.data = corpus_file.author
-        self.booktitle.data = corpus_file.booktitle
-        self.chapter.data = corpus_file.chapter
-        self.editor.data = corpus_file.editor
-        self.institution.data = corpus_file.institution
-        self.journal.data = corpus_file.journal
-        self.pages.data = corpus_file.pages
-        self.publisher.data = corpus_file.publisher
-        self.publishing_year.data = corpus_file.publishing_year
-        self.school.data = corpus_file.school
-        self.title.data = corpus_file.title
+    pass
 
 
 class ImportCorpusForm(FlaskForm):
diff --git a/app/corpora/routes.py b/app/corpora/routes.py
index 57c14e651c0303ceae8103cd18dc3fde1b221b54..8bf7b1fb3cffea97188975acb931d2f56c85a07e 100644
--- a/app/corpora/routes.py
+++ b/app/corpora/routes.py
@@ -176,52 +176,15 @@ def corpus_file(corpus_id, corpus_file_id):
         abort(404)
     if not (corpus_file.corpus.user == current_user or current_user.is_administrator()):
         abort(403)
-    form = EditCorpusFileForm(prefix='edit-corpus-file-form')
+    form = EditCorpusFileForm(obj=corpus_file, prefix='edit-corpus-file-form')
     if form.validate_on_submit():
-        has_changes = False
-        if corpus_file.address != form.address.data:
-            corpus_file.address = form.address.data
-            has_changes = True
-        if corpus_file.author != form.author.data:
-            corpus_file.author = form.author.data
-            has_changes = True
-        if corpus_file.booktitle != form.booktitle.data:
-            corpus_file.booktitle = form.booktitle.data
-            has_changes = True
-        if corpus_file.chapter != form.chapter.data:
-            corpus_file.chapter = form.chapter.data
-            has_changes = True
-        if corpus_file.editor != form.editor.data:
-            corpus_file.editor = form.editor.data
-            has_changes = True
-        if corpus_file.institution != form.institution.data:
-            corpus_file.institution = form.institution.data
-            has_changes = True
-        if corpus_file.journal != form.journal.data:
-            corpus_file.journal = form.journal.data
-            has_changes = True
-        if corpus_file.pages != form.pages.data:
-            corpus_file.pages = form.pages.data
-            has_changes = True
-        if corpus_file.publisher != form.publisher.data:
-            corpus_file.publisher = form.publisher.data
-            has_changes = True
-        if corpus_file.publishing_year != form.publishing_year.data:
-            corpus_file.publishing_year = form.publishing_year.data
-            has_changes = True
-        if corpus_file.school != form.school.data:
-            corpus_file.school = form.school.data
-            has_changes = True
-        if corpus_file.title != form.title.data:
-            corpus_file.title = form.title.data
-            has_changes = True
-        if has_changes:
+        form.populate_obj(corpus_file)
+        if db.session.is_modified(corpus_file):
             corpus_file.corpus.status = CorpusStatus.UNPREPARED
-        db.session.commit()
-        message = Markup(f'Corpus file "<a href="{corpus_file.url}">{corpus_file.filename}</a>" updated')
-        flash(message, category='corpus')
+            db.session.commit()
+            message = Markup(f'Corpus file "<a href="{corpus_file.url}">{corpus_file.filename}</a>" updated')
+            flash(message, category='corpus')
         return redirect(corpus_file.corpus.url)
-    form.prefill(corpus_file)
     return render_template(
         'corpora/corpus_file.html.j2',
         corpus=corpus_file.corpus,
diff --git a/app/models.py b/app/models.py
index 3bf7f8a71e6406b8c3ce85a383da08f8287899b6..f4889bbd3177ffd309569fac3463a815f2b86f59 100644
--- a/app/models.py
+++ b/app/models.py
@@ -263,7 +263,6 @@ class User(HashidMixin, UserMixin, db.Model):
     password_hash = db.Column(db.String(128))
     confirmed = db.Column(db.Boolean, default=False)
     member_since = db.Column(db.DateTime(), default=datetime.utcnow)
-    setting_dark_mode = db.Column(db.Boolean, default=False)
     setting_job_status_mail_notification_level = db.Column(
         IntEnumColumn(UserSettingJobStatusMailNotificationLevel),
         default=UserSettingJobStatusMailNotificationLevel.END
@@ -500,7 +499,6 @@ class User(HashidMixin, UserMixin, db.Model):
             'member_since': f'{self.member_since.isoformat()}Z',
             'username': self.username,
             'settings': {
-                'dark_mode': self.setting_dark_mode,
                 'job_status_mail_notification_level': \
                     self.setting_job_status_mail_notification_level.name
             }
@@ -552,6 +550,13 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model):
             str(self.id)
         )
 
+    @property
+    def url(self):
+        return url_for(
+            'contributions.tesseract_ocr_pipeline_model',
+            tesseract_ocr_pipeline_model_id=self.id
+        )
+
     @staticmethod
     def insert_defaults():
         nopaque_user = User.query.filter_by(username='nopaque').first()
@@ -660,6 +665,13 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model):
             str(self.id)
         )
 
+    @property
+    def url(self):
+        return url_for(
+            'contributions.spacy_nlp_pipeline_model',
+            spacy_nlp_pipeline_model_id=self.id
+        )
+
     @staticmethod
     def insert_defaults():
         nopaque_user = User.query.filter_by(username='nopaque').first()
diff --git a/app/query_results_models.py b/app/query_results_models.py
deleted file mode 100644
index 132a4cc32158a121b94d3d9df0908471a7fa6896..0000000000000000000000000000000000000000
--- a/app/query_results_models.py
+++ /dev/null
@@ -1,58 +0,0 @@
-class QueryResult(FileMixin, HashidMixin, db.Model):
-    __tablename__ = 'query_results'
-    # Primary key
-    id = db.Column(db.Integer, primary_key=True)
-    # Foreign keys
-    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
-    # Fields
-    description = db.Column(db.String(255))
-    query_metadata = db.Column(db.JSON())
-    title = db.Column(db.String(32))
-    # Backrefs: user: User
-
-    def __repr__(self):
-        '''
-        String representation of the QueryResult. For human readability.
-        '''
-        return f'<QueryResult {self.title}>'
-
-    @property
-    def download_url(self):
-        return url_for(
-            'corpora.download_query_result', query_result_id=self.id)
-
-    @property
-    def jsonpatch_path(self):
-        return f'{self.user.jsonpatch_path}/query_results/{self.hashid}'
-
-    @property
-    def path(self):
-        return os.path.join(
-            self.user.path, 'query_results', str(self.id), self.filename)
-
-    @property
-    def url(self):
-        return url_for('corpora.query_result', query_result_id=self.id)
-
-    @property
-    def user_hashid(self):
-        return self.user.hashid
-
-    def delete(self):
-        shutil.rmtree(self.path, ignore_errors=True)
-        db.session.delete(self)
-
-    def to_json(self, backrefs=False, relationships=False):
-        _json = {
-            'id': self.hashid,
-            'corpus_title': self.query_metadata['corpus_name'],
-            'description': self.description,
-            'filename': self.filename,
-            'query': self.query_metadata['query'],
-            'query_metadata': self.query_metadata,
-            'title': self.title,
-            **self.file_mixin_to_json(
-                backrefs=backrefs, relationships=relationships)
-        }
-        if backrefs:
-            _json['user'] = self.user.to_json(backrefs=True, relationships=False)
diff --git a/app/services/forms.py b/app/services/forms.py
index 96caecc4b6d77c84ef4bbee59da5740522f35d04..562696eb6320f35089cd6458101b144bc1fa48e0 100644
--- a/app/services/forms.py
+++ b/app/services/forms.py
@@ -72,11 +72,9 @@ class CreateTesseractOCRPipelineJobForm(CreateJobBaseForm):
         self.ocropus_nlbin_threshold.render_kw['disabled'] = True
         if 'methods' in service_info:
             if 'binarization' in service_info['methods']:
-                if 'disabled' in self.binarization.render_kw:
-                    del self.binarization.render_kw['disabled']
+                del self.binarization.render_kw['disabled']
             if 'ocropus_nlbin_threshold' in service_info['methods']:
-                if 'disabled' in self.ocropus_nlbin_threshold.render_kw:
-                    del self.ocropus_nlbin_threshold.render_kw['disabled']
+                del self.ocropus_nlbin_threshold.render_kw['disabled']
         models = [
             x for x in TesseractOCRPipelineModel.query.order_by(TesseractOCRPipelineModel.title).all()
             if version in x.compatible_service_versions and (x.shared == True or x.user == current_user)
@@ -118,8 +116,7 @@ class CreateTranskribusHTRPipelineJobForm(CreateJobBaseForm):
         self.binarization.render_kw['disabled'] = True
         if 'methods' in service_info:
             if 'binarization' in service_info['methods']:
-                if 'disabled' in self.binarization.render_kw:
-                    del self.binarization.render_kw['disabled']
+                del self.binarization.render_kw['disabled']
         self.model.choices = [('', 'Choose your option')]
         self.model.choices += [(x['modelId'], x['name']) for x in transkribus_htr_pipeline_models]
         self.model.default = ''
@@ -157,8 +154,7 @@ class CreateSpacyNLPPipelineJobForm(CreateJobBaseForm):
         self.encoding_detection.render_kw['disabled'] = True
         if 'methods' in service_info:
             if 'encoding_detection' in service_info['methods']:
-                if 'disabled' in self.encoding_detection.render_kw:
-                    del self.encoding_detection.render_kw['disabled']
+                del self.encoding_detection.render_kw['disabled']
         models = [
             x for x in SpaCyNLPPipelineModel.query.order_by(SpaCyNLPPipelineModel.title).all()
             if version in x.compatible_service_versions and (x.shared == True or x.user == current_user)
diff --git a/app/settings/forms.py b/app/settings/forms.py
index 3bd3b5ab108a3a5320e06ad234d8539db0470f40..00904e001cdcb699601284264b37146cc63dac5a 100644
--- a/app/settings/forms.py
+++ b/app/settings/forms.py
@@ -71,10 +71,6 @@ class EditGeneralSettingsForm(FlaskForm):
         super().__init__(*args, **kwargs)
         self.user = user
 
-    def prefill(self, user):
-        self.email.data = user.email
-        self.username.data = user.username
-
     def validate_email(self, field):
         if (field.data != self.user.email
                 and User.query.filter_by(email=field.data).first()):
@@ -86,13 +82,6 @@ class EditGeneralSettingsForm(FlaskForm):
             raise ValidationError('Username already in use')
 
 
-class EditInterfaceSettingsForm(FlaskForm):
-    dark_mode = BooleanField('Dark mode')
-    submit = SubmitField()
-
-    def prefill(self, user):
-        self.dark_mode.data = user.setting_dark_mode
-
 class EditNotificationSettingsForm(FlaskForm):
     job_status_mail_notification_level = SelectField(
         'Job status mail notification level',
diff --git a/app/settings/routes.py b/app/settings/routes.py
index eb2636e815f96b29252aeeefdba22bdae026ec99..0604eb06693a0d9f6249ffaaaa0a4601596ffa20 100644
--- a/app/settings/routes.py
+++ b/app/settings/routes.py
@@ -6,7 +6,6 @@ from . import bp
 from .forms import (
     ChangePasswordForm,
     EditGeneralSettingsForm,
-    EditInterfaceSettingsForm,
     EditNotificationSettingsForm
 )
 
@@ -20,11 +19,9 @@ def settings():
     )
     edit_general_settings_form = EditGeneralSettingsForm(
         current_user,
+        obj=current_user,
         prefix='edit-general-settings-form'
     )
-    edit_interface_settings_form = EditInterfaceSettingsForm(
-        prefix='edit-interface-settings-form'
-    )
     edit_notification_settings_form = EditNotificationSettingsForm(
         prefix='edit-notification-settings-form'
     )
@@ -41,13 +38,6 @@ def settings():
         db.session.commit()
         flash('Your changes have been saved')
         return redirect(url_for('.settings'))
-    if (edit_interface_settings_form.submit.data
-            and edit_interface_settings_form.validate()):
-        current_user.setting_dark_mode = (
-            edit_interface_settings_form.dark_mode.data)
-        db.session.commit()
-        flash('Your changes have been saved')
-        return redirect(url_for('.settings'))
     if (edit_notification_settings_form.submit.data
             and edit_notification_settings_form.validate()):
         current_user.setting_job_status_mail_notification_level = (
@@ -58,14 +48,11 @@ def settings():
         db.session.commit()
         flash('Your changes have been saved')
         return redirect(url_for('.settings'))
-    edit_general_settings_form.prefill(current_user)
-    edit_interface_settings_form.prefill(current_user)
     edit_notification_settings_form.prefill(current_user)
     return render_template(
         'settings/settings.html.j2',
         change_password_form=change_password_form,
         edit_general_settings_form=edit_general_settings_form,
-        edit_interface_settings_form=edit_interface_settings_form,
         edit_notification_settings_form=edit_notification_settings_form,
         title='Settings'
     )
diff --git a/app/templates/admin/edit_user.html.j2 b/app/templates/admin/edit_user.html.j2
index 45c27c6a8b8c32f492791e6bf6046b3a722096b3..13e8a4730849f17dc9eef41b3e3fef8d2426c287 100644
--- a/app/templates/admin/edit_user.html.j2
+++ b/app/templates/admin/edit_user.html.j2
@@ -27,38 +27,6 @@
       </div>
     </form>
 
-    <form method="POST">
-      {{ edit_interface_settings_form.hidden_tag() }}
-      <div class="card">
-        <div class="card-content">
-          <span class="card-title">Interface settings</span>
-          <div class="row">
-            <div class="col s12"><p>&nbsp;</p></div>
-            <div class="col s1">
-              <p><i class="material-icons">brightness_3</i></p>
-            </div>
-            <div class="col s8">
-              <p>{{ edit_interface_settings_form.dark_mode.label.text }}</p>
-              <p class="light">Enable dark mode to ease your eyes.</p>
-            </div>
-            <div class="col s3 right-align">
-              <div class="switch">
-                <label>
-                  {{ edit_interface_settings_form.dark_mode() }}
-                  <span class="lever"></span>
-                </label>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="card-action">
-          <div class="right-align">
-            {{ wtf.render_field(edit_interface_settings_form.submit, material_icon='send') }}
-          </div>
-        </div>
-      </div>
-    </form>
-
     <form method="POST">
       {{ edit_notification_settings_form.hidden_tag() }}
       <div class="card">
diff --git a/app/templates/base.html.j2 b/app/templates/base.html.j2
index af8bc2d38bd0d10741c6229ad4a312c69da293e5..dbecd35e1e76419baff35b973af85bf4beb9b2bb 100644
--- a/app/templates/base.html.j2
+++ b/app/templates/base.html.j2
@@ -5,12 +5,6 @@
 {% block head %}
 {{ super() }}
 <link href="{{ url_for('static', filename='images/nopaque_-_favicon.png') }}" rel="icon">
-{% if current_user.setting_dark_mode %}
-<script src="https://cdnjs.cloudflare.com/ajax/libs/darkreader/4.9.40/darkreader.min.js" integrity="sha512-0Jbi9gWSyU5SvNS16za0aILl6l+MgM8N+TGlZxy4qPQEzqKoU9egh4h56Kz0xp2R+ZFPQMfeDn26Gh6cqu2WAg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
-<script>
-  DarkReader.enable();
-</script>
-{% endif %}
 {% endblock head %}
 
 {% block metas %}
diff --git a/app/templates/services/spacy_nlp_pipeline.html.j2 b/app/templates/services/spacy_nlp_pipeline.html.j2
index 219ac025b076eedf0b7d09c4ee651f966b3839f5..6443c506ca9915f1fc24aaa9d66287ad37cbc1e9 100644
--- a/app/templates/services/spacy_nlp_pipeline.html.j2
+++ b/app/templates/services/spacy_nlp_pipeline.html.j2
@@ -87,6 +87,7 @@
               <div class="col s12">
                 <span class="card-title">Preprocessing</span>
               </div>
+              {% if 'disabled' not in form.encoding_detection.render_kw or not form.encoding_detection.render_kw['disabled'] %}
               <div class="col s9">
                 <p>{{ form.encoding_detection.label.text }}</p>
                 <p class="light">If the input files are not created with the nopaque OCR service or you do not know if your text files are UTF-8 encoded, check this switch. We will try to automatically determine the right encoding for your texts to process them.</p>
@@ -99,6 +100,7 @@
                   </label>
                 </div>
               </div>
+              {% endif %}
               <!--
               Seperate each setting with the following
               <div class="col s12"><p>&nbsp;</p></div>
diff --git a/app/templates/services/tesseract_ocr_pipeline.html.j2 b/app/templates/services/tesseract_ocr_pipeline.html.j2
index 9114b729e2635574ed0e65cc09257179210395e2..3bb14254cef558585aed5dba9ec1af462acaf221 100644
--- a/app/templates/services/tesseract_ocr_pipeline.html.j2
+++ b/app/templates/services/tesseract_ocr_pipeline.html.j2
@@ -72,6 +72,7 @@
               <div class="col s12">
                 <span class="card-title">Preprocessing</span>
               </div>
+              {% if 'disabled' not in form.binarization.render_kw or not form.binarization.render_kw['disabled'] %}
               <div class="col s9">
                 <p>{{ form.binarization.label.text }}</p>
                 <p class="light">Based on a brightness threshold pixels are converted into either black or white. It is useful to reduce noise in images. (<b>longer duration</b>)</p>
@@ -84,56 +85,14 @@
                   </label>
                 </div>
               </div>
-              <div class="col s12"><p>&nbsp;</p></div>  
-              <div class="col s9">
+              {% if 'disabled' not in form.ocropus_nlbin_threshold.render_kw or not form.ocropus_nlbin_threshold.render_kw['disabled'] %}
+              <div class="col s9 hide" id="create-job-form-ocropus_nlbin_threshold-container">
+                <br>
                 <p>Intensity (between 0 and 1)</p>
                 <p class="range-field">{{ form.ocropus_nlbin_threshold() }}</p>
               </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page range</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page rotation</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page split</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
+              {% endif %}
+              {% endif %}
               <!--
               Seperate each setting with the following
               <div class="col s12"><p>&nbsp;</p></div>
@@ -185,3 +144,12 @@
   </div>
 </div>
 {% endblock modals %}
+
+{% block scripts %}
+{{ super() }}
+<script>
+document.querySelector('#create-job-form-binarization').addEventListener('change', (event) => {
+  document.querySelector('#create-job-form-ocropus_nlbin_threshold-container').classList.toggle('hide');
+});
+</script>
+{% endblock scripts %}
diff --git a/app/templates/services/transkribus_htr_pipeline.html.j2 b/app/templates/services/transkribus_htr_pipeline.html.j2
index d54d990664e95904eef520f13399c581340acb7d..da14d53c6125e4247e2b51c1fdefa2232e090ace 100644
--- a/app/templates/services/transkribus_htr_pipeline.html.j2
+++ b/app/templates/services/transkribus_htr_pipeline.html.j2
@@ -76,6 +76,7 @@
               <div class="col s12">
                 <span class="card-title">Preprocessing</span>
               </div>
+              {% if 'disabled' not in form.binarization.render_kw or not form.binarization.render_kw['disabled'] %}
               <div class="col s9">
                 <p>{{ form.binarization.label.text }}</p>
                 <p class="light">Based on a brightness threshold pixels are converted into either black or white. It is useful to reduce noise in images. (<b>longer duration</b>)</p>
@@ -88,51 +89,7 @@
                   </label>
                 </div>
               </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page range</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page rotation</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s12 divider"></div>
-              <div class="col s12"><p>&nbsp;</p></div>
-              <div class="col s9">
-                <p>Page split</p>
-                <p class="light"></p>
-              </div>
-              <div class="col s3 right-align">
-                <div class="switch">
-                  <label>
-                    <input disabled type="checkbox">
-                    <span class="lever"></span>
-                  </label>
-                </div>
-              </div>
+              {% endif %}
               <!--
               Seperate each setting with the following
               <div class="col s12"><p>&nbsp;</p></div>
diff --git a/app/templates/settings/settings.html.j2 b/app/templates/settings/settings.html.j2
index 441cd367834a78ee6692aa86799db87578d8328f..e229a382656dd738cd3627ac72056355ec3395ad 100644
--- a/app/templates/settings/settings.html.j2
+++ b/app/templates/settings/settings.html.j2
@@ -27,38 +27,6 @@
       </div>
     </form>
 
-    <form method="POST">
-      {{ edit_interface_settings_form.hidden_tag() }}
-      <div class="card">
-        <div class="card-content">
-          <span class="card-title">Interface settings</span>
-          <div class="row">
-            <div class="col s12"><p>&nbsp;</p></div>
-            <div class="col s1">
-              <p><i class="material-icons">brightness_3</i></p>
-            </div>
-            <div class="col s8">
-              <p>{{ edit_interface_settings_form.dark_mode.label.text }}</p>
-              <p class="light">Enable dark mode to ease your eyes.</p>
-            </div>
-            <div class="col s3 right-align">
-              <div class="switch">
-                <label>
-                  {{ edit_interface_settings_form.dark_mode() }}
-                  <span class="lever"></span>
-                </label>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="card-action">
-          <div class="right-align">
-            {{ wtf.render_field(edit_interface_settings_form.submit, material_icon='send') }}
-          </div>
-        </div>
-      </div>
-    </form>
-
     <form method="POST">
       {{ edit_notification_settings_form.hidden_tag() }}
       <div class="card">
diff --git a/migrations/versions/89e9526089bf_.py b/migrations/versions/89e9526089bf_.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd65af17ac64adb5b8b5407b6873be5166f463
--- /dev/null
+++ b/migrations/versions/89e9526089bf_.py
@@ -0,0 +1,26 @@
+"""Remove setting_dark_mode column from users table
+
+Revision ID: 89e9526089bf
+Revises: 721829b5dd25
+Create Date: 2022-11-17 09:47:27.724692
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '89e9526089bf'
+down_revision = '721829b5dd25'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    op.drop_column('users', 'setting_dark_mode')
+
+
+def downgrade():
+    op.add_column('users',
+        sa.Column('setting_dark_mode', sa.Boolean(), nullable=True)
+    )