diff --git a/externals/moonlib/mknob.c b/externals/moonlib/mknob.c
index 18a6eab3ca77ddfdae0b7f8be0651c60a7e19742..48344504308f5b7e1cb5404cdd55703b5f3a7a34 100644
--- a/externals/moonlib/mknob.c
+++ b/externals/moonlib/mknob.c
@@ -55,28 +55,41 @@ static void mknob_update_knob(t_mknob *x, t_glist *glist)
 //	float val=(x->x_val + 50.0)/100.0/MKNOB_TANGLE;
     float val=(x->x_val + 50.0)/100.0/x->x_H;
     float 	angle,
-            radius=x->x_gui.x_w/2.0,
-            miniradius=MKNOB_THICK;
-    int x0,y0,x1,y1,xc,yc,xp,yp,xpc,ypc;
+            radius=x->x_gui.x_w/2.0*.98,
+            miniradius=MKNOB_THICK,
+			xp, yp, xc, yc, xpc, ypc;
+    int x0,y0,x1,y1;
     x0=text_xpix(&x->x_gui.x_obj, glist);
     y0=text_ypix(&x->x_gui.x_obj, glist);
     x1=x0+x->x_gui.x_w;
     y1=y0+x->x_gui.x_w;
-    xc=(x0+x1)/2;
-    yc=(y0+y1)/2;
+    xc=(x0+x1)/2.0;
+    yc=(y0+y1)/2.0;
 
     if(x->x_gui.x_h<0)
-        angle=val*(M_PI*2)+M_PI/2.0;
+        angle=val*(M_PI*2.0)+M_PI/2.0;
     else
         angle=val*(M_PI*1.5)+3.0*M_PI/4.0;
 
     xp=xc+radius*cos(angle);
     yp=yc+radius*sin(angle);
-    xpc=miniradius*cos(angle-M_PI/2);
-    ypc=miniradius*sin(angle-M_PI/2);
+    xpc=miniradius*cos(angle-M_PI/2.0);
+    ypc=miniradius*sin(angle-M_PI/2.0);
+    //xpc=xc+7*cos(angle);
+    //ypc=yc+7*sin(angle);
 
-    sys_vgui(".x%lx.c coords %xKNOB %d %d %d %d %d %d\n",
-             canvas,x,xp,yp,xc+xpc,yc+ypc,xc-xpc,yc-ypc);
+    //fprintf(stderr,"xp%f yp%f xpc%f ypc%f angle%f xc%f yc%f\n", xp, yp, xpc, ypc, angle, xc, yc);
+
+    //sys_vgui(".x%lx.c coords %xKNOB %f %f %f %f %f %f\n",
+    //         canvas,x,xp,yp,xc+xpc,yc+ypc,xc-xpc,yc-ypc);
+    sys_vgui(".x%lx.c coords %xKNOB %f %f %f %f\n",
+             canvas,x,xp,yp,xc,yc);
+	/*t_float val=(x->x_val + 50.0)/100.0/x->x_H;
+	t_float angle = val * M_PI * 1.5 - M_PI * 0.75;
+    t_float xc=text_xpix(&x->x_gui.x_obj, glist)+x->x_gui.x_w/2.0;
+    t_float yc=text_ypix(&x->x_gui.x_obj, glist)+x->x_gui.x_w/2.0;
+	sys_vgui("set matrix [::tkp::transform rotate %f %f %f]\n", angle, xc, yc);
+    sys_vgui(".x%lx.c itemconfigure %xKNOB -matrix $matrix\n", canvas, x);*/
 }
 
 static void mknob_draw_update(t_mknob *x, t_glist *glist)
@@ -109,16 +122,35 @@ static void mknob_draw_new(t_mknob *x, t_glist *glist)
     int xpos=text_xpix(&x->x_gui.x_obj, glist);
     int ypos=text_ypix(&x->x_gui.x_obj, glist);
     int r = xpos + (x->x_val + 50)/100;
-    int xc=xpos+x->x_gui.x_w/2;
-    int yc=ypos+x->x_gui.x_w/2;
+    t_float xc=xpos+x->x_gui.x_w/2.0;
+    t_float yc=ypos+x->x_gui.x_w/2.0;
+    t_float rc=x->x_gui.x_w/2.0;
     t_canvas *canvas=glist_getcanvas(glist);
 
