diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index cbdb154..fd3a260 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -6,6 +6,7 @@
  * Copyright 2003 Mike McCormack for CodeWeavers
  * Copyright 2004 Dmitry Timoshkov
  * Copyright 2005 Bill Medland
+ * Copyright 2008 Damjan Jovanovic
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -169,6 +170,9 @@
 MAKE_FUNCPTR(png_write_row);
 #undef MAKE_FUNCPTR
 
+static char *xdg_config_dir;
+static char *xdg_data_dir;
+
 static void *load_libpng(void)
 {
     if ((libpng_handle = wine_dlopen(SONAME_LIBPNG, RTLD_NOW, NULL, 0)) != NULL)
@@ -665,60 +669,77 @@
     return crc;
 }
 
+static char* heap_printf(const char *format, ...)
+{
+    va_list args;
+    int size = 4096;
+    char *buffer;
+    int n;
+
+    va_start(args, format);
+    while (1)
+    {
+        buffer = HeapAlloc(GetProcessHeap(), 0, size);
+        if (buffer == NULL)
+            break;
+        n = vsnprintf(buffer, size, format, args);
+        if (n == -1)
+            size *= 2;
+        else if (n >= size)
+            size = n + 1;
+        else
+            break;
+        HeapFree(GetProcessHeap(), 0, buffer);
+    }
+    va_end(args);
+    return buffer;
+}
+
+static BOOL create_directories(char *directory)
+{
+    BOOL ret = TRUE;
+    int i;
+
+    for (i = 0; directory[i]; i++)
+    {
+        if (i > 0 && directory[i] == '/')
+        {
+            directory[i] = 0;
+            mkdir(directory, 0777);
+            directory[i] = '/';
+        }
+    }
+    if (mkdir(directory, 0777) && errno != EEXIST)
+       ret = FALSE;
+
+    return ret;
+}
+
 /* extract an icon from an exe or icon file; helper for IPersistFile_fnSave */
 static char *extract_icon( LPCWSTR path, int index, BOOL bWait )
 {
     unsigned short crc;
-    char *iconsdir, *ico_path, *ico_name, *xpm_path;
+    char *iconsdir = NULL, *ico_path = NULL, *ico_name, *xpm_path = NULL;
     char* s;
-    HKEY hkey;
     int n;
 
     /* Where should we save the icon? */
     WINE_TRACE("path=[%s] index=%d\n", wine_dbgstr_w(path), index);
-    iconsdir=NULL;  /* Default is no icon */
-    /* @@ Wine registry key: HKCU\Software\Wine\WineMenuBuilder */
-    if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\WineMenuBuilder", &hkey ))
+    iconsdir = heap_printf("%s/icons", xdg_data_dir);
+    if (iconsdir)
     {
-        static const WCHAR IconsDirW[] = {'I','c','o','n','s','D','i','r',0};
-        LPWSTR iconsdirW;
-        DWORD size = 0;
-
-        if (!RegQueryValueExW(hkey, IconsDirW, 0, NULL, NULL, &size))
+        if (mkdir(iconsdir, 0777) && errno != EEXIST)
         {
-            iconsdirW = HeapAlloc(GetProcessHeap(), 0, size);
-            RegQueryValueExW(hkey, IconsDirW, 0, NULL, (LPBYTE)iconsdirW, &size);
-
-            if (!(iconsdir = wine_get_unix_file_name(iconsdirW)))
-            {
-                int n = WideCharToMultiByte(CP_UNIXCP, 0, iconsdirW, -1, NULL, 0, NULL, NULL);
-                iconsdir = HeapAlloc(GetProcessHeap(), 0, n);
-                WideCharToMultiByte(CP_UNIXCP, 0, iconsdirW, -1, iconsdir, n, NULL, NULL);
-            }
-            HeapFree(GetProcessHeap(), 0, iconsdirW);
+            WINE_WARN("couldn't make icons directory %s\n", wine_dbgstr_a(iconsdir));
+            goto end;
         }
-        RegCloseKey( hkey );
     }
-
-    if (!iconsdir)
+    else
     {
-        WCHAR path[MAX_PATH];
-        if (GetTempPathW(MAX_PATH, path))
-            iconsdir = wine_get_unix_file_name(path);
-        if (!iconsdir)
-        {
-            WINE_TRACE("no IconsDir\n");
-            return NULL;  /* No icon created */
-        }
+        WINE_TRACE("no icon created\n");
+        return NULL;
     }
     
-    if (!*iconsdir)
-    {
-        WINE_TRACE("icon generation disabled\n");
-        HeapFree(GetProcessHeap(), 0, iconsdir);
-        return NULL;  /* No icon created */
-    }
-
     /* Determine the icon base name */
     n = WideCharToMultiByte(CP_UNIXCP, 0, path, -1, NULL, 0, NULL, NULL);
     ico_path = HeapAlloc(GetProcessHeap(), 0, n);
@@ -1364,6 +1385,35 @@
     return token;
 }
 
+static BOOL init_xdg(void)
+{
+    if (getenv("XDG_CONFIG_HOME"))
+        xdg_config_dir = heap_printf("%s/menus/applications-merged", getenv("XDG_CONFIG_HOME"));
+    else
+        xdg_config_dir = heap_printf("%s/.config/menus/applications-merged", getenv("HOME"));
+    if (xdg_config_dir)
+    {
+        if (getenv("XDG_DATA_HOME"))
+            xdg_data_dir = heap_printf("%s", getenv("XDG_DATA_HOME"));
+        else
+            xdg_data_dir = heap_printf("%s/.local/share", getenv("HOME"));
+        if (xdg_data_dir)
+        {
+            char *buffer;
+            create_directories(xdg_data_dir);
+            buffer = heap_printf("%s/desktop-directories", xdg_data_dir);
+            if (buffer)
+            {
+                mkdir(buffer, 0777);
+                HeapFree(GetProcessHeap(), 0, buffer);
+            }
+            return TRUE;
+        }
+        HeapFree(GetProcessHeap(), 0, xdg_config_dir);
+    }
+    return FALSE;
+}
+
 /***********************************************************************
  *
  *           WinMain
@@ -1374,6 +1424,8 @@
     BOOL bWait = FALSE;
     int ret = 0;
 
+    init_xdg();
+
     for( p = cmdline; p && *p; )
     {
         token = next_token( &p );
diff --git a/tools/wineshelllink b/tools/wineshelllink
index 0c02bda..297c38e 100755
--- a/tools/wineshelllink
+++ b/tools/wineshelllink
@@ -93,7 +93,7 @@
 EOF
     [ -z "$descr"   ] || echo "Comment=$descr"
     [ -z "$workdir" ] || echo "Path=$workdir"
-    [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
+    [ -z "$icon" ] || echo "Icon=$icon"
 }
 
 directory_entry()
@@ -111,21 +111,6 @@
     fi
 }
 
-# copy the icon file to a specified dir and set xpmicon to the resulting path
-copy_icon()
-{
-    if [ -f "$icon" ]
-    then
-        xpmicon=`basename "$icon"`
-        xpmicon=${xpmicon%.*}
-
-        mkdir -p "$1"
-        cp "$icon" "$1"
-    else
-        xpmicon=""
-    fi
-}
-
 # XDG
 
 xdg_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/menus/applications-merged"
@@ -207,8 +192,6 @@
 }
 
 
-copy_icon "$xdg_data_dir/icons"
-
 linkname=`basename "$link"`
 
 if [ $mode = "menu" ] ; then
