diff --git a/externals/ggee/gui/image-help.pd b/externals/ggee/gui/image-help.pd
index daa8666dfeeff8dc27cf4ef3d61c237aa664288f..a408480b1b2277bf5432e3f67abf3a2baad9fc13 100644
--- a/externals/ggee/gui/image-help.pd
+++ b/externals/ggee/gui/image-help.pd
@@ -1,7 +1,7 @@
-#N canvas 0 26 462 618 10;
+#N canvas 429 34 607 627 10;
 #X obj 74 489 ggee/image @pd_extra/ggee/logo100.gif 0;
-#X text 26 12 Incorporate images. This is instantiated with;
-#X text 26 25 [image logo100.gif];
+#X text 38 14 Incorporate images. This is instantiated with;
+#X text 38 34 [image logo100.gif];
 #X msg 40 395 open \$1;
 #X obj 40 351 bng 15 250 50 0 empty empty empty 0 -6 0 10 -4034 -1
 -1;
@@ -15,23 +15,35 @@ Wilkes for Pd version 0.42.;
 #X text 12 85 OUTLET_0 bang;
 #X text 12 105 AUTHOR Ivica Ico Bukvic \, based on Guenter Geiger's
 image;
-#X text 12 65 INLET_0 open gopspill;
-#X restore 405 590 pd META;
-#X obj 162 490 ggee/image @pd_extra/ggee/logo100.gif 1;
+#X text 12 65 INLET_0 open gopspill gopspill_size click;
+#X restore 550 603 pd META;
+#X obj 162 489 ggee/image @pd_extra/ggee/logo100.gif 1;
 #X obj 155 348 loadbang;
 #X msg 155 371 1;
 #X msg 155 395 gopspill \$1;
 #X floatatom 184 371 5 0 0 0 - - -, f 5;
-#X obj 257 448 ggee/image @pd_extra/ggee/empty_image.png 0;
-#X msg 245 395 open \$1;
-#X obj 245 351 bng 15 250 50 0 empty empty empty 0 -6 0 10 -4034 -1
+#X obj 259 558 ggee/image @pd_extra/ggee/empty_image.png 0;
+#X msg 247 505 open \$1;
+#X obj 247 461 bng 15 250 50 0 empty empty empty 0 -6 0 10 -4034 -1
 -1;
-#X obj 245 372 openpanel;
-#X text 26 48 [image] works with .gif \, .ppm \, .pgm and .png image
-formats only.;
-#X text 274 425 this is how an empty imagelooks like when createdwithout
+#X obj 247 482 openpanel;
+#X text 38 50 [image] works with .gif \, .ppm \, .pgm and .png image
+formats only., f 64;
+#X text 276 535 this is how an empty imagelooks like when createdwithout
 any parameters;
-#X text 27 83 Pd-L2Ork version of [image] also has a special feature
+#X msg 352 483 click \$1;
+#X obj 352 463 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 247 582 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 101 291 click \$1;
+#X obj 101 271 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X obj 155 548 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 413 466 toggling click on enablesobject to capture clicksand
+broadcast them as bangsvia its only outlet;
+#X text 39 85 Pd-L2Ork version of [image] also has a special feature
 that allows its reported rectangle to be smaller \, so it can be used
 as a decoration for a graph-on-parent abstraction that may potentially
 spill beyond the grap-on-parent rectangle (as is the case with K12
@@ -39,15 +51,32 @@ mode). To invoke this mode \, pass a "gopspill 0/1" message into the
 object or create it by giving it an optional argument \, 0=off(default)
 \, 1=on. Filename is always first optional argument and the float argument
 second. In the absence of a symbol (string) filename \, the float value
