diff --git a/libcorpus2_whole/io/documentreader.cpp b/libcorpus2_whole/io/documentreader.cpp
index e335a8df980197c7d838ee366baad87a9970d3f5..73db0d354fbe16778100b03ab2d3d6db41288b81 100644
--- a/libcorpus2_whole/io/documentreader.cpp
+++ b/libcorpus2_whole/io/documentreader.cpp
@@ -25,6 +25,21 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 namespace Corpus2 {
 namespace whole{
 
+DocumentReader::DocumentReader(const Tagset& tagset, const std::string& corpus_type, const std::string& corpus_file_path, const std::string& corpus_reader)
+	: corpus_type_(corpus_type), tagset_(tagset), corpus_path_(corpus_file_path)
+{
+	if (corpus_type_ == "document") {
+		corpus_file.open(corpus_file_path.c_str());
+#ifdef WITH_POLIQARP
+	} else if (corpus_type_ == "poliqarp") {
+		reader = boost::shared_ptr<PoliqarpDocumentReader>(
+					new PoliqarpDocumentReader(tagset_, corpus_path_, corpus_reader));
+#endif
+	} else {
+		throw Corpus2Error(corpus_type_ + " is an unknown reader type!");
+	}
+}
+
 DocumentReader::DocumentReader(const Tagset& tagset, const std::string& corpus_type, const std::string& corpus_file_path)
 	: corpus_type_(corpus_type), tagset_(tagset), corpus_path_(corpus_file_path)
 {
@@ -33,7 +48,7 @@ DocumentReader::DocumentReader(const Tagset& tagset, const std::string& corpus_t
 #ifdef WITH_POLIQARP
 	} else if (corpus_type_ == "poliqarp") {
 		reader = boost::shared_ptr<PoliqarpDocumentReader>(
-					new PoliqarpDocumentReader(tagset_, corpus_path_));
+					new PoliqarpDocumentReader(tagset_, corpus_path_, "poliqarp"));
 #endif
 	} else {
 		throw Corpus2Error(corpus_type_ + " is an unknown reader type!");
diff --git a/libcorpus2_whole/io/documentreader.h b/libcorpus2_whole/io/documentreader.h
index 9bfe43917a78adef0d0ddccda651452ef94ad538..760fd67c98330dcf5a7c0f8f0793cfff84e33e5a 100644
--- a/libcorpus2_whole/io/documentreader.h
+++ b/libcorpus2_whole/io/documentreader.h
@@ -11,8 +11,8 @@ namespace whole {
 class DocumentReader
 {
 public:
+	DocumentReader(const Tagset& tagset, const std::string& corpus_type, const std::string& corpus_file_path, const std::string& corpus_reader);
 	DocumentReader(const Tagset& tagset, const std::string& corpus_type, const std::string& corpus_file_path);
-
 	boost::shared_ptr<Document> read();
 
 private:
diff --git a/libcorpus2_whole/io/poliqarpdocumentreader.cpp b/libcorpus2_whole/io/poliqarpdocumentreader.cpp
index b52ddacc106a913c72491a7da4263049e3325e50..a2d0644e68fd03a13b38945cf90b44bcc442d5f1 100644
--- a/libcorpus2_whole/io/poliqarpdocumentreader.cpp
+++ b/libcorpus2_whole/io/poliqarpdocumentreader.cpp
@@ -4,10 +4,17 @@
 namespace Corpus2 {
 namespace whole {
 
+PoliqarpDocumentReader::PoliqarpDocumentReader(const Tagset& tagset, const std::string& corpus_path, const std::string& corpus_reader)
+	: DocumentReaderI("poliqarp")
+{
+	this->pqr_ = Corpus2::TokenReader::create_path_reader(corpus_reader, tagset, corpus_path);
+}
+
 PoliqarpDocumentReader::PoliqarpDocumentReader(const Tagset& tagset, const std::string& corpus_path)
 	: DocumentReaderI("poliqarp")
 {
-	this->pqr_ = boost::shared_ptr<PoliqarpReader>(new PoliqarpReader(tagset, corpus_path));
+
+	this->pqr_ = Corpus2::TokenReader::create_path_reader("poliqarp", tagset, corpus_path);
 }
 
 boost::shared_ptr<Document> PoliqarpDocumentReader::read()
@@ -26,5 +33,6 @@ boost::shared_ptr<Document> PoliqarpDocumentReader::read()
 	return document;
 }
 
+
 } // whole ns
 } // Corpus2 ns
diff --git a/libcorpus2_whole/io/poliqarpdocumentreader.h b/libcorpus2_whole/io/poliqarpdocumentreader.h
index 58d33183feedf9763aeda12be1ef218550f50899..70cb046a2bea3efa89512edc3651755fd5495fc5 100644
--- a/libcorpus2_whole/io/poliqarpdocumentreader.h
+++ b/libcorpus2_whole/io/poliqarpdocumentreader.h
@@ -18,8 +18,8 @@ namespace whole {
 class PoliqarpDocumentReader : public DocumentReaderI
 {
 public:
+	PoliqarpDocumentReader(const Tagset& tagset, const std::string& corpus_path, const std::string& corpus_reader);
 	PoliqarpDocumentReader(const Tagset& tagset, const std::string& corpus_path);
-
 	/**
 	 * Semantic of this methd is similar to get_next_document from Poliqarp Client
 	 * @return nth readed document
@@ -35,7 +35,7 @@ public:
 
 private:
 	/// Poliqarp reader used for reading Poliqarp corp
-	boost::shared_ptr<PoliqarpReader> pqr_;
+        Corpus2::TokenReader::TokenReaderPtr pqr_;
 };
 
 } // whole ns
diff --git a/swig/documentreader.i b/swig/documentreader.i
index bafc3ea7d4c7f27eaf65bb4a92d1743898b8d911..a36031549f465b57a16b057f214ab394993cd929 100644
--- a/swig/documentreader.i
+++ b/swig/documentreader.i
@@ -19,7 +19,8 @@ namespace Corpus2 {
 namespace whole {
   class DocumentReader {
   public:
-    DocumentReader(const Tagset& tagset, const std::string& corpus_type,const std::string& corpus_file);
+    DocumentReader(const Tagset& tagset, const std::string& corpus_type,const std::string& corpus_file_path, const std::string& corpus_reader);
+    DocumentReader(const Tagset& tagset, const std::string& corpus_type,const std::string& corpus_file_path);
     boost::shared_ptr<Document> read();
   };
 } // whole ns