diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d9aae7690fea09863127c611966c9c37e247d58f..3fe0219fccc602e4f5e509420230630d924dc124 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,5 @@
 stages:
+  - pre-checks
   - test
   - checks
   - package
@@ -6,9 +7,11 @@ stages:
 variables:
   CONTAINER_GCC_IMAGE: $CI_REGISTRY_IMAGE/gcc:$CI_COMMIT_REF_SLUG
   XUNIT_TO_JUNIT_IMAGE: $CI_REGISTRY_IMAGE/xunit-to-junit
+  PRECOMMIT_IMAGE: $CI_REGISTRY_IMAGE/pre-commit
 
 include:
   - local: '/scripts/ci/extends/container-maker-setup.yml'
+  - local: '/scripts/ci/jobs/pre-commit.yml'
   - local: '/scripts/ci/jobs/build_image.yml'
   - local: '/scripts/ci/jobs/build.yml'
   - local: '/scripts/ci/jobs/build-win.yml'
diff --git a/MaterialLib/SolidModels/MFront/DruckerPrager.mfront b/MaterialLib/SolidModels/MFront/DruckerPrager.mfront
index b483fb11f56a04a01fb8f8a71875d7dd414ad5a0..0c0389a5e0b76692f6bdcf4d0d6b8f4d9e257386 100644
--- a/MaterialLib/SolidModels/MFront/DruckerPrager.mfront
+++ b/MaterialLib/SolidModels/MFront/DruckerPrager.mfront
@@ -90,4 +90,3 @@ lam.setGlossaryName("EquivalentPlasticStrain");
         dflam_ddeel = theta * (nF | D) / D(0, 0);
     }
 }
-
diff --git a/scripts/ci/jobs/build_image.yml b/scripts/ci/jobs/build_image.yml
index faa39250c5a0f6be34d15b5b7db39b7109510cfa..f873ad312b22b501d812782bf1815c56c6c73200 100644
--- a/scripts/ci/jobs/build_image.yml
+++ b/scripts/ci/jobs/build_image.yml
@@ -25,3 +25,17 @@ build xunit-to-junit image:
     - docker pull $XUNIT_TO_JUNIT_IMAGE:latest || true
     - docker build --cache-from $XUNIT_TO_JUNIT_IMAGE:latest -t $XUNIT_TO_JUNIT_IMAGE:latest -f scripts/docker/saxon/Dockerfile scripts/docker/saxon
     - docker push $XUNIT_TO_JUNIT_IMAGE:latest
+
+
+build pre-commit image:
+  stage: .pre
+  only:
+    changes:
+      - scripts/docker/Dockerfile.pre-commit
+  tags:
+    - docker-shell
+  script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - docker pull $PRECOMMIT_IMAGE:latest || true
+    - docker build --cache-from $PRECOMMIT_IMAGE:latest -t $PRECOMMIT_IMAGE:latest -f scripts/docker/Dockerfile.pre-commit scripts/docker
+    - docker push $PRECOMMIT_IMAGE:latest
diff --git a/scripts/ci/jobs/pre-commit.yml b/scripts/ci/jobs/pre-commit.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ea96978150fc0ab9cc2838cbc0db0811b9c3d443
--- /dev/null
+++ b/scripts/ci/jobs/pre-commit.yml
@@ -0,0 +1,9 @@
+pre commit:
+  stage: pre-checks
+  image:
+    name: $PRECOMMIT_IMAGE
+
+  script:
+    - pre-commit install
+    - pre-commit run --all-files
+    - git diff --check `git merge-base origin/master HEAD` HEAD -- . ':!*.md' ':!*.pandoc' ':!*.asc' ':!*.dat' ':!*.ts'
diff --git a/scripts/docker/Dockerfile.pre-commit b/scripts/docker/Dockerfile.pre-commit
new file mode 100644
index 0000000000000000000000000000000000000000..3d7d0a536e7ca58e7b064b97e2c752eca80982c8
--- /dev/null
+++ b/scripts/docker/Dockerfile.pre-commit
@@ -0,0 +1,9 @@
+FROM python:slim
+
+RUN pip install pre-commit
+CMD ["bash"]
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends git curl \
+ && curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash \
+ && apt-get install git-lfs \
+ && rm -rf /var/lib/apt/lists/*