diff --git a/swig/Makefile b/swig/Makefile
index 17ffc19a0b261703b0eb0a8af14e7629467448d8..fe8d19f706d4dbb47371b8151fe7dd4ddd41cf7a 100644
--- a/swig/Makefile
+++ b/swig/Makefile
@@ -16,42 +16,48 @@ CPPFLAGS=-fPIC -O2
 CBIN=libcorpustag.o \
 		 libcorpustagset.o \
 		 libcorpustagsetmanager.o \
-		 libcorpuslexeme.o
+		 libcorpuslexeme.o \
+		 libcorpussentence.o
 
 CBINOUT=_boost_shared_ptr.so \
 				_libcorpustag.so \
 				_libcorpustagset.so \
 				_libcorpustagsetmanager.so \
 				_libcorpuslexeme.so \
-				_libcorpustoken.so
+				_libcorpustoken.so \
+				_libcorpussentence.so
 
 CWRAP=boost_shared_ptr_wrap.cxx \
 			libcorpustag_wrap.cxx \
 			libcorpustagset_wrap.cxx \
 			libcorpustagsetmanager_wrap.cxx \
 			libcorpuslexeme_wrap.cxx \
-			libcorpustoken_wrap.cxx
+			libcorpustoken_wrap.cxx \
+			libcorpussentence_wrap.cxx
 
 CWRAPBIN=boost_shared_ptr_wrap.o \
 				 libcorpustag_wrap.o \
 				 libcorpustagset_wrap.o \
 				 libcorpustagsetmanager_wrap.o \
 				 libcorpuslexeme_wrap.o \
-				 libcorpustoken_wrap.o
+				 libcorpustoken_wrap.o \
+				 libcorpussentence_wrap.o
 
 PYMODULES=boost_shared_ptr.py \
 					libcorpustag.py \
 					libcorpustagset.py \
 					libcorpustagsetmanager.py \
 					libcorpuslexeme.py \
-					libcorpustoken.py
+					libcorpustoken.py \
+					libcorpussentence.py
 
 PYCBIN=boost_shared_ptr.pyc \
 			 libcorpustag.pyc \
 			 libcorpustagset.pyc \
 			 libcorpustagsetmanager.pyc \
 			 libcorpuslexeme.pyc \
-			 libcorpustoken.pyc
+			 libcorpustoken.pyc \
+			 libcorpussentence.pyc
 
 # -----------------------------------------------------------------------------
 all:boost_shared_ptr.o $(CBIN)
@@ -99,6 +105,13 @@ libcorpuslexeme.o:
 	$(CPP) -shared libcorpuslexeme_wrap.o \
 		$(PWRUTILBIN) $(CORPUS2BIN) -o _libcorpuslexeme.so
 
+# Sentence
+libcorpussentence.o:
+	$(SWIG) $(SWIGOPTS_LANG) libcorpussentence.i
+	$(CPP) -c libcorpussentence_wrap.cxx -I$(PYTHONDIR) $(CPPFLAGS)
+	$(CPP) -shared libcorpussentence_wrap.o \
+		$(PWRUTILBIN) $(CORPUS2BIN) -o _libcorpussentence.so
+
 # -----------------------------------------------------------------------------
 clean:
 	rm -f $(CBIN) $(CBINOUT) $(CWRAP) $(CWRAPBIN) $(PYMODULES) $(PYCBIN)
diff --git a/swig/libcorpussentence.i b/swig/libcorpussentence.i
new file mode 100644
index 0000000000000000000000000000000000000000..9fa1d1b2c231e8fdf88444f6c14c468a586661dc
--- /dev/null
+++ b/swig/libcorpussentence.i
@@ -0,0 +1,51 @@
+#ifndef SWIG_LIBCORPUS2_SENTENCE_I
+#define SWIG_LIBCORPUS2_SENTENCE_I
+
+%module libcorpussentence
+%{
+  #include <libcorpus2/sentence.h>
+%}
+
+%include "std_string.i"
+%include "libcorpustoken.i"
+%include "boost_shared_ptr.i"
+
+%template(Ptr) boost::shared_ptr<Corpus2::Sentence>;
+%template(ConstPtr) boost::shared_ptr<const Corpus2::Sentence>;
+
+namespace Corpus2 {
+  class Sentence {
+  public:
+    typedef boost::shared_ptr<Sentence> Ptr;
+    typedef boost::shared_ptr<const Sentence> ConstPtr;
+    
+    /* --------------------------------------------------------------------- */
+
+    Sentence();
+    ~Sentence();
+
+    /* --------------------------------------------------------------------- */
+
+    virtual Ptr clone_shared() const;
+    void release_tokens();
+    bool empty() const;
+    size_t size() const;
+    
+    %rename(GetToken) operator[];
+    Token* operator[](size_t idx);
+
+    %rename(GetConstToken) operator[];
+    const Token* operator[](size_t idx) const;
+
+    const std::vector<Token*>& tokens() const;
+    std::vector<Token*>& tokens();
+
+    virtual void append(Token* t);
+    const Token* first_token() const;
+  };
+}
+
+using namespace std;
+using namespace Corpus2;
+
+#endif /* SWIG_LIBCORPUS2_SENTENCE_I */