diff --git a/obmc/utils/dtree.py b/obmc/utils/dtree.py
index 07530d4..59d03da 100644
--- a/obmc/utils/dtree.py
+++ b/obmc/utils/dtree.py
@@ -27,13 +27,13 @@
 
     if(isinstance(obj, dict)):
         nodes = []
-        for k, v in obj.items():
+        for k, v in obj.iteritems():
             if(isinstance(v, dict)):
                 nodes.append((k, v))
                 continue
-            if(isinstance(v, str) and v.lower() == 'true'):
+            if(isinstance(v, basestring) and v.lower() == 'true'):
                 fd.write('%s%s' % (tab, k))
-            elif(isinstance(v, str) and v.lower() == 'false'):
+            elif(isinstance(v, basestring) and v.lower() == 'false'):
                 continue
             else:
                 fd.write('%s%s = ' % (tab, k))
@@ -51,7 +51,7 @@
         else:
             fd.write("<%d>" % obj)
 
-    if(isinstance(obj, str)):
+    if(isinstance(obj, basestring)):
         fd.write("\"%s\"" % obj)
 
     if(isinstance(obj, list)):
diff --git a/obmc/utils/pathtree.py b/obmc/utils/pathtree.py
index 190e3b4..a13c6cb 100644
--- a/obmc/utils/pathtree.py
+++ b/obmc/utils/pathtree.py
@@ -20,7 +20,7 @@
         self.path_tree = path_tree
         self.path = []
         self.itlist = []
-        self.subtree = ['/'] + list(filter(bool, subtree.split('/')))
+        self.subtree = ['/'] + filter(bool, subtree.split('/'))
         self.depth = depth
         d = path_tree.root
         for k in self.subtree:
@@ -28,15 +28,15 @@
                 d = d[k]['children']
             except KeyError:
                 raise KeyError(subtree)
-        self.it = iter(d.items())
+        self.it = d.iteritems()
 
     def __iter__(self):
         return self
 
     def __next__(self):
-        return next(super(PathTreeItemIterator, self))
+        return super(PathTreeItemIterator, self).next()
 
-    def __next__(self):
+    def next(self):
         key, value = self._next()
         path = self.subtree[0] + '/'.join(self.subtree[1:] + self.path)
         return path, value.get('data')
@@ -44,13 +44,13 @@
     def _next(self):
         try:
             while True:
-                x = next(self.it)
+                x = self.it.next()
                 depth_exceeded = len(self.path) + 1 > self.depth
                 if self.depth and depth_exceeded:
                     continue
                 self.itlist.append(self.it)
                 self.path.append(x[0])
-                self.it = iter(x[1]['children'].items())
+                self.it = x[1]['children'].iteritems()
                 break
 
         except StopIteration:
@@ -68,7 +68,7 @@
     def __init__(self, path_tree, subtree, depth):
         super(PathTreeKeyIterator, self).__init__(path_tree, subtree, depth)
 
-    def __next__(self):
+    def next(self):
         return super(PathTreeKeyIterator, self).next()[0]
 
 
@@ -92,7 +92,7 @@
 
     def _get_node(self, key):
         kids = 'children'
-        elements = ['/'] + list(filter(bool, key.split('/')))
+        elements = ['/'] + filter(bool, key.split('/'))
         d = self.root
         for k in elements[:-1]:
             try:
@@ -106,14 +106,14 @@
         return self
 
     def __missing__(self, key):
-        for x in self.keys():
+        for x in self.iterkeys():
             if key == x:
                 return False
         return True
 
     def __delitem__(self, key):
         kids = 'children'
-        elements = ['/'] + list(filter(bool, key.split('/')))
+        elements = ['/'] + filter(bool, key.split('/'))
         d = self.root
         for k in elements[:-1]:
             try:
@@ -126,7 +126,7 @@
 
     def __setitem__(self, key, value):
         kids = 'children'
-        elements = ['/'] + list(filter(bool, key.split('/')))
+        elements = ['/'] + filter(bool, key.split('/'))
         d = self.root
         for k in elements[:-1]:
             d = d.setdefault(k, {kids: {}})[kids]
@@ -152,7 +152,7 @@
         return x
 
     def get_children(self, key):
-        return [x for x in self._get_node(key)['children'].keys()]
+        return [x for x in self._get_node(key)['children'].iterkeys()]
 
     def demote(self, key):
         n = self._get_node(key)
@@ -174,12 +174,12 @@
 
     def iterkeys(self, subtree='/', depth=None):
         if not self.root:
-            return iter({}.keys())
+            return {}.iterkeys()
         return PathTreeKeyIterator(self, subtree, depth)
 
     def iteritems(self, subtree='/', depth=None):
         if not self.root:
-            return iter({}.items())
+            return {}.iteritems()
         return PathTreeItemIterator(self, subtree, depth)
 
     def dumpd(self, subtree='/'):
@@ -187,7 +187,7 @@
         d = result
 
         for k, v in self.iteritems(subtree):
-            elements = ['/'] + list(filter(bool, k.split('/')))
+            elements = ['/'] + filter(bool, k.split('/'))
             d = result
             for k in elements:
                 d = d.setdefault(k, {})
