diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1ef531ba09fb84a6a70c1fc8f3c6a79e43f8b6e6
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,104 @@
+stages:
+  - init
+  - test
+  - pages
+
+### Static Badges ###
+version:
+  stage: init
+  tags:
+    - leap
+    - zam347
+    - base
+  only:
+    - master
+    - tags
+  script:
+    - chmod +x ./CI/update_badge.sh
+    - chmod +x ./CI/create_version_badge.sh
+    - ./CI/create_version_badge.sh
+  artifacts:
+    name: pages
+    when: always
+    paths:
+      - badges/
+
+### Tests ###
+tests:
+  tags:
+    - leap
+    - zam347
+    - base
+    - django
+  stage: test
+  variables:
+    FAILURE_THRESHOLD: 90
+  before_script:
+    - chmod +x ./CI/update_badge.sh
+    - ./CI/update_badge.sh > /dev/null
+  script:
+    - pip install -r requirements.txt
+    - chmod +x ./CI/run_pytest.sh
+    - ./CI/run_pytest.sh
+  after_script:
+    - ./CI/update_badge.sh > /dev/null
+  artifacts:
+    name: pages
+    when: always
+    paths:
+      - badges/
+
+coverage:
+  tags:
+    - leap
+    - zam347
+    - base
+    - django
+  stage: test
+  variables:
+    FAILURE_THRESHOLD: 50
+    COVERAGE_PASS_THRESHOLD: 80
+  before_script:
+    - chmod +x ./CI/update_badge.sh
+    - ./CI/update_badge.sh > /dev/null
+  script:
+    - pip install -r requirements.txt
+    - chmod +x ./CI/run_pytest_coverage.sh
+    - ./CI/run_pytest_coverage.sh
+  after_script:
+    - ./CI/update_badge.sh > /dev/null
+  artifacts:
+    name: pages
+    when: always
+    paths:
+      - badges/
+      - coverage/
+
+#### Pages ####
+pages:
+  stage: pages
+  tags:
+    - leap
+    - zam347
+    - base
+  script:
+    - mkdir -p public/badges/
+    - cp -af  badges/badge_*.svg public/badges/
+    - ls public/badges/
+    - mkdir -p public/coverage
+    - cp -af coverage/. public/coverage
+    - ls public/coverage
+    - ls public
+  when: always
+  artifacts:
+    name: pages
+    when: always
+    paths:
+      - public
+      - badges/
+      - coverage/
+  cache:
+    key: old-pages
+    paths:
+      - public/badges/
+      - public/coverage/
diff --git a/CI/create_version_badge.sh b/CI/create_version_badge.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c01bf913073c80f7b838c1a8afe93aa0bcd77fed
--- /dev/null
+++ b/CI/create_version_badge.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+VERSION="$(git describe --tags $(git rev-list --tags --max-count=1))"
+COLOR="blue"
+BADGE_NAME="version"
+
+ls .
+./CI/update_badge.sh -b ${BADGE_NAME} -c ${COLOR} -s ${VERSION}
+
+exit 0
diff --git a/CI/run_pytest.sh b/CI/run_pytest.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4ba24b11a0aa4de7a9f5aca5fe93a4101986d98d
--- /dev/null
+++ b/CI/run_pytest.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# run pytest for all modules
+python3 -m pytest test/ | tee test_results.out
+
+IS_FAILED=$?
+
+# exit 0 if no tests implemented
+RUN_NO_TESTS="$(grep -c 'no tests ran' test_results.out)"
+if [[ ${RUN_NO_TESTS} > 0 ]]; then
+    echo "no test available"
+    echo "incomplete" > status.txt
+    echo "no tests avail" > incomplete.txt
+    exit 0
+fi
+
+# extract if tests passed or not
+TEST_FAILED="$(grep -oP '(\d+\s{1}failed)' test_results.out)"
+TEST_FAILED="$(echo ${TEST_FAILED} | (grep -oP '\d*'))"
+TEST_PASSED="$(grep -oP '\d+\s{1}passed' test_results.out)"
+TEST_PASSED="$(echo ${TEST_PASSED} | (grep -oP '\d*'))"
+if [[ -z "$TEST_FAILED" ]]; then
+    TEST_FAILED=0
+fi
+let "TEST_PASSED=${TEST_PASSED}-${TEST_FAILED}"
+
+# calculate metrics
+let "SUM=${TEST_FAILED}+${TEST_PASSED}"
+let "TEST_PASSED_RATIO=${TEST_PASSED}*100/${SUM}"
+
+# report
+if [[ ${IS_FAILED} == 0 ]]; then
+    if [[ ${TEST_PASSED_RATIO} -lt 100 ]]; then
+        echo "only ${TEST_PASSED_RATIO}% passed"
+        echo "incomplete" > status.txt
+        echo "${TEST_PASSED_RATIO}%25 passed" > incomplete.txt
+        if [[ ${TEST_PASSED_RATIO} -lt ${FAILURE_THRESHOLD} ]]; then
+            echo -e "\033[1;31monly ${TEST_PASSED_RATIO}% passed!!\033[0m"
+            exit 1
+        fi
+    else
+        echo "passed"
+        echo "success" > status.txt
+    fi
+    exit 0
+else
+    echo "not passed"
+    exit 1
+fi
diff --git a/CI/run_pytest_coverage.sh b/CI/run_pytest_coverage.sh
new file mode 100644
index 0000000000000000000000000000000000000000..2157192d49a15baa048968b799aa264941152c1b
--- /dev/null
+++ b/CI/run_pytest_coverage.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# run coverage twice, 1) for html deploy 2) for success evaluation
+python3 -m pytest --cov=src --cov-report html test/
+python3 -m pytest --cov=src --cov-report term test/ | tee coverage_results.out
+
+IS_FAILED=$?
+
+# move html coverage report
+mkdir coverage/
+BRANCH_NAME=$( echo -e "${CI_COMMIT_REF_NAME////_}")
+mkdir coverage/${BRANCH_NAME}
+mkdir coverage/recent
+cp -r htmlcov/* coverage/${BRANCH_NAME}/.
+cp -r htmlcov/* coverage/recent/.
+if [[ "${CI_COMMIT_REF_NAME}" = "master" ]]; then
+    cp -r htmlcov/* coverage/.
+fi
+
+# extract coverage information
+COVERAGE_RATIO="$(grep -oP '\d+\%' coverage_results.out | tail -1)"
+COVERAGE_RATIO="$(echo ${COVERAGE_RATIO} | (grep -oP '\d*'))"
+
+# report
+if [[ ${IS_FAILED} == 0 ]]; then
+    if [[ ${COVERAGE_RATIO} -lt ${COVERAGE_PASS_THRESHOLD} ]]; then
+        echo "only ${COVERAGE_RATIO}% covered"
+        echo "incomplete" > status.txt
+        echo "${COVERAGE_RATIO}%25" > incomplete.txt
+        if [[ ${COVERAGE_RATIO} -lt ${FAILURE_THRESHOLD} ]]; then
+            echo -e "\033[1;31monly ${COVERAGE_RATIO}% covered!!\033[0m"
+            exit 1
+        fi
+    else
+        echo "passed"
+        echo "success" > status.txt
+        echo "${COVERAGE_RATIO}%25" > success.txt
+    fi
+    exit 0
+else
+    echo "not passed"
+    exit 1
+fi
diff --git a/CI/update_badge.sh b/CI/update_badge.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c8b11015d27f509faeb4b26b5d88ec7df5a4e675
--- /dev/null
+++ b/CI/update_badge.sh
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# 'running', 'success' or 'failure' is in this file
+if [[ -e status.txt ]]; then
+  EXIT_STATUS=`cat status.txt`
+else
+  EXIT_STATUS="running"
+fi
+
+printf "%s\n" ${EXIT_STATUS}
+
+# fetch badge_status
+BADGE_STATUS="${CI_COMMIT_REF_NAME}:${CI_JOB_NAME}"
+# replace - with --
+BADGE_STATUS=$( echo -e "${BADGE_STATUS//\-/--}")
+
+
+# Set values for shields.io fields based on STATUS
+if [[ ${EXIT_STATUS} = "running" ]]; then
+	BADGE_SUBJECT="running"
+	BADGE_COLOR="lightgrey"
+elif [[ ${EXIT_STATUS} = "failure" ]]; then
+	BADGE_SUBJECT="failed"
+	BADGE_COLOR="red"
+elif [[ ${EXIT_STATUS} = "success" ]]; then
+	BADGE_SUBJECT="passed"
+	BADGE_COLOR="brightgreen"
+	if [[ -e success.txt ]]; then
+	    SUCCESS_MESSAGE=`cat success.txt`
+	    BADGE_SUBJECT="${SUCCESS_MESSAGE}"
+	fi
+elif [[ ${EXIT_STATUS} = "incomplete" ]]; then
+    EXIT_STATUS_MESSAGE=`cat incomplete.txt`
+    BADGE_SUBJECT="${EXIT_STATUS_MESSAGE}"
+    EXIT_STATUS_RATIO="$(echo ${EXIT_STATUS_MESSAGE} | (grep -oP '\d*') | head -1)"
+    printf "%s\n" ${EXIT_STATUS_RATIO}
+    if [[ "${EXIT_STATUS_RATIO}" -lt "${FAILURE_THRESHOLD}" ]]; then
+        BADGE_COLOR="red"
+    else
+        BADGE_COLOR="yellow"
+    fi
+else
+	exit 1
+fi
+
+# load additional options
+while getopts b:c:s: option
+do
+  case ${option} in
+    b) BADGE_STATUS=$( echo -e "${OPTARG//\-/--}");;
+    c) BADGE_COLOR=$( echo -e "${OPTARG//\-/--}");;
+    s) BADGE_SUBJECT=$( echo -e "${OPTARG//\-/--}");;
+  esac
+done
+
+
+# Set filename for the badge (i.e. 'ci-test-branch-job.svg')
+CI_COMMIT_REF_NAME_NO_SLASH="$( echo -e "${CI_COMMIT_REF_NAME}" | tr  '/' '_'  )"
+if [[ ${BADGE_STATUS} = "version" ]]; then
+    BADGE_FILENAME="badge_version.svg"
+else
+    BADGE_FILENAME="badge_${CI_COMMIT_REF_NAME_NO_SLASH}-${CI_JOB_NAME}.svg"
+fi
+RECENT_BADGE_FILENAME="badge_recent-${CI_JOB_NAME}.svg"
+
+# Get the badge from shields.io
+SHIELDS_IO_NAME=${BADGE_STATUS}-${BADGE_SUBJECT}-${BADGE_COLOR}.svg
+printf  "%s\n" "INFO: Fetching badge ${SHIELDS_IO_NAME} from shields.io to ${BADGE_FILENAME}."
+printf  "%s\n" "${SHIELDS_IO_NAME//\_/__}"
+printf  "%s\n" "${SHIELDS_IO_NAME//\#/%23}"
+
+SHIELDS_IO_NAME="$( echo -e "${SHIELDS_IO_NAME//\_/__}" )"
+SHIELDS_IO_NAME="$( echo -e "${SHIELDS_IO_NAME//\#/%23}")"
+curl "https://img.shields.io/badge/${SHIELDS_IO_NAME}" > ${BADGE_FILENAME}
+echo "https://img.shields.io/badge/${SHIELDS_IO_NAME}"
+SHIELDS_IO_NAME_RECENT="RECENT:${SHIELDS_IO_NAME}"
+curl "https://img.shields.io/badge/${SHIELDS_IO_NAME_RECENT}" > ${RECENT_BADGE_FILENAME}
+echo "${SHIELDS_IO_NAME_RECENT}" > testRecentName.txt
+
+#
+if [[ ! -d ./badges ]]; then
+  # Control will enter here if $DIRECTORY doesn't exist.
+  mkdir badges/
+fi
+mv ${BADGE_FILENAME} ./badges/.
+
+# replace outdated recent badge by new badge
+mv ${RECENT_BADGE_FILENAME} ./badges/${RECENT_BADGE_FILENAME}
+
+# set status to failed, this will be overwritten if job ended with exitcode 0
+echo "failed" > status.txt
+
+exit 0
diff --git a/src/inception_model.py b/src/inception_model.py
index 09e032ca70a8e63d9459464e968d25fac29cd4f1..64b5e09674dd9fccd8282b80c4fb9e87bbd5ea5c 100644
--- a/src/inception_model.py
+++ b/src/inception_model.py
@@ -124,7 +124,7 @@ class InceptionModelBase:
         tower = pooling(pool_kernel, strides=(1, 1), padding='same', name=block_name+block_type)(input_x)
 
         # convolution block
-        tower = Conv2D(tower_filter, (1, 1), padding='same', name=block_name+"1x1")(tower)
+        tower = layers.Conv2D(tower_filter, (1, 1), padding='same', name=block_name+"1x1")(tower)
         tower = self.act(tower, activation, **act_settings)
 
         return tower