diff --git a/.gitignore b/.gitignore
index e53b5370e9e2ce635df0b3508e5da3c8a71eb3bf..2516bb9f9be92eb7b9dfd9ebf0b705e9857edcb7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
 build*/
 *.sw[op]
 tags
+.ExternalData_*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1b244b97e423382a5fe3bc1bc0eb70ee29052c5c..4ffcd71f112ad2cfdf733a5f6c1fef89dcd836fb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -148,16 +148,18 @@ IF( OGS_BUILD_CLI )
 	ADD_SUBDIRECTORY( OGS )
 ENDIF() # OGS_BUILD_CLI
 IF( OGS_BUILD_TESTS AND NOT IS_SUBPROJECT )
-	ADD_SUBDIRECTORY( Tests )
-	ADD_SUBDIRECTORY( SimpleTests/MatrixTests )
-	ADD_SUBDIRECTORY( SimpleTests/MeshTests )
+	IF(CMAKE_VERSION VERSION_LESS 2.8.11)
+		MESSAGE(FATAL_ERROR "CMAKE 2.8.11 or higher is required to build the tests!")
+	ENDIF()
 	ADD_SUBDIRECTORY( Tests EXCLUDE_FROM_ALL )
 	ADD_SUBDIRECTORY( SimpleTests/MatrixTests EXCLUDE_FROM_ALL )
 	ADD_SUBDIRECTORY( SimpleTests/MeshTests EXCLUDE_FROM_ALL )
 	IF(NOT MSVC AND BLAS_FOUND AND LAPACK_FOUND)
-		ADD_SUBDIRECTORY( SimpleTests/SolverTests )
 		ADD_SUBDIRECTORY( SimpleTests/SolverTests EXCLUDE_FROM_ALL )
 	ENDIF()
+	# Create a target 'data', which downloads all referenced data sets into the build tree
+	# This has to be defined after all tests are defined
+	ExternalData_Add_Target(data)
 ENDIF() # OGS_BUILD_TESTS
 IF(OGS_BUILD_UTILS AND NOT IS_SUBPROJECT)
 	ADD_SUBDIRECTORY( Utils/SimpleMeshCreation )
diff --git a/scripts/cmake/test/AddTest.cmake b/scripts/cmake/test/AddTest.cmake
index 63abac3081bda753372e0829bfe8e9969e99e41a..c37f75396f97525f0e872485c152a2a9efa1aebd 100644
--- a/scripts/cmake/test/AddTest.cmake
+++ b/scripts/cmake/test/AddTest.cmake
@@ -22,7 +22,8 @@ FUNCTION (AddTest executable case_path case_name wrapper)
 
 	## -----------
 
-	ADD_TEST(NAME "${executable}-${case_path}-${wrapper}"
+	ExternalData_Add_Test(data
+		NAME "${executable}-${case_path}-${wrapper}"
 		COMMAND ${CMAKE_COMMAND}
 		-Dexecutable=$<TARGET_FILE:${executable}>
 		-Dcase_path=${case_path}
@@ -31,6 +32,7 @@ FUNCTION (AddTest executable case_path case_name wrapper)
 		-DWRAPPER_COMMAND=${WRAPPER_COMMAND}
 		-DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}
 		-P ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestWrapper.cmake
+		DATA{${case_path}/${case_name}.cnd, ${case_path}/${case_name}.gml, ${case_path}/${case_name}.vtu}
 	)
 
 	IF(NOT tester)
diff --git a/scripts/cmake/test/Data.cmake b/scripts/cmake/test/Data.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..df82e198e21585e12fe77e7c1fda645d47383ac1
--- /dev/null
+++ b/scripts/cmake/test/Data.cmake
@@ -0,0 +1,32 @@
+INCLUDE(ExternalData)
+
+SET(ExternalData_OBJECT_STORES "${ExternalData_OBJECT_STORES_DEFAULT}" CACHE STRING
+	"Semicolon-separated list of local directories holding test data files in the layout %(algo)/%(hash).")
+MARK_AS_ADVANCED(ExternalData_OBJECT_STORES)
+IF(NOT ExternalData_OBJECT_STORES)
+	SET(ExternalData_OBJECT_STORES "${CMAKE_SOURCE_DIR}/../ogs6-data")
+	FILE(MAKE_DIRECTORY "${ExternalData_OBJECT_STORES}")
+ENDIF()
+
+SET(ExternalData_SOURCE_ROOT ${CMAKE_SOURCE_DIR}/Tests/Data)
+SET(ExternalData_BINARY_ROOT ${CMAKE_BINARY_DIR}/Tests/Data)
+SET(ExternalData_LINK_CONTENT MD5)
+
+SET(ExternalData_URL_TEMPLATES "http://www.opengeosys.org/images/dev/%(algo)/%(hash)")
+
+ADD_CUSTOM_TARGET(
+	move-data
+	COMMAND ${CMAKE_COMMAND}
+	-DExternalData_SOURCE_ROOT=${ExternalData_SOURCE_ROOT}
+	-DExternalData_LINK_CONTENT=${ExternalData_LINK_CONTENT}
+	-DExternalData_OBJECT_STORES=${ExternalData_OBJECT_STORES}
+	-P ${PROJECT_SOURCE_DIR}/scripts/cmake/test/MoveDataToStore.cmake
+	VERBATIM
+)
+
+ExternalData_Add_Test(
+	data # data target specified above
+	NAME External-Data-Test
+	COMMAND ls -ll ${ExternalData_SOURCE_ROOT}/Elliptic/2d-quads-x1000-y1000/
+	DATA{${ExternalData_SOURCE_ROOT}/Elliptic/2d-quads-x1000-y1000/,REGEX:.*}
+)
diff --git a/scripts/cmake/test/MoveDataToStore.cmake b/scripts/cmake/test/MoveDataToStore.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..2e70b1720a31f35996a37d1f6c47a46589454d11
--- /dev/null
+++ b/scripts/cmake/test/MoveDataToStore.cmake
@@ -0,0 +1,7 @@
+# Get all files matching .ExternalData_<algo>_<hash>
+FILE(GLOB_RECURSE FILES "" ${ExternalData_SOURCE_ROOT}/.ExternalData_${ExternalData_LINK_CONTENT}_*)
+FOREACH(HASH_FILE ${FILES})
+	STRING(REGEX MATCH [^_]+$ HASH ${HASH_FILE})
+	MESSAGE("Copying ${HASH_FILE} to ${ExternalData_OBJECT_STORES}/${HASH}")
+	FILE(RENAME ${HASH_FILE} ${ExternalData_OBJECT_STORES}/${ExternalData_LINK_CONTENT}/${HASH})
+ENDFOREACH()