diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..faadd8b9526a042bc13a8a78477b403d9b18b195
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,21 @@
+stages:
+  - test
+
+docs:
+  stage: test
+  image: davidhrbac/docker-mdcheck:latest
+  allow_failure: true
+  script:
+  - mdl -r ~MD024,~MD013,~MD033,~MD014,~MD026,~MD037,~MD036,~MD010,~MD029 *.md
+
+pylint:
+  stage: test
+  image: davidhrbac/docker-pycheck:latest
+  script:
+  - pylint --max-module-lines=3000 *.py
+
+shellcheck:
+  stage: test
+  image: davidhrbac/docker-shellcheck:latest
+  script:
+  - shellcheck *.sh
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 0000000000000000000000000000000000000000..bd27071feeacf44648fcb80f5d05242c8dc64f03
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,7 @@
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=150
+
+# Maximum number of lines in a module
+max-module-lines=1000
diff --git a/README.md b/README.md
index 432fc84fd251a3203981ee6c412981bc3f79af5a..862acf5d6e88985b8c106ae6e56f083baea6689d 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 # List of Modules on Clusters
 
 Generate lists
+
 * Salomon - login4
 * Anselm - login2
 
diff --git a/get_modules.sh b/get_modules.sh
index 3f13caf27b577186df4f6809329fab4ded5c4f90..5dd929e18c137c302c5f10b5e502965ed1ad8752 100755
--- a/get_modules.sh
+++ b/get_modules.sh
@@ -1,69 +1,51 @@
 #!/bin/bash
+# vim: ai ts=2 sw=2 et sts=2 ft=sh
 
 PWD="/home/easybuild/git/it4i-modules"
 cd $PWD
 
 STATE=$(git fetch 2>&1 | grep master)
 if [ ! -z "$STATE" ]; then
-   git pull
-   ./get_modules.sh
-   exit 0
+  git pull
+  ./get_modules.sh
+  exit 0
 fi
 
-if [ ! -z `hostname -f | grep "bullx"` ]; then
-   ml --show-hidden -t av 2>&1 > /dev/null| awk '{print $1 ",1"}' | grep -v -e '/,\|:' | sort -u > anselm.csv
-   ./modules.py > anselm.md
+if hostname -f | grep -q "bullx"; then
+  ml --show-hidden -t av > /dev/null 2>&1| awk '{print $1 ",1"}' | grep -v -e '/,\|:' | sort -u > anselm.csv
+  ./modules.py > anselm.md
 else
-   ml --show-hidden -t av 2>&1 > /dev/null| awk '{print $1 ",2"}' | grep -v -e '/,\|:' | sort -u > salomon.csv
-   ./modules.py > salomon.md
+  ml --show-hidden -t av > /dev/null 2>&1| awk '{print $1 ",2"}' | grep -v -e '/,\|:' | sort -u > salomon.csv
+  ./modules.py > salomon.md
 
-   MODULEBASE="/appsuv/modules"
-   MODULEPATH=""
+  for resource in "/appsuv/modules,uv2000" "/apps/phi/modules,phi"
+  do
+    MODULEBASE=${resource%,*}
+    MODULEPATH=""
+    FILENAME=${resource#*,}
 
-    for dir in `ls $MODULEBASE`
+    for dir in $MODULEBASE
     do
-        # Exclude following directories
-        if [[ ($dir == "all") ]]; then
-            continue
-        fi
-        # In case that it's directory
-        if [ -d $MODULEBASE/$dir ]; then
-            if [ -z $MODULEPATH ]; then
-                MODULEPATH="$MODULEBASE/$dir"
-            else
-                MODULEPATH="$MODULEPATH:$MODULEBASE/$dir"
-            fi
+      # Exclude following directories
+      if [[ ($(basename $dir) == "all") ]]; then
+        continue
+      fi
+      # In case that it's directory
+      if [ -d $dir ]; then
+        if [ -z $MODULEPATH ]; then
+          MODULEPATH=$dir
+        else
+          MODULEPATH="$MODULEPATH:$MODULEBASE/$dir"
         fi
+      fi
     done
 
-   export MODULEPATH
-
-   ml --show-hidden -t av 2>&1 > /dev/null| awk '{print $1 ",4"}' | grep -v -e '/,\|:' | sort -u > uv2000.csv
-   ./modules.py > uv2000.md
-
-   MODULEBASE="/apps/phi/modules"
-   MODULEPATH=""
-
-    for dir in `ls $MODULEBASE`
-    do
-        # Exclude following directories
-        if [[ ($dir == "all") ]]; then
-            continue
-        fi
-        # In case that it's directory
-        if [ -d $MODULEBASE/$dir ]; then
-            if [ -z $MODULEPATH ]; then
-                MODULEPATH="$MODULEBASE/$dir"
-            else
-                MODULEPATH="$MODULEPATH:$MODULEBASE/$dir"
-            fi
-        fi
-    done
+    export MODULEPATH
 
-   export MODULEPATH
+    ml --show-hidden -t av > /dev/null 2>&1| awk '{print $1 ",4"}' | grep -v -e '/,\|:' | sort -u > "$FILENAME".csv
+    ./modules.py > "$FILENAME".md
 
-   ml --show-hidden -t av 2>&1 > /dev/null| awk '{print $1 ",8"}' | grep -v -e '/,\|:' | sort -u > phi.csv
-   ./modules.py > phi.md
+  done
 fi
 
 DATE=$(date -R)
diff --git a/modules.py b/modules.py
index 50bd6d5ed4149bfd0cd9d9a9bfb3fc739ecd8852..9e08ffa2da5aad0e6e3db5fd9eb5d3dd38b2f1a9 100755
--- a/modules.py
+++ b/modules.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+"""Script to generate module lists"""
 
 import os
 import re
@@ -67,8 +68,8 @@ if __name__ == "__main__":
             first_module_path = os.path.join(software_path, software_versions[0])
             software_url, software_description = get_module_description(first_module_path)
             HTML_SOURCE_DATA[subdir][soft] = {'versions': [],
-                                           'url': software_url,
-                                           'description': software_description}
+                                              'url': software_url,
+                                              'description': software_description}
             for version in software_versions:
                 HTML_SOURCE_DATA[subdir][soft]['versions'].append(version)
             if software_url in ["", "(none)"]:
diff --git a/test.sh b/test.sh
deleted file mode 100755
index 3705bdd4b9590afab332b5eaee9aa45f414e77b2..0000000000000000000000000000000000000000
--- a/test.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-MODULEBASE="/apps/phi/modules"
-   MODULEPATH=""
-
-    for dir in `ls $MODULEBASE`
-    do
-        # Exclude following directories
-        if [[ ($dir == "all") ]]; then
-            continue
-        fi
-        # In case that it's directory
-        if [ -d $MODULEBASE/$dir ]; then
-            if [ -z $MODULEPATH ]; then
-                MODULEPATH="$MODULEBASE/$dir"
-            else
-                MODULEPATH="$MODULEPATH:$MODULEBASE/$dir"
-            fi
-        fi
-    done
-
-   export MODULEPATH
-
-   ./modules.py