diff --git a/libcorpus2/ann/annotatedsentence.cpp b/libcorpus2/ann/annotatedsentence.cpp
index 327e9bad2be2d574c84d35e077ff1a088a0a861e..7203d85d7fa69b597f0de1168e0aec8bac78185e 100644
--- a/libcorpus2/ann/annotatedsentence.cpp
+++ b/libcorpus2/ann/annotatedsentence.cpp
@@ -29,20 +29,30 @@ Sentence::Ptr AnnotatedSentence::clone_shared() const
 boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence(
 	const boost::shared_ptr<Sentence>& s)
 {
-	boost::shared_ptr<AnnotatedSentence> a = boost::make_shared<AnnotatedSentence>();
-	foreach (Token* t, s->tokens()) {
-		a->append(t);
+	boost::shared_ptr<AnnotatedSentence> a;
+	a = boost::dynamic_pointer_cast<AnnotatedSentence>(s);
+	if (!a) {
+		a = boost::make_shared<AnnotatedSentence>();
+		foreach (Token* t, s->tokens()) {
+			a->append(t);
+		}
+		s->release_tokens();
 	}
-	s->release_tokens();
 	return a;
 }
 
 boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence_clone(
 	const boost::shared_ptr<Sentence>& s)
 {
-	boost::shared_ptr<AnnotatedSentence> a = boost::make_shared<AnnotatedSentence>();
-	foreach (Token* t, s->tokens()) {
-		a->append(t->clone());
+	boost::shared_ptr<AnnotatedSentence> a;
+	a = boost::dynamic_pointer_cast<AnnotatedSentence>(s);
+	if (!a) {
+		a = boost::make_shared<AnnotatedSentence>();
+		foreach (Token* t, s->tokens()) {
+			a->append(t->clone());
+		}
+	} else {
+		a = boost::dynamic_pointer_cast<AnnotatedSentence>(a->clone_shared());
 	}
 	return a;
 }