Index: /Dev/trunk/src/client/qed-client/css/model/widgets/NumberInput.less
===================================================================
--- /Dev/trunk/src/client/qed-client/css/model/widgets/NumberInput.less	(revision 510)
+++ /Dev/trunk/src/client/qed-client/css/model/widgets/NumberInput.less	(revision 510)
@@ -0,0 +1,5 @@
+#rft.claro .qedNumberInputConfig {
+    .subcode {
+        width: 2em;
+    }
+}
Index: /Dev/trunk/src/client/qed-client/css/model/widgets/StringInput.less
===================================================================
--- /Dev/trunk/src/client/qed-client/css/model/widgets/StringInput.less	(revision 510)
+++ /Dev/trunk/src/client/qed-client/css/model/widgets/StringInput.less	(revision 510)
@@ -0,0 +1,5 @@
+#rft.claro .qedStringInputConfig {
+    .subcode {
+        width: 2em;
+    }
+}
Index: /Dev/trunk/src/client/qed-client/css/model/widgets/TextInput.less
===================================================================
--- /Dev/trunk/src/client/qed-client/css/model/widgets/TextInput.less	(revision 510)
+++ /Dev/trunk/src/client/qed-client/css/model/widgets/TextInput.less	(revision 510)
@@ -0,0 +1,5 @@
+#rft.claro .qedTextInputConfig {
+    .subcode {
+        width: 2em;
+    }
+}
Index: /Dev/trunk/src/client/qed-client/css/qed.less
===================================================================
--- /Dev/trunk/src/client/qed-client/css/qed.less	(revision 509)
+++ /Dev/trunk/src/client/qed-client/css/qed.less	(revision 510)
@@ -32,4 +32,7 @@
 @import "widgets/LineWithActions.less";
 @import "model/widgets/ScaleWidget.less";
+@import "model/widgets/StringInput.less";
+@import "model/widgets/TextInput.less";
+@import "model/widgets/NumberInput.less";
 @import "model/widgets/MultipleChoiceWidget.less";
 @import "model/widgets/QuestionListView.less";
Index: /Dev/trunk/src/client/qed-client/lib/object.js
===================================================================
--- /Dev/trunk/src/client/qed-client/lib/object.js	(revision 510)
+++ /Dev/trunk/src/client/qed-client/lib/object.js	(revision 510)
@@ -0,0 +1,31 @@
+define([
+],function(){
+    var object = {
+        forEach: function(obj,callback,thisObject) {
+            for ( var prop in obj ) {
+                if ( obj.hasOwnProperty(prop) ) {
+                    callback.call(thisObject,obj[prop],prop,obj);
+                }
+            }
+        },
+        map: function(obj,callback,thisObject) {
+            var newObj = {};
+            for ( var prop in obj ) {
+                if ( obj.hasOwnProperty(prop) ) {
+                    newObj[prop] = callback.call(thisObject,obj[prop],prop,obj);
+                }
+            }
+            return newObj;
+        },
+        mapToArray: function(obj,callback,thisObject) {
+            var newArray = [];
+            for ( var prop in obj ) {
+                if ( obj.hasOwnProperty(prop) ) {
+                    newArray.push(callback.call(thisObject,obj[prop],prop,obj));
+                }
+            }
+            return newArray;
+        }
+    };
+    return object;
+});
Index: /Dev/trunk/src/client/qed-client/model/classes/_Class.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/classes/_Class.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/classes/_Class.js	(revision 510)
@@ -1,3 +1,4 @@
 define([
+    "../../lib/object",
     "./_View",
     "dojo/_base/array",
@@ -5,5 +6,5 @@
     "dojo/_base/lang",
     "dojo/date/stamp"
-], function(_View, array, declare, lang, stamp) {
+], function(objectFuns, _View, array, declare, lang, stamp) {
 
     var _Class = declare([_View],{
@@ -24,5 +25,5 @@
             obj = lang.clone(obj);
             obj = this._serialize(obj) || obj;
-            this._strip(obj);
+            this._sanitize(obj);
             return obj;
         },
@@ -65,20 +66,19 @@
             return stamp.toISOString(date,{zulu:true,milliseconds:false});
         },
-        _strip: function(obj) {
+        _sanitize: function(obj) {
             if ( lang.isArray(obj) ) {
-                array.forEach(obj,this._strip,this);
+                array.forEach(obj,this._sanitize,this);
             } else if ( lang.isObject(obj) ) {
-                for ( var prop in obj ) {
-                    if ( obj.hasOwnProperty(prop) ) {
-                        var v = obj[prop];
-                        if ( v === null || v === "" || (typeof v === "number" && isNaN(v)) ) {
-                            delete obj[prop];
-                        } else {
-                            this._strip(v);
-                        }
+                objectFuns.forEach(obj,function(v,prop){
+                    if ( v === null ||
+                         v === "" ||
+                         (typeof v === "number" && isNaN(v)) ) {
+                        delete obj[prop];
+                    } else {
+                        this._sanitize(v);
                     }
-                }
+
+                },this);
             }
-
         }
     });
Index: /Dev/trunk/src/client/qed-client/model/classes/responses.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/classes/responses.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/classes/responses.js	(revision 510)
@@ -1,3 +1,4 @@
 define([
+    "../../lib/object",
     "./_Class",
     "./surveyRuns",
@@ -7,5 +8,5 @@
     "dojo/_base/lang",
     "dojo/_base/xhr"
-], function(_Class, surveyRuns, Deferred, declare, json, lang, xhr) {
+], function(objectFuns, _Class, surveyRuns, Deferred, declare, json, lang, xhr) {
 
     var Responses = declare([_Class],{
@@ -29,4 +30,5 @@
         },
         _serialize: function(obj) {
+            this._convertCheckAndRadio(obj.answers);
             if (obj._surveyRun) {
                 obj._surveyRun = surveyRuns._doSerialize(obj._surveyRun);
@@ -84,4 +86,20 @@
                 return result;
             },lang.hitch(this,'_deserializeError'));
+        },
+        _convertCheckAndRadio: function(answers) {
+            // When we encounter an array, we assume it's really a
+            // checkbox value.
+            objectFuns.forEach(answers,function(v,prop){
+                if ( lang.isArray(v) ) {
+                    switch (v.length) {
+                    case 0:
+                    case 1:
+                        answers[prop] = v[0];
+                        break;
+                    default:
+                        throw new Error("Responses cannot exist of array values.");
+                    }
+                }
+            },this);
         }
     });
Index: /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreview.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreview.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreview.js	(revision 510)
@@ -23,4 +23,5 @@
                 value: item
             });
