diff --git a/CMakeLists.txt b/CMakeLists.txt
index ccc56d8a708f7c3270277f2c54796656655aacfc..e2ac3d1a2351e05061e897249bee425b774fbbdb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,6 +4,9 @@ cmake_minimum_required (VERSION 2.8)
 project (cell_algorithms)
 enable_language(CXX)
 
+# save incoming CXX flags for forwarding to modparser external project
+set(SAVED_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+
 # compilation flags
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -pthread -Wall")
 
@@ -14,10 +17,25 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS "YES")
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 
+# targets for extermal dependencies
+include(ExternalProject)
+externalproject_add(modparser
+    PREFIX ${CMAKE_BINARY_DIR}/external
+    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external"
+               "-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}"
+               "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
+    BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser"
+    STAMP_DIR  "${CMAKE_BINARY_DIR}/external/"
+    TMP_DIR    "${CMAKE_BINARY_DIR}/external/tmp"
+    SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser"
+    )
+
+
 include_directories(${CMAKE_SOURCE_DIR}/external)
 include_directories(${CMAKE_SOURCE_DIR}/include)
 include_directories(${CMAKE_SOURCE_DIR}/src)
 include_directories(${CMAKE_SOURCE_DIR})
 
+add_subdirectory(mechanisms)
 add_subdirectory(src)
 add_subdirectory(tests)
diff --git a/external/modparser b/external/modparser
index d1dd8fa868c0dc7e348093ed4a4b5c6c94e29e34..dcfb69f8cfc435418dfb95348d613c9830e6ad6f 160000
--- a/external/modparser
+++ b/external/modparser
@@ -1 +1 @@
-Subproject commit d1dd8fa868c0dc7e348093ed4a4b5c6c94e29e34
+Subproject commit dcfb69f8cfc435418dfb95348d613c9830e6ad6f
diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ff2be3e3ea49e4c0871382d0c1e7a1d8a9847aa6
--- /dev/null
+++ b/mechanisms/CMakeLists.txt
@@ -0,0 +1,19 @@
+set(mechanisms pas hh)
+
+set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc")
+
+foreach(mech ${mechanisms})
+    set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod")
+    set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp")
+    message(STATUS "add_cc for ${hpp}")
+    add_custom_command(OUTPUT "${hpp}"
+                       DEPENDS modparser "${mod}"
+                       WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+                       COMMAND "${modcc}" -t cpu -o "${hpp}" "${mod}")
+    set_source_files_properties("${hpp}" PROPERTIES GENERATED TRUE)
+    list(APPEND all_mod_hpps "${hpp}")
+endforeach()
+
+# Fake target to always trigger .mod -> .hpp dependencies because wtf CMake
+add_custom_target(build_all_mods DEPENDS ${all_mod_hpps})
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8a8286bda8e314d47f5e89b2b454bd6b84709e67..125f99dbf7db9a4900b5f402021e23eb463f1677 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,3 +9,5 @@ set(BASE_SOURCES
 )
 
 add_library(cellalgo ${BASE_SOURCES} ${HEADERS})
+add_dependencies(cellalgo build_all_mods)
+