diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 0b582fd9bbe201c9cc5ff49346f786ee7787659b..977beb922f1d7740fe6152e7b45801eb0b70a142 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -1080,6 +1080,11 @@ function nw_create_patch_window_menus(gui, w, name) {
         click: function (evt) {
             if (canvas_events.get_state() === "normal") {
                 pdgui.pdsend(name, "selectall");
+            } else if (process.os === "darwin") {
+                // big kluge for OSX to select all inside a
+                // contenteditable element (needed because
+                // the stupid MacBuiltin is buggy-- see pd_menus.js)
+                document.execCommand("selectAll", false, null);
             }
         }
     });
diff --git a/pd/nw/pd_menus.js b/pd/nw/pd_menus.js
index 9342be9849df80e3be09685f87e0b719565b00d8..a839d3149ce23676da20cdac463f02679098a31e 100644
--- a/pd/nw/pd_menus.js
+++ b/pd/nw/pd_menus.js
@@ -152,7 +152,18 @@ function create_menu(gui, type) {
         // There's no "Delete" item for GNU/Linux or Windows--
         // not sure yet what to do with it.
         m.edit.delete = window_menu.items[1].submenu.items[6];
+        // The MacBuiltin "Select All" doesn't propagate down to the DOM
+        //on OSX, so we have to remove it
         m.edit.selectall= window_menu.items[1].submenu.items[7];
+        window_menu.items[1].submenu.remove(m.edit.selectall);
+        // Now we replace it with a custom "Select All" which will
+        // propagate to the DOM...
+        edit_menu.append(m.edit.selectall = new gui.MenuItem({
+            label: l("menu.selectall"),
+            tooltip: l("menu.selectall_tt"),
+            key: "a",
+            modifiers: cmd_or_ctrl
+        }));
     } else {
         edit_menu = new gui.Menu();
         // Edit sub-entries