diff --git a/ChangeLog b/ChangeLog
index 831218c758211441450ad8a72ebaf080d905afb1..bd49b20ee436c55c86a055d5b97f52a9590ae685 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-03-23	Jannis Pohlmann <jannis@xfce.org>
+
+	* tests/Makefile.am, tests/test-display-menu.c: Test program
+	  for displaying a menu added again.
+
 2007-03-23	Jannis Pohlmann <jannis@xfce.org>
 
 	* docs/reference/tmpl/: Remove tdb related files from
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b8a6779be17a87ba3c573e36c99a206c1b7c12d4..a5c9ebc5847858816fb8228a5d9c7e81a96542df 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -7,10 +7,12 @@ INCLUDES =								\
 	-DG_LOG_DOMAIN=\"libxfce4menu-tests\"
 
 TESTS =									\
-	test-menu-spec
+	test-menu-spec							\
+	test-display-menu
 
 check_PROGRAMS =							\
-	test-menu-spec
+	test-menu-spec							\
+	test-display-menu
 
 test_menu_spec_SOURCES =						\
 	test-menu-spec.c
@@ -27,3 +29,20 @@ test_menu_spec_LDADD =							\
 	$(GLIB_LIBS)							\
 	$(top_builddir)/libxfce4menu/libxfce4menu-$(LIBXFCE4MENU_VERSION_MAJOR).$(LIBXFCE4MENU_VERSION_MINOR).la
 
