diff --git a/pd/src/g_all_guis.c b/pd/src/g_all_guis.c
index 4bfce9659b96f6cb8d6aa557c22b32234f85da1c..97c8c678265077536384fb287fe88aea1f6bc52c 100644
--- a/pd/src/g_all_guis.c
+++ b/pd/src/g_all_guis.c
@@ -963,7 +963,11 @@ static void scalehandle_clickhook(t_scalehandle *h, t_floatarg f,
 static void scalehandle_motionhook(t_scalehandle *h,
     t_floatarg f1, t_floatarg f2)
 {
-    h->h_motionfn(h,f1-h->h_offset_x,f2-h->h_offset_y);
+    h->h_motionfn(h,f1,f2);
+    // Now set the offset to the new mouse position
+    h->h_offset_x = f1;
+    h->h_offset_y = f2;
+
 }
 
 void iemgui__clickhook3(t_scalehandle *sh, int newstate) {
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index 6cafec308d5f4d90cd9c9e7a10ce5d5c29f2ce35..23fd355d0ed4cb1e0b1315bfcabae8b52bd49011 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -114,7 +114,8 @@ void bng_draw_config(t_bng* x, t_glist* glist)
     gui_end_vmess();
 }
 
-static void bng__clickhook(t_scalehandle *sh, int newstate)
+/* can eventually remove this */
+static void bng__clickhook_old(t_scalehandle *sh, int newstate)
 {
     t_bng *x = (t_bng *)(sh->h_master);
     if (sh->h_dragon && newstate == 0 && sh->h_scale)
@@ -135,18 +136,81 @@ static void bng__clickhook(t_scalehandle *sh, int newstate)
     iemgui__clickhook3(sh,newstate);
 }
 
+static void bng__clickhook(t_scalehandle *sh, int newstate)
+{
+    t_bng *x = (t_bng *)(sh->h_master);
+    if (newstate && sh->h_scale)
+    {
+        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
+    }
+    /* not sure we need this anymore... */
+    else if (newstate == 0 && sh->h_scale)
+    {
+        if (sh->h_dragx || sh->h_dragy)
+        {
+            x->x_gui.x_w += sh->h_dragx;
+            x->x_gui.x_h += sh->h_dragy;
+            canvas_dirty(x->x_gui.x_glist, 1);
+        }
+        if (glist_isvisible(x->x_gui.x_glist))
+        {
+            bng_draw_move(x, x->x_gui.x_glist);
+            scalehandle_unclick_scale(sh);
+        }
+    }
+    iemgui__clickhook3(sh,newstate);
+}
+
 static void bng__motionhook(t_scalehandle *sh,
-                    t_floatarg f1, t_floatarg f2)
+                    t_floatarg mouse_x, t_floatarg mouse_y)
 {
-    if (sh->h_dragon && sh->h_scale)
+    if (sh->h_scale)
     {
         t_bng *x = (t_bng *)(sh->h_master);
-        int d = maxi((int)f1,(int)f2);
-        d = maxi(d,IEM_GUI_MINSIZE-x->x_gui.x_w);
+        int width = x->x_gui.x_w,
+            height = x->x_gui.x_h;
+        int x1, y1, x2, y2;
+        x1 = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+        y1 = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+        x2 = x1 + width;
+        y2 = y1 + height;
+
+        int d;
+        if (mouse_x <= x2)
+        {
+            if (mouse_y > y2)
+                d = mouse_y - y2;
+            else if (abs(mouse_y - y2) < abs(mouse_x - x2))
+                d = mouse_y - y2;
+            else
+                d = mouse_x - x2;
+        }
+        else
+        {
+            if (mouse_y <= y2)
+                d = mouse_x - x2;
+            else
+                d = maxi(mouse_y - y2, mouse_x - x2);
+        }
         sh->h_dragx = d;
         sh->h_dragy = d;
         scalehandle_drag_scale(sh);
 
+        width = maxi(width + d, IEM_GUI_MINSIZE);
+        height = width;
+
+        x->x_gui.x_w = width;
+        x->x_gui.x_h = height;
+
+        sh->h_offset_x = mouse_x;
+        sh->h_offset_y = mouse_y;
+
+        if (glist_isvisible(x->x_gui.x_glist))
+        {
+            bng_draw_move(x, x->x_gui.x_glist);
+            scalehandle_unclick_scale(sh);
+        }
+
         int properties = gfxstub_haveproperties((void *)x);
         if (properties)
         {
@@ -154,7 +218,7 @@ static void bng__motionhook(t_scalehandle *sh,
             properties_set_field_int(properties,"dim.w_ent",new_w);
         }
     }
-    scalehandle_dragon_label(sh,f1,f2);
+    scalehandle_dragon_label(sh,mouse_x,mouse_y);
 }
 
 void bng_draw(t_bng *x, t_glist *glist, int mode)
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index 2011d4d6f58cd21741983e8802a45d2a316219bf..6f68d64efbf22106f51a947baf8d34a6a4e7e088 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -3385,10 +3385,30 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
             int noutlet;
             int ninlet;
                 /* resize?  only for "true" text boxes or canvases*/
-            if (!sys_k12_mode && ob && !x->gl_editor->e_textedfor &&
+            if (ob && ob->te_iemgui && xpos >= x2-4 && ypos > y2-6)
+            {
+                if (doit)
+                {
+                    x->gl_editor->e_onmotion = MA_RESIZE;
+                    x->gl_editor->e_xwas = x1;
+                    x->gl_editor->e_ywas = y1;
+                    x->gl_editor->e_xnew = xpos;
+                    x->gl_editor->e_ynew = ypos;
+                    t_pd *sh = (t_pd *)((t_iemgui *)ob)->x_handle;
+                    pd_vmess(sh, gensym("_click"), "fff",
+                        (t_float)1, (t_float)xpos, (t_float)ypos);
+                }
+                else
+                {
+                    canvas_setcursor(x,
+                        CURSOR_EDITMODE_RESIZE_BOTTOM_RIGHT);
+                }
+                canvas_check_nlet_highlights(x);
+            }
+            else if (!sys_k12_mode && ob && !x->gl_editor->e_textedfor &&
                 (ob->te_pd->c_wb == &text_widgetbehavior ||
-                    ob->ob_pd == canvas_class) &&
-                        xpos >= x2-4 && ypos < y2-4 && ypos > y1+4)
+                 ob->ob_pd == canvas_class) &&
+                 xpos >= x2-4 && ypos < y2-4 && ypos > y1+4)
             {
                 if (doit)
                 {
@@ -5388,6 +5408,12 @@ void canvas_motion(t_canvas *x, t_floatarg xpos, t_floatarg ypos,
                 gobj_vis(y1, x, 1);
                 canvas_dirty(x, 1);
             }
+            else if (ob && ob->te_iemgui)
+            {
+                t_pd *sh = (t_pd *)((t_iemgui *)ob)->x_handle;
+                pd_vmess(sh, gensym("_motion"), "ff", (t_float)xpos, (t_float)ypos);
+                //pd_vmess(sh, gensym("_click"), "fff", 0, xpos, ypos);
+            }
             else post("not resizable");
         }
     }