diff --git a/pd/src/g_all_guis.h b/pd/src/g_all_guis.h
index fed1c127aeb9b6f0f6d1014c8767c32f2a78d7d9..10653984f4f2888a1831c2a9e9d795316e631b40 100644
--- a/pd/src/g_all_guis.h
+++ b/pd/src/g_all_guis.h
@@ -215,6 +215,7 @@ typedef struct _iemgui
 	int				   label_offset_y;
 	int				   label_vis;
 	int				   x_vis;				/* is the object drawn? */
+    int                x_changed;           /* has the value changed so that we need to do graphic update */
 } t_iemgui;
 
 typedef struct _iemguidummy
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index 9e8a6e3803dff59bc0da08e2822e851da872acda..c906457fa922854ef2d3fa1978d65d0db413ca90 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -35,13 +35,17 @@ static t_class *bng_class;
 
 /*  widget helper functions  */
 
-void bng_draw_update(t_bng *x, t_glist *glist)
+void bng_draw_update(t_gobj *xgobj, t_glist *glist)
 {
+	t_bng *x = (t_bng *)xgobj;
+	if (x->x_gui.x_changed != x->x_flashed) {
     if(glist_isvisible(glist))
-    {
-        sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", glist_getcanvas(glist), x,
-                 x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
-    }
+	    {
+	        sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", glist_getcanvas(glist), x,
+	                 x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
+	    }
+	    x->x_gui.x_changed = x->x_flashed;
+	}
 }
 
 void bng_draw_new(t_bng *x, t_glist *glist)
