diff --git a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java
index e3e923dafbda1c026a77fb099b621a277ff5b6e7..1b359a7e4d9685ac79fe96a72975e15a96c33962 100644
--- a/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java
+++ b/src/main/java/org/nrg/xnat/helpers/prearchive/PrearcDatabase.java
@@ -33,7 +33,6 @@ import org.nrg.xdat.bean.XnatPetsessiondataBean;
 import org.nrg.xdat.model.XnatImagescandataI;
 import org.nrg.xdat.model.XnatPetscandataI;
 import org.nrg.xdat.om.XnatExperimentdata;
-import org.nrg.xdat.preferences.InitializerSiteConfiguration;
 import org.nrg.xdat.preferences.SiteConfigPreferences;
 import org.nrg.xft.db.PoolDBUtils;
 import org.nrg.xft.exception.DBPoolException;
@@ -44,8 +43,6 @@ import org.nrg.xnat.helpers.prearchive.PrearcUtils.PrearcStatus;
 import org.nrg.xnat.restlet.XNATApplication;
 import org.nrg.xnat.restlet.actions.PrearcImporterA.PrearcSession;
 import org.nrg.xnat.restlet.services.Archiver;
-import org.nrg.xnat.turbine.utils.ArcSpecManager;
-
 import org.nrg.xnat.utils.XnatUserProvider;
 import org.restlet.data.Status;
 import org.slf4j.Logger;
