diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index ea57e650..eba24287 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -35,7 +35,7 @@ There are currently two files which need to be edited:
    To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`.
 
 
-2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code.
+2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code.
 
    If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with
 
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 27920581..49d16659 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -14,7 +14,7 @@ There are currently two files which need to be edited:
    To run [`re2c`](http://re2c.org) and generate/overwrite file `src/json.hpp` with your changes in file `src/json.hpp.re2c`.
 
 
-2. [`test/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code.
+2. [`test/src/unit.cpp`](https://github.com/nlohmann/json/blob/master/test/unit.cpp) - This contains the [Catch](https://github.com/philsquared/Catch) unit tests which currently cover [100 %](https://coveralls.io/github/nlohmann/json) of the library's code.
 
    If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with
 
diff --git a/.travis.yml b/.travis.yml
index d1748dff..1ada0084 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,7 +19,7 @@ matrix:
         - touch src/json.hpp
         - make json_unit CXXFLAGS="-fprofile-arcs -ftest-coverage -std=c++11 -lstdc++" CXX=$COMPILER
         - ./json_unit "*"
-        - coveralls --exclude test/catch.hpp --exclude test/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9'
+        - coveralls --exclude test/src/catch.hpp --exclude test/src/unit.cpp --include src/json.hpp --gcov-options '\-lp' --gcov 'gcov-4.9'
       env: COMPILER=g++-4.9
 
     - os: linux
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4ae1d8bb..18e9c651 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,12 @@
 cmake_minimum_required(VERSION 3.0)
 
 # define the project
-project(json VERSION 2.0.0 LANGUAGES CXX)
+project(nlohmann_json VERSION 2.0.0 LANGUAGES CXX)
+
+option(BuildTests "Build the unit tests" ON)
 
 # define project variables
 set(JSON_TARGET_NAME ${PROJECT_NAME})
-set(JSON_UNITTEST_TARGET_NAME "json_unit")
 set(JSON_PACKAGE_NAME ${JSON_TARGET_NAME})
 set(JSON_TARGETS_FILENAME "${JSON_PACKAGE_NAME}Targets.cmake")
 set(JSON_CONFIG_FILENAME "${JSON_PACKAGE_NAME}Config.cmake")
@@ -20,15 +21,9 @@ target_include_directories(${JSON_TARGET_NAME} INTERFACE
   $<INSTALL_INTERFACE:${JSON_INCLUDE_DESTINATION}>)
 
 # create and configure the unit test target
-add_executable(${JSON_UNITTEST_TARGET_NAME}
-    "test/catch.hpp" "test/unit.cpp")
-set_target_properties(${JSON_UNITTEST_TARGET_NAME} PROPERTIES
-    CXX_STANDARD 11
-    CXX_STANDARD_REQUIRED ON
-    COMPILE_DEFINITIONS "$<$<CXX_COMPILER_ID:MSVC>:_SCL_SECURE_NO_WARNINGS>"
-    COMPILE_OPTIONS "$<$<CXX_COMPILER_ID:MSVC>:/EHsc;$<$<CONFIG:Release>:/Od>>")
-target_include_directories(${JSON_UNITTEST_TARGET_NAME} PRIVATE "test")
-target_link_libraries(${JSON_UNITTEST_TARGET_NAME} ${JSON_TARGET_NAME})
+if (BuildTests)
+    add_subdirectory(test)
+endif()
 
 # generate a config and config version file for the package
 include(CMakePackageConfigHelpers)
diff --git a/Makefile b/Makefile
index d0a80379..6fdc06b9 100644
--- a/Makefile
+++ b/Makefile
@@ -19,8 +19,8 @@ clean:
 # additional flags
 FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal
 
-# build unit tests
-json_unit: test/unit.cpp src/json.hpp test/catch.hpp
+# build unit tests (TODO: Does this want its own makefile?)
+json_unit: test/src/unit.cpp src/json.hpp test/src/catch.hpp
 	$(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src -I test $< $(LDFLAGS) -o $@
 
 
@@ -43,11 +43,11 @@ fuzz_testing:
 	mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
 	$(MAKE) fuzz CXX=afl-clang++
 	mv fuzz fuzz-testing
-	find test/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases
+	find test/data/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases
 	@echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzz"
 
 # the fuzzer binary
-fuzz: test/fuzz.cpp src/json.hpp
+fuzz: test/src/fuzz.cpp src/json.hpp
 	$(CXX) -std=c++11 $(CXXFLAGS) $(FLAGS) $(CPPFLAGS) -I src $< $(LDFLAGS) -o $@
 
 
@@ -75,7 +75,7 @@ pretty:
 	   --indent-col1-comments --pad-oper --pad-header --align-pointer=type \
 	   --align-reference=type --add-brackets --convert-tabs --close-templates \
 	   --lineend=linux --preserve-date --suffix=none --formatted \
-	   src/json.hpp src/json.hpp.re2c test/unit.cpp test/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp
+	   src/json.hpp src/json.hpp.re2c test/src/unit.cpp test/src/fuzz.cpp benchmarks/benchmarks.cpp doc/examples/*.cpp
 
 
 ##########################################################################
diff --git a/README.md b/README.md
index c9f3a713..46ede249 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ There are myriads of [JSON](http://json.org) libraries out there, and each may e
 
 - **Trivial integration**. Our whole code consists of a single header file `json.hpp`. That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings.
 
-- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks.
+- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks.
 
 Other aspects were not so important to us:
 
diff --git a/appveyor.yml b/appveyor.yml
index aaf9c5f1..63902ced 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -7,5 +7,5 @@ build_script:
 - cmake . -G "Visual Studio 14 2015"
 - cmake --build . --config Release
 test_script:
-- Release\json_unit.exe
-- Release\json_unit.exe "*"
+- test\Release\json_unit.exe
+- test\Release\json_unit.exe "*"
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 00000000..b63e5a39
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,21 @@
+# The unit test executable.
+add_executable(json_unit
+    "src/catch.hpp"
+    "src/unit.cpp"
+)
+
+set_target_properties(json_unit PROPERTIES
+    CXX_STANDARD 11
+    CXX_STANDARD_REQUIRED ON
+    COMPILE_DEFINITIONS "$<$<CXX_COMPILER_ID:MSVC>:_SCL_SECURE_NO_WARNINGS>"
+    COMPILE_OPTIONS "$<$<CXX_COMPILER_ID:MSVC>:/EHsc;$<$<CONFIG:Release>:/Od>>"
+)
+
+# Install the test binary.
+install(TARGETS json_unit RUNTIME DESTINATION test/bin)
+
+# Copy the test data to the install tree.
+install(DIRECTORY data/ DESTINATION test/data)
+
+target_include_directories(json_unit PRIVATE "src")
+target_link_libraries(json_unit ${JSON_TARGET_NAME})
diff --git a/test/json.org/1.json b/test/data/json.org/1.json
similarity index 100%
rename from test/json.org/1.json
rename to test/data/json.org/1.json
diff --git a/test/json.org/2.json b/test/data/json.org/2.json
similarity index 100%
rename from test/json.org/2.json
rename to test/data/json.org/2.json
diff --git a/test/json.org/3.json b/test/data/json.org/3.json
similarity index 100%
rename from test/json.org/3.json
rename to test/data/json.org/3.json
diff --git a/test/json.org/4.json b/test/data/json.org/4.json
similarity index 100%
rename from test/json.org/4.json
rename to test/data/json.org/4.json
diff --git a/test/json.org/5.json b/test/data/json.org/5.json
similarity index 100%
rename from test/json.org/5.json
rename to test/data/json.org/5.json
diff --git a/test/json_nlohmann_tests/all_unicode.json b/test/data/json_nlohmann_tests/all_unicode.json
similarity index 100%
rename from test/json_nlohmann_tests/all_unicode.json
rename to test/data/json_nlohmann_tests/all_unicode.json
diff --git a/test/json_nlohmann_tests/bom.json b/test/data/json_nlohmann_tests/bom.json
similarity index 100%
rename from test/json_nlohmann_tests/bom.json
rename to test/data/json_nlohmann_tests/bom.json
diff --git a/test/json_roundtrip/roundtrip01.json b/test/data/json_roundtrip/roundtrip01.json
similarity index 100%
rename from test/json_roundtrip/roundtrip01.json
rename to test/data/json_roundtrip/roundtrip01.json
diff --git a/test/json_roundtrip/roundtrip02.json b/test/data/json_roundtrip/roundtrip02.json
similarity index 100%
rename from test/json_roundtrip/roundtrip02.json
rename to test/data/json_roundtrip/roundtrip02.json
diff --git a/test/json_roundtrip/roundtrip03.json b/test/data/json_roundtrip/roundtrip03.json
similarity index 100%
rename from test/json_roundtrip/roundtrip03.json
rename to test/data/json_roundtrip/roundtrip03.json
diff --git a/test/json_roundtrip/roundtrip04.json b/test/data/json_roundtrip/roundtrip04.json
similarity index 100%
rename from test/json_roundtrip/roundtrip04.json
rename to test/data/json_roundtrip/roundtrip04.json
diff --git a/test/json_roundtrip/roundtrip05.json b/test/data/json_roundtrip/roundtrip05.json
similarity index 100%
rename from test/json_roundtrip/roundtrip05.json
rename to test/data/json_roundtrip/roundtrip05.json
diff --git a/test/json_roundtrip/roundtrip06.json b/test/data/json_roundtrip/roundtrip06.json
similarity index 100%
rename from test/json_roundtrip/roundtrip06.json
rename to test/data/json_roundtrip/roundtrip06.json
diff --git a/test/json_roundtrip/roundtrip07.json b/test/data/json_roundtrip/roundtrip07.json
similarity index 100%
rename from test/json_roundtrip/roundtrip07.json
rename to test/data/json_roundtrip/roundtrip07.json
diff --git a/test/json_roundtrip/roundtrip08.json b/test/data/json_roundtrip/roundtrip08.json
similarity index 100%
rename from test/json_roundtrip/roundtrip08.json
rename to test/data/json_roundtrip/roundtrip08.json
diff --git a/test/json_roundtrip/roundtrip09.json b/test/data/json_roundtrip/roundtrip09.json
similarity index 100%
rename from test/json_roundtrip/roundtrip09.json
rename to test/data/json_roundtrip/roundtrip09.json
diff --git a/test/json_roundtrip/roundtrip10.json b/test/data/json_roundtrip/roundtrip10.json
similarity index 100%
rename from test/json_roundtrip/roundtrip10.json
rename to test/data/json_roundtrip/roundtrip10.json
diff --git a/test/json_roundtrip/roundtrip11.json b/test/data/json_roundtrip/roundtrip11.json
similarity index 100%
rename from test/json_roundtrip/roundtrip11.json
rename to test/data/json_roundtrip/roundtrip11.json
diff --git a/test/json_roundtrip/roundtrip12.json b/test/data/json_roundtrip/roundtrip12.json
similarity index 100%
rename from test/json_roundtrip/roundtrip12.json
rename to test/data/json_roundtrip/roundtrip12.json
diff --git a/test/json_roundtrip/roundtrip13.json b/test/data/json_roundtrip/roundtrip13.json
similarity index 100%
rename from test/json_roundtrip/roundtrip13.json
rename to test/data/json_roundtrip/roundtrip13.json
diff --git a/test/json_roundtrip/roundtrip14.json b/test/data/json_roundtrip/roundtrip14.json
similarity index 100%
rename from test/json_roundtrip/roundtrip14.json
rename to test/data/json_roundtrip/roundtrip14.json
diff --git a/test/json_roundtrip/roundtrip15.json b/test/data/json_roundtrip/roundtrip15.json
similarity index 100%
rename from test/json_roundtrip/roundtrip15.json
rename to test/data/json_roundtrip/roundtrip15.json
diff --git a/test/json_roundtrip/roundtrip16.json b/test/data/json_roundtrip/roundtrip16.json
similarity index 100%
rename from test/json_roundtrip/roundtrip16.json
rename to test/data/json_roundtrip/roundtrip16.json
diff --git a/test/json_roundtrip/roundtrip17.json b/test/data/json_roundtrip/roundtrip17.json
similarity index 100%
rename from test/json_roundtrip/roundtrip17.json
rename to test/data/json_roundtrip/roundtrip17.json
diff --git a/test/json_roundtrip/roundtrip18.json b/test/data/json_roundtrip/roundtrip18.json
similarity index 100%
rename from test/json_roundtrip/roundtrip18.json
rename to test/data/json_roundtrip/roundtrip18.json
diff --git a/test/json_roundtrip/roundtrip19.json b/test/data/json_roundtrip/roundtrip19.json
similarity index 100%
rename from test/json_roundtrip/roundtrip19.json
rename to test/data/json_roundtrip/roundtrip19.json
diff --git a/test/json_roundtrip/roundtrip20.json b/test/data/json_roundtrip/roundtrip20.json
similarity index 100%
rename from test/json_roundtrip/roundtrip20.json
rename to test/data/json_roundtrip/roundtrip20.json
diff --git a/test/json_roundtrip/roundtrip21.json b/test/data/json_roundtrip/roundtrip21.json
similarity index 100%
rename from test/json_roundtrip/roundtrip21.json
rename to test/data/json_roundtrip/roundtrip21.json
diff --git a/test/json_roundtrip/roundtrip22.json b/test/data/json_roundtrip/roundtrip22.json
similarity index 100%
rename from test/json_roundtrip/roundtrip22.json
rename to test/data/json_roundtrip/roundtrip22.json
diff --git a/test/json_roundtrip/roundtrip23.json b/test/data/json_roundtrip/roundtrip23.json
similarity index 100%
rename from test/json_roundtrip/roundtrip23.json
rename to test/data/json_roundtrip/roundtrip23.json
diff --git a/test/json_roundtrip/roundtrip24.json b/test/data/json_roundtrip/roundtrip24.json
similarity index 100%
rename from test/json_roundtrip/roundtrip24.json
rename to test/data/json_roundtrip/roundtrip24.json
diff --git a/test/json_roundtrip/roundtrip25.json b/test/data/json_roundtrip/roundtrip25.json
similarity index 100%
rename from test/json_roundtrip/roundtrip25.json
rename to test/data/json_roundtrip/roundtrip25.json
diff --git a/test/json_roundtrip/roundtrip26.json b/test/data/json_roundtrip/roundtrip26.json
similarity index 100%
rename from test/json_roundtrip/roundtrip26.json
rename to test/data/json_roundtrip/roundtrip26.json
diff --git a/test/json_roundtrip/roundtrip27.json b/test/data/json_roundtrip/roundtrip27.json
similarity index 100%
rename from test/json_roundtrip/roundtrip27.json
rename to test/data/json_roundtrip/roundtrip27.json
diff --git a/test/json_roundtrip/roundtrip28.json b/test/data/json_roundtrip/roundtrip28.json
similarity index 100%
rename from test/json_roundtrip/roundtrip28.json
rename to test/data/json_roundtrip/roundtrip28.json
diff --git a/test/json_roundtrip/roundtrip29.json b/test/data/json_roundtrip/roundtrip29.json
similarity index 100%
rename from test/json_roundtrip/roundtrip29.json
rename to test/data/json_roundtrip/roundtrip29.json
diff --git a/test/json_roundtrip/roundtrip30.json b/test/data/json_roundtrip/roundtrip30.json
similarity index 100%
rename from test/json_roundtrip/roundtrip30.json
rename to test/data/json_roundtrip/roundtrip30.json
diff --git a/test/json_roundtrip/roundtrip31.json b/test/data/json_roundtrip/roundtrip31.json
similarity index 100%
rename from test/json_roundtrip/roundtrip31.json
rename to test/data/json_roundtrip/roundtrip31.json
diff --git a/test/json_roundtrip/roundtrip32.json b/test/data/json_roundtrip/roundtrip32.json
similarity index 100%
rename from test/json_roundtrip/roundtrip32.json
rename to test/data/json_roundtrip/roundtrip32.json
diff --git a/test/json_tests/fail1.json b/test/data/json_tests/fail1.json
similarity index 100%
rename from test/json_tests/fail1.json
rename to test/data/json_tests/fail1.json
diff --git a/test/json_tests/fail10.json b/test/data/json_tests/fail10.json
similarity index 100%
rename from test/json_tests/fail10.json
rename to test/data/json_tests/fail10.json
diff --git a/test/json_tests/fail11.json b/test/data/json_tests/fail11.json
similarity index 100%
rename from test/json_tests/fail11.json
rename to test/data/json_tests/fail11.json
diff --git a/test/json_tests/fail12.json b/test/data/json_tests/fail12.json
similarity index 100%
rename from test/json_tests/fail12.json
rename to test/data/json_tests/fail12.json
diff --git a/test/json_tests/fail13.json b/test/data/json_tests/fail13.json
similarity index 100%
rename from test/json_tests/fail13.json
rename to test/data/json_tests/fail13.json
diff --git a/test/json_tests/fail14.json b/test/data/json_tests/fail14.json
similarity index 100%
rename from test/json_tests/fail14.json
rename to test/data/json_tests/fail14.json
diff --git a/test/json_tests/fail15.json b/test/data/json_tests/fail15.json
similarity index 100%
rename from test/json_tests/fail15.json
rename to test/data/json_tests/fail15.json
diff --git a/test/json_tests/fail16.json b/test/data/json_tests/fail16.json
similarity index 100%
rename from test/json_tests/fail16.json
rename to test/data/json_tests/fail16.json
diff --git a/test/json_tests/fail17.json b/test/data/json_tests/fail17.json
similarity index 100%
rename from test/json_tests/fail17.json
rename to test/data/json_tests/fail17.json
diff --git a/test/json_tests/fail18.json b/test/data/json_tests/fail18.json
similarity index 100%
rename from test/json_tests/fail18.json
rename to test/data/json_tests/fail18.json
diff --git a/test/json_tests/fail19.json b/test/data/json_tests/fail19.json
similarity index 100%
rename from test/json_tests/fail19.json
rename to test/data/json_tests/fail19.json
diff --git a/test/json_tests/fail2.json b/test/data/json_tests/fail2.json
similarity index 100%
rename from test/json_tests/fail2.json
rename to test/data/json_tests/fail2.json
diff --git a/test/json_tests/fail20.json b/test/data/json_tests/fail20.json
similarity index 100%
rename from test/json_tests/fail20.json
rename to test/data/json_tests/fail20.json
diff --git a/test/json_tests/fail21.json b/test/data/json_tests/fail21.json
similarity index 100%
rename from test/json_tests/fail21.json
rename to test/data/json_tests/fail21.json
diff --git a/test/json_tests/fail22.json b/test/data/json_tests/fail22.json
similarity index 100%
rename from test/json_tests/fail22.json
rename to test/data/json_tests/fail22.json
diff --git a/test/json_tests/fail23.json b/test/data/json_tests/fail23.json
similarity index 100%
rename from test/json_tests/fail23.json
rename to test/data/json_tests/fail23.json
diff --git a/test/json_tests/fail24.json b/test/data/json_tests/fail24.json
similarity index 100%
rename from test/json_tests/fail24.json
rename to test/data/json_tests/fail24.json
diff --git a/test/json_tests/fail25.json b/test/data/json_tests/fail25.json
similarity index 100%
rename from test/json_tests/fail25.json
rename to test/data/json_tests/fail25.json
diff --git a/test/json_tests/fail26.json b/test/data/json_tests/fail26.json
similarity index 100%
rename from test/json_tests/fail26.json
rename to test/data/json_tests/fail26.json
diff --git a/test/json_tests/fail27.json b/test/data/json_tests/fail27.json
similarity index 100%
rename from test/json_tests/fail27.json
rename to test/data/json_tests/fail27.json
diff --git a/test/json_tests/fail28.json b/test/data/json_tests/fail28.json
similarity index 100%
rename from test/json_tests/fail28.json
rename to test/data/json_tests/fail28.json
diff --git a/test/json_tests/fail29.json b/test/data/json_tests/fail29.json
similarity index 100%
rename from test/json_tests/fail29.json
rename to test/data/json_tests/fail29.json
diff --git a/test/json_tests/fail3.json b/test/data/json_tests/fail3.json
similarity index 100%
rename from test/json_tests/fail3.json
rename to test/data/json_tests/fail3.json
diff --git a/test/json_tests/fail30.json b/test/data/json_tests/fail30.json
similarity index 100%
rename from test/json_tests/fail30.json
rename to test/data/json_tests/fail30.json
diff --git a/test/json_tests/fail31.json b/test/data/json_tests/fail31.json
similarity index 100%
rename from test/json_tests/fail31.json
rename to test/data/json_tests/fail31.json
diff --git a/test/json_tests/fail32.json b/test/data/json_tests/fail32.json
similarity index 100%
rename from test/json_tests/fail32.json
rename to test/data/json_tests/fail32.json
diff --git a/test/json_tests/fail33.json b/test/data/json_tests/fail33.json
similarity index 100%
rename from test/json_tests/fail33.json
rename to test/data/json_tests/fail33.json
diff --git a/test/json_tests/fail4.json b/test/data/json_tests/fail4.json
similarity index 100%
rename from test/json_tests/fail4.json
rename to test/data/json_tests/fail4.json
diff --git a/test/json_tests/fail5.json b/test/data/json_tests/fail5.json
similarity index 100%
rename from test/json_tests/fail5.json
rename to test/data/json_tests/fail5.json
diff --git a/test/json_tests/fail6.json b/test/data/json_tests/fail6.json
similarity index 100%
rename from test/json_tests/fail6.json
rename to test/data/json_tests/fail6.json
diff --git a/test/json_tests/fail7.json b/test/data/json_tests/fail7.json
similarity index 100%
rename from test/json_tests/fail7.json
rename to test/data/json_tests/fail7.json
diff --git a/test/json_tests/fail8.json b/test/data/json_tests/fail8.json
similarity index 100%
rename from test/json_tests/fail8.json
rename to test/data/json_tests/fail8.json
diff --git a/test/json_tests/fail9.json b/test/data/json_tests/fail9.json
similarity index 100%
rename from test/json_tests/fail9.json
rename to test/data/json_tests/fail9.json
diff --git a/test/json_tests/pass1.json b/test/data/json_tests/pass1.json
similarity index 100%
rename from test/json_tests/pass1.json
rename to test/data/json_tests/pass1.json
diff --git a/test/json_tests/pass2.json b/test/data/json_tests/pass2.json
similarity index 100%
rename from test/json_tests/pass2.json
rename to test/data/json_tests/pass2.json
diff --git a/test/json_tests/pass3.json b/test/data/json_tests/pass3.json
similarity index 100%
rename from test/json_tests/pass3.json
rename to test/data/json_tests/pass3.json
diff --git a/test/json_testsuite/README.md b/test/data/json_testsuite/README.md
similarity index 100%
rename from test/json_testsuite/README.md
rename to test/data/json_testsuite/README.md
diff --git a/test/json_testsuite/sample.json b/test/data/json_testsuite/sample.json
old mode 100755
new mode 100644
similarity index 100%
rename from test/json_testsuite/sample.json
rename to test/data/json_testsuite/sample.json
diff --git a/test/catch.hpp b/test/src/catch.hpp
similarity index 100%
rename from test/catch.hpp
rename to test/src/catch.hpp
diff --git a/test/fuzz.cpp b/test/src/fuzz.cpp
similarity index 100%
rename from test/fuzz.cpp
rename to test/src/fuzz.cpp
diff --git a/test/unit.cpp b/test/src/unit.cpp
similarity index 99%
rename from test/unit.cpp
rename to test/src/unit.cpp
index e42430c3..0a2bdd10 100644
--- a/test/unit.cpp
+++ b/test/src/unit.cpp
@@ -1314,7 +1314,7 @@ TEST_CASE("constructors")
 
         SECTION("std::ifstream")
         {
-            std::ifstream f("test/json_tests/pass1.json");
+            std::ifstream f("test/data/json_tests/pass1.json");
             json j(f);
         }
     }
@@ -11652,39 +11652,39 @@ TEST_CASE("compliance tests from json.org")
     {
         for (auto filename :
                 {
-                    //"test/json_tests/fail1.json",
-                    "test/json_tests/fail2.json",
-                    "test/json_tests/fail3.json",
-                    "test/json_tests/fail4.json",
-                    "test/json_tests/fail5.json",
-                    "test/json_tests/fail6.json",
-                    "test/json_tests/fail7.json",
-                    "test/json_tests/fail8.json",
-                    "test/json_tests/fail9.json",
-                    "test/json_tests/fail10.json",
-                    "test/json_tests/fail11.json",
-                    "test/json_tests/fail12.json",
-                    "test/json_tests/fail13.json",
-                    "test/json_tests/fail14.json",
-                    "test/json_tests/fail15.json",
-                    "test/json_tests/fail16.json",
-                    "test/json_tests/fail17.json",
-                    //"test/json_tests/fail18.json",
-                    "test/json_tests/fail19.json",
-                    "test/json_tests/fail20.json",
-                    "test/json_tests/fail21.json",
-                    "test/json_tests/fail22.json",
-                    "test/json_tests/fail23.json",
-                    "test/json_tests/fail24.json",
-                    "test/json_tests/fail25.json",
-                    "test/json_tests/fail26.json",
-                    "test/json_tests/fail27.json",
-                    "test/json_tests/fail28.json",
-                    "test/json_tests/fail29.json",
-                    "test/json_tests/fail30.json",
-                    "test/json_tests/fail31.json",
-                    "test/json_tests/fail32.json",
-                    "test/json_tests/fail33.json"
+                    //"test/data/json_tests/fail1.json",
+                    "test/data/json_tests/fail2.json",
+                    "test/data/json_tests/fail3.json",
+                    "test/data/json_tests/fail4.json",
+                    "test/data/json_tests/fail5.json",
+                    "test/data/json_tests/fail6.json",
+                    "test/data/json_tests/fail7.json",
+                    "test/data/json_tests/fail8.json",
+                    "test/data/json_tests/fail9.json",
+                    "test/data/json_tests/fail10.json",
+                    "test/data/json_tests/fail11.json",
+                    "test/data/json_tests/fail12.json",
+                    "test/data/json_tests/fail13.json",
+                    "test/data/json_tests/fail14.json",
+                    "test/data/json_tests/fail15.json",
+                    "test/data/json_tests/fail16.json",
+                    "test/data/json_tests/fail17.json",
+                    //"test/data/json_tests/fail18.json",
+                    "test/data/json_tests/fail19.json",
+                    "test/data/json_tests/fail20.json",
+                    "test/data/json_tests/fail21.json",
+                    "test/data/json_tests/fail22.json",
+                    "test/data/json_tests/fail23.json",
+                    "test/data/json_tests/fail24.json",
+                    "test/data/json_tests/fail25.json",
+                    "test/data/json_tests/fail26.json",
+                    "test/data/json_tests/fail27.json",
+                    "test/data/json_tests/fail28.json",
+                    "test/data/json_tests/fail29.json",
+                    "test/data/json_tests/fail30.json",
+                    "test/data/json_tests/fail31.json",
+                    "test/data/json_tests/fail32.json",
+                    "test/data/json_tests/fail33.json"
                 })
         {
             CAPTURE(filename);
@@ -11698,9 +11698,9 @@ TEST_CASE("compliance tests from json.org")
     {
         for (auto filename :
                 {
-                    "test/json_tests/pass1.json",
-                    "test/json_tests/pass2.json",
-                    "test/json_tests/pass3.json"
+                    "test/data/json_tests/pass1.json",
+                    "test/data/json_tests/pass2.json",
+                    "test/data/json_tests/pass3.json"
                 })
         {
             CAPTURE(filename);
@@ -11873,42 +11873,42 @@ TEST_CASE("compliance tests from nativejson-benchmark")
 
     SECTION("roundtrip")
     {
-        // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/data/roundtrip
+        // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/test/data/roundtrip
 
         for (auto filename :
                 {
-                    "test/json_roundtrip/roundtrip01.json",
-                    "test/json_roundtrip/roundtrip02.json",
-                    "test/json_roundtrip/roundtrip03.json",
-                    "test/json_roundtrip/roundtrip04.json",
-                    "test/json_roundtrip/roundtrip05.json",
-                    "test/json_roundtrip/roundtrip06.json",
-                    "test/json_roundtrip/roundtrip07.json",
-                    "test/json_roundtrip/roundtrip08.json",
-                    "test/json_roundtrip/roundtrip09.json",
-                    "test/json_roundtrip/roundtrip10.json",
-                    "test/json_roundtrip/roundtrip11.json",
-                    "test/json_roundtrip/roundtrip12.json",
-                    "test/json_roundtrip/roundtrip13.json",
-                    "test/json_roundtrip/roundtrip14.json",
-                    "test/json_roundtrip/roundtrip15.json",
-                    "test/json_roundtrip/roundtrip16.json",
-                    "test/json_roundtrip/roundtrip17.json",
-                    "test/json_roundtrip/roundtrip18.json",
-                    "test/json_roundtrip/roundtrip19.json",
-                    "test/json_roundtrip/roundtrip20.json",
-                    "test/json_roundtrip/roundtrip21.json",
-                    "test/json_roundtrip/roundtrip22.json",
-                    "test/json_roundtrip/roundtrip23.json",
-                    "test/json_roundtrip/roundtrip24.json",
-                    "test/json_roundtrip/roundtrip25.json",
-                    "test/json_roundtrip/roundtrip26.json",
-                    "test/json_roundtrip/roundtrip27.json",
-                    "test/json_roundtrip/roundtrip28.json",
-                    "test/json_roundtrip/roundtrip29.json",
-                    "test/json_roundtrip/roundtrip30.json",
-                    "test/json_roundtrip/roundtrip31.json",
-                    "test/json_roundtrip/roundtrip32.json"
+                    "test/data/json_roundtrip/roundtrip01.json",
+                    "test/data/json_roundtrip/roundtrip02.json",
+                    "test/data/json_roundtrip/roundtrip03.json",
+                    "test/data/json_roundtrip/roundtrip04.json",
+                    "test/data/json_roundtrip/roundtrip05.json",
+                    "test/data/json_roundtrip/roundtrip06.json",
+                    "test/data/json_roundtrip/roundtrip07.json",
+                    "test/data/json_roundtrip/roundtrip08.json",
+                    "test/data/json_roundtrip/roundtrip09.json",
+                    "test/data/json_roundtrip/roundtrip10.json",
+                    "test/data/json_roundtrip/roundtrip11.json",
+                    "test/data/json_roundtrip/roundtrip12.json",
+                    "test/data/json_roundtrip/roundtrip13.json",
+                    "test/data/json_roundtrip/roundtrip14.json",
+                    "test/data/json_roundtrip/roundtrip15.json",
+                    "test/data/json_roundtrip/roundtrip16.json",
+                    "test/data/json_roundtrip/roundtrip17.json",
+                    "test/data/json_roundtrip/roundtrip18.json",
+                    "test/data/json_roundtrip/roundtrip19.json",
+                    "test/data/json_roundtrip/roundtrip20.json",
+                    "test/data/json_roundtrip/roundtrip21.json",
+                    "test/data/json_roundtrip/roundtrip22.json",
+                    "test/data/json_roundtrip/roundtrip23.json",
+                    "test/data/json_roundtrip/roundtrip24.json",
+                    "test/data/json_roundtrip/roundtrip25.json",
+                    "test/data/json_roundtrip/roundtrip26.json",
+                    "test/data/json_roundtrip/roundtrip27.json",
+                    "test/data/json_roundtrip/roundtrip28.json",
+                    "test/data/json_roundtrip/roundtrip29.json",
+                    "test/data/json_roundtrip/roundtrip30.json",
+                    "test/data/json_roundtrip/roundtrip31.json",
+                    "test/data/json_roundtrip/roundtrip32.json"
                 })
         {
             CAPTURE(filename);
@@ -11928,7 +11928,7 @@ TEST_CASE("test suite from json-test-suite")
     {
         // read a file with all unicode characters stored as single-character
         // strings in a JSON array
-        std::ifstream f("test/json_testsuite/sample.json");
+        std::ifstream f("test/data/json_testsuite/sample.json");
         json j;
         CHECK_NOTHROW(j << f);
 
@@ -11943,35 +11943,35 @@ TEST_CASE("json.org examples")
 
     SECTION("1.json")
     {
-        std::ifstream f("test/json.org/1.json");
+        std::ifstream f("test/data/json.org/1.json");
         json j;
         CHECK_NOTHROW(j << f);
     }
 
     SECTION("2.json")
     {
-        std::ifstream f("test/json.org/2.json");
+        std::ifstream f("test/data/json.org/2.json");
         json j;
         CHECK_NOTHROW(j << f);
     }
 
     SECTION("3.json")
     {
-        std::ifstream f("test/json.org/3.json");
+        std::ifstream f("test/data/json.org/3.json");
         json j;
         CHECK_NOTHROW(j << f);
     }
 
     SECTION("4.json")
     {
-        std::ifstream f("test/json.org/4.json");
+        std::ifstream f("test/data/json.org/4.json");
         json j;
         CHECK_NOTHROW(j << f);
     }
 
     SECTION("5.json")
     {
-        std::ifstream f("test/json.org/5.json");
+        std::ifstream f("test/data/json.org/5.json");
         json j;
         CHECK_NOTHROW(j << f);
     }
@@ -12105,7 +12105,7 @@ TEST_CASE("Unicode", "[hide]")
     {
         // read a file with all unicode characters stored as single-character
         // strings in a JSON array
-        std::ifstream f("test/json_nlohmann_tests/all_unicode.json");
+        std::ifstream f("test/data/json_nlohmann_tests/all_unicode.json");
         json j;
         CHECK_NOTHROW(j << f);
 
@@ -12146,7 +12146,7 @@ TEST_CASE("Unicode", "[hide]")
     SECTION("ignore byte-order-mark")
     {
         // read a file with a UTF-8 BOM
-        std::ifstream f("test/json_nlohmann_tests/bom.json");
+        std::ifstream f("test/data/json_nlohmann_tests/bom.json");
         json j;
         CHECK_NOTHROW(j << f);
     }