diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9d9516f731e87223aa1e74e85b5564629bfeb7e6..429c0b42a722b28f394c46611d5d45e34510da10 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -47,7 +47,7 @@ db_migrations_updated:
 linter:
   stage: test
   script:
-  - pip3 install pylint-gitlab # this force-updates jinja2 and some other packages!
+  - pip3 install pylint-gitlab pylint-flask-sqlalchemy # this force-updates jinja2 and some other packages!
   - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabCodeClimateReporter uffd > codeclimate.json
   - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabPagesHtmlReporter uffd > pylint.html
   - python3 -m pylint --rcfile .pylintrc --output-format=text uffd
diff --git a/.pylintrc b/.pylintrc
index 2d0b9f37cb50ff484d26cbb82f7c9f29019ef164..3ea72c68f3583556f21e551874fa0623e1f1dde3 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -28,7 +28,7 @@ limit-inference-results=100
 
 # List of plugins (as comma separated values of python module names) to load,
 # usually to register additional checkers.
-load-plugins=
+load-plugins=pylint_flask_sqlalchemy
 
 # Pickle collected data for later comparisons.
 persistent=yes
@@ -63,91 +63,9 @@ confidence=
 disable=missing-module-docstring,
         missing-class-docstring,
         missing-function-docstring,
-        print-statement,
-        parameter-unpacking,
-        unpacking-in-except,
-        old-raise-syntax,
-        backtick,
-        long-suffix,
-        old-ne-operator,
-        old-octal-literal,
-        import-star-module-level,
-        non-ascii-bytes-literal,
-        raw-checker-failed,
-        bad-inline-option,
-        locally-disabled,
-        file-ignored,
-        suppressed-message,
-        useless-suppression,
-        deprecated-pragma,
-        use-symbolic-message-instead,
-        unused-wildcard-import,
-        apply-builtin,
-        basestring-builtin,
-        buffer-builtin,
-        cmp-builtin,
-        coerce-builtin,
-        execfile-builtin,
-        file-builtin,
-        long-builtin,
-        raw_input-builtin,
-        reduce-builtin,
-        standarderror-builtin,
-        unicode-builtin,
-        xrange-builtin,
-        coerce-method,
-        delslice-method,
-        getslice-method,
-        setslice-method,
-        no-absolute-import,
-        old-division,
-        dict-iter-method,
-        dict-view-method,
-        next-method-called,
-        metaclass-assignment,
-        indexing-exception,
-        raising-string,
-        reload-builtin,
-        oct-method,
-        hex-method,
-        nonzero-method,
-        cmp-method,
-        input-builtin,
-        round-builtin,
-        intern-builtin,
-        unichr-builtin,
-        map-builtin-not-iterating,
-        zip-builtin-not-iterating,
-        range-builtin-not-iterating,
-        filter-builtin-not-iterating,
-        using-cmp-argument,
-        eq-without-hash,
-        div-method,
-        idiv-method,
-        rdiv-method,
-        exception-message-attribute,
-        invalid-str-codec,
-        sys-max-int,
-        bad-python3-import,
-        deprecated-string-function,
-        deprecated-str-translate-call,
-        deprecated-itertools-function,
-        deprecated-types-field,
-        next-method-defined,
-        dict-items-not-iterating,
-        dict-keys-not-iterating,
-        dict-values-not-iterating,
-        deprecated-operator-function,
-        deprecated-urllib-function,
-        xreadlines-attribute,
-        deprecated-sys-function,
-        exception-escape,
-        comprehension-escape,
         too-few-public-methods,
         method-hidden,
-        bad-continuation,
         too-many-ancestors,
-        no-self-use,
         duplicate-code,
 
 # Enable the message, report, category or checker with the given id(s). You can
@@ -206,7 +124,7 @@ ignore-docstrings=yes
 ignore-imports=no
 
 # Minimum lines number of a similarity.
-min-similarity-lines=6
+min-similarity-lines=10
 
 
 [TYPECHECK]
diff --git a/CHANGELOG b/CHANGELOG
index 0b229b0799a603a1a640260ebe12f39d2ec66407..250c5362b5ebaf6f0af0f2f7e8741b786a132c11 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,7 +14,7 @@ uffd (0.3.0) unstable; urgency=medium
   [ Julian ]
   * ensure uffd-admin works with arguments containing whitespace
 
- -- CCCV <it@cccv.de>  Sat, 31 Jul 2021 23:36:01 +0000
+ -- root <root@runner-f9u6bnzu-project-27-concurrent-0>  Sun, 01 Aug 2021 13:27:31 +0000
 
 uffd (0.2.0) unstable; urgency=medium
 
diff --git a/uffd/csrf/csrf.py b/uffd/csrf/csrf.py
index 6b61cf47dabc8be0893eb0f81c0d6d292c221d1d..225bda284c95339880598801092146ad05a850c1 100644
--- a/uffd/csrf/csrf.py
+++ b/uffd/csrf/csrf.py
@@ -4,9 +4,7 @@ from flask import Blueprint, request, session
 
 bp = Blueprint("csrf", __name__)
 
-# pylint: disable=invalid-name
-csrfEndpoints = []
-# pylint: enable=invalid-name
+csrf_endpoints = []
 
 def csrf_protect(blueprint=None, endpoint=None):
 	def wraper(func):
