diff --git a/PyNDN/Interest.py b/PyNDN/Interest.py
new file mode 100644
index 0000000..7ebee01
--- /dev/null
+++ b/PyNDN/Interest.py
@@ -0,0 +1,182 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+# 
+# Copyright (c) 2011-2013, Regents of the University of California
+#                          Alexander Afanasyev
+# 
+# GNU 3.0 license, See the LICENSE file for more information
+# 
+# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+# 
+
+#
+# Based on PyCCN code, copyrighted and licensed as follows
+#
+# Copyright (c) 2011-2013, Regents of the University of California
+# BSD license, See the COPYING file for more information
+# Written by: Derek Kulinski <takeda@takeda.tk>
+#             Jeff Burke <jburke@ucla.edu>
+#
+
+import ndn.Name
+
+class AOKType(utils.Flag):
+    _prefix = "ndn"
+
+AOK_NONE = AOKType.new_flag('AOK_NONE', 0x0)
+AOK_CS = AOKType.new_flag('AOK_CS', 0x1)  # Answer from content store
+AOK_NEW = AOKType.new_flag('AOK_NEW', 0x2)  # OK to produce new content
+AOK_STALE = AOKType.new_flag('AOK_STALE', 0x4)  # OK to answer with stale data
+AOK_EXPIRE = AOKType.new_flag('AOK_EXPIRE', 0x10) # Mark as stale (requires scope 0)
+
+AOK_DEFAULT = AOK_CS | AOK_NEW
+
+CHILD_SELECTOR_LEFT = 0
+CHILD_SELECTOR_RIGHT = 1
+
+class Interest(object):
+    def __init__(self, name = None, minSuffixComponents = None,
+             maxSuffixComponents = None, publisherPublicKeyDigest = None,
+             exclude = None, childSelector = None, answerOriginKind = None,
+             scope = None, interestLifetime = None, nonce = None):
+        
+        self.name = name
+
+        #
+        # Not supported at the moment
+        #
+        # self.minSuffixComponents = minSuffixComponents  # default 0
+        # self.maxSuffixComponents = maxSuffixComponents  # default infinity
+        # self.publisherPublicKeyDigest = publisherPublicKeyDigest  # SHA256 hash
+        # self.exclude = exclude
+        # self.childSelector = childSelector
+        # self.answerOriginKind = answerOriginKind
+
+        self.scope = scope
+        self.interestLifetime = interestLifetime
+        self.nonce = nonce
+
+        # wire
+        self.wire_dirty = True
+        self.wire = None  # backing charbuf
+
+    def __setattr__(self, name, value):
+        if name != "wire_dirty":
+            self.wire_dirty = True
+        object.__setattr__(self, name, value)
+
+    def __getattribute__(self, name):
+        if name == "wire":
+            # force refresh if components changed
+            if object.__getattribute__(self, 'name') and self.name.wire_dirty:
+                self.wire_dirty = True
+            elif object.__getattribute__(self, 'exclude') and self.exclude.wire_dirty:
+                self.wire_dirty = True
+
+            if object.__getattribute__(self, 'wire_dirty'):
+                self.wire = _ndn.Interest_obj_to_ccn(self)
+                self.wire_dirty = False
+        return object.__getattribute__(self, name)
+
+    def __str__(self):
+        res = []
+        res.append("name: %s" % self.name)
+        res.append("minSuffixComponents: %s" % self.minSuffixComponents)
+        res.append("maxSuffixComponents: %s" % self.maxSuffixComponents)
+        res.append("publisherPublicKeyDigest: %r" % self.publisherPublicKeyDigest)
+        res.append("exclude:\n%s" % self.exclude)
+        res.append("childSelector: %s" % self.childSelector)
+        res.append("answerOriginKind: %s" % self.answerOriginKind)
+        res.append("scope: %s" % self.scope)
+        res.append("interestLifetime: %s" % self.interestLifetime)
+        res.append("nonce: %r" % self.nonce)
+        return "\n".join(res)
+
+    def __repr__(self):
+        args = []
+
+        if self.name is not None:
+            args += ["name=%r" % self.name]
+        if self.minSuffixComponents is not None:
+            args += ["minSuffixComponents=%r" % self.minSuffixComponents]
+        if self.maxSuffixComponents is not None:
+            args += ["maxSuffixComponents=%r" % self.maxSuffixComponents]
+        if self.publisherPublicKeyDigest is not None:
+            args += ["publisherPublicKeyDigest=%r" % self.publisherPublicKeyDigest]
+        if self.exclude is not None:
+            args += ["exclude=%r" % self.exclude]
+        if self.childSelector is not None:
+            args += ["childSelector=%r" % self.childSelector]
+        if self.answerOriginKind is not None:
+            args += ["answerOriginKind=%r" % self.answerOriginKind]
+        if self.scope is not None:
+            args += ["scope=%r" % self.scope]
+        if self.interestLifetime is not None:
+            args += ["interestLifetime=%r" % self.interestLifetime]
+        if self.nonce is not None:
+            args += ["nonce=%r" % self.nonce]
+
+        return "ndn.Interest(%s)" % ", ".join(args)
+
+    def get_aok_value(self):
+        global AOK_DEFAULT
+
+        return AOK_DEFAULT if not self.answerOriginKind else self.answerOriginKind
+
+    def matches_name(self, name):
+        i_name = self.name.components
+        o_name = name.components
+
+        # requested name is longer than ours
+        if len(i_name) > len(o_name):
+            return False
+
+        # at least one of given components don't match
+        if not all(i == j for i, j in zip(i_name, o_name)):
+            return False
+
+        return True
+
+# # Bloom filters will be deprecated, so we do not support them.
+# class ExclusionFilter(object):
+#     def __init__(self):
+#         self.components = []
+
+#         # py-ndn
+#         self.wire_dirty = False
+#         self.wire = None  # backing charbuf
+
+#     def reset(self):
+#         self.components = []
+
+#     def add_names(self, names):
+#         self.wire_dirty = True
+#         self.components.extend(sorted(names))
+
+#     def add_name(self, name):
+#         if not type(name) is Name.Name:
+#             raise TypeError("Name type required")
+
+#         self.wire_dirty = True
+#         self.components.append(name)
+
+#     def add_any(self):
+#         self.components.append(Name.Name(name_type = Name.NAME_ANY))
+
+#     def __setattr__(self, name, value):
+#         if name != "wire_dirty":
+#             self.wire_dirty = True
+#         object.__setattr__(self, name, value)
+
+#     def __getattribute__(self, name):
+#         if name == "wire":
+#             if object.__getattribute__(self, 'wire_dirty'):
+#                 self.wire = _ndn.ExclusionFilter_names_to_ccn(
+#                     self.components)
+#                 self.wire_dirty = False
+#         return object.__getattribute__(self, name)
+
+#     def __str__(self):
+#         comps = []
+#         for n in self.components:
+#             comps.append(str(n))
+#         return str(comps)
