diff --git a/capplet/gsm-properties-dialog.c b/capplet/gsm-properties-dialog.c
index 9bec95e..a020008 100644
--- a/capplet/gsm-properties-dialog.c
+++ b/capplet/gsm-properties-dialog.c
@@ -113,12 +113,14 @@ _fill_iter_from_app (GtkListStore *list_store,
                      GspApp       *app)
 {
         gboolean    hidden;
+        gboolean    can_launch;
         gboolean    enabled;
         GIcon      *icon;
         const char *description;
         const char *app_name;
 
         hidden      = gsp_app_get_hidden (app);
+        can_launch  = gsp_app_get_can_launch (app);
         enabled     = gsp_app_get_enabled (app);
         icon        = gsp_app_get_icon (app);
         description = gsp_app_get_description (app);
@@ -150,7 +152,7 @@ _fill_iter_from_app (GtkListStore *list_store,
         }
 
         gtk_list_store_set (list_store, iter,
-                            STORE_COL_VISIBLE, !hidden,
+                            STORE_COL_VISIBLE, (!hidden && can_launch),
                             STORE_COL_ENABLED, enabled,
                             STORE_COL_GICON, icon,
                             STORE_COL_DESCRIPTION, description,
diff --git a/capplet/gsp-app.c b/capplet/gsp-app.c
index 206ff90..f0767aa 100644
--- a/capplet/gsp-app.c
+++ b/capplet/gsp-app.c
@@ -36,6 +36,7 @@
 #include "gsm-util.h"
 #include "gsp-app-manager.h"
 #include "gsp-keyfile.h"
+#include "eggdesktopfile.h"
 
 #include "gsp-app.h"
 
@@ -77,6 +78,8 @@ struct _GspAppPrivate {
         /* after writing to file, we skip the next file monitor event of type
          * CHANGED */
         gboolean      skip_next_monitor_event;
+
+        EggDesktopFile *eggfile;
 };
 
 #define GSP_APP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSP_TYPE_APP, GspAppPrivate))
@@ -203,6 +206,11 @@ _gsp_app_free_reusable_data (GspApp *app)
                 g_free (app->priv->old_system_path);
                 app->priv->old_system_path = NULL;
         }
+
+        if (app->priv->eggfile) {
+                egg_desktop_file_free (app->priv->eggfile);
+                app->priv->eggfile = NULL;
+        }
 }
 
 static void
@@ -544,6 +552,14 @@ gsp_app_get_hidden (GspApp *app)
         return app->priv->hidden;
 }
 
+gsp_app_get_can_launch (GspApp *app)
+{
+        g_return_val_if_fail (GSP_IS_APP (app), FALSE);
+
+        return !app->priv->eggfile ||
+               egg_desktop_file_can_launch (app->priv->eggfile, "GNOME");
+}
+
 gboolean
 gsp_app_get_enabled (GspApp *app)
 {
@@ -828,7 +844,10 @@ gsp_app_new (const char   *path,
                 app->priv->gicon = NULL;
         }
 
-        g_key_file_free (keyfile);
+        /* takes ownership of keyfile */
+        app->priv->eggfile = egg_desktop_file_new_from_key_file (keyfile,
+                                                                 app->priv->path,
+                                                                 NULL);
 
         _gsp_app_update_description (app);
 
diff --git a/capplet/gsp-app.h b/capplet/gsp-app.h
index 7dce444..21789aa 100644
--- a/capplet/gsp-app.h
+++ b/capplet/gsp-app.h
@@ -74,6 +74,7 @@ const char      *gsp_app_get_basename      (GspApp       *app);
 const char      *gsp_app_get_path          (GspApp       *app);
 
 gboolean         gsp_app_get_hidden        (GspApp       *app);
+gboolean         gsp_app_get_can_launch    (GspApp       *app);
 
 gboolean         gsp_app_get_enabled       (GspApp       *app);
 void             gsp_app_set_enabled       (GspApp       *app,
