Index: Dev/trunk/client/qed/css/qed.css
===================================================================
--- Dev/trunk/client/qed/css/qed.css	(revision 441)
+++ Dev/trunk/client/qed/css/qed.css	(revision 442)
@@ -1354,6 +1354,11 @@
   padding: 0 0 0 0;
 }
-/* line 19, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000319}}
+/* line 15, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000315}}
+#rft.claro .rftSelector .rftLineWithActions.dojoDndItem.dojoDndItemAnchor {
+  background-color: #ffffff;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000322}}
 #rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator {
   margin: 0 0 0 0;
@@ -1364,21 +1369,21 @@
   background-color: #bedead;
 }
-/* line 26, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000326}}
+/* line 29, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000329}}
 #rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.conflict {
   background-color: #ff0000;
 }
-/* line 29, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000329}}
+/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000332}}
 #rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.pending {
   background-color: #ff8000;
 }
-/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000332}}
+/* line 35, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000335}}
 #rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.success {
   background-color: #00ff00;
 }
-/* line 41, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000341}}
+/* line 44, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000344}}
 #rft.claro .rftSelector .rftSelectorOptions .rftLineWithActions,
 #rft.claro .rftSelector .rftSelectorSelected .rftLineWithActions {
@@ -1386,6 +1391,6 @@
   color: #111111;
 }
-/* line 50, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
-@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000350}}
+/* line 53, /home/hendrik/gamelab/qed.svn/Dev/trunk/client/qed/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/client\/qed\/css\/widgets\/Selector\.less}line{font-family:\0000353}}
 #rft.claro .rftSelector .rftSelectorOptions .rftLineWithActions .rftInlineButton .rftIcon {
   width: 16px;
Index: Dev/trunk/client/qed/css/widgets/Selector.less
===================================================================
--- Dev/trunk/client/qed/css/widgets/Selector.less	(revision 441)
+++ Dev/trunk/client/qed/css/widgets/Selector.less	(revision 442)
@@ -13,4 +13,7 @@
     .rftLineWithActions {
         .noOffset;
+        &.dojoDndItem.dojoDndItemAnchor {
+            background-color: @text;
+        }
     }
 
Index: Dev/trunk/client/qed/model/widgets/QuestionEditorPreviewItem.js
===================================================================
--- Dev/trunk/client/qed/model/widgets/QuestionEditorPreviewItem.js	(revision 441)
+++ Dev/trunk/client/qed/model/widgets/QuestionEditorPreviewItem.js	(revision 442)
@@ -55,4 +55,9 @@
             return !this._editing || this.innerWidget.validate();
         },
+        focus: function() {
+            if ( this._editing ) {
+                this.innerWidget.focus();
+            }
+        },
         showView: function() {
             if ( this._editing ) {
@@ -74,5 +79,5 @@
                 this.showEdit();
             }
-            evt && event.stop(evt);
+            if ( evt ) { event.stop(evt); }
             return false;
         },
@@ -141,5 +146,5 @@
                 }
             }
-            evt && event.stop(evt);
+            if ( evt ) { event.stop(evt); }
             return false;
         }
Index: Dev/trunk/client/qed/model/widgets/QuestionEditorToolkit.js
===================================================================
--- Dev/trunk/client/qed/model/widgets/QuestionEditorToolkit.js	(revision 441)
+++ Dev/trunk/client/qed/model/widgets/QuestionEditorToolkit.js	(revision 442)
@@ -20,5 +20,5 @@
 
         templateString: template,
-        _list: null,
+        _categoryList: null,
         _categorySelect: null,
         _categoryStore: null,
@@ -65,6 +65,24 @@
         },
 
-        postCreate: function(){
+        buildRendering: function() {
             this.inherited(arguments);
+
+            this._categoryList = new CategoryListView({
+                name: "categories"
+            }).placeAt(this.categoryListNode);
+
+            this._categoryStore = new Memory({data: [] });
+            this._categorySelect = new ComboBox( {
+                store: this._categoryStore,
+                searchAttr: "id"
+            }, this.categoryBoxNode);
+
+            this._topicStore = new Memory( {data: [] });
+            this._topicSelect = new ComboBox({
+                name: "topic",
+                store: this._topicStore,
+                searchAttr: "id"
+            }, this.topicBoxNode);
+
             var creator = lang.hitch(this,"_creator");
             this.contentSource = new Source(this.ToolkitContentSourceNode, {
@@ -85,18 +103,20 @@
             this.inputsSource.insertNodes(false, this._inputsItems);
         },
-        _setValueAttr: function(question) {
-            this._setupListView();
-            this._setupCategories();
-            this._setupTopic(question.topic);
-            this.propertiesForm.set('value', question);
-            this._list.set('value', question.categories);
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+
+            store.query("_design/questions/_view/all", {reduce:true, group:false, group_level:1})
+            .forPairs(lang.hitch(this, function(value, key) {
+                this._categoryStore.put({ id: key[0] });
+            }));
+
+            store.query("_design/questions/_view/all_topics", {reduce:true, group:true})
+            .forPairs(lang.hitch(this, function(value, key) {
+                this._topicStore.put({ id: key });
+            }));
         },
-        _getValueAttr: function() {
-            var value = this.propertiesForm.get('value');
-            value.categories = this._list.get('value');
-            return value;
-        },
-        onCategoryAdd: function() {
-            this._addCategory(this._categorySelect.get('displayedValue')); 
+        _onCategoryAdd: function() {
+            this._categoryList.appendItem(this._categorySelect.get('displayedValue')); 
             this._categorySelect.reset();
         },
@@ -122,37 +142,4 @@
                 type: ["questionContent"]
             };
-        },
-        _setupListView: function() {
-            this._list = new CategoryListView({
-            }).placeAt(this.listNode);
-            this._list.startup();                
-        },
-        _setupCategories: function() {
-            this._categoryStore = new Memory({data: [] });
-            store.query("_design/questions/_view/all", {reduce:true, group:false, group_level:1})
-            .forPairs(lang.hitch(this, function(value, key) {
-                this._categoryStore.put({ id: key[0] });
-            }));
-            this._categorySelect = new ComboBox( {
-                name: "categories",
-                store: this._categoryStore,
-                searchAttr: "id"
-            }, this.categoriesBoxNode);
-        },
-        _setupTopic: function(topic) {
-            this._topicStore = new Memory( {data: [] });
-            store.query("_design/questions/_view/all_topics", {reduce:true, group:true})
-            .forPairs(lang.hitch(this, function(value, key) {
-                this._topicStore.put({ id: key });
-            }));
-            this._topicSelect = new ComboBox( {
-                name: "topic",
-                store: this._topicStore,
-                searchAttr: "id",
-                value: topic
-            }, this.topicBoxNode);
-        },
-        _addCategory: function(item) {
-            this._list.appendItem(item);
         }
 
Index: Dev/trunk/client/qed/model/widgets/templates/QuestionEditorToolkit.html
===================================================================
--- Dev/trunk/client/qed/model/widgets/templates/QuestionEditorToolkit.html	(revision 441)
+++ Dev/trunk/client/qed/model/widgets/templates/QuestionEditorToolkit.html	(revision 442)
@@ -1,30 +1,24 @@
 <div>
-	<div data-dojo-type="dojox/widget/TitleGroup">
+	<div data-dojo-type="qed/widgets/TitleGroup">
 		<div data-dojo-type="dijit/TitlePane" class="orange" data-dojo-props="open:true" title="Properties" data-dojo-props="iconClass:'rftIcon rftIconProperties'">
-            <div data-dojo-type="dijit/form/Form" data-dojo-attach-point="propertiesForm">
-				<fieldset class="align">
-					<label>Title:</label><input data-dojo-type="dijit/form/TextBox" name="title"/>
-					<label>Code:</label><input data-dojo-type="dijit/form/TextBox" name= "code"/>
-					<label>Categories:</label>
-					<div data-dojo-attach-point="listNode" class="rftLineListView"></div> 
-					<div data-dojo-attach-point="categoriesBoxNode"></div>
-					<button class="inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onCategoryAdd" data-dojo-props="baseClass:'rftBlockButton', iconClass: 'rftIcon rftIconPlus'">Add</button><br/>
-					<label>Topic:</label>
-					<div data-dojo-attach-point="topicBoxNode"></div>
-					<label>Description:</label><textarea data-dojo-type="dijit/form/Textarea" name="description"></textarea>
-				</fieldset>
-			</div>
+            <fieldset class="align">
+                <label>Title:</label><input data-dojo-type="dijit/form/ValidationTextBox" required="required" name="title"/>
+                <label>Code:</label><input data-dojo-type="dijit/form/ValidationTextBox" required="required" name="code"/>
+                <label>Categories:</label>
+                <div data-dojo-attach-point="categoryListNode" class="rftLineListView"></div> 
+                <div data-dojo-attach-point="categoryBoxNode"></div>
+                <button class="inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:_onCategoryAdd" data-dojo-props="baseClass:'rftBlockButton', iconClass: 'rftIcon rftIconPlus'">Add</button><br/>
+                <label>Topic:</label>
+                <div data-dojo-attach-point="topicBoxNode"></div>
+                <label>Description:</label><textarea data-dojo-type="dijit/form/Textarea" name="description"></textarea>
+            </fieldset>
 		</div>
 
 		<div data-dojo-type="dijit/TitlePane" title="Content" data-dojo-props="iconClass:'rftIcon rftIconPlus', open:false">
-			<div data-dojo-attach-point="ToolkitContentSourceNode">
-				
-			</div>
+			<div data-dojo-attach-point="ToolkitContentSourceNode"></div>
 		</div>
 
 		<div data-dojo-type="dijit/TitlePane" title="Inputs" data-dojo-props="iconClass:'rftIcon rftIconInput', open:false">
-			<div data-dojo-attach-point="ToolkitInputsSourceNode">
-				
-			</div>
+			<div data-dojo-attach-point="ToolkitInputsSourceNode"></div>
 		</div>
 	</div>
Index: Dev/trunk/client/qed/pages/question.js
===================================================================
--- Dev/trunk/client/qed/pages/question.js	(revision 441)
+++ Dev/trunk/client/qed/pages/question.js	(revision 442)
@@ -1,22 +1,39 @@
 define([
-    'dojo/_base/declare',
-    'dojo/_base/event',
-    'dojo/_base/lang',
-    'dojo/when',
-    '../store',
-    '../app/Content',
-    '../app/Router',
-    '../app/Page',
-    '../model/classes/Question',
-    '../model/widgets/QuestionEditorPreview',
-    '../model/widgets/QuestionEditorToolkit',
-    'dojo/text!./templates/question.html'
-],function(declare, event, lang, when, store, Content, Router, Page, Question, QuestionEditorPreview, QuestionEditorToolkit, template){
-    return declare([Page], {
+    "../app/Content",
+    "../app/Page",
+    "../app/Router",
+    "../model/classes/Question",
+    "../model/widgets/QuestionEditorPreview",
+    "../model/widgets/QuestionEditorToolkit",
+    "../store",
+    "../widgets/_ComplexValueMixin",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/when",
+    "dojo/text!./templates/question.html"
+], function(Content, Page, Router, Question, QuestionEditorPreview, QuestionEditorToolkit, store, _ComplexValueMixin, declare, event, lang, when, template) {
+    return declare([Page,_ComplexValueMixin], {
         templateString: template,
-        question: null,
         _toolkit: null,
         _preview: null,
+        value: null,
         
+        buildRendering: function() {
+            this.inherited(arguments);
+
+            this._toolkit = new QuestionEditorToolkit({
+            },this.QuestionEditorToolkitNode);
+            this._toolkit.on('submit',lang.hitch(this,"_onSave"));
+            this._toolkit.startup();
+
+            this._preview = new QuestionEditorPreview({ 
+                name: 'content',
+                delay: 5,
+                region: 'center'
+            });
+            this._preview.startup();
+            this.addChild(this._preview);
+        },
         startup: function() {
             if ( this._started ) { return; }
@@ -25,29 +42,27 @@
                 throw new Error("Error: no reference to object set!");
             }
-            this._setupEditor();
             if (this.questionId === "new") {
-                this.question = Question.create();
-                this._refresh();
+                this.set('value', Question.create());
             } else {
                 when(store.get(this.questionId))
-                .then(lang.hitch(this, function(obj) {
-                    this.question = obj;
-                    this._refresh();
+                .then(lang.hitch(this, function(value) {
+                    this.set('value', value);
                 }));
             }
         },
-        onLeave: function() {
+        _setValueAttr: function(value) {
+            this.value = value;
             this.inherited(arguments);
+            this.titleNode.innerHTML = Question.DisplayTitle.get(value);
         },
-        _refresh: function () {
-            this.titleNode.innerHTML = Question.DisplayTitle.get(this.question);
-            this._toolkit.set('value', this.question);
-            this._preview.set('value', Question.Content.get(this.question));
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            lang.mixin(this.value, value);
+            return this.value;
         },
         _onSave: function(evt) {
-            if ( this._preview.validate() ) {
-                lang.mixin(this.question, this._toolkit.get('value'));
-                Question.Content.set(this.question, this._preview.get('value'));
-                store.put(this.question)
+            if ( this.validate() ) {
+                var value = this.get('value');
+                store.put(value)
                 .then(function() {
                     Router.go('/questions');
@@ -62,18 +77,4 @@
             Router.go('/questions');
             return true;
-        },
-        _setupEditor: function() {
-            this._toolkit = new QuestionEditorToolkit({
-            },this.QuestionEditorToolkitNode);
-            this._toolkit.on('submit',lang.hitch(this,"_onSave"));
-            this._toolkit.startup();
-
-            this._preview = new QuestionEditorPreview({ 
-                name: 'content',
-                delay: 5,
-                region: 'center'
-            });
-            this._preview.startup();
-            this.addChild(this._preview);
         }
     });
Index: Dev/trunk/client/qed/pages/session.js
===================================================================
--- Dev/trunk/client/qed/pages/session.js	(revision 441)
+++ Dev/trunk/client/qed/pages/session.js	(revision 442)
@@ -51,7 +51,6 @@
         onSave: function(evt) {
             lang.mixin(this.session,this.propertiesForm.get('value'));
-            this.session.accounts = array.map(this._accountList.get('value'),
-                                              function(item){
-                                                  return store.getIdentity(item);
+            this.session.accounts = array.map(this._accountList.get('value'), function(item){
+                return store.getIdentity(item);
             });
             store.put(this.session)
Index: Dev/trunk/client/qed/widgets/ListWidget.js
===================================================================
--- Dev/trunk/client/qed/widgets/ListWidget.js	(revision 441)
+++ Dev/trunk/client/qed/widgets/ListWidget.js	(revision 442)
@@ -90,5 +90,23 @@
         _setValueAttr: function(value) {
             this.clear();
-            this.appendItems(value);
+            this.appendItems(value || []);
+        },
+        _setDisabledAttr: function(value) {
+            this._set("disabled", value);
+            array.forEach(this.getChildren(), function(child){
+                child.set("disabled", value);
+            });
+        },
+        _setReadOnlyAttr: function(value) {
+            this._set("readOnly", value);
+            array.forEach(this.getChildren(), function(child){
+                child.set("readOnly", value);
+            });
+        },
+        focus: function() {
+            var children = this.getChildren();
+            if ( children.length > 0 ) {
+                children[0].focus();
+            }
         },
         appendItems: function(items) {
Index: Dev/trunk/client/qed/widgets/TitleGroup.js
===================================================================
--- Dev/trunk/client/qed/widgets/TitleGroup.js	(revision 441)
+++ Dev/trunk/client/qed/widgets/TitleGroup.js	(revision 442)
@@ -1,11 +1,15 @@
-require(['dojo/_base/declare','dojo/_base/query','dijit/registry','dojox/widget/TitleGroup'],
-    function(declare,query,registry,TitleGroup){
-        return declare([TitleGroup],{
-            getChildren: function() {
-                return query("> .dijitTitlePane", this.domNode)
-                .map(function(node){
-                    return registry.byNode(node);
-                });
-            }
-        });
+define([
+    "dijit/registry",
+    "dojo/_base/declare",
+    "dojo/_base/query",
+    "dojox/widget/TitleGroup"
+], function(registry, declare, query, TitleGroup) {
+    return declare([TitleGroup],{
+        getChildren: function() {
+            return query("> .dijitTitlePane", this.domNode)
+            .map(function(node){
+                return registry.byNode(node);
+            });
+        }
     });
+});
