=== modified file 'src/bamf-legacy-window-test.c'
--- src/bamf-legacy-window-test.c	2012-10-10 17:18:56 +0000
+++ src/bamf-legacy-window-test.c	2013-01-29 17:52:22 +0000
@@ -194,6 +194,16 @@
 }
 
 char *
+bamf_legacy_window_test_get_process_name (BamfLegacyWindow *legacy_window)
+{
+  BamfLegacyWindowTest *self;
+
+  self = BAMF_LEGACY_WINDOW_TEST (legacy_window);
+
+  return g_strdup (self->process_name);
+}
+
+char *
 bamf_legacy_window_test_get_app_id (BamfLegacyWindow *legacy_window)
 {
   BamfLegacyWindowTest *self;
@@ -371,6 +381,7 @@
   g_free (self->wm_class_name);
   g_free (self->wm_class_instance);
   g_free (self->exec);
+  g_free (self->process_name);
   g_free (self->application_id);
   g_free (self->unique_bus_name);
   g_free (self->dbus_menu_object_path);
@@ -390,6 +401,7 @@
   win_class->get_class_name   = bamf_legacy_window_test_get_class_name;
   win_class->get_class_instance_name = bamf_legacy_window_test_get_class_instance_name;
   win_class->get_exec_string  = bamf_legacy_window_test_get_exec_string;
+  win_class->get_process_name = bamf_legacy_window_test_get_process_name;
   win_class->get_xid          = bamf_legacy_window_test_get_xid;
   win_class->get_pid          = bamf_legacy_window_test_get_pid;
   win_class->needs_attention  = bamf_legacy_window_test_needs_attention;
@@ -431,6 +443,7 @@
   copy->wm_class_name = g_strdup (self->wm_class_name);
   copy->wm_class_instance = g_strdup (self->wm_class_instance);
   copy->exec = g_strdup (self->exec);
+  copy->process_name = g_strdup (self->process_name);
   copy->application_id = g_strdup (self->application_id);
   copy->unique_bus_name = g_strdup (self->unique_bus_name);
   copy->dbus_menu_object_path = g_strdup (self->dbus_menu_object_path);
@@ -459,5 +472,13 @@
   self->wm_class_name = g_strdup (wmclass_name);
   self->exec = g_strdup (exec);
 
+  if (self->exec)
+    {
+      gchar **splitted_exec = g_strsplit (exec, " ", 2);
+      gchar *tmp = g_utf8_strrchr (splitted_exec[0], -1, G_DIR_SEPARATOR);
+      self->process_name = g_strdup (tmp ? tmp + 1 : splitted_exec[0]);
+      g_strfreev (splitted_exec);
+    }
+
   return self;
 }

=== modified file 'src/bamf-legacy-window-test.h'
--- src/bamf-legacy-window-test.h	2012-10-10 17:18:56 +0000
+++ src/bamf-legacy-window-test.h	2013-01-29 17:52:22 +0000
@@ -57,6 +57,7 @@
   char * wm_class_name;
   char * wm_class_instance;
   char * exec;
+  char * process_name;
   char * application_id;
   char * unique_bus_name;
   char * dbus_menu_object_path;

=== modified file 'src/bamf-legacy-window.c'
--- src/bamf-legacy-window.c	2013-01-10 00:23:28 +0000
+++ src/bamf-legacy-window.c	2013-01-29 17:52:22 +0000
@@ -186,6 +186,51 @@
 }
 
 char *