-will be treated as the gopspill argument. For instance:[image logo100.gif
-1][image logo100.gif 0] is synonymous to [image logo100.gif];
+will be treated as the gopspill argument. For instance:[image logo100.gif
+1][image logo100.gif 0] is synonymous to [image logo100.gif], f
+86;
+#X text 162 272 notice how the click area (when toggled on)only exists
+within the inner gop spill area of 15x15(enter edit mode and select
+the object to observe itsselection area;
+#X msg 239 395 gopspill_size \$1 \$1;
+#X floatatom 239 363 5 0 0 0 - - -, f 5;
+#X text 275 349 you can also set the gopspill size (default 15).Values
+less than or equal to 3 will be silently ignored. Float values will
+be rounded., f 49;
 #X connect 3 0 0 0;
 #X connect 4 0 5 0;
 #X connect 5 0 3 0;
+#X connect 7 0 23 0;
 #X connect 8 0 9 0;
 #X connect 9 0 10 0;
 #X connect 10 0 7 0;
 #X connect 11 0 10 0;
+#X connect 12 0 20 0;
 #X connect 13 0 12 0;
 #X connect 14 0 15 0;
 #X connect 15 0 13 0;
+#X connect 18 0 12 0;
+#X connect 19 0 18 0;
+#X connect 21 0 7 0;
+#X connect 22 0 21 0;
+#X connect 27 0 7 0;
+#X connect 28 0 27 0;
diff --git a/externals/ggee/gui/image.c b/externals/ggee/gui/image.c
index 31afe5c9c19b04cf3519caa9ffdaadc7e9196893..b8c45c90de7b7a0b3a7b9a1f39cd65d1e7151b12 100644
--- a/externals/ggee/gui/image.c
+++ b/externals/ggee/gui/image.c
@@ -22,6 +22,8 @@ typedef struct _image
 	int x_img_width;
 	int x_img_height;
 	int x_gop_spill;
+	int x_click;
+	//t_float x_clicked;
 	t_symbol* x_fname;
 	t_symbol* x_receive;
 	//int x_selected;
@@ -110,6 +112,7 @@ static void image_getrect(t_gobj *z, t_glist *glist,
 {
 	int width, height;
 	t_image* x = (t_image*)z;
+	//printf("image_getrect %d %d\n", *xp1, *yp1);
 
 	if (!x->x_gop_spill && (x->x_img_width + x->x_img_height) >= 2) {
 		width = x->x_img_width;
@@ -122,6 +125,22 @@ static void image_getrect(t_gobj *z, t_glist *glist,
 	*yp1 = text_ypix(&x->x_obj, glist) - height/2;
 	*xp2 = text_xpix(&x->x_obj, glist) + width/2;
 	*yp2 = text_ypix(&x->x_obj, glist) + height/2;
+
+	// if we have click detection disabled and we are in runmode,
+	// return 0 size to allow for click relegation to hidden objects below
+	// CAREFUL: this code is not reusable for objects that have more than
+	// one inlet or outlet because it will cram them together
+	if ((glist_getcanvas(glist) != glist && !x->x_click) || (!glist->gl_edit && !x->x_click))
+	{
+		*xp2 = *xp1;
+		// only if we have an image loaded and we are placed within a GOP obliterate the height
+		//if (glist_getcanvas(glist) != glist && (x->x_img_width + x->x_img_height) >= 2)
+		//{
+			//printf("blah\n");
+			//*yp2 = *yp1;
+		//}
+	}
+
 	//fprintf(stderr,"image_getrect %d %d %d %d\n", *xp1, *yp1, *xp2, *yp2);
 }
 
@@ -269,18 +288,51 @@ t_widgetbehavior   image_widgetbehavior;
 
 }*/
 
-/*static int image_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit)
+static int image_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
+	//printf("doit=%d\n", doit);
 	t_image *x = (t_image *)z;
-	if (doit)
+	if (doit && x->x_click)
 		outlet_bang(x->x_obj.ob_outlet);
+	// LATER: figure out how to do click on and click off
+	// and provide a toggle button behavior insteadS
+	/*{
+		x->x_clicked = 1;
+		outlet_float(x->x_obj.ob_outlet, x->x_clicked);
+	}
+	else if (x->x_clicked)
+	{
+		x->x_clicked = 0;
+		outlet_float(x->x_obj.ob_outlet, x->x_clicked);
+	}*/
 	return(1);
-}*/
+}
+
+static void image_click(t_image *x, t_float f)
+{
+	if (f == 0)
+		x->x_click = 0;
+	else if (f == 1)
+		x->x_click = 1;
+}
 
 void image_gop_spill(t_image* x, t_floatarg f)
 {
-     x->x_gop_spill = (f >= 0 ? f : 0);
-	 image_displace((t_gobj*)x, x->x_glist, 0.0, 0.0);
+    x->x_gop_spill = (f >= 0 ? f : 0);
+	image_displace((t_gobj*)x, x->x_glist, 0.0, 0.0);
+}
+
+void image_gop_spill_size(t_image* x, t_floatarg f)
+{
+	//printf("image_gop_spill_size=%d\n", (int)f);
+	// we need a size of at least 3 to have a meaningful
+	// selection frame around the selection box
+	if ((int)f >= 3)
+	{
+    	x->x_width = (int)f;
+    	x->x_height = x->x_width;
+		image_displace((t_gobj*)x, x->x_glist, 0.0, 0.0);
+	}
 }
 
 void image_open(t_image* x, t_symbol *s, t_int argc, t_atom *argv)
@@ -308,10 +360,11 @@ static void image_imagesize_callback(t_image *x, t_float w, t_float h) {
 			image_erase(x, glist_getcanvas(x->x_glist));
 	} else {
 		//sys_vgui("catch {.x%x.c delete %xMT}\n", glist_getcanvas(x->x_glist), x);
-		//if (x->x_selected) {
-		//image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 0);
-		//image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 1);
-		//}
+		// reselect if we are on a toplevel canvas to adjust the selection rectangle, if necessary
+		if (glist_isselected(x->x_glist, (t_gobj *)x) && glist_getcanvas(x->x_glist) == x->x_glist) {
+			image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 0);
+			image_select((t_gobj *)x, glist_getcanvas(x->x_glist), 1);
+		}
 		canvas_fixlinesfor(x->x_glist,(t_text*) x);
 	}
 }
