Index: /trunk/src/kmk/dir-nt-bird.c
===================================================================
--- /trunk/src/kmk/dir-nt-bird.c	(revision 3016)
+++ /trunk/src/kmk/dir-nt-bird.c	(revision 3017)
@@ -456,5 +456,6 @@
 
 
-/* duplicated in kWorker.c */
+/* duplicated in kWorker.c
+ * Note! Tries avoid to produce a result with spaces since they aren't supported by makefiles.  */
 void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull)
 {
@@ -471,5 +472,5 @@
                 PKFSDIR pAncestor;
 
-                pszFull[off + pPathObj->cchName] = '\0';
+                pszFull[offEnd] = '\0';
                 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
 
@@ -480,7 +481,36 @@
                     kHlpAssert(pAncestor->Obj.cchName > 0);
                     pszFull[--off] = '/';
-                    off -= pAncestor->Obj.cchName;
-                    kHlpAssert(pAncestor->Obj.cchParent == off);
-                    memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
+#ifdef KFSCACHE_CFG_SHORT_NAMES
+                    if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
+                        || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
+#endif
+                    {
+                        off -= pAncestor->Obj.cchName;
+                        kHlpAssert(pAncestor->Obj.cchParent == off);
+                        memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
+                    }
+#ifdef KFSCACHE_CFG_SHORT_NAMES
+                    else
+                    {
+                        /*
+                         * The long name constains a space, so use the alternative name instead.
+                         * Most likely the alternative name differs in length, usually it's shorter,
+                         * so we have to shift the part of the path we've already assembled
+                         * accordingly.
+                         */
+                        KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
+                        if (cchDelta != 0)
+                        {
+                            if ((KSIZE)(offEnd + cchDelta) >= cbFull)
+                                goto l_fallback;
+                            memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
+                            off    += cchDelta;
+                            offEnd += cchDelta;
+                        }
+                        off -= pAncestor->Obj.cchShortName;
+                        kHlpAssert(pAncestor->Obj.cchParent == off);
+                        memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
+                    }
+#endif
                 }
                 kFsCacheObjRelease(g_pFsCache, pPathObj);
@@ -492,4 +522,5 @@
             if ((size_t)pPathObj->cchName + 1 < cbFull)
             {
+                /* Assume no spaces here. */
                 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
                 pszFull[pPathObj->cchName] = '/';
@@ -502,4 +533,7 @@
 
         /* do fallback. */
+#ifdef KFSCACHE_CFG_SHORT_NAMES
+l_fallback:
+#endif
         kHlpAssertFailed();
         kFsCacheObjRelease(g_pFsCache, pPathObj);