+bamf_legacy_window_get_process_name (BamfLegacyWindow *self)
+{
+  gchar *stat_path;
+  gchar *contents;
+  gchar **lines;
+  gchar **sections;
+  gchar *result = NULL;
+  guint pid;
+
+  g_return_val_if_fail (BAMF_IS_LEGACY_WINDOW (self), NULL);
+
+  if (BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_process_name)
+    return BAMF_LEGACY_WINDOW_GET_CLASS (self)->get_process_name (self);
+
+  pid = bamf_legacy_window_get_pid (self);
+
+  if (pid <= 0)
+    return NULL;
+
+  stat_path = g_strdup_printf ("/proc/%i/status", pid);
+
+  if (g_file_get_contents (stat_path, &contents, NULL, NULL))
+    {
+      lines = g_strsplit (contents, "\n", 2);
+
+      if (lines && g_strv_length (lines) > 0)
+        {
+          sections = g_strsplit (lines[0], "\t", 0);
+          if (sections)
+            {
+              if (g_strv_length (sections) > 1)
+                result = g_strdup (sections[1]);
+
+              g_strfreev (sections);
+            }
+          g_strfreev (lines);
+        }
+      g_free (contents);
+    }
+  g_free (stat_path);
+
+  return result;
+}
+
+char *
 bamf_legacy_window_get_exec_string (BamfLegacyWindow *self)
 {
   gchar *result = NULL;
@@ -223,6 +268,8 @@
   return result;
 }
 
+
+
 const char *
 bamf_legacy_window_save_mini_icon (BamfLegacyWindow *self)
 {

=== modified file 'src/bamf-legacy-window.h'
--- src/bamf-legacy-window.h	2012-10-09 09:13:30 +0000
+++ src/bamf-legacy-window.h	2013-01-29 17:52:22 +0000
@@ -74,6 +74,7 @@
   const char * (*get_class_name)          (BamfLegacyWindow *legacy_window);
   const char * (*get_class_instance_name) (BamfLegacyWindow *legacy_window);
   char       * (*get_exec_string)         (BamfLegacyWindow *legacy_window);
+  char       * (*get_process_name)        (BamfLegacyWindow *legacy_window);
   char       * (*get_app_id)              (BamfLegacyWindow *legacy_window);
   char       * (*get_unique_bus_name)     (BamfLegacyWindow *legacy_window);
   char       * (*get_menu_object_path)    (BamfLegacyWindow *legacy_window);
@@ -142,6 +143,8 @@
 
 char             * bamf_legacy_window_get_exec_string      (BamfLegacyWindow *self);
 
+char             * bamf_legacy_window_get_process_name     (BamfLegacyWindow *self);
+
 BamfLegacyWindow * bamf_legacy_window_get_transient        (BamfLegacyWindow *self);
 
 char             * bamf_legacy_window_get_hint             (BamfLegacyWindow *self,
@@ -158,3 +161,4 @@
 BamfLegacyWindow * bamf_legacy_window_new                  (WnckWindow *legacy_window);
 
 #endif
+

=== modified file 'src/bamf-matcher-private.h'
--- src/bamf-matcher-private.h	2013-01-10 00:23:28 +0000
+++ src/bamf-matcher-private.h	2013-01-29 17:52:22 +0000
@@ -50,5 +50,6 @@
 BamfApplication * bamf_matcher_get_application_by_desktop_file (BamfMatcher *self, const char *desktop_file);
 BamfApplication * bamf_matcher_get_application_by_xid (BamfMatcher *self, guint xid);
 char * bamf_matcher_get_trimmed_exec (BamfMatcher *self, const char *exec);
+gboolean bamf_matcher_is_valid_process_prefix (BamfMatcher *self, const char *exec);
 
 #endif

=== modified file 'src/bamf-matcher.c'
--- src/bamf-matcher.c	2013-01-10 00:23:28 +0000
+++ src/bamf-matcher.c	2013-01-29 17:52:22 +0000
@@ -58,7 +58,8 @@
   "^gksu(do)?$", "^sudo$", "^su-to-root$", "^amdxdg-su$", "^java(ws)?$",
   "^mono$", "^ruby$", "^padsp$", "^aoss$", "^python(\\d.\\d)?$", "^(ba)?sh$",
   "^perl$", "^env$", "^xdg-open$",
-  /* javaws strings: */ "^net\\.sourceforge\\.jnlp\\.runtime\\.Boot$", "^rt.jar$"
+  /* javaws strings: */ "^net\\.sourceforge\\.jnlp\\.runtime\\.Boot$", "^rt\\.jar$",
+                        "^com\\.sun\\.javaws\\.Main$", "^deploy\\.jar$"
 };
 
 // Prefixes that must be considered starting point of exec strings
@@ -511,6 +512,30 @@
   return (l ? (char *) l->data : NULL);
 }
 
