diff --git a/pd/nw/css/default.css b/pd/nw/css/default.css
index b58290b90e7d76f6f8dc1d771f21e7c3182b807b..ed7dc50d49a49b5ceb9b30a2f32b39ed46dc5642 100644
--- a/pd/nw/css/default.css
+++ b/pd/nw/css/default.css
@@ -316,10 +316,16 @@ p.msg::after {
 
 /* not sure what this is doing here... */
 text {
-    // fill: red;
+    //fill: red;
     //cursor: default;
 }
 
+/* not sure what this is doing here... */
+text.activated {
+    fill: red;
+    cursor: default;
+}
+
 /* not sure if this is still needed...
    updated the coloring just in case */
 .selected_border {
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 880525bab66ae4e0d19f03ab5eedc61dd9f8c786..a9ad5b511baf63a2235047cd90d3dcffda8e7be4 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -2670,6 +2670,22 @@ function gui_text_set (cid, tag, text) {
     });
 }
 
+function gui_text_set_mynumbox (cid, tag, text, active) {
+    gui(cid).get_elem(tag + "text", function(e) {
+        //post("guit_text_set_activate " + tag + " " + text + " " + active);
+        text = text.trim();
+        e.textContent = "";
+        text_to_tspans(cid, e, text);
+        if (active === 2) {
+            e.classList.remove("activated");
+        } else if (active === 1) {
+            e.classList.add("activated");
+        } else {
+            e.classList.remove("activated");           
+        }
+    });
+}
+
 function gui_text_redraw_border(cid, tag, width, height) {
     // Hm, need to figure out how to refactor to get rid of
     // configure_item call...
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index 80d3a66f9514376bbb8f97dc086d4404749b2a3c..4de6d1187953a89da778c721d7a0da0779791d57 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -26,23 +26,40 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist);
 t_widgetbehavior my_numbox_widgetbehavior;
 /*static*/ t_class *my_numbox_class;
 
+static t_symbol *numbox_keyname_sym_a;
+
 static void my_numbox_tick_reset(t_my_numbox *x)
 {
-    //printf("tick_reset\n");
+    //post("tick_reset\n");
     if(x->x_gui.x_change && x->x_gui.x_glist)
     {
-        //printf("    success\n");
-        x->x_gui.x_change = 0;
+        //post("    success\n");
+        my_numbox_set_change(x, 0);
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
     }
 }
 
 static void my_numbox_tick_wait(t_my_numbox *x)
 {
-    //printf("tick_wait\n");
+    //post("tick_wait\n");
     sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
 }
 
+// to enable ability to change values using arrow keys (only when focused)
+void my_numbox_set_change(t_my_numbox *x, t_floatarg f)
+{
+    if (f == 0 && x->x_gui.x_change != 0)
+    {
+        x->x_gui.x_change = 0;
+        pd_unbind(&x->x_gui.x_obj.ob_pd, numbox_keyname_sym_a);
+    }
+    else if (f == 1 && x->x_gui.x_change != 1)
+    {
+        x->x_gui.x_change = 1;
+        pd_bind(&x->x_gui.x_obj.ob_pd, numbox_keyname_sym_a);        
+    }
+}
+
 void my_numbox_clip(t_my_numbox *x)
 {
     if(x->x_val < x->x_min)
@@ -143,19 +160,23 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
         x->x_buf[sl+1] = 0;
         if(sl >= x->x_gui.x_w)
             cp += sl - x->x_gui.x_w + 1;
-        gui_vmess("gui_text_set", "xxs",
+        gui_vmess("gui_text_set_mynumbox", "xxsi",
             glist_getcanvas(glist),
             x,
-            cp);
+            cp,
+            1);
         x->x_buf[sl] = 0;
     }
     else
     {
         my_numbox_ftoa(x); /* mmm... side-effects */
-        gui_vmess("gui_text_set", "xxs",
+        gui_vmess("gui_text_set_mynumbox", "xxsi",
             glist_getcanvas(glist),
             x,
-            x->x_buf);
+            x->x_buf,
+            x->x_gui.x_selected == glist_getcanvas(glist) && 
+                !x->x_gui.x_change && x->x_gui.x_glist == glist_getcanvas(glist) ?
+                2 : (x->x_gui.x_change ? 1 : 0));
         x->x_buf[0] = 0; /* mmm... more side-effects... no clue why we'd need
                             to mutate a struct member in order to draw stuff */
     }
