diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/LogUtil.as b/bigbluebutton-client/src/org/bigbluebutton/common/LogUtil.as
index 549e83c4981fec5cafbb4052017591c1d565b5f4..3a164ba56067d150bccfd8079eff079ae97721c7 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/common/LogUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/common/LogUtil.as
@@ -50,6 +50,19 @@ package org.bigbluebutton.common
 			logger.warn(message);
 		}
 		
+		public static function traceObject(obj : *, level : int = 0):void
+		{
+			var tabs : String = "";
+			for ( var i : int = 0 ; i < level ; ++i ) {
+				tabs += "        "
+			}
+			
+			for ( var prop : String in obj ){
+				debug( tabs + "[" + prop + "] -> " + obj[ prop ] );
+				traceObject( obj[ prop ], level + 1 );
+			}
+		}
+
 		private static function get logger():ILogger {
 			return Log.getLogger(LOGGER);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/events/LayoutsLoadedEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/events/LayoutsLoadedEvent.as
index 4fa32509c006b5172aefa6dc4ef360f9f558dd87..d3f7ece7f4f82ad9fb7d40dca80157bbd96d858e 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/events/LayoutsLoadedEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/events/LayoutsLoadedEvent.as
@@ -24,7 +24,6 @@ package org.bigbluebutton.modules.layout.events
 	public class LayoutsLoadedEvent extends Event
 	{
 		public static const LAYOUTS_LOADED_EVENT:String = "LAYOUTS_LOADED_EVENT";
-		public static const SEND_LAYOUTS_LOADED_EVENT:String = "SEND_LAYOUTS_LOADED_EVENT";
 		public var layouts:LayoutDefinitionFile = null;
 		public var success:Boolean = false;
 		public var error:TypeError = null;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as
index 2056d3433432ddd2099f05495b85be18446885b7..8260fe8e2ff79f9e12d7811ca5b9599afd9e0217 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as
@@ -59,9 +59,8 @@ package org.bigbluebutton.modules.layout.managers
 		private var _containerDeactivated:Boolean = false;
 		private var _sendCurrentLayoutUpdateTimer:Timer = new Timer(500,1);
 		private var _applyCurrentLayoutTimer:Timer = new Timer(150,1);
-		private var _delayToSendLayoutsToCombobox:Timer = new Timer(60,0);
 		private var _customLayoutsCount:int = 0;
-		private var comboboxIsInitialized:Boolean = false;
+		private var _serverLayoutsLoaded:Boolean = false;
 		private var _eventsToDelay:Array = new Array(MDIManagerEvent.WINDOW_RESTORE,
 				MDIManagerEvent.WINDOW_MINIMIZE,
 				MDIManagerEvent.WINDOW_MAXIMIZE);
@@ -74,33 +73,6 @@ package org.bigbluebutton.modules.layout.managers
 			_sendCurrentLayoutUpdateTimer.addEventListener(TimerEvent.TIMER, function(e:TimerEvent):void {
 				sendLayoutUpdate(updateCurrentLayout());
 			});
-			
-			_delayToSendLayoutsToCombobox.addEventListener(TimerEvent.TIMER, function(e:TimerEvent):void {
-				checkIfCanSendLayoutToCombobox();
-			});
-		}
-		
-		
-		public function sendPopulateComboboxEvent():void {
-			LogUtil.debug("Sending layout to populate combobox");
-			var sendLayoutsLoaded:LayoutsLoadedEvent = new LayoutsLoadedEvent(LayoutsLoadedEvent.SEND_LAYOUTS_LOADED_EVENT );
-		    	sendLayoutsLoaded.layouts = _layouts;
-			_globalDispatcher.dispatchEvent(sendLayoutsLoaded);
-		}
-		
-		
-		public function initDelayTimerUntilComboboxIsInitialized():void {
-			_delayToSendLayoutsToCombobox.start();
-		}
-		
-		
-		public function checkIfCanSendLayoutToCombobox():void {
-			if(comboboxIsInitialized) {
-				if(_delayToSendLayoutsToCombobox != null) {
-					_delayToSendLayoutsToCombobox.stop();
-				}
-				sendPopulateComboboxEvent();
-			}
 		}
 		
 		public function loadServerLayouts(layoutUrl:String):void {
@@ -109,12 +81,7 @@ package org.bigbluebutton.modules.layout.managers
 			loader.addEventListener(LayoutsLoadedEvent.LAYOUTS_LOADED_EVENT, function(e:LayoutsLoadedEvent):void {
 				if (e.success) {
 					_layouts = e.layouts;
-					if(comboboxIsInitialized) {
-						sendPopulateComboboxEvent();
-					}
-					else {
-						initDelayTimerUntilComboboxIsInitialized();
-					}
+					_serverLayoutsLoaded = true;
 					LogUtil.debug("LayoutManager: layouts loaded successfully");
 				} else {
 					LogUtil.error("LayoutManager: layouts not loaded (" + e.error.message + ")");
@@ -122,9 +89,13 @@ package org.bigbluebutton.modules.layout.managers
 			});
 			loader.loadFromUrl(layoutUrl);
 		}
-		
-		public function comboboxInitialized():void {
-			comboboxIsInitialized = true;
+
+		public function onComboLayoutCreated():void {
+			if (_serverLayoutsLoaded) {
+				var layoutsLoaded:LayoutsLoadedEvent = new LayoutsLoadedEvent();
+				layoutsLoaded.layouts = _layouts;
+				_globalDispatcher.dispatchEvent(layoutsLoaded);
+			}
 		}
 		
 		public function saveLayoutsToFile():void {
@@ -144,15 +115,14 @@ package org.bigbluebutton.modules.layout.managers
 					/*
 					 * \TODO why do I need to create a new Event for this?
 					 */
-					//var layoutsLoaded:LayoutsLoadedEvent = new LayoutsLoadedEvent();
-					//layoutsLoaded.layouts = _layouts;
-					//_globalDispatcher.dispatchEvent(layoutsLoaded);
+					var layoutsLoaded:LayoutsLoadedEvent = new LayoutsLoadedEvent();
+					layoutsLoaded.layouts = _layouts;
+					_globalDispatcher.dispatchEvent(layoutsLoaded);
+					
 					/*
 					 *	it will update the ComboBox label, and will go back to this class
 					 * 	to apply the default layout
 					 */
-					 
-					 sendPopulateComboboxEvent();
 					_globalDispatcher.dispatchEvent(new LayoutEvent(LayoutEvent.APPLY_DEFAULT_LAYOUT_EVENT));
 					
 					Alert.show(ResourceUtil.getInstance().getString('bbb.layout.load.complete'), "", Alert.OK, _canvas);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as
index 030d651260c5d4f9c3be8b4c9206857df961f3fa..1fcbf6e74aa86ba39a5d4752ee68e3e573f49904 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as
@@ -71,25 +71,6 @@ package org.bigbluebutton.modules.layout.managers
 //				LogUtil.debug("==========> " + key + " order: " + _windowsOrder[key].order);
 			}
 			_windowsOrder[type] = { order: 0 };
-			
-//			if (_windowsOrder.length > window.windowManager.windowList.length) {
-//				var openWindows:Array = new Array();
-//				for each (var tmp:MDIWindow in window.windowManager.windowList) {
-//					openWindows.push(WindowLayout.getType(tmp));
-//				}
-//				for (key in _windowsOrder) {
-//					if (openWindows.indexOf(key) == -1) {
-//						LogUtil.debug("Removing order for " + key);
-//						delete _windowsOrder[key];
-//					}
-//				}
-//			}
-//			LogUtil.debug("Manipulating " + type);
-//			for (key in _windowsOrder) {
-//				LogUtil.debug("=====> " + key + " order: " + _windowsOrder[key].order);
-//			}
-			
-//			window.windowManager.bringToFront(window);
 		}
 		
 		public function getOrderByType(type:String):int {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/maps/LayoutEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/maps/LayoutEventMap.mxml
index 346307a37e1b11be1e60fdb3bebd6856e0057bf5..ef331f1bcaae61c7ec5742721bedb3b68e708646 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/maps/LayoutEventMap.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/maps/LayoutEventMap.mxml
@@ -54,10 +54,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
     </EventHandlers>
     
     <EventHandlers type="{ComboBoxCreatedEvent.COMBOBOX_CREATED_EVENT}">
-   		<MethodInvoker generator="{LayoutManager}" method="comboboxInitialized"/>
-	</EventHandlers>
-    
-    
+   		<MethodInvoker generator="{LayoutManager}" method="onComboLayoutCreated"/>
+    </EventHandlers>
     
     <EventHandlers type="{LayoutEvent.STOP_LAYOUT_MODULE_EVENT}">
    		<MethodInvoker generator="{LayoutService}" method="leave" />
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as
index dce1967e28536d45e8b93814111035473e5832d2..9fbe8168ceac86a17e162c0d12224f1612f86b4a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as
@@ -32,7 +32,7 @@ package org.bigbluebutton.modules.layout.model {
 		[Bindable] public var name:String;
 		// default is a reserved word in actionscript
 		[Bindable] public var defaultLayout:Boolean = false;
-		private var _windows:Dictionary = new Dictionary();
+		private var _layoutsPerRole:Dictionary = new Dictionary();
 		
 		static private var _ignoredWindows:Array = new Array("AvatarWindow", "PublishWindow", 
 				"VideoWindow", "DesktopPublishWindow", "DesktopViewWindow",
@@ -50,12 +50,12 @@ package org.bigbluebutton.modules.layout.model {
 			if (vxml.@role != undefined && _roles.indexOf(vxml.@role.toString().toUpperCase()) != -1) {
 				role = vxml.@role.toString().toUpperCase();
 			}
-			if (!_windows.hasOwnProperty(role))
-				_windows[role] = new Dictionary();
+			if (!_layoutsPerRole.hasOwnProperty(role))
+				_layoutsPerRole[role] = new Dictionary();
 			for each (var n:XML in vxml.window) {
 				var window:WindowLayout = new WindowLayout();
 				window.load(n);
-				_windows[role][window.name] = window;
+				_layoutsPerRole[role][window.name] = window;
 			}
 		}
 		
@@ -72,21 +72,21 @@ package org.bigbluebutton.modules.layout.model {
 		}
 
 		private function get myLayout():Dictionary {
-			var hasViewerLayout:Boolean = _windows.hasOwnProperty(Role.VIEWER);
-			var hasModeratorLayout:Boolean = _windows.hasOwnProperty(Role.MODERATOR);
-			var hasPresenterLayout:Boolean = _windows.hasOwnProperty(Role.PRESENTER);
+			var hasViewerLayout:Boolean = _layoutsPerRole.hasOwnProperty(Role.VIEWER);
+			var hasModeratorLayout:Boolean = _layoutsPerRole.hasOwnProperty(Role.MODERATOR);
+			var hasPresenterLayout:Boolean = _layoutsPerRole.hasOwnProperty(Role.PRESENTER);
 			
 			if (UserManager.getInstance().getConference().amIPresenter && hasPresenterLayout) {
-        return _windows[Role.PRESENTER];        
-      } else if (UserManager.getInstance().getConference().amIModerator() && hasModeratorLayout) {
-        return _windows[Role.MODERATOR];        
-      } else if (hasViewerLayout) {
-        return _windows[Role.VIEWER];        
-      } else if (hasModeratorLayout) {
-        return _windows[Role.MODERATOR];        
-      } else if (hasPresenterLayout) {
-        return _windows[Role.PRESENTER];        
-      } else {
+				return _layoutsPerRole[Role.PRESENTER];
+			} else if (UserManager.getInstance().getConference().amIModerator() && hasModeratorLayout) {
+				return _layoutsPerRole[Role.MODERATOR];
+			} else if (hasViewerLayout)   {
+				return _layoutsPerRole[Role.VIEWER];
+			} else if (hasModeratorLayout) {
+				return _layoutsPerRole[Role.MODERATOR];
+			} else if (hasPresenterLayout) {
+				return _layoutsPerRole[Role.PRESENTER];
+			} else {
 				LogUtil.error("There's no layout that fits the participants profile");
         trace("LayoutDefinition::getMyLayout There's no layout that fits the participants profile");
 				return null;
@@ -112,8 +112,8 @@ package org.bigbluebutton.modules.layout.model {
 			var xml:XML = <layout-block/>;
 			var tmp:XML;
 			for each (var value:String in _roles) {
-				if (_windows.hasOwnProperty(value)) {
-					tmp = windowsToXml(_windows[value]);
+				if (_layoutsPerRole.hasOwnProperty(value)) {
+					tmp = windowsToXml(_layoutsPerRole[value]);
 					if (value != Role.VIEWER)
 						tmp.@role = value;
 					xml.appendChild(tmp);
@@ -178,22 +178,161 @@ package org.bigbluebutton.modules.layout.model {
 				return;
 
 			adjustWindowsOrder(canvas);
+			
+			var windows:Array = canvas.windowManager.windowList;
+			// LogUtil.traceObject(myLayout);
+			var transformedLayout:Dictionary = generateWindowsTransformations(myLayout, windows, canvas.width, canvas.height);
+			
+			var type:String;
+			for each (var window:MDIWindow in windows) {
+					type = WindowLayout.getType(window);
+	
+				if (!ignoreWindowByType(type))
+					WindowLayout.setLayout(canvas, window, transformedLayout[type]);
+			}
+		}
+		
+		// http://stackoverflow.com/questions/12162607/how-to-clone-a-dictionary-and-its-content
+		private function cloneLayoutDictionary(original:Dictionary):Dictionary {
+		    var cloned:Dictionary = new Dictionary();
+		    for(var key:Object in original) {
+				cloned[key] = original[key].clone();
+		    }
+		    return cloned;
+		}
+		
+		private function generateWindowsTransformations(layout:Dictionary, windows:Array, screen_w:int, screen_h:int):Dictionary {
+			var type:String;
+			var i:int;
+			var items:Array = new Array();
+			var item:Object;
+			var copiedLayout:Dictionary = cloneLayoutDictionary(layout);
 
-			for each (var window:MDIWindow in canvas.windowManager.windowList) {
-				applyToWindow(canvas, window);
+			for each (var window:MDIWindow in windows) {
+				type = WindowLayout.getType(window);
+				if (ignoreWindowByType(type) || !copiedLayout.hasOwnProperty(type))
+					continue;
+				
+				items.push({
+					type: type,
+					x0: copiedLayout[type].x,
+					y0: copiedLayout[type].y,
+					w0: copiedLayout[type].width,
+					h0: copiedLayout[type].height,
+					fixed_w: copiedLayout[type].minWidth != -1 && copiedLayout[type].minWidth / screen_w > copiedLayout[type].width,
+					fixed_h: copiedLayout[type].minHeight != -1 && copiedLayout[type].minHeight / screen_h > copiedLayout[type].height,
+					min_w: copiedLayout[type].minWidth != -1? copiedLayout[type].minWidth / screen_w: copiedLayout[type].width,
+					min_h: copiedLayout[type].minHeight != -1? copiedLayout[type].minHeight / screen_h: copiedLayout[type].height,
+					fixed_on_left0: 0.0,
+					not_fixed_on_left0: 0.0
+				});
 			}
+
+			items.sortOn("x0", Array.NUMERIC);
+
+			/**
+			 *	First we are interested in discovering which windows have a fixed 
+			 *	width. We understand as fixed width the window that will be restricted 
+			 *	in width by the minWidth parameter. The next procedure will discover 
+			 *	how many pixels are fixed or non-fixed at the left of each window. 
+			 *	This is an important information because it will say how the windows 
+			 *	will be positioned after the transformation.
+			 */
+			var pivot0:Number = 0.0;
+			var pivot1:Number = 0.0;
+			var fixed_w0:Number = 0.0;
+			var fixed_w1:Number = 0.0;
+			for (i = 0; i < items.length; ++i) {
+				item = items[i];
+				
+				item.fixed_on_left0 = fixed_w0 - (pivot0 > item.x0? pivot0 - item.x0: 0);
+				item.not_fixed_on_left0 = item.x0 - item.fixed_on_left0;
+				item.fixed_on_left1 = fixed_w1 - (pivot0 > item.x0? pivot1 - item.x0: 0);
+
+				if (item.fixed_w) {
+					item.w1 = item.min_w;
+
+					if (pivot0 <= item.x0) {
+						fixed_w0 += item.w0;
+					} else if (pivot0 < item.x0 + item.w0) {
+						fixed_w0 += item.x0 + item.w0 - pivot0;
+					}
+					pivot0 = Math.max(pivot0, item.x0 + item.w0);
+
+					if (pivot1 <= item.x0) {
+						fixed_w1 += item.w1;
+					} else if (pivot1 < item.x0 + item.w1) {
+						fixed_w1 += item.x0 + item.w1 - pivot1;
+					}
+					pivot1 = Math.max(pivot1, item.x0 + item.w1);
+				} else {
+					pivot0 = Math.max(pivot0, item.x0);
+					pivot1 = Math.max(pivot1, item.x0);
+				}
+			}
+
+			var not_fixed_w0:Number = 1 - fixed_w0;
+			var not_fixed_w1:Number = 1 - fixed_w1;
+			var not_fixed_multiplier:Number = (fixed_w1 - fixed_w0) / not_fixed_w0;
+
+			/**
+			 *	The same procedure is executed (using a pivot) to discover how 
+			 *	many pixels aren't fixed at the left of each window AFTER the transformation, 
+			 *	and then generate the transformation at the windows in position and width.
+			 */
+			pivot0 
+				= pivot1 
+				= fixed_w0 
+				= fixed_w1 
+				= not_fixed_w0 
+				= not_fixed_w1 
+				= 0.0;
+			for (i = 0; i < items.length; ++i) {
+				item = items[i];
+
+				item.not_fixed_on_left1 = item.not_fixed_on_left0 - item.not_fixed_on_left0 * not_fixed_multiplier;
+
+				item.w1 = item.fixed_w? item.min_w: item.w0 - item.w0 * not_fixed_multiplier;
+				item.x1 = item.x0 + (item.fixed_on_left1 - item.fixed_on_left0) + (item.not_fixed_on_left1 - item.not_fixed_on_left0);
+
+				if (item.fixed_w) {
+					item.w1 = item.min_w;
+
+					if (pivot0 <= item.x0) {
+						fixed_w0 += item.w0;
+					} else if (pivot0 < item.x0 + item.w0) {
+						fixed_w0 += item.x0 + item.w0 - pivot0;
+					}
+					pivot0 = Math.max(pivot0, item.x0 + item.w0);
+
+					if (pivot1 <= item.x0) {
+						fixed_w1 += item.w1;
+					} else if (pivot1 < item.x0 + item.w1) {
+						fixed_w1 += item.x0 + item.w1 - pivot1;
+					}
+					pivot1 = Math.max(pivot1, item.x0 + item.w1);
+				} else {
+					pivot0 = Math.max(pivot0, item.x0);
+					pivot1 = Math.max(pivot1, item.x0);
+				}
+				
+				copiedLayout[item.type].x = item.x1;
+				copiedLayout[item.type].y = item.y0;
+				copiedLayout[item.type].width = item.w1;
+				copiedLayout[item.type].height = item.h0;
+			}
+			
+			return copiedLayout;
 		}
 		
-		public function applyToWindow(canvas:MDICanvas, window:MDIWindow, type:String=null):void {
+		private function apply(canvas:MDICanvas, window:MDIWindow, type:String=null):void {
 			if (type == null) {
-        type = WindowLayout.getType(window);
-      }
-				
+				type = WindowLayout.getType(window);
+			}
 
 			if (!ignoreWindowByType(type)) {
-//        trace("LayoutDefinition::applyToWindow [" + window.name + ", type=" + type + "]");
-        WindowLayout.setLayout(canvas, window, myLayout[type]);
-      }				
+				WindowLayout.setLayout(canvas, window, myLayout[type]);
+			}
 		}
 		
 		static private function ignoreWindowByType(type:String):Boolean {
@@ -209,11 +348,11 @@ package org.bigbluebutton.modules.layout.model {
 			//LogUtil.debug("CHAD: Canvas is " + (canvas == null ? "null" : "not null") + ", Name is " + (name == null ? "null" : "not null"));
 			var layoutDefinition:LayoutDefinition = new LayoutDefinition();
 			layoutDefinition.name = name;
-			layoutDefinition._windows[Role.VIEWER] = new Dictionary();
+			layoutDefinition._layoutsPerRole[Role.VIEWER] = new Dictionary();
 			for each (var window:MDIWindow in canvas.windowManager.windowList) {
 				var layout:WindowLayout = WindowLayout.getLayout(canvas, window);
 				if (!ignoreWindowByType(layout.name))
-					layoutDefinition._windows[Role.VIEWER][layout.name] = layout;
+					layoutDefinition._layoutsPerRole[Role.VIEWER][layout.name] = layout;
 			}
 			return layoutDefinition;
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as
index 7e23c8ac1d592b0ad88eb48b0bee8ccaa60d6887..d7f555007c16a3442db01f78f67ef56f81882511 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as
@@ -39,6 +39,8 @@ package org.bigbluebutton.modules.layout.model {
 		[Bindable] public var name:String;
 		[Bindable] public var width:Number;
 		[Bindable] public var height:Number;
+		[Bindable] public var minWidth:int = -1;
+		[Bindable] public var minHeight:int = -1;
 		[Bindable] public var x:Number;
 		[Bindable] public var y:Number;
 		[Bindable] public var minimized:Boolean = false;
@@ -51,6 +53,24 @@ package org.bigbluebutton.modules.layout.model {
 
 		static private var EVENT_DURATION:int = 500;
 
+		public function clone():WindowLayout {
+			var cloned:WindowLayout = new WindowLayout();
+			cloned.name = this.name;
+			cloned.width = this.width;
+			cloned.height = this.height;
+			cloned.minWidth = this.minWidth;
+			cloned.minHeight = this.minHeight;
+			cloned.x = this.x;
+			cloned.y = this.y;
+			cloned.minimized = this.minimized;
+			cloned.maximized = this.maximized;
+			cloned.hidden = this.hidden;
+			cloned.resizable = this.resizable;
+			cloned.draggable = this.draggable;
+			cloned.order = this.order;
+			return cloned;
+		}
+
 		public function load(vxml:XML):void {
 //      trace("Load layout \n" + vxml.toXMLString() + "\n");
 			if (vxml != null) {
@@ -69,6 +89,13 @@ package org.bigbluebutton.modules.layout.model {
 				if (vxml.@y != undefined) {
 					y = Number(vxml.@y);
 				}
+				if (vxml.@minWidth != undefined) {
+					minWidth = int(vxml.@minWidth);
+				}
+				// not implemented yet
+				//if (vxml.@minHeight != undefined) {
+				//	minHeight = int(vxml.@minHeight);
+				//}
 				if (vxml.@minimized != undefined) {
 					minimized = (vxml.@minimized.toString().toUpperCase() == "TRUE") ? true : false;
 				}
@@ -98,6 +125,8 @@ package org.bigbluebutton.modules.layout.model {
 			layout.name = getType(window);
 			layout.width = window.width / canvas.width;
 			layout.height = window.height / canvas.height;
+			layout.minWidth = -1;
+			//layout.minHeight = -1;
 			layout.x = window.x / canvas.width;
 			layout.y = window.y / canvas.height;
 			layout.minimized = window.minimized;
@@ -141,7 +170,7 @@ package org.bigbluebutton.modules.layout.model {
 			applyToWindow(obj.canvas, obj.window);
 		}
 		
-		public function applyToWindow(canvas:MDICanvas, window:MDIWindow):void {
+		private function applyToWindow(canvas:MDICanvas, window:MDIWindow):void {
 //      trace("WindowLayout::applyToWindow for " + window.name + " using layout " + this.name + "]");
       
 			var effect:Parallel = new Parallel();
@@ -228,9 +257,15 @@ package org.bigbluebutton.modules.layout.model {
 				xml.@maximized = true;
 			else if (hidden)
 				xml.@hidden = true;
+			else if (draggable)
+				xml.@draggable = true;
+			else if (resizable)
+				xml.@resizable = true;
 			else {
 				xml.@width = int(width * canvas.width);
 				xml.@height = int(height * canvas.height);
+				xml.@minWidth = minWidth;
+				//xml.@minHeight = minHeight;
 				xml.@x = int(x * canvas.width);
 				xml.@y = int(y * canvas.height);
 			}
@@ -247,9 +282,15 @@ package org.bigbluebutton.modules.layout.model {
 				xml.@maximized = true;
 			else if (hidden)
 				xml.@hidden = true;
+			else if (draggable)
+				xml.@draggable = true;
+			else if (resizable)
+				xml.@resizable = true;
 			else {
 				xml.@width = width;
 				xml.@height = height;
+				xml.@minWidth = minWidth;
+				//xml.@minHeight = minHeight;
 				xml.@x = x;
 				xml.@y = y;
 			}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/services/LayoutSharedObjectService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/services/LayoutSharedObjectService.as
index eff53e839f046a0f7e7e3e10c32021caac24585e..1e495aca1d018886f436ae0040f83345375d5f5c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/services/LayoutSharedObjectService.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/services/LayoutSharedObjectService.as
@@ -47,7 +47,7 @@ package org.bigbluebutton.modules.layout.services
 	{
 		public static const NAME:String = "LayoutSharedObjectService";
 		
-		private var _layoutSO:SharedObject;
+		private var _layoutSO:SharedObject = null;
 		private var _connection:NetConnection;
 		private var _dispatcher:Dispatcher;
 		private var _locked:Boolean = false;
@@ -65,19 +65,19 @@ package org.bigbluebutton.modules.layout.services
 						
 	    public function join(uri:String):void
 		{
-			_layoutSO = SharedObject.getRemote("layoutSO", uri, false);
-			_layoutSO.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
-			_layoutSO.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
-			_layoutSO.addEventListener(SyncEvent.SYNC, sharedObjectSyncHandler);	
-			_layoutSO.client = this;
+			if (_layoutSO == null) {
+				_layoutSO = SharedObject.getRemote("layoutSO", uri, false);
+				_layoutSO.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
+				_layoutSO.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
+				_layoutSO.addEventListener(SyncEvent.SYNC, sharedObjectSyncHandler);
+				_layoutSO.client = this;
+			}
 			_layoutSO.connect(_connection);					
 		}
 		
 	    public function leave():void
 	    {
-	    	if (_layoutSO != null) {
-	    		_layoutSO.close();
-	    	}
+    		_layoutSO.close();
 	    }
 
 		private function netStatusHandler(event:NetStatusEvent):void
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml
index 423ec878fd8bc5a42643b22d281e8cb7d004a919..b49cd83111a232ec8bcbdf5a941fba5764a15179 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/LayoutsCombo.mxml
@@ -32,8 +32,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	<mate:Listener type="{LayoutEvent.REMOTE_UNLOCK_LAYOUT_EVENT}" receive="{enabled=true}" />
 	<mate:Listener type="{LayoutEvent.INVALIDATE_LAYOUT_EVENT}" method="invalidadeLayout" />
 	<mate:Listener type="{RedefineLayoutEvent.REDEFINE_LAYOUT_EVENT}" method="onRedefineLayout" />
-	<mate:Listener type="{LayoutsLoadedEvent.SEND_LAYOUTS_LOADED_EVENT}" method="populateLayoutsList"/>
-	
+	<mate:Listener type="{LayoutsLoadedEvent.LAYOUTS_LOADED_EVENT}" method="populateLayoutsList"/>
 	
 	<mx:Script>
 		<![CDATA[
@@ -70,16 +69,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			import org.bigbluebutton.modules.layout.model.WindowLayout;
 			import org.bigbluebutton.modules.layout.views.LayoutButton;
 			
-			
-			
-			private var populated:Boolean = false;
-			
-			
 			private var _dispatcher:Dispatcher = new Dispatcher();
 			
 			private var _defaultLayout:Object = null;
-			private var shouldSelectedItemGoToDefaultBecauseTheEventWasLost:Boolean = false;
-			
 			
 			private function init():void {
 				LogUtil.debug("LayoutsCombo: view initialized");
@@ -100,20 +92,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 					idx++;
 				}
 				invalidateDisplayList();
-				
-				if(shouldSelectedItemGoToDefaultBecauseTheEventWasLost) {
-					onApplyDefaultLayout();
-				}
-				else {
-					shouldSelectedItemGoToDefaultBecauseTheEventWasLost = false;
-				}
 			}
 			
 			private function onApplyDefaultLayout(e:Event = null):void {
 				if (_defaultLayout != null)
 					selectedItem = _defaultLayout; 
-				else
-					shouldSelectedItemGoToDefaultBecauseTheEventWasLost = true;
 			}
 			
 			private function onRedefineLayout(e:RedefineLayoutEvent):void {
@@ -121,7 +104,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				 *	remote means that the this event wasn't dispatched by this class
 				 *	it will come tipically from LayoutService or LayoutManager
 				 */
+				LogUtil.debug("LayoutCombo::onRedefineLayout");
 				if (e.remote) {
+					LogUtil.debug("LayoutCombo::onRedefineLayout remote event");
+	
 					var idx:int = -1;
 					prompt = e.layout.name;
 					
@@ -131,6 +117,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 					}
 					selectedIndex = idx;
 				}
+				invalidateDisplayList();
+				LogUtil.debug("LayoutCombo::onRedefineLayout done");
 			}
 			
 			private function onSelectedItemChanged(e:Event):void {