+test_display_menu_SOURCES =						\
+	test-display-menu.c
+
+test_display_menu_CFLAGS =						\
+	$(LIBXFCE4UTIL_CFLAGS)						\
+	$(GTK_CFLAGS)							\
+	$(GLIB_CFLAGS)
+
+test_display_menu_DEPENDENCIES =					\
+	$(top_builddir)/libxfce4menu/libxfce4menu-$(LIBXFCE4MENU_VERSION_MAJOR).$(LIBXFCE4MENU_VERSION_MINOR).la
+
+test_display_menu_LDADD =						\
+	$(LIBXFCE4UTIL_LIBS)						\
+	$(GTK_LIBS)							\
+	$(GLIB_LIBS)							\
+	$(top_builddir)/libxfce4menu/libxfce4menu-$(LIBXFCE4MENU_VERSION_MAJOR).$(LIBXFCE4MENU_VERSION_MINOR).la
+
diff --git a/tests/test-display-menu.c b/tests/test-display-menu.c
new file mode 100644
index 0000000000000000000000000000000000000000..372d2377d163abd962a56f23b24232fd26fe447b
--- /dev/null
+++ b/tests/test-display-menu.c
@@ -0,0 +1,362 @@
+/* $Id$ */
+/*-
+ * vi:set et ai sts=2 sw=2 cindent:
+ *
+ * Copyright (c) 2007 Jannis Pohlmann <jannis@xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gprintf.h>
+
+#include <libxfce4util/libxfce4util.h>
+#include <libxfce4menu/libxfce4menu.h>
+
+
+
+/* Default icon size */
+#define ICON_SIZE 22
+
+
+
+/* Root menu */
+static XfceMenu *root = NULL;
+
+
+
+static void
+execute_item_command (GtkWidget    *widget,
+                      XfceMenuItem *item)
+{
+#if 0
+  GError      *error = NULL;
+#endif
+  const gchar *command;
+  gboolean     terminal;
+  gboolean     startup_notification;
+
+  command = xfce_menu_item_get_command (item);
+  terminal = xfce_menu_item_requires_terminal (item);
+  startup_notification = xfce_menu_item_supports_startup_notification (item);
+
+  if (G_UNLIKELY (command == NULL))
+    return;
+
+#if 0
+  if (!xfce_exec_on_screen (gdk_screen_get_default (), command, terminal, startup_notification, &error))
+    {
+      xfce_err (error->message);
+      g_error_free (error);
+    }
+#endif
+}
+
+
+
+static GdkPixbuf*
+create_item_icon (XfceMenuItem *item)
+{
+  GdkPixbuf    *icon = NULL;
+  GtkIconTheme *icon_theme;
+  const gchar  *icon_name;
+  const gchar  *item_name;
+  gchar        *basename;
+  gchar        *extension;
+  gchar        *new_item_name;
+  gchar         new_icon_name[1024];
+
+  /* Get current icon theme */
+  icon_theme = gtk_icon_theme_get_default ();
+
+  icon_name = xfce_menu_item_get_icon_name (item);
+  item_name = xfce_menu_item_get_name (item);
+
+  if (icon_name == NULL)
+    return NULL;
+
+  /* Check if we have an absolute filename */
+  if (g_path_is_absolute (icon_name) && g_file_test (icon_name, G_FILE_TEST_EXISTS))
+    icon = gdk_pixbuf_new_from_file_at_scale (icon_name, ICON_SIZE, ICON_SIZE, TRUE, NULL);
+  else
+    {
+      /* Try to load the icon name directly using the icon theme */
+      icon = gtk_icon_theme_load_icon (icon_theme, icon_name, ICON_SIZE, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+
+      /* If that didn't work, try to remove the filename extension if there is one */
+      if (icon == NULL)
+        {
+          /* Get basename (just to be sure) */
+          basename = g_path_get_basename (icon_name);
+
+          /* Determine position of the extension */
+          extension = g_utf8_strrchr (basename, -1, '.');
+
+          /* Make sure we found an extension */
+          if (extension != NULL)
+            {
+              /* Remove extension */
+              g_utf8_strncpy (new_icon_name, basename, g_utf8_strlen (basename, -1) - g_utf8_strlen (extension, -1));
+
+              /* Try to load the pixbuf using the new icon name */
+              icon = gtk_icon_theme_load_icon (icon_theme, new_icon_name, ICON_SIZE, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+            }
+
+          /* Free basename */
+          g_free (basename);
+
+          /* As a last fallback, we try to load the icon by lowercase item name */
+          if (icon == NULL && item_name != NULL)
+            {
+              new_item_name = g_utf8_strdown (item_name, -1);
+              icon = gtk_icon_theme_load_icon (icon_theme, new_item_name, ICON_SIZE, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+              g_free (new_item_name);
+            }
+        }
+    }
+
+  /* Scale icon (if needed) */
+  if (icon != NULL)
+    {
+      GdkPixbuf *old_icon = icon;
+      icon = gdk_pixbuf_scale_simple (old_icon, ICON_SIZE, ICON_SIZE, GDK_INTERP_BILINEAR);
+      g_object_unref (old_icon);
+    }
+
+  return icon;
+}
+
+
+
+static void
+create_item_widgets (XfceMenuItem *item, 
+                     GtkWidget    *parent_menu)
+{
+  GtkWidget *gtk_item;
+  GtkWidget *image;
+  GdkPixbuf *icon;
+
+  /* Try to load the icon */
+  icon = create_item_icon (item);
+
+  if (icon != NULL)
+    image = gtk_image_new_from_pixbuf (icon);
+  else
+    image = gtk_image_new_from_icon_name ("applications-other", ICON_SIZE);
+
+  gtk_item = gtk_image_menu_item_new_with_label (xfce_menu_item_get_name (item));
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_item), image);
+  gtk_menu_shell_append (GTK_MENU_SHELL (parent_menu), gtk_item);
+  gtk_widget_show (gtk_item);
+
+  /* Execute command if item is clicked */
+  g_signal_connect (gtk_item, "activate", G_CALLBACK (execute_item_command), item);
+}
+
+
+
+static void
+create_menu_widgets (GtkWidget *gtk_menu, 
+                     XfceMenu  *menu)
+{
+  XfceMenuDirectory *directory;
+  XfceMenu          *submenu;
+  GtkIconTheme      *icon_theme;
+  GtkWidget         *gtk_item;
+  GtkWidget         *gtk_submenu;
+  GtkWidget         *image;
+  GdkPixbuf         *icon;
+  GSList            *iter;
+  GSList            *items;
+  const gchar       *display_name;
+  const gchar       *icon_name;
+
+  /* Get current icon theme */
+  icon_theme = gtk_icon_theme_get_default ();
+
+  /* Get submenus and items based on the menu layout */
+  if (G_UNLIKELY (xfce_menu_has_layout (menu)))
+    items = xfce_menu_get_layout_items (menu);
+  else
+    {
+      items = xfce_menu_get_menus (menu);
+      items = g_slist_concat (items, xfce_menu_get_items (menu));
+    }
+
+  /* Iterate over menu items */
+  for (iter = items; iter != NULL; iter = g_slist_next (iter))
+    {
+      if (XFCE_IS_MENU_ITEM (iter->data))
+        {
+          /* Add menu item to the menu */
+          create_item_widgets (XFCE_MENU_ITEM (iter->data), gtk_menu);
+        }
+      else if (XFCE_IS_MENU_SEPARATOR (iter->data))
+        {
+          /* Add separator to the menu */
+          gtk_item = gtk_separator_menu_item_new ();
+          gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), gtk_item);
+          gtk_widget_show (gtk_item);
+        }
+      else if (XFCE_IS_MENU (iter->data))
+        {
+          submenu = XFCE_MENU (iter->data);
+          directory = xfce_menu_get_directory (submenu);
+
+          /* Determine display name */
+          display_name = directory != NULL ? xfce_menu_directory_get_name (directory) : xfce_menu_get_name (submenu);
+
+          /* Determine icon name */
+          icon_name = directory != NULL ? xfce_menu_directory_get_icon (directory) : "applications-other";
+
+          /* Load menu icon */
+          icon = gtk_icon_theme_load_icon (icon_theme, icon_name, ICON_SIZE, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+          if (G_UNLIKELY (icon == NULL))
+            icon = gtk_icon_theme_load_icon (icon_theme, "applications-other", ICON_SIZE, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+
+          /* Create image widget */
+          image = gtk_image_new_from_pixbuf (icon);
+
+          /* Create menu item */
+          gtk_item = gtk_image_menu_item_new_with_label (display_name);
+          gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (gtk_item), image);
+          gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), gtk_item);
+          gtk_widget_show (gtk_item);
+
+          /* Create submenu */
+          gtk_submenu = gtk_menu_new ();
+          gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_item), gtk_submenu);
+
+          /* Create widgets for submenu */
+          create_menu_widgets (gtk_submenu, submenu);
+
+          /* Destroy submenu if it is empty */
+          if (G_UNLIKELY (gtk_container_get_children (GTK_CONTAINER (gtk_submenu)) == NULL))
+            gtk_widget_destroy (gtk_item);
+        }
+    }
+
+  /* Free menu item list */
+  g_slist_free (items);
+}
+
+
+
+static void 
+show_menu (GtkButton *button, 
+           GtkWidget *menu)
+{
+  /* Create menu widgets if not already done */
+  if (g_list_length (gtk_container_get_children (GTK_CONTAINER (menu))) == 0)
+    create_menu_widgets (menu, root);
+
+  /* Display the menu */
+  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
+}
+
+
+
+static void
+main_window_destroy (GtkWidget *window)
+{
+  gtk_main_quit ();
+}
+
+
+
+static void
+create_main_window (void)
+{
+  GtkWidget *window;
+  GtkWidget *button;
+  GtkWidget *menu;
+
+  /* Create main window */
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (window), _("XfceMenu: Display Menu Test"));
+  gtk_container_set_border_width (GTK_CONTAINER (window), 12);
+  gtk_widget_show (window);
+
+  /* Exit main loop when when the window is closed */
+  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (main_window_destroy), NULL);
+
+  /* Create button */
+  button = gtk_button_new_with_mnemonic (_("_Show menu"));
+  gtk_container_add (GTK_CONTAINER (window), button);
+  gtk_widget_show (button);
+
+  /* Create GTK+ root menu */
+  menu = gtk_menu_new ();
+
+  /* Display root menu when the button is clicked */
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (show_menu), menu);
+}
+
+
+
+int 
+main (int    argc,
+      char **argv)
+{
+  GError *error     = NULL;
+  gint    exit_code = EXIT_SUCCESS;
+
+  /* Initialize the menu library */
+  xfce_menu_init ("XFCE");
+
+  /* Initialize GTK+ */
+  gtk_init (&argc, &argv);
+
+  /* Try to load the menu */
+  if (G_UNLIKELY (g_strv_length (argv) > 1))
+    root = xfce_menu_new (argv[1], &error);
+  else
+    root = xfce_menu_get_root (&error);
+
+  /* Check if the menu was loaded */
+  if (G_LIKELY (root != NULL))
+    {
+      /* Create main window */
+      create_main_window ();
+
+      /* Enter main loop */
+      gtk_main ();
+
+      /* Destroy the root menu */
+      g_object_unref (root);
+    }
+  else
+    {
+      g_error (error->message);
+      exit_code = EXIT_FAILURE;
+    }
+
+  /* Shut down the menu library */
+  xfce_menu_shutdown ();
+
+  return exit_code;
+}
diff --git a/tests/test-menu-spec.c b/tests/test-menu-spec.c
index d0acade1d93ab6659e4b71fa6dc7662ea9105fd1..f5514bd40c8662ce8d76037a8228b5c26048481c 100644
--- a/tests/test-menu-spec.c
+++ b/tests/test-menu-spec.c
@@ -1,6 +1,7 @@
 /* $Id$ */
-/* vi:set expandtab sw=2 sts=2: */
 /*-
+ * vi:set et ai sts=2 sw=2 cindent:
+ *
  * Copyright (c) 2007 Jannis Pohlmann <jannis@xfce.org>
  *
  * This library is free software; you can redistribute it and/or