-    sys_vgui(".x%lx.c create oval %d %d %d %d -fill #%6.6x -tags {%xBASE %xMKNOB}\n",
-             canvas,xpos,ypos,xpos + x->x_gui.x_w, ypos + x->x_gui.x_w,
+    t_gobj *y = (t_gobj *)x;
+    t_object *ob = pd_checkobject(&y->g_pd);
+
+    /* GOP objects are unable to call findrtext triggering consistency check error */
+    t_rtext *yyyy = NULL;
+    if (!glist->gl_isgraph || glist_istoplevel(glist))
+        yyyy = glist_findrtext(canvas, (t_text *)&ob->ob_g);
+
+    /* on GOP we cause segfault as apparently text_gettag() returns bogus data */
+    char *nlet_tag;
+    if (yyyy) nlet_tag = rtext_gettag(yyyy);
+    else nlet_tag = "bogus";
+
+    sys_vgui(".x%lx.c create circle %f %f -r %f -fill #%6.6x -tags {%xBASE %xMKNOB}\n",
+             canvas,xc,yc,rc,
              x->x_gui.x_bcol, x, x);
-    sys_vgui(".x%lx.c create polygon %d %d %d %d %d %d -fill #%6.6x -tags {%xKNOB %xMKNOB}\n",
+    /*sys_vgui(".x%lx.c create circle %f %f -r %f -stroke \"\" -fill #%6.6x -tags {%xCENTER %xMKNOB}\n",
+         canvas,xc,yc,3.5,
+         x->x_gui.x_fcol, x, x);*/
+    /*sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d -fill #%6.6x -tags {%xKNOB %xMKNOB}\n",
              glist_getcanvas(glist),
-             xc,ypos,xc-4,yc,xc+4,yc,x->x_gui.x_fcol,x,x);
+             (int)xc,ypos,(int)xc-4,(int)yc,(int)xc+4,(int)yc,x->x_gui.x_fcol,x,x);*/
+    sys_vgui(".x%lx.c create ppolygon %f %d %f %f -strokewidth 2 -stroke #%6.6x -tags {%xKNOB %xMKNOB}\n",
+             canvas,xc,ypos,xc,yc,x->x_gui.x_fcol,x,x);
     mknob_update_knob(x,glist);
     sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w \
 	     -font {{%s} %d bold} -fill #%6.6x -tags {%xLABEL %xMKNOB}\n",
@@ -126,14 +158,14 @@ static void mknob_draw_new(t_mknob *x, t_glist *glist)
              ypos+x->x_gui.x_ldy,
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
              x->x_gui.x_font, x->x_gui.x_fontsize, x->x_gui.x_lcol, x, x);
-    /*if(!x->x_gui.x_fsf.x_snd_able)
-        sys_vgui(".x%lx.c create rectangle %d %d %d %d -tags %xOUT%d\n",
-         canvas, xpos+ x->x_gui.x_w/2-3, ypos + x->x_gui.x_w-1,
-         xpos+ x->x_gui.x_w/2+4, ypos + x->x_gui.x_w, x, 0);
-    if(!x->x_gui.x_fsf.x_rcv_able)
-    sys_vgui(".x%lx.c create rectangle %d %d %d %d -tags %xIN%d\n",
-         canvas, xpos+ x->x_gui.x_w/2-3, ypos,
-         xpos+ x->x_gui.x_w/2+4, ypos+1, x, 0);*/
+    if (canvas == glist) {
+        if(!x->x_gui.x_fsf.x_snd_able)
+            sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%xOUT%d %xMKNOB %so0 outlet}\n",
+             canvas, xpos, ypos + x->x_gui.x_w-1, xpos + IOWIDTH, ypos + x->x_gui.x_w, x, 0, x, nlet_tag);
+        if(!x->x_gui.x_fsf.x_rcv_able)
+        sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%xIN%d %xMKNOB %si0 inlet}\n",
+             canvas, xpos, ypos-1, xpos + IOWIDTH, ypos, x, 0, x, nlet_tag);
+    }
 }
 
 static void mknob_draw_move(t_mknob *x, t_glist *glist)
@@ -141,25 +173,31 @@ static void mknob_draw_move(t_mknob *x, t_glist *glist)
     int xpos=text_xpix(&x->x_gui.x_obj, glist);
     int ypos=text_ypix(&x->x_gui.x_obj, glist);
     int r = xpos + (x->x_val + 50)/100;