+            previewItem.showEdit();
             this.own(previewItem.on('destroy',
                                     lang.hitch(this,'removeItem',id,true)));
Index: /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 510)
@@ -6,4 +6,5 @@
     "dijit/_WidgetBase",
     "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/array",
     "dojo/_base/declare",
     "dojo/_base/event",
@@ -15,5 +16,5 @@
     "dojo/on",
     "dojo/text!./templates/QuestionEditorPreviewItem.html"
-], function(_ComplexValueWidget, QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, fx, lang, domClass, domGeom, domStyle, on, template) {
+], function(_ComplexValueWidget, QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, array, declare, event, fx, lang, domClass, domGeom, domStyle, on, template) {
     return declare([_ComplexValueWidget], {
         templateString: template,
@@ -24,5 +25,5 @@
         foldDuration: [250, 250],
         animation: null,
-        _editing: false,
+        _editing: null,
         _factory: new QuestionWidgetFactory(),
 
@@ -36,5 +37,5 @@
             this.own(this.editButton.on('click',
                         lang.hitch(this, 'onToggleEdit')));
-            this.showEdit();
+            this.showView();
         },
         _handleDestroy: function(evt) {
@@ -44,5 +45,5 @@
         },
         _getValueAttr: function(value) {
-            if ( this._editing ) {
+            if ( this._editing === true ) {
                 this.value = this.innerWidget.get('value');
             }
@@ -51,5 +52,5 @@
         _setValueAttr: function(value) {
             this.value = value;
-            if ( this._editing ) {
+            if ( this._editing  === true ) {
                 this._showEditWidget();
             } else {
@@ -57,29 +58,42 @@
             }
         },
-        _setReadOnlyAttr: function() {
-            this.inherited(arguments);
+        _setReadOnlyAttr: function(readOnly) {
+            this._set('readOnly',readOnly);
+            this._setReadOnlyChildren(this.readOnly);
             this._updateRemoveBtn();
         },
-        _setDisabledAttr: function() {
-            this.inherited(arguments);
+        _setDisabledAttr: function(disabled) {
+            this._set('disabled',disabled);
+            this._setDisabledChildren(this.disabled);
             this._updateRemoveBtn();
         },
         _updateRemoveBtn: function() {
+            var node = this.removeButton.domNode;
             if ( this.readOnly || this.disabled ) {
-                domClass.add(this.removeButton.domNode, 'dijitHidden');
+                domClass.add(node, 'dijitHidden');
             } else {
-                domClass.remove(this.removeButton.domNode, 'dijitHidden');
+                domClass.remove(node, 'dijitHidden');
             }
         },
+        _setDisabledChildren: function(disabled) {
+            array.forEach(this._getDescendantFormWidgets(),function(widget){
+                widget.set('disabled',disabled);
+            });
+        },
+        _setReadOnlyChildren: function(readOnly) {
+            array.forEach(this._getDescendantFormWidgets(),function(widget){
+                widget.set('readOnly',readOnly);
+            });
+        },
         validate: function() {
-            return !this._editing || this.innerWidget.validate();
+            return this._editing === false || this.innerWidget.validate();
         },
         focus: function() {
-            if ( this._editing ) {
+            if ( this._editing === true ) {
                 this.innerWidget.focus();
             }
         },
         showView: function() {
-            if ( this._editing ) {
+            if ( this._editing === true ) {
                 if (!this.innerWidget.validate || this.innerWidget.validate() ) {
                     this.value = this.innerWidget.get('value');
@@ -89,10 +103,10 @@
         },
         showEdit: function() {
-            if (!this._editing) {
+            if ( this._editing === false ) {
                 this._showEditWidget();
             }
         },
         onToggleEdit: function(evt) {
-            if (this._editing) {
+            if ( this._editing === true ) {
                 this.showView();
             } else {
@@ -106,9 +120,10 @@
             // on it,but we don't know the actual code here.
             var newWidget = this._factory.createViewWidget( lang.mixin({code:""},this.value) );
-            if ( newWidget !== null ) {
+            if ( newWidget ) {
                 this._destroyInnerWidget();
                 this.innerWidget = newWidget;
-                this.innerWidget.set('readOnly',true);
                 this.addChild(this.innerWidget);
+                this._setReadOnlyChildren(true);
+                this._setDisabledChildren(true);
                 this.titleNode.innerHTML = this.value.type+" [preview]";
                 domClass.replace(this.editButton.iconNode, "rftIconEdit", "rftIconAccept");
@@ -119,10 +134,10 @@
         _showEditWidget: function() {
             var newWidget = this._factory.createEditWidget( this.value );
-            if ( newWidget !== null ) {
+            if ( newWidget ) {
                 this._destroyInnerWidget();
                 this.innerWidget = newWidget;
-                this.innerWidget.set('readOnly',this.readOnly);
-                this.innerWidget.set('disabled',this.disabled);
                 this.addChild(this.innerWidget);
+                this._setReadOnlyChildren(this.readOnly);
+                this._setDisabledChildren(this.disabled);
                 this.titleNode.innerHTML = this.value.type+" [editing]";
                 domClass.replace(this.editButton.iconNode, "rftIconAccept", "rftIconEdit");
Index: /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorToolkit.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorToolkit.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/QuestionEditorToolkit.js	(revision 510)
@@ -34,4 +34,5 @@
             { type: "NumberInput" },
             { type: "ScaleInput" },
+            { type: "SingleChoiceInput" },
             { type: "MultipleChoiceInput" }
         ],
@@ -44,4 +45,5 @@
             "NumberInput": "Number",
             "ScaleInput": "Scale",
+            "SingleChoiceInput": "Single choice",
             "MultipleChoiceInput": "Multiple choice"
         },
@@ -54,4 +56,5 @@
             "NumberInput": "Number",
             "ScaleInput": "Scale",
+            "SingleChoiceInput": "MultipleChoice",
             "MultipleChoiceInput": "MultipleChoice"
         },
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/Factory.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/Factory.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/Factory.js	(revision 510)
@@ -1,3 +1,4 @@
 define([
+    "../../../lib/object",
     "./HeaderConfigWidget",
     "./HeaderWidget",
@@ -8,4 +9,6 @@
     "./ScaleInputConfigWidget",
     "./ScaleInputWidget",
+    "./SingleChoiceInputConfigWidget",
+    "./SingleChoiceInputWidget",
     "./StringInputConfigWidget",
     "./StringInputWidget",
@@ -16,5 +19,44 @@
     "dijit/_WidgetBase",
     "dojo/_base/declare"
-], function(HeaderConfigWidget, HeaderWidget, MultipleChoiceInputConfigWidget, MultipleChoiceInputWidget, NumberInputConfigWidget, NumberInputWidget, ScaleInputConfigWidget, ScaleInputWidget, StringInputConfigWidget, StringInputWidget, TextConfigWidget, TextInputConfigWidget, TextInputWidget, TextWidget, _WidgetBase, declare) {
+], function(objectFuns, HeaderConfigWidget, HeaderWidget, MultipleChoiceInputConfigWidget, MultipleChoiceInputWidget, NumberInputConfigWidget, NumberInputWidget, ScaleInputConfigWidget, ScaleInputWidget, SingleChoiceInputConfigWidget, SingleChoiceInputWidget, StringInputConfigWidget, StringInputWidget, TextConfigWidget, TextInputConfigWidget, TextInputWidget, TextWidget, _WidgetBase, declare) {
+    
+    var DividerWidget = declare([_WidgetBase], {
+        postCreate: function() {
+            this.domNode.innerHTML = "<hr>";
+        }
+    });
+
+    var viewMap = {
+        Header: HeaderWidget,
+        Text: TextWidget,
+        Divider: DividerWidget,
+        StringInput: StringInputWidget,
+        TextInput: TextInputWidget,
+        NumberInput: NumberInputWidget,
+        MultipleChoiceInput: MultipleChoiceInputWidget,
+        SingleChoiceInput: SingleChoiceInputWidget,
+        ScaleInput: ScaleInputWidget
+    };
+    var editMap = {
+        Header: HeaderConfigWidget,
+        Text: TextConfigWidget,
+        StringInput: StringInputConfigWidget,
+        TextInput: TextInputConfigWidget,
+        NumberInput: NumberInputConfigWidget,
+        MultipleChoiceInput: MultipleChoiceInputConfigWidget,
+        SingleChoiceInput: SingleChoiceInputConfigWidget,
+        ScaleInput: ScaleInputConfigWidget
+    };
+
+    editMap = objectFuns.map(editMap,function(Ctor,type){
+        return declare([Ctor],{
+            _getValueAttr: function() {
+                var value = this.inherited(arguments);
+                value.type = type;
+                return value;
+            }
+        });
+    });
+
     var factory = declare(null, {
         createViewWidget: function(/*Object*/options) {
@@ -22,87 +64,14 @@
             //            type: "Header", "Text", "TextInput", etc.
             //            other type specific fields
-            var fun = this['create'+options.type+'ViewWidget'];
-            var view = fun !== undefined ? fun(options) : null;
+            var Ctor = viewMap[options.type];
+            var view = Ctor && new Ctor(options) || null;
             return view;
         },
         createEditWidget: function(/*Object*/options) {
-            var fun = this['create'+options.type+'EditWidget'];
-            var view = fun !== undefined ? fun(options) : null;
-            return view;
-        },
-
-        createHeaderViewWidget: function(config) {
-            return new HeaderWidget(config);
-        },
-        createHeaderEditWidget: function(config) {
-            return new HeaderConfigWidget({
-                value: config
+            var Ctor = editMap[options.type];
+            var edit = Ctor && new Ctor({
+                value: options
             });
-        },
-
-        createTextViewWidget: function(config) {
-            return new TextWidget(config);
-        },
-        createTextEditWidget: function(config) {
-            return new TextConfigWidget({
-                value: config
-            });
-        },
-
-        createDividerViewWidget: function(options) {
-            return new DividerView({
-                options: options
-            });
-        },
-
-        createStringInputViewWidget: function(config) {
-            return new StringInputWidget(config);
-        },
-        createStringInputEditWidget: function(config) {
-            return new StringInputConfigWidget({
-                value: config
-            });
-        },
-
-        createTextInputViewWidget: function(config) {
-            return new TextInputWidget(config);
-        },
-        createTextInputEditWidget: function(config) {
-            return new TextInputConfigWidget({
-                value: config
-            });
-        },
-
-        createNumberInputViewWidget: function(config) {
-            return new NumberInputWidget(config);
-        },
-        createNumberInputEditWidget: function(config) {
-            return new NumberInputConfigWidget({
-                value: config
-            });
-        },
-
-        createMultipleChoiceInputViewWidget: function(config) {
-            return new MultipleChoiceInputWidget(config);
-        },
-        createMultipleChoiceInputEditWidget: function(config) {
-            return new MultipleChoiceInputConfigWidget({
-                value: config
-            });
-        },
-
-        createScaleInputViewWidget: function(options) {
-            return new ScaleInputWidget(options);
-        },
-        createScaleInputEditWidget: function(options) {
-            return new ScaleInputConfigWidget({
-                value: options || {}
-            });
-        }
-    });
-
-    var DividerView = declare([_WidgetBase], {
-        postCreate: function() {
-            this.domNode.innerHTML = "<hr>";
+            return edit || null;
         }
     });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js	(revision 510)
@@ -19,5 +19,4 @@
     
     return declare([_ComplexValueWidget],{
-        type: 'MultipleChoiceInput',
         baseClass: 'qedMultipleChoiceWidget',
         templateString: template,
@@ -51,14 +50,4 @@
             });
         },
-        _getValueAttr: function() {
-            var value = this.inherited(arguments);
-            value.type = this.type;
-            value.allowMultiple = value.allowMultiple.length > 0;
-            return value;
-        },
-        _setValueAttr: function(value) {
-            value.allowMultiple = value.allowMultiple ? ["on"] : [];
-            return this.inherited(arguments);
-        },
         onAddItem: function(evt) {
             this.itemsWidget.appendItem({},true);
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 510)
@@ -5,10 +5,9 @@
     "dijit/_WidgetsInTemplateMixin",
     "dijit/form/CheckBox",
-    "dijit/form/RadioButton",
     "dojo/_base/array",
     "dojo/_base/declare",
     "dojo/dom-construct",
     "dojo/text!./templates/MultipleChoiceInputWidget.html"
-], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, CheckBox, RadioButton, array, declare, domConstruct, template) {
+], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, CheckBox, array, declare, domConstruct, template) {
     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
         templateString: template,
@@ -18,11 +17,10 @@
 
             domConstruct.empty(this.domNode);
-            var Ctor = this.allowMultiple === true ? CheckBox : RadioButton;
             array.forEach(this.items, function(item){
                 var div = domConstruct.create("div", {
                 }, this.domNode, "last");
-                var input = new Ctor({
-                    name: this.code + (this.allowMultiple === true ? item.subcode : ''),
-                    value: this.allowMultiple === true ? null : item.subcode
+                var input = new CheckBox({
+                    name: this.code + item.subcode,
+                    value: 1
                 }).placeAt(div);
                 var label = domConstruct.create("label",{
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputConfigWidget.js	(revision 510)
@@ -5,11 +5,6 @@
 ], function(_ComplexValueWidget, declare, template) {
     return declare([_ComplexValueWidget],{
-        type: 'NumberInput',
-        templateString: template,
-        _getValueAttr: function() {
-            var value = this.inherited(arguments);
-            value.type = this.type;
-            return value;
-        }
+        baseClass: 'qedNumberInputConfig',
+        templateString: template
     });
 });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/NumberInputWidget.js	(revision 510)
@@ -10,4 +10,5 @@
         templateString: template,
         text: '',
+        subcode: '',
         startup: function() {
             if ( this._started ) { return; }
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/ScaleInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/ScaleInputConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/ScaleInputConfigWidget.js	(revision 510)
@@ -79,9 +79,4 @@
             return false;
         },
-        _getValueAttr: function(){
-            var value = this.inherited(arguments);
-            value.type = 'ScaleInput';
-            return value;
-        },
         onNAChange: function(value) {
             this._hasNA = value !== null && value !== "";
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputConfigWidget.js	(revision 510)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputConfigWidget.js	(revision 510)
@@ -0,0 +1,58 @@
+define([
+    "../../../widgets/ListWidget",
+    "../../../widgets/_ComplexValueWidget",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/dom-construct",
+    "dojo/text!./templates/SingleChoiceInputConfigRowWidget.html",
+    "dojo/text!./templates/SingleChoiceInputConfigWidget.html"
+], function(ListWidget, _ComplexValueWidget, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, lang, domConstruct, rowTemplate, template) {
+
+    var Row = declare([_ComplexValueWidget],{
+        templateString: rowTemplate,
+        onDestroy: function(evt) {}
+    });
+    
+    return declare([_ComplexValueWidget],{
+        baseClass: 'qedMultipleChoiceWidget',
+        templateString: template,
+        buildRendering: function() {
+            this.inherited(arguments);
+            this.itemsWidget = new ListWidget({
+                name: "items",
+                type: "SingleChoiceItem",
+                skipForm: true,
+                delay: 5,
+                createListElement: lang.hitch(this, "_createRow"),
+                createAvatar: lang.hitch(this, "_createAvatar")
+            }, this.itemsNode);
+        },
+        _createRow: function(id, item) {
+            var widget = new Row({
+                id: id,
+                value: item,
+                onDestroy: lang.hitch(this,function(evt){
+                    this.itemsWidget.removeItem(id,true);
+                    if ( evt ) { event.stop(evt); }
+                    return false;
+                })
+            });
+            widget.startup();
+            return widget;
+        },
+        _createAvatar: function(id, item) {
+            return domConstruct.create("div", {
+                innerHTML: item.text || "(empty)"
+            });
+        },
+        onAddItem: function(evt) {
+            this.itemsWidget.appendItem({},true);
+            if ( evt ) { event.stop(evt); }
+            return false;
+        }
+    });
+});
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputWidget.js	(revision 510)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/SingleChoiceInputWidget.js	(revision 510)
@@ -0,0 +1,33 @@
+define([
+    "dijit/_Container",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dijit/form/RadioButton",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/dom-construct",
+    "dojo/text!./templates/SingleChoiceInputWidget.html"
+], function(_Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, RadioButton, array, declare, domConstruct, template) {
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: template,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+
+            domConstruct.empty(this.domNode);
+            array.forEach(this.items, function(item){
+                var div = domConstruct.create("div", {
+                }, this.domNode, "last");
+                var input = new RadioButton({
+                    name: this.code + this.subcode,
+                    value: item.value
+                }).placeAt(div);
+                var label = domConstruct.create("label",{
+                    'for': input.id,
+                    innerHTML: item.text
+                }, div);
+            }, this);
+        }
+    });
+});
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputConfigWidget.js	(revision 510)
@@ -5,11 +5,6 @@
 ], function(_ComplexValueWidget, declare, template) {
     return declare([_ComplexValueWidget],{
-        type: 'StringInput',
-        templateString: template,
-        _getValueAttr: function() {
-            var value = this.inherited(arguments);
-            value.type = this.type;
-            return value;
-        }
+        baseClass: 'qedStringInputConfig',
+        templateString: template
     });
 });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/StringInputWidget.js	(revision 510)
@@ -9,5 +9,6 @@
     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
         templateString: template,
-        text: ''
+        text: '',
+        subcode: ''
     });
 });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/TextConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/TextConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/TextConfigWidget.js	(revision 510)
@@ -5,11 +5,5 @@
 ], function(_ComplexValueWidget, declare, template) {
     return declare([_ComplexValueWidget],{
-        type: 'Text',
-        templateString: template,
-        _getValueAttr: function() {
-            var value = this.inherited(arguments);
-            value.type = this.type;
-            return value;
-        }
+        templateString: template
     });
 });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputConfigWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputConfigWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputConfigWidget.js	(revision 510)
@@ -5,11 +5,6 @@
 ], function(_ComplexValueWidget, declare, template) {
     return declare([_ComplexValueWidget],{
-        type: 'TextInput',
-        templateString: template,
-        _getValueAttr: function() {
-            var value = this.inherited(arguments);
-            value.type = this.type;
-            return value;
-        }
+        baseClass: 'qedTextInputConfig',
+        templateString: template
     });
 });
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/TextInputWidget.js	(revision 510)
@@ -10,4 +10,5 @@
         templateString: template,
         text: '',
+        subcode: '',
         startup: function() {
             if ( this._started ) { return; }
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html	(revision 510)
@@ -1,7 +1,9 @@
 <form>
-    <div data-dojo-type="dijit/form/ValidationTextBox"
-         data-dojo-props="required: true, placeholder: 'Subcode'"
+  <div data-dojo-type="dijit/form/CheckBox"
+       data-dojo-props="disabled: true, readOnly: true"></div>
+  <div data-dojo-type="dijit/form/ValidationTextBox"
+       data-dojo-props="required: true, placeholder: 'Subcode'"
        class="subcode"
-         name="subcode"></div>
+       name="subcode"></div>
   <div data-dojo-type="dijit/form/ValidationTextBox"
        data-dojo-props="required: true, placeholder: 'Item text'"
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html	(revision 510)
@@ -1,7 +1,3 @@
 <form class="${baseClass}">
-  <div>
-    <label class="qedLabel" for="allowMultiple">Allow multiple</label>
-    <div name="allowMultiple" data-dojo-type="dijit/form/CheckBox"></div>
-  </div>
   <div data-dojo-attach-point="itemsNode">
   </div>
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html	(revision 510)
@@ -1,6 +1,6 @@
-<form>
+<form class="${baseClass}">
   <div>
     <label class="qedLabel" for="text">Subcode</label>
-    <div class="qedField"
+    <div class="qedField subcode"
          data-dojo-attach-point="subcodeBox"
          data-dojo-type="dijit/form/ValidationTextBox"
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigRowWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigRowWidget.html	(revision 510)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigRowWidget.html	(revision 510)
@@ -0,0 +1,13 @@
+<form>
+  <div data-dojo-type="dijit/form/RadioButton"
+       data-dojo-props="disabled: true, readOnly: true"></div>
+  <div data-dojo-type="dijit/form/ValidationTextBox"
+       data-dojo-props="required: true, placeholder: 'Value'"
+       class="subcode"
+       name="value"></div>
+  <div data-dojo-type="dijit/form/ValidationTextBox"
+       data-dojo-props="required: true, placeholder: 'Item text'"
+       name="text"></div>
+  <div data-dojo-type="dijit/form/Button"
+       data-dojo-attach-event="onClick:onDestroy">X</div>
+</form>
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigWidget.html	(revision 510)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputConfigWidget.html	(revision 510)
@@ -0,0 +1,13 @@
+<form class="${baseClass}">
+  <div>
+    <label for="subcode">Subcode</label>
+    <div class="subcode"
+         data-dojo-type="dijit/form/ValidationTextBox"
+         data-dojo-props="required: true, placeholder: 'Subcode'"
+         name="subcode"></div>
+  </div>
+  <div data-dojo-attach-point="itemsNode">
+  </div>
+  <div data-dojo-type="dijit/form/Button"
+       data-dojo-attach-event="onClick:onAddItem">Add item</div>
+</form>
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputWidget.html	(revision 510)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/SingleChoiceInputWidget.html	(revision 510)
@@ -0,0 +1,2 @@
+<div>
+</div>
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html	(revision 510)
@@ -1,6 +1,6 @@
-<form>
+<form class="${baseClass}">
   <div>
-    <label class="qedLabel" for="text">Subcode</label>
-    <div class="qedField"
+    <label class="qedLabel" for="subcode">Subcode</label>
+    <div class="qedField subcode"
          data-dojo-attach-point="subcodeBox"
          data-dojo-type="dijit/form/ValidationTextBox"
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextConfigWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextConfigWidget.html	(revision 510)
@@ -1,4 +1,7 @@
 <form>
   <label for="text" class="qedLabel">Text</label>
-  <textarea class="qedField" data-dojo-type="dijit/form/Textarea" name="text"></textarea>
+  <textarea class="qedField"
+            data-dojo-type="dijit/form/Textarea"
+            data-dojo-props="required: true"
+            name="text"></textarea>
 </form>
Index: /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html
===================================================================
--- /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html	(revision 509)
+++ /Dev/trunk/src/client/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html	(revision 510)
@@ -1,6 +1,6 @@
-<form>
+<form class="${baseClass}">
   <div>
     <label class="qedLabel" for="text">Subcode</label>
-    <div class="qedField"
+    <div class="qedField subcode"
          data-dojo-attach-point="subcodeBox"
          data-dojo-type="dijit/form/ValidationTextBox"
Index: /Dev/trunk/src/client/qed-client/widgets/LineWithActionsWidget.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/LineWithActionsWidget.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/widgets/LineWithActionsWidget.js	(revision 510)
@@ -1,14 +1,16 @@
-define(['dojo/_base/declare',
-    'dojo/_base/lang',
-    'dojo/on',
-    'dojo/dom',
-    'dojo/_base/event',
-    'dojo/dom-class',
-    'dijit/form/Button',
-    'dijit/_WidgetBase',
-    'dijit/_TemplatedMixin',
-    'dijit/_WidgetsInTemplateMixin',
-    'dojo/text!./templates/LineWithActionsWidget.html'
-],function(declare,lang,on,dom,event,domClass,Button,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,templateString){
+define([
+    "../lib/object",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dijit/form/Button",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/dom",
+    "dojo/dom-class",
+    "dojo/on",
+    "dojo/text!./templates/LineWithActionsWidget.html"
+], function(objectFuns, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, Button, declare, event, lang, dom, domClass, on, templateString) {
     return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin],{
         templateString: templateString,
@@ -33,37 +35,35 @@
                 return;
             }
-            for (var action in this.actions) {
-                if ( this.actions.hasOwnProperty(action) ) {
-                    var properties;
-                    if (this.actions[action].properties.blockButton === true) {
-                        properties = lang.mixin({
-                            baseClass: 'rftBlockButton',
-                            label: "Default",
-                            iconClass: 'rftIcon rftIcon'+this.actions[action].properties.icon,
-                            title: this.actions[action].properties.tooltip,
-                            onClick: lang.hitch(this, function(action, e){
-                                if ( action.callback ) { action.callback(e); }
-                                if ( e ) { event.stop(e); }
-                                return false;
-                            }, this.actions[action])
-                        }, this.actions[action].properties);
-                        new Button(properties).placeAt(this.buttonsNode);
-                    } else {
-                        properties = lang.mixin({
-                            baseClass: 'rftInlineButton',
-                            label: "Default",
-                            showLabel: false,
-                            iconClass: 'rftIcon rftIcon'+this.actions[action].properties.icon,
-                            title: this.actions[action].properties.tooltip,
-                            onClick: lang.hitch(this, function(action, e){
-                                if ( action.callback ) { action.callback(e); }
-                                if ( e ) { event.stop(e); }
-                                return false;
-                            }, this.actions[action])
-                        }, this.actions[action].properties);
-                        new Button(properties).placeAt(this.buttonsNode);
-                    }
+            objectFuns.forEach(this.actions, function(value,action){
+                var properties;
+                if (value.properties.blockButton === true) {
+                    properties = lang.mixin({
+                        baseClass: 'rftBlockButton',
+                        label: "Default",
+                        iconClass: 'rftIcon rftIcon'+value.properties.icon,
+                        title: value.properties.tooltip,
+                        onClick: lang.hitch(this, function(action, e){
+                            if ( action.callback ) { action.callback(e); }
+                            if ( e ) { event.stop(e); }
+                            return false;
+                        }, value)
+                    }, value.properties);
+                    new Button(properties).placeAt(this.buttonsNode);
+                } else {
+                    properties = lang.mixin({
+                        baseClass: 'rftInlineButton',
+                        label: "Default",
+                        showLabel: false,
+                        iconClass: 'rftIcon rftIcon'+value.properties.icon,
+                        title: value.properties.tooltip,
+                        onClick: lang.hitch(this, function(action, e){
+                            if ( action.callback ) { action.callback(e); }
+                            if ( e ) { event.stop(e); }
+                            return false;
+                        }, value)
+                    }, value.properties);
+                    new Button(properties).placeAt(this.buttonsNode);
                 }
-            }
+            },this);
         },
         refresh: function() {
Index: /Dev/trunk/src/client/qed-client/widgets/ObjectBox.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/ObjectBox.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/widgets/ObjectBox.js	(revision 510)
@@ -1,11 +1,12 @@
 define([
-    'dojo/_base/declare',
-    'dojo/_base/lang',
-    'dijit/_WidgetBase',
-    'dijit/_TemplatedMixin',
-    'dijit/_WidgetsInTemplateMixin',
-    './LineWithActionsWidget',
-    'dojo/text!./templates/ObjectBox.html'
-], function(declare, lang, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, LineWithActionsWidget, template){
+    "../lib/object",
+    "./LineWithActionsWidget",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/text!./templates/ObjectBox.html"
+], function(objectFuns, LineWithActionsWidget, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, lang, template) {
     return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
         baseClass: "rftObjectBox",
@@ -39,20 +40,16 @@
         },
         _createLine3Actions: function() {
-            var line3Actions = {};
-            for (var action in this.actions) {
-                if ( this.actions.hasOwnProperty(action) ) {
-                    line3Actions[action] = {
-                        callback: lang.hitch(this, function(callback){
-                            if ( this.value ) { callback(this.value); }
-                        }, this.actions[action]),
-                        properties: {
-                            blockButton: true,
-                            label: action,
-                            icon: action.charAt(0).toUpperCase()+action.slice(1)
-                        }
-                    };
-                }
-            }
-            return line3Actions;
+            return objectFuns.map(this.actions,function(value,name){
+                return {
+                    callback: lang.hitch(this, function(callback){
+                        if ( this.value ) { callback(this.value); }
+                    }, value),
+                    properties: {
+                        blockButton: true,
+                        label: name,
+                        icon: name.charAt(0).toUpperCase()+name.slice(1)
+                    }
+                };
+            },this);
         },
         _showInfoBox: function() {},
Index: /Dev/trunk/src/client/qed-client/widgets/Selector.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/Selector.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/widgets/Selector.js	(revision 510)
@@ -1,3 +1,4 @@
 define([
+    "../lib/object",
     "./LineWithActionsWidget",
     "dijit/_Container",
@@ -16,5 +17,5 @@
     "dojo/query",
     "dojo/text!./templates/Selector.html"
-], function(LineWithActionsWidget, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, registry, baseArray, declare, event, lang, Source, domClass, domConstruct, fx, query, templateString) {
+], function(objectFuns, LineWithActionsWidget, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, registry, baseArray, declare, event, lang, Source, domClass, domConstruct, fx, query, templateString) {
 
     function get(selector, item) {
@@ -62,30 +63,23 @@
         },
         _createTitleLine: function() {
-            var actions = {};
-            var action = null;
             var userActions =
                     lang.isFunction(this.selectedActions) ?
                     this.selectedActions() :
                     this.selectedActions;
-            if ( userActions ) {
-                for (var actionName in userActions) {
-                    if ( userActions.hasOwnProperty(actionName) ) {
-                        action = userActions[actionName];
-                        actions[actionName] = {
-                            callback: action.callback &&
-                                      lang.hitch(this,this._onSelectedAction,
-                                                 action.callback),
-                            properties: {
-                                blockButton: true,
-                                label: action.title || actionName,
-                                icon: action.icon,
-                                tooltip: action.description
-                            }
-
-                        };
-                    }
-                }
-            }
-
+
+            var actions = objectFuns.map(userActions||{},function(action,actionName){
+                return {
+                    callback: action.callback &&
+                              lang.hitch(this,this._onSelectedAction,
+                                         action.callback),
+                    properties: {
+                        blockButton: true,
+                        label: action.title || actionName,
+                        icon: action.icon,
+                        tooltip: action.description
+                    }
+
+                };
+            }, this);
             this._titleLine = new LineWithActionsWidget({
                 title: this.title,
@@ -205,26 +199,20 @@
         },
         _createLineNode: function(item) {
-            var actions = {};
             var userActions =
                     lang.isFunction(this.itemActions) ?
                     this.itemActions(item) :
                     this.itemActions;
-            if (userActions) {
-                for (var actionName in userActions) {
-                    if ( userActions.hasOwnProperty(actionName) ) {
-                        var action = userActions[actionName];
-                        actions[actionName] = {
-                            callback: action.callback &&
-                                      lang.partial(action.callback,item,this),
-                            properties: {
-                                blockButton: false,
-                                showLabel: false,
-                                icon: action.icon + " black",
-                                tooltip: action.description
-                            }
-                        };
-                    }
-                }
-            }
+            var actions = objectFuns.map(userActions||{},function(action,actionName){
+                return {
+                    callback: action.callback &&
+                              lang.partial(action.callback,item,this),
+                    properties: {
+                        blockButton: false,
+                        showLabel: false,
+                        icon: action.icon + " black",
+                        tooltip: action.description
+                    }
+                };
+            }, this);
             var w = new LineWithActionsWidget({
                 title: get(this.itemTitle,item),
Index: /Dev/trunk/src/client/qed-client/widgets/TabbedBrowser.js
===================================================================
--- /Dev/trunk/src/client/qed-client/widgets/TabbedBrowser.js	(revision 509)
+++ /Dev/trunk/src/client/qed-client/widgets/TabbedBrowser.js	(revision 510)
@@ -1,3 +1,4 @@
 define([
+    "../lib/object",
     "./Selector",
     "dijit/layout/ContentPane",
@@ -9,5 +10,5 @@
     "dojo/when",
     "dojox/widget/Standby"
-], function(Selector, ContentPane, TabContainer, array, declare, lang, win, when, Standby) {
+], function(objectFuns, Selector, ContentPane, TabContainer, array, declare, lang, win, when, Standby) {
     return declare([TabContainer],{
         tabPosition: 'left-h',
@@ -121,15 +122,10 @@
         removeItem: function(item) {
             var cmap = this._dataMap;
-            for ( var cat in cmap ) {
-                if ( cmap.hasOwnProperty(cat) ) {
-                    var tmap = cmap[cat];
-                    for ( var top in tmap ) {
-                        if ( tmap.hasOwnProperty(top) ) {
-                            var widget = tmap[top]._widget;
-                            if ( widget ) { widget.removeItem(item); }
-                        }
-                    }
-                }
-            }
+            objectFuns.forEach(cmap,function(tmap,cat){
+                objectFuns.forEach(tmap,function(topObj,top){
+                    var widget = topObj._widget;
+                    if ( widget ) { widget.removeItem(item); }
+                },this);
+            },this);
         },
         _busy: function() {
Index: /Dev/trunk/src/server/config/couchdb-schema.json
===================================================================
--- /Dev/trunk/src/server/config/couchdb-schema.json	(revision 509)
+++ /Dev/trunk/src/server/config/couchdb-schema.json	(revision 510)
@@ -114,4 +114,5 @@
           { "$ref": "#/definitions/content/NumberInput" },
           { "$ref": "#/definitions/content/ScaleInput" },
+          { "$ref": "#/definitions/content/SingleChoiceInput" },
           { "$ref": "#/definitions/content/MultipleChoiceInput" }
         ]
@@ -200,9 +201,35 @@
         "additionalProperties": false
       },
+      "SingleChoiceInput": {
+        "type": "object",
+        "properties": {
+          "type": { "type": "string", "pattern": "^SingleChoiceInput$" },
+          "items": { "type": "array", "items": {
+              "type": "object",
+              "properties": {
+                  "text": { "$ref": "#/definitions/nonEmptyString" },
+                  "value": { "$ref": "#/definitions/nonEmptyString" }
+              },
+              "required": ["text","value"],
+              "additionalProperties": false
+          } },
+          "otherItem": {
+              "type": "object",
+              "properties": {
+                  "text": { "$ref": "#/definitions/nonEmptyString" },
+                  "value": { "$ref": "#/definitions/nonEmptyString" }
+              },
+              "required": ["subcode","value"],
+              "additionalProperties": false
+          },
+          "subcode": { "$ref": "#/definitions/codeString" }
+        },
+        "required":["type","items","subcode"],
+        "additionalProperties": false
+      },
       "MultipleChoiceInput": {
         "type": "object",
         "properties": {
           "type": { "type": "string", "pattern": "^MultipleChoiceInput$" },
-          "allowMultiple": { "type": "boolean" },
           "items": { "type": "array", "items": {
               "type": "object",
