diff --git a/libcorpus2/tokenmetadata.cpp b/libcorpus2/tokenmetadata.cpp
index c41f769c65ac33e5af87f5ae4db1f4cbad95e9a1..88ae6deaa9c168bb3828870455f7b17d0a93083d 100644
--- a/libcorpus2/tokenmetadata.cpp
+++ b/libcorpus2/tokenmetadata.cpp
@@ -24,9 +24,9 @@ TokenMetaData::TokenMetaData()
 {
 }
 
-TokenMetaData* TokenMetaData::clone() const
+boost::shared_ptr<TokenMetaData> TokenMetaData::clone() const
 {
-	return new TokenMetaData(*this);
+	return boost::make_shared<TokenMetaData>(*this);
 }
 
 bool TokenMetaData::has_attribute(const std::string &name) const
diff --git a/libcorpus2/tokenmetadata.h b/libcorpus2/tokenmetadata.h
index 6d1c6444c23173ea28dc6f1530aefb93eaa41bbb..fb367a6c512c5ad7d79854c192650589517dab5d 100644
--- a/libcorpus2/tokenmetadata.h
+++ b/libcorpus2/tokenmetadata.h
@@ -30,7 +30,7 @@ class TokenMetaData
 public:
 	TokenMetaData();
 
-	TokenMetaData* clone() const;
+	boost::shared_ptr<TokenMetaData> clone() const;
 
 	typedef std::map<std::string, std::string> attr_map_t;