diff --git a/swig/libcorpustoken.i b/swig/libcorpustoken.i
new file mode 100644
index 0000000000000000000000000000000000000000..90a4736602bddd3b713ebe28d6a1c18e032179d8
--- /dev/null
+++ b/swig/libcorpustoken.i
@@ -0,0 +1,52 @@
+#ifndef SWIG_LIBCORPUS2_TOKEN_I
+#define SWIG_LIBCORPUS2_TOKEN_I
+
+%module libcorpustoken
+%{
+  #include <unicode/unistr.h>
+  #include <libcorpus2/token.h>
+%}
+
+%include "libcorpustagset.i"
+
+%include "std_pair.i"
+%include "std_string.i"
+%include "std_vector.i"
+
+%feature("notabstract") Corpus2::Token;
+
+%rename(__op_eq__) Corpus2::Token::operator==(const Token& other) const;
+
+namespace Corpus2 {
+  class Token {
+  public:
+    Token();
+    Token(const UnicodeString& orth, PwrNlp::Whitespace::Enum wa);
+    Token* clone() const;
+    
+    const UnicodeString& orth() const;
+    std::string orth_utf8() const;
+    void set_orth(const UnicodeString& orth);
+    const PwrNlp::Whitespace::Enum& wa() const;
+    void set_wa(const PwrNlp::Whitespace::Enum& wa);
+    const std::vector<Lexeme>& lexemes() const;
+    std::vector<Lexeme>& lexemes();
+    void add_lexeme(const Lexeme& lex);
+    const Lexeme& get_preferred_lexeme(const Tagset& tagset) const;
+    size_t get_preferred_lexeme_index(const Tagset& tagset) const;
+    void make_ign(const Tagset& tagset);
+    void add_ign(const Tagset& tagset);
+    bool operator==(const Token& other) const;
+    bool check_duplicate_lexemes() const;
+    bool remove_duplicate_lexemes();
+    bool has_disamb_lexeme() const;
+    int count_disamb_lexemes() const;
+    std::pair<lexeme_filter_iterator, lexeme_filter_iterator> disamb_lexemes() const;
+  };
+}
+
+using namespace std;
+using namespace Corpus2;
+
+
+#endif /* SWIG_LIBCORPUS2_TOKEN_I */