diff --git a/externals/iem/iemgui/src/room_sim_2d.c b/externals/iem/iemgui/src/room_sim_2d.c
index fff669083b63bee23b8f27b0f79d1b2ccaa05730..7f57c69296527284c511a119488afb5a8d2798ec 100644
--- a/externals/iem/iemgui/src/room_sim_2d.c
+++ b/externals/iem/iemgui/src/room_sim_2d.c
@@ -7,7 +7,7 @@ iemgui written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 *
 #include "iemlib.h"
 #include "iemgui.h"
 #include "g_canvas.h"
-#include "../../../old_g_all_guis.inc"
+#include "g_all_guis.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -60,72 +60,163 @@ static void room_sim_2d_out_rho(t_room_sim_2d *x)
 static void room_sim_2d_out_para(t_room_sim_2d *x)
 {
   int i, n = x->x_nr_src;
-  int w2=x->x_gui.x_w/2, h2=x->x_gui.x_h/2;
-  
+  int w2 = x->x_gui.x_w / 2,
+      h2 = x->x_gui.x_h/2;
+
   SETFLOAT(x->x_at, 0.0f);
   SETSYMBOL(x->x_at+1, x->x_s_head_xy);
   SETFLOAT(x->x_at+2, (t_float)(h2 - x->x_pix_src_y[0])/x->x_cnvrt_roomlx2pixh);
   SETFLOAT(x->x_at+3, (t_float)(w2 - x->x_pix_src_x[0])/x->x_cnvrt_roomlx2pixh);
   outlet_list(x->x_out_para, &s_list, 4, x->x_at);
-  for(i=1; i<=n; i++)
+  for (i = 1; i <= n; i++)
   {
     SETFLOAT(x->x_at, (t_float)i);
     SETSYMBOL(x->x_at+1, x->x_s_src_xy);
-    SETFLOAT(x->x_at+2, (t_float)(h2 - x->x_pix_src_y[i])/x->x_cnvrt_roomlx2pixh);
-    SETFLOAT(x->x_at+3, (t_float)(w2 - x->x_pix_src_x[i])/x->x_cnvrt_roomlx2pixh);
+    SETFLOAT(x->x_at+2,
+      (t_float)(h2 - x->x_pix_src_y[i]) / x->x_cnvrt_roomlx2pixh);
+    SETFLOAT(x->x_at+3,
+      (t_float)(w2 - x->x_pix_src_x[i]) / x->x_cnvrt_roomlx2pixh);
     outlet_list(x->x_out_para, &s_list, 4, x->x_at);
   }
 }
 
 static void room_sim_2d_draw_update(t_room_sim_2d *x, t_glist *glist)
 {
-  if(glist_isvisible(glist))
+  if (glist_isvisible(glist))
   {
-    int xpos=text_xpix(&x->x_gui.x_obj, glist);
-    int ypos=text_ypix(&x->x_gui.x_obj, glist);
+    int xpos = text_xpix(&x->x_gui.x_obj, glist);
+    int ypos = text_ypix(&x->x_gui.x_obj, glist);
     int dx, dy;
     t_canvas *canvas=glist_getcanvas(glist);
     
-    dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-    dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-      xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
+    dx = -(int)((t_float)x->x_pix_rad * (t_float)sin(x->x_rho_head *
+      0.0174533f) + 0.49999f);
+    dy = -(int)((t_float)x->x_pix_rad * (t_float)cos(x->x_rho_head *
+      0.0174533f) + 0.49999f);
+//    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//      xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
+
+    gui_vmess("gui_room_sim_update", "xxiiiii",
+      canvas,
+      x,
+      x->x_pix_src_x[0],
+      x->x_pix_src_y[0],
+      dx,
+      dy,
+      x->x_pix_rad
+    );
   }
 }
 
-void room_sim_2d_draw_new(t_room_sim_2d *x, t_glist *glist)
+void room_sim_2d_draw_unmap(t_room_sim_2d *x, t_glist *glist)
 {
-  int xpos=text_xpix(&x->x_gui.x_obj, glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, glist);
+    gui_vmess("gui_room_sim_erase", "xx",
+        x->x_gui.x_glist, x);
+}
+
+void room_sim_2d_draw_map(t_room_sim_2d *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 dx, dy;
-  int i, n=x->x_nr_src;
-  int fs=x->x_fontsize;
+  int i, n = x->x_nr_src;
+  int fs = x->x_fontsize;
   t_canvas *canvas=glist_getcanvas(glist);
-  
-  sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -outline #%6.6x -tags %xBASE\n",
-    canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
-    x->x_gui.x_bcol, x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:IEM_GUI_COLOR_NORMAL, x);
-  for(i=1; i<=n; i++)
+  char fcol[MAXPDSTRING];
+  char bcol[MAXPDSTRING];
+  char elemcol[MAXPDSTRING];
+  sprintf(fcol, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
+
+  gui_start_vmess("gui_room_sim_map", "xxiiifiiiss",
+    canvas,
+    x,
+    x->x_gui.x_w,
+    x->x_gui.x_h,
+    x->x_pix_rad,
+    x->x_rho_head,
+    x->x_pix_src_x[0],
+    x->x_pix_src_y[0],
+    x->x_fontsize,
+    fcol,
+    bcol
+  );
+  gui_start_array();
+  for(i = 1; i <= n; i++)
   {
-  sys_vgui(".x%x.c create text %d %d -text {%d} -anchor c \
-    -font {times %d bold} -fill #%6.6x -tags %xSRC%d\n",
-    canvas, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i], i, fs,
-    x->x_col_src[i], x, i);
+//  sys_vgui(".x%x.c create text %d %d -text {%d} -anchor c \
+//    -font {times %d bold} -fill #%6.6x -tags %xSRC%d\n",
+//    canvas, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i], i, fs,
+//    x->x_col_src[i], x, i);
+    gui_start_array();
+    gui_i(x->x_pix_src_x[i]);
+    gui_i(x->x_pix_src_y[i]);
+    sprintf(elemcol, "#%6.6x", x->x_col_src[i]);
+    gui_s(elemcol);
+    gui_end_array();
   }
+  gui_end_array();
+  gui_end_vmess();
   
-  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD\n",
-    canvas, xpos+x->x_pix_src_x[0]-x->x_pix_rad, ypos+x->x_pix_src_y[0]-x->x_pix_rad,
-    xpos+x->x_pix_src_x[0]+x->x_pix_rad-1, ypos+x->x_pix_src_y[0]+x->x_pix_rad-1,
-    x->x_gui.x_fcol, x);
+//  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD\n",
+//    canvas, xpos+x->x_pix_src_x[0]-x->x_pix_rad, ypos+x->x_pix_src_y[0]-x->x_pix_rad,
+//    xpos+x->x_pix_src_x[0]+x->x_pix_rad-1, ypos+x->x_pix_src_y[0]+x->x_pix_rad-1,
+//    x->x_gui.x_fcol, x);
   dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
   dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-  sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -tags %xNOSE\n",
-    canvas, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-    xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy,
-    x->x_gui.x_fcol, x);
+//  sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -tags %xNOSE\n",
+//    canvas, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//    xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy,
+//    x->x_gui.x_fcol, x);
+}
+
+void room_sim_2d_draw_new(t_room_sim_2d *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 dx, dy;
+  int i, n = x->x_nr_src;
+  int fs = x->x_fontsize;
+  t_canvas *canvas=glist_getcanvas(glist);
+
+  gui_vmess("gui_room_sim_new", "xxiiiii",
+    canvas,
+    x,
+    xpos,
+    ypos,
+    x->x_gui.x_w,
+    x->x_gui.x_h,
+    glist_istoplevel(glist)
+  );
+
+  room_sim_2d_draw_map(x, glist);
+/*  sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -outline #%6.6x -tags %xBASE\n",
+    canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
+    x->x_gui.x_bcol, x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:IEM_GUI_COLOR_NORMAL, x);
+*/
+
+//  for(i=1; i<=n; i++)
+//  {
+//  sys_vgui(".x%x.c create text %d %d -text {%d} -anchor c \
+//    -font {times %d bold} -fill #%6.6x -tags %xSRC%d\n",
+//    canvas, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i], i, fs,
+//    x->x_col_src[i], x, i);
+//  }
+  
+//  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD\n",
+//    canvas, xpos+x->x_pix_src_x[0]-x->x_pix_rad, ypos+x->x_pix_src_y[0]-x->x_pix_rad,
+//    xpos+x->x_pix_src_x[0]+x->x_pix_rad-1, ypos+x->x_pix_src_y[0]+x->x_pix_rad-1,
+//    x->x_gui.x_fcol, x);
+//  dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//  dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//  sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -tags %xNOSE\n",
+//    canvas, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//    xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy,
+//    x->x_gui.x_fcol, x);
 }
 
+/*
 void room_sim_2d_draw_move(t_room_sim_2d *x, t_glist *glist)
 {
   int xpos=text_xpix(&x->x_gui.x_obj, glist);
@@ -152,51 +243,22 @@ void room_sim_2d_draw_move(t_room_sim_2d *x, t_glist *glist)
     canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
     xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
 }
-
-void room_sim_2d_draw_erase(t_room_sim_2d* x, t_glist* glist)
-{
-  int i, n;
-  t_canvas *canvas=glist_getcanvas(glist);
-  
-  sys_vgui(".x%x.c delete %xBASE\n", canvas, x);
-  n = x->x_nr_src;
-  for(i=1; i<=n; i++)
-  {
-    sys_vgui(".x%x.c delete %xSRC%d\n", canvas, x, i);
-  }
-  sys_vgui(".x%x.c delete %xHEAD\n", canvas, x);
-  sys_vgui(".x%x.c delete %xNOSE\n", canvas, x);
-}
-
-void room_sim_2d_draw_select(t_room_sim_2d* x, t_glist* glist)
-{
-  t_canvas *canvas=glist_getcanvas(glist);
-  
-  if(x->x_gui.x_fsf.x_selected)
-  {
-    int xpos=text_xpix(&x->x_gui.x_obj, glist);
-    int ypos=text_ypix(&x->x_gui.x_obj, glist);
-    
-    sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED);
-  }
-  else
-  {
-    sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
-  }
-}
+*/
 
 void room_sim_2d_draw(t_room_sim_2d *x, t_glist *glist, int mode)
 {
-  if(mode == IEM_GUI_DRAW_MODE_UPDATE)
+  if (mode == IEM_GUI_DRAW_MODE_UPDATE)
     room_sim_2d_draw_update(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_MOVE)
-    room_sim_2d_draw_move(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_NEW)
+  else if (mode == IEM_GUI_DRAW_MODE_MOVE)
+    iemgui_base_draw_move(&x->x_gui);
+  else if (mode == IEM_GUI_DRAW_MODE_NEW)
     room_sim_2d_draw_new(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_SELECT)
+/*
+  else if (mode == IEM_GUI_DRAW_MODE_SELECT)
     room_sim_2d_draw_select(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_ERASE)
+  else if (mode == IEM_GUI_DRAW_MODE_ERASE)
     room_sim_2d_draw_erase(x, glist);
+*/
 }
 
 /* ------------------------ cnv widgetbehaviour----------------------------- */
