diff --git a/libcorpus2/io/relreader.cpp b/libcorpus2/io/relreader.cpp
index a55f02c6a0ee08b3ed7cbdaf7c57263951cb0f9c..1fa75c0bcfa5f29c7a653802d4aad789314f8456 100644
--- a/libcorpus2/io/relreader.cpp
+++ b/libcorpus2/io/relreader.cpp
@@ -28,6 +28,8 @@ RelationReader::RelationReader(const std::string &rela_path)
 	readed_ = false;
 	in_relation_ = false;
 	in_relations_ = false;
+	in_from_direct_ = false;
+	in_to_direct_ = false;
 
 	file_.reset(new std::ifstream(rela_path.c_str(), std::ifstream::in));
 
@@ -73,9 +75,11 @@ void RelationReader::on_start_element(const Glib::ustring& name,
 		parse_relation_name(attributes);
 	}
 	else if (in_relation_ && name == RELATION_DIRECT_FROM) {
+		in_from_direct_ = true;
 		parse_direction_from(attributes);
 	}
 	else if (in_relation_ && name == RELATION_DIRECT_TO) {
+		in_to_direct_ = true;
 		parse_direction_to(attributes);
 	}
 	else {
@@ -84,6 +88,8 @@ void RelationReader::on_start_element(const Glib::ustring& name,
 }
 
 void RelationReader::on_end_element(const Glib::ustring& name) {
+	int annotation_number = 99999999;
+
 	if (name == RELATIONS_TAG) {
 		in_relations_ = false;
 	}
@@ -96,6 +102,26 @@ void RelationReader::on_end_element(const Glib::ustring& name) {
 			throw;
 		}
 	}
+	else if (in_from_direct_) {
+		std::istringstream (ann_number_) >> annotation_number;
+		rel_from_ = boost::make_shared<DirectionPoint>(
+			rel_from_->sentence_id(),
+			rel_from_->channel_name(),
+			annotation_number
+		);
+		ann_number_ = "";
+		in_from_direct_ = false;
+	}
+	else if (in_to_direct_) {
+		std::istringstream (ann_number_) >> annotation_number;
+		rel_to_ = boost::make_shared<DirectionPoint>(
+			rel_to_->sentence_id(),
+			rel_to_->channel_name(),
+			annotation_number
+		);
+		ann_number_ = "";
+		in_to_direct_ = false;
+	}
 	else {
 		//
 	}
@@ -156,8 +182,6 @@ void RelationReader::parse_direction(const AttributeList& attributes,
 	std::string sentence_id = get_attribute_value(attributes, RELATION_SENTENCE_ID);
 	std::string channel_name = get_attribute_value(attributes, RELATION_CHANNEL_NAME);
 
-	std::istringstream (ann_number_) >> annotation_number;
-
 	direct = boost::make_shared<DirectionPoint>(
 			sentence_id, channel_name, annotation_number);
 }
diff --git a/libcorpus2/io/relreader.h b/libcorpus2/io/relreader.h
index 6ec9b79ebb76fd26379fcb71eca6e173f6d191c5..fea4cdab732f86ae2e12d53932a2f09f728cb8ed 100644
--- a/libcorpus2/io/relreader.h
+++ b/libcorpus2/io/relreader.h
@@ -105,6 +105,8 @@ private:
 	bool readed_;
 	bool in_relation_;
 	bool in_relations_;
+	bool in_from_direct_;
+	bool in_to_direct_;
 
 	/// File pointer
 	boost::scoped_ptr<std::istream> file_;
diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt
index 1221f861eebe28ecc83369a949809965a8f616b3..732acec748b559786f3bace19959f4e8dc264396 100644
--- a/swig/CMakeLists.txt
+++ b/swig/CMakeLists.txt
@@ -12,6 +12,10 @@ link_directories(${Libcorpus2_BINARY_DIR})
 FIND_PACKAGE(SWIG REQUIRED)
 INCLUDE(${SWIG_USE_FILE})
 
+FIND_PACKAGE(LibXML++ REQUIRED QUIET)
+include_directories(${LibXML++_INCLUDE_DIRS})
+
+
 find_package(PythonLibs)
 find_package(PythonInterp)
 # idea taken from pyplot build system 
diff --git a/swig/corpus2.i b/swig/corpus2.i
index 83890f2fb1fa298d96ac843695b9e24615d61977..b925343a152e6c2e05c8aac41b7588b225e4c181 100644
--- a/swig/corpus2.i
+++ b/swig/corpus2.i
@@ -10,19 +10,22 @@
 %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"
 %include "tagset.i"
 %include "tagsetmanager.i"
 %include "token.i"
 %include "tokenmetadata.i"
 %include "tokenreader.i"
 %include "tokenwriter.i"
-%include "libpwrnlperror.i"
-%include "tagging.i"
 
 %{
 #include <libcorpus2/util/settings.h>
diff --git a/swig/document.i b/swig/document.i
new file mode 100644
index 0000000000000000000000000000000000000000..20fc12cd5dda5736c0be436eadbe327b3eb5b4b1
--- /dev/null
+++ b/swig/document.i
@@ -0,0 +1,33 @@
+#ifndef SWIG_LIBCORPUS2_DOCUMENT_I
+#define SWIG_LIBCORPUS2_DOCUMENT_I
+
+%module libcorpusdocument
+%{
+  #include <libcorpus2/document.h>
+%}
+
+%include "std_defs.i"
+%include "chunk.i"
+%include "relation.i"
+
+%template(DocumentPtr) boost::shared_ptr<Corpus2::Document>;
+%template(ConstDocumentPtr) boost::shared_ptr<const Corpus2::Document>;
+
+namespace Corpus2 {
+  class Document {
+  public:
+    Document();
+    ~Document();
+
+    void add_paragraph(const boost::shared_ptr<Chunk> para);
+    void add_relation(const boost::shared_ptr<Relation> relation);
+
+    const std::vector< boost::shared_ptr<Chunk> >& paragraphs() const;
+    const std::vector< boost::shared_ptr<Relation> >& relations() const;
+  };
+}
+
+using namespace std;
+using namespace Corpus2;
+
+#endif /* SWIG_LIBCORPUS2_DOCUMENT_I */
diff --git a/swig/documentreader.i b/swig/documentreader.i
new file mode 100644
index 0000000000000000000000000000000000000000..1a4bf310479ec25181c39ff5d4afb6a8c41f9d93
--- /dev/null
+++ b/swig/documentreader.i
@@ -0,0 +1,26 @@
+#ifndef SWIG_LIBCORPUS2_DOCUMENTREADER_I
+#define SWIG_LIBCORPUS2_DOCUMENTREADER_I
+
+%module libcorpusdocumentreader
+%{
+  #include <libcorpus2/io/docreader.h>
+%}
+
+%include "document.i"
+%include "boost_shared_ptr.i"
+
+namespace Corpus2 {
+  class DocumentReader {
+  public:
+    DocumentReader(const Tagset&, const std::string&, const std::string &);
+    boost::shared_ptr<Document> read();
+
+    /* --------------------------------------------------------------------- */
+    ~DocumentReader();
+  };
+}
+
+using namespace std;
+using namespace Corpus2;
+
+#endif /* SWIG_LIBCORPUS2_DOCUMENTREADER_I */
diff --git a/swig/relationreader.i b/swig/relationreader.i
new file mode 100644
index 0000000000000000000000000000000000000000..0fbd550bee2608bf50123dc09bb67be89472a0d1
--- /dev/null
+++ b/swig/relationreader.i
@@ -0,0 +1,20 @@
+#ifndef SWIG_LIBCORPUS2_RELATIONREADER_I
+#define SWIG_LIBCORPUS2_RELATIONREADER_I
+
+%module libcorpusrelationreader
+%{
+  #include <libcorpus2/io/relreader.h>
+%}
+
+namespace Corpus2 {
+  class RelationReader {
+  public:
+    RelationReader(const std::string &rela_path);
+    const std::vector< boost::shared_ptr<Relation> >& relations();
+  };
+}
+
+using namespace std;
+using namespace Corpus2;
+
+#endif /* SWIG_LIBCORPUS2_RELATIONREADER_I */