diff -urN -X xclude orig/hildon-status-menu-0.3.38+0m5/src/hd-status-area.c hildon-status-menu-0.3.38+0m5/src/hd-status-area.c
--- orig/hildon-status-menu-0.3.38+0m5/src/hd-status-area.c	2010-03-29 19:57:43.000000000 +0300
+++ hildon-status-menu-0.3.38+0m5/src/hd-status-area.c	2010-05-25 20:37:20.000000000 +0300
@@ -40,6 +40,10 @@
 
 #include "hd-status-area.h"
 
+#define TASKNAV_SIGNAL_INTERFACE   "com.nokia.hildon_desktop"
+#define OPEN_SIGNAL_NAME        "open_status_menu"
+#define CLOSE_SIGNAL_NAME        "close_status_menu"
+
 /* UI Style guide */
 #define STATUS_AREA_HEIGHT 56
 #define MINIMUM_STATUS_AREA_WIDTH 112
@@ -106,6 +110,23 @@
   return TRUE;
 }
 
+static DBusHandlerResult
+hd_dbus_signal_handler (DBusConnection *conn, DBusMessage *msg, void *data)
+{
+    HDStatusAreaPrivate *priv = (HDStatusAreaPrivate *)data;
+    if (dbus_message_is_signal(msg, TASKNAV_SIGNAL_INTERFACE, OPEN_SIGNAL_NAME))
+    {
+        gtk_widget_show (priv->status_menu);
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }
+    else if (dbus_message_is_signal(msg, TASKNAV_SIGNAL_INTERFACE, CLOSE_SIGNAL_NAME))
+    {
+        gtk_widget_hide (priv->status_menu);
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
 static gboolean
 is_widget_on_screen (GtkWidget *widget)
 {
@@ -164,6 +185,8 @@
   HDStatusAreaPrivate *priv = HD_STATUS_AREA_GET_PRIVATE (status_area);
   GtkWidget *left_alignment, *main_hbox, *left_hbox, *special_hbox;
   guint i;
+  DBusConnection *connection;
+  DBusError derror;
 
   /* Set priv member */
   status_area->priv = priv;
@@ -236,6 +259,15 @@
    * program is full-screen) */
   g_signal_connect (G_OBJECT (status_area), "configure-event",
                     G_CALLBACK (configure_event_cb), status_area);
+  dbus_error_init (&derror);
+  connection = dbus_bus_get (DBUS_BUS_SESSION, &derror);
+  if (!connection) {
+      dbus_error_free (&derror);
+      g_warning ("%s: failed to connect to the system bus", __func__);
+  } else {
+      dbus_bus_add_match (connection, "type='signal', interface='" TASKNAV_SIGNAL_INTERFACE "'", NULL);
+      dbus_connection_add_filter (connection, hd_dbus_signal_handler,  priv, NULL);
+  }
 }
 
 static GObject *
diff -urN -X xclude orig/hildon-status-menu-0.3.38+0m5/src/hd-status-menu-box.c hildon-status-menu-0.3.38+0m5/src/hd-status-menu-box.c
--- orig/hildon-status-menu-0.3.38+0m5/src/hd-status-menu-box.c	2010-03-29 19:57:43.000000000 +0300
+++ hildon-status-menu-0.3.38+0m5/src/hd-status-menu-box.c	2010-06-02 02:33:38.000000000 +0300
@@ -408,3 +408,26 @@
         }
     }
 }
+
+GtkWidget *
+hd_status_menu_box_nth_visible_child(HDStatusMenuBox *box, int n) ;
+GtkWidget *
+hd_status_menu_box_nth_visible_child(HDStatusMenuBox *box, int n) {
+	HDStatusMenuBoxPrivate *priv=box->priv;
+       	GList * iter;
+       	int i;
+       	i = 0;
+       	iter = priv->children; 
+	while(iter) {
+		HDStatusMenuBoxChild *info = iter->data;
+		if (GTK_WIDGET_VISIBLE (info->widget)) {
+		       	if(i==n) {
+			       	return info->widget;
+			}
+		       	i++;
+	       	}
+	       	iter = iter->next;
+       	}
+	return NULL;
+}
+
diff -urN -X xclude orig/hildon-status-menu-0.3.38+0m5/src/hd-status-menu.c hildon-status-menu-0.3.38+0m5/src/hd-status-menu.c
--- orig/hildon-status-menu-0.3.38+0m5/src/hd-status-menu.c	2010-03-29 19:57:43.000000000 +0300
+++ hildon-status-menu-0.3.38+0m5/src/hd-status-menu.c	2010-06-02 02:37:10.000000000 +0300
@@ -471,6 +471,57 @@
     }
 }
 
+
+GtkWidget *
+hd_status_menu_box_nth_visible_child(GtkWidget *box, int n);
+
+/* Send keyboard accelerators to the parent window, if necessary.
+ * This code is heavily based on gtk_menu_key_press ()
+ */
+static gboolean
+hildon_app_menu_key_press                       (GtkWidget   *widget,
+                                                 GdkEventKey *event)
+{
+//    GtkWindow *parent_window;
+    HDStatusMenuPrivate *priv;
+
+    g_return_val_if_fail (HD_IS_STATUS_MENU (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    if((event->keyval==GDK_Escape)||(event->keyval==GDK_BackSpace)) {
+            gtk_widget_hide(widget);
+    }
+
+//    if (GTK_WIDGET_CLASS (hildon_status_menu_parent_class)->key_press_event (widget, event))
+//        return TRUE;
+
+    priv = HD_STATUS_MENU_GET_PRIVATE (widget);
+//    parent_window = priv->parent_window;
+    g_warning("HSM key_press: %i %i\n", event->keyval, event->hardware_keycode);
+    if((event->hardware_keycode>=24)&&(event->hardware_keycode<=33)){
+	   GtkWidget *w;
+	   w = hd_status_menu_box_nth_visible_child(priv->box, event->hardware_keycode-24);
+	   if (w) {
+		   if(GTK_IS_BUTTON(w) ){
+			   gtk_button_clicked((GtkButton*)w);
+		   } else if(GTK_IS_CONTAINER(w)) {
+			   GList *c=gtk_container_get_children((GtkContainer*)w);
+			   int i;
+			   i=0;
+			   while(c) {
+				   if(GTK_IS_BUTTON(c->data)) {
+					   gtk_button_clicked(c->data);
+					   break;
+				   }
+
+				   c = c->next;
+			   }
+		   }
+	   }
+    }
+    return TRUE;
+}
+
 static void
 hd_status_menu_class_init (HDStatusMenuClass *klass)
 {
@@ -484,6 +535,7 @@
   widget_class->realize = hd_status_menu_realize;
   widget_class->unrealize = hd_status_menu_unrealize;
   widget_class->map = hd_status_menu_map;
+  widget_class->key_press_event = hildon_app_menu_key_press;
 
   container_class->check_resize = hd_status_menu_check_resize;
 
@@ -513,7 +565,7 @@
 
   status_menu = g_object_new (HD_TYPE_STATUS_MENU,
                               "type", GTK_WINDOW_TOPLEVEL,
-                              "accept-focus", FALSE,
+                              "accept-focus", TRUE,
                               "plugin-manager", plugin_manager,
                               NULL);
 
