diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index ce268c4642083e4e6665ccdfacd9e3394ed05353..77d60d8491433c3134aedce94edee234f39009ca 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -549,7 +549,7 @@ var canvas_events = (function() {
             },
             text_mousedown: function(evt) {
                 if (evt.target.parentNode === ac_dropdown()) {
-                    last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results);
+                    last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, 0);
                     last_yanked = "";
                     // ag: Don't do the usual object instantiation thing if
                     // we've clicked on the autocompletion dropdown. This
@@ -605,7 +605,7 @@ var canvas_events = (function() {
                         if(ac_dropdown() === null || ac_dropdown().getAttribute("selected_item") === "-1") {
                             grow_svg_for_element(textbox());
                         } else { // else, if there is a selected item on autocompletion tool, the selected item is written on the box
-                            last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results);
+                            last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, 0);
                             caret_end();
                             // No need to instantiate the object here,
                             // presumably the user wants to go on editing.
@@ -613,7 +613,7 @@ var canvas_events = (function() {
                         last_yanked = "";
                         break;
                     case 9: // tab
-                        last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results);
+                        last_completed = pdgui.select_result_autocomplete_dd(textbox(), ac_dropdown(), last_completed, last_results, evt.shiftKey?-1:1);
                         last_yanked = "";
                         caret_end();
                         break;
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index ebeb39449e5fec6ae88f37347f20af91d208b2c7..0bdf7d624b608970c0624ccee527709dec643e6c 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -716,7 +716,7 @@ function update_autocomplete_dd_arrowup(ac_dropdown) {
     }
 }
 
-function select_result_autocomplete_dd(textbox, ac_dropdown, last, res) {
+function select_result_autocomplete_dd(textbox, ac_dropdown, last, res, dir) {
     if (ac_dropdown !== null) {
         let sel = ac_dropdown.getAttribute("selected_item");
         if (sel > -1) {
@@ -725,7 +725,7 @@ function select_result_autocomplete_dd(textbox, ac_dropdown, last, res) {
             return sel;
         } else { // it only passes here when the user presses 'tab' and there is no option selected
             var n = res.length;
-            var next = (last+1) % n;
+            var next = (dir==0 ? last : dir>0 ? last+1 : last<=0 ? n-1 : last-1) % n;
             textbox.innerText = res[next];
             return next;
         }