+gboolean
+bamf_matcher_is_valid_process_prefix (BamfMatcher *self, const char *process_name)
+{
+  GRegex *regex;
+  gint i;
+
+  g_return_val_if_fail (BAMF_IS_MATCHER (self), TRUE);
+
+  if (!process_name || *process_name == '\0')
+    return FALSE;
+
+  for (i = 0; i < self->priv->bad_prefixes->len; ++i)
+    {
+      regex = g_array_index (self->priv->bad_prefixes, GRegex *, i);
+
+      if (g_regex_match (regex, process_name, 0, NULL))
+        {
+          return FALSE;
+        }
+    }
+
+  return TRUE;
+}
+
 /* Attempts to return the binary name for a particular execution string */
 char *
 bamf_matcher_get_trimmed_exec (BamfMatcher * self, const char * exec_string)
@@ -566,16 +591,7 @@
               if (good_prefix)
                 continue;
 
-              bad_prefix = FALSE;
-              for (j = 0; j < self->priv->bad_prefixes->len; j++)
-                {
-                  regex = g_array_index (self->priv->bad_prefixes, GRegex *, j);
-                  if (g_regex_match (regex, part, 0, NULL))
-                    {
-                      bad_prefix = TRUE;
-                      break;
-                    }
-                }
+              bad_prefix = !bamf_matcher_is_valid_process_prefix (self, part);
 
               if (!bad_prefix)
                 {
@@ -1504,9 +1520,10 @@
       result = g_list_reverse (result);
       return result;
     }
-    
+
   proc_name = process_name (pid);
-  if (proc_name)
+
+  if (bamf_matcher_is_valid_process_prefix (self, proc_name))
     {
       table_list = g_hash_table_lookup (priv->desktop_file_table, proc_name);
               
@@ -1514,15 +1531,15 @@
         {
           result = g_list_prepend (result, g_strdup (l->data)); 
         }
-      g_free (proc_name);
     }
-  
+  g_free (proc_name);
+
   result = g_list_reverse (result);
   return result;
 }
 
 static gboolean
-is_web_app_window (BamfMatcher *self, BamfLegacyWindow *window)
+is_web_app_window (BamfLegacyWindow *window)
 {
   const char *window_class = bamf_legacy_window_get_class_name (window);
   const char *instance_name = bamf_legacy_window_get_class_instance_name (window);
@@ -1557,12 +1574,26 @@
 }
 
 static gboolean
