diff --git a/.clang-format b/.clang-format
index 91e0be37c04b8040c9da9b621dc1a3c7407c0bab..3a7da5486db39480f64c08770bdecaa63dfc478e 100644
--- a/.clang-format
+++ b/.clang-format
@@ -2,8 +2,7 @@ Language:      Cpp
 BasedOnStyle:  LLVM
 AccessModifierOffset: -2
 AlignConsecutiveAssignments: true
-# Waiting for clang-format-3.9
-# AlignConsecutiveDeclarations: true
+AlignConsecutiveDeclarations: true
 AlignEscapedNewlinesLeft: false
 AlignTrailingComments: true
 AllowAllParametersOfDeclarationOnNextLine: true
@@ -43,6 +42,10 @@ SpacesBeforeTrailingComments: 1
 SpacesInAngles:  false
 SpacesInCStyleCastParentheses: false
 SpacesInParentheses: true
+# Waiting for clang-5
+# SplitEmptyFunction: false
+# SplitEmptyRecord: false
+# SplitEmptyNamespace: false
 Standard:        Cpp11
 TabWidth:        8
 UseTab:          Never
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 428b063b7abf90537bffd9f331017fd1a5c638e1..c991e1ea556aa7bf2f1e6bfdfb66620c3af9d6bd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,34 +6,73 @@ stages:
 image: gitlab-registry.cern.ch/lhcb-core/lbdocker/centos7-build
 
 variables:
-  NO_LBLOGIN: 1
+  NO_LBLOGIN: "1"
+  CLANG_FORMAT_VERSION: "3.9"
+  BINARY_TAG: "x86_64-centos7-gcc7-opt"
+  LCG_hostos: "x86_64-centos7"
+  LCG_release_area: "/cvmfs/sft.cern.ch/lcg/releases"
+  BUILDDIR: "build"
+  TESTS_REPORT: "test_report"
 
 before_script:
-  - export BINARY_TAG=x86_64-centos7-gcc7-opt
-  - export LCG_hostos=x86_64-centos7
   - export PATH=/cvmfs/sft.cern.ch/lcg/contrib/CMake/3.8.1/Linux-x86_64/bin:/cvmfs/sft.cern.ch/lcg/contrib/ninja/1.7.1/x86_64-slc6:/cvmfs/sft.cern.ch/lcg/releases/Python/2.7.13-597a5/${BINARY_TAG}/bin:${PATH}
-  - export LCG_release_area=/cvmfs/sft.cern.ch/lcg/releases
   - export PATH=/cvmfs/lhcb.cern.ch/lib/lhcb/LBSCRIPTS/dev/InstallArea/scripts:${PATH}
   - export PYTHONPATH=/cvmfs/lhcb.cern.ch/lib/lhcb/LBSCRIPTS/dev/InstallArea/python:${PYTHONPATH}
-  - export CMAKE_PREFIX_PATH=/cvmfs/sft.cern.ch/lcg/releases:/cvmfs/projects.cern.ch/intelsw/psxe/linux/x86_64/2017/vtune_amplifier_xe
+  - export CMAKE_PREFIX_PATH=${LCG_release_area}:/cvmfs/projects.cern.ch/intelsw/psxe/linux/x86_64/2017/vtune_amplifier_xe
   - export CCACHE_DIR=${PWD}/.ccache
-  - export CCACHE_CPP2=1
 
 build:
   tags:
     - cvmfs
   stage: build
   script:
-    - curl -o artifacts.zip --location ${CI_PROJECT_URL}/builds/artifacts/master/download?job=build
+    - curl -o artifacts.zip --location ${CI_PROJECT_URL}/-/jobs/artifacts/master/download?job=${CI_JOB_NAME}
     - unzip -q artifacts.zip '.ccache/*' || true
     - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -z
     - echo 'set(CMAKE_USE_CCACHE ON CACHE BOOL "")' >> cache_preload.cmake
