diff --git a/libcorpus2/io/xcesreader.cpp b/libcorpus2/io/xcesreader.cpp
index cb7ec43dc4f3e704ac939bf074d3b0773d9d6718..010c81bf3044fe4ecf75dde159213be8ad20948d 100644
--- a/libcorpus2/io/xcesreader.cpp
+++ b/libcorpus2/io/xcesreader.cpp
@@ -3,6 +3,8 @@
 #include <libpwrutils/foreach.h>
 #include <libxml++/libxml++.h>
 
+#include <fstream>
+
 namespace Corpus2 {
 
 class XcesReaderImpl : public BasicSaxParser
@@ -45,9 +47,24 @@ protected:
 
 XcesReader::XcesReader(const Tagset& tagset, std::istream& is,
 		bool disamb_only, bool disamb_sh)
-	: BufferedChunkReader(tagset), is_(is)
-	, impl_(new XcesReaderImpl(tagset, chunk_buf_, disamb_only, disamb_sh))
+	: BufferedChunkReader(tagset),
+	impl_(new XcesReaderImpl(tagset, chunk_buf_, disamb_only, disamb_sh))
+{
+	this->is_ = &is;
+}
+
+XcesReader::XcesReader(const Tagset& tagset, std::string& filename, bool disamb_only, bool disamb_sh)
+	: BufferedChunkReader(tagset),
+	impl_(new XcesReaderImpl(tagset, chunk_buf_, disamb_only, disamb_sh))
 {
+	this->is_owned_.reset(new std::ifstream(filename.c_str(), std::ifstream::in));
+
+	if (this->is_owned_->bad()) {
+		throw new Corpus2Error("File not found!");
+	}
+	else {
+		this->is_ = is_owned_.get();
+	}
 }
 
 XcesReader::~XcesReader()
diff --git a/libcorpus2/io/xcesreader.h b/libcorpus2/io/xcesreader.h
index 457a8aadcda20560a3a1886a9b71cd07edf7b5e8..0fb11078f6ae58a1e7bb075b6f21f5182c785158 100644
--- a/libcorpus2/io/xcesreader.h
+++ b/libcorpus2/io/xcesreader.h
@@ -17,16 +17,21 @@ public:
 	XcesReader(const Tagset& tagset, std::istream& is,
 			bool disamb_only = false, bool disamb_sh = false);
 
+	XcesReader(const Tagset& tagset, std::string& filename,
+			bool disamb_only = false, bool disamb_sh = false);
+
 	~XcesReader();
 
 	std::istream& is() {
-		return is_;
+		return *is_;
 	}
 
 protected:
 	void ensure_more();
 
-	std::istream& is_;
+	// std::istream& is_;
+	std::istream* is_;
+	boost::scoped_ptr<std::istream> is_owned_;
 
 	boost::scoped_ptr<XcesReaderImpl> impl_;
 };