diff --git a/PyNDN/Face.py b/PyNDN/Face.py
index 6186569..3f76f5d 100644
--- a/PyNDN/Face.py
+++ b/PyNDN/Face.py
@@ -1,12 +1,12 @@
 ## -*- 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
@@ -22,6 +22,7 @@
 import ns.ndnSIM
 from Data import Data
 from Interest import Interest
+from Name import Name
 
 import functools
 
@@ -40,7 +41,7 @@
     def defer_verification (self, deferVerification = True):
         pass
 
-    def expressInterestSimple (self, name, onData, onTimeout, template = None):
+    def expressInterest (self, name, onData, onTimeout, template = None):
         """
         onData:    void <interest, name>
         onTimeout: void <interest>
@@ -55,7 +56,7 @@
             def __call__ (self, interest, data):
                 if self.onData:
                     return self.onData (Interest (interest=interest), Data (data = data))
-        
+
         class OnTimeoutConvert:
             def __init__ (self, onTimeout):
                 self.onTimeout = onTimeout
@@ -63,9 +64,9 @@
                 if self.onTimeout:
                     self.onTimeout (Interest (interest=interest))
 
-        self.ExpressInterest (interest, OnDataConvert (onData), OnTimeoutConvert (onTimeout))
+        self.ExpressInterest (interest._interest, OnDataConvert (onData), OnTimeoutConvert (onTimeout))
 
-    def setInterestFilterSimple (self, name, onInterest, flags = None):
+    def setInterestFilter (self, name, onInterest, flags = None):
         """
         onInterest: void <name, interest>
         """
@@ -77,27 +78,27 @@
                 if self.onInterest:
                     self.onInterest (Name (name = name), Interest (interest = interest))
 
+        if isinstance (name, Name):
+            name = name._name
+        elif isinstance (name, ns.ndnSIM.ndn.Name):
+            pass
+        else:
+            raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
+
         self.SetInterestFilter (name, OnInterestConvert (onInterest))
 
     def clearInterestFilter (self, name):
-        if type (name) is Name:
-            self.ClearInterestFilter (name._name)
-        elif type (name) is ns.ndnSIM.ndn.Name:
-            self.ClearInterestFilter (name)
+        if isinstance (name, Name):
+            name = name._name
+        elif isinstance (name, ns.ndnSIM.ndn.Name):
+            pass
         else:
             raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
 
+        self.ClearInterestFilter (name)
+
     def get (self, name, template = None, timeoutms = 3000):
         raise NotImplementedError ("NS-3 simulation cannot have syncrhonous operations")
 
     def put (self, data):
         self.Put (data)
-
-class EventLoop(object):
-    def execute (self, event):
-        ns.core.Simulator.ScheduleNow (event)
-
-    def run (self, timeoutMs):
-        ns.core.Simulator.Stop (ns.core.MilliSeconds (timeoutMs))
-        ns.core.Simulator.Run ()
-        ns.core.Simulator.Destroy ()
