diff --git a/bigbluebutton-client/branding/default/style/css/BBBDefault.css b/bigbluebutton-client/branding/default/style/css/BBBDefault.css
index 56669639561baad4a6ddca92b79ce029e1779363..1bc2caf6c339996754a624a0e6e5a8bd89098894 100755
--- a/bigbluebutton-client/branding/default/style/css/BBBDefault.css
+++ b/bigbluebutton-client/branding/default/style/css/BBBDefault.css
@@ -395,70 +395,54 @@ DataGrid {
   icon:   Embed('assets/images/questionmark.png');
 }
 
-MDIWindow {
-  
+MDIWindow { /*None of the following properties are overridden by the MDIWindow class*/
+	backgroundSize: '100%';
+	
+	cornerRadius: 5;
+	dropShadowEnabled: false;
+	titleStyleName: "mypanelTitle";
+	
+	cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize");
+	cornerResizeWidth: 2;
+	cornerResizeHeight: 2;
+	cornerResizePaddingRight: 2;
+	cornerResizePaddingBottom: 2;
+	
+	controlButtonWidth: 10;
+	controlButtonHeight: 10;
+	controlButtonGap: 4;
 }
 
 .mdiWindowFocus, .presentationWindowStyleFocus, .videoDockStyleFocus
 {
   headerHeight: 26;
   roundedBottomCorners: true;
-  backgroundAlpha: 1;
   backgroundColor: #b9babc;
-  backgroundSize: '100%';
+  backgroundAlpha: 1;
   
   borderStyle: solid;
   borderColor: #b9babc;
   borderAlpha: 1;
-  borderThickness: 1;
-  borderThicknessLeft: 1;
-  borderThicknessTop: 1;
-  borderThicknessBottom: 1;
-  borderThicknessRight: 1;
-  cornerRadius: 0;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
-  
-  cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize");
-  cornerResizeWidth: 2;
-  cornerResizeHeight: 2;
-  cornerResizePaddingRight: 2;
-  cornerResizePaddingBottom: 2;
-  
-  controlButtonWidth: 10;
-  controlButtonHeight: 10;
-  controlButtonGap: 4;
+  borderThicknessLeft: 3;
+  borderThicknessTop: 0;
+  borderThicknessBottom: 3;
+  borderThicknessRight: 3;
 }
 
 .mdiWindowNoFocus, .presentationWindowStyleNoFocus, .videoDockStyleNoFocus
 {
   headerHeight: 26;
-  roundedBottomCorners: false;
-  backgroundAlpha: 0.5;
+  roundedBottomCorners: true;
   backgroundColor: #b9babc;
-  backgroundSize: '100%';
-  
+  backgroundAlpha: 0.5;
+	
   borderStyle: solid;
   borderColor: #b9babc;
   borderAlpha: 0.5;
-  borderThickness: 1;
-  borderThicknessLeft: 1;
-  borderThicknessTop: 1;
-  borderThicknessBottom: 1;
-  borderThicknessRight: 1;
-  cornerRadius: 0;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
-  
-  cornerResizeImg: Embed(source="assets/swf/Blue.swf", symbol="Corner_Resize");
-  cornerResizeWidth: 2;
-  cornerResizeHeight: 2;
-  cornerResizePaddingRight: 2;
-  cornerResizePaddingBottom: 2;
-  
-  controlButtonWidth: 10;
-  controlButtonHeight: 10;
-  controlButtonGap: 4;
+  borderThicknessLeft: 3;
+  borderThicknessTop: 0;
+  borderThicknessBottom: 3;
+  borderThicknessRight: 3;
 }
 
 .presentationSlideViewStyle {
@@ -477,110 +461,105 @@ MDIWindow {
 
 .videoViewStyleNoFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 0.5;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
   headerHeight: 20;
-  backgroundColor: #b9babc;
+  roundedBottomCorners: true;
+  backgroundColor: #e6e6e6;
   backgroundAlpha: 0.5;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+  
+  borderStyle: solid;
+  borderColor: #b9babc;
+  borderAlpha: 0.5;
+  borderThicknessLeft: 3;
+  borderThicknessTop: 0;
+  borderThicknessBottom: 3;
+  borderThicknessRight: 3;
 }
 
 .videoViewStyleFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 1;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
   headerHeight: 20;
-  backgroundColor: #b9babc;
+  roundedBottomCorners: true;
+  backgroundColor: #e6e6e6;
   backgroundAlpha: 1;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+	
+  borderStyle: solid;
+  borderColor: #b9babc;
+  borderAlpha: 1;
+  borderThicknessLeft: 3;
+  borderThicknessTop: 0;
+  borderThicknessBottom: 3;
+  borderThicknessRight: 3;
 }
 
 .videoPublishStyleNoFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 0.5;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
-  headerHeight: 20;
-  backgroundColor: #b9babc;
-  backgroundAlpha: 0.5;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+	headerHeight: 20;
+	roundedBottomCorners: true;
+	backgroundColor: #e6e6e6;
+	backgroundAlpha: 0.5;
+	
+	borderStyle: solid;
+	borderColor: #b9babc;
+	borderAlpha: 0.5;
+	borderThicknessLeft: 3;
+	borderThicknessTop: 0;
+	borderThicknessBottom: 3;
+	borderThicknessRight: 3;
 }
 
 .videoPublishStyleFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 1;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