-    - echo 'set(clang_format_cmd "'$(which lcg-clang-format-3.9)'" CACHE FILEPATH "")' >> cache_preload.cmake
-    - make BUILDDIR=build
+    - echo 'set(clang_format_cmd "'$(which lcg-clang-format-${CLANG_FORMAT_VERSION})'" CACHE FILEPATH "")' >> cache_preload.cmake
+    - make BUILDDIR=${BUILDDIR}
+    - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -s
+  artifacts:
+    paths:
+      - ${BUILDDIR}
+      - .ccache
+    expire_in: 1 week
+
+build-gcc62:
+  tags:
+    - cvmfs
+  stage: build
+  variables:
+    BINARY_TAG: x86_64-centos7-gcc62-opt
+    BUILDDIR: build-gcc62
+  script:
+    - curl -o artifacts.zip --location ${CI_PROJECT_URL}/-/jobs/artifacts/master/download?job=${CI_JOB_NAME}
+    - unzip -q artifacts.zip '.ccache/*' || true
+    - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -z
+    - echo 'set(CMAKE_USE_CCACHE ON CACHE BOOL "")' >> cache_preload.cmake
+    - echo 'set(clang_format_cmd "'$(which lcg-clang-format-${CLANG_FORMAT_VERSION})'" CACHE FILEPATH "")' >> cache_preload.cmake
+    - make BUILDDIR=${BUILDDIR}
+    - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -s
+  artifacts:
+    paths:
+      - ${BUILDDIR}
+      - .ccache
+    expire_in: 1 week
+
+test_headers:
+  tags:
+    - cvmfs
+  stage: test
+  script:
+    - curl -o artifacts.zip --location ${CI_PROJECT_URL}/-/jobs/artifacts/master/download?job=${CI_JOB_NAME}
+    - unzip -q artifacts.zip '.ccache/*' || true
+    - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -z
+    - export LCG_release_area=${LCG_release_area}:/cvmfs/lhcb.cern.ch/lib/lcg/external
+    - make BUILDDIR=${BUILDDIR} test_public_headers_build
     - /cvmfs/sft.cern.ch/lcg/releases/ccache/3.3.4-e92e5/${BINARY_TAG}/bin/ccache -s
   artifacts:
     paths:
-      - build
       - .ccache
     expire_in: 1 week
 
@@ -43,10 +82,24 @@ coding-conventions:
   stage: test
   script:
     - export LCG_release_area=${LCG_release_area}:/cvmfs/lhcb.cern.ch/lib/lcg/external
-    - sudo pip install autopep8
-    - make BUILDDIR=build apply-formatting
-    - git diff > apply-formatting.patch
-    - git diff --stat --exit-code
+    - sudo pip install autopep8==1.3.5
+    - make BUILDDIR=${BUILDDIR} configure
+    - git fetch https://gitlab.cern.ch/gaudi/Gaudi.git master
+    - git diff --name-only --no-renames --diff-filter MA FETCH_HEAD..HEAD | grep -E '\.(h|i?cpp|py)$' |
+      xargs --no-run-if-empty ${BUILDDIR}/apply-formatting || true
+    - "echo \"From: Gitlab CI <noreply@cern.ch>\" > apply-formatting.patch"
+    - "echo \"Date: $(date -R)\" >> apply-formatting.patch"
+    - "echo \"Subject: [PATCH] Fixed formatting\" >> apply-formatting.patch"
+    - echo "" >> apply-formatting.patch
+    - echo "patch generated by ${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}" >> apply-formatting.patch
+    - echo "" >> apply-formatting.patch
+    - echo "" >> apply-formatting.patch
+    - git diff >> apply-formatting.patch
+    - git diff --stat --exit-code || (
+      echo -e "\n=======================================\n You can fix formatting with:\n\n"
+      "  curl ${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/apply-formatting.patch | git am"
+      "\n\n=======================================" ; false
+      )
   artifacts:
     paths:
       - apply-formatting.patch