@@ -15,7 +13,7 @@ def csrf_protect(blueprint=None, endpoint=None):
 				urlendpoint = "{}.{}".format(blueprint.name, func.__name__)
 			else:
 				urlendpoint = func.__name__
-		csrfEndpoints.append(urlendpoint)
+		csrf_endpoints.append(urlendpoint)
 		@wraps(func)
 		def decorator(*args, **kwargs):
 			if '_csrf_token' in request.values:
@@ -32,6 +30,6 @@ def csrf_protect(blueprint=None, endpoint=None):
 
 @bp.app_url_defaults
 def csrf_inject(endpoint, values):
-	if endpoint not in csrfEndpoints or not session.get('_csrf_token'):
+	if endpoint not in csrf_endpoints or not session.get('_csrf_token'):
 		return
 	values['_csrf_token'] = session['_csrf_token']
diff --git a/uffd/database.py b/uffd/database.py
index 4f5413f94276d3dc45ce5af15afd8f824660b3fa..681581e19e4e17f1f113ad9bfe2e1ab7d25ed34a 100644
--- a/uffd/database.py
+++ b/uffd/database.py
@@ -13,9 +13,7 @@ convention = {
 }
 metadata = MetaData(naming_convention=convention)
 
-# pylint: disable=C0103
 db = SQLAlchemy(metadata=metadata)
-# pylint: enable=C0103
 
 class SQLAlchemyJSON(JSONEncoder):
 	def default(self, o):
diff --git a/uffd/invite/models.py b/uffd/invite/models.py
index fb6f315fd38fbb417c3fc261b01ada9935af313c..196e333cd378f2a52e60104c1df87db47e29005f 100644
--- a/uffd/invite/models.py
+++ b/uffd/invite/models.py
@@ -10,7 +10,6 @@ from uffd.database import db
 from uffd.user.models import User
 from uffd.signup.models import Signup
 
-# pylint: disable=E1101
 invite_roles = db.Table('invite_roles',
 	Column('invite_id', Integer(), ForeignKey('invite.id'), primary_key=True),
 	Column('role_id', Integer, ForeignKey('role.id'), primary_key=True)
diff --git a/uffd/ldap.py b/uffd/ldap.py
index 015713d5d898d89358c360c07171590bff6adc68..ed31bb01e3372d5e89dbb6a1c89c8eaf84e7a835 100644
--- a/uffd/ldap.py
+++ b/uffd/ldap.py
@@ -6,6 +6,7 @@ from flask import current_app, request, abort, session
 import ldap3
 from ldap3.core.exceptions import LDAPBindError, LDAPPasswordIsMandatoryError, LDAPInvalidDnError
 
+# We import LDAPCommitError only because it is imported from us by other files. It is not needed here
 from uffd.ldapalchemy import LDAPMapper, LDAPCommitError # pylint: disable=unused-import
 from uffd.ldapalchemy.model import Query
 from uffd.ldapalchemy.core import encode_filter
diff --git a/uffd/ldapalchemy/core.py b/uffd/ldapalchemy/core.py
index c20a93ef789a057ff52470a2e310665b673fe63c..2d84598f4ad127a5cb572b162e8c27c57032a4be 100644
--- a/uffd/ldapalchemy/core.py
+++ b/uffd/ldapalchemy/core.py
@@ -80,7 +80,7 @@ class DeleteOperation:
 		self.obj = obj
 		self.attributes = {name: values.copy() for name, values in obj.state.attributes.items()}
 
-	def apply_object(self, obj_state):
+	def apply_object(self, obj_state): #pylint: disable=no-self-use
 		obj_state.dn = None
 
 	def apply_session(self, session_state):
diff --git a/uffd/navbar.py b/uffd/navbar.py
index 59198cc6f8bf643ee05c2d0ccdc15ffde3b64097..e9b1f9ebc2854a10694b2c3e81ecc610aa3229b7 100644
--- a/uffd/navbar.py
+++ b/uffd/navbar.py
@@ -10,6 +10,7 @@ def setup_navbar(app):
 def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None):
 	def wrapper(func):
 		def deferred_call(state):
+			assert blueprint
 			urlendpoint = endpoint
 			if not endpoint:
 				# pylint: disable=protected-access
@@ -17,7 +18,7 @@ def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, bl
 					urlendpoint = "{}.{}".format(blueprint.name, func.__name__)
 				else:
 					urlendpoint = func.__name_
-			# pylint: enable=protected-access
+				# pylint: enable=protected-access
 			item = {}
 			item['iconlib'] = iconlib
 			item['icon'] = icon
@@ -26,20 +27,8 @@ def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, bl
 			item['name'] = name
 			item['blueprint'] = blueprint
 			item['visible'] = visible or (lambda: True)
-
 			state.app.navbarList.append(item)
-
-		if blueprint:
-			blueprint.record_once(deferred_call)
-		else:
-			class StateMock:
-				def __init__(self, app):
-					self.app = app
-			# pylint: disable=C0415
-			from flask import current_app
-			# pylint: enable=C0415
-			deferred_call(StateMock(current_app))
-
+		blueprint.record_once(deferred_call)
 		return func
 
 	return wrapper