@@ -253,7 +274,7 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
     int issel = x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas;
     if(x->x_gui.x_selected && x->x_gui.x_change)
     {
-        x->x_gui.x_change = 0;
+        my_numbox_set_change(x, 0);
         clock_unset(x->x_clock_reset);
         x->x_buf[0] = 0;
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
@@ -393,7 +414,7 @@ static void my_numbox_save(t_gobj *z, t_binbuf *b)
     iemgui_save(&x->x_gui, srl, bflcol);
     if(x->x_gui.x_change)
     {
-        x->x_gui.x_change = 0;
+        my_numbox_set_change(x, 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);
@@ -456,7 +477,7 @@ static void my_numbox_properties(t_gobj *z, t_glist *owner)
     iemgui_properties(&x->x_gui, srl);
     if(x->x_gui.x_change)
     {
-        x->x_gui.x_change = 0;
+        my_numbox_set_change(x, 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);
@@ -557,11 +578,13 @@ static void my_numbox_motion(t_my_numbox *x, t_floatarg dx, t_floatarg dy)
         my_numbox_bang(x);
     }
     clock_unset(x->x_clock_reset);
+    clock_delay(x->x_clock_reset, 3000);
 }
 
 static void my_numbox_click(t_my_numbox *x, t_floatarg xpos, t_floatarg ypos,
                             t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
 {
+	//post("my_numbox_click");
     glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g,
         (t_glistmotionfn)my_numbox_motion, my_numbox_key, xpos, ypos);
 }
@@ -570,7 +593,7 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist,
     int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
     t_my_numbox* x = (t_my_numbox *)z;
-
+    //post("my_numbox_newclick %d", doit);
     if(doit)
     {
         //printf("newclick doit\n");
@@ -584,15 +607,16 @@ static int my_numbox_newclick(t_gobj *z, struct _glist *glist,
         {
             //printf("    change=0\n");
             clock_delay(x->x_clock_wait, 50);
-            x->x_gui.x_change = 1;
+            my_numbox_set_change(x, 1);
             clock_delay(x->x_clock_reset, 3000);
 
             x->x_buf[0] = 0;
+            sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         }
         else
         {
             //printf("    change=1\n");
-            x->x_gui.x_change = 0;
+            my_numbox_set_change(x, 0);
             clock_unset(x->x_clock_reset);
             x->x_buf[0] = 0;
             x->x_gui.x_changed = 1;
@@ -700,13 +724,24 @@ static void my_numbox_loadbang(t_my_numbox *x, t_floatarg action)
 static void my_numbox_key(void *z, t_floatarg fkey)
 {
     t_my_numbox *x = z;
+
+    // this is used for arrow up and down
+    if (fkey == -1)
+    {
+        clock_unset(x->x_clock_reset);
+        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);
+        return;
+    }
+
     char c=fkey;
     char buf[3];
     buf[1] = 0;
 
     if (c == 0)
     {
-        x->x_gui.x_change = 0;
+        my_numbox_set_change(x, 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);
@@ -737,7 +772,7 @@ static void my_numbox_key(void *z, t_floatarg fkey)
     {
         x->x_val = atof(x->x_buf);
         x->x_buf[0] = 0;
-        x->x_gui.x_change = 0;
+        my_numbox_set_change(x, 1);
         clock_unset(x->x_clock_reset);
         my_numbox_clip(x);
         my_numbox_bang(x);
@@ -749,11 +784,63 @@ static void my_numbox_key(void *z, t_floatarg fkey)
 
 static void my_numbox_list(t_my_numbox *x, t_symbol *s, int ac, t_atom *av)
 {
-    if (IS_A_FLOAT(av,0))
+    int i;
+    int isKey = 0;
+    t_floatarg val;
+
+    for (i=0; i < ac; i++)
+    {
+        if (!IS_A_FLOAT(av,i))
+        {
+            isKey = 1;
+            break;
+        }
+    }
+    if (!isKey)
     {
         my_numbox_set(x, atom_getfloatarg(0, ac, av));
         my_numbox_bang(x);
     }
+    else if (ac == 2 && x->x_gui.x_change == 1 && IS_A_FLOAT(av,0) && IS_A_SYMBOL(av,1) && av[0].a_w.w_float == 1)
+    {
+        fprintf(stderr,"got keyname %s while grabbed\n", av[1].a_w.w_symbol->s_name);
+        if (!strcmp("Up", av[1].a_w.w_symbol->s_name))
+        {
+            //fprintf(stderr,"...Up\n");
+            if(x->x_buf[0] == 0 && x->x_val != 0)
+                sprintf(x->x_buf, "%g", x->x_val+1);
+            else
+                sprintf(x->x_buf, "%g", atof(x->x_buf) + 1);
+            my_numbox_key((void *)x, -1);
+        }
+        else if (!strcmp("ShiftUp", av[1].a_w.w_symbol->s_name))
+        {
+            //fprintf(stderr,"...ShiftUp\n");
+            if(x->x_buf[0] == 0 && x->x_val != 0)
+                sprintf(x->x_buf, "%g", x->x_val+0.01);
+            else
+                sprintf(x->x_buf, "%g", atof(x->x_buf) + 0.01);
+            my_numbox_key((void *)x, -1);
+        }
+        else if (!strcmp("Down", av[1].a_w.w_symbol->s_name))
+        {
+            //fprintf(stderr,"...Down\n");
+            if(x->x_buf[0] == 0 && x->x_val != 0)
+                sprintf(x->x_buf, "%g", x->x_val-1);
+            else
+                sprintf(x->x_buf, "%g", atof(x->x_buf) - 1);
+            my_numbox_key((void *)x, -1);
+        }
+        else if (!strcmp("ShiftDown", av[1].a_w.w_symbol->s_name))
+        {
+            //fprintf(stderr,"...ShiftDown\n");
+            if(x->x_buf[0] == 0 && x->x_val != 0)
+                sprintf(x->x_buf, "%g", x->x_val-0.01);
+            else
+                sprintf(x->x_buf, "%g", atof(x->x_buf) - 0.01);
+            my_numbox_key((void *)x, -1);
+        }
+    }
 }
 
 static void *my_numbox_new(t_symbol *s, int argc, t_atom *argv)
@@ -838,6 +925,7 @@ static void my_numbox_free(t_my_numbox *x)
 {
     if(iemgui_has_rcv(&x->x_gui))
         pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
+    my_numbox_set_change(x, 0);
     clock_free(x->x_clock_reset);
     clock_free(x->x_clock_wait);
     gfxstub_deleteforkey(x);
@@ -881,6 +969,8 @@ void g_numbox_setup(void)
     class_addmethod(my_numbox_class, (t_method)my_numbox_hide_frame,
         gensym("hide_frame"), A_FLOAT, 0);
 
+    numbox_keyname_sym_a = gensym("#keyname_a");
+
     wb_init(&my_numbox_widgetbehavior,my_numbox_getrect,my_numbox_newclick);
     class_setwidget(my_numbox_class, &my_numbox_widgetbehavior);
     class_sethelpsymbol(my_numbox_class, gensym("numbox2"));