-  headerHeight: 20;
-  backgroundColor: #b9babc;
-  backgroundAlpha: 1;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+	headerHeight: 20;
+	roundedBottomCorners: true;
+	backgroundColor: #e6e6e6;
+	backgroundAlpha: 1;
+	
+	borderStyle: solid;
+	borderColor: #b9babc;
+	borderAlpha: 1;
+	borderThicknessLeft: 3;
+	borderThicknessTop: 0;
+	borderThicknessBottom: 3;
+	borderThicknessRight: 3;
 }
 
 .videoAvatarStyleNoFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 0.5;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
-  headerHeight: 20;
-  backgroundColor: #b9babc;
-  backgroundAlpha: 0.5;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+	headerHeight: 20;
+	roundedBottomCorners: true;
+	backgroundColor: #e6e6e6;
+	backgroundAlpha: 0.5;
+	
+	borderStyle: solid;
+	borderColor: #b9babc;
+	borderAlpha: 0.5;
+	borderThicknessLeft: 3;
+	borderThicknessTop: 0;
+	borderThicknessBottom: 3;
+	borderThicknessRight: 3;
 }
 
 .videoAvatarStyleFocus 
 {
-  borderColor: #b9babc;
-  borderAlpha: 1;
-  borderThicknessLeft: 5;
-  borderThicknessTop: 5;
-  borderThicknessBottom: 5;
-  borderThicknessRight: 5;
-  roundedBottomCorners: true;
-  cornerRadius: 5;
-  headerHeight: 20;
-  backgroundColor: #b9babc;
-  backgroundAlpha: 1;
-  dropShadowEnabled: false;
-  titleStyleName: "mypanelTitle";
+	headerHeight: 20;
+	roundedBottomCorners: true;
+	backgroundColor: #e6e6e6;
+	backgroundAlpha: 1;
+	
+	borderStyle: solid;
+	borderColor: #b9babc;
+	borderAlpha: 1;
+	borderThicknessLeft: 3;
+	borderThicknessTop: 0;
+	borderThicknessBottom: 3;
+	borderThicknessRight: 3;
 }
 
 .mypanelTitle {
   color: #5e5f63;
   fontFamily: Arial;
   fontSize: 12;
+  fontWeight: bold;
 }
 
 .closeBtnFocus, .closeBtnNoFocus
diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template
index 5e80ebd29f607aa26c84f9252c072f1cf91f80f3..0d5da36c2997cb6a016266300aae7a575bd5af6a 100755
--- a/bigbluebutton-client/resources/config.xml.template
+++ b/bigbluebutton-client/resources/config.xml.template
@@ -7,7 +7,7 @@
     <application uri="rtmp://HOST/bigbluebutton" host="http://HOST/bigbluebutton/api/enter" />
     <language userSelectionEnabled="true" />
     <skinning enabled="true" url="http://HOST/client/branding/css/BBBDefault.css.swf" />
