diff --git a/src/main/webapp/scripts/globals.js b/src/main/webapp/scripts/globals.js
index dbaef7f0d43731d9a8791315b46678c1006e8b28..4ac56bc86262e810e6edf6b9d419bda233eb216c 100644
--- a/src/main/webapp/scripts/globals.js
+++ b/src/main/webapp/scripts/globals.js
@@ -312,7 +312,7 @@ function setExtendedObject(obj, str, val){
 
 // loops over object string using quasi-dot notation (with colons):
 // we use colons because property names can contain periods (which is dumb)
-// var myVal = lookupObjectValue(XNAT, 'data:siteConfig:siteId');
+// var myVal = lookupObjectValue(XNAT, ':data:siteConfig:siteId');
 // --> myVal == 'myXnatSiteId'
 function lookupObjectValue(root, objStr, prop){
     
@@ -321,7 +321,7 @@ function lookupObjectValue(root, objStr, prop){
         brackets = /[\]\[]/,
         hasBrackets = false,
         parts = [],
-        undefined;
+        undef;
     
     if (!objStr) {
         objStr = root+'';
@@ -339,8 +339,8 @@ function lookupObjectValue(root, objStr, prop){
         //objStr = objStr.replace(/^\[|]$/g, '')
         hasBrackets = true;
     }
-    // if 'objStr' contains colons, use those as the path delimiter
-    else if (/:/.test(objStr)) {
+    // if 'objStr' STARTS WITH a colon, use those as the path delimiter
+    else if (/^:/.test(objStr)) {
         delim = ':';
     }
     // otherwise we're probably using dot notation
@@ -360,17 +360,17 @@ function lookupObjectValue(root, objStr, prop){
     parts.forEach(function(part, i){
         // start at the root object
         if (i === 0) {
-            val = root[part] || '';
+            val = (root[part] !== undef) ? root[part] : '';
         }
         else {
-            if (val === undefined) return false;
+            if (val === undef) return false;
             val = val[part];
         }
     });
     
     // explicitly set a final property name to look for
     if (prop) {
-        val = val[prop] || val;
+        val = (val[prop] !== undef) ? val[prop] : val;
     }
     
     return val;
@@ -658,6 +658,8 @@ autoID = randomID;
 // set 'forceLower' === true (or omit argument)
 // to ensure output is lowercase
 function toDashed(str){
+    var undefined;
+    str = str !== undefined ? str+'' : '';
     return str.replace(/[A-Z]/g, function(u) {
         return '-' + u;
     }).replace(/[A-Z]-/g, function(c){
diff --git a/src/main/webapp/scripts/xnat/xhr.js b/src/main/webapp/scripts/xnat/xhr.js
index 7a70b78e4f9789fd7a97b57150a035842d83d32d..9ea911b3f7280ab38ea799dcede2d9f66e1ada87 100755
--- a/src/main/webapp/scripts/xnat/xhr.js
+++ b/src/main/webapp/scripts/xnat/xhr.js
@@ -451,7 +451,7 @@ var XNAT = getObject(XNAT||{}),
         }
 
         // apply values to each input
-        $inputs.each(function(){
+        $inputs.not('button').each(function(){
 
             var $this = $(this);
             var val = lookupObjectValue(dataObj, this.name||this.title);
@@ -467,7 +467,12 @@ var XNAT = getObject(XNAT||{}),
             //if (val === "") return;
 
             if (/checkbox/i.test(this.type)) {
-                this.checked = realValue(val);
+                val = realValue(val);
+                // allow values other than 'true' or 'false'
+                this.checked = (this.value && val && isEqual(this.value, val)) ? true : val;
+                if (this.value === '') {
+                    this.value = val;
+                }
             }
             else if (/radio/i.test(this.type)) {
                 this.checked = isEqual(this.value, val);
@@ -479,7 +484,13 @@ var XNAT = getObject(XNAT||{}),
                 changeValue($this, val);
             }
 
-            $this.removeClass('dirty').dataAttr('value', val);
+            if (!/textarea/i.test(this.tagName)) {
+                $this.dataAttr('value', val);
+            }
+
+            $this.removeClass('dirty').on('change', function(){
+                $(this).addClass('dirty');
+            });
 
         });
 
@@ -530,7 +541,7 @@ var XNAT = getObject(XNAT||{}),
         if (/POST|PUT/i.test(opts.method)) {
             if ($form.hasClass('json') || /json/i.test(opts.contentType||'')){
                 // opts.data = formToJSON($form, true);
-                opts.data = JSON.stringify(form2js(inputs, ':', false));
+                opts.data = JSON.stringify(form2js(inputs, opts.delimiter||opts.delim||':', false));
                 opts.processData = false;
                 opts.contentType = 'application/json';
             }