@@ -492,7 +496,8 @@ static void bng__motionhook(t_scalehandle *sh,
 void bng_draw(t_bng *x, t_glist *glist, int mode)
 {
     if(mode == IEM_GUI_DRAW_MODE_UPDATE)
-        bng_draw_update(x, glist);
+    	sys_queuegui((t_gobj*)x, x->x_gui.x_glist, bng_draw_update);
+        //bng_draw_update(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_MOVE)
         bng_draw_move(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_NEW) {
@@ -875,6 +880,7 @@ static void *bng_new(t_symbol *s, int argc, t_atom *argv)
 	x->x_gui.label_vis = 0;
 
 	x->x_gui.x_obj.te_iemgui = 1;
+	x->x_gui.x_changed = 0;
 
     return (x);
 }
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index 3e2613bd823acc70f21b97a6b443994413173ab4..df773a0b6b5e84d582aac8ab50131883392c2e76 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -17,6 +17,7 @@ Original Pure-Data source copyright (c) 1997-2001 Miller Puckette and others.
 #include "g_undo.h"
 #include "x_preset.h"
 #include <string.h>
+#include <math.h>
 #include "g_all_guis.h"
 
 void glist_readfrombinbuf(t_glist *x, t_binbuf *b, char *filename,
@@ -3351,11 +3352,24 @@ void canvas_sort_selection_according_to_location(t_canvas *x)
 }
 
 void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag, int issignal) {
+	int ymax = 0;
 	int halfx = (lx2 - lx1)/2;
 	int halfy = (ly2 - ly1)/2;
-	int yoff = abs((halfy+halfy)/2);
-	if (yoff < 2) yoff = 2;
-	if (yoff > 20) yoff = 20;
+	//int yoff = (abs(halfx)+abs(halfy))/2;
+	int yoff = abs(halfy);
+	//if (yoff < 2) yoff = 2;
+	if (halfy >= 0) {
+		//second object is below the first
+		if (abs(halfx) <=10) {
+			ymax = abs(halfy * pow((halfx/10.0),2));
+			if (ymax > 10) ymax = 10;
+		}
+		else ymax = 10;
+	} else {
+		//second object is above the first
+		ymax = 20;
+	}
+	if (yoff > ymax) yoff = ymax;
 	/*sys_vgui(".x%lx.c create polyline %d %d %d %d -stroke %s -strokewidth %s -tags {l%lx all_cords}\n",
         x, lx1, ly1, lx2, ly2,
         (issignal ? "$signal_cord" : "$msg_cord"),
@@ -3373,11 +3387,25 @@ void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_in
 }
 
 void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag) {
+	int ymax = 0;
 	int halfx = (lx2 - lx1)/2;
 	int halfy = (ly2 - ly1)/2;
-	int yoff = abs((halfy+halfy)/2);
-	if (yoff < 2) yoff = 2;
-	if (yoff > 20) yoff = 20;
+	//int yoff = (abs(halfx)+abs(halfy))/2;
+	int yoff = abs(halfy);
+	//if (yoff < 2) yoff = 2;
+	if (halfy >= 0) {
+		//second object is below the first
+		if (abs(halfx) <=10) {
+			ymax = abs(halfy * pow((halfx/10.0),2));
+			if (ymax > 10) ymax = 10;
+		}
+		else ymax = 10;
+	} else {
+		//second object is above the first
+		ymax = 20;
+	}
+	//fprintf(stderr,"pow%f halfx%d yoff%d ymax%d\n", pow((halfx/10.0),2), halfx, yoff, ymax);
+	if (yoff > ymax) yoff = ymax;
 	if (tag) {
 		//sys_vgui(".x%lx.c coords l%lx %d %d %d %d\n", x, tag, lx1, ly1, lx2, ly2);
 		//bezier curves FTW
diff --git a/pd/src/g_hdial.c b/pd/src/g_hdial.c
index d0232355a54c31edf20a212e040b27cd87c18334..5cd5f158a53bdb9383043a8fbdbb9fd3bc90bdc6 100644
--- a/pd/src/g_hdial.c
+++ b/pd/src/g_hdial.c
@@ -652,13 +652,15 @@ static void hradio_set(t_hradio *x, t_floatarg f)
         old = x->x_on_old;
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         x->x_on_old = old;
     }
     else
     {
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
     }
 }
 
@@ -724,7 +726,8 @@ static void hradio_fout(t_hradio *x, t_floatarg f)
     {
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (i != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
         if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing)
             pd_float(x->x_gui.x_snd->s_thing, x->x_on);
@@ -772,7 +775,8 @@ static void hradio_float(t_hradio *x, t_floatarg f)
     {
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (i != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         if (x->x_gui.x_fsf.x_put_in2out)
         {
             outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
diff --git a/pd/src/g_hslider.c b/pd/src/g_hslider.c
index 5f7ce63861a566cb89795a35d94374525a366ca6..9f1da8bcd21e57512e904a4cdaef78dfea5835d1 100644
--- a/pd/src/g_hslider.c
+++ b/pd/src/g_hslider.c
@@ -38,6 +38,7 @@ static t_class *hslider_class;
 static void hslider_draw_update(t_gobj *client, t_glist *glist)
 {
     t_hslider *x = (t_hslider *)client;
+    if (x->x_gui.x_changed == 0) return;
     t_canvas *canvas=glist_getcanvas(glist);
     int ypos=text_ypix(&x->x_gui.x_obj, glist);
 
@@ -64,6 +65,7 @@ static void hslider_draw_update(t_gobj *client, t_glist *glist)
             }
         }
     }
+    x->x_gui.x_changed = 0;
 }
 
 static void hslider_draw_new(t_hslider *x, t_glist *glist)
@@ -634,8 +636,11 @@ static void hslider_set(t_hslider *x, t_floatarg f)    /* bugfix */
     else
         g = (f - x->x_min) / x->x_k;
     x->x_val = (int)(100.0*g + 0.49999);
-    x->x_pos = x->x_val;
-    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    if (x->x_pos != x->x_val) {
+    	x->x_pos = x->x_val;
+    	x->x_gui.x_changed = 1;
+    	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    }
 }
 
 static void hslider_bang(t_hslider *x)
@@ -724,6 +729,7 @@ static void hslider_motion(t_hslider *x, t_floatarg dx, t_floatarg dy)
     }
     if(old != x->x_val)
     {
+    	x->x_gui.x_changed = 1;
         (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         hslider_bang(x);
     }
@@ -738,8 +744,11 @@ static void hslider_click(t_hslider *x, t_floatarg xpos, t_floatarg ypos,
         x->x_val = 100*x->x_gui.x_w - 100;
     if(x->x_val < 0)
         x->x_val = 0;
-    x->x_pos = x->x_val;
-    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    if (x->x_pos != x->x_val) {
+    	x->x_pos = x->x_val;
+    	x->x_gui.x_changed = 1;
+    	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    }
     hslider_bang(x);
     glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g, (t_glistmotionfn)hslider_motion,
                0, xpos, ypos);
@@ -970,6 +979,7 @@ static void *hslider_new(t_symbol *s, int argc, t_atom *argv)
 	x->x_gui.label_vis = 0;
 
 	x->x_gui.x_obj.te_iemgui = 1;
+	x->x_gui.x_changed = 0;
 
     return (x);
 }
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index 8972b6452ddb8431844538d2676728260ba5a2cf..2d5d5ed97897019c764ec354586840d119342a9f 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -139,6 +139,9 @@ void my_numbox_ftoa(t_my_numbox *x)
 static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
 {
     t_my_numbox *x = (t_my_numbox *)client;
+    if (x->x_gui.x_changed == 0) {
+    	return;
+    }
     if (glist_isvisible(glist))
     {
         if(x->x_gui.x_fsf.x_change)
@@ -183,6 +186,7 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
             x->x_buf[0] = 0;
         }
     }