+    t_float xc=xpos+x->x_gui.x_w/2.0;
+    t_float yc=ypos+x->x_gui.x_w/2.0;
+    t_float rc=x->x_gui.x_w/2.0;
     t_canvas *canvas=glist_getcanvas(glist);
 
-    sys_vgui(".x%lx.c coords %xBASE %d %d %d %d\n",
+    sys_vgui(".x%lx.c coords %xBASE %f %f\n",
              canvas, x,
-             xpos, ypos,
-             xpos + x->x_gui.x_w, ypos + x->x_gui.x_w);
+             xc, yc);
+    sys_vgui(".x%lx.c itemconfigure %xBASE -r %f\n", canvas, x, rc);
+    sys_vgui(".x%lx.c coords %xCENTER %f %f\n",
+             canvas, x,
+             xc, yc);
     mknob_update_knob(x,glist);
     sys_vgui(".x%lx.c coords %xLABEL %d %d\n",
              canvas, x, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy);
-    /*if(!x->x_gui.x_fsf.x_snd_able)
-        sys_vgui(".x%lx.c coords %xOUT%d %d %d %d %d\n",
-         canvas, x, 0,
-         xpos+ x->x_gui.x_w/2-3, ypos + x->x_gui.x_w-1,
-         xpos+ x->x_gui.x_w/2+4, ypos + x->x_gui.x_w);
-    if(!x->x_gui.x_fsf.x_rcv_able)
-    sys_vgui(".x%lx.c coords %xIN%d %d %d %d %d\n",
-         canvas, x, 0,
-         xpos+ x->x_gui.x_w/2-3, ypos,
-         xpos+ x->x_gui.x_w/2+4, ypos+1);*/
+    if (canvas == glist) {
+        if(!x->x_gui.x_fsf.x_snd_able)
+            sys_vgui(".x%lx.c coords %xOUT%d %d %d %d %d\n",
+             canvas, x, 0,
+             xpos, ypos + x->x_gui.x_w-1, xpos + IOWIDTH, ypos + x->x_gui.x_w);
+        if(!x->x_gui.x_fsf.x_rcv_able)
+        sys_vgui(".x%lx.c coords %xIN%d %d %d %d %d\n",
+             canvas, x, 0,
+             xpos, ypos-1, xpos + IOWIDTH, ypos);
+    }
 }
 
 static void mknob_draw_erase(t_mknob *x,t_glist *glist)
@@ -167,12 +205,15 @@ static void mknob_draw_erase(t_mknob *x,t_glist *glist)
     t_canvas *canvas=glist_getcanvas(glist);
 
     sys_vgui(".x%lx.c delete %xBASE\n", canvas, x);
+    sys_vgui(".x%lx.c delete %xCENTER\n", canvas, x);
     sys_vgui(".x%lx.c delete %xKNOB\n", canvas, x);
     sys_vgui(".x%lx.c delete %xLABEL\n", canvas, x);
-    /*if(!x->x_gui.x_fsf.x_snd_able)
-        sys_vgui(".x%lx.c delete %xOUT%d\n", canvas, x, 0);
-    if(!x->x_gui.x_fsf.x_rcv_able)
-        sys_vgui(".x%lx.c delete %xIN%d\n", canvas, x, 0);*/
+    if (canvas == glist) {
+        if(!x->x_gui.x_fsf.x_snd_able)
+            sys_vgui(".x%lx.c delete %xOUT%d\n", canvas, x, 0);
+        if(!x->x_gui.x_fsf.x_rcv_able)
+            sys_vgui(".x%lx.c delete %xIN%d\n", canvas, x, 0);
+    }
 }
 
 static void mknob_draw_config(t_mknob *x,t_glist *glist)