-    <shortcutKeys userSelectionEnabled="true" />
+    <shortcutKeys showButton="true" />
     <layout showLogButton="false" showVideoLayout="false" showResetLayout="true" defaultLayout="Default"
             showToolbar="true" showFooter="true" showHelpButton="true" showLogoutWindow="true"/>
             
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as
index ce77ce584ceb98cbff75000f6f2b2ce1f20ddc8b..5609a74b8f68524bf0833c0126f4b26731df6958 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as
@@ -67,7 +67,7 @@ package org.bigbluebutton.core.model
 		
 		public function get shortcutKeys():Object {
 			var a:Object = new Object();
-			a.userSelectionEnabled = ((config.shortcutKeys.@userSelectionEnabled).toUpperCase() == "TRUE") ? true : false;
+			a.showButton = ((config.shortcutKeys.@showButton).toUpperCase() == "TRUE") ? true : false;
 			return a
 		}
 			
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as
index b94d3703a744b713aee2b02ca10a015359a6114f..d005b462285c4cb1d8b7f492b3fe9ee2e5eebdfb 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/Config.as
@@ -27,7 +27,7 @@ package org.bigbluebutton.core.vo {
 		private var _host:String;
 		private var _numModules:int;
 		private var _languageEnabled:Boolean;
-		private var _shortcutKeysEnabled:Boolean;
+		private var _shortcutKeysShowButton:Boolean;
 		private var _skinning:String = "";
 		private var _showDebug:Boolean = false;
 		
@@ -41,7 +41,7 @@ package org.bigbluebutton.core.vo {
 			_host = builder.host;
 			_numModules = builder.numModules;
 			_languageEnabled = builder.languageEnabled;
-			_shortcutKeysEnabled = builder.shortcutKeysEnabled;
+			_shortcutKeysShowButton = builder.shortcutKeysShowButton;
 			_skinning = builder.skinning;
 			_showDebug = builder.showDebug;
 		}
@@ -82,8 +82,8 @@ package org.bigbluebutton.core.vo {
 			return _languageEnabled;
 		}
 		
-		public function get shortcutKeysEnabled():Boolean {
-			return _shortcutKeysEnabled;
+		public function get shortcutKeysShowButton():Boolean {
+			return _shortcutKeysShowButton;
 		}
 		
 		public function get skinning():String {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as
index 0ed233c1bf725eb45e0b624cc3386e17ddaae138..6e8f0ed2ed121efb0a3c7552090e7155ddb50d0a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/ConfigBuilder.as
@@ -27,7 +27,7 @@ package org.bigbluebutton.core.vo {
 		internal var host:String;
 		internal var numModules:int;
 		internal var languageEnabled:Boolean;
-		internal var shortcutKeysEnabled:Boolean;
+		internal var shortcutKeysShowButton:Boolean;
 		internal var skinning:String = "";
 		internal var showDebug:Boolean = false;
 		
@@ -71,8 +71,8 @@ package org.bigbluebutton.core.vo {
 			return this;
 		}
 		
-		public function withShortcutKeysEnabled(shortcutKeysEnabled:Boolean):ConfigBuilder {
-			this.shortcutKeysEnabled = shortcutKeysEnabled;
+		public function withShortcutKeysShowButton(shortcutKeysShowButton:Boolean):ConfigBuilder {
+			this.shortcutKeysShowButton = shortcutKeysShowButton;
 			return this;
 		}
 		
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as
index 9e5e162f80378ec52b3c685d11139d1f3b029c9d..f809e7464249bbc3c04df75aaf027fb05466b8bc 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConfigParameters.as
@@ -52,7 +52,7 @@ package org.bigbluebutton.main.model
 		public var host:String;
 		public var numModules:int;
 		public var languageEnabled:Boolean;
-		public var shortcutKeysEnabled:Boolean;
+		public var shortcutKeysShowButton:Boolean;
 		public var skinning:String = "";
 		public var showDebug:Boolean = false;
 		
@@ -102,8 +102,8 @@ package org.bigbluebutton.main.model
 			if (xml.language.@userSelectionEnabled == "true") languageEnabled = true;
 			else languageEnabled = false;
 			
-			if (xml.shortcutKeys.@userSelectionEnabled == "true") shortcutKeysEnabled = true;
-			else shortcutKeysEnabled = false;
+			if (xml.shortcutKeys.@showButton == "true") shortcutKeysShowButton = true;
+			else shortcutKeysShowButton = false;
 			
 			if (xml.skinning.@enabled == "true") skinning = xml.skinning.@url;
 
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as
index 1045948e87b8a31436b98d3939ab2b5657920bd3..c42db1ee559e092dc539690dc8b86e3aff5817a9 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModulesDispatcher.as
@@ -140,7 +140,7 @@ package org.bigbluebutton.main.model.modules
 						.withHelpUrl(c.helpURL)
 						.withHost(c.host)
 						.withLanguageEnabled(c.languageEnabled)
-						.withShortcutKeysEnabled(c.shortcutKeysEnabled)
+						.withShortcutKeysShowButton(c.shortcutKeysShowButton)
 						.withNumModule(c.numModules)
 						.withPortTestApplication(c.portTestApplication)
 						.withPortTestHost(c.portTestHost)
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
index fee037b4183d116ac5aed81c3053bd9eb67117c2..2d29523f0944abc8e1579c39088a98647c0c13b1 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
@@ -26,253 +26,256 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
                 showCloseButton="false" close="onCancelClicked()" keyDown="handleKeyDown(event)">
   <mx:Script>
     <![CDATA[
-      import com.asfusion.mate.events.Dispatcher;     
-      import flash.ui.Keyboard;      
-      import mx.events.CloseEvent;
-      import mx.events.ItemClickEvent;
-      import mx.managers.PopUpManager;     
-      import org.bigbluebutton.common.Images;
-      import org.bigbluebutton.common.LogUtil;
-      import org.bigbluebutton.core.UsersUtil;
-      import org.bigbluebutton.main.events.BBBEvent;
-      import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
-      import org.bigbluebutton.util.i18n.ResourceUtil;
-      
-      static public var PADDING_HORIZONTAL:Number = 6;
-      static public var PADDING_VERTICAL:Number = 29;
-      
-      private var images:Images = new Images();
-      
-      [Bindable] 
-      private var cancelIcon:Class = images.control_play;
-      
-      [Bindable]
-      public var resolutions:Array;
-      public var publishInClient:Boolean;
-      
-      public var camWidth:Number = 320;
-      public var camHeight:Number = 240;
-      private var _camera:Camera = null;
-      
-      // Timer used to enable the start publishing button, only after get any activity on the camera. 
-      // It avoids the problem of publishing a blank video
-      private var _activationTimer:Timer = null;
-      private var _waitingForActivation:Boolean = false;
-      
-      static private var _cameraAccessDenied:Boolean = false;
-      
-      private var _video:Video;
-      private var aspectRatio:Number = 1;
-      
-      private function onCreationComplete():void {          
-        changeDefaultCamForMac();
-        
-        if (UsersUtil.amIPresenter() && resolutions.length > 1) {
-          showResControls(true);
-        }
-        
-        if (Camera.names.length > 1) {
-          showVideoControls(true);
-        }
-        
-        updateCamera();
-      }
-      
-      private function changeDefaultCamForMac():void {
-        for (var i:int = 0; i < Camera.names.length; i++){
-          if (Camera.names[i] == "USB Video Class Video") {
-            /** Set as default for Macs */
-            _camera = Camera.getCamera("USB Video Class Video");
-          }
-        }
-      }
-      
-      private function showVideoControls(show:Boolean):void {
-        if (show) {
-          this.visible = true;
-          btnStartPublish.visible = true;
-        } else{					
-          this.width = 0;
-          this.height = 0;
-          btnStartPublish.visible = false;
-          this.visible = false;
-        }
-      }
-      
-      private function updateCamera():void {
-        _camera = null;
-        
-        _camera = Camera.getCamera(); 
-        
-        if (_camera == null) {
-          _videoHolder.showWarning('bbb.video.publish.hint.cantOpenCamera');
-          return;
-        }
-        
-        _camera.addEventListener(ActivityEvent.ACTIVITY, onActivityEvent);
-        _camera.addEventListener(StatusEvent.STATUS, onStatusEvent);
-        
-        if (_camera.muted) {
-          if (_cameraAccessDenied) {
-            onCameraAccessDisallowed();
-            return;
-          } else {
-            _videoHolder.showWarning('bbb.video.publish.hint.waitingApproval');
-          }
-        } else {
-          // if the camera isn't muted, that is because the user has
-          // previously allowed the camera capture on the flash privacy box
-          onCameraAccessAllowed();
-        }
-        
-        displayVideoPreview();
-      }
-      
-      private function displayVideoPreview():void {       
-        var videoOptions:VideoConfOptions = new VideoConfOptions();
-        _camera.setMotionLevel(5, 1000);
-        _camera.setKeyFrameInterval(videoOptions.camKeyFrameInterval);
-        _camera.setMode(camWidth, camHeight, videoOptions.camModeFps);
-        _camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture);
-        
-        if (_camera.width != camWidth || _camera.height != camHeight) {
-          LogUtil.debug("Resolution " + camWidth + "x" + camHeight + " is not supported, using " + _camera.width + "x" + _camera.height + " instead");
-          setResolution(_camera.width, _camera.height);
-        }
-        
-        setComboResolution();
-        
-        if (_video != null) {
-          _videoHolder.remove(_video);
-        }
-        
-        _video = new Video();       
-        _video.attachCamera(_camera);
-        
-        aspectRatio = (_video.width / _video.height);
-        
-        if (aspectRatio > _videoHolder.width / _videoHolder.height) {
-          _video.width = _videoHolder.width;
-          _video.height = _videoHolder.width / aspectRatio;
-          _video.x = 0;
-          _video.y = (_videoHolder.height - _video.height) / 2;
-        } else {
-          _video.width = _videoHolder.height * aspectRatio;
-          _video.height = _videoHolder.height;
-          _video.x = (_videoHolder.width - _video.width) / 2;
-          _video.y = 0;
-        }				
-        
-        _videoHolder.add(_video);
-      }
-      
-      private function showResControls(show:Boolean):void {
-        if (show) cmbResolution.visible = true;
-        else cmbResolution.visible = false;
-      }
-      
-      private function setComboResolution():void {
-        var res:Array = cmbResolution.selectedLabel.split( "x" );
-        setResolution(Number(res[0]), Number(res[1]));
-      }
-      
-      private function setAspectRatio(width:int, height:int):void {
-        aspectRatio = (width/height);
-        this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL;
-      }
-      
-      private function setResolution(width:int, height:int):void {
-        camWidth = width;
-        camHeight = height;
-        setAspectRatio(camWidth, camHeight);
-      }
-      
-      private function startPublishing():void {
-        updateCamera();
-        
-        // Save the index of the camera. Need it to send the message.
-        var camIndex:int = _camera.index;
-        
-        disableCamera();
-        
-        var globalDispatcher:Dispatcher = new Dispatcher();
-        var camEvent:BBBEvent = new BBBEvent(BBBEvent.CAMERA_SETTING);
-        camEvent.payload.cameraIndex = camIndex;
-        camEvent.payload.cameraWidth = camWidth;
-        camEvent.payload.cameraHeight = camHeight;
-        camEvent.payload.publishInClient = publishInClient;
-        
-        globalDispatcher.dispatchEvent(camEvent);
-        
-        PopUpManager.removePopUp(this);
-      }
-      
-      private function disableCamera():void {
-        _camera = null;
-        _video.attachCamera(null);
-        _video.clear();
-        _videoHolder.remove(_video);
-        _video = null;        
-      }
-      
-      private function handleKeyDown(event:KeyboardEvent):void {
-        if (event.charCode == Keyboard.ESCAPE) {
-          disableCamera();
-          this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
-        }
-      }
-      
-      private function onCancelClicked():void {
-        disableCamera();
-		var event:BBBEvent = new BBBEvent(BBBEvent.CAM_SETTINGS_CLOSED);
-		event.payload['clicked'] = "cancel";
-		dispatchEvent(event);
-        PopUpManager.removePopUp(this);
-      }
-      
-      private function onActivityEvent(e:ActivityEvent):void {
-        if (_waitingForActivation && e.activating) {
-          _activationTimer.stop();
-          _videoHolder.showWarning('bbb.video.publish.hint.videoPreview', false, "0xFFFF00");
-          //        controls.btnStartPublish.enabled = true;
-          _waitingForActivation = false;
-        }
-      }
-      
-      private function onStatusEvent(e:StatusEvent):void {
-        if (e.code == "Camera.Unmuted") {
-          onCameraAccessAllowed();
-          // this is just to overwrite the message of waiting for approval
-          _videoHolder.showWarning('bbb.video.publish.hint.openingCamera');
-        } else if (e.code == "Camera.Muted") {
-          onCameraAccessDisallowed();
-        }
-      }
-      
-      private function onCameraAccessAllowed():void {
-        // set timer to ensure that the camera activates.  If not, it might be in use by another application
-        _waitingForActivation = true;
-        if (_activationTimer != null) {
-          _activationTimer.stop();
-        }
-        
-        _activationTimer = new Timer(10000, 1);
-        _activationTimer.addEventListener(TimerEvent.TIMER, activationTimeout);
-        _activationTimer.start();
-      }
-      
-      private function onCameraAccessDisallowed():void {
-        _videoHolder.showWarning('bbb.video.publish.hint.cameraDenied');
-        _cameraAccessDenied = true;
-      }
-      
-      private function activationTimeout(e:TimerEvent):void {
-        _videoHolder.showWarning('bbb.video.publish.hint.cameraIsBeingUsed');
-      } 
-      
-      private function showCameraSettings():void {
-        Security.showSettings(SecurityPanel.CAMERA);
-      }
+		import com.asfusion.mate.events.Dispatcher;     
+		import flash.ui.Keyboard;      
+		import mx.events.CloseEvent;
+		import mx.events.ItemClickEvent;
+		import mx.managers.PopUpManager;     
+		import org.bigbluebutton.common.Images;
+		import org.bigbluebutton.common.LogUtil;
+		import org.bigbluebutton.core.UsersUtil;
+		import org.bigbluebutton.main.events.BBBEvent;
+		import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
+		import org.bigbluebutton.util.i18n.ResourceUtil;
+		
+		static public var PADDING_HORIZONTAL:Number = 6;
+		static public var PADDING_VERTICAL:Number = 29;
+		
+		private var images:Images = new Images();
+		
+		[Bindable] 
+		private var cancelIcon:Class = images.control_play;
+		
+		[Bindable]
+		public var resolutions:Array;
+		public var publishInClient:Boolean;
+		
+		public var camWidth:Number = 320;
+		public var camHeight:Number = 240;
+		private var _camera:Camera = null;
+		
+		// Timer used to enable the start publishing button, only after get any activity on the camera. 
+		// It avoids the problem of publishing a blank video
+		private var _activationTimer:Timer = null;
+		private var _waitingForActivation:Boolean = false;
+		
+		static private var _cameraAccessDenied:Boolean = false;
+		
+		private var _video:Video;
+		private var aspectRatio:Number = 1;
+		
+		private function onCreationComplete():void {          
+			changeDefaultCamForMac();
+			
+			if (UsersUtil.amIPresenter() && resolutions.length > 1) {
+				showResControls(true);
+			}
+			
+			if (Camera.names.length > 1) {
+				showVideoControls(true);
+			}
+			
+			updateCamera();
+		}
+		
+		private function changeDefaultCamForMac():void {
+			for (var i:int = 0; i < Camera.names.length; i++){
+				if (Camera.names[i] == "USB Video Class Video") {
+					/** Set as default for Macs */
+					_camera = Camera.getCamera("USB Video Class Video");
+				}
+			}
+		}
+		
+		private function showVideoControls(show:Boolean):void {
+			if (show) {
+				this.visible = true;
+				btnStartPublish.visible = true;
+			} else{					
+				this.width = 0;
+				this.height = 0;
+				btnStartPublish.visible = false;
+				this.visible = false;
+			}
+		}
+		
+		private function updateCamera():void {
+			_camera = null;
+			
+			_camera = Camera.getCamera(); 
+			
+			if (_camera == null) {
+				_videoHolder.showWarning('bbb.video.publish.hint.cantOpenCamera');
+				return;
+			}
+			
+			_camera.addEventListener(ActivityEvent.ACTIVITY, onActivityEvent);
+			_camera.addEventListener(StatusEvent.STATUS, onStatusEvent);
+			
+			if (_camera.muted) {
+				if (_cameraAccessDenied) {
+					//onCameraAccessDisallowed();
+					//return;
+					Security.showSettings(SecurityPanel.PRIVACY)
+				} else {
+					_videoHolder.showWarning('bbb.video.publish.hint.waitingApproval');
+				}
+			} else {
+				// if the camera isn't muted, that is because the user has
+				// previously allowed the camera capture on the flash privacy box
+				onCameraAccessAllowed();
+			}
+			
+			displayVideoPreview();
+		}
+		
+		private function displayVideoPreview():void {       
+			var videoOptions:VideoConfOptions = new VideoConfOptions();
+			_camera.setMotionLevel(5, 1000);
+			_camera.setKeyFrameInterval(videoOptions.camKeyFrameInterval);
+			_camera.setMode(camWidth, camHeight, videoOptions.camModeFps);
+			_camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture);
+			
+			if (_camera.width != camWidth || _camera.height != camHeight) {
+				LogUtil.debug("Resolution " + camWidth + "x" + camHeight + " is not supported, using " + _camera.width + "x" + _camera.height + " instead");
+				setResolution(_camera.width, _camera.height);
+			}
+			
+			setComboResolution();
+			
+			if (_video != null) {
+				_videoHolder.remove(_video);
+			}
+			
+			_video = new Video();       
+			_video.attachCamera(_camera);
+			
+			aspectRatio = (_video.width / _video.height);
+			
+			if (aspectRatio > _videoHolder.width / _videoHolder.height) {
+				_video.width = _videoHolder.width;
+				_video.height = _videoHolder.width / aspectRatio;
+				_video.x = 0;
+				_video.y = (_videoHolder.height - _video.height) / 2;
+			} else {
+				_video.width = _videoHolder.height * aspectRatio;
+				_video.height = _videoHolder.height;
+				_video.x = (_videoHolder.width - _video.width) / 2;
+				_video.y = 0;
+			}				
+			
+			_videoHolder.add(_video);
+		}
+		
+		private function showResControls(show:Boolean):void {
+			if (show) cmbResolution.visible = true;
+			else cmbResolution.visible = false;
+		}
+		
+		private function setComboResolution():void {
+			var res:Array = cmbResolution.selectedLabel.split( "x" );
+			setResolution(Number(res[0]), Number(res[1]));
+		}
+		
+		private function setAspectRatio(width:int, height:int):void {
+			aspectRatio = (width/height);
+			this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL;
+		}
+		
+		private function setResolution(width:int, height:int):void {
+			camWidth = width;
+			camHeight = height;
+			setAspectRatio(camWidth, camHeight);
+		}
+		
+		private function startPublishing():void {
+			updateCamera();
+			
+			// Save the index of the camera. Need it to send the message.
+			var camIndex:int = _camera.index;
+			
+			disableCamera();
+			
+			var globalDispatcher:Dispatcher = new Dispatcher();
+			var camEvent:BBBEvent = new BBBEvent(BBBEvent.CAMERA_SETTING);
+			camEvent.payload.cameraIndex = camIndex;
+			camEvent.payload.cameraWidth = camWidth;
+			camEvent.payload.cameraHeight = camHeight;
+			camEvent.payload.publishInClient = publishInClient;
+			
+			globalDispatcher.dispatchEvent(camEvent);
+			
+			PopUpManager.removePopUp(this);
+		}
+		
+		private function disableCamera():void {
+			_camera = null;
+			_video.attachCamera(null);
+			_video.clear();
+			_videoHolder.remove(_video);
+			_video = null;        
+		}
+		
+		private function handleKeyDown(event:KeyboardEvent):void {
+			if (event.charCode == Keyboard.ESCAPE) {
+				disableCamera();
+				this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
+			}
+		}
+		
+		private function onCancelClicked():void {
+			disableCamera();
+			var event:BBBEvent = new BBBEvent(BBBEvent.CAM_SETTINGS_CLOSED);
+			event.payload['clicked'] = "cancel";
+			dispatchEvent(event);
+			PopUpManager.removePopUp(this);
+		}
+		
+		private function onActivityEvent(e:ActivityEvent):void {
+			if (_waitingForActivation && e.activating) {
+				_activationTimer.stop();
+				_videoHolder.showWarning('bbb.video.publish.hint.videoPreview', false, "0xFFFF00");
+				//        controls.btnStartPublish.enabled = true;
+				_waitingForActivation = false;
+			}
+		}
+		
+		private function onStatusEvent(e:StatusEvent):void {
+			if (e.code == "Camera.Unmuted") {
+				onCameraAccessAllowed();
+				// this is just to overwrite the message of waiting for approval
+				_videoHolder.showWarning('bbb.video.publish.hint.openingCamera');
+			} else if (e.code == "Camera.Muted") {
+				onCameraAccessDisallowed();
+			}
+		}
+		
+		private function onCameraAccessAllowed():void {
+			_cameraAccessDenied = false;
+			
+			// set timer to ensure that the camera activates.  If not, it might be in use by another application
+			_waitingForActivation = true;
+			if (_activationTimer != null) {
+				_activationTimer.stop();
+			}
+			
+			_activationTimer = new Timer(10000, 1);
+			_activationTimer.addEventListener(TimerEvent.TIMER, activationTimeout);
+			_activationTimer.start();
+		}
+		
+		private function onCameraAccessDisallowed():void {
+			_videoHolder.showWarning('bbb.video.publish.hint.cameraDenied');
+			_cameraAccessDenied = true;
+		}
+		
+		private function activationTimeout(e:TimerEvent):void {
+			_videoHolder.showWarning('bbb.video.publish.hint.cameraIsBeingUsed');
+		} 
+		
+		private function showCameraSettings():void {
+			Security.showSettings(SecurityPanel.CAMERA);
+		}
       
     ]]>
   </mx:Script>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
index 6633fc7f1dc98a154bca75a7539b648521b26de8..79b44be9a6dc384ed26a7f344d3f553d40a2d6e4 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
@@ -192,7 +192,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 						
 			private function gotConfigParameters(e:ConfigEvent):void{
 				langSelector.visible = e.config.languageEnabled;
-				shortcutKeysBtn.includeInLayout = shortcutKeysBtn.visible = e.config.shortcutKeysEnabled; 
+				shortcutKeysBtn.includeInLayout = shortcutKeysBtn.visible = e.config.shortcutKeysShowButton; 
 				DEFAULT_HELP_URL = e.config.helpURL;
 			}
 			
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
index 162b685a19c3a37b52317e537e2d690c927deddf..f426c756b523407e658e1096e79ec8c8a586a781 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
@@ -587,7 +587,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	</mx:Script>
 
   <mx:HBox width="100%" height="{chatListHeight}" verticalScrollPolicy="off">
-    <chat:AdvancedList width="100%" height="{chatListHeight}" id="chatMessagesList" selectable="true" variableRowHeight="true" alternatingItemColors="[#EFEFEF, #FEFEFE]"
+    <chat:AdvancedList width="100%" height="{chatListHeight}" id="chatMessagesList" selectable="false" variableRowHeight="true" 
              itemRenderer="org.bigbluebutton.modules.chat.views.ChatMessageRenderer" verticalScrollPolicy="auto" wordWrap="true"
              dataProvider="{chatMessages.messages}"
              tabIndex="{baseIndex}"
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml
index 1b5b9d1b7290dffa534253ff2cafa5f9fac76801..07390b77a0f4d319f24daadde6194e9b60200b14 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml
@@ -21,7 +21,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 -->
 
 <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" verticalAlign="top" 
-		 verticalScrollPolicy="off" xmlns:common="org.bigbluebutton.common.*" dataChange="validateNow()"
+		 verticalScrollPolicy="off" xmlns:common="org.bigbluebutton.common.*"
 		 creationComplete="onCreationComplete()">
 	
 	<mx:Script>
@@ -46,12 +46,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				 * do this, we'll get a stale data which will display the chat 
 				 * message repeatedly. (ralam Nov 1, 2010)
 				 */
-				ChangeWatcher.watch(this, "data", dataChangeHandler);
-				if (data != null) {
-					chatMsg = data as ChatMessage;
-					data = null;
-					chatMsg.translateMessage();					
-				}
+				//ChangeWatcher.watch(this, "data", dataChangeHandler);
+				//dataChangeHandler(); // call to intialize
 				
 				/**
 				 * The next line will refresh the display so that chat history don't show up as
@@ -62,13 +58,42 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				validateNow();
 			}
 			
-			private function dataChangeHandler(e:Event = null):void{
-				if (data == null) {
-					return;
-				}				
-				chatMsg = data as ChatMessage;
-				data = null;
-				chatMsg.translateMessage();	
+			//private function dataChangeHandler(e:Event = null):void{
+			override public function set data(value:Object):void {
+				//if (data == null) {
+				//	return;
+				//}		
+				super.data = value;
+				
+				//chatMsg = data as ChatMessage;
+				//data = null;
+				
+				if (data == null) return;
+				
+				data.translateMessage();
+				
+				/*
+				   This is setting the backgroundColor style. It changes the value correct and the if 
+				   statement works, but the style never takes effect. I have no idea what's wrong.
+				   		Chad
+				 */
+				//LogUtil.debug ("senderId: " + data.senderId);
+				//LogUtil.debug("backColor " + this.getStyle("backgroundColor") + "alpha " + this.getStyle("backgroundAlpha"));
+				if (data.senderId == " ") {
+					this.setStyle("backgroundColor", 0xff0000);
+				} else {
+					this.setStyle("backgroundColor", 0x00ff00);
+				}
+				
+				// The visibility check has to go here becasue ORs don't work with databinding
+				lblTime.visible = (!(data.lastTime == data.time) || !(data.senderId == data.lastSenderId));
+				// check the visibility of the name as well because events might fire in different order
+				lblName.visible = !(data.senderId == data.lastSenderId);
+				
+				//remove the header if not needed to save space
+				hbHeader.includeInLayout = hbHeader.visible = lblName.visible || lblTime.visible;
+				
+				validateNow();
 			}
 			
 			private function onRollOver():void{
@@ -82,16 +107,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		]]>
 	</mx:Script>
 	
-  <mx:HBox width="100%">
-    <mx:Label id="lblName" text="{chatMsg.name} " visible="{!(chatMsg.senderId == chatMsg.lastSenderId)}" color="gray" width="100%" textAlign="left"/>
+  <mx:HBox width="100%" id="hbHeader">
+    <mx:Label id="lblName" text="{data.name} " visible="true" color="gray" width="100%" textAlign="left"/>
     <mx:Spacer width="100%"/>
-    <mx:Text id="lblTime" htmlText="{chatMsg.translateLocale} {rolledOver ? chatMsg.senderTime : chatMsg.time}" textAlign="right"
-             visible="{!(chatMsg.lastTime == chatMsg.time) || !(chatMsg.senderId == chatMsg.lastSenderId)}" 
+    <mx:Text id="lblTime" htmlText="{data.translateLocale} {rolledOver ? data.senderTime : data.time}" textAlign="right"
+             visible="true" 
              color="gray"  width="100%"/>       
   </mx:HBox>
   <mx:HBox width="100%">
     <mx:Spacer width="5"/>
-    <mx:Text id="txtMessage" htmlText="{rolledOver ? chatMsg.senderText : chatMsg.translatedText}" link="onLinkClick(event)" color="{chatMsg.senderColor}"
+    <mx:Text id="txtMessage" htmlText="{rolledOver ? data.senderText : data.translatedText}" link="onLinkClick(event)" color="{data.senderColor}"
              rollOver="onRollOver()" rollOut="onRollOut()" width="100%" selectable="true"/>
   </mx:HBox>  
 </mx:VBox>