diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index aab847e943a134381cedcfae79e3e833d0e5b18c..5dd2df5015acd41ebcacf066cc2794fa619290dc 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,5 @@
 stages:
+  - license
   - none
   - csm
   - falko
@@ -9,7 +10,43 @@ stages:
   # update apt
   - apt-get update
 
-.build_install_csm_template: &build_install_csm_definition
+.license_header_template: &license_header_definition
+  - cd $CI_PROJECT_DIR
+
+  # configure git
+  - export CI_NEW_BRANCH=ci_processing$CI_COMMIT_SHORT_SHA
+  - git config --global user.email "${CI_EMAIL}"
+  - git config --global user.name "${CI_USERNAME}"
+  - git checkout -b $CI_NEW_BRANCH # temporary branch
+
+  # license headers
+  - export CURRENT_YEAR=$( date +'%Y' )
+  - echo "current year:" ${CURRENT_YEAR}
+  - cd scripts
+  - if [ -f license_header_${CURRENT_YEAR}.txt ]; then
+      # add license headers to new files
+  -   echo "File license_header_${CURRENT_YEAR}.txt already exists. License headers are assumed to be updated. Adding headers to new files..."
+  -   ./license_manager.sh --add --path=${CI_PROJECT_DIR} --license-header=license_header_${CURRENT_YEAR}.txt
+  - else
+      # update license headers of all files
+  -   export PREV_YEAR=$(( CURRENT_YEAR-1 ))
+  -   echo "Creating new file license_header_${CURRENT_YEAR}.txt..."
+  -   git mv license_header_${PREV_YEAR}.txt license_header_${CURRENT_YEAR}.txt
+  -   sed -i "s/${PREV_YEAR}/${PREV_YEAR},${CURRENT_YEAR}/g" license_header_${CURRENT_YEAR}.txt
+  -   ./license_manager.sh --update --path=${CI_PROJECT_DIR} --license-header=license_header_${CURRENT_YEAR}.txt
+  - fi
+  - cd ..
+
+  # push changes (if any)
+  - if git commit -a -m "[skip ci] license headers added or modified" ; then
+  -   git remote set-url --push origin "ssh://git@gitlab.iri.upc.edu:2202/${CI_PROJECT_PATH}.git"
+  -   git push origin $CI_NEW_BRANCH:${CI_COMMIT_REF_NAME}
+  - else
+  -   echo "No changes, nothing to commit!"
+  - fi
+
+.install_csm_template: &install_csm_definition
+  - cd $CI_BUILDS_DIR
   - apt-get install -y libgsl-dev
   - if [ -d csm ]; then
   -   echo "directory csm exists"
@@ -22,9 +59,9 @@ stages:
   - cmake .
   - make -j2
   - make install
-  - cd ..
 
-.build_install_falko_template: &build_install_falko_definition
+.install_falko_template: &install_falko_definition
+  - cd $CI_BUILDS_DIR
   - if [ -d falkolib ]; then
   -   echo "directory falkolib exists" 
   -   cd falkolib
@@ -38,9 +75,9 @@ stages:
   - cmake ..
   - make -j2
   - make install
-  - cd ../..
 
 .build_and_test_template: &build_and_test_definition
+  - cd $CI_PROJECT_DIR
   - mkdir -pv build
   - cd build
   - cmake -DCMAKE_BUILD_TYPE=release -DBUILD_EXAMPLES=ON -DBUILD_TESTS=ON ..
@@ -48,6 +85,15 @@ stages:
   - ctest 
   - make install
 
+############ LICENSE HEADERS ############
+license_headers:
+  stage: license
+  image: labrobotica/wolf_deps:16.04
+  except:
+    - master
+  script:
+    - *license_header_definition
+
 ############ UBUNTU 16.04 TESTS ############
 build_and_test_none:xenial:
   stage: none
@@ -64,10 +110,10 @@ build_and_test_csm:xenial:
   cache:
     - key: csm-xenial
       paths:
-      - csm/
+      - ${CI_BUILDS_DIR}/csm/
   before_script:
     - *preliminaries_definition
-    - *build_install_csm_definition
+    - *install_csm_definition
     - ldconfig # update links (shared libraries)
   script:
     - *build_and_test_definition
@@ -78,10 +124,10 @@ build_and_test_falko:xenial:
   cache:
     - key: falko-xenial
       paths:
-      - falkolib/
+      - ${CI_BUILDS_DIR}/falkolib/
   before_script:
     - *preliminaries_definition
-    - *build_install_falko_definition
+    - *install_falko_definition
     - ldconfig # update links (shared libraries)
   script:
     - *build_and_test_definition
@@ -92,14 +138,14 @@ build_and_test_csm_falko:xenial:
   cache:
     - key: csm-xenial
       paths:
-      - csm/
+      - ${CI_BUILDS_DIR}/csm/
     - key: falko-xenial
       paths:
-      - falkolib/
+      - ${CI_BUILDS_DIR}/falkolib/
   before_script:
     - *preliminaries_definition
-    - *build_install_falko_definition
-    - *build_install_csm_definition
+    - *install_falko_definition
+    - *install_csm_definition
     - ldconfig # update links (shared libraries)
   script:
     - *build_and_test_definition
@@ -120,10 +166,10 @@ build_and_test_csm:bionic:
   cache:
     - key: csm-bionic
       paths:
-      - csm/
+      - ${CI_BUILDS_DIR}/csm/
   before_script:
     - *preliminaries_definition
-    - *build_install_csm_definition
+    - *install_csm_definition
     - ldconfig # update links (shared libraries)
   script:
     - *build_and_test_definition
@@ -134,10 +180,10 @@ build_and_test_falko:bionic:
   cache:
     - key: falko-bionic
       paths:
-      - falkolib/
+      - ${CI_BUILDS_DIR}/falkolib/
   before_script:
     - *preliminaries_definition
-    - *build_install_falko_definition
+    - *install_falko_definition
     - ldconfig # update links (shared libraries)
   script:
     - *build_and_test_definition
@@ -148,14 +194,14 @@ build_and_test_csm_falko:bionic:
   cache:
     - key: csm-bionic
       paths:
-      - csm/
+      - ${CI_BUILDS_DIR}/csm/
     - key: falko-bionic
       paths:
-      - falkolib/
+      - ${CI_BUILDS_DIR}/falkolib/
   before_script:
     - *preliminaries_definition
-    - *build_install_falko_definition
-    - *build_install_csm_definition
+    - *install_falko_definition
+    - *install_csm_definition
     - ldconfig # update links (shared libraries)
   script:
-    - *build_and_test_definition
+    - *build_and_test_definition
\ No newline at end of file