@@ -184,6 +225,7 @@ static void mknob_draw_config(t_mknob *x,t_glist *glist)
              x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol,
              strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
     sys_vgui(".x%lx.c itemconfigure %xKNOB -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
+    sys_vgui(".x%lx.c itemconfigure %xCENTER -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
     sys_vgui(".x%lx.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol);
 }
 
@@ -193,18 +235,31 @@ static void mknob_draw_io(t_mknob *x,t_glist *glist, int old_snd_rcv_flags)
     int ypos=text_ypix(&x->x_gui.x_obj, glist);
     t_canvas *canvas=glist_getcanvas(glist);
 
-    /*if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
-        sys_vgui(".x%lx.c create rectangle %d %d %d %d -tags %xOUT%d\n",
-         canvas, xpos+ x->x_gui.x_w/2-3, ypos + x->x_gui.x_w-1,
-         xpos+ x->x_gui.x_w/2+4, ypos + x->x_gui.x_w, x, 0);
-    if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
-        sys_vgui(".x%lx.c delete %xOUT%d\n", canvas, x, 0);
-    if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
-        sys_vgui(".x%lx.c create rectangle %d %d %d %d -tags %xIN%d\n",
-         canvas, xpos+ x->x_gui.x_w/2-3, ypos,
-         xpos+ x->x_gui.x_w/2+4, ypos+1, x, 0);
-    if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able)
-    sys_vgui(".x%lx.c delete %xIN%d\n", canvas, x, 0);*/
+    t_gobj *y = (t_gobj *)x;
+    t_object *ob = pd_checkobject(&y->g_pd);
+
+    /* GOP objects are unable to call findrtext triggering consistency check error */
+    t_rtext *yyyy = NULL;
+    if (!glist->gl_isgraph || glist_istoplevel(glist))
+        yyyy = glist_findrtext(canvas, (t_text *)&ob->ob_g);
+
+    /* on GOP we cause segfault as apparently text_gettag() returns bogus data */
+    char *nlet_tag;
+    if (yyyy) nlet_tag = rtext_gettag(yyyy);
+    else nlet_tag = "bogus";
+
+    if (canvas == glist) {
+        if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able)
+            sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%xOUT%d %xMKNOB %so0 outlet}\n",
+             canvas, xpos, ypos + x->x_gui.x_w-1, xpos + IOWIDTH, ypos + x->x_gui.x_w, x, 0, x, nlet_tag);
+        if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able)
+            sys_vgui(".x%lx.c delete %xOUT%d\n", canvas, x, 0);
+        if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able)
+            sys_vgui(".x%lx.c create prect %d %d %d %d -tags {%xIN%d %xMKNOB %si0 inlet}\n",
+             canvas, xpos, ypos-1, xpos + IOWIDTH, ypos, x, 0, x, nlet_tag);
+        if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able)
+        sys_vgui(".x%lx.c delete %xIN%d\n", canvas, x, 0);
+    }
 }
 
 static void mknob_draw_select(t_mknob *x,t_glist *glist)
@@ -214,14 +269,14 @@ static void mknob_draw_select(t_mknob *x,t_glist *glist)
     if(x->x_gui.x_fsf.x_selected)
     {
         //pd_bind(&x->x_gui.x_obj.ob_pd, iemgui_key_sym);
-        sys_vgui(".x%lx.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED);
+        sys_vgui(".x%lx.c itemconfigure %xBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED);
         sys_vgui(".x%lx.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED);
 		sys_vgui(".x%lx.c addtag selected withtag %lxMKNOB\n", canvas, x);
     }
     else
     {
         //pd_unbind(&x->x_gui.x_obj.ob_pd, iemgui_key_sym);
-        sys_vgui(".x%lx.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
+        sys_vgui(".x%lx.c itemconfigure %xBASE -stroke #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
         sys_vgui(".x%lx.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol);
 		sys_vgui(".x%lx.c dtag %lxMKNOB selected\n", canvas, x);
     }
@@ -357,7 +412,7 @@ static void mknob_properties(t_gobj *z, t_glist *owner)
 
     iemgui_properties(&x->x_gui, srl);
     sprintf(buf, "pdtk_iemgui_dialog %%s mknob \
-	    --------dimension(pix):-------- %d %d width: %d %d mouse: \
+	    --------dimension(pix):-------- %d %d width: %d %d number_of_drag_steps: \
 	    -----------output-range:----------- %g left: %g right: %g \
 	    %d lin log %d %d empty %d \
 	    %s %s \
@@ -418,6 +473,7 @@ static void mknob_bang(t_mknob *x)
 
 static void mknob_dialog(t_mknob *x, t_symbol *s, int argc, t_atom *argv)
 {
+    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
     t_symbol *srl[3];
     int w = (int)atom_getintarg(0, argc, argv);
     int h = (int)atom_getintarg(1, argc, argv);
@@ -820,6 +876,7 @@ static void *mknob_new(t_symbol *s, int argc, t_atom *argv)
     x->x_thick = 0;
     iemgui_verify_snd_ne_rcv(&x->x_gui);
     outlet_new(&x->x_gui.x_obj, &s_float);
+	x->x_gui.x_obj.te_iemgui = 1;
     return (x);
 }