diff --git a/Nasal/gui.nas b/Nasal/gui.nas
index a66425223..fc5c90ed1 100644
--- a/Nasal/gui.nas
+++ b/Nasal/gui.nas
@@ -544,47 +544,48 @@ var OverlaySelector = {
 #
 var FileSelector = {
     new: func(callback, title, button, pattern = nil, dir = "", file = "", dotfiles = 0, show_files=1) {
-        var name = "file-select-";
-        var data = props.globals.getNode("/sim/gui/dialogs/", 1);
-        for (var i = 1; 1; i += 1)
-            if (data.getNode(name ~ i, 0) == nil)
-                break;
-        data = data.getNode(name ~= i, 1);
-
-        var m = Dialog.new(data.getNode("dialog", 1), "gui/dialogs/file-select.xml", name);
-        m.parents = [FileSelector, Dialog];
-        m.data = data;
+        
+        
+        var usage = gui.FILE_DIALOG_OPEN_FILE;
+        if (!show_files) {
+            usage = gui.FILE_DIALOG_CHOOSE_DIR;
+        } else if (button == 'Save') {
+            # nasty, should make this explicit
+            usage = gui.FILE_DIALOG_SAVE_FILE;
+        }
+        
+        m = { parents:[FileSelector],
+             _inner: gui._createFileDialog(usage)};
+        
         m.set_title(title);
         m.set_button(button);
         m.set_directory(dir);
         m.set_file(file);
-        m.set_show_files(show_files);
         m.set_dotfiles(dotfiles);
         m.set_pattern(pattern);
-        m.cblistener = setlistener(data.getNode("path", 1), callback);
+        
+        m._inner.setCallback(func (path) {  
+            var node = props.Node.new();
+            node.setValue(path);
+            callback(node); 
+        }   );
+        
         return m;
     },
     # setters only take effect after the next call to open()
-    set_title: func(title) { me.data.getNode("title", 1).setValue(title) },
-    set_button: func(button) { me.data.getNode("button", 1).setValue(button) },
-    set_directory: func(dir) { me.data.getNode("directory", 1).setValue(dir) },
-    set_file: func(file) { me.data.getNode("selection", 1).setValue(file) },
-    set_show_files: func(show) { me.data.getNode("show-files", 1).setValue(show) },
-    set_dotfiles: func(dot) { me.data.getNode("dotfiles", 1).setBoolValue(dot) },
-    set_pattern: func(pattern) {
-        me.data.removeChildren("pattern");
-        if (pattern != nil)
-            forindex (var i; pattern)
-                me.data.getChild("pattern", i, 1).setValue(pattern[i]);
-    },
+    set_title: func(title) { me._inner.title = title },
+    set_button: func(button) { me._inner.button = button },
+    set_directory: func(dir) { me._inner.directory = directory },
+    set_file: func(file) { me._inner.placeholder = file },
+    set_dotfiles: func(dot) { me._inner.show_hidden = dot },
+    set_pattern: func(pattern) { me._inner.pattern = (pattern == nil) ? [] : pattern },
+    
+    open: func() { me._inner.open(); },
+    close: func() { me._inner.close(); },
+    
     del: func {
-        me.close();
-        delete(me.instance, me.name);
-        removelistener(me.cblistener);
-        me.data.remove();
-        # call inherited 'del'
-        me.parents = subvec(me.parents,1);
-        me.del();
+        me._inner.close();
+        me._inner = nil;
     },
 };