Index: /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 500)
@@ -1,3 +1,4 @@
 define([
+    "../../widgets/_ComplexValueWidget",
     "./questions/Factory",
     "dijit/_Container",
@@ -14,6 +15,6 @@
     "dojo/on",
     "dojo/text!./templates/QuestionEditorPreviewItem.html"
-], function(QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, fx, lang, domClass, domGeom, domStyle, on, template) {
-    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Container], {
+], function(_ComplexValueWidget, QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, fx, lang, domClass, domGeom, domStyle, on, template) {
+    return declare([_ComplexValueWidget], {
         templateString: template,
         baseClass: "qedQuestionEditorPreviewItem",
@@ -87,6 +88,5 @@
                 this._destroyInnerWidget();
                 this.innerWidget = newWidget;
-                this.innerWidget.placeAt(this.containerNode);
-                this.innerWidget.startup();
+                this.addChild(this.innerWidget);
                 this.innerWidget.set('readOnly',true);
                 this.titleNode.innerHTML = this.value.type+" [preview]";
@@ -101,6 +101,5 @@
                 this._destroyInnerWidget();
                 this.innerWidget = newWidget;
-                this.innerWidget.placeAt(this.containerNode);
-                this.innerWidget.startup();
+                this.addChild(this.innerWidget);
                 this.titleNode.innerHTML = this.value.type+" [editing]";
                 domClass.replace(this.editButton.iconNode, "rftIconAccept", "rftIconEdit");
@@ -111,5 +110,7 @@
         _destroyInnerWidget: function() {
             if ( this.innerWidget !== null ) {
+                this.removeChild(this.innerWidget);
                 this.innerWidget.destroyRecursive();
+                this.innerWidget = null;
             }
         },
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 500)
@@ -32,9 +32,9 @@
         _getValueAttr: function() {
             var value = this.inherited(arguments);
-            if ( this.allowMultiple === true ) {
+            /*if ( this.allowMultiple === true ) {
                 return value;
             } else {
-                return value.choice.length > 0;
-            }
+                return value.choice; //.length > 0;
+            }*/
         },
         _setValueAttr: function(value) {
Index: /Dev/trunk/src/client/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html	(revision 499)
+++ /Dev/trunk/src/client/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html	(revision 500)
@@ -1,3 +1,3 @@
-<div>
+<form>
 	<div class="topBorder inheritBgColor bg dojoDndHandle">
 		<span class="title" data-dojo-attach-point="titleNode">Default title</span>
@@ -13,3 +13,3 @@
 		</div>
 	</div>
-</div>
+</form>
Index: /Dev/trunk/src/client/qed-client/pages/_ObjectPage.js
===================================================================
--- /Dev/trunk/src/client/qed-client/pages/_ObjectPage.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/pages/_ObjectPage.js	(revision 500)
@@ -22,32 +22,34 @@
         _load: function() {
             if ( this.object ) {
-                this._refresh();
+                this._refresh(true);
             } else if ( this.objectId ) {
                 if ( this.objectId === "new" ) {
                     this.object = this.classStore.create();
-                    this._refresh();
+                    this.markDirty();
+                    this._refresh(true);
                 } else {
                     this.classStore.load(this.objectId)
-                    .then(lang.hitch(this,'_setObject'),
-                          lang.hitch(this,function(err){
-                                this.die(err.error);
-                            }));
+                    .then(lang.hitch(this,function(object){
+                        this._setObject(object,true);
+                    }),lang.hitch(this,function(err){
+                        this.die(err.error);
+                    }));
                 }
             } else {
-                this.die("No valid uid or object passed!");
+                this.die("No valid id or object passed!");
             }
         },
-        _setObject: function(object) {
+        _setObject: function(object,initial) {
             this.object = object;
             if ( this.objectId === "new" ) {
                 this.go(this.classStore.getObjectPath(this.object),{},true);
             }
-            this._refresh();
+            this.markClean();
+            this._refresh(initial);
         },
-        _refresh: function() {},
+        _refresh: function(initial) {},
         _save: function() {
             return this.classStore.save(this.object)
             .then(lang.hitch(this,function(object){
-                this.markClean();
                 this._setObject(object);
                 this.notify(this.classStore.getName()+" successfully saved.");
Index: /Dev/trunk/src/client/qed-client/pages/question.js
===================================================================
--- /Dev/trunk/src/client/qed-client/pages/question.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/pages/question.js	(revision 500)
@@ -23,10 +23,9 @@
             this._load();
         },
-        _refresh: function() {
-            this.propertiesForm.set('value',this.object,null);
-            this.contentList.set('value',this.object.content,null);
-            this._internalRefresh();
-        },
-        _internalRefresh: function(){
+        _refresh: function(initial) {
+            if ( initial === true ) {
+                this.propertiesForm.set('value',this.object,null);
+                this.contentList.set('value',this.object.content,null);
+            }
             this.titleNode.innerHTML = this.object.title || "";
         },
@@ -34,10 +33,10 @@
             this._updateObject();
             this.markDirty();
-            this._internalRefresh();
+            this._refresh();
         },
         _handleContentChange: function() {
             this._updateObject();
             this.markDirty();
-            this._internalRefresh();
+            this._refresh();
         },
         _updateObject: function() {
Index: /Dev/trunk/src/client/qed-client/pages/survey.js
===================================================================
--- /Dev/trunk/src/client/qed-client/pages/survey.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/pages/survey.js	(revision 500)
@@ -61,10 +61,9 @@
             this.questionList.startup();
         },
-        _refresh: function() {
-            this.propertiesForm.set('value',{survey:this.object},null);
-            this.questionList.set('value',this.object.questions,null);
-            this._internalRefresh();
-        },
-        _internalRefresh: function() {
+        _refresh: function(initial) {
+            if ( initial === true ) {
+                this.propertiesForm.set('value',{survey:this.object},null);
+                this.questionList.set('value',this.object.questions,null);
+            }
             this.titleNode.innerHTML = this.object.title || "(set title in properties)";
         },
@@ -75,5 +74,5 @@
             this.object.questions = this.questionList.get('value');
             this.markDirty();
-            this._internalRefresh();
+            this._refresh();
         },
         _onShowProperties: function(evt) {
@@ -86,5 +85,5 @@
             lang.mixin(this.object, this.propertiesForm.get('value').survey);
             this.markDirty();
-            this._internalRefresh();
+            this._refresh();
             if ( evt ) { event.stop(evt); }
             return false;
Index: /Dev/trunk/src/client/qed-client/pages/surveyRun.js
===================================================================
--- /Dev/trunk/src/client/qed-client/pages/surveyRun.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/pages/surveyRun.js	(revision 500)
@@ -29,11 +29,10 @@
             this._load();
         },
-        _refresh: function() {
-            this.surveySummaryWidget.set('value',this.object.survey,null);
-            this.surveyRunWidget.set('value',this.object,null);
-            this._internalRefresh();
-            this._loadResponses();
-        },
-        _internalRefresh: function() {
+        _refresh: function(initial) {
+            if ( initial === true ) {
+                this.surveySummaryWidget.set('value',this.object.survey,null);
+                this.surveyRunWidget.set('value',this.object,null);
+                this._loadResponses();
+            }
             this.titleNode.innerHTML = this.object.title || "";
             if ( this.object.mode === "open" ) {
@@ -77,5 +76,5 @@
             this._updateObject();
             this.markDirty();
-            this._internalRefresh();
+            this._refresh();
         },
         _buildGeneralURL: function(surveyRun) {
Index: /Dev/trunk/src/client/qed-client/widgets/ListWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/ListWidget.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/widgets/ListWidget.js	(revision 500)
@@ -14,4 +14,6 @@
         name: "",
         value: null,
+        disabled: false,
+        readOnly: false,
         multiple: true,
         type: "text",
@@ -20,4 +22,5 @@
          */
         container: Source,
+        _onChangeActive: false,
         buildRendering: function() {
             this.inherited(arguments);
@@ -50,5 +53,8 @@
             });
             this.source = new this.container(this.domNode,sourceParams);
-            this.own(this.source.on('Drop',lang.hitch(this,'_handleChange')));
+            this.own(this.source.on('Drop',
+                                    lang.hitch(this,'_handleDrop')));
+            this.own(on(this.domNode,'change',
+                        lang.hitch(this,'_handleChange')));
         },
         creator: function(item, hint) {
@@ -92,5 +98,5 @@
             return this.value;
         },
-        _setValueAttr: function(value) {
+        _setValueAttr: function(value,priorityChange) {
             this.clear();
             this.appendItems(value || []);
@@ -158,9 +164,19 @@
             this.inherited(arguments);
         },
-        _handleChange: function() {
-            this.value = this._getValueAttr();
-            this.onChange(this.value);
+        _handleChange: function(evt) {
+            if ( evt.target !== this.domNode ) {
+                if ( this._onChangeActive && !(this.readOnly || this.disabled) ) {
+                    this.emit('change',this.get('value'));
+                }
+                if ( evt ) { event.stop(evt); }
+                return false;
+            }
+            return true;
         },
-        onChange: function(value) {}
+        _handleDrop: function() {
+            if ( this._onChangeActive && !(this.readOnly || this.disabled) ) {
+                this.emit('change',this.get('value'));
+            }
+        }
     });
 });
Index: /Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.js	(revision 499)
+++ /Dev/trunk/src/client/qed-client/widgets/_ComplexValueMixin.js	(revision 500)
@@ -11,7 +11,21 @@
     return declare([_Container, _FormMixin], {
         name: "",
+        value: null,
         disabled: false,
         readOnly: false,
-        _changeActive: false,
+        _onChangeActive: false,
+        constructor: function() {
+            this._listenerMap = {};
+        },
+        buildRendering: function() {
+            // capture child change events
+            this.inherited(arguments);
+            this.own(on(this.domNode,'change',
+                        lang.hitch(this,'_handleChange')));
+        },
+        create: function() {
+            this.inherited(arguments);
+            this._onChangeActive = true;
+        },
         postCreate: function() {
             this.inherited(arguments);
@@ -24,12 +38,4 @@
             if (this._started) { return; }
             this.inherited(arguments);
-            this._connectChildren();
-            this._changeActive = true;
-        },
-        _connectChildren: function() {
-            var children = this._getDescendantFormWidgets();
-            array.forEach(children, lang.hitch(this,function(child) {
-                this.own(child.on('change',lang.hitch(this,'_handleChange')));
-            }));
         },
         _setDisabledAttr: function(value) {
@@ -41,5 +47,11 @@
         // Yuk, this function is taken directly from _FromMixin only
         // to add the priorityChange parameter
+        _getValueAttr: function() {
+            this.value = this.inherited(arguments);
+            return this.value;
+        },
 		_setValueAttr: function(obj, priorityChange) {
+            this.value = obj;
+
 			var map = { };
 			array.forEach(this._getDescendantFormWidgets(), function(widget){
@@ -84,10 +96,14 @@
             }
         },
-        _handleChange: function() {
-            if ( this._changeActive ) {
-                this.onChange(this.get('value'));
+        _handleChange: function(evt) {
+            if ( evt.target !== this.domNode ) {
+                if ( this._onChangeActive && !(this.readOnly || this.disabled) ) {
+                    this.emit('change',this.get('value'));
+                }
+                if ( evt ) { event.stop(evt); }
+                return false;
             }
+            return true;
         },
-        onChange: function(){},
         _handleSubmit: function(evt) {
             var node = this.domNode;