@@ -238,14 +300,14 @@ static void room_sim_2d_save(t_gobj *z, t_binbuf *b)
 
 static void room_sim_2d_motion(t_room_sim_2d *x, t_floatarg dx, t_floatarg dy)
 {
-  int sel=x->x_sel_index;
-  int pixrad=x->x_pix_rad;
-  int xpos=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int ddx, ddy;
+  int sel = x->x_sel_index;
+  int pixrad = x->x_pix_rad;
+  int xpos = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int ypos = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+//  int ddx, ddy;
   t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
   
-  if(x->x_gui.x_fsf.x_finemoved && (sel == 0))
+  if (x->x_gui.x_finemoved && (sel == 0))
   {
     x->x_rho_head -= dy;
     
@@ -256,47 +318,59 @@ static void room_sim_2d_motion(t_room_sim_2d *x, t_floatarg dx, t_floatarg dy)
     room_sim_2d_out_rho(x);
     (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
   }
-  else if(sel == 0)
+  else if (sel == 0)
   {
     x->x_pos_x += (int)dx;
     x->x_pos_y += (int)dy;
     x->x_pix_src_x[0] = x->x_pos_x;
     x->x_pix_src_y[0] = x->x_pos_y;
-    if(x->x_pix_src_x[0] < 0)
+    if (x->x_pix_src_x[0] < 0)
       x->x_pix_src_x[0] = 0;
-    if(x->x_pix_src_x[0] > x->x_gui.x_w)
+    if (x->x_pix_src_x[0] > x->x_gui.x_w)
       x->x_pix_src_x[0] = x->x_gui.x_w;
-    if(x->x_pix_src_y[0] < 0)
+    if (x->x_pix_src_y[0] < 0)
       x->x_pix_src_y[0] = 0;
-    if(x->x_pix_src_y[0] > x->x_gui.x_h)
+    if (x->x_pix_src_y[0] > x->x_gui.x_h)
       x->x_pix_src_y[0] = x->x_gui.x_h;
     room_sim_2d_out_para(x);
-    sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
-      xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
-    ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-    ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-      xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+//    sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
+//      xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
+//    ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//    ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//      xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
   }
   else
   {
+    char col[MAXPDSTRING];
     x->x_pos_x += (int)dx;
     x->x_pos_y += (int)dy;
     x->x_pix_src_x[sel] = x->x_pos_x;
     x->x_pix_src_y[sel] = x->x_pos_y;
-    if(x->x_pix_src_x[sel] < 0)
+    if (x->x_pix_src_x[sel] < 0)
       x->x_pix_src_x[sel] = 0;
-    if(x->x_pix_src_x[sel] > x->x_gui.x_w)
+    if (x->x_pix_src_x[sel] > x->x_gui.x_w)
       x->x_pix_src_x[sel] = x->x_gui.x_w;
-    if(x->x_pix_src_y[sel] < 0)
+    if (x->x_pix_src_y[sel] < 0)
       x->x_pix_src_y[sel] = 0;
-    if(x->x_pix_src_y[sel] > x->x_gui.x_h)
+    if (x->x_pix_src_y[sel] > x->x_gui.x_h)
       x->x_pix_src_y[sel] = x->x_gui.x_h;
     room_sim_2d_out_para(x);
-    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
-      canvas, x, sel, xpos+x->x_pix_src_x[sel], ypos+x->x_pix_src_y[sel]);
+//    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
+//      canvas, x, sel, xpos+x->x_pix_src_x[sel], ypos+x->x_pix_src_y[sel]);
+    sprintf(col, "#%6.6x", x->x_col_src[sel]);
+    gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        sel - 1,
+        x->x_pix_src_x[sel],
+        x->x_pix_src_y[sel],
+        x->x_fontsize,
+        col
+    );
   }
 }
 
@@ -305,81 +379,88 @@ static void room_sim_2d_click(t_room_sim_2d *x, t_floatarg xpos, t_floatarg ypos
 {
   int w = (int)xpos - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
   int h = (int)ypos - text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int i, n=x->x_nr_src;
-  int pixrad=x->x_pix_rad;
-  int fsi=x->x_fontsize;
-  int diff, maxdiff=10000, sel=-1;
+  int i, n = x->x_nr_src;
+  int pixrad = x->x_pix_rad;
+  int fsi = x->x_fontsize;
+  int diff, maxdiff = 10000, sel =- 1;
   
   i = 0;/* head */
-  if((w >= (x->x_pix_src_x[i]-pixrad)) && (w <= (x->x_pix_src_x[i]+pixrad)) && (h >= (x->x_pix_src_y[i]-pixrad)) && (h <= (x->x_pix_src_y[i]+pixrad)))
+  if ((w >= (x->x_pix_src_x[i] - pixrad)) &&
+      (w <= (x->x_pix_src_x[i] + pixrad)) &&
+      (h >= (x->x_pix_src_y[i] - pixrad)) &&
+      (h <= (x->x_pix_src_y[i] + pixrad)))
   {
     diff = w - x->x_pix_src_x[i];
-    if(diff < 0)
+    if (diff < 0)
       diff *= -1;
-    if(diff < maxdiff)
+    if (diff < maxdiff)
     {
       maxdiff = diff;
       sel = i;
     }
     diff = h - x->x_pix_src_y[i];
-    if(diff < 0)
+    if (diff < 0)
       diff *= -1;
-    if(diff < maxdiff)
+    if (diff < maxdiff)
     {
       maxdiff = diff;
       sel = i;
     }
   }
-  
   fsi *= 2;
   fsi /= 3;
-  for(i=1; i<=n; i++)
+  for (i = 1; i <= n; i++)
   {
-    if((w >= (x->x_pix_src_x[i]-fsi)) && (w <= (x->x_pix_src_x[i]+fsi)) && 
-      (h >= (x->x_pix_src_y[i]-fsi)) && (h <= (x->x_pix_src_y[i]+fsi)))
+    if ((w >= (x->x_pix_src_x[i] - fsi)) &&
+        (w <= (x->x_pix_src_x[i] + fsi)) && 
+        (h >= (x->x_pix_src_y[i] - fsi)) &&
+        (h <= (x->x_pix_src_y[i] + fsi)))
     {
       diff = w - x->x_pix_src_x[i];
-      if(diff < 0)
+      if (diff < 0)
         diff *= -1;
-      if(diff < maxdiff)
+      if (diff < maxdiff)
       {
         maxdiff = diff;
         sel = i;
       }
       diff = h - x->x_pix_src_y[i];
-      if(diff < 0)
+      if (diff < 0)
         diff *= -1;
-      if(diff < maxdiff)
+      if (diff < maxdiff)
       {
         maxdiff = diff;
         sel = i;
       }
     }
   }
-  if(sel >= 0)
+  if (sel >= 0)
   {
     x->x_sel_index = sel;
     x->x_pos_x = x->x_pix_src_x[sel];
     x->x_pos_y = x->x_pix_src_y[sel];
-    glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g, (t_glistmotionfn)room_sim_2d_motion, 0, xpos, ypos);
+    glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g,
+      (t_glistmotionfn)room_sim_2d_motion, 0, xpos, ypos);
   }
 }
 
-static int room_sim_2d_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit)
+static int room_sim_2d_newclick(t_gobj *z, struct _glist *glist, int xpix,
+  int ypix, int shift, int alt, int dbl, int doit)
 {
   t_room_sim_2d* x = (t_room_sim_2d *)z;
   
-  if(doit)
+  if (doit)
   {
-    room_sim_2d_click( x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift, 0, (t_floatarg)alt);
-    if(shift)
+    room_sim_2d_click(x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift,
+      0, (t_floatarg)alt);
+    if (shift)
     {
-      x->x_gui.x_fsf.x_finemoved = 1;
+      x->x_gui.x_finemoved = 1;
       room_sim_2d_out_rho(x);
     }
     else
     {
-      x->x_gui.x_fsf.x_finemoved = 0;
+      x->x_gui.x_finemoved = 0;
       room_sim_2d_out_para(x);
     }
   }
@@ -394,27 +475,29 @@ static void room_sim_2d_bang(t_room_sim_2d *x)
 
 static void room_sim_2d_src_font(t_room_sim_2d *x, t_floatarg ff)
 {
-  int fs=(int)(ff + 0.49999f);
-  int i, n=x->x_nr_src;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  int fs = (int)(ff + 0.49999f);
+  int i, n = x->x_nr_src;
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if(fs < 8)
+  if (fs < 8)
     fs = 8;
-  if(fs > 250)
+  if (fs > 250)
     fs = 250;
   x->x_fontsize = fs;
   
-  for(i=1; i<=n; i++)
+  for (i = 1; i <= n; i++)
   {
-    sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fs);
+//    sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fs);
+    gui_vmess("gui_room_sim_fontsize", "xxii",
+      canvas, x, i, fs);
   }
 }
 
 static void room_sim_2d_set_rho(t_room_sim_2d *x, t_floatarg rho)
 {
-  while(rho <= -180.0f)
+  while (rho <= -180.0f)
     rho += 360.0f;
-  while(rho > 180.0f)
+  while (rho > 180.0f)
     rho -= 360.0f;
   x->x_rho_head = rho;
   (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
@@ -428,38 +511,50 @@ static void room_sim_2d_rho(t_room_sim_2d *x, t_floatarg rho)
 
 static void room_sim_2d_set_src_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *argv)
 {
+  char col[MAXPDSTRING];
   t_float xsrc, ysrc;
   t_float roomx2=0.5f*x->x_room_x, roomy2=0.5f*x->x_room_y;
-  int i, n=x->x_nr_src;
-  int xpos=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int w2=x->x_gui.x_w/2, h2=x->x_gui.x_h/2;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  int i, n = x->x_nr_src;
+  int xpos = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int ypos = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int w2 = x->x_gui.x_w/2, h2 = x->x_gui.x_h/2;
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if(argc < 3)
+  if (argc < 3)
   {
-    post("room_sim_2d ERROR: src_xy-input needs 1 index + 2 float-dimensions: src_index, x [m], y [m]");
+    post("room_sim_2d ERROR: src_xy-input needs 1 index + 2 float-dimensions: "
+      "src_index, x [m], y [m]");
     return;
   }
   i = (int)atom_getint(argv++);
-  if((i > 0)&&(i <= n))
+  if ((i > 0) && (i <= n))
   {
     ysrc = atom_getfloat(argv++);
     xsrc = atom_getfloat(argv);
     
-    if(xsrc < -roomy2)
+    if (xsrc < -roomy2)
       xsrc = -roomy2;
-    if(xsrc > roomy2)
+    if (xsrc > roomy2)
       xsrc = roomy2;
-    if(ysrc < -roomx2)
+    if (ysrc < -roomx2)
       ysrc = -roomx2;
-    if(ysrc > roomx2)
+    if (ysrc > roomx2)
       ysrc = roomx2;
     
     x->x_pix_src_x[i] = w2 - (int)(x->x_cnvrt_roomlx2pixh * xsrc + 0.49999f);
     x->x_pix_src_y[i] = h2 - (int)(x->x_cnvrt_roomlx2pixh * ysrc + 0.49999f);
-    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
-      canvas, x, i, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i]);
+//    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
+//      canvas, x, i, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i]);
+    sprintf(col, "#%6.6x", x->x_col_src[i]);
+    gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        i - 1,
+        x->x_pix_src_x[i],
+        x->x_pix_src_y[i],
+        x->x_fontsize,
+        col
+    );
   }
 }
 
