diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index 12269081d493a87007819fea150532e6bc3ca4ac..4fefaece80b5384693f7aa87603269dfb066d95b 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -752,6 +752,9 @@ extern void svg_grouptogui(t_glist *g, t_template *template, t_word *data);
 extern void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner,
     t_word *data, t_template *template);
 
+extern void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
+    t_template *template, t_word *data);
+
 static void scalar_group_configure(t_scalar *x, t_glist *owner,
     t_template *template, t_glist *gl, t_glist *parent)
 {
@@ -766,6 +769,7 @@ static void scalar_group_configure(t_scalar *x, t_glist *owner,
         glist_getcanvas(owner), tagbuf);
     svg_grouptogui(gl, template, x->sc_vec);
     gui_end_vmess();
+    svg_register_events((t_gobj *)gl, owner, x, template, x->sc_vec);
     for (y = gl->gl_list; y; y = y->g_next)
     {
         if (pd_class(&y->g_pd) == canvas_class &&
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index 877722606c4294f331bdd768996948fb70c624f4..8b486bf6f53eb290f6868f8a39676cf691184f06 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1087,15 +1087,15 @@ typedef struct _svg_attr
 /* events on which to output a notification from the outlet of [draw] */
 typedef struct _svg_event
 {
-    t_fielddesc e_focusin,
-                e_focusout,
-                e_activate,
-                e_click,
-                e_mousedown,
-                e_mouseup,
-                e_mouseover,
-                e_mousemove,
-                e_mouseout;
+    t_svg_attr e_focusin,
+               e_focusout,
+               e_activate,
+               e_click,
+               e_mousedown,
+               e_mouseup,
+               e_mouseover,
+               e_mousemove,
+               e_mouseout;
 } t_svg_event;
 
 /* svg attributes */
@@ -1348,15 +1348,24 @@ void *svg_new(t_pd *parent, t_symbol *s, int argc, t_atom *argv)
     x->x_transform = (t_fielddesc *)t_getbytes(x->x_transform_n *
         sizeof(t_fielddesc));
     /* initialize events */
-    fielddesc_setfloat_const(&x->x_events.e_focusin, 0);
-    fielddesc_setfloat_const(&x->x_events.e_focusout, 0);
-    fielddesc_setfloat_const(&x->x_events.e_activate, 0);
-    fielddesc_setfloat_const(&x->x_events.e_click, 0);
-    fielddesc_setfloat_const(&x->x_events.e_mousedown, 0);
-    fielddesc_setfloat_const(&x->x_events.e_mouseup, 0);
-    fielddesc_setfloat_const(&x->x_events.e_mouseover, 0);
-    fielddesc_setfloat_const(&x->x_events.e_mousemove, 0);
-    fielddesc_setfloat_const(&x->x_events.e_mouseout, 0);
+    fielddesc_setfloat_const(&x->x_events.e_focusin.a_attr, 0);
+    x->x_events.e_focusin.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_focusout.a_attr, 0);
+    x->x_events.e_focusout.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_activate.a_attr, 0);
+    x->x_events.e_activate.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_click.a_attr, 0);
+    x->x_events.e_click.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_mousedown.a_attr, 0);
+    x->x_events.e_mousedown.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_mouseup.a_attr, 0);
+    x->x_events.e_mouseup.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_mouseover.a_attr, 0);
+    x->x_events.e_mouseover.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_mousemove.a_attr, 0);
+    x->x_events.e_mousemove.a_flag = 0;
+    fielddesc_setfloat_const(&x->x_events.e_mouseout.a_attr, 0);
+    x->x_events.e_mouseout.a_flag = 0;
 
     char buf[50];
     // Here we bind the parent object to the addy for
