diff --git a/swig/corpus2.i b/swig/corpus2.i
index e92d165458a60ca3116936329761673e9c5e8dc0..40b5f856e1c06c82cd648a45e0fb30cd2b54105f 100644
--- a/swig/corpus2.i
+++ b/swig/corpus2.i
@@ -10,13 +10,9 @@
 %include "annotationchannel.i"
 %include "annotationview.i"
 %include "chunk.i"
-%include "document.i"
-%include "documentreader.i"
 %include "iob.i"
 %include "lexeme.i"
 %include "libpwrnlperror.i"
-%include "relation.i"
-%include "relationreader.i"
 %include "sentence.i"
 %include "tag.i"
 %include "tagging.i"
@@ -27,7 +23,12 @@
 %include "tokenreader.i"
 %include "tokenwriter.i"
 
+%include "relation.i"
+%include "document.i"
 %include "corpus.i"
+%include "relationreader.i"
+%include "documentreader.i"
+%include "corpusreader.i"
 
 %{
 #include <libcorpus2/util/settings.h>
diff --git a/swig/corpusreader.i b/swig/corpusreader.i
new file mode 100644
index 0000000000000000000000000000000000000000..7f5bddf0ee419c713eb9119c580408a2bdb81417
--- /dev/null
+++ b/swig/corpusreader.i
@@ -0,0 +1,32 @@
+#ifndef SWIG_LIBCORPUS2_CORPUS_READER_I
+#define SWIG_LIBCORPUS2_CORPUS_READER_I
+
+%module libcorpusdocument
+%{
+  #include <libcorpus2_whole/io/corpusreader.h>
+%}
+
+%include "std_defs.i"
+%include "tagset.i"
+%include "corpus.i"
+
+%template(CorpusReaderPtr) boost::shared_ptr<Corpus2::whole::CorpusReader>;
+%template(ConstCorpusReaderPtr) boost::shared_ptr<const Corpus2::whole::CorpusReader>;
+
+%template(CorpusReaderPtrVector) std::vector<boost::shared_ptr<Corpus2::whole::CorpusReader> >;
+
+namespace Corpus2 {
+namespace whole {
+  class CorpusReader {
+  public:
+    CorpusReader(const Tagset& tagset, const std::string& corpus_type);
+    boost::shared_ptr<Corpus> read(const std::string& corpus_file);
+  };
+} // whole ns
+} // Corpus2 ns
+
+using namespace std;
+using namespace Corpus2;
+using namespace Corpus2::whole;
+
+#endif /* SWIG_LIBCORPUS2_CORPUS_READER_I */