diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca6d0df1c8b00617041e5994e9bf4a2903ddbf12..640161747aa1efc9146900a5c0c27d0e17cdc874 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,53 +1,26 @@
+#####################
+### OGS-6 Project ###
+#####################
+
 # Specify minimum CMake version
 cmake_minimum_required(VERSION 2.6)
 
 # Project name
 project( OGS-6 )
 
-# Set cmake module path
-SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
-  "${CMAKE_SOURCE_DIR}/scripts/cmake/cmake"
-  "${CMAKE_SOURCE_DIR}/scripts/cmake")
-
-INCLUDE(GetCompilerInfoString)
-
-# Finds
-FIND_PACKAGE(OpenMP)
-IF(OPENMP_FOUND)
-	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-ENDIF()
-
-### For GNU C/CXX
-IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
-		get_gcc_version(GCC_VERSION)
-        IF( NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
-                MESSAGE(STATUS "Set GCC release flags")
-				IF(APPLE AND GCC_VERSION VERSION_LESS "4.3" AND NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode" )
-					# -march=native does not work here when on normal gcc compiler
-					# see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33144
-					SET(CMAKE_CXX_FLAGS "-O3 -mtune=native -msse4.2 -DNDEBUG")
-				ELSE()
-                	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -march=native -mtune=native -msse4.2 -DNDEBUG")
-				ENDIF()
-        ENDIF()
-        # -g
-        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wall -Wextra -fno-nonansi-builtins")
-        ADD_DEFINITIONS(
-                -DGCC
-        )
-ENDIF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+### CMake includes ###
+INCLUDE(scripts/cmake/CMakeSetup.cmake)
+INCLUDE(scripts/cmake/CompilerSetup.cmake)
+INCLUDE(scripts/cmake/Find.cmake)
 
-IF (${CMAKE_C_COMPILER} MATCHES "icc.*$" OR ${CMAKE_CXX_COMPILER} MATCHES "icpc.*$") 
-        IF( NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
-                MESSAGE(STATUS "Set Intel release flags")
-                SET(CMAKE_CXX_FLAGS "-O3 -DNDEBUG")
-        ENDIF()
-        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wall")
-        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -openmp")
-ENDIF(${CMAKE_C_COMPILER} MATCHES "icc.*$" OR ${CMAKE_CXX_COMPILER} MATCHES
-"icpc.*$")
+###############
+### Options ###
+###############
 
+# Profiling
+IF((CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC) AND GPROF_PATH)
+	OPTION(OGS_PROFILE "Enables compiling with flags set for profiling with gprof." OFF)
+ENDIF() # GCC AND GPROF_PATH
 
 # Set build directories
 SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin )
diff --git a/scripts/cmake/CMakeSetup.cmake b/scripts/cmake/CMakeSetup.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..0deb262cf768e6e66beecba97eda144ea824c8b6
--- /dev/null
+++ b/scripts/cmake/CMakeSetup.cmake
@@ -0,0 +1,18 @@
+# Set additional CMake modules path
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+  "${CMAKE_SOURCE_DIR}/scripts/cmake/cmake"
+  "${CMAKE_SOURCE_DIR}/scripts/cmake")
+
+# Load addional modules
+INCLUDE(UseBackportedModules)
+INCLUDE(OptionRequires)
+INCLUDE(CppcheckTargets)
+INCLUDE(GetCompilerInfoString)
+
+# Suppress warning on setting policies
+CMAKE_POLICY(SET CMP0011 OLD)
+
+# Suppress warning on add_subdirectory(dir) where dir contains no CMakeLists.txt
+IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.7)
+	CMAKE_POLICY(SET CMP0014 OLD)
+ENDIF ()
diff --git a/scripts/cmake/CompilerSetup.cmake b/scripts/cmake/CompilerSetup.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..a8beb71af657177de51e4cdfe038e6c6f0cda4e7
--- /dev/null
+++ b/scripts/cmake/CompilerSetup.cmake
@@ -0,0 +1,61 @@
+INCLUDE(ResetConfigurations)        # To Debug, Release, RelWithDbgInfo
+INCLUDE(SetDefaultBuildType)
+SET_DEFAULT_BUILD_TYPE(Debug)
+INCLUDE(MSVCMultipleProcessCompile) # /MP switch (multi processor) for VS
+
+### GNU C/CXX compiler
+IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+		get_gcc_version(GCC_VERSION)
+        IF( NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
+                MESSAGE(STATUS "Set GCC release flags")
+				IF(APPLE AND GCC_VERSION VERSION_LESS "4.3" AND NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode" )
+					# -march=native does not work here when on normal gcc compiler
+					# see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33144
+					SET(CMAKE_CXX_FLAGS "-O3 -mtune=native -msse4.2 -DNDEBUG")
+				ELSE()
+                	SET(CMAKE_CXX_FLAGS "-O3 -march=native -mtune=native -msse4.2 -DNDEBUG")
+				ENDIF()
+        ENDIF()
+        # -g
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wall -Wextra -fno-nonansi-builtins")
+        ADD_DEFINITIONS( -DGCC )
+ENDIF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+
+### Intel compiler
+IF (${CMAKE_C_COMPILER} MATCHES "icc.*$" OR ${CMAKE_CXX_COMPILER} MATCHES "icpc.*$")
+        IF( NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
+                MESSAGE(STATUS "Set Intel release flags")
+                SET(CMAKE_CXX_FLAGS "-O3 -DNDEBUG")
+        ENDIF()
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wall")
+        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -openmp")
+ENDIF(${CMAKE_C_COMPILER} MATCHES "icc.*$" OR ${CMAKE_CXX_COMPILER} MATCHES
+"icpc.*$")
+
+# Profiling
+IF (OGS_PROFILE)
+	IF( NOT CMAKE_BUILD_TYPE STREQUAL "Release" )
+		MESSAGE(STATUS "When using profiling you should set CMAKE_BUILD_TYPE to Release.")
+	ENDIF()
+	SET(PROFILE_FLAGS "-pg -fno-omit-frame-pointer -O2 -DNDEBUG")
+	# clang compiler does not know the following flags
+	IF(CMAKE_CXX_COMPILER MATCHES "!clang")
+		SET(PROFILE_FLAGS "${PROFILE_FLAGS} -fno-inline-functions-called-once -fno-optimize-sibling-calls")
+	ENDIF()
+	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PROFILE_FLAGS}")
+ENDIF (OGS_PROFILE)
+
+### Windows
+IF (WIN32)
+	## For Visual Studio compiler
+	IF (MSVC)
+		ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS
+			-D_CRT_XNONSTDC_NO_WARNINGS)
+		# Sets warning level 3 and ignores some warnings
+		SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /wd4290 /wd4267")
+	# cygwin
+	ELSE (MSVC)
+		MESSAGE (STATUS "Might be GCC under cygwin.")
+		ADD_DEFINITIONS( -DGCC )
+	ENDIF (MSVC)
+ENDIF (WIN32)
diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..68d15c85434b6d0b52444be3defb428c1e1176b6
--- /dev/null
+++ b/scripts/cmake/Find.cmake
@@ -0,0 +1,26 @@
+######################
+### Find tools     ###
+######################
+
+# Find dot tool from graphviz
+FIND_PROGRAM(DOT_TOOL_PATH dot DOC "Dot tool from graphviz")
+
+# Find doxygen
+FIND_PACKAGE(Doxygen)
+
+# Find gnu profiler gprof
+FIND_PROGRAM(GPROF_PATH gprof DOC "GNU profiler gprof")
+
+FIND_PACKAGE(cppcheck)
+
+
+######################
+### Find libraries ###
+######################
+
+FIND_PACKAGE(OpenMP)
+IF(OPENMP_FOUND)
+	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+ENDIF()
+