diff --git a/src/libstd/path.rs b/src/libstd/path.rs
index 87c071b512ac7327f0dc68b65aba54f1bc183a08..354312ccf2b0a0819b29a6f473c2c53ff6bd5d56 100644
--- a/src/libstd/path.rs
+++ b/src/libstd/path.rs
@@ -184,6 +184,10 @@ pub enum Prefix<'a> {
     /// Prefix `C:` for the given disk drive.
     #[stable(feature = "rust1", since = "1.0.0")]
     Disk(#[stable(feature = "rust1", since = "1.0.0")] u8),
+
+    /// Scheme `file:` used on Redox
+    #[stable(feature = "rust1", since = "1.0.0")]
+    Scheme(#[stable(feature = "rust1", since = "1.0.0")] &'a OsStr),
 }
 
 impl<'a> Prefix<'a> {
@@ -214,6 +218,7 @@ fn os_str_len(s: &OsStr) -> usize {
             },
             DeviceNS(x) => 4 + os_str_len(x),
             Disk(_) => 2,
+            Scheme(x) => 1 + os_str_len(x),
         }
 
     }
@@ -315,11 +320,6 @@ unsafe fn u8_slice_as_os_str(s: &[u8]) -> &OsStr {
     &*(s as *const [u8] as *const OsStr)
 }
 
-// Detect scheme on Redox
-fn has_redox_scheme(s: &[u8]) -> bool {
-    cfg!(target_os = "redox") && s.contains(&b':')
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // Cross-platform, iterator-independent parsing
 ////////////////////////////////////////////////////////////////////////////////
@@ -1902,12 +1902,7 @@ pub fn to_path_buf(&self) -> PathBuf {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[allow(deprecated)]
     pub fn is_absolute(&self) -> bool {
-        if cfg!(target_os = "redox") {
-            // FIXME: Allow Redox prefixes
-            self.has_root() || has_redox_scheme(self.as_u8_slice())
-        } else {
-            self.has_root() && (cfg!(unix) || self.prefix().is_some())
-        }
+        self.has_root() && (cfg!(unix) || self.prefix().is_some())
     }
 
     /// Returns `true` if the `Path` is relative, i.e., not absolute.
@@ -2312,8 +2307,7 @@ pub fn components(&self) -> Components<'_> {
         Components {
             path: self.as_u8_slice(),
             prefix,
-            has_physical_root: has_physical_root(self.as_u8_slice(), prefix) ||
-                               has_redox_scheme(self.as_u8_slice()),
+            has_physical_root: has_physical_root(self.as_u8_slice(), prefix),
             front: State::Prefix,
             back: State::Body,
         }
diff --git a/src/libstd/sys/unix/path.rs b/src/libstd/sys/unix/path.rs
index 7a1839561078575c74850ce343f81b0989767916..892b6c88c6646653b7dca9239c31595694b8c2e3 100644
--- a/src/libstd/sys/unix/path.rs
+++ b/src/libstd/sys/unix/path.rs
@@ -11,7 +11,14 @@ pub fn is_verbatim_sep(b: u8) -> bool {
     b == b'/'
 }
 
-pub fn parse_prefix(_: &OsStr) -> Option<Prefix<'_>> {
+pub fn parse_prefix(path: &OsStr) -> Option<Prefix<'_>> {
+    if cfg!(target_os = "redox") {
+        if let Some(path_str) = path.to_str() {
+            if let Some(i) = path_str.find(':') {
+                return Some(Prefix::Scheme(OsStr::new(&path_str[..i])));
+            }
+        }
+    }
     None
 }