@@ -540,7 +537,7 @@ public final class PrearcDatabase {
 
                             PrearcDatabase.addSession(sessionData);
 
-                            PrearcUtils.log(sessionData, new Exception(String.format("Moved from %1s to %2s", proj, destination)));
+                            PrearcUtils.log(sessionData, new Exception(String.format("Moved from %1$s to %2$s", proj, destination)));
                         } catch (SyncFailedException e) {
                             logger.error("Session sync operation failed", e);
                             throw new IllegalStateException(e.getMessage());
diff --git a/src/main/java/org/nrg/xnat/restlet/projectResource/extensions/ProjectPermissionsFilter.java b/src/main/java/org/nrg/xnat/restlet/projectResource/extensions/ProjectPermissionsFilter.java
index ed2d4db211b261795a96f6de55db2d39931ba171..65e1d84886ed0cffe5b890971d39c914cb7f3476 100644
--- a/src/main/java/org/nrg/xnat/restlet/projectResource/extensions/ProjectPermissionsFilter.java
+++ b/src/main/java/org/nrg/xnat/restlet/projectResource/extensions/ProjectPermissionsFilter.java
@@ -1,7 +1,5 @@
 package org.nrg.xnat.restlet.projectResource.extensions;
 
-import java.util.Hashtable;
-
 import org.nrg.xdat.security.helpers.Groups;
 import org.nrg.xft.XFTTable;
 import org.nrg.xnat.restlet.resources.ProjectResource;
@@ -10,6 +8,8 @@ import org.nrg.xnat.restlet.resources.SecureResource.FilteredResourceHandlerI;
 import org.restlet.resource.Representation;
 import org.restlet.resource.Variant;
 
+import java.util.Hashtable;
+
 @SuppressWarnings("unused")
 public class ProjectPermissionsFilter implements FilteredResourceHandlerI{
 
@@ -23,9 +23,9 @@ public class ProjectPermissionsFilter implements FilteredResourceHandlerI{
 		ProjectResource projResource=(ProjectResource)resource;
 		StringBuilder builder=new StringBuilder();
         if(Groups.isMember(resource.user,"ALL_DATA_ADMIN")){
-        	 builder.append(String.format("SELECT DISTINCT element_name FROM xdat_element_access xea JOIN xdat_field_mapping_set xfms ON xea.xdat_element_access_id=xfms.permissions_allow_set_xdat_elem_xdat_element_access_id JOIN xdat_field_mapping xfm ON xfms.xdat_field_mapping_set_id=xfm.xdat_field_mapping_set_xdat_field_mapping_set_id WHERE create_element=1 AND field_value='%1s' and field !=''", projResource.getProjectId()));
+        	 builder.append(String.format("SELECT DISTINCT element_name FROM xdat_element_access xea JOIN xdat_field_mapping_set xfms ON xea.xdat_element_access_id=xfms.permissions_allow_set_xdat_elem_xdat_element_access_id JOIN xdat_field_mapping xfm ON xfms.xdat_field_mapping_set_id=xfm.xdat_field_mapping_set_xdat_field_mapping_set_id WHERE create_element=1 AND field_value='%1$s' and field !=''", projResource.getProjectId()));
         }else{
-        	 builder.append(String.format("SELECT DISTINCT element_name FROM xdat_user_groupID map JOIN xdat_userGroup gp ON map.groupid=gp.id JOIN xdat_element_access xea ON gp.xdat_usergroup_id=xea.xdat_usergroup_xdat_usergroup_id JOIN xdat_field_mapping_set xfms ON xea.xdat_element_access_id=xfms.permissions_allow_set_xdat_elem_xdat_element_access_id JOIN xdat_field_mapping xfm ON xfms.xdat_field_mapping_set_id=xfm.xdat_field_mapping_set_xdat_field_mapping_set_id WHERE map.groups_groupid_xdat_user_xdat_user_id=%1s  AND create_element=1 AND field_value='%2s' and field !=''",resource.user.getID(),projResource.getProjectId()));
+        	 builder.append(String.format("SELECT DISTINCT element_name FROM xdat_user_groupID map JOIN xdat_userGroup gp ON map.groupid=gp.id JOIN xdat_element_access xea ON gp.xdat_usergroup_id=xea.xdat_usergroup_xdat_usergroup_id JOIN xdat_field_mapping_set xfms ON xea.xdat_element_access_id=xfms.permissions_allow_set_xdat_elem_xdat_element_access_id JOIN xdat_field_mapping xfm ON xfms.xdat_field_mapping_set_id=xfm.xdat_field_mapping_set_xdat_field_mapping_set_id WHERE map.groups_groupid_xdat_user_xdat_user_id=%1$s  AND create_element=1 AND field_value='%2$s' and field !=''",resource.user.getID(),projResource.getProjectId()));
         }
    
         return resource.representTable(XFTTable.Execute(builder.toString(), resource.user.getDBName(), resource.userName), resource.overrideVariant(variant), new Hashtable<String,Object>()) ;
diff --git a/src/main/java/org/nrg/xnat/restlet/resources/files/DIRResource.java b/src/main/java/org/nrg/xnat/restlet/resources/files/DIRResource.java
index a3608199b6515df661eab82c8db0f0c6bc20b365..f93495f5bdbb77bf7e93b296c516f946cf598486 100644
--- a/src/main/java/org/nrg/xnat/restlet/resources/files/DIRResource.java
+++ b/src/main/java/org/nrg/xnat/restlet/resources/files/DIRResource.java
@@ -210,7 +210,7 @@ public class DIRResource extends SecureResource {
 					           
 					            final String rel=(session_dir.toURI().relativize(f.toURI())).getPath();
 					            final String qs=(f.isDirectory())?qsParams:"";
-					            row[3]=String.format("/data/experiments/%1s/DIR/%2s%3s", new Object[]{expt.getId(),rel,qs});
+					            row[3]=String.format("/data/experiments/%1$s/DIR/%2$s%3$s",expt.getId(),rel,qs);
 					       				            
 					            table.rows().add(row);
 							}
diff --git a/src/main/webapp/WEB-INF/tags/page/xnat.tag b/src/main/webapp/WEB-INF/tags/page/xnat.tag
index 2fd10120f7a36314bf70c9b2eae45122f7d1a207..58f74b34576d1024129e916945911a2376108685 100644
--- a/src/main/webapp/WEB-INF/tags/page/xnat.tag
+++ b/src/main/webapp/WEB-INF/tags/page/xnat.tag
@@ -679,23 +679,27 @@ ${bodyTop}
 
     loadjs(scriptUrl('xnat/event.js'), function(){
 
+        var clicker = XNAT.event.click('#header_logo, #xnat_power > a');
+
         // shift-click the header or footer XNAT logo to TOGGLE debug mode on/off
+        clicker.shiftKey(function(e){
+            e.preventDefault();
+            if (Cookies.get('debug') === 'on'){
+                Cookies.set('debug', 'off');
+                window.location.hash = 'debug=off';
+            }
+            else {
+                Cookies.set('debug', 'on');
+                window.location.hash = 'debug=on';
+            }
+            window.location.reload();
+        });
+
         // alt-shift-click to open the Swagger page in a new window
-        XNAT.event.click('#header_logo, #xnat_power > a')
-            .shiftKey(function(e){
-                e.preventDefault();
-                if (Cookies.get('debug') === 'on'){
-                    window.location.hash = 'debug=off';
-                }
-                else {
-                    window.location.hash = 'debug=on';
-                }
-                window.location.reload();
-            })
-            .altShift(function(e){
-                e.preventDefault();
-                XNAT.ui.popup(XNAT.url.rootUrl('/xapi/swagger-ui.html'));
-            });
+        clicker.altShift(function(e){
+            e.preventDefault();
+            XNAT.ui.popup(XNAT.url.rootUrl('/xapi/swagger-ui.html'));
+        });
 
     })
 
diff --git a/src/main/webapp/page/admin/content.jsp b/src/main/webapp/page/admin/content.jsp
index ec8aeace85c4ad74be93ae8f903027166a2da393..7f9c30cf28e45fd5dc13c285525acb7a23c8571a 100755
--- a/src/main/webapp/page/admin/content.jsp
+++ b/src/main/webapp/page/admin/content.jsp
@@ -44,8 +44,9 @@
                         delete XNAT.data.siteConfig.targetSource;
 
 
-                        // var jsonUrl = XNAT.url.rootUrl('/page/admin/data/config/site-admin-sample-new.yaml');
+//                      var jsonUrl = XNAT.url.rootUrl('/page/admin/data/config/site-admin-sample-new.yaml');
                         var jsonUrl = XNAT.url.rootUrl('/xapi/spawner/resolve/siteAdmin/adminPage');
+//                        var jsonUrl = XNAT.url.rootUrl('/page/admin/data/site-admin-page.json');
 
                         $.get({
                             url: jsonUrl,
diff --git a/src/main/webapp/page/admin/data/config/site-setup.yaml b/src/main/webapp/page/admin/data/config/site-setup.yaml
index ce68547d6de48c3b63770f1157503d9c1fbd9b11..148468ea220d59ffd833bceec88e74ddfe9016ae 100644
--- a/src/main/webapp/page/admin/data/config/site-setup.yaml
+++ b/src/main/webapp/page/admin/data/config/site-setup.yaml
@@ -33,9 +33,8 @@ siteSetup:
             method: POST
             action: /xapi/siteConfig/batch
             contentType: json
-            load:
-                lookup: XNAT.data.siteConfig
-                refresh: /xapi/siteConfig
+            load: ?? XNAT.data.siteConfig
+            refresh: /xapi/siteConfig
             contents:
 
                 siteId:
@@ -82,9 +81,8 @@ siteSetup:
             method: POST
             action: /xapi/siteConfig/batch
             contentType: json
-            load:
-                lookup: XNAT.data.siteConfig
-                refresh: /xapi/siteConfig
+            load: ?? XNAT.data.siteConfig
+            refresh: /xapi/siteConfig
             contents:
 
                 archivePath:
@@ -145,16 +143,16 @@ siteSetup:
             method: POST
             action: /xapi/siteConfig/smtpServer
             contentType: json
-            load:
-                #lookup: XNAT.data.siteConfig.smtpServer
-                refresh: /xapi/siteConfig/smtpServer
+            load: ?? XNAT.data.siteConfig.smtpServer
+            refresh: /xapi/siteConfig/smtpServer
             contents:
 
                 host:
                     kind: panel.input.text
                     name: host
                     label: Host
-                    value: ?? XNAT.data.siteConfig.smtpServer.host
+#                    value: ?? XNAT.data.siteConfig.smtpServer.host
+                    value: ""
                     placeholder: localhost
                     validation: required
 
@@ -162,7 +160,8 @@ siteSetup:
                     kind: panel.input.number
                     name: port
                     label: Port
-                    value: ?? XNAT.data.siteConfig.smtpServer.port
+#                    value: ?? XNAT.data.siteConfig.smtpServer.port
+                    value: ""
                     placeholder: 25
                     validation: required number
 
@@ -170,19 +169,22 @@ siteSetup:
                     kind: panel.input.text
                     name: username
                     label: Username
-                    value: ?? XNAT.data.siteConfig.smtpServer.username
+#                    value: ?? XNAT.data.siteConfig.smtpServer.username
+                    value: ""
 
                 password:
                     kind: panel.input.password
                     name: password
                     label: Password
-                    value: ?? XNAT.data.siteConfig.smtpServer.password
+#                    value: ?? XNAT.data.siteConfig.smtpServer.password
+                    value: ""
 
                 protocol:
                     kind: panel.input.text
                     name: protocol
                     label: Protocol
-                    value: ?? XNAT.data.siteConfig.smtpServer.protocol
+#                    value: ?? XNAT.data.siteConfig.smtpServer.protocol
+                    value: ""
 
                 mailServerProperties:
                     kind: panel.subhead
@@ -192,16 +194,19 @@ siteSetup:
                     kind: panel.input.checkbox
                     name: mail.smtp.auth
                     label: SMTP Auth?
-                    value: ?? XNAT.data.siteConfig.smtpServer['mail.smtp.auth']
+#                    value: ?? XNAT:data:siteConfig:smtpServer:mail.smtp.auth
+                    value: ""
 
                 smtpStartTls:
                     kind: panel.input.checkbox
                     name: mail.smtp.starttls.enable
                     label: Smart TLS?
-                    value: ?? XNAT.data.siteConfig.smtpServer['mail.smtp.starttls.enable']
+#                    value: ?? XNAT:data:siteConfig:smtpServer:mail.smtp.starttls.enable
+                    value: ""
 
                 smtpSSLTrust:
                     kind: panel.input.text
                     name: mail.smtp.ssl.trust
                     label: SSL Trust
-                    value: ?? XNAT.data.siteConfig.smtpServer['mail.smtp.ssl.trust']
+#                    value: ?? XNAT:data:siteConfig:smtpServer:mail.smtp.ssl.trust
+                    value: ""
diff --git a/src/main/webapp/page/admin/spawner/spawner-admin.js b/src/main/webapp/page/admin/spawner/spawner-admin.js
index 30464ee17213dbfef1eaf7cedf1b45164551ca32..7645623f608631cbedceec1a0a4d0e504f936c3c 100644
--- a/src/main/webapp/page/admin/spawner/spawner-admin.js
+++ b/src/main/webapp/page/admin/spawner/spawner-admin.js
@@ -123,6 +123,7 @@ XNAT.xhr.getJSON({
                                     console.log(obj)
                                 },
                                 okLabel: 'Save Changes',
+                                okClose: false,
                                 okAction: function(obj){
                                     XNAT.xhr.put({
                                         url: elementUrl,
diff --git a/src/main/webapp/scripts/xmodal-v1/xmodal.js b/src/main/webapp/scripts/xmodal-v1/xmodal.js
index 117922845f2ab21c7a3661d9cadf3b48e471e166..d81ab12c7d335b17c28af83fd4e8d74a40012c66 100644
--- a/src/main/webapp/scripts/xmodal-v1/xmodal.js
+++ b/src/main/webapp/scripts/xmodal-v1/xmodal.js
@@ -1352,6 +1352,11 @@ if (typeof jQuery == 'undefined') {
                 opts.id = arg3.id || arg2;
             }
 
+            // don't open a second loader with the same id
+            if (xmodal.modals._ids.indexOf(opts.id) > 0) {
+                return false;
+            }
+
             return xmodal.open(opts);
 
         };
diff --git a/src/main/webapp/scripts/xnat/spawner.js b/src/main/webapp/scripts/xnat/spawner.js
index 98a068fd5da4f6840ad2236538c2992af0296dfd..4e1968c4498acc05f0d0d05c68edcdf9f67450fc 100644
--- a/src/main/webapp/scripts/xnat/spawner.js
+++ b/src/main/webapp/scripts/xnat/spawner.js
@@ -33,6 +33,10 @@ var XNAT = getObject(XNAT);
     // keep track of items that didn't spawn
     spawner.notSpawned = [];
 
+    function setRoot(url){
+        url = url.replace(/^(\.\/+)/, '/');
+        return XNAT.url.rootUrl(url)
+    }
 
     // ==================================================
     // MAIN FUNCTION
@@ -60,6 +64,18 @@ var XNAT = getObject(XNAT);
             // with a fallback to a generic div
             kind = prop.kind || prop.type || 'div.spawned';
 
+            // make 'href' 'src' and 'action' properties
+            // start at the site root if starting with './'
+            if (prop.config.href) {
+                prop.config.href = setRoot(prop.config.href)
+            }
+            if (prop.config.src) {
+                prop.config.src = setRoot(prop.config.src)
+            }
+            if (prop.config.action) {
+                prop.config.action = setRoot(prop.config.action)
+            }
+
             // do a raw spawn() if 'kind' is 'element'
             // or if there's a tag property
             if (kind === 'element' || prop.tag) {
diff --git a/src/main/webapp/scripts/xnat/ui/panel.js b/src/main/webapp/scripts/xnat/ui/panel.js
index 78eb3742b3802654be254fe1e5757cada5f91259..723ffdb9c5cab45944ed5b53c806dc5da3b6d829 100644
--- a/src/main/webapp/scripts/xnat/ui/panel.js
+++ b/src/main/webapp/scripts/xnat/ui/panel.js
@@ -41,8 +41,9 @@ var XNAT = getObject(XNAT || {});
 
     function doLookup(input){
         if (!input) return '';
-        if (input.toString().trim().indexOf(doLookupString) === 0){
-            return lookupObjectValue(window, input.split(doLookupString)[1]);
+        if (input.toString().indexOf(doLookupString) === 0){
+            input = input.split(doLookupString)[1].trim();
+            return lookupObjectValue(window, input);
         }
         return input;
     }
@@ -116,9 +117,11 @@ var XNAT = getObject(XNAT || {});
                     ['h3.panel-title', opts.title || opts.label]
                 ]],
 
-                // target is where the next spawned item will render
+                
+                // target is where this form's "contents" will be inserted
                 _target,
 
+                
                 (hideFooter ? ['div.hidden'] : ['div.panel-footer', opts.footer || _footer])
 
             ]);
@@ -128,96 +131,112 @@ var XNAT = getObject(XNAT || {});
             _formPanel.id = (opts.id || opts.element.id) + '-panel';
         }
 
+        // cache a jQuery-wrapped element
+        var $formPanel = $(_formPanel);
+
         // set form element values from an object map
         function setValues(form, dataObj){
-            // pass a single argument to work with this form
-            if (!dataObj) {
-                dataObj = form;
-                form = _formPanel;
-            }
             // find all form inputs with a name attribute
             $$(form).find(':input[name]').each(function(){
-                var val = '';
-                if (Array.isArray(dataObj)) {
-                    val = dataObj.join(', ');
+                var val = dataObj[this.name];
+                if (!val) return;
+                if (Array.isArray(val)) {
+                    val = val.join(', ');
                 }
                 else {
-                    val = /string|number/i.test(typeof dataObj) ? dataObj : dataObj[this.name] || '';
+                    val = stringable(val) ? val : JSON.stringify(val);
                 }
                 $(this).changeVal(val);
             });
-            if (xmodal && xmodal.loading && xmodal.loading.close){
-                xmodal.loading.close();
+            if (xmodal && xmodal.loading && xmodal.loading.closeAll){
+                xmodal.loading.closeAll();
             }
         }
 
         // populate the data fields if this panel is in the 'active' tab
         // (only getting values for the active tab should cut down on requests)
-        function loadData(obj){
+        function loadData(form, obj){
 
-            if (!obj) {
-                obj = opts.load || {};
+            obj = cloneObject(obj);
+
+            xmodal.loading.open('#load-data');
+
+            // need a form to put the data into!
+            if (!form) {
+                xmodal.loading.close('#load-data');
+                return;
             }
 
-            obj = cloneObject(obj);
+            // if 'load' starts with ??, do lookup
+            var doLookup = '??';
 
-            obj.form = obj.form || obj.target || obj.element || _formPanel;
+            if (obj.load && obj.load.toString().indexOf(doLookup) === 0) {
+                obj.load = (obj.load.split(doLookup)[1]||'').trim().split('|')[0];
+                obj.prop = obj.prop || obj.load.split('|')[1] || '';
+                setValues(form, lookupObjectValue(window, obj.load, obj.prop));
+                xmodal.loading.close('#load-data');
+                return form;
 
-            // need a form to put the data into
-            if (!obj.form) return;
+            }
+            
+            // if 'load' starts with '!?' do an eval()
+            var doEval = '!?';
+            if (obj.load && obj.load.toString().indexOf(doEval) === 0) {
+                obj.load = (obj.load.split(doEval)[1]||'').trim();
+                setValues(form, eval(obj.load));
+                xmodal.loading.close('#load-data');
+                return form;
 
-            // // if there's a 'refresh' url, make that obj.url
-            // if (obj.refresh) obj.url = obj.refresh;
+            }
+            
+            //////////
+            // REST
+            //////////
 
-            // if we pass data in a 'lookup' property, just use that
-            // to avoid doing a server request
+            // if 'load' starts with $?, do ajax request
+            var ajaxPrefix = '$?';
+            var ajaxUrl = '';
+            var ajaxProp = '';
 
-            if (obj.lookup && !obj.url) {
-                if (Array.isArray(obj.lookup)) {
-                    obj.lookup = obj.lookup[0];
-                }
-                else {
-                    try {
-                        obj.lookup = eval(obj.lookup);
-                    }
-                    catch (e) {
-                        if (console && console.log) console.log(e);
-                        obj.lookup = ''
-                    }
-                }
-                setValues(obj.form, obj.lookup);
-                return obj.form;
+
+            if (obj.refresh) {
+                ajaxUrl = obj.refresh;
+            }
+            // value: $? /path/to/data | obj:prop:name
+            else if (obj.load && obj.load.toString().indexOf(ajaxPrefix) === 0) {
+                ajaxUrl = obj.load;
             }
 
-            // otherwise try to get the data values via ajax
+            ajaxUrl = (ajaxUrl.split(ajaxPrefix)[1]||'').trim().split('|')[0];
+            ajaxProp = ajaxUrl.split('|')[1] || '';
 
             // need a url to get the data
-            if (!obj.url) return obj.form;
+            if (!ajaxUrl || !stringable(ajaxUrl)) {
+                xmodal.loading.close('#load-data');
+                return form;
+            }
 
-            obj.method = obj.method || 'GET';
+            // force GET method
+            obj.method = 'GET';
 
             // setup the ajax request
             // override values with an
             // 'ajax' or 'xhr' property
             obj.ajax = extend(true, {
                 method: obj.method,
-                url: XNAT.url.restUrl(obj.url)
+                url: XNAT.url.rootUrl(ajaxUrl)
             }, obj.ajax || obj.xhr);
 
-            // allow use of 'prop' or 'root' for the root property name
-            obj.prop = obj.prop || obj.root;
-
             obj.ajax.success = function(data){
-                var prop = data;
-                // if there's a property to target,
-                // specify the 'prop' property
-                if (obj.prop){
-                    obj.prop.split('.').forEach(function(part){
-                        prop = prop[part];
-                    });
+                if (ajaxProp){
+                    data = data[ajaxProp];
                 }
-                $(obj.form).dataAttr('status', 'clean');
-                setValues(prop);
+                $(form).dataAttr('status', 'clean');
+                setValues(form, data);
+            };
+
+            obj.ajax.complete = function(){
+                xmodal.loading.closeAll();
             };
 
             // return the ajax thing for method chaining
@@ -225,11 +244,9 @@ var XNAT = getObject(XNAT || {});
 
         }
 
-        //if (opts.load){
-        //    loadData(opts.load);
-        //}
-
-        var $formPanel = $(_formPanel);
+        // if (opts.load) {
+        //     loadData(_formPanel, opts)
+        // }
 
         // keep an eye on the inputs
         $formPanel.find(':input').on('change', function(){
@@ -239,14 +256,16 @@ var XNAT = getObject(XNAT || {});
         opts.onload = opts.onload || callback;
 
         $formPanel.on('reload-data', function(){
-            xmodal.loading.open();
-            opts.load.url = opts.load.url || opts.load.refresh;
-            loadData(opts.load);
+            loadData(this, {
+                refresh: opts.refresh || opts.load || opts.url
+            });
         });
 
         // click 'Discard Changes' button to reload data
         _resetBtn.onclick = function(){
-            $formPanel.triggerHandler('reload-data');
+            if (!/^#/.test($formPanel.attr('action')||'#')){
+                $formPanel.triggerHandler('reload-data');
+            }
         };
 
         opts.callback = opts.callback || callback || diddly;
@@ -271,6 +290,11 @@ var XNAT = getObject(XNAT || {});
                 silent = $form.hasClass('silent'),
                 multiform = {};
 
+            // don't submit forms with 'action' starting with '#'
+            if (/^#/.test($form.attr('action')||'#')) {
+                return false;
+            }
+
             $form.dataAttr('errors', 0);
 
             // validate inputs before moving on
@@ -290,13 +314,12 @@ var XNAT = getObject(XNAT || {});
                 if (!silent) {
                     xmodal.message('Error','Please enter values for the required items and re-submit the form.');
                 }
-                multiform.errors++; // keep track of errors for multi-form submission
                 return false;
             }
 
-            // don't open loading dialog for multiform submit
+            // only open loading dialog for standard (non-multi) submit
             if (!multiform.count){
-                xmodal.loading.open('#form-save');
+                var saveLoader = xmodal.loading.open('#form-save');
             }
 
             // var ajaxSubmitOpts = {
@@ -333,29 +356,16 @@ var XNAT = getObject(XNAT || {});
             var ajaxConfig = {
                 method: opts.method,
                 url: this.action,
-                success: function(data){
+                success: function(){
                     var obj = {};
-                    // if a data object is returned,
-                    // just use that
-                    if (data) {
-                        // HACK!
-                        // wrap the returned data in an array so the
-                        // loadData() function handles it properly
-                        obj.lookup = [data];
-                    }
-                    else {
-                        obj.url = opts.refresh;
-                    }
-
-                    // don't mess with modals for multiforms
+                    // actually, NEVER use returned data...
+                    // ALWAYS reload from the server
+                    obj.refresh = opts.refresh || opts.reload || opts.url || opts.load;
                     if (!silent){
-                        xmodal.loading.close('#form-save');
+                        xmodal.loading.close(saveLoader.$modal);
                         xmodal.message('Data saved successfully.', {
                             action: function(){
-                                loadData(obj);
-                                if (callback && isFunction(callback)) {
-
-                                }
+                                loadData($form, obj);
                             }
                         });
                     }
@@ -378,8 +388,10 @@ var XNAT = getObject(XNAT || {});
 
         // this object is returned to the XNAT.spawner() method
         return {
-            load: loadData,
-            setValues: setValues,
+            load: function(){
+                loadData(_formPanel, opts)
+            },
+            // setValues: setValues,
             target: _target,
             element: _formPanel,
             spawned: _formPanel,
@@ -685,7 +697,7 @@ var XNAT = getObject(XNAT || {});
         var textarea = spawn('textarea', opts.element);
         return XNAT.ui.template.panelDisplay(opts, textarea).spawned;
     };
-    panel.input.textares = panel.textarea;
+    panel.input.textarea = panel.textarea;
 
     //////////////////////////////////////////////////
     // SELECT MENU PANEL ELEMENTS
diff --git a/src/main/webapp/setup/index.jsp b/src/main/webapp/setup/index.jsp
index 0f62760fb6705b92b1f34262d4c24922b65a10d9..daff6dd0a0bbc7bf6fdbc1191916f43e8e0c6cf5 100644
--- a/src/main/webapp/setup/index.jsp
+++ b/src/main/webapp/setup/index.jsp
@@ -2,11 +2,7 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="pg" tagdir="/WEB-INF/tags/page" %>
 
-<c:set var="HEADBOTTOM">
-    <script src="<c:url value="/scripts/xnat/app/siteSetup.js"/>"></script>
-</c:set>
-
-<pg:xnat page="setup" title="XNAT Setup" headBottom="${HEADBOTTOM}">
+<pg:xnat page="setup" title="XNAT Setup">
 
     <div id="page-body">
         <div class="pad">
diff --git a/src/main/webapp/xdat-templates/navigations/powered_by.vm b/src/main/webapp/xdat-templates/navigations/powered_by.vm
index 6c7489f99b64283d0137cbb9776221d28da0629a..8a86d612708f1ba1d4fd5133868a5198857e62aa 100644
--- a/src/main/webapp/xdat-templates/navigations/powered_by.vm
+++ b/src/main/webapp/xdat-templates/navigations/powered_by.vm
@@ -7,24 +7,25 @@
 
     loadjs(scriptUrl('xnat/event.js'), function(){
 
-        // shift-click the header or footer XNAT logo to ENABLE debug mode
-        // alt-shift-click to DISABLE debug mode
-        // ctrl-alt-click to open the Swagger page in a new window
-        XNAT.event.click('#header_logo, #xnat_power > a')
-            .shiftKey(function(e){
-                e.preventDefault();
-                window.location.hash = 'debug=on'
-                window.location.reload();
-            })
-            .altShift(function(e){
-                e.preventDefault();
-                window.location.hash = 'debug=off'
-                window.location.reload();
-            })
-            .ctrlAlt(function(e){
-                e.preventDefault();
-                XNAT.ui.popup('/xapi/swagger-ui.html');
-            });
+        var clicker = XNAT.event.click('#header_logo, #xnat_power > a');
+
+        // shift-click the header or footer XNAT logo to TOGGLE debug mode on/off
+        clicker.shiftKey(function(e){
+            e.preventDefault();
+            if (Cookies.get('debug') === 'on'){
+                window.location.hash = 'debug=off';
+            }
+            else {
+                window.location.hash = 'debug=on';
+            }
+            window.location.reload();
+        });
+
+        // alt-shift-click to open the Swagger page in a new window
+        clicker.altShift(function(e){
+            e.preventDefault();
+            XNAT.ui.popup(XNAT.url.rootUrl('/xapi/swagger-ui.html'));
+        });
 
     })