diff --git a/Lib/macpath.py b/Lib/macpath.py
index 14e49a3..15714c6 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -186,7 +186,11 @@
 def abspath(path):
     """Return an absolute path."""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 # realpath is a no-op on systems without islink support
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 02d8584..a124dfd 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -449,7 +449,11 @@
     def abspath(path):
         """Return the absolute version of a path."""
         if not isabs(path):
-            path = join(os.getcwd(), path)
+            if isinstance(path, unicode):
+                cwd = os.getcwdu()
+            else:
+                cwd = os.getcwd()
+            path = join(cwd, path)
         return normpath(path)
 
 else:  # use native Windows method on Windows
@@ -461,6 +465,8 @@
                 path = _getfullpathname(path)
             except WindowsError:
                 pass # Bad path - return unchanged.
+        elif isinstance(path, unicode):
+            path = os.getcwdu()
         else:
             path = os.getcwd()
         return normpath(path)
diff --git a/Lib/os2emxpath.py b/Lib/os2emxpath.py
index 4e85c4d..1bed51d 100644
--- a/Lib/os2emxpath.py
+++ b/Lib/os2emxpath.py
@@ -146,7 +146,11 @@
 def abspath(path):
     """Return the absolute version of a path"""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 # realpath is a no-op on systems without islink support
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 6be031b..b6438bd 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -337,7 +337,11 @@
 def abspath(path):
     """Return an absolute path."""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 
diff --git a/Lib/test/test_macpath.py b/Lib/test/test_macpath.py
index 4541eb9..ff8da10 100644
--- a/Lib/test/test_macpath.py
+++ b/Lib/test/test_macpath.py
@@ -8,6 +8,16 @@
     def test_abspath(self):
         self.assertTrue(macpath.abspath("xx:yy") == "xx:yy")
 
+        # Issue 3426: check that abspath retuns unicode when the arg is unicode
+        # and str when it's str, with both ASCII and non-ASCII cwds
+        for cwd in (u'cwd', u'\xe7w\xf0'):
+            with test_support.temp_cwd(cwd):
+                for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                    self.assertIsInstance(macpath.abspath(path), str)
+                for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                    self.assertIsInstance(macpath.abspath(upath), unicode)
+
+
     def test_isabs(self):
         isabs = macpath.isabs
         self.assertTrue(isabs("xx:yy"))
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 9e9b6ed..f5bc952 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -160,13 +160,25 @@
         # the rest of the tests for the ntpath module to be run to completion
         # on any platform, since most of the module is intended to be usable
         # from any platform.
+        # XXX this needs more tests
         try:
             import nt
         except ImportError:
-            pass
+            # check that the function is there even if we are not on Windows
+            ntpath.abspath
         else:
             tester('ntpath.abspath("C:\\")', "C:\\")
 
+            # Issue 3426: check that abspath retuns unicode when the arg is
+            # unicode and str when it's str, with both ASCII and non-ASCII cwds
+            for cwd in (u'cwd', u'\xe7w\xf0'):
+                with test_support.temp_cwd(cwd):
+                    for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                        self.assertIsInstance(ntpath.abspath(path), str)
+                    for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                        self.assertIsInstance(ntpath.abspath(upath), unicode)
+
+
     def test_relpath(self):
         currentdir = os.path.split(os.getcwd())[-1]
         tester('ntpath.relpath("a")', 'a')
diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
index 60a043c..2315b25 100644
--- a/Lib/test/test_posixpath.py
+++ b/Lib/test/test_posixpath.py
@@ -386,6 +386,15 @@
     def test_abspath(self):
         self.assertTrue("foo" in posixpath.abspath("foo"))
 
+        # Issue 3426: check that abspath retuns unicode when the arg is unicode
+        # and str when it's str, with both ASCII and non-ASCII cwds
+        for cwd in (u'cwd', u'\xe7w\xf0'):
+            with test_support.temp_cwd(cwd):
+                for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                    self.assertIsInstance(posixpath.abspath(path), str)
+                for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                    self.assertIsInstance(posixpath.abspath(upath), unicode)
+
         self.assertRaises(TypeError, posixpath.abspath)
 
     def test_realpath(self):