+    x->x_gui.x_changed = 0;
 }
 
 static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
@@ -758,6 +762,7 @@ static void my_numbox_save(t_gobj *z, t_binbuf *b)
     {
         x->x_gui.x_fsf.x_change = 0;
         clock_unset(x->x_clock_reset);
+        x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
     }
     binbuf_addv(b, "ssiisiiffiisssiiiiiiifii", gensym("#X"),gensym("obj"),
@@ -822,6 +827,7 @@ static void my_numbox_properties(t_gobj *z, t_glist *owner)
     {
         x->x_gui.x_fsf.x_change = 0;
         clock_unset(x->x_clock_reset);
+        x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
 
     }
@@ -914,6 +920,7 @@ static void my_numbox_dialog(t_my_numbox *x, t_symbol *s, int argc,
 static void my_numbox_motion(t_my_numbox *x, t_floatarg dx, t_floatarg dy)
 {
     double k2=1.0;
+   	int old = x->x_val;
 
     if(x->x_gui.x_fsf.x_finemoved)
         k2 = 0.01;
@@ -922,9 +929,12 @@ static void my_numbox_motion(t_my_numbox *x, t_floatarg dx, t_floatarg dy)
     else
         x->x_val -= k2*dy;
     my_numbox_clip(x);
-    sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
-    my_numbox_bang(x);
-    clock_unset(x->x_clock_reset);
+    if (old != x->x_val) {
+    	x->x_gui.x_changed = 1;
+	    sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
+	    my_numbox_bang(x);
+	}
+	clock_unset(x->x_clock_reset);
 }
 
 static void my_numbox_click(t_my_numbox *x, t_floatarg xpos, t_floatarg ypos,
@@ -960,6 +970,7 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist,
             x->x_gui.x_fsf.x_change = 0;
             clock_unset(x->x_clock_reset);
             x->x_buf[0] = 0;
+            x->x_gui.x_changed = 1;
             sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         }
     }
@@ -968,9 +979,12 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist,
 
 static void my_numbox_set(t_my_numbox *x, t_floatarg f)
 {
-    x->x_val = f;
-    my_numbox_clip(x);
-    sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
+	if (x->x_val != f) {
+    	x->x_val = f;
+    	my_numbox_clip(x);
+    	x->x_gui.x_changed = 1;
+    	sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
+    }
 }
 
 static void my_numbox_log_height(t_my_numbox *x, t_floatarg lh)
@@ -1033,6 +1047,7 @@ static void my_numbox_range(t_my_numbox *x, t_symbol *s, int ac, t_atom *av)
     if(my_numbox_check_minmax(x, (double)atom_getfloatarg(0, ac, av),
                               (double)atom_getfloatarg(1, ac, av)))
     {
+    	x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         /*my_numbox_bang(x);*/
     }
@@ -1074,6 +1089,7 @@ static void my_numbox_log(t_my_numbox *x)
     x->x_lin0_log1 = 1;
     if(my_numbox_check_minmax(x, x->x_min, x->x_max))
     {
+    	x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         /*my_numbox_bang(x);*/
     }
@@ -1109,6 +1125,7 @@ static void my_numbox_key(void *z, t_floatarg fkey)
     {
         x->x_gui.x_fsf.x_change = 0;
         clock_unset(x->x_clock_reset);
+        x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         return;
     }
@@ -1119,6 +1136,7 @@ static void my_numbox_key(void *z, t_floatarg fkey)
         {
             buf[0] = c;
             strcat(x->x_buf, buf);
+            x->x_gui.x_changed = 1;
             sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         }
     }
