diff --git a/scripts/xdg-mime.in b/scripts/xdg-mime.in
index bd65170..6aede30 100644
--- a/scripts/xdg-mime.in
+++ b/scripts/xdg-mime.in
@@ -247,6 +247,49 @@ make_default_generic()
     mv ${default_file}.new $default_file
 }
 
+search_desktop_file()
+{
+    local MIME="$1"
+    local dir="$2"
+
+    grep -l "$MIME;" "$dir/"*.desktop 2>/dev/null
+
+    for f in $dir/*/; do
+      [ -d "$f" ] && search_desktop_file "$MIME" "$f"
+    done
+} 
+
+defapp_kde_fallback()
+{
+    MIME="$1"
+    
+    xdg_user_dir="$XDG_DATA_HOME"
+    [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
+
+    xdg_system_dirs="$XDG_DATA_DIRS"
+    [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
+ 
+    preference=-1
+    desktop_file=""
+    for d in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
+       for x in `search_desktop_file "$MIME" "$d/applications"`; do
+          pref=0`awk -F"=" '/InitialPreference=/ {print($2)}' "$x"`
+          DEBUG 2 " Checking $x"
+    
+          if [ $pref -gt $preference ]; then
+             DEBUG 2 "   Select $x [ $preference => $pref ]"
+             preference=$pref
+             desktop_file=$x
+          fi
+       done
+    done
+
+    if [ -n "$desktop_file" ] ; then
+       echo `basename $desktop_file`
+       exit_success
+    fi
+}
+
 defapp_generic()
 {
     MIME="$1"
@@ -257,13 +300,17 @@ defapp_generic()
     [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
 
     for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
-       DEBUG 2 "Checking $x/applications/defaults.list"
-       trader_result=`grep "$MIME=" $x/applications/defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
-       if [ -n "$trader_result" ] ; then
-          echo $trader_result
-          exit_success
-       fi
+       for prefix in "$XDG_MENU_PREFIX" ""; do
+          DEBUG 2 "Checking $x/applications/${prefix}defaults.list"
+          trader_result=`grep "$MIME=" $x/applications/${prefix}defaults.list 2> /dev/null | cut -d '=' -f 2 | cut -d ';' -f 1`
+          if [ -n "$trader_result" ] ; then
+              echo $trader_result
+              exit_success
+          fi
+       done
     done
+
+    defapp_kde_fallback $MIME
     exit_success
 }
 
diff --git a/scripts/xdg-open.in b/scripts/xdg-open.in
index bc756d0..29b2067 100644
--- a/scripts/xdg-open.in
+++ b/scripts/xdg-open.in
@@ -82,6 +82,29 @@ open_xfce()
     fi
 }
 
+search_desktop_file()
+{
+    local default="$1"
+    local dir="$2"
+
+    local file="$dir/$default"
+    if [ -r "$file" ] ; then
+        command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
+        command_exec=`which $command 2>/dev/null`
+
+        if [ -x "$command_exec" ] ; then
+            $command_exec "$url"
+            if [ $? -eq 0 ]; then
+               exit_success
+            fi
+        fi
+    fi
+    
+    for x in $dir/*/; do
+      [ -d "$x" ] && search_desktop_file "$default" "$x"
+    done
+} 
+
 open_generic_xdg_mime()
 {
     filetype=`xdg-mime query filetype "$1" | sed "s/;.*//"`
@@ -94,17 +117,7 @@ open_generic_xdg_mime()
         [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
 
         for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
-            local file="$x/applications/$default"
-            if [ -r "$file" ] ; then
-                command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
-                command_exec=`which $command 2>/dev/null`
-                if [ -x "$command_exec" ] ; then
-                    $command_exec "$1"
-                    if [ $? -eq 0 ]; then
-                        exit_success
-                    fi
-                fi
-            fi
+            search_desktop_file "$default" "$x/applications"
         done
     fi
 }