@@ -469,18 +564,20 @@ static void room_sim_2d_src_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *
   room_sim_2d_out_para(x);
 }
 
-static void room_sim_2d_set_head_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *argv)
+static void room_sim_2d_set_head_xy(t_room_sim_2d *x, t_symbol *s, int argc,
+  t_atom *argv)
 {
-  int pixrad=x->x_pix_rad;
-  int xpos=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int w2=x->x_gui.x_w/2, h2=x->x_gui.x_h/2;
+  int pixrad = x->x_pix_rad;
+  int xpos = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int ypos = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int w2 = x->x_gui.x_w / 2, h2=x->x_gui.x_h / 2;
   int ddx, ddy;
   t_float xh, yh;
-  t_float roomx2=0.5f*x->x_room_x, roomy2=0.5f*x->x_room_y;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  t_float roomx2 = 0.5f * x->x_room_x,
+          roomy2 = 0.5f * x->x_room_y;
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if(argc < 2)
+  if (argc < 2)
   {
     post("room_sim_2d ERROR: head_xy-input needs 2 float-dimensions: x [m], y [m]");
     return;
@@ -488,25 +585,26 @@ static void room_sim_2d_set_head_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_a
   yh = atom_getfloat(argv++);
   xh = atom_getfloat(argv);
   
-  if(xh < -roomy2)
+  if (xh < -roomy2)
     xh = -roomy2;
-  if(xh > roomy2)
+  if (xh > roomy2)
     xh = roomy2;
-  if(yh < -roomx2)
+  if (yh < -roomx2)
     yh = -roomx2;
-  if(yh > roomx2)
+  if (yh > roomx2)
     yh = roomx2;
   x->x_pix_src_x[0] = w2 - (int)(x->x_cnvrt_roomlx2pixh * xh + 0.49999f);
   x->x_pix_src_y[0] = h2 - (int)(x->x_cnvrt_roomlx2pixh * yh + 0.49999f);
   
-  sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
-    canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
-    xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
-  ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-  ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-  sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-    canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-    xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+//  sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
+//    canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
+//    xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
+//  ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//  ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//  sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//    canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//    xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
 }
 
 static void room_sim_2d_head_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *argv)