@@ -324,7 +377,7 @@ static void image_setwidget(void)
     image_widgetbehavior.w_activatefn =   	image_activate;
     image_widgetbehavior.w_deletefn =   	image_delete;
     image_widgetbehavior.w_visfn =   		image_vis;
-    //image_widgetbehavior.w_clickfn = 		image_newclick;
+    image_widgetbehavior.w_clickfn = 		image_newclick;
     image_widgetbehavior.w_displacefnwtag =	image_displace_wtag;
 }
 
@@ -349,6 +402,8 @@ static void *image_new(t_symbol *s, t_int argc, t_atom *argv)
 	x->x_img_width = 0;
 	x->x_img_height = 0;
 	x->x_gop_spill = 0;
+	x->x_click = 0;
+	//x->x_clicked = 0;
 	//x->x_selected = 0;
 
 	x->x_fname = get_filename(argc, argv);
@@ -372,7 +427,9 @@ static void *image_new(t_symbol *s, t_int argc, t_atom *argv)
 	x->x_receive = gensym(buf);
     pd_bind(&x->x_obj.ob_pd, x->x_receive);
 
-    //outlet_new(&x->x_obj, &s_bang);
+    outlet_new(&x->x_obj, &s_bang);
+    //outlet_new(&x->x_obj, &s_float);
+
     return (x);
 }
 
@@ -387,10 +444,14 @@ void image_setup(void)
 	class_addmethod(image_class, (t_method)image_color, gensym("color"),
     	A_SYMBOL, 0);
 */
+	class_addmethod(image_class, (t_method)image_click, gensym("click"),
+    	A_DEFFLOAT, 0);
     class_addmethod(image_class, (t_method)image_open, gensym("open"),
     	A_GIMME, 0);
     class_addmethod(image_class, (t_method)image_gop_spill, gensym("gopspill"),
     	A_DEFFLOAT, 0);
+	class_addmethod(image_class, (t_method)image_gop_spill_size, gensym("gopspill_size"),
+    	A_DEFFLOAT, 0);
     class_addmethod(image_class, (t_method)image_imagesize_callback,\
                      gensym("_imagesize"), A_DEFFLOAT, A_DEFFLOAT, 0);
 	
@@ -398,5 +459,3 @@ void image_setup(void)
     class_setwidget(image_class,&image_widgetbehavior);
     class_setsavefn(image_class,&image_save);
 }
-
-