diff --git a/gi/overrides/Gtk.py b/gi/overrides/Gtk.py
index 08d26127..2c1be883 100644
--- a/gi/overrides/Gtk.py
+++ b/gi/overrides/Gtk.py
@@ -807,6 +807,8 @@ class TreeModel(Gtk.TreeModel):
     def _coerce_path(self, path):
         if isinstance(path, Gtk.TreePath):
             return path
+        elif not path and not isinstance(path, int):
+            raise TypeError("could not coerce path '%s'" % path)
         else:
             return TreePath(path)
 
@@ -1171,6 +1173,8 @@ class TreePath(Gtk.TreePath):
     def __new__(cls, path=0):
         if isinstance(path, int):
             path = str(path)
+        elif not path:
+            return super(TreePath, cls).__new__(cls)
         elif not isinstance(path, _basestring):
             path = ":".join(str(val) for val in path)
 
@@ -1185,7 +1189,10 @@ class TreePath(Gtk.TreePath):
         super(TreePath, self).__init__()
 
     def __str__(self):
-        return self.to_string()
+        string = self.to_string()
+        if string is None:
+            string = ''
+        return string
 
     def __lt__(self, other):
         return other is not None and self.compare(other) < 0
diff --git a/tests/test_overrides_gtk.py b/tests/test_overrides_gtk.py
index 61b7dc0a..2430194e 100644
--- a/tests/test_overrides_gtk.py
+++ b/tests/test_overrides_gtk.py
@@ -1370,6 +1370,19 @@ class TestTreeModel(unittest.TestCase):
         self.assertEqual(p1[2], 3)
         self.assertRaises(IndexError, p1.__getitem__, 3)
 
+    def test_tree_path_empty(self):
+        p1 = Gtk.TreePath(None)
+        self.assertEqual(str(p1), '')
+        self.assertEqual(len(p1), 0)
+
+        p2 = Gtk.TreePath(())
+        self.assertEqual(str(p2), '')
+        self.assertEqual(len(p2), 0)
+
+        p3 = Gtk.TreePath('')
+        self.assertEqual(str(p3), '')
+        self.assertEqual(len(p3), 0)
+
     def test_tree_model(self):
         tree_store = Gtk.TreeStore(int, str)
 
