 			var newNameOrder:Array = []; // the order the object names appear in the vector
 			if (newStateArray != null)
 			{
+				// first pass: delay callbacks of all children
+				for each (objectName in _orderedNames)
+				{
+					callbacks = WeaveAPI.SessionManager.getCallbackCollection(_nameToObjectMap[objectName]);
+					delayed.push(callbacks)
+					callbacks.delayCallbacks();
+				}
+				
 				// initialize all the objects before setting their session states because they may refer to each other.
 				for (i = 0; i < newStateArray.length; i++)
 				{

			
			//trace(LinkableHashMap, "setSessionState "+setMissingValuesToNull, ObjectUtil.toString(newState.qualifiedClassNames), ObjectUtil.toString(newState));
			// first pass: make sure the types match and sessioned properties are instantiated.
			var i:int;
			var objectName:String;
			var className:String;
			var typedState:Object;

					// initialize object and remember if a new one was just created
					if (_nameToObjectMap[objectName] != initObjectByClassName(objectName, className))
						newObjects[objectName] = true;
				}
				
				// next pass: delay callbacks of all children (again, because there may be new children)
				for each (objectName in _orderedNames)
				{
					callbacks = WeaveAPI.SessionManager.getCallbackCollection(_nameToObjectMap[objectName]);
					delayed.push(callbacks)
					callbacks.delayCallbacks();
				}
				
				// next pass: copy the session state for each property that is defined.
				// Also remember the ordered list of names that appear in the session state.
				for (i = 0; i < newStateArray.length; i++)
				{
