diff --git a/swig/libcorpustokenreader.i b/swig/libcorpustokenreader.i
index c5d64d1ae4f7bc731f9e9872c1d694aaa7cf2268..901b259f2f5c1aebaeb838b8e66bd1e15cbd3798 100644
--- a/swig/libcorpustokenreader.i
+++ b/swig/libcorpustokenreader.i
@@ -18,13 +18,15 @@
 
 %nodefaultctor Corpus2::TokenReader;
 %template(TokenReaderPtr) boost::shared_ptr<Corpus2::TokenReader>;
+%template(TokenPtr) boost::shared_ptr<Corpus2::Token>;
 // %template(StdStringVector) std::vector<std::string>;
 // %template(ChunkPtr) boost::shared_ptr<Corpus2::Chunk>;
-
+typedef boost::shared_ptr<Corpus2::Token> TokenPtr;
 namespace Corpus2 {
   class TokenReader {
   public:
     typedef boost::shared_ptr<TokenReader> TokenReaderPtr;
+    //typedef boost::shared_ptr<Token> TokenPtr;
 
     /* --------------------------------------------------------------------- */
     explicit TokenReader(const Tagset& tagset);
@@ -58,7 +60,7 @@ namespace Corpus2 {
       std::istream& stream);
 
     /* --------------------------------------------------------------------- */
-    virtual Token* get_next_token() = 0;
+    /* virtual Token* get_next_token() = 0; */
     virtual Sentence::Ptr get_next_sentence() = 0;
     virtual boost::shared_ptr<Chunk> get_next_chunk() = 0;
     virtual bool has_more() = 0;
@@ -76,6 +78,13 @@ namespace Corpus2 {
     static std::vector<std::string> available_reader_types_help();
   };
 
+  %extend TokenReader {
+    /* modfify the native get_next_token to wrap the tokens into shared_ptr */
+    boost::shared_ptr<Corpus2::Token> get_next_token() {
+      return boost::shared_ptr<Corpus2::Token>(self->get_next_token());
+    }
+  }
+
   std::vector<boost::shared_ptr<Chunk> > read_chunks_from_utf8_string(
     const std::string& data, const Tagset& tagset, const std::string& format);