diff --git a/ntoskrnl/include/internal/ob.h b/ntoskrnl/include/internal/ob.h
index 266c4dd668..41e1af894a 100644
--- a/ntoskrnl/include/internal/ob.h
+++ b/ntoskrnl/include/internal/ob.h
@@ -443,6 +443,12 @@ ObIsLUIDDeviceMapsEnabled(
     VOID
 );
 
+PDEVICE_MAP
+NTAPI
+ObpReferenceDeviceMap(
+    VOID
+);
+
 //
 // Security descriptor cache functions
 //
diff --git a/ntoskrnl/ob/obname.c b/ntoskrnl/ob/obname.c
index 460338f0d4..e6a7058a9a 100644
--- a/ntoskrnl/ob/obname.c
+++ b/ntoskrnl/ob/obname.c
@@ -214,26 +214,6 @@ ObpCreateDosDevicesDirectory(VOID)
     if (!NT_SUCCESS(Status))
         goto done;
 
-    /*********************************************\
-    |*** HACK until we support device mappings ***|
-    |*** Add a symlink \??\ <--> \GLOBAL??\    ***|
-    \*********************************************/
-    RtlInitUnicodeString(&LinkName, L"\\??");
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &LinkName,
-                               OBJ_PERMANENT,
-                               NULL,
-                               &DosDevicesSD);
-    Status = NtCreateSymbolicLinkObject(&SymHandle,
-                                        SYMBOLIC_LINK_ALL_ACCESS,
-                                        &ObjectAttributes,
-                                        &RootName);
-    if (NT_SUCCESS(Status)) NtClose(SymHandle);
-    /*********************************************\
-    \*********************************************/
-
-    // FIXME: Create a device mapping for the global \?? directory
-
     /*
      * Initialize the \??\GLOBALROOT symbolic link
      * pointing to the root directory \ .
@@ -490,6 +470,8 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
     PWCHAR NewName;
     POBJECT_HEADER_NAME_INFO ObjectNameInfo;
     ULONG MaxReparse = 30;
+    PDEVICE_MAP DeviceMap = NULL;
+    UNICODE_STRING LocalName;
     PAGED_CODE();
     OBTRACE(OB_NAMESPACE_DEBUG,
             "%s - Finding Object: %wZ. Expecting: %p\n",
@@ -642,6 +624,8 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
             *FoundObject = Object;
             return Status;
         }
+
+        LocalName = *ObjectName;
     }
     else
     {
@@ -695,7 +679,12 @@ ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL,
         else
         {
 ParseFromRoot:
-            /* FIXME: Check if we have a device map */
+            /* Deference the device map if we already have one */
+            if (DeviceMap != NULL)
+            {
+                ObfDereferenceDeviceMap(DeviceMap);
+                DeviceMap = NULL;
+            }
 
             /* Check if this is a possible DOS name */
             if (!((ULONG_PTR)(ObjectName->Buffer) & 7))
@@ -713,7 +702,18 @@ ParseFromRoot:
                     (*(PULONGLONG)(ObjectName->Buffer) ==
                      ObpDosDevicesShortNamePrefix.Alignment.QuadPart))
                 {
-                    /* FIXME! */
+                    DeviceMap = ObpReferenceDeviceMap();
+                    /* We have a local mapping, drop the ?? prefix */
+                    if (DeviceMap != NULL && DeviceMap->DosDevicesDirectory != NULL)
+                    {
+                        LocalName = *ObjectName;
+
+                        LocalName.Length -= (4 * sizeof(WCHAR));
+                        LocalName.Buffer += 4;
+
+                        /* We'll browse that local directory */
+                        Directory = DeviceMap->DosDevicesDirectory;
+                    }
                 }
                 else if ((ObjectName->Length == ObpDosDevicesShortName.Length -
                                                 sizeof(WCHAR)) &&
@@ -722,9 +722,35 @@ ParseFromRoot:
                          (*((PWCHAR)(ObjectName->Buffer) + 2) ==
                           (WCHAR)(ObpDosDevicesShortNameRoot.Alignment.HighPart)))
                 {
-                    /* FIXME! */
+                    DeviceMap = ObpReferenceDeviceMap();
+
+                    /* Caller is looking for the directory itself */
+                    if (DeviceMap != NULL && DeviceMap->DosDevicesDirectory != NULL)
+                    {
+                        Status = ObReferenceObjectByPointer(DeviceMap->DosDevicesDirectory,
+                                                            0,
+                                                            ObjectType,
+                                                            AccessMode);
+                        if (NT_SUCCESS(Status))
+                        {
+                            *FoundObject = DeviceMap->DosDevicesDirectory;
+                        }
+
+                        ObfDereferenceDeviceMap(DeviceMap);
+                        return Status;
+                    }
+
+                    LocalName = *ObjectName;
+                }
+                else
+                {
+                    LocalName = *ObjectName;
                 }
             }
+            else
+            {
+                LocalName = *ObjectName;
+            }
         }
     }
 
@@ -740,7 +766,7 @@ ParseFromRoot:
     while (Reparse && MaxReparse)
     {
         /* Get the name */
-        RemainingName = *ObjectName;
+        RemainingName = LocalName;
 
         /* Disable reparsing again */
         Reparse = FALSE;
@@ -1149,7 +1175,7 @@ ReparseObject:
     }
 
     /* Check if we have a device map and dereference it if so */
-    //if (DeviceMap) ObfDereferenceDeviceMap(DeviceMap);
+    if (DeviceMap) ObfDereferenceDeviceMap(DeviceMap);
 
     /* Check if we have a referenced directory and dereference it if so */
     if (ReferencedDirectory) ObDereferenceObject(ReferencedDirectory);
