Index: app/widgets/gimplayertreeview.c
===================================================================
--- app/widgets/gimplayertreeview.c	(revision 27897)
+++ app/widgets/gimplayertreeview.c	(working copy)
@@ -1320,25 +1320,48 @@ gimp_layer_tree_view_layer_clicked (Gimp
 
   if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
     {
-      GimpViewRenderer *renderer;
-      GimpUIManager    *ui_manager;
-      GimpActionGroup  *group;
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
 
-      ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
-      group      = gimp_ui_manager_get_action_group (ui_manager, "layers");
+      group = gimp_ui_manager_get_action_group (ui_manager, "layers");
 
-      gtk_tree_model_get (tree_view->model, &iter,
-                          layer_view->priv->model_column_mask, &renderer,
-                          -1);
+      if (state & GDK_MOD1_MASK)
+        {
+          const gchar *action = "layers-alpha-selection-replace";
 
-      if (renderer)
+          if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+            {
+              action = "layers-alpha-selection-intersect";
+            }
+          else if (state & GDK_SHIFT_MASK)
+            {
+              action = "layers-alpha-selection-add";
+            }
+          else if (state & GDK_CONTROL_MASK)
+            {
+              action = "layers-alpha-selection-subtract";
+            }
+
+          gimp_action_group_activate_action (group, action);
+        }
+      else
         {
-          GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
+          GimpViewRenderer *renderer;
 
-          if (gimp_layer_mask_get_edit (mask))
-            gimp_action_group_set_action_active (group,
-                                                 "layers-mask-edit", FALSE);
-          g_object_unref (renderer);
+          gtk_tree_model_get (tree_view->model, &iter,
+                              layer_view->priv->model_column_mask, &renderer,
+                              -1);
+
+          if (renderer)
+            {
+              GimpLayerMask *mask = GIMP_LAYER_MASK (renderer->viewable);
+
+              if (gimp_layer_mask_get_edit (mask))
+                gimp_action_group_set_action_active (group,
+                                                     "layers-mask-edit", FALSE);
+
+              g_object_unref (renderer);
+            }
         }
     }
 
Index: app/widgets/gimpvectorstreeview.c
===================================================================
--- app/widgets/gimpvectorstreeview.c	(revision 27897)
+++ app/widgets/gimpvectorstreeview.c	(working copy)
@@ -39,9 +39,11 @@
 #include "vectors/gimpvectors-export.h"
 #include "vectors/gimpvectors-import.h"
 
+#include "gimpactiongroup.h"
 #include "gimpcontainerview.h"
-#include "gimpvectorstreeview.h"
 #include "gimpdnd.h"
+#include "gimpuimanager.h"
+#include "gimpvectorstreeview.h"
 #include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
@@ -49,20 +51,24 @@
 
 static void    gimp_vectors_tree_view_view_iface_init (GimpContainerViewInterface *iface);
 
-static GObject * gimp_vectors_tree_view_constructor   (GType                  type,
-                                                       guint                  n_params,
-                                                       GObjectConstructParam *params);
-static void      gimp_vectors_tree_view_set_container (GimpContainerView     *view,
-                                                       GimpContainer         *container);
-static void      gimp_vectors_tree_view_drop_svg      (GimpContainerTreeView *tree_view,
-                                                       const gchar           *svg_data,
-                                                       gsize                  svg_data_len,
-                                                       GimpViewable          *dest_viewable,
-                                                       GtkTreeViewDropPosition  drop_pos);
-static GimpItem * gimp_vectors_tree_view_item_new     (GimpImage             *image);
-static guchar  * gimp_vectors_tree_view_drag_svg      (GtkWidget             *widget,
-                                                       gsize                 *svg_data_len,
-                                                       gpointer               data);
+static GObject * gimp_vectors_tree_view_constructor   (GType                     type,
+                                                       guint                     n_params,
+                                                       GObjectConstructParam    *params);
+static void      gimp_vectors_tree_view_set_container (GimpContainerView        *view,
+                                                       GimpContainer            *container);
+static void      gimp_vectors_tree_view_drop_svg      (GimpContainerTreeView    *tree_view,
+                                                       const gchar              *svg_data,
+                                                       gsize                     svg_data_len,
+                                                       GimpViewable             *dest_viewable,
+                                                       GtkTreeViewDropPosition   drop_pos);
+static GimpItem * gimp_vectors_tree_view_item_new     (GimpImage                *image);
+static void   gimp_vectors_tree_view_vectors_clicked  (GimpCellRendererViewable *cell,
+                                                       const gchar              *path_str,
+                                                       GdkModifierType           state,
+                                                       GimpContainerTreeView    *tree_view);
+static guchar  * gimp_vectors_tree_view_drag_svg      (GtkWidget                *widget,
+                                                       gsize                    *svg_data_len,
+                                                       gpointer                  data);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpVectorsTreeView, gimp_vectors_tree_view,
@@ -140,6 +146,10 @@ gimp_vectors_tree_view_constructor (GTyp
   tree_view = GIMP_CONTAINER_TREE_VIEW (object);
   view      = GIMP_VECTORS_TREE_VIEW (object);
 
+  g_signal_connect (tree_view->renderer_cell, "clicked",
+                    G_CALLBACK (gimp_vectors_tree_view_vectors_clicked),
+                    view);
+
   /*  hide basically useless edit button  */
   gtk_widget_hide (gimp_item_tree_view_get_edit_button (GIMP_ITEM_TREE_VIEW (view)));
 
@@ -259,6 +269,37 @@ gimp_vectors_tree_view_item_new (GimpIma
   return GIMP_ITEM (new_vectors);
 }
 
+static void
+gimp_vectors_tree_view_vectors_clicked (GimpCellRendererViewable *cell,
+                                        const gchar              *path_str,
+                                        GdkModifierType           state,
+                                        GimpContainerTreeView    *tree_view)
+{
+  if (state & GDK_MOD1_MASK)
+    {
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
+      const gchar     *action = "vectors-selection-replace";
+
+      group = gimp_ui_manager_get_action_group (ui_manager, "vectors");
+
+      if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+        {
+          action = "vectors-selection-intersect";
+        }
+      else if (state & GDK_SHIFT_MASK)
+        {
+          action = "vectors-selection-add";
+        }
+      else if (state & GDK_CONTROL_MASK)
+        {
+          action = "vectors-selection-subtract";
+        }
+
+      gimp_action_group_activate_action (group, action);
+    }
+}
+
 static guchar *
 gimp_vectors_tree_view_drag_svg (GtkWidget *widget,
                                  gsize     *svg_data_len,
Index: app/widgets/gimpchanneltreeview.c
===================================================================
--- app/widgets/gimpchanneltreeview.c	(revision 27897)
+++ app/widgets/gimpchanneltreeview.c	(working copy)
@@ -37,12 +37,14 @@
 #include "core/gimplayer.h"
 #include "core/gimplayermask.h"
 
+#include "gimpactiongroup.h"
 #include "gimpchanneltreeview.h"
 #include "gimpcomponenteditor.h"
 #include "gimpcontainerview.h"
 #include "gimpdnd.h"
 #include "gimpdocked.h"
 #include "gimphelp-ids.h"
+#include "gimpuimanager.h"
 #include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
@@ -78,6 +80,11 @@ static void   gimp_channel_tree_view_set
                                                        GimpContext       *context);
 static void   gimp_channel_tree_view_set_view_size    (GimpContainerView *view);
 
+static void   gimp_channel_tree_view_channel_clicked  (GimpCellRendererViewable *cell,
+                                                       const gchar              *path_str,
+                                                       GdkModifierType           state,
+                                                       GimpContainerTreeView    *tree_view);
+
 
 G_DEFINE_TYPE_WITH_CODE (GimpChannelTreeView, gimp_channel_tree_view,
                          GIMP_TYPE_DRAWABLE_TREE_VIEW,
@@ -166,6 +173,10 @@ gimp_channel_tree_view_constructor (GTyp
   view      = GIMP_CHANNEL_TREE_VIEW (object);
   tree_view = GIMP_CONTAINER_TREE_VIEW (object);
 
+  g_signal_connect (tree_view->renderer_cell, "clicked",
+                    G_CALLBACK (gimp_channel_tree_view_channel_clicked),
+                    view);
+
   gimp_dnd_viewable_dest_add  (GTK_WIDGET (tree_view->view), GIMP_TYPE_LAYER,
                                NULL, tree_view);
   gimp_dnd_viewable_dest_add  (GTK_WIDGET (tree_view->view), GIMP_TYPE_LAYER_MASK,
@@ -375,3 +386,38 @@ gimp_channel_tree_view_set_view_size (Gi
     gimp_component_editor_set_view_size (GIMP_COMPONENT_EDITOR (channel_view->priv->component_editor),
                                          view_size);
 }
+
+
+/*  signal handlers  */
+
+static void
+gimp_channel_tree_view_channel_clicked (GimpCellRendererViewable *cell,
+                                        const gchar              *path_str,
+                                        GdkModifierType           state,
+                                        GimpContainerTreeView    *tree_view)
+{
+  if (state & GDK_MOD1_MASK)
+    {
+      GimpUIManager   *ui_manager = GIMP_EDITOR (tree_view)->ui_manager;
+      GimpActionGroup *group;
+      const gchar     *action = "channels-selection-replace";
+
+      group = gimp_ui_manager_get_action_group (ui_manager, "channels");
+
+      if ((state & GDK_SHIFT_MASK) && (state & GDK_CONTROL_MASK))
+        {
+          action = "channels-selection-intersect";
+        }
+      else if (state & GDK_SHIFT_MASK)
+        {
+          action = "channels-selection-add";
+        }
+      else if (state & GDK_CONTROL_MASK)
+        {
+          action = "channels-selection-subtract";
+        }
+
+      gimp_action_group_activate_action (group, action);
+    }
+}
+
