diff --git a/libcorpus2/io/cclwriter.cpp b/libcorpus2/io/cclwriter.cpp
index 4909291996ac478a6a1ada2b654ac37241d19da2..b5ecf86a6eb53edc2d16af7177d5df89c9496721 100644
--- a/libcorpus2/io/cclwriter.cpp
+++ b/libcorpus2/io/cclwriter.cpp
@@ -58,7 +58,7 @@ void CclWriter::write_sentence_int(const Sentence &s)
 				os() << v.second.get_segment_at(idx);
 				os() << "</ann>\n";
 			}
-			TokenMetaData* md = t->get_metadata();
+			boost::shared_ptr<TokenMetaData> md = t->get_metadata();
 			if (md) {
 				foreach (const TokenMetaData::attr_map_t::value_type& v, md->attributes()) {
 					osi() << "<prop key=\"" << v.first << "\"" << ">";
diff --git a/libcorpus2/token.cpp b/libcorpus2/token.cpp
index 496289af8fecced0c5c4bef1c5499b0f852eb247..5438c4b2caad75c58c4d81c0aced6850fe37ae1f 100644
--- a/libcorpus2/token.cpp
+++ b/libcorpus2/token.cpp
@@ -23,7 +23,7 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 namespace Corpus2 {
 
 Token::Token()
-	: orth_(), wa_(), lexemes_(), metadata_(NULL)
+	: orth_(), wa_(), lexemes_(), metadata_()
 {
 }
 
@@ -44,8 +44,8 @@ Token* Token::clone() const
 	t->orth_ = orth_;
 	t->wa_ = wa_;
 	t->lexemes_ = lexemes_;
-	if (metadata_.get()) {
-		t->set_metadata(metadata_->clone());
+	if (metadata_) {
+		t->set_metadata_ptr(metadata_->clone());
 	}
 	return t;
 }
@@ -153,7 +153,8 @@ bool Token::orth_pos_match(mask_t pos, const UnicodeString &orth) const
 
 void Token::create_metadata()
 {
-	metadata_.reset(new TokenMetaData);
+	// metadata_.reset(new TokenMetaData);
+	metadata_ = boost::make_shared<TokenMetaData>();
 }
 
 } /* end ns Corpus2 */
diff --git a/libcorpus2/token.h b/libcorpus2/token.h
index d1834509207edfe9f2e5d64db1c8f65a4bc51aa0..4ab4272f1db8df09569d06ef8cfd12fc19eb100a 100644
--- a/libcorpus2/token.h
+++ b/libcorpus2/token.h
@@ -24,6 +24,9 @@ or FITNESS FOR A PARTICULAR PURPOSE.
 #include <libpwrutils/util.h>
 #include <libpwrutils/whitespace.h>
 
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
 #include <boost/iterator/filter_iterator.hpp>
 #include <boost/function.hpp>
 
@@ -186,13 +189,19 @@ public:
 	bool orth_pos_match(mask_t pos, const UnicodeString& orth) const;
 
 	/// Metadata setter
-	void set_metadata(TokenMetaData* md) {
-		metadata_.reset(md);
+	void set_metadata(TokenMetaData& md) {
+		// metadata_.reset(md);
+		metadata_ = md.clone();
+	}
+
+	/// Metadata setter (sets metadata as shared_ptr)
+	void set_metadata_ptr(boost::shared_ptr<TokenMetaData> md) {
+		metadata_ = md;
 	}
 
 	/// Metadata getter
-	TokenMetaData* get_metadata() const {
-		return metadata_.get();
+	boost::shared_ptr<TokenMetaData> get_metadata() const {
+		return metadata_;
 	}
 
 	/// Creates an empty metdata object for this Token
@@ -210,7 +219,8 @@ private:
 	std::vector<Lexeme> lexemes_;
 
 	/// Metadata
-	std::auto_ptr<TokenMetaData> metadata_;
+	// std::auto_ptr<TokenMetaData> metadata_;
+	boost::shared_ptr<TokenMetaData> metadata_;
 };
 
 } /* end ns Corpus2 */