@@ -59,10 +112,10 @@ doxygen:
   stage: test
   script:
     - find build -type f -exec touch -d $(date +@%s) \{} \;
-    - make BUILDDIR=build doc
+    - make BUILDDIR=${BUILDDIR} doc
     - rm -rf public
     - mkdir -p public/doxygen
-    - mv build/doxygen/html ${CI_COMMIT_REF_SLUG}
+    - mv ${BUILDDIR}/doxygen/html ${CI_COMMIT_REF_SLUG}
     - zip -r -q public/doxygen/${CI_COMMIT_REF_SLUG}.zip ${CI_COMMIT_REF_SLUG}
   only:
     - master
@@ -77,22 +130,50 @@ test:
     - cvmfs
   stage: test
   script:
-    - find build -type f -exec touch -d $(date +@%s) \{} \;
-    - mkdir -p build/html
-    - ( make BUILDDIR=build test ARGS='-j4' || touch build/html/tests_failed ) | tee build/ctest.log
-    - mv build/html test_report
-    - mv build/ctest.log test_report
-    - mv build/Testing test_report
-    - if [ -e test_report/tests_failed ] ; then
+    - find ${BUILDDIR} -type f -exec touch -d $(date +@%s) \{} \;
+    - mkdir -p ${BUILDDIR}/html
+    - ( make BUILDDIR=${BUILDDIR} test ARGS='-j4' || touch ${BUILDDIR}/html/tests_failed ) | tee ${BUILDDIR}/ctest.log
+    - mv ${BUILDDIR}/html ${TESTS_REPORT}
+    - mv ${BUILDDIR}/ctest.log ${TESTS_REPORT}
+    - mv ${BUILDDIR}/Testing ${TESTS_REPORT}
+    - if [ -e ${TESTS_REPORT}/tests_failed ] ; then
+    # this prints all lines starting with a white space after and including "The following tests...", excluding lines with "Not Run"
+    -   echo "================================================================================"
+    -   awk '/^[^[:space:]]/{do_print=0}; /The following tests FAILED:/{do_print=1}; do_print&&!/Not Run/{print}' ${TESTS_REPORT}/ctest.log
+    -   echo "================================================================================"
+    -   exit 1
+    - fi
+  artifacts:
+    paths:
+      - ${TESTS_REPORT}
+    when: always
+    expire_in: 1 week
+
+test-gcc62:
+  tags:
+    - cvmfs
+  stage: test
+  variables:
+    BINARY_TAG: x86_64-centos7-gcc62-opt
+    BUILDDIR: build-gcc62
+    TESTS_REPORT: test_report-gcc62
+  script:
+    - find ${BUILDDIR} -type f -exec touch -d $(date +@%s) \{} \;
+    - mkdir -p ${BUILDDIR}/html
+    - ( make BUILDDIR=${BUILDDIR} test ARGS='-j4' || touch ${BUILDDIR}/html/tests_failed ) | tee ${BUILDDIR}/ctest.log
+    - mv ${BUILDDIR}/html ${TESTS_REPORT}
+    - mv ${BUILDDIR}/ctest.log ${TESTS_REPORT}
+    - mv ${BUILDDIR}/Testing ${TESTS_REPORT}
+    - if [ -e ${TESTS_REPORT}/tests_failed ] ; then
     # this prints all lines starting with a white space after and including "The following tests...", excluding lines with "Not Run"
     -   echo "================================================================================"
-    -   awk '/^[^[:space:]]/{do_print=0}; /The following tests FAILED:/{do_print=1}; do_print&&!/Not Run/{print}' test_report/ctest.log
+    -   awk '/^[^[:space:]]/{do_print=0}; /The following tests FAILED:/{do_print=1}; do_print&&!/Not Run/{print}' ${TESTS_REPORT}/ctest.log
     -   echo "================================================================================"
     -   exit 1
     - fi
   artifacts:
     paths:
-      - test_report
+      - ${TESTS_REPORT}
     when: always
     expire_in: 1 week