diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index e7063e9..e90d6a9 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -114,6 +114,7 @@ struct _EMFolderTreePrivate {
 enum {
 	FOLDER_ACTIVATED,  /* aka double-clicked or user hit enter */
 	FOLDER_SELECTED,
+	HIDDEN_KEY_EVENT,
 	LAST_SIGNAL
 };
 
@@ -237,6 +238,15 @@ em_folder_tree_class_init (EMFolderTreeClass *klass)
 			      G_TYPE_NONE, 2,
 			      G_TYPE_STRING,
 			      G_TYPE_STRING);
+
+	signals[HIDDEN_KEY_EVENT] =
+		g_signal_new ("hidden-key-event",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (EMFolderTreeClass, hidden_key_event),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__BOXED,
+			      G_TYPE_NONE, 1, GDK_TYPE_EVENT);
 }
 
 static gboolean
@@ -2307,7 +2317,9 @@ emft_tree_button_press (GtkTreeView *treeview, GdkEventButton *event, EMFolderTr
 static gboolean
 emft_tree_user_event (GtkTreeView *treeview, GdkEvent *e, EMFolderTree *emft)
 {
-	if (e && e->type == GDK_KEY_PRESS && e->key.keyval == GDK_space) {
+	if (e && e->type == GDK_KEY_PRESS && (e->key.keyval == GDK_space || e->key.keyval == '.' || e->key.keyval == ',' || e->key.keyval == '[' || e->key.keyval == ']')) {
+		g_signal_emit (emft, signals [HIDDEN_KEY_EVENT], 0, e);
+
 		return TRUE;
 	}
 	if (!emft->priv->do_multiselect)
diff --git a/mail/em-folder-tree.h b/mail/em-folder-tree.h
index e89be47..32a228e 100644
--- a/mail/em-folder-tree.h
+++ b/mail/em-folder-tree.h
@@ -65,6 +65,7 @@ struct _EMFolderTreeClass {
 	/* signals */
 	void (* folder_activated) (EMFolderTree *emft, const char *full_name, const char *uri);
 	void (* folder_selected) (EMFolderTree *emft, const char *full_name, const char *uri, guint32 flags);
+	void (* hidden_key_event) (EMFolderTree *emft, GdkEvent *event);
 };
 
 GType em_folder_tree_get_type (void);
diff --git a/mail/mail-component.c b/mail/mail-component.c
index 556715d..423f6b4 100644
--- a/mail/mail-component.c
+++ b/mail/mail-component.c
@@ -412,6 +412,25 @@ folder_selected_cb (EMFolderTree *emft, const char *path, const char *uri, guint
 	}
 }
 
+static void
+tree_hidden_key_event_cb (EMFolderTree *emft, GdkEvent *event, EMFolderView *view)
+{
+	if (event && event->type == GDK_KEY_PRESS && view && view->list) {
+		switch (event->key.keyval) {
+		case '[':
+		case ',':
+			gtk_widget_grab_focus ((GtkWidget *) view->list);
+			message_list_select (view->list, MESSAGE_LIST_SELECT_PREVIOUS|MESSAGE_LIST_SELECT_WRAP, 0, CAMEL_MESSAGE_SEEN);
+			break;
+		case ']':
+		case '.':
+			gtk_widget_grab_focus ((GtkWidget *) view->list);
+			message_list_select (view->list, MESSAGE_LIST_SELECT_NEXT|MESSAGE_LIST_SELECT_WRAP, 0, CAMEL_MESSAGE_SEEN);
+			break;
+		}
+	}
+}
+
 static int
 check_autosave(void *data)
 {
@@ -784,6 +803,7 @@ impl_createView (PortableServer_Servant servant,
 
 	g_signal_connect (component_view->view_control, "activate", G_CALLBACK (view_control_activate_cb), view_widget);
 	g_signal_connect (tree_widget, "folder-selected", G_CALLBACK (folder_selected_cb), view_widget);
+	g_signal_connect (tree_widget, "hidden-key-event", G_CALLBACK (tree_hidden_key_event_cb), view_widget);
 
 	g_signal_connect((EMFolderBrowser *)view_widget, "account_search_cleared", G_CALLBACK (enable_folder_tree), tree_widget);
 	g_signal_connect(((EMFolderBrowser *)view_widget), "account_search_activated", G_CALLBACK (disable_folder_tree), tree_widget);
