diff --git a/obmc/utils/dtree.py b/obmc/utils/dtree.py
index 59d03da..07530d4 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.iteritems():
+        for k, v in obj.items():
             if(isinstance(v, dict)):
                 nodes.append((k, v))
                 continue
-            if(isinstance(v, basestring) and v.lower() == 'true'):
+            if(isinstance(v, str) and v.lower() == 'true'):
                 fd.write('%s%s' % (tab, k))
-            elif(isinstance(v, basestring) and v.lower() == 'false'):
+            elif(isinstance(v, str) and v.lower() == 'false'):
                 continue
             else:
                 fd.write('%s%s = ' % (tab, k))
@@ -51,7 +51,7 @@
         else:
             fd.write("<%d>" % obj)
 
-    if(isinstance(obj, basestring)):
+    if(isinstance(obj, str)):
         fd.write("\"%s\"" % obj)
 
     if(isinstance(obj, list)):
diff --git a/obmc/utils/pathtree.py b/obmc/utils/pathtree.py
index a13c6cb..190e3b4 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 = ['/'] + filter(bool, subtree.split('/'))
+        self.subtree = ['/'] + list(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 = d.iteritems()
+        self.it = iter(d.items())
 
     def __iter__(self):
         return self
 
     def __next__(self):
-        return super(PathTreeItemIterator, self).next()
+        return next(super(PathTreeItemIterator, self))
 
-    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 = self.it.next()
+                x = next(self.it)
                 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 = x[1]['children'].iteritems()
+                self.it = iter(x[1]['children'].items())
                 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 = ['/'] + filter(bool, key.split('/'))
+        elements = ['/'] + list(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.iterkeys():
+        for x in self.keys():
             if key == x:
                 return False
         return True
 
     def __delitem__(self, key):
         kids = 'children'
-        elements = ['/'] + filter(bool, key.split('/'))
+        elements = ['/'] + list(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 = ['/'] + filter(bool, key.split('/'))
+        elements = ['/'] + list(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'].iterkeys()]
+        return [x for x in self._get_node(key)['children'].keys()]
 
     def demote(self, key):
         n = self._get_node(key)
@@ -174,12 +174,12 @@
 
     def iterkeys(self, subtree='/', depth=None):
         if not self.root:
-            return {}.iterkeys()
+            return iter({}.keys())
         return PathTreeKeyIterator(self, subtree, depth)
 
     def iteritems(self, subtree='/', depth=None):
         if not self.root:
-            return {}.iteritems()
+            return iter({}.items())
         return PathTreeItemIterator(self, subtree, depth)
 
     def dumpd(self, subtree='/'):
@@ -187,7 +187,7 @@
         d = result
 
         for k, v in self.iteritems(subtree):
-            elements = ['/'] + filter(bool, k.split('/'))
+            elements = ['/'] + list(filter(bool, k.split('/')))
             d = result
             for k in elements:
                 d = d.setdefault(k, {})