@@ -1129,6 +1147,7 @@ static void my_numbox_key(void *z, t_floatarg fkey)
         if(sl < 0)
             sl = 0;
         x->x_buf[sl] = 0;
+        x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
     }
     else if((c=='\n')||(c==13))
@@ -1139,6 +1158,7 @@ static void my_numbox_key(void *z, t_floatarg fkey)
         clock_unset(x->x_clock_reset);
         my_numbox_clip(x);
         my_numbox_bang(x);
+        x->x_gui.x_changed = 1;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
     }
     clock_delay(x->x_clock_reset, 3000);
@@ -1280,6 +1300,7 @@ static void *my_numbox_new(t_symbol *s, int argc, t_atom *argv)
 	x->x_tmpfontsize = 0;
 
 	x->x_gui.x_obj.te_iemgui = 1;
+	x->x_gui.x_changed = 0;
 
     return (x);
 }
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index b063836926ce48633c0422b4112a3f089002a047..2f7771627c634ab398ac21fe00e5e8b635bb3382 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -36,17 +36,21 @@ static t_class *toggle_class;
 
 /* widget helper functions */
 
-void toggle_draw_update(t_toggle *x, t_glist *glist)
+void toggle_draw_update(t_gobj *xgobj, t_glist *glist)
 {
-    if(glist_isvisible(glist))
-    {
-        t_canvas *canvas=glist_getcanvas(glist);
-
-        sys_vgui(".x%lx.c itemconfigure %lxX1 -stroke #%6.6x\n", canvas, x,
-                 (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
-        sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x,
-                 (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
-    }
+	t_toggle *x = (t_toggle *)xgobj;
+	if (x->x_gui.x_changed) {
+	    if(glist_isvisible(glist))
+	    {
+	        t_canvas *canvas=glist_getcanvas(glist);
+
+	        sys_vgui(".x%lx.c itemconfigure %lxX1 -stroke #%6.6x\n", canvas, x,
+	                 (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
+	        sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x,
+	                 (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
+	    }
+	    x->x_gui.x_changed = 0;
+	}
 }
 
 void toggle_draw_new(t_toggle *x, t_glist *glist)
@@ -495,7 +499,8 @@ static void toggle__motionhook(t_scalehandle *sh,
 void toggle_draw(t_toggle *x, t_glist *glist, int mode)
 {
     if(mode == IEM_GUI_DRAW_MODE_UPDATE)
-        toggle_draw_update(x, glist);
+    	sys_queuegui((t_gobj*)x, x->x_gui.x_glist, toggle_draw_update);
+        //toggle_draw_update(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_MOVE)
         toggle_draw_move(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_NEW) {
@@ -572,6 +577,7 @@ static void toggle_properties(t_gobj *z, t_glist *owner)
 
 static void toggle_bang(t_toggle *x)
 {
+	x->x_gui.x_changed = 1;
     x->x_on = (x->x_on==0.0)?x->x_nonzero:0.0;
     (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
     outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
@@ -624,6 +630,7 @@ static int toggle_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
 
 static void toggle_set(t_toggle *x, t_floatarg f)
 {
+	if (x->x_on != f) x->x_gui.x_changed = 1;
     x->x_on = f;
     if(f != 0.0)
         x->x_nonzero = f;
@@ -798,6 +805,8 @@ static void *toggle_new(t_symbol *s, int argc, t_atom *argv)
 
 	x->x_gui.x_obj.te_iemgui = 1;
 
+	x->x_gui.x_changed = 1;
+
     return (x);
 }
 
diff --git a/pd/src/g_vdial.c b/pd/src/g_vdial.c
index 08d347057c5b351332984a30c41564c00e42180c..cbf3997ed10ff689ddd13dd2d755dfa9ad97197d 100644
--- a/pd/src/g_vdial.c
+++ b/pd/src/g_vdial.c
@@ -642,13 +642,15 @@ static void vradio_set(t_vradio *x, t_floatarg f)
         old = x->x_on_old;
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         x->x_on_old = old;
     }
     else
     {
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
     }
 }
 
@@ -715,7 +717,8 @@ static void vradio_fout(t_vradio *x, t_floatarg f)
     {
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
         if (x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing)
             pd_float(x->x_gui.x_snd->s_thing, x->x_on);
@@ -763,7 +766,8 @@ static void vradio_float(t_vradio *x, t_floatarg f)
     {
         x->x_on_old = x->x_on;
         x->x_on = i;
-        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+        if (x->x_on != x->x_on_old)
+        	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         if (x->x_gui.x_fsf.x_put_in2out)
         {
             outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
diff --git a/pd/src/g_vslider.c b/pd/src/g_vslider.c
index 92991fd392f6a948a827a6907c5fbe5bfc9fa786..1947d68b0c2b92ab43dfa1b5f7be720e212be3a0 100644
--- a/pd/src/g_vslider.c
+++ b/pd/src/g_vslider.c
@@ -38,6 +38,7 @@ static t_class *vslider_class;
 static void vslider_draw_update(t_gobj *client, t_glist *glist)
 {
     t_vslider *x = (t_vslider *)client;
+    if (x->x_gui.x_changed == 0) return;
     t_canvas *canvas=glist_getcanvas(glist);
     if (glist_isvisible(glist))
     {
@@ -64,6 +65,7 @@ static void vslider_draw_update(t_gobj *client, t_glist *glist)
             }
         }
     }
+    x->x_gui.x_changed = 0;
 }
 
 static void vslider_draw_new(t_vslider *x, t_glist *glist)
@@ -706,8 +708,8 @@ static void vslider_motion(t_vslider *x, t_floatarg dx, t_floatarg dy)
         x->x_pos -= 50;
         x->x_pos -= x->x_pos%100;
     }
-    if(old != x->x_val)
-    {
+    if(old != x->x_val) {
+    	x->x_gui.x_changed = 1;
         (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         vslider_bang(x);
     }
@@ -722,8 +724,11 @@ static void vslider_click(t_vslider *x, t_floatarg xpos, t_floatarg ypos,
         x->x_val = 100*x->x_gui.x_h - 100;
     if(x->x_val < 0)
         x->x_val = 0;
-    x->x_pos = x->x_val;
-    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    if (x->x_pos != x->x_val) {
+    	x->x_pos = x->x_val;
+    	x->x_gui.x_changed = 1;
+    	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    }
     vslider_bang(x);
     glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g,
         (t_glistmotionfn)vslider_motion, 0, xpos, ypos);
@@ -769,8 +774,11 @@ static void vslider_set(t_vslider *x, t_floatarg f)
     else
         g = (f - x->x_min) / x->x_k;
     x->x_val = (int)(100.0*g + 0.49999);
-    x->x_pos = x->x_val;
-    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    if(x->x_pos != x->x_val) {
+    	x->x_pos = x->x_val;
+    	x->x_gui.x_changed = 1;
+    	(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+    }
 }
 
 static void vslider_float(t_vslider *x, t_floatarg f)
@@ -959,6 +967,7 @@ static void *vslider_new(t_symbol *s, int argc, t_atom *argv)
 	x->x_gui.label_vis = 0;
 
 	x->x_gui.x_obj.te_iemgui = 1;
+	x->x_gui.x_changed = 0;
 
     return (x);
 }
diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c
index c3c5ab9c93df7e8b9bec488671f7da3df607b1a2..97d0c6b17ab2a40db3b4faa9acb4e4cd03f27ba7 100644
--- a/pd/src/g_vumeter.c
+++ b/pd/src/g_vumeter.c
@@ -686,6 +686,8 @@ static void vu__motionhook(t_scalehandle *sh,
 void vu_draw(t_vu *x, t_glist *glist, int mode)
 {
 	//fprintf(stderr,"vu_draw %d\n", mode);
+    if(mode == IEM_GUI_DRAW_MODE_UPDATE)
+    	sys_queuegui((t_gobj*)x, x->x_gui.x_glist, vu_draw_update);
     if(mode == IEM_GUI_DRAW_MODE_MOVE)
         vu_draw_move(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_NEW) {
diff --git a/pd/src/m_pd.c b/pd/src/m_pd.c
index 14b3870add9656441546713059f2ea9fd2f13d60..34786ef026a2c0bd02a2e0d4059b25e7ea5999cb 100644
--- a/pd/src/m_pd.c
+++ b/pd/src/m_pd.c
@@ -78,6 +78,7 @@ typedef struct _bindlist
 } t_bindlist;
 
 static int change_bindlist_via_graph = 0;
+static t_bindlist *change_bindlist = NULL;
 
 static void bindlist_cleanup(t_bindlist *x)
 {
@@ -109,69 +110,87 @@ static void bindlist_cleanup(t_bindlist *x)
 static void bindlist_bang(t_bindlist *x)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_bang(e->e_who);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 static void bindlist_float(t_bindlist *x, t_float f)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_float(e->e_who, f);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 static void bindlist_symbol(t_bindlist *x, t_symbol *s)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_symbol(e->e_who, s);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 static void bindlist_pointer(t_bindlist *x, t_gpointer *gp)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_pointer(e->e_who, gp);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 static void bindlist_list(t_bindlist *x, t_symbol *s,
     int argc, t_atom *argv)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_list(e->e_who, s, argc, argv);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 static void bindlist_anything(t_bindlist *x, t_symbol *s,
     int argc, t_atom *argv)
 {
     t_bindelem *e;
+        int save = change_bindlist_via_graph;
+	t_bindlist *save_bindlist = change_bindlist;
 	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_typedmess(e->e_who, s, argc, argv);
 	if (change_bindlist_via_graph > 1)
 		bindlist_cleanup(x);
-	change_bindlist_via_graph = 0;
+	change_bindlist_via_graph = save;
+	change_bindlist = save_bindlist;
 }
 
 void m_pd_setup(void)
@@ -247,9 +266,10 @@ void pd_unbind(t_pd *x, t_symbol *s)
 
         t_bindlist *b = (t_bindlist *)s->s_thing;
         t_bindelem *e, *e2;
+	int delayed = change_bindlist_via_graph && change_bindlist==b;
         if ((e = b->b_list)->e_who == x)
         {
-			if (change_bindlist_via_graph) {
+			if (delayed) {
 				change_bindlist_via_graph++;
 				e->e_delayed_free = 1;
 			} else {
@@ -263,7 +283,7 @@ void pd_unbind(t_pd *x, t_symbol *s)
         {
 			if (change_bindlist_via_graph) {
 				change_bindlist_via_graph++;
-				e2->e_delayed_free = 0;
+				e2->e_delayed_free = 1;
 			} else {
 		        e->e_next = e2->e_next;
 		        freebytes(e2, sizeof(t_bindelem));
@@ -273,15 +293,18 @@ void pd_unbind(t_pd *x, t_symbol *s)
         }
 
 		int count_valid = 0;
+		t_bindelem *e1 = NULL;
         for (e = b->b_list; e; e = e->e_next)
         {
-			if (e->e_who != NULL)
+			if (e->e_who != NULL && !e->e_delayed_free) {
 				count_valid++;
+				e1 = e;
+			}
 
 		}
 		if (count_valid == 1) {
-            s->s_thing = b->b_list->e_who;
-			if (!change_bindlist_via_graph) {
+            s->s_thing = e1->e_who;
+			if (!delayed) {
             	freebytes(b->b_list, sizeof(t_bindelem));
             	pd_free(&b->b_pd);
 			}