+is_javaws_window (BamfLegacyWindow *window)
+{
+  const char *window_class = bamf_legacy_window_get_class_name (window);
+
+  if (g_strcmp0 (window_class, "net-sourceforge-jnlp-runtime-Boot") == 0 ||
+      g_strcmp0 (window_class, "com-sun-javaws-Main") == 0)
+    {
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static gboolean
 bamf_matcher_window_skips_hint_set (BamfMatcher *self, BamfLegacyWindow *window)
 {
-  gboolean skip_hint_set = FALSE;
+  gboolean skip_hint_set;
   g_return_val_if_fail (BAMF_IS_MATCHER (self), TRUE);
 
-  skip_hint_set = is_web_app_window (self, window);
+  skip_hint_set = is_web_app_window (window) || is_javaws_window (window);
 
   return skip_hint_set;
 }
@@ -1644,7 +1675,7 @@
 
   if (!filter_by_wmclass)
   {
-    if (is_web_app_window (self, window))
+    if (is_web_app_window (window))
       {
         // This ensures that a new application is created even for unknown webapps
         filter_by_wmclass = TRUE;

=== added file 'tests/bamfdaemon/data/icedtea-netx-javaws.desktop'
--- tests/bamfdaemon/data/icedtea-netx-javaws.desktop	1970-01-01 00:00:00 +0000
+++ tests/bamfdaemon/data/icedtea-netx-javaws.desktop	2013-01-29 17:52:22 +0000
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Name=IcedTea Java Web Start
+Name[fi]=IcedTea Java - Web Start
+Comment=IcedTea Java Web Start
+Comment[fi]=IcedTea Java - Web Start
+Exec=/usr/bin/javaws %u
+Terminal=false
+Type=Application
+Icon=javaws
+Categories=Application;Network;
+MimeType=application/x-java-jnlp-file;
+NoDisplay=true

=== modified file 'tests/bamfdaemon/test-matcher.c'
--- tests/bamfdaemon/test-matcher.c	2013-01-10 00:23:28 +0000
+++ tests/bamfdaemon/test-matcher.c	2013-01-29 17:52:22 +0000
@@ -34,6 +34,8 @@
 static void test_match_libreoffice_windows (void);
 static void test_match_gnome_control_center_panels (void);
 static void test_match_javaws_windows (void);
+static void test_match_javaws_windows_hint_ignored (void);
+static void test_match_javaws_windows_no_desktop_match (void);
 static void test_new_desktop_matches_unmatched_windows (void);
 static void test_trim_exec_string (void);
 
@@ -56,6 +58,8 @@
   g_test_add_func (DOMAIN"/Matching/Application/LibreOffice", test_match_libreoffice_windows);
   g_test_add_func (DOMAIN"/Matching/Application/GnomeControlCenter", test_match_gnome_control_center_panels);
   g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart", test_match_javaws_windows);
+  g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/HintIngored", test_match_javaws_windows_hint_ignored);
+  g_test_add_func (DOMAIN"/Matching/Application/JavaWebStart/NoDesktopMatch", test_match_javaws_windows_no_desktop_match);
   g_test_add_func (DOMAIN"/Matching/Windows/UnmatchedOnNewDesktop", test_new_desktop_matches_unmatched_windows);
   g_test_add_func (DOMAIN"/ExecStringTrimming", test_trim_exec_string);
 }
@@ -569,7 +573,7 @@
 
   screen = bamf_legacy_screen_get_default ();
   matcher = bamf_matcher_get_default ();
-  const char *exec_prefix = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java " \
+  const char *exec_prefix = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws " \
                             "-Xbootclasspath/a:/usr/share/icedtea-web/netx.jar " \
                             "-Xms8m -Djava.security.manager " \
                             "-Djava.security.policy=/etc/icedtea-web/javaws.policy " \
@@ -577,8 +581,8 @@
                             "-Dicedtea-web.bin.name=javaws " \
                             "-Dicedtea-web.bin.location=/usr/bin/javaws "\
                             "net.sourceforge.jnlp.runtime.Boot";
-  const char *class_name = "sun-awt-X11-XFramePeer";
-  const char *class_instance = "net-sourceforge-jnlp-runtime-Boot";
+  const char *class_name = "net-sourceforge-jnlp-runtime-Boot";
+  const char *class_instance = "sun-awt-X11-XFramePeer";
 
   cleanup_matcher_tables (matcher);
   export_matcher_on_bus (matcher);
@@ -626,6 +630,93 @@
 }
 
 static void
+test_match_javaws_windows_hint_ignored (void)
+{
+  BamfMatcher *matcher;
+  BamfLegacyScreen *screen;
+  BamfLegacyWindowTest *test_win;
+  BamfApplication *app;
+
+  screen = bamf_legacy_screen_get_default ();
+  matcher = bamf_matcher_get_default ();
+  const char *exec_prefix = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws " \
+                            "-Xbootclasspath/a:/usr/share/icedtea-web/netx.jar " \
+                            "-Xms8m -Djava.security.manager " \
+                            "-Djava.security.policy=/etc/icedtea-web/javaws.policy " \
+                            "-classpath /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/rt.jar " \
+                            "-Dicedtea-web.bin.name=javaws " \
+                            "-Dicedtea-web.bin.location=/usr/bin/javaws "\
+                            "net.sourceforge.jnlp.runtime.Boot ";
+  const char *class_name = "net-sourceforge-jnlp-runtime-Boot";
+  const char *class_instance = "sun-awt-X11-XFramePeer";
+
+  cleanup_matcher_tables (matcher);
+  export_matcher_on_bus (matcher);
+
+  guint xid = g_random_int ();
+  guint pid = g_random_int ();
+  char *exec = g_strconcat (exec_prefix, "Notepad.jnlp", NULL);
+  test_win = bamf_legacy_window_test_new (xid, "Notepad", NULL, exec);
+  bamf_legacy_window_test_set_wmclass (test_win, class_name, class_instance);
+  test_win->pid = pid;
+  _bamf_legacy_screen_open_test_window (screen, test_win);
+  g_free (exec);
+
+  bamf_matcher_register_desktop_file_for_pid (matcher, DATA_DIR"/icedtea-netx-javaws.desktop", pid);
+
+  char *hint = bamf_legacy_window_get_hint (BAMF_LEGACY_WINDOW (test_win), _NET_WM_DESKTOP_FILE);
+  g_assert (hint == NULL);
+
+  app = bamf_matcher_get_application_by_xid (matcher, xid);
+  g_assert (BAMF_IS_APPLICATION (app));
+  g_assert (bamf_application_get_desktop_file (app) == NULL);
+
+  g_object_unref (matcher);
+  g_object_unref (screen);
+}
+
+static void
+test_match_javaws_windows_no_desktop_match (void)
+{
+  BamfMatcher *matcher;
+  BamfLegacyScreen *screen;
+  BamfLegacyWindowTest *test_win;
+  BamfApplication *app;
+
+  screen = bamf_legacy_screen_get_default ();
+  matcher = bamf_matcher_get_default ();
+  const char *exec_prefix = "/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws " \
+                            "-Xbootclasspath/a:/usr/share/icedtea-web/netx.jar " \
+                            "-Xms8m -Djava.security.manager " \
+                            "-Djava.security.policy=/etc/icedtea-web/javaws.policy " \
+                            "-classpath /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/rt.jar " \
+                            "-Dicedtea-web.bin.name=javaws " \
+                            "-Dicedtea-web.bin.location=/usr/bin/javaws "\
+                            "net.sourceforge.jnlp.runtime.Boot ";
+  const char *class_name = "net-sourceforge-jnlp-runtime-Boot";
+  const char *class_instance = "sun-awt-X11-XFramePeer";
+
+  cleanup_matcher_tables (matcher);
+  export_matcher_on_bus (matcher);
+
+  bamf_matcher_load_desktop_file (matcher, DATA_DIR"/icedtea-netx-javaws.desktop");
+
+  guint xid = g_random_int ();
+  char *exec = g_strconcat (exec_prefix, "Notepad.jnlp", NULL);
+  test_win = bamf_legacy_window_test_new (xid, "Notepad", NULL, exec);
+  bamf_legacy_window_test_set_wmclass (test_win, class_name, class_instance);
+  _bamf_legacy_screen_open_test_window (screen, test_win);
+  g_free (exec);
+
+  app = bamf_matcher_get_application_by_xid (matcher, xid);
+  g_assert (BAMF_IS_APPLICATION (app));
+  g_assert (bamf_application_get_desktop_file (app) == NULL);
+
+  g_object_unref (matcher);
+  g_object_unref (screen);
+}
+
+static void
 test_trim_exec_string (void)
 {
   BamfMatcher *matcher;
@@ -692,5 +783,18 @@
   g_assert_cmpstr (trimmed, ==, "notepad.jnlp");
   g_free (trimmed);
 
+  exec = "/usr/lib/jvm/java-7-oracle/jre/bin/java " \
+         "-classpath /usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar " \
+         "-Djava.security.policy=file:/usr/lib/jvm/java-7-oracle/jre/lib/security/javaws.policy " \
+         "-DtrustProxy=true -Xverify:remote " \
+         "-Djnlpx.home=/usr/lib/jvm/java-7-oracle/jre/bin " \
+         "-Djnlpx.remove=true -Dsun.awt.warmup=true " \
+         "-Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar " \
+         "-Xms12m -Xmx384m -Djnlpx.jvm=/usr/lib/jvm/java-7-oracle/jre/bin/java " \
+         "com.sun.javaws.Main Notepad.jnlp";
+  trimmed = bamf_matcher_get_trimmed_exec (matcher, exec);
+  g_assert_cmpstr (trimmed, ==, "notepad.jnlp");
+  g_free (trimmed);
+
   g_object_unref (matcher);
 }

