diff --git a/PyNDN/Interest.py b/PyNDN/Interest.py
index 3256a7c..ddafb65 100644
--- a/PyNDN/Interest.py
+++ b/PyNDN/Interest.py
@@ -17,166 +17,61 @@
 #             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
+import ns.ndnSIM
+import ns.core
+import Name
 
 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):
+    _interest = None
+
+    def __init__(self, name = None, 
+                 scope = None, interestLifetime = None):
+        self._interest = ns.ndnSIM.ndn.Interest ()
         
         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 __getattr__ (self, name):
+        if name == "name":
+            return Name (self._interest.GetName ())
+        elif name == "scope":
+            return self._interest.GetScope ()
+        elif name == "interestLifetime":
+            return self._interest.GetInterestLifetime ().ToDouble (ns.core.Time.S)
+        else:
+            return self._interest.__getattribute__ (name)
 
     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)
+        if name == "_interest":
+            return object.__setattr__ (self, name, value)
+        elif name == "name":
+            if not value:
+                return self._interest.SetName (ns.ndnSIM.ndn.Name ())
+            elif type (value) is Name:
+                return self._interest.SetName (value._name)
+            elif type (value) is ns.ndnSIM.ndn.Name:
+                return self._interest.SetName (value)
+            elif type (value) is str:
+                return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
+            else:
+                raise ValueError ("Invalid name parameter")
+        elif name == "scope":
+            if not value:
+                return self._interest.SetScope (-1)
+            elif type (value) is int:
+                return self._interest.SetScope (value)
+            else:
+                raise ValueError ("Scope parameter should be int, [%s] supplied" % type (value))
+        elif name == "interestLifetime":
+            if not value:
+                return self._interest.SetInterestLifetime (ns.core.Time ())
+            elif type (value) is float or type (value) is int:
+                return self._interest.SetInterestLifetime (ns.core.Seconds (value))
+            else:
+                raise ValueError ("interestLifetime parameter should be fload or int, [%s] supplied" % type (value))
+        else:
+            raise ValueError ("Unknown or unsupported attribute [%s]" % name)
 
     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)
+        return "ndnSIM.Interest(%s)" % str (self._interest)