@@ -1661,35 +1670,35 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         gui_vmess("gui_draw_event", "xsxxsi",
             glist_getcanvas(c), tag, sc, x, "mouseover",
             (int)fielddesc_getcoord(
-                &x->x_events.e_mouseover, template, data, 1));
+                &x->x_events.e_mouseover.a_attr, template, data, 1));
     }
     else if (s == gensym("mouseout"))
     {
         gui_vmess("gui_draw_event", "xsxxsi",
             glist_getcanvas(c), tag, sc, x, "mouseout",
             (int)fielddesc_getcoord(
-                &x->x_events.e_mouseout, template, data, 1));
+                &x->x_events.e_mouseout.a_attr, template, data, 1));
     }
     else if (s == gensym("mousemove"))
     {
         gui_vmess("gui_draw_event", "xsxxsi",
             glist_getcanvas(c), tag, sc, x, "mousemove",
             (int)fielddesc_getcoord(
-                &x->x_events.e_mousemove, template, data, 1));
+                &x->x_events.e_mousemove.a_attr, template, data, 1));
     }
     else if (s == gensym("mouseup"))
     {
         gui_vmess("gui_draw_event", "xsxxsi",
             glist_getcanvas(c), tag, sc, x, "mouseup",
             (int)fielddesc_getcoord(
-                &x->x_events.e_mouseup, template, data, 1));
+                &x->x_events.e_mouseup.a_attr, template, data, 1));
     }
     else if (s == gensym("mousedown"))
     {
         gui_vmess("gui_draw_event", "xsxxsi",
             glist_getcanvas(c), tag, sc, x, "mousedown",
             (int)fielddesc_getcoord(
-                &x->x_events.e_mousedown, template, data, 1));
+                &x->x_events.e_mousedown.a_attr, template, data, 1));
     }
     else if (s == gensym("vis"))
     {
@@ -1917,6 +1926,61 @@ void svg_update(t_svg *x, t_symbol *s)
         svg_doupdate(x, c, s);
 }
 
+/* not sure if this will work with array elements */
+void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
+    t_template *template, t_word *data)
+{
+    t_svg *svg;
+    char tagbuf[MAXPDSTRING];
+    if (pd_class(&z->g_pd) == canvas_class)
+    {
+        svg = (t_svg *)((t_glist *)z)->gl_svg;
+        sprintf(tagbuf, "dgroup%lx.%lx", (long unsigned int)z,
+            (long unsigned int)data);
+    }
+    else if (pd_class(&z->g_pd) == draw_class)
+    {
+        svg = (t_svg *)((t_draw *)z)->x_attr;
+        sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)z,
+            (long unsigned int)data);
+    }
+    else if (pd_class(&z->g_pd) == drawimage_class)
+    {
+        svg = (t_svg *)((t_drawimage *)z)->x_attr;
+        sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)z,
+            (long unsigned int)data);
+    }
+    else
+    {
+        error("scalar: can't set event for unknown drawing command");
+        return;
+    }
+    if (svg->x_events.e_mouseover.a_flag)
+        gui_vmess("gui_draw_event", "xsxxsi",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseover",
+            (int)fielddesc_getcoord(&svg->x_events.e_mouseover.a_attr, template,
+            data, 1));
+    if (svg->x_events.e_mouseout.a_flag)
+        gui_vmess("gui_draw_event", "xsxxsi",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseout",
+            (int)fielddesc_getcoord(&svg->x_events.e_mouseout.a_attr, template,
+            data, 1));
+    if (svg->x_events.e_mousemove.a_flag)
+        gui_vmess("gui_draw_event", "xsxxsi",
+            glist_getcanvas(c), tagbuf, sc, svg, "mousemove",
+            (int)fielddesc_getcoord(&svg->x_events.e_mousemove.a_attr, template,
+            data, 1));
+    if (svg->x_events.e_mousemove.a_flag)
+        gui_vmess("gui_draw_event", "xsxxsi",
+            glist_getcanvas(c), tagbuf, sc, svg, "mousemove",
+            (int)fielddesc_getcoord(&svg->x_events.e_mousemove.a_attr, template,
+            data, 1));
+    if (svg->x_events.e_mouseup.a_flag)
+        gui_vmess("gui_draw_event", "xsxxsi",
+            glist_getcanvas(c), tagbuf, sc, svg, "mouseup",
+            (int)fielddesc_getcoord(&svg->x_events.e_mouseup.a_attr, template,
+            data, 1));
+}
 
 void svg_setattr(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
 {
@@ -2137,23 +2201,50 @@ void svg_event(t_svg *x, t_symbol *s, int argc, t_atom *argv)
     if (argc > 0 && (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL))
     {
         if (s == gensym("focusin"))
-            fielddesc_setfloatarg(&x->x_events.e_focusin, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_focusin.a_attr, argc, argv);
+            x->x_events.e_focusin.a_flag = 1;
+        }
         else if (s == gensym("focusout"))
-            fielddesc_setfloatarg(&x->x_events.e_focusout, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_focusout.a_attr, argc, argv);
+            x->x_events.e_focusout.a_flag = 1;
+        }
         else if (s == gensym("activate"))
-            fielddesc_setfloatarg(&x->x_events.e_activate, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_activate.a_attr, argc, argv);
+            x->x_events.e_activate.a_flag = 1;
+        }
         else if (s == gensym("click"))