@@ -517,9 +615,9 @@ static void room_sim_2d_head_xy(t_room_sim_2d *x, t_symbol *s, int argc, t_atom
 
 static void room_sim_2d_room_dim(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *argv)
 {
-  int i, n=x->x_nr_src;
+  int i, n = x->x_nr_src;
   
-  if(argc < 2)
+  if (argc < 2)
   {
     post("room_sim_2d ERROR: room_dim-input needs 2 float-dimensions: x-Length [m], y-Width [m]");
     return;
@@ -527,19 +625,19 @@ static void room_sim_2d_room_dim(t_room_sim_2d *x, t_symbol *s, int argc, t_atom
   x->x_room_x = atom_getfloat(argv++);
   x->x_room_y = atom_getfloat(argv);
   
-  if(x->x_room_x < 1.0f)
+  if (x->x_room_x < 1.0f)
     x->x_room_x = 1.0f;
-  if(x->x_room_y < 1.0f)
+  if (x->x_room_y < 1.0f)
     x->x_room_y = 1.0f;
   
   x->x_gui.x_h = (int)(x->x_cnvrt_roomlx2pixh * (t_float)x->x_room_x + 0.49999f);
   x->x_gui.x_w = (int)(x->x_cnvrt_roomlx2pixh * (t_float)x->x_room_y + 0.49999f);
   
-  for(i=1; i<=n; i++)
+  for (i = 1; i <= n; i++)
   {
-    if(x->x_pix_src_x[i] > x->x_gui.x_w)
+    if (x->x_pix_src_x[i] > x->x_gui.x_w)
       x->x_pix_src_x[i] = x->x_gui.x_w;
-    if(x->x_pix_src_y[i] > x->x_gui.x_h)
+    if (x->x_pix_src_y[i] > x->x_gui.x_h)
       x->x_pix_src_y[i] = x->x_gui.x_h;
   }
   
@@ -550,86 +648,123 @@ static void room_sim_2d_room_dim(t_room_sim_2d *x, t_symbol *s, int argc, t_atom
 
 /*static void room_sim_2d_n_src(t_room_sim_2d *x, t_floatarg fnsrc)
 {
-int n_src=(int)fnsrc;
+  int n_src = (int)fnsrc;
 
-  if(n_src < 1)
+  if (n_src < 1)
   n_src = 1;
-  if(n_src > 30)
+  if (n_src > 30)
   n_src = 30;
-  if(n_src != x->x_nr_src)
+  if (n_src != x->x_nr_src)
   {
-  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
+//  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
+    room_sim_2d_draw_unmap(x, x->x_gui.x_glist);
   x->x_nr_src = n_src;
-  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
-  }
+//  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
+    room_sim_2d_draw_map(x, x->x_gui.x_glist);
   }
+}
 */
 
 static void room_sim_2d_room_col(t_room_sim_2d *x, t_floatarg fcol)
 {
-  int col=(int)fcol;
+  int col = (int)fcol;
+  char fgstring[MAXPDSTRING];
+  char bgstring[MAXPDSTRING];
   int i;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if(col < 0)
+  if (col < 0)
   {
     i = -1 - col;
     x->x_gui.x_bcol = ((i & 0x3f000) << 6)|((i & 0xfc0) << 4)|((i & 0x3f) << 2);
   }
   else
   {
-    if(col > 29)
+    if (col > 29)
       col = 29;
     x->x_gui.x_bcol = my_iemgui_color_hex[col];
   }
-  sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol);
+  sprintf(fgstring, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bgstring, "#%6.6x", x->x_gui.x_bcol);
+  gui_vmess("gui_room_sim_colors", "xxss",
+    canvas,
+    x,
+    fgstring,
+    bgstring
+  );
+//  sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol);
 }
 
 static void room_sim_2d_head_col(t_room_sim_2d *x, t_floatarg fcol)
 {
-  int col=(int)fcol;
+  int col = (int)fcol;
+  char fgstring[MAXPDSTRING];
+  char bgstring[MAXPDSTRING];
   int i;
   t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
   
-  if(col < 0)
+  if (col < 0)
   {
     i = -1 - col;
     x->x_gui.x_fcol = ((i & 0x3f000) << 6)|((i & 0xfc0) << 4)|((i & 0x3f) << 2);
   }
   else
   {
-    if(col > 29)
+    if (col > 29)
       col = 29;
     x->x_gui.x_fcol = my_iemgui_color_hex[col];
   }
-  sys_vgui(".x%x.c itemconfigure %xHEAD -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol);
-  sys_vgui(".x%x.c itemconfigure %xNOSE -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
+  sprintf(fgstring, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bgstring, "#%6.6x", x->x_gui.x_bcol);
+  gui_vmess("gui_room_sim_colors", "xxss",
+    canvas,
+    x,
+    fgstring,
+    bgstring
+  );
+  //sys_vgui(".x%x.c itemconfigure %xHEAD -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol);
+  //sys_vgui(".x%x.c itemconfigure %xNOSE -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
 }
 
 static void room_sim_2d_src_col(t_room_sim_2d *x, t_symbol *s, int argc, t_atom *argv)
 {
   int col;
-  int i, j, n=x->x_nr_src;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  char colstring[MAXPDSTRING];
+  int i, j, n = x->x_nr_src;
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if((argc >= 2)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1))
+  if ((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1))
   {
     j = (int)atom_getintarg(0, argc, argv);
-    if((j > 0)&&(j <= n))
+    if ((j > 0)&&(j <= n))
     {
       col = (int)atom_getintarg(1, argc, argv);
-      if(col < 0)
+      if (col < 0)
       {
         i = -1 - col;
-        x->x_col_src[j] = ((i & 0x3f000) << 6)|((i & 0xfc0) << 4)|((i & 0x3f) << 2);
+        x->x_col_src[j] = ((i & 0x3f000) << 6) |
+        ((i & 0xfc0) << 4) |
+        ((i & 0x3f) << 2);
       }
       else
       {
-        if(col > 29)
+        if (col > 29)
+        {
           col = 29;
+        }
         x->x_col_src[j] = my_iemgui_color_hex[col];
       }
-      sys_vgui(".x%x.c itemconfigure %xSRC%d -fill #%6.6x\n", canvas, x, j, x->x_col_src[j]);
+      sprintf(colstring, "#%6.6x", x->x_col_src[j]);
+      gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        j,
+        x->x_pix_src_x[j],
+        x->x_pix_src_y[j],
+        x->x_fontsize,
+        colstring
+      );
+//      sys_vgui(".x%x.c itemconfigure %xSRC%d -fill #%6.6x\n", canvas, x, j, x->x_col_src[j]);
     }
   }
 }
@@ -637,18 +772,18 @@ static void room_sim_2d_src_col(t_room_sim_2d *x, t_symbol *s, int argc, t_atom
 static void room_sim_2d_pix_per_m_ratio(t_room_sim_2d *x, t_floatarg ratio)
 {
   t_float rr;
-  int i, n=x->x_nr_src;
+  int i, n = x->x_nr_src;
   
-  if(ratio < 1.0f)
+  if (ratio < 1.0f)
     ratio = 1.0f;
-  if(ratio > 200.0f)
+  if (ratio > 200.0f)
     ratio = 200.0f;
   rr = ratio / x->x_cnvrt_roomlx2pixh;
   x->x_cnvrt_roomlx2pixh = ratio;
   x->x_gui.x_w = (int)(x->x_cnvrt_roomlx2pixh * x->x_room_y + 0.49999f);
   x->x_gui.x_h = (int)(x->x_cnvrt_roomlx2pixh * x->x_room_x + 0.49999f);  
   x->x_pix_rad = (int)(x->x_cnvrt_roomlx2pixh * x->x_r_ambi + 0.49999f);
-  for(i=0; i<=n; i++)
+  for (i = 0; i <= n; i++)
   {
     x->x_pix_src_x[i] = (int)((t_float)x->x_pix_src_x[i]*rr + 0.49999f);
     x->x_pix_src_y[i] = (int)((t_float)x->x_pix_src_y[i]*rr + 0.49999f);
@@ -659,7 +794,7 @@ static void room_sim_2d_pix_per_m_ratio(t_room_sim_2d *x, t_floatarg ratio)
 
 static void room_sim_2d_r_ambi(t_room_sim_2d *x, t_floatarg r_ambi)
 {
-  if(r_ambi < 0.1f)
+  if (r_ambi < 0.1f)
     r_ambi = 0.1f;
   x->x_r_ambi = r_ambi;
   x->x_pix_rad = (int)(x->x_cnvrt_roomlx2pixh*r_ambi + 0.49999f);
@@ -672,51 +807,103 @@ static void room_sim_2d_nr_src(t_room_sim_2d *x, t_floatarg fnr_src)
   int nr_src = (int)fnr_src;
   int old_nr_src, i, j;
   
-  if(nr_src < 1)
+  if (nr_src < 1)
     nr_src = 1;
-  else if(nr_src > IEM_GUI_ROOMSIM_2D_MAX_NR_SRC)
+  else if (nr_src > IEM_GUI_ROOMSIM_2D_MAX_NR_SRC)
     nr_src = IEM_GUI_ROOMSIM_2D_MAX_NR_SRC;
   
-  if(nr_src != x->x_nr_src)
+  if (nr_src != x->x_nr_src)
   {
-    if(glist_isvisible(x->x_gui.x_glist))
-      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
+    if (glist_isvisible(x->x_gui.x_glist))
+        room_sim_2d_draw_unmap(x, x->x_gui.x_glist);
+//      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
     
     old_nr_src = x->x_nr_src;
     x->x_nr_src = nr_src;
     j = (old_nr_src + 1) % 7;
-    for(i=old_nr_src+1; i<=nr_src; i++)
+    for (i = old_nr_src + 1; i <= nr_src; i++)
     {
       x->x_col_src[i] = simularca_color_hex[j];
-      if(i & 1)
-        x->x_pix_src_x[i] = 125 + (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i)*4;
+      if (i & 1)
+        x->x_pix_src_x[i] = 125 + (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i) * 4;
       else
-        x->x_pix_src_x[i] = 125 - (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i)*4;
+        x->x_pix_src_x[i] = 125 - (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i) * 4;
       x->x_pix_src_y[i] = 100;
       j++;
       j %= 7;
     }
-    
-    if(glist_isvisible(x->x_gui.x_glist))
-      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
+    if (glist_isvisible(x->x_gui.x_glist))
+      room_sim_2d_draw_map(x, x->x_gui.x_glist);
+//      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
   }
 }
 
+/* we may no longer need h_dragon... */
+static void room_sim_2d__clickhook(t_scalehandle *sh, int newstate)
+{
+    t_room_sim_2d *x = (t_room_sim_2d *)(sh->h_master);
+    if (newstate)
+    {
+        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
+        if (!sh->h_scale) /* click on a label handle */
+            scalehandle_click_label(sh);
+    }
+    /* We no longer need this "clickhook", as we can handle the dragging
+       either in the GUI (for the label handle) or or in canvas_doclick */
+    //iemgui__clickhook3(sh,newstate);
+    sh->h_dragon = newstate;
+}
+
+static void room_sim_2d__motionhook(t_scalehandle *sh,
+                    t_floatarg mouse_x, t_floatarg mouse_y)
+{
+    if (sh->h_scale)
+    {
+        t_room_sim_2d *x = (t_room_sim_2d *)(sh->h_master);
+        int width = mouse_x - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist),
+            height = mouse_y - text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist),
+            minx = IEM_GUI_MINSIZE,
+            miny = IEM_GUI_MINSIZE;
+        x->x_gui.x_w = maxi(width, minx);
+        x->x_gui.x_h = maxi(height, miny);
+//        slider_check_length(x, x->x_orient ? x->x_gui.x_h : x->x_gui.x_w);
+        if (glist_isvisible(x->x_gui.x_glist))
+        {
+            room_sim_2d_draw_unmap(x, x->x_gui.x_glist);
+            room_sim_2d_draw_map(x, x->x_gui.x_glist);
+            scalehandle_unclick_scale(sh);
+        }
+
+        int properties = gfxstub_haveproperties((void *)x);
+        if (properties)
+        {
+            /* No properties for room_sim externals atm */
+            //properties_set_field_int(properties,"width",new_w);
+            //properties_set_field_int(properties,"height",new_h);
+        }
+    }
+    scalehandle_dragon_label(sh,mouse_x, mouse_y);
+}
+
+/* from the old header... */
+#define IEM_GUI_COLNR_GREEN          16
+#define IEM_GUI_COLNR_D_ORANGE       24
+
 static void *room_sim_2d_new(t_symbol *s, int argc, t_atom *argv)
 {
   t_room_sim_2d *x = (t_room_sim_2d *)pd_new(room_sim_2d_class);
-  int i, j, n=1, c;
+  int i, j, n = 1, c;
   
-  if((argc >= 1)&&IS_A_FLOAT(argv,0))
+  if ((argc >= 1) && IS_A_FLOAT(argv,0))
   {
     n = (int)atom_getintarg(0, argc, argv);
-    if(n < 1)
+    if (n < 1)
       n = 1;
-    if(n > IEM_GUI_ROOMSIM_2D_MAX_NR_SRC)
+    if (n > IEM_GUI_ROOMSIM_2D_MAX_NR_SRC)
       n = IEM_GUI_ROOMSIM_2D_MAX_NR_SRC;
     x->x_nr_src = n;
   }
-  if(argc == (3*n + 11))
+  if (argc == (3 * n + 11))
   {
     x->x_cnvrt_roomlx2pixh = atom_getfloatarg(1, argc, argv);
     x->x_rho_head = atom_getfloatarg(2, argc, argv);
@@ -730,12 +917,14 @@ static void *room_sim_2d_new(t_symbol *s, int argc, t_atom *argv)
     x->x_gui.x_fcol = ((c & 0x3f000) << 6)|((c & 0xfc0) << 4)|((c & 0x3f) << 2);
     x->x_pix_src_x[0] = (int)atom_getintarg(9, argc, argv);
     x->x_pix_src_y[0] = (int)atom_getintarg(10, argc, argv);
-    for(i=1; i<=n; i++)
+    for (i = 1; i <= n; i++)
     {
       c = (int)atom_getintarg(8+3*i, argc, argv);
-      x->x_col_src[i] = ((c & 0x3f000) << 6)|((c & 0xfc0) << 4)|((c & 0x3f) << 2);
-      x->x_pix_src_x[i] = (int)atom_getintarg(9+3*i, argc, argv);
-      x->x_pix_src_y[i] = (int)atom_getintarg(10+3*i, argc, argv);
+      x->x_col_src[i] = ((c & 0x3f000) << 6) |
+        ((c & 0xfc0) << 4) |
+        ((c & 0x3f) << 2);
+      x->x_pix_src_x[i] = (int)atom_getintarg(9 + 3 * i, argc, argv);
+      x->x_pix_src_y[i] = (int)atom_getintarg(10 + 3 * i, argc, argv);
     }
   }
   else
@@ -751,13 +940,13 @@ static void *room_sim_2d_new(t_symbol *s, int argc, t_atom *argv)
     x->x_pix_src_x[0] = 125;
     x->x_pix_src_y[0] = 200;
     j = 0;
-    for(i=1; i<=n; i++)
+    for (i = 1; i <= n; i++)
     {
       x->x_col_src[i] = simularca_color_hex[j];
-      if(i & 1)
-        x->x_pix_src_x[i] = 125 + (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i)*4;
+      if (i & 1)
+        x->x_pix_src_x[i] = 125 + (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i) * 4;
       else
-        x->x_pix_src_x[i] = 125 - (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i)*4;
+        x->x_pix_src_x[i] = 125 - (IEM_GUI_ROOMSIM_2D_MAX_NR_SRC - i) * 4;
       x->x_pix_src_y[i] = 100;
       j++;
       j %= 7;
@@ -776,6 +965,15 @@ static void *room_sim_2d_new(t_symbol *s, int argc, t_atom *argv)
   
   x->x_s_head_xy = gensym("head_xy");
   x->x_s_src_xy = gensym("src_xy");
+
+  x->x_gui.x_lab = s_empty;
+
+  x->x_gui.x_obj.te_iemgui = 1;
+  x->x_gui.x_handle = scalehandle_new((t_object *)x,
+      x->x_gui.x_glist, 1, room_sim_2d__clickhook, room_sim_2d__motionhook);
+  x->x_gui.x_lhandle = scalehandle_new((t_object *)x,
+      x->x_gui.x_glist, 0, room_sim_2d__clickhook, room_sim_2d__motionhook);
+
   return (x);
 }
 
@@ -786,31 +984,49 @@ static void room_sim_2d_ff(t_room_sim_2d *x)
 
 void room_sim_2d_setup(void)
 {
-  room_sim_2d_class = class_new(gensym("room_sim_2d"), (t_newmethod)room_sim_2d_new,
-    (t_method)room_sim_2d_ff, sizeof(t_room_sim_2d), 0, A_GIMME, 0);
+  room_sim_2d_class = class_new(gensym("room_sim_2d"),
+    (t_newmethod)room_sim_2d_new, (t_method)room_sim_2d_ff,
+    sizeof(t_room_sim_2d), 0, A_GIMME, 0);
 //  class_addcreator((t_newmethod)room_sim_2d_new, gensym("room_sim_2d"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_click, gensym("click"),
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_click,
+    gensym("click"),
     A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_motion, gensym("motion"),
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_motion,
+    gensym("motion"),
     A_FLOAT, A_FLOAT, 0);
   class_addbang(room_sim_2d_class, (t_method)room_sim_2d_bang);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_room_dim, gensym("room_dim"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_r_ambi, gensym("r_ambi"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_room_col, gensym("room_col"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_head_col, gensym("head_col"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_col, gensym("src_col"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_rho, gensym("rho"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_xy, gensym("src_xy"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_head_xy, gensym("head_xy"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_rho, gensym("set_rho"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_src_xy, gensym("set_src_xy"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_head_xy, gensym("set_head_xy"), A_GIMME, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_pix_per_m_ratio, gensym("pix_per_m_ratio"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_font, gensym("src_font"), A_DEFFLOAT, 0);
-  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_nr_src, gensym("nr_src"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_room_dim,
+    gensym("room_dim"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_r_ambi,
+    gensym("r_ambi"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_room_col,
+    gensym("room_col"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_head_col,
+    gensym("head_col"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_col,
+    gensym("src_col"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_rho,
+    gensym("rho"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_xy,
+    gensym("src_xy"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_head_xy,
+    gensym("head_xy"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_rho,
+    gensym("set_rho"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_src_xy,
+    gensym("set_src_xy"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_set_head_xy,
+    gensym("set_head_xy"), A_GIMME, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_pix_per_m_ratio,
+    gensym("pix_per_m_ratio"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_src_font,
+    gensym("src_font"), A_DEFFLOAT, 0);
+  class_addmethod(room_sim_2d_class, (t_method)room_sim_2d_nr_src,
+    gensym("nr_src"), A_DEFFLOAT, 0);
   
   room_sim_2d_widgetbehavior.w_getrectfn = room_sim_2d_getrect;
   room_sim_2d_widgetbehavior.w_displacefn = iemgui_displace;
+  room_sim_2d_widgetbehavior.w_displacefnwtag = iemgui_displace_withtag;
   room_sim_2d_widgetbehavior.w_selectfn = iemgui_select;
   room_sim_2d_widgetbehavior.w_activatefn = NULL;
   room_sim_2d_widgetbehavior.w_deletefn = iemgui_delete;
diff --git a/externals/iem/iemgui/src/room_sim_3d.c b/externals/iem/iemgui/src/room_sim_3d.c
index 043d8660b39a983fff3b60375c435d8d07a00555..7b845683760bd0e0aabcabc774872bbdf52bef70 100644
--- a/externals/iem/iemgui/src/room_sim_3d.c
+++ b/externals/iem/iemgui/src/room_sim_3d.c
@@ -7,7 +7,7 @@ iemgui written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 *
 #include "iemlib.h"
 #include "iemgui.h"
 #include "g_canvas.h"
-#include "../../../old_g_all_guis.inc"
+#include "g_all_guis.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -54,6 +54,7 @@ typedef struct _room_sim_3d
   t_symbol  *x_s_head_xyz;
   t_symbol  *x_s_src_xyz;
   t_atom    x_at[6];
+  int       x_steady;
 } t_room_sim_3d;
 
 static void room_sim_3d_out_rho(t_room_sim_3d *x)
@@ -94,57 +95,131 @@ static void room_sim_3d_draw_update(t_room_sim_3d *x, t_glist *glist)
     
     dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
     dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-      xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
+//    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//      xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
+
+    gui_vmess("gui_room_sim_update", "xxiiiii",
+      canvas,
+      x,
+      x->x_pix_src_x[0],
+      x->x_pix_src_y[0],
+      dx,
+      dy,
+      x->x_pix_rad
+    );
   }
 }
 
-void room_sim_3d_draw_new(t_room_sim_3d *x, t_glist *glist)
+void room_sim_3d_draw_unmap(t_room_sim_3d *x, t_glist *glist)
 {
-  int xpos=text_xpix(&x->x_gui.x_obj, glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, glist);
+    gui_vmess("gui_room_sim_erase", "xx",
+        x->x_gui.x_glist, x);
+}
+
+void room_sim_3d_draw_map(t_room_sim_3d *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 dx, dy;
-  int H=(int)(0.5f * x->x_room_z * x->x_cnvrt_roomlx2pixh + 0.49999f);
-  int H2=H*H;
+  int H = (int)(0.5f * x->x_room_z * x->x_cnvrt_roomlx2pixh + 0.49999f);
+  int H2 = H*H;
   int rad2;
-  int i, n=x->x_nr_src;
-  int fsi, fs=x->x_fontsize;
-  t_canvas *canvas=glist_getcanvas(glist);
+  int i, n = x->x_nr_src;
+  int fsi, fs = x->x_fontsize;
+  t_canvas *canvas = glist_getcanvas(glist);
+  char bcol[MAXPDSTRING];
+  char fcol[MAXPDSTRING];
+  char elemcol[MAXPDSTRING];
+  sprintf(fcol, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
   
-  sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -outline #%6.6x -tags %xBASE\n",
-    canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
-    x->x_gui.x_bcol, x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:IEM_GUI_COLOR_NORMAL, x);
-  for(i=1; i<=n; i++)
+  gui_start_vmess("gui_room_sim_map", "xxiiifiiiss",
+    canvas,
+    x,
+    x->x_gui.x_w,
+    x->x_gui.x_h,
+    x->x_pix_rad,
+    x->x_rho_head,
+    x->x_pix_src_x[0],
+    x->x_pix_src_y[0],
+    x->x_fontsize,
+    fcol,
+    bcol
+  );
+  gui_start_array();
+  for (i = 1; i <= n; i++)
   {
     fsi = H2 + (H + 2 * x->x_pix_src_z[i]) * x->x_pix_src_z[i];
     fsi *= fs;
     fsi /= 2*H2;
-    sys_vgui(".x%x.c create text %d %d -text {%d} -anchor c \
-      -font {times %d bold} -fill #%6.6x -tags %xSRC%d\n",
-      canvas, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i], i, fsi,
-      x->x_col_src[i], x, i);
+    gui_start_array();
+    gui_i(x->x_pix_src_x[i]);
+    gui_i(x->x_pix_src_y[i]);
+    sprintf(elemcol, "#%6.6x", x->x_col_src[i]);
+    gui_s(elemcol);
+    gui_i(fsi);
+    gui_end_array();
+//    sys_vgui(".x%x.c create text %d %d -text {%d} -anchor c \
+//      -font {times %d bold} -fill #%6.6x -tags %xSRC%d\n",
+//      canvas, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i], i, fsi,
+//      x->x_col_src[i], x, i);
   }
+  gui_end_array();
   
-  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD\n",
-    canvas, xpos+x->x_pix_src_x[0]-x->x_pix_rad, ypos+x->x_pix_src_y[0]-x->x_pix_rad,
-    xpos+x->x_pix_src_x[0]+x->x_pix_rad-1, ypos+x->x_pix_src_y[0]+x->x_pix_rad-1,
-    x->x_gui.x_fcol, x);
+//  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD\n",
+//    canvas, xpos+x->x_pix_src_x[0]-x->x_pix_rad, ypos+x->x_pix_src_y[0]-x->x_pix_rad,
+//    xpos+x->x_pix_src_x[0]+x->x_pix_rad-1, ypos+x->x_pix_src_y[0]+x->x_pix_rad-1,
+//    x->x_gui.x_fcol, x);
+
   rad2 = H2 + (H + 2 * x->x_pix_src_z[0]) * x->x_pix_src_z[0];
   rad2 *= x->x_pix_rad;
   rad2 /= 8*H2;
-  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD2\n",
-    canvas, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
-    xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1,
-    x->x_gui.x_fcol, x);
-  dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-  dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-  sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -tags %xNOSE\n",
-    canvas, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-    xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy,
-    x->x_gui.x_fcol, x);
+  gui_start_array();
+  gui_i(x->x_pix_src_x[0] - rad2);
+  gui_i(x->x_pix_src_y[0] - rad2);
+  gui_i(x->x_pix_src_x[0] + rad2 - 1);
+  gui_i(x->x_pix_src_y[0] + rad2 - 1);
+  gui_end_array();
+  gui_end_vmess();
+//  sys_vgui(".x%x.c create oval %d %d %d %d -outline #%6.6x -tags %xHEAD2\n",
+//    canvas, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
+//    xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1,
+//    x->x_gui.x_fcol, x);
+//  dx = -(int)((t_float)x->x_pix_rad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//  dy = -(int)((t_float)x->x_pix_rad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//  sys_vgui(".x%x.c create line %d %d %d %d -width 3 -fill #%6.6x -tags %xNOSE\n",
+//    canvas, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//    xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy,
+//    x->x_gui.x_fcol, x);
+}
+
+void room_sim_3d_draw_new(t_room_sim_3d *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 dx, dy;
+  int H=(int)(0.5f * x->x_room_z * x->x_cnvrt_roomlx2pixh + 0.49999f);
+  int H2=H*H;
+  int rad2;
+  int i, n=x->x_nr_src;
+  int fsi, fs=x->x_fontsize;
+  t_canvas *canvas=glist_getcanvas(glist);
+  
+  gui_vmess("gui_room_sim_new", "xxiiiii",
+    canvas,
+    x,
+    xpos,
+    ypos,
+    x->x_gui.x_w,
+    x->x_gui.x_h,
+    glist_istoplevel(glist)
+  );
+
+  room_sim_3d_draw_map(x, glist);
 }
 
+/*
 void room_sim_3d_draw_move(t_room_sim_3d *x, t_glist *glist)
 {
   int xpos=text_xpix(&x->x_gui.x_obj, glist);
@@ -185,52 +260,22 @@ void room_sim_3d_draw_move(t_room_sim_3d *x, t_glist *glist)
     canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
     xpos+x->x_pix_src_x[0]+dx, ypos+x->x_pix_src_y[0]+dy);
 }
-
-void room_sim_3d_draw_erase(t_room_sim_3d* x, t_glist* glist)
-{
-  int i, n;
-  t_canvas *canvas=glist_getcanvas(glist);
-  
-  sys_vgui(".x%x.c delete %xBASE\n", canvas, x);
-  n = x->x_nr_src;
-  for(i=1; i<=n; i++)
-  {
-    sys_vgui(".x%x.c delete %xSRC%d\n", canvas, x, i);
-  }
-  sys_vgui(".x%x.c delete %xHEAD\n", canvas, x);
-  sys_vgui(".x%x.c delete %xHEAD2\n", canvas, x);
-  sys_vgui(".x%x.c delete %xNOSE\n", canvas, x);
-}
-
-void room_sim_3d_draw_select(t_room_sim_3d* x, t_glist* glist)
-{
-  t_canvas *canvas=glist_getcanvas(glist);
-  
-  if(x->x_gui.x_fsf.x_selected)
-  {
-    int xpos=text_xpix(&x->x_gui.x_obj, glist);
-    int ypos=text_ypix(&x->x_gui.x_obj, glist);
-    
-    sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED);
-  }
-  else
-  {
-    sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL);
-  }
-}
+*/
 
 void room_sim_3d_draw(t_room_sim_3d *x, t_glist *glist, int mode)
 {
-  if(mode == IEM_GUI_DRAW_MODE_UPDATE)
+  if (mode == IEM_GUI_DRAW_MODE_UPDATE)
     room_sim_3d_draw_update(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_MOVE)
-    room_sim_3d_draw_move(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_NEW)
+  else if (mode == IEM_GUI_DRAW_MODE_MOVE)
+    iemgui_base_draw_move(&x->x_gui);
+  else if (mode == IEM_GUI_DRAW_MODE_NEW)
     room_sim_3d_draw_new(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_SELECT)
+/*
+  else if (mode == IEM_GUI_DRAW_MODE_SELECT)
     room_sim_3d_draw_select(x, glist);
-  else if(mode == IEM_GUI_DRAW_MODE_ERASE)
+  else if (mode == IEM_GUI_DRAW_MODE_ERASE)
     room_sim_3d_draw_erase(x, glist);
+*/
 }
 
 /* ------------------------ cnv widgetbehaviour----------------------------- */
@@ -272,44 +317,44 @@ static void room_sim_3d_save(t_gobj *z, t_binbuf *b)
 
 static void room_sim_3d_motion(t_room_sim_3d *x, t_floatarg dx, t_floatarg dy)
 {
-  int i, n=x->x_nr_src;
-  int pixrad=x->x_pix_rad;
-  int sel=x->x_sel_index;
-  int xpos=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
-  int ypos=text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int i, n = x->x_nr_src;
+  int pixrad = x->x_pix_rad;
+  int sel = x->x_sel_index;
+  int xpos = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+  int ypos = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
   int ddx, ddy;
-  int fs=x->x_fontsize, fsi;
-  int H=(int)(0.5f * x->x_room_z * x->x_cnvrt_roomlx2pixh + 0.49999f);
-  int H2=H*H;
+  int fs = x->x_fontsize, fsi;
+  int H = (int)(0.5f * x->x_room_z * x->x_cnvrt_roomlx2pixh + 0.49999f);
+  int H2 = H*H;
   int rad2;
-  t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
+  t_canvas *canvas = glist_getcanvas(x->x_gui.x_glist);
   
-  if(x->x_gui.x_fsf.x_finemoved && (sel == 0))
+  if (x->x_gui.x_finemoved && (sel == 0))
   {
-    if(x->x_gui.x_fsf.x_steady)/*alt-key, rhoy, rhox*/
+    if (x->x_steady)/*alt-key, rhoy, rhox*/
     {
     }
     else
     {
       x->x_rho_head -= dy;
-      if(x->x_rho_head <= -180.0f)
+      if (x->x_rho_head <= -180.0f)
         x->x_rho_head += 360.0f;
-      if(x->x_rho_head > 180.0f)
+      if (x->x_rho_head > 180.0f)
         x->x_rho_head -= 360.0f;
       room_sim_3d_out_rho(x);
       (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
     }
   }
-  else if(sel == 0)
+  else if (sel == 0)
   {
-    if(x->x_gui.x_fsf.x_steady)/*alt-key, move head in z*/
+    if (x->x_steady) /*alt-key, move head in z */
     {
       x->x_pix_src_x[0] = x->x_pos_x;
       x->x_pix_src_y[0] = x->x_pos_y;
       x->x_pix_src_z[0] -= (int)dy;
-      if(x->x_pix_src_z[0] < 0)
+      if (x->x_pix_src_z[0] < 0)
         x->x_pix_src_z[0] = 0;
-      if(x->x_pix_src_z[0] > x->x_height_z)
+      if (x->x_pix_src_z[0] > x->x_height_z)
         x->x_pix_src_z[0] = x->x_height_z;
     }
     else
@@ -319,46 +364,66 @@ static void room_sim_3d_motion(t_room_sim_3d *x, t_floatarg dx, t_floatarg dy)
       x->x_pos_y += (int)dy;
       x->x_pix_src_x[0] = x->x_pos_x;
       x->x_pix_src_y[0] = x->x_pos_y;
-      if(x->x_pix_src_x[0] < 0)
+      if (x->x_pix_src_x[0] < 0)
         x->x_pix_src_x[0] = 0;
-      if(x->x_pix_src_x[0] > x->x_gui.x_w)
+      if (x->x_pix_src_x[0] > x->x_gui.x_w)
         x->x_pix_src_x[0] = x->x_gui.x_w;
-      if(x->x_pix_src_y[0] < 0)
+      if (x->x_pix_src_y[0] < 0)
         x->x_pix_src_y[0] = 0;
-      if(x->x_pix_src_y[0] > x->x_gui.x_h)
+      if (x->x_pix_src_y[0] > x->x_gui.x_h)
         x->x_pix_src_y[0] = x->x_gui.x_h;
     }
     room_sim_3d_out_para(x);
-    sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
-      xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
+    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+//    sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
+//      xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
     rad2 = H2 + (H + 2 * x->x_pix_src_z[0]) * x->x_pix_src_z[0];
     rad2 *= x->x_pix_rad;
     rad2 /= 8*H2;
-    sys_vgui(".x%x.c coords %xHEAD2 %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
-      xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1);
-    ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-    ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-      xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+//    sys_vgui(".x%x.c coords %xHEAD2 %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
+//      xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1);
+    gui_vmess("gui_room_sim_head2", "xxiiii",
+      canvas,
+      x,
+      x->x_pix_src_x[0] - rad2,
+      x->x_pix_src_y[0] - rad2,
+      x->x_pix_src_x[0] + rad2 - 1,
+      x->x_pix_src_y[0] + rad2 - 1
+    );
+//    ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//    ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//    sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//      canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//      xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
   }
   else
   {
-    if(x->x_gui.x_fsf.x_steady)/*alt-key, move src in z*/
+    if (x->x_steady) /*alt-key, move src in z*/
     {
       x->x_pix_src_z[sel] -= (int)dy;
-      if(x->x_pix_src_z[sel] < 0)
+      if (x->x_pix_src_z[sel] < 0)
         x->x_pix_src_z[sel] = 0;
-      if(x->x_pix_src_z[sel] > x->x_height_z)
+      if (x->x_pix_src_z[sel] > x->x_height_z)
         x->x_pix_src_z[sel] = x->x_height_z;
       
       room_sim_3d_out_para(x);
       fsi = H2 + (H + 2 * x->x_pix_src_z[sel]) * x->x_pix_src_z[sel];
       fsi *= fs;
       fsi /= 2*H2;
-      sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, sel, fsi);
+      char col[MAXPDSTRING];
+      sprintf(col, "#%6.6x", x->x_col_src[sel]);
+      gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        sel - 1,
+        x->x_pix_src_x[sel],
+        x->x_pix_src_y[sel],
+        fsi,
+        col
+      );
+//      sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, sel, fsi);
     }
     else
     {
@@ -367,22 +432,33 @@ static void room_sim_3d_motion(t_room_sim_3d *x, t_floatarg dx, t_floatarg dy)
       x->x_pix_src_x[sel] = x->x_pos_x;
       x->x_pix_src_y[sel] = x->x_pos_y;
       x->x_pix_src_z[sel] = x->x_pos_z;
-      if(x->x_pix_src_x[sel] < 0)
+      if (x->x_pix_src_x[sel] < 0)
         x->x_pix_src_x[sel] = 0;
-      if(x->x_pix_src_x[sel] > x->x_gui.x_w)
+      if (x->x_pix_src_x[sel] > x->x_gui.x_w)
         x->x_pix_src_x[sel] = x->x_gui.x_w;
-      if(x->x_pix_src_y[sel] < 0)
+      if (x->x_pix_src_y[sel] < 0)
         x->x_pix_src_y[sel] = 0;
-      if(x->x_pix_src_y[sel] > x->x_gui.x_h)
+      if (x->x_pix_src_y[sel] > x->x_gui.x_h)
         x->x_pix_src_y[sel] = x->x_gui.x_h;
       
       room_sim_3d_out_para(x);
       fsi = H2 + (H + 2 * x->x_pix_src_z[sel]) * x->x_pix_src_z[sel];
       fsi *= fs;
       fsi /= 2*H2;
-      sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
-        canvas, x, sel, xpos+x->x_pix_src_x[sel], ypos+x->x_pix_src_y[sel]);
-      sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, sel, fsi);
+      char col[MAXPDSTRING];
+      sprintf(col, "#%6.6x", x->x_col_src[sel]);
+      gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        sel - 1,
+        x->x_pix_src_x[sel],
+        x->x_pix_src_y[sel],
+        fsi,
+        col
+      );
+      //sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
+      //  canvas, x, sel, xpos+x->x_pix_src_x[sel], ypos+x->x_pix_src_y[sel]);
+      //sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, sel, fsi);
     }
   }
 }
@@ -468,18 +544,18 @@ static int room_sim_3d_newclick(t_gobj *z, struct _glist *glist, int xpix, int y
   {
     room_sim_3d_click( x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift, 0, (t_floatarg)alt);
     if(alt)
-      x->x_gui.x_fsf.x_steady = 1;
+      x->x_steady = 1;
     else
-      x->x_gui.x_fsf.x_steady = 0;
+      x->x_steady = 0;
     
     if(shift)
     {
-      x->x_gui.x_fsf.x_finemoved = 1;
+      x->x_gui.x_finemoved = 1;
       room_sim_3d_out_rho(x);
     }
     else
     {
-      x->x_gui.x_fsf.x_finemoved = 0;
+      x->x_gui.x_finemoved = 0;
       room_sim_3d_out_para(x);
     }
   }
@@ -511,7 +587,19 @@ static void room_sim_3d_src_font(t_room_sim_3d *x, t_floatarg ff)
     fsi = H2 + (H + 2 * x->x_pix_src_z[i]) * x->x_pix_src_z[i];
     fsi *= fs;
     fsi /= 2*H2;
-    sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fsi);
+
+    char col[MAXPDSTRING];
+    sprintf(col, "#%6.6x", x->x_col_src[i]);
+    gui_vmess("gui_room_sim_update_src", "xxiiiis",
+      canvas,
+      x,
+      i - 1,
+      x->x_pix_src_x[i],
+      x->x_pix_src_y[i],
+      fsi,
+      col
+    );
+    //sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fsi);
   }
 }
 
@@ -577,9 +665,21 @@ static void room_sim_3d_set_src_xyz(t_room_sim_3d *x, t_symbol *s, int argc, t_a
     fsi = H2 + (H + 2 * x->x_pix_src_z[i]) * x->x_pix_src_z[i];
     fsi *= fs;
     fsi /= 2*H2;
-    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
-      canvas, x, i, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i]);
-    sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fsi);
+
+    char col[MAXPDSTRING];
+    sprintf(col, "#%6.6x", x->x_col_src[i]);
+    gui_vmess("gui_room_sim_update_src", "xxiiiis",
+      canvas,
+      x,
+      i - 1,
+      x->x_pix_src_x[i],
+      x->x_pix_src_y[i],
+      fsi,
+      col
+    );
+//    sys_vgui(".x%x.c coords %xSRC%d %d %d\n",
+//      canvas, x, i, xpos+x->x_pix_src_x[i], ypos+x->x_pix_src_y[i]);
+//    sys_vgui(".x%x.c itemconfigure %xSRC%d -font {times %d bold}\n", canvas, x, i, fsi);
   }
 }
 
@@ -626,20 +726,30 @@ static void room_sim_3d_set_head_xyz(t_room_sim_3d *x, t_symbol *s, int argc, t_
   x->x_pix_src_y[0] = x->x_gui.x_h/2 - (int)(x->x_cnvrt_roomlx2pixh * yh + 0.49999f);
   x->x_pix_src_z[0] = (int)(x->x_cnvrt_roomlx2pixh * zh + 0.49999f);
   
-  sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
-    canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
-    xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
+  (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+
+//  sys_vgui(".x%x.c coords %xHEAD %d %d %d %d\n",
+//    canvas, x, xpos+x->x_pix_src_x[0]-pixrad, ypos+x->x_pix_src_y[0]-pixrad,
+//    xpos+x->x_pix_src_x[0]+pixrad-1, ypos+x->x_pix_src_y[0]+pixrad-1);
   rad2 = H2 + (H + 2 * x->x_pix_src_z[0]) * x->x_pix_src_z[0];
   rad2 *= pixrad;
   rad2 /= 8*H2;
-  sys_vgui(".x%x.c coords %xHEAD2 %d %d %d %d\n",
-    canvas, x, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
-    xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1);
-  ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
-  ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
-  sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
-    canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
-    xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
+  gui_vmess("gui_room_sim_head2", "xxiiii",
+    canvas,
+    x,
+    x->x_pix_src_x[0] - rad2,
+    x->x_pix_src_y[0] - rad2,
+    x->x_pix_src_x[0] + rad2 - 1,
+    x->x_pix_src_y[0] + rad2 - 1
+  );
+//  sys_vgui(".x%x.c coords %xHEAD2 %d %d %d %d\n",
+//    canvas, x, xpos+x->x_pix_src_x[0]-rad2, ypos+x->x_pix_src_y[0]-rad2,
+//    xpos+x->x_pix_src_x[0]+rad2-1, ypos+x->x_pix_src_y[0]+rad2-1);
+//  ddx = -(int)((t_float)pixrad*(t_float)sin(x->x_rho_head*0.0174533f) + 0.49999f);
+//  ddy = -(int)((t_float)pixrad*(t_float)cos(x->x_rho_head*0.0174533f) + 0.49999f);
+//  sys_vgui(".x%x.c coords %xNOSE %d %d %d %d\n",
+//    canvas, x, xpos+x->x_pix_src_x[0], ypos+x->x_pix_src_y[0],
+//    xpos+x->x_pix_src_x[0]+ddx, ypos+x->x_pix_src_y[0]+ddy);
 }
 
 static void room_sim_3d_head_xyz(t_room_sim_3d *x, t_symbol *s, int argc, t_atom *argv)
@@ -673,13 +783,13 @@ static void room_sim_3d_room_dim(t_room_sim_3d *x, t_symbol *s, int argc, t_atom
   x->x_height_z = (int)(x->x_cnvrt_roomlx2pixh * x->x_room_z + 0.49999f);
   x->x_pix_rad = (int)(x->x_cnvrt_roomlx2pixh * x->x_r_ambi + 0.49999f);
   
-  for(i=0; i<=n; i++)
+  for (i = 0; i <= n; i++)
   {
-    if(x->x_pix_src_x[i] > x->x_gui.x_w)
+    if (x->x_pix_src_x[i] > x->x_gui.x_w)
       x->x_pix_src_x[i] = x->x_gui.x_w;
-    if(x->x_pix_src_y[i] > x->x_gui.x_h)
+    if (x->x_pix_src_y[i] > x->x_gui.x_h)
       x->x_pix_src_y[i] = x->x_gui.x_h;
-    if(x->x_pix_src_z[i] > x->x_height_z)
+    if (x->x_pix_src_z[i] > x->x_height_z)
       x->x_pix_src_z[i] = x->x_height_z;
   }
   
@@ -691,26 +801,38 @@ static void room_sim_3d_room_dim(t_room_sim_3d *x, t_symbol *s, int argc, t_atom
 static void room_sim_3d_room_col(t_room_sim_3d *x, t_floatarg fcol)
 {
   int col=(int)fcol;
+  char fgstring[MAXPDSTRING];
+  char bgstring[MAXPDSTRING];
   int i;
   t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
   
-  if(col < 0)
+  if (col < 0)
   {
     i = -1 - col;
     x->x_gui.x_bcol = ((i & 0x3f000) << 6)|((i & 0xfc0) << 4)|((i & 0x3f) << 2);
   }
   else
   {
-    if(col > 29)
+    if (col > 29)
       col = 29;
     x->x_gui.x_bcol = my_iemgui_color_hex[col];
   }
-  sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol);
+  sprintf(fgstring, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bgstring, "#%6.6x", x->x_gui.x_bcol);
+  gui_vmess("gui_room_sim_colors", "xxss",
+    canvas,
+    x,
+    fgstring,
+    bgstring
+  );
+//  sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol);
 }
 
 static void room_sim_3d_head_col(t_room_sim_3d *x, t_floatarg fcol)
 {
   int col=(int)fcol;
+  char fgstring[MAXPDSTRING];
+  char bgstring[MAXPDSTRING];
   int i;
   t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
   
@@ -725,35 +847,54 @@ static void room_sim_3d_head_col(t_room_sim_3d *x, t_floatarg fcol)
       col = 29;
     x->x_gui.x_fcol = my_iemgui_color_hex[col];
   }
-  sys_vgui(".x%x.c itemconfigure %xHEAD -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol);
+  sprintf(fgstring, "#%6.6x", x->x_gui.x_fcol);
+  sprintf(bgstring, "#%6.6x", x->x_gui.x_bcol);
+  gui_vmess("gui_room_sim_colors", "xxss",
+    canvas,
+    x,
+    fgstring,
+    bgstring
+  );
+//  sys_vgui(".x%x.c itemconfigure %xHEAD -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol);
   sys_vgui(".x%x.c itemconfigure %xHEAD2 -outline #%6.6x\n", canvas, x, x->x_gui.x_fcol);
-  sys_vgui(".x%x.c itemconfigure %xNOSE -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
+//  sys_vgui(".x%x.c itemconfigure %xNOSE -fill #%6.6x\n", canvas, x, x->x_gui.x_fcol);
 }
 
 static void room_sim_3d_src_col(t_room_sim_3d *x, t_symbol *s, int argc, t_atom *argv)
 {
   int col;
+  char colstring[MAXPDSTRING];
   int i, j, n=x->x_nr_src;
   t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist);
   
-  if((argc >= 2)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1))
+  if ((argc >= 2)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1))
   {
     j = (int)atom_getintarg(0, argc, argv);
-    if((j > 0)&&(j <= n))
+    if ((j > 0)&&(j <= n))
     {
       col = (int)atom_getintarg(1, argc, argv);
-      if(col < 0)
+      if (col < 0)
       {
         i = -1 - col;
         x->x_col_src[j] = ((i & 0x3f000) << 6)|((i & 0xfc0) << 4)|((i & 0x3f) << 2);
       }
       else
       {
-        if(col > 29)
+        if (col > 29)
           col = 29;
         x->x_col_src[j] = my_iemgui_color_hex[col];
       }
-      sys_vgui(".x%x.c itemconfigure %xSRC%d -fill #%6.6x\n", canvas, x, j, x->x_col_src[j]);
+      sprintf(colstring, "#%6.6x", x->x_col_src[j]);
+      gui_vmess("gui_room_sim_update_src", "xxiiiis",
+        canvas,
+        x,
+        j,
+        x->x_pix_src_x[j],
+        x->x_pix_src_y[j],
+        x->x_fontsize,
+        colstring
+      );
+//      sys_vgui(".x%x.c itemconfigure %xSRC%d -fill #%6.6x\n", canvas, x, j, x->x_col_src[j]);
     }
   }
 }
@@ -805,8 +946,9 @@ static void room_sim_3d_nr_src(t_room_sim_3d *x, t_floatarg fnr_src)
   
   if(nr_src != x->x_nr_src)
   {
-    if(glist_isvisible(x->x_gui.x_glist))
-      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
+    if (glist_isvisible(x->x_gui.x_glist))
+      room_sim_3d_draw_unmap(x, x->x_gui.x_glist);
+//      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
     
     old_nr_src = x->x_nr_src;
     x->x_nr_src = nr_src;
@@ -824,12 +966,64 @@ static void room_sim_3d_nr_src(t_room_sim_3d *x, t_floatarg fnr_src)
       j %= 7;
     }
     
-    if(glist_isvisible(x->x_gui.x_glist))
-      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
+    if (glist_isvisible(x->x_gui.x_glist))
+      room_sim_3d_draw_map(x, x->x_gui.x_glist);
+//      (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
   }
 }
 
-static void *room_sim_3d_new(t_symbol *s, int argc, t_atom *argv)
+/* we may no longer need h_dragon... */
+static void room_sim_3d__clickhook(t_scalehandle *sh, int newstate)
+{
+    t_room_sim_3d *x = (t_room_sim_3d *)(sh->h_master);
+    if (newstate)
+    {
+        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
+        if (!sh->h_scale) /* click on a label handle */
+            scalehandle_click_label(sh);
+    }
+    /* We no longer need this "clickhook", as we can handle the dragging
+       either in the GUI (for the label handle) or or in canvas_doclick */
+    //iemgui__clickhook3(sh,newstate);
+    sh->h_dragon = newstate;
+}
+
+static void room_sim_3d__motionhook(t_scalehandle *sh,
+                    t_floatarg mouse_x, t_floatarg mouse_y)
+{
+    if (sh->h_scale)
+    {
+        t_room_sim_3d *x = (t_room_sim_3d *)(sh->h_master);
+        int width = mouse_x - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist),
+            height = mouse_y - text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist),
+            minx = IEM_GUI_MINSIZE,
+            miny = IEM_GUI_MINSIZE;
+        x->x_gui.x_w = maxi(width, minx);
+        x->x_gui.x_h = maxi(height, miny);
+//        slider_check_length(x, x->x_orient ? x->x_gui.x_h : x->x_gui.x_w);
+        if (glist_isvisible(x->x_gui.x_glist))
+        {
+            room_sim_3d_draw_unmap(x, x->x_gui.x_glist);
+            room_sim_3d_draw_map(x, x->x_gui.x_glist);
+            scalehandle_unclick_scale(sh);
+        }
+
+        int properties = gfxstub_haveproperties((void *)x);
+        if (properties)
+        {
+            /* No properties for room_sim externals atm */
+            //properties_set_field_int(properties,"width",new_w);
+            //properties_set_field_int(properties,"height",new_h);
+        }
+    }
+    scalehandle_dragon_label(sh,mouse_x, mouse_y);
+}
+
+/* from the old header... */
+#define IEM_GUI_COLNR_GREEN          16
+#define IEM_GUI_COLNR_D_ORANGE       24
+
+void *room_sim_3d_new(t_symbol *s, int argc, t_atom *argv)
 {
   t_room_sim_3d *x = (t_room_sim_3d *)pd_new(room_sim_3d_class);
   int i, j, n=1, c;
@@ -888,7 +1082,7 @@ static void *room_sim_3d_new(t_symbol *s, int argc, t_atom *argv)
     x->x_pix_src_y[0] = 200;
     x->x_pix_src_z[0] = 42;
     j = 0;
-    for(i=1; i<=n; i++)
+    for (i = 1; i <= n; i++)
     {
       x->x_col_src[i] = simularca_color_hex[j];
       if(i & 1)
@@ -915,6 +1109,15 @@ static void *room_sim_3d_new(t_symbol *s, int argc, t_atom *argv)
   
   x->x_s_head_xyz = gensym("head_xyz");
   x->x_s_src_xyz = gensym("src_xyz");
+
+  x->x_gui.x_lab = s_empty;
+
+  x->x_gui.x_obj.te_iemgui = 1;
+  x->x_gui.x_handle = scalehandle_new((t_object *)x,
+      x->x_gui.x_glist, 1, room_sim_3d__clickhook, room_sim_3d__motionhook);
+  x->x_gui.x_lhandle = scalehandle_new((t_object *)x,
+      x->x_gui.x_glist, 0, room_sim_3d__clickhook, room_sim_3d__motionhook);
+
   return (x);
 }
 
@@ -949,6 +1152,7 @@ void room_sim_3d_setup(void)
   class_addmethod(room_sim_3d_class, (t_method)room_sim_3d_nr_src, gensym("nr_src"), A_DEFFLOAT, 0);
   
   room_sim_3d_widgetbehavior.w_getrectfn = room_sim_3d_getrect;
+  room_sim_3d_widgetbehavior.w_displacefnwtag = iemgui_displace_withtag;
   room_sim_3d_widgetbehavior.w_displacefn = iemgui_displace;
   room_sim_3d_widgetbehavior.w_selectfn = iemgui_select;
   room_sim_3d_widgetbehavior.w_activatefn = NULL;
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index e40a3072c64c9bfdede723e6f138b894c7714e40..2fbc10f8115826694448d6a994360df3a1ecf5de 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -4208,6 +4208,156 @@ function gui_turn_mknob(cid, tag, x1, y1, x2, y2) {
     });
 }
 
+// room_sim_2d and room_sim_3d objects from iemlib
+function gui_room_sim_new(cid, tag, x, y, w, h, is_toplevel) {
+    gui(cid).get_elem("patchsvg", function(svg_elem) {
+        gui_gobj_new(cid, tag, "obj", x, y, is_toplevel);
+    });
+    gui(cid).get_gobj(tag)
+    .append(function(frag) {
+//        frag.appendChild(line);
+        return frag;
+    });
+}
+
+function gui_room_sim_map(cid, tag, w, h, rad, head, xpix, ypix, fontsize,
+    fcol, bcol, src_array, r3d) {
+    gui(cid).get_gobj(tag, function(e) {
+        gui_text_draw_border(cid, tag, 0, 0, w, h);
+        // Set the style for the background directly... otherwise the
+        // default theme bgcolor will be used
+        e.querySelector(".border").style.fill = bcol;
+    })
+    .append(function(frag) {
+        var x1 = xpix - rad,
+            x2 = xpix + rad - 1,
+            y1 = ypix - rad,
+            y2 = ypix + rad - 1,
+            dx = -((rad * Math.sin(head * 0.0174533) + 0.49999)|0),
+            dy = -((rad * Math.cos(head * 0.0174533) + 0.49999)|0),
+            i,
+            text;
+        for (i = 0; i < src_array.length; i++) {
+            text = create_item(cid, "text", {
+                x: src_array[i][0],
+                y: src_array[i][1],
+                fill: src_array[i][2],
+                "font-size": fontsize,
+                "dominant-baseline": "middle"
+            });
+            text.textContent = (i + 1).toString();
+            frag.appendChild(text);
+        }
+        var ellipse = create_item(cid, "ellipse", {
+            cx: (x2 - x1) * 0.5 + x1,
+            cy: (y2 - y1) * 0.5 + y1,
+            rx: (x2 - x1) * 0.5,
+            ry: (y2 - y1) * 0.5,
+            "stroke-width": 1,
+            "stroke": fcol,
+            "fill": "none"
+        }),
+        ellipse2 = create_item(cid, "ellipse", {
+            // for room_sim_3d
+            cx: r3d ? (r3d[2] - r3d[0]) * 0.5 + r3d[0] : 0,
+            cy: r3d ? (r3d[3] - r3d[1]) * 0.5 + r3d[1] : 0,
+            rx: r3d ? (r3d[2] - r3d[0]) * 0.5 : 0,
+            ry: r3d ? (r3d[3] - r3d[1]) * 0.5 : 0,
+            "stroke-width": 1,
+            stroke: fcol,
+            fill: "none"
+        }),
+        line = create_item(cid, "line", {
+            x1: xpix,
+            y1: ypix,
+            x2: xpix + dx,
+            y2: ypix + dy,
+            "stroke-width": 3,
+            stroke: fcol
+        });
+        frag.appendChild(ellipse);
+        frag.appendChild(ellipse2);
+        frag.appendChild(line);
+        return frag;
+    })
+}
+
+function gui_room_sim_update_src(cid, tag, i, x, y, font_size, col) {
+    gui(cid).get_gobj(tag, function(e) {
+        var a = e.querySelectorAll("text");
+        if (a.length && i < a.length) {
+            configure_item(a[i], {
+                x: x,
+                y: y,
+                "font-size": font_size,
+                fill: col
+            });
+        }
+    });
+}
+
+function gui_room_sim_update(cid, tag, x0, y0, dx, dy, pixrad) {
+    gui(cid).get_gobj(tag)
+    .q("line", {
+        x1: x0,
+        y1: y0,
+        x2: x0 + dx,
+        y2: y0 + dy
+    })
+    .q("ellipse", {
+        rx: ((x0 + pixrad - 1) - (x0 - pixrad)) * 0.5,
+        ry: ((y0 + pixrad - 1) - (y0 - pixrad)) * 0.5,
+        cx: ((x0 + pixrad - 1) - (x0 - pixrad)) * 0.5 + (x0 - pixrad),
+        cy: ((y0 + pixrad - 1) - (y0 - pixrad)) * 0.5 + (y0 - pixrad),
+    });
+}
+
+// for room_sim_3d
+function gui_room_sim_head2(cid, tag, x1, y1, x2, y2) {
+    gui(cid).get_gobj(tag, function(e) {
+        configure_item(e.querySelectorAll("ellipse")[1], {
+            rx: (x2 - x1) * 0.5,
+            ry: (y2 - y1) * 0.5,
+            cx: (x2 - x1) * 0.5 + x1,
+            cy: (y2 - y1) * 0.5 + y1
+        });
+    });
+}
+
+function gui_room_sim_fontsize(cid, tag, i, size) {
+    gui(cid).get_gobj(tag, function(e) {
+        var i, a;
+        a = e.querySelectorAll("text");
+        if (a.length) {
+            for (i = 0; i < a.length; i++) {
+                configure_item(a[i], {
+                    "font-size": size
+                });
+            }
+        }
+    });
+}
+
+// for the dial thingy
+function gui_room_sim_colors(cid, tag, fg, bg) {
+    gui(cid).get_gobj(tag)
+    .q("ellipse", {
+        stroke: fg
+    })
+    .q("line", {
+        stroke: fg
+    })
+    .q(".border", function(e) {
+        e.style.fill = bg;
+    });
+}
+
+function gui_room_sim_erase(cid, tag) {
+    gui(cid).get_gobj(tag, function(e) {
+        e.innerHTML = "";
+    });
+}
+
 function add_popup(cid, popup) {
     popup_menu[cid] = popup;
 }