diff --git a/Nasal/canvas/gui.nas b/Nasal/canvas/gui.nas
index c1f0cf5a4..e86bcca2d 100644
--- a/Nasal/canvas/gui.nas
+++ b/Nasal/canvas/gui.nas
@@ -209,13 +209,21 @@ var Window = {
     gui.focused_window = nil;
     return me;
   },
-  setPosition: func(x, y)
+  setPosition: func
   {
+    if( size(arg) == 1 )
+      var arg = arg[0];
+    var (x, y) = arg;
+
     me.setInt("tf/t[0]", x);
     me.setInt("tf/t[1]", y);
   },
-  setSize: func(w, h)
+  setSize: func
   {
+    if( size(arg) == 1 )
+      var arg = arg[0];
+    var (w, h) = arg;
+
     me.set("content-size[0]", w);
     me.set("content-size[1]", h);
 
@@ -224,8 +232,12 @@ var Window = {
 
     return me;
   },
-  move: func(x, y)
+  move: func
   {
+    if( size(arg) == 1 )
+      var arg = arg[0];
+    var (x, y) = arg;
+
     me.setInt("tf/t[0]", me.get("tf/t[0]", 10) + x);
     me.setInt("tf/t[1]", me.get("tf/t[1]", 30) + y);
   },
diff --git a/Nasal/canvas/gui/dialogs/AircraftCenter.nas b/Nasal/canvas/gui/dialogs/AircraftCenter.nas
index 926dac140..c63bf803e 100644
--- a/Nasal/canvas/gui/dialogs/AircraftCenter.nas
+++ b/Nasal/canvas/gui/dialogs/AircraftCenter.nas
@@ -122,39 +122,35 @@ var AircraftCenter = {
       (func {
         var p = package;
         var b = gui.widgets.Button.new(me._scroll_content, style, {});
-        var installed = p.installed;
         var install_text = sprintf("Install (%.1fMB)", p.fileSize/1024/1024);
 
-        if( installed )
+        if( p.installed )
           b.setText("Remove");
         else
           b.setText(install_text);
 
         b.listen("clicked", func
         {
-          if( installed )
+          if( p.installed )
           {
             p.uninstall();
-            installed = 0;
             b.setText(install_text);
           }
           else
           {
-            b.setEnabled(0)
-             .setText("Wait...");
-            p.install()
-             .progress(func(i, cur, total)
-               b.setText(sprintf("%.1f%%", (cur / total) * 100))
-             )
-             .fail(func b.setText('Failed'))
-             .done(func {
-               installed = 1;
-               b.setText("Remove")
-                .setEnabled(1);
-             });
+            b.setText("Wait...").setEnabled(0);
+            p.install();
           }
         });
 
+        p.existingInstall(func(pkg, ins) {
+          ins.progress(func(i, cur, total)
+            b.setText(sprintf("%.1f%%", (cur / total) * 100))
+          );
+          ins.fail(func b.setText('Failed'));
+          ins.done(func b.setText("Remove").setEnabled(1));
+        });
+
         title_box.addItem(b);
       })();
 
diff --git a/Nasal/canvas/gui/widgets/Button.nas b/Nasal/canvas/gui/widgets/Button.nas
index c388a2aee..03ba3a5e2 100644
--- a/Nasal/canvas/gui/widgets/Button.nas
+++ b/Nasal/canvas/gui/widgets/Button.nas
@@ -15,7 +15,8 @@ gui.widgets.Button = {
   },
   setText: func(text)
   {
-    me._view.setText(me, text);
+    if( me._view != nil )
+      me._view.setText(me, text);
     return me;
   },
   setCheckable: func(checkable)