-            fielddesc_setfloatarg(&x->x_events.e_click, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_click.a_attr, argc, argv);
+            x->x_events.e_click.a_flag = 1;
+        }
         else if (s == gensym("mousedown"))
-            fielddesc_setfloatarg(&x->x_events.e_mousedown, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_mousedown.a_attr, argc, argv);
+            x->x_events.e_mousedown.a_flag = 1;
+        }
         else if (s == gensym("mouseup"))
-            fielddesc_setfloatarg(&x->x_events.e_mouseup, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_mouseup.a_attr, argc, argv);
+            x->x_events.e_mouseup.a_flag = 1;
+        }
         else if (s == gensym("mouseover"))
-            fielddesc_setfloatarg(&x->x_events.e_mouseover, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_mouseover.a_attr, argc, argv);
+            x->x_events.e_mouseover.a_flag = 1;
+        }
         else if (s == gensym("mousemove"))
-            fielddesc_setfloatarg(&x->x_events.e_mousemove, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_mousemove.a_attr, argc, argv);
+            x->x_events.e_mousemove.a_flag = 1;
+        }
         else if (s == gensym("mouseout"))
-            fielddesc_setfloatarg(&x->x_events.e_mouseout, argc, argv);
+        {
+            fielddesc_setfloatarg(&x->x_events.e_mouseout.a_attr, argc, argv);
+            x->x_events.e_mouseout.a_flag = 1;
+        }
         svg_update(x, s);
     }
 }
@@ -3677,8 +3768,6 @@ void svg_grouptogui(t_glist *g, t_template *template, t_word *data)
     svg_togui(x, template, data);
 }
 
-    
-
 static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
     t_scalar *sc, t_word *data, t_template *template,
     t_float basex, t_float basey, int vis)
@@ -3788,6 +3877,9 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
         //sys_gui(";\n");
         gui_end_array();
         gui_end_vmess();
+
+        /* register events */
+        svg_register_events(z, glist, sc, template, data);
     }
     else
     {
@@ -3960,7 +4052,7 @@ static int draw_click(t_gobj *z, t_glist *glist,
     /* don't register a click if we don't have an event listener, or
        if our pointer-event is "none" */
     if (!fielddesc_getfloat(&sa->x_pointerevents.a_attr, template, data, 1) ||
-         (!fielddesc_getfloat(&sa->x_events.e_mousedown, template, data, 1) &&
+         (!fielddesc_getfloat(&sa->x_events.e_mousedown.a_attr, template, data, 1) &&
           !fielddesc_getfloat(&sa->x_drag, template, data, 1)))
         return 0;
     draw_getrect(z, glist, data, template, basex, basey,