diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9f8c3209b7a9bae43cbbe6643fefc1919dd8c43a..a770f614b52030c300ed2f64c6414190906eee4b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -56,6 +56,8 @@ find_package(FairRoot)
 
 # Load some basic macros which are needed later on
 include(CbmMacros)
+include(CbmTargets)
+include(CbmGenerateConfig)
 include(FairMacros)
 include(WriteConfigFile)
 include(CTest)
@@ -340,118 +342,24 @@ EndIf()
 
 add_subdirectory(tutorials)
 
-add_custom_target(cleanlib
-                  COMMAND ${CMAKE_COMMAND} -E remove libCbm*
-                  COMMAND ${CMAKE_COMMAND} -E remove G__Cbm*
-                  WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
-                 )
-
-add_custom_target(cleantest
-                  COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/scripts/cleantest.cmake
-                 )
-
-find_package2(PRIVATE ClangFormat)
-if(ClangFormat_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
-  if (FAIRROOT_FORMAT_BASE)
-    set(BASE_COMMIT ${FAIRROOT_FORMAT_BASE})
-  else()
-    set(BASE_COMMIT upstream/master)
-  endif()
-
-  if (FAIRROOT_GIT_CLANG_FORMAT_BIN)
-    set(GIT_CLANG_FORMAT_BIN ${FAIRROOT_GIT_CLANG_FORMAT_BIN})
-  else()
-    set(GIT_CLANG_FORMAT_BIN git-clang-format)
-  endif()
-
-  # Create a list C, C++ and header files which have been changed in the
-  # current commit
-  execute_process(COMMAND ${CMAKE_SOURCE_DIR}/cmake/scripts/find_files.sh
-                  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                  OUTPUT_VARIABLE FileList
-                  OUTPUT_STRIP_TRAILING_WHITESPACE
-                 )
-  string(REGEX REPLACE " " ";" FileList "${FileList}")
-
-  # Loop over the files and create the code whch is executed when running
-  # "make FormatCheck".
-  # The produced code will run clang-format on one of the files. If
-  # clang-format finds code which are not satisfying our code rules a
-  # detailed error message is created. This error message can be checked on
-  # our CDash web page.
-  foreach(file ${FileList})
-    set(file1 ${CMAKE_BINARY_DIR}/${file}.cf_out)
-
-    list(APPEND myfilelist ${file1})
-    add_custom_command(OUTPUT ${file1}
-                       COMMAND ${CMAKE_SOURCE_DIR}/cmake/scripts/check-format-1.sh ${file} ${file1}
-                       WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                      )
-  endforeach()
-
-  # Create the target FormatCheck which only depends on the files creted in
-  # previous step. When running "make FormatCheck" clang-format is executed
-  # for all C, C++ and header files which have changed in the commit.
-  add_custom_target(FormatCheck
-                     DEPENDS ${myfilelist}
-                    )
-
-endif()
-
 Option(BUILD_DOXYGEN "Build Doxygen" OFF)
 if(BUILD_DOXYGEN)
   MESSAGE(STATUS "*** Building the Doxygen documentaion ***")
   ADD_SUBDIRECTORY(doxygen)
 endif(BUILD_DOXYGEN)
 
-if(RULE_CHECKER_FOUND)
-
-  ADD_CUSTOM_TARGET(RULES
-     COMMAND ${RULE_CHECKER_SCRIPT1} ${CMAKE_BINARY_DIR} viol > violations.html
-     DEPENDS $ENV{ALL_RULES})
-
-endif(RULE_CHECKER_FOUND)
-
-if(IWYU_FOUND)
-
-  ADD_CUSTOM_TARGET(checkHEADERS
-     DEPENDS $ENV{ALL_HEADER_RULES}
-  )
-
-endif(IWYU_FOUND)
-
-WRITE_CONFIG_FILE(config.sh)
-WRITE_CONFIG_FILE(config.csh)
-
-SET(ROOT_INCLUDE_PATH 
-    ${ROOT_INCLUDE_PATH} 
-    "${CMAKE_INSTALL_PREFIX}/include" 
-    "${CMAKE_INSTALL_PREFIX}/include/mvd"
-    "${CMAKE_INSTALL_PREFIX}/include/littrack"
-    "${CMAKE_INSTALL_PREFIX}/include/KF"
-    "${CMAKE_INSTALL_PREFIX}/include/AnalysisTree"
-    "${CMAKE_INSTALL_PREFIX}/include/AnalysisTreeQA"
-   )
-set(CMAKE_INSTALL_LIBDIR lib)
-SET(VMCWORKDIR ${CMAKE_INSTALL_PREFIX}/share/cbmroot)
-WRITE_CONFIG_FILE(config.sh_install)
-WRITE_CONFIG_FILE(config.csh_install)
-
-Install(FILES ${CMAKE_BINARY_DIR}/config.sh_install
-        DESTINATION bin
-        RENAME CbmRootConfig.sh
-       )
-
-Install(FILES ${CMAKE_BINARY_DIR}/check_system.sh
-        DESTINATION bin
-       )
-
-Install(FILES ${CMAKE_BINARY_DIR}/config.csh_install
-        DESTINATION bin
-        RENAME CbmRootConfig.csh
-       )
+# Definde additional targets 
+# cleanlib: rm al Cbm libraries and dictionaries
+# cleantest: remove all files from build directory created when running ROOT macros
+# FormatCheck: execute clang-format for all changed files (needed for CI) 
+define_additional_targets()
 
+# generate the needed config files to run macros from build and 
+# installation directories. The later will be installed into the
+# install directory
+generate_config_files()
 
+# install the parameters, geometries and input directories
 Install(DIRECTORY geometry input parameters
         DESTINATION share/cbmroot
         PATTERN ".git" EXCLUDE)
diff --git a/cmake/modules/CbmGenerateConfig.cmake b/cmake/modules/CbmGenerateConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..73519f91a8d3cc209b8663407531ea7bf6c8d777
--- /dev/null
+++ b/cmake/modules/CbmGenerateConfig.cmake
@@ -0,0 +1,38 @@
+macro(generate_config_files)
+
+  # generate config files used for build directory
+  WRITE_CONFIG_FILE(config.sh)
+  WRITE_CONFIG_FILE(config.csh)
+
+  # generate config files used for installation directory 
+  SET(ROOT_INCLUDE_PATH 
+      ${ROOT_INCLUDE_PATH} 
+      "${CMAKE_INSTALL_PREFIX}/include" 
+      "${CMAKE_INSTALL_PREFIX}/include/mvd"
+      "${CMAKE_INSTALL_PREFIX}/include/littrack"
+      "${CMAKE_INSTALL_PREFIX}/include/KF"
+      "${CMAKE_INSTALL_PREFIX}/include/AnalysisTree"
+      "${CMAKE_INSTALL_PREFIX}/include/AnalysisTreeQA"
+     )
+
+  set(CMAKE_INSTALL_LIBDIR lib)
+  SET(VMCWORKDIR ${CMAKE_INSTALL_PREFIX}/share/cbmroot)
+
+  WRITE_CONFIG_FILE(config.sh_install)
+  WRITE_CONFIG_FILE(config.csh_install)
+
+  Install(FILES ${CMAKE_BINARY_DIR}/config.sh_install
+          DESTINATION bin
+          RENAME CbmRootConfig.sh
+         )
+
+  Install(FILES ${CMAKE_BINARY_DIR}/check_system.sh
+          DESTINATION bin
+         )
+
+  Install(FILES ${CMAKE_BINARY_DIR}/config.csh_install
+          DESTINATION bin
+          RENAME CbmRootConfig.csh
+         )
+
+endmacro()
diff --git a/cmake/modules/CbmTargets.cmake b/cmake/modules/CbmTargets.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..ab37a0728e2674256e49db1d51aa91e91c9b4bca
--- /dev/null
+++ b/cmake/modules/CbmTargets.cmake
@@ -0,0 +1,77 @@
+macro(define_additional_targets)
+
+  add_custom_target(cleanlib
+                    COMMAND ${CMAKE_COMMAND} -E remove libCbm*
+                    COMMAND ${CMAKE_COMMAND} -E remove G__Cbm*
+                    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
+                   )
+
+  add_custom_target(cleantest
+                    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/scripts/cleantest.cmake
+                   )
+
+  find_package2(PRIVATE ClangFormat)
+  if(ClangFormat_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
+    if (FAIRROOT_FORMAT_BASE)
+      set(BASE_COMMIT ${FAIRROOT_FORMAT_BASE})
+    else()
+      set(BASE_COMMIT upstream/master)
+    endif()
+
+    if (FAIRROOT_GIT_CLANG_FORMAT_BIN)
+      set(GIT_CLANG_FORMAT_BIN ${FAIRROOT_GIT_CLANG_FORMAT_BIN})
+    else()
+      set(GIT_CLANG_FORMAT_BIN git-clang-format)
+    endif()
+
+    # Create a list C, C++ and header files which have been changed in the
+    # current commit
+    execute_process(COMMAND ${CMAKE_SOURCE_DIR}/cmake/scripts/find_files.sh
+                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                    OUTPUT_VARIABLE FileList
+                    OUTPUT_STRIP_TRAILING_WHITESPACE
+                   )
+    string(REGEX REPLACE " " ";" FileList "${FileList}")
+
+    # Loop over the files and create the code whch is executed when running
+    # "make FormatCheck".
+    # The produced code will run clang-format on one of the files. If
+    # clang-format finds code which are not satisfying our code rules a
+    # detailed error message is created. This error message can be checked on
+    # our CDash web page.
+    foreach(file ${FileList})
+      set(file1 ${CMAKE_BINARY_DIR}/${file}.cf_out)
+
+      list(APPEND myfilelist ${file1})
+      add_custom_command(OUTPUT ${file1}
+                         COMMAND ${CMAKE_SOURCE_DIR}/cmake/scripts/check-format-1.sh ${file} ${file1}
+                         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                        )
+    endforeach()
+
+    # Create the target FormatCheck which only depends on the files creted in
+    # previous step. When running "make FormatCheck" clang-format is executed
+    # for all C, C++ and header files which have changed in the commit.
+    add_custom_target(FormatCheck
+                      DEPENDS ${myfilelist}
+                      )
+
+  endif()
+
+# TODO: check if still needed
+#  if(RULE_CHECKER_FOUND)
+#    ADD_CUSTOM_TARGET(RULES
+#       COMMAND ${RULE_CHECKER_SCRIPT1} ${CMAKE_BINARY_DIR} viol > violations.html
+#       DEPENDS $ENV{ALL_RULES})
+#  endif(RULE_CHECKER_FOUND)
+
+
+#  find_package(IWYU)
+if(IWYU_FOUND)
+
+  ADD_CUSTOM_TARGET(checkHEADERS
+     DEPENDS $ENV{ALL_HEADER_RULES}
+  )
+endif(IWYU_FOUND)
+
+endmacro()