diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a93df4993bc0d91a3566a832a8acf849dc73139..0f43636c58fe3889c41dce037194fc3f2cb0e387 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,14 +71,15 @@ MARK_AS_ADVANCED(LIBCORPUS2_SRC_DATA_DIR)
 
 add_subdirectory(libpwrutils)
 add_subdirectory(libcorpus2)
-add_subdirectory(corpus2tools)
-add_subdirectory(tests)
+add_subdirectory(libcorpus2_whole)
 if(CORPUS2_BUILD_POLIQARP)
 	add_subdirectory(poliqarp-library)
 	add_subdirectory(poliqarp)
 else()
 	message(STATUS "Not building Poliqarp library and wrapper")
 endif(CORPUS2_BUILD_POLIQARP)
+add_subdirectory(corpus2tools)
+add_subdirectory(tests)
 
 if(CORPUS2_BUILD_SWIG)
 	FIND_PACKAGE(SWIG)
diff --git a/libcorpus2_whole/CMakeLists.txt b/libcorpus2_whole/CMakeLists.txt
index 5b491deddd48328df1ef927ce1c3b37c88be78a7..004e1a12d19ed1ee1a5c1347e13494d6dd067c16 100644
--- a/libcorpus2_whole/CMakeLists.txt
+++ b/libcorpus2_whole/CMakeLists.txt
@@ -7,13 +7,13 @@ set(LIBS ${LIBS} ${LibXML++_LIBRARIES})
 
 SET(libcorpus2_whole_SRC
 	corpus.cpp
-	corpusreader.cpp
-	docreader.cpp
 	document.cpp
-	poliqarpdocumentreader.cpp
 	relation.cpp
-	relreader.cpp
-	docreaderi.h
+	io/corpusreader.cpp
+	io/docreader.cpp
+	io/docreaderi.h
+	io/poliqarpdocumentreader.cpp
+	io/relreader.cpp
 )
 
 file(GLOB_RECURSE INCS "*.h")
diff --git a/libcorpus2_whole/corpusreader.cpp b/libcorpus2_whole/io/corpusreader.cpp
similarity index 100%
rename from libcorpus2_whole/corpusreader.cpp
rename to libcorpus2_whole/io/corpusreader.cpp
diff --git a/libcorpus2_whole/corpusreader.h b/libcorpus2_whole/io/corpusreader.h
similarity index 100%
rename from libcorpus2_whole/corpusreader.h
rename to libcorpus2_whole/io/corpusreader.h
diff --git a/libcorpus2_whole/docreader.cpp b/libcorpus2_whole/io/docreader.cpp
similarity index 100%
rename from libcorpus2_whole/docreader.cpp
rename to libcorpus2_whole/io/docreader.cpp
diff --git a/libcorpus2_whole/docreader.h b/libcorpus2_whole/io/docreader.h
similarity index 100%
rename from libcorpus2_whole/docreader.h
rename to libcorpus2_whole/io/docreader.h
diff --git a/libcorpus2_whole/docreaderi.h b/libcorpus2_whole/io/docreaderi.h
similarity index 100%
rename from libcorpus2_whole/docreaderi.h
rename to libcorpus2_whole/io/docreaderi.h
diff --git a/libcorpus2_whole/poliqarpdocumentreader.cpp b/libcorpus2_whole/io/poliqarpdocumentreader.cpp
similarity index 100%
rename from libcorpus2_whole/poliqarpdocumentreader.cpp
rename to libcorpus2_whole/io/poliqarpdocumentreader.cpp
diff --git a/libcorpus2_whole/poliqarpdocumentreader.h b/libcorpus2_whole/io/poliqarpdocumentreader.h
similarity index 100%
rename from libcorpus2_whole/poliqarpdocumentreader.h
rename to libcorpus2_whole/io/poliqarpdocumentreader.h
diff --git a/libcorpus2_whole/relreader.cpp b/libcorpus2_whole/io/relreader.cpp
similarity index 100%
rename from libcorpus2_whole/relreader.cpp
rename to libcorpus2_whole/io/relreader.cpp
diff --git a/libcorpus2_whole/relreader.h b/libcorpus2_whole/io/relreader.h
similarity index 100%
rename from libcorpus2_whole/relreader.h
rename to libcorpus2_whole/io/relreader.h
diff --git a/swig/documentreader.i b/swig/documentreader.i
index 599e6b9fd67dfd8e4f78e6245435906d68f2580d..efdbf0cf73c694a5be51e1ae87b6bb845e5a7bfd 100644
--- a/swig/documentreader.i
+++ b/swig/documentreader.i
@@ -3,7 +3,7 @@
 
 %module libcorpusdocumentreader
 %{
-  #include <libcorpus2_whole/docreader.h>
+  #include <libcorpus2_whole/io/docreader.h>
 %}
 
 %include "exception.i"
diff --git a/swig/relationreader.i b/swig/relationreader.i
index e6ca8148a853bd212ee5503e8266a5983d80817a..bcf567aed3cdb936bd3e87f3f71ff6c8bc874cf6 100644
--- a/swig/relationreader.i
+++ b/swig/relationreader.i
@@ -3,7 +3,7 @@
 
 %module libcorpusrelationreader
 %{
-  #include <libcorpus2_whole/relreader.h>
+  #include <libcorpus2_whole/io/relreader.h>
 %}
 
 namespace Corpus2 {