diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties
index 2114c67cc7b3010611fa4cc02b444b03f73c38fa..fd12aae2f911c64693e5c36a014089ef72fea68b 100755
--- a/bigbluebutton-client/locale/en_US/bbbResources.properties
+++ b/bigbluebutton-client/locale/en_US/bbbResources.properties
@@ -73,8 +73,8 @@ bbb.users.usersGrid.statusItemRenderer.viewer = Viewer
 bbb.users.usersGrid.mediaItemRenderer = Media
 bbb.users.usersGrid.mediaItemRenderer.talking = Talking
 bbb.users.usersGrid.mediaItemRenderer.webcam = Sharing Webcam
-bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Click to talk
-bbb.users.usersGrid.mediaItemRenderer.pushToMute = Click to mute yourself
+bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Click to unmute the user
+bbb.users.usersGrid.mediaItemRenderer.pushToMute = Click to mute the user
 bbb.users.usersGrid.mediaItemRenderer.kickUser = Kick user 
 bbb.users.usersGrid.mediaItemRenderer.webcam = Webcam shared
 bbb.users.usersGrid.mediaItemRenderer.micOff = Microphone off
@@ -168,6 +168,7 @@ bbb.listenerItem.talkImg.toolTip = Talking
 bbb.listenerItem.lockImg.toolTip = Click to keep muted or unmuted
 bbb.listenerItem.muteUnmute.toolTip = Mute or unmute this listener
 bbb.publishVideo.title = Share your webcam
+bbb.publishVideo.changeCamera.toolTip = Click to open the change camera dialog box
 bbb.publishVideo.startPublishBtn.toolTip = Start Sharing
 bbb.video.minimizeBtn.accessibilityName = Minimize the Video Dock Window
 bbb.video.maximizeRestoreBtn.accessibilityName = Maximize the Video Dock Window
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
index fcd6e1536081f272050a569ed7d2e7ca1dc98272..3dc36c566b57d3991f42586f3e43b7e75a04372d 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml
@@ -129,7 +129,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			displayVideoPreview();
 		}
 		
-		private function displayVideoPreview():void {       
+		private function displayVideoPreview():void {
+			setComboResolution();		
+		
 			var videoOptions:VideoConfOptions = new VideoConfOptions();
 			_camera.setMotionLevel(5, 1000);
 			_camera.setKeyFrameInterval(videoOptions.camKeyFrameInterval);
@@ -141,8 +143,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				setResolution(_camera.width, _camera.height);
 			}
 			
-			setComboResolution();
-			
 			if (_video != null) {
 				_videoHolder.remove(_video);
 			}
@@ -150,7 +150,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			_video = new Video();       
 			_video.attachCamera(_camera);
 			
-			aspectRatio = (_video.width / _video.height);
+			//aspectRatio = (_video.width / _video.height);
 			
 			if (aspectRatio > _videoHolder.width / _videoHolder.height) {
 				_video.width = _videoHolder.width;
@@ -288,7 +288,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			<mx:Spacer width="5"/>
 			<mx:Button id="changeCamera" styleName="cameraDisplaySettingsWindowChangeCamBtn" 
 					   label="{ResourceUtil.getInstance().getString('bbb.publishVideo.changeCameraBtn.labelText')}" 
-					   toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.toolTip')}" 
+					   toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.changeCamera.toolTip')}" 
 					   click="showCameraSettings()"/>
 			<mx:Spacer width="70%"/>
 			<mx:ComboBox id="cmbResolution" styleName="cameraDisplaySettingsWindowChangeResolutionCombo" 
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml
index ba812eb8a7e97287b5e929a841875b949f9dece4..bfd7c30705e794f9485d731a97f22d69d85d8da2 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml
@@ -32,7 +32,8 @@
 	<mx:Script>
 		<![CDATA[
 			import com.asfusion.mate.events.Dispatcher;
-	      
+			
+			import mx.binding.utils.BindingUtils;
 			import mx.controls.Alert;
 			import mx.events.ListEvent;
 			import mx.events.FlexEvent;
@@ -58,10 +59,19 @@
 			[Bindable]
 			private var rolledOver:Boolean = false;
 			
+			private var muteRolled:Boolean = false;
+			
 			private function onCreationComplete():void{
 				muteBtn.enabled = kickUserBtn.enabled = moderator = UserManager.getInstance().getConference().amIModerator();
+				if (moderator) {
+					BindingUtils.bindProperty(muteBtn, "visible", voiceJoinedInd, "visible");
+				} else {
+					BindingUtils.bindProperty(muteImg, "visible", voiceJoinedInd, "visible");
+				}
 				
 				this.addEventListener(FlexEvent.DATA_CHANGE, dataChangeHandler);
+				
+				BindingUtils.bindSetter(updateMuteBtn, muteInd, "visible");
 			}
 			
 			private function dataChangeHandler(e:Event):void {
@@ -102,6 +112,33 @@
 				e.mute = !data.voiceMuted;
 				dispatchEvent(e);
 			}
+			
+			private function updateMuteBtn(voiceMuted:Boolean = false):void {
+				if (data != null) {
+					if (moderator) {
+						if (data.voiceMuted == muteRolled)
+							muteBtn.setStyle("icon", images.audio);
+						else
+							muteBtn.setStyle("icon", images.audio_muted);
+					} else {
+						if (data.voiceMuted == muteRolled)
+							muteImg.source = images.audio;
+						else
+							muteImg.source = images.audio_muted;
+					}
+				}
+			}
+			
+			private function mouseOverHandler():void {
+				muteRolled = true;
+				updateMuteBtn();
+			}
+			
+			private function mouseOutHandler():void {
+				muteRolled = false;
+				updateMuteBtn();
+			}
+			
 		]]>
 	</mx:Script>
 	<mx:Image id="showLock" visible="{data.voiceLocked}" source="{images.lock_close}" width="20" height="20" />
@@ -110,12 +147,18 @@
 	<mx:Button id="webcamBtn" visible="{data.hasStream}" click="viewCamera()" icon="{images.webcam_new}"
 				width="20" height="20" enabled="false"
 				toolTip="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.webcam')}" />
-	<mx:Button id="muteBtn" visible="{data.voiceJoined}" enabled="false"
+	<mx:Image id="muteImg" visible="false" includeInLayout="false" width="16" height="16" />
+	<mx:Button id="muteBtn" visible="false" includeInLayout="false" enabled="false" icon="{images.audio}"
 				width="20" height="20" click="toggleMuteState()"
-				icon="{data.voiceMuted ? images.audio_muted : images.audio}"
+				mouseOver="mouseOverHandler()"
+				mouseOut="mouseOutHandler()"
 				toolTip="{data.voiceMuted ? ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToTalk') : ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToMute')}" />
 	<mx:Button id="kickUserBtn" icon="{images.eject_user_new}" 
 				width="20" height="20" visible="{rolledOver}"
 				toolTip="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.kickUser')}"
 				click="kickUser()"/>
+				
+	<!-- Helper objects because direct bindings to data break when the itemRenderer is recycled -->
+	<mx:Image id="muteInd" includeInLayout="false" visible="{data.voiceMuted}" />
+	<mx:Image id="voiceJoinedInd" includeInLayout="false" visible="{data.voiceJoined}" />
 </mx:HBox>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml
index 3712062190ac9316e6afb3d7fdb1fe311e6444fc..d6fa22bfeff940c1f1de20408ba931fd7fc4d7c8 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/StatusItemRenderer.mxml
@@ -88,24 +88,34 @@
   			private function updateButton(unneeded:Object = null):void {
 	  			if (data != null) {
 	  				if (data.presenter) {
-	  					roleBtn.setStyle("icon", images.presenter_new);
-	  					roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.presenter');
+	  					roleImg.source = images.presenter_new;
+	  					roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.presenter');
+	  					roleImg.visible = true;
+	  					roleBtn.visible = false;
 	  					roleBtn.enabled = false;
 	  				} else if (rolledOver) {
 	  					roleBtn.setStyle("icon", images.presenter_new);
 	  					roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.changePresenter');
+	  					roleImg.visible = false;
+	  					roleBtn.visible = true;
 	  					roleBtn.enabled = true;
 	  				} else if (data.role == Role.MODERATOR) {
-	  					roleBtn.setStyle("icon", images.moderator);
-	  					roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.moderator');
+	  					roleImg.source = images.moderator;
+	  					roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.moderator');
+	  					roleImg.visible = true;
+	  					roleBtn.visible = false;
 	  					roleBtn.enabled = false;
 	  				} else if (data.raiseHand) {
-	  					roleBtn.setStyle("icon", images.hand_new);
-	  					roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.handRaised');
+	  					roleImg.source = images.hand_new;
+	  					roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.handRaised');
+	  					roleImg.visible = true;
+	  					roleBtn.visible = false;
 	  					roleBtn.enabled = false;
 	  				} else {
-	  					roleBtn.setStyle("icon", null);
-	  					roleBtn.toolTip = "";
+	  					roleImg.source = null;
+	  					roleImg.toolTip = "";
+	  					roleImg.visible = true;
+	  					roleBtn.visible = false;
 	  					roleBtn.enabled = false;
 	  				}
 	  			}
@@ -140,8 +150,11 @@
 				updateButton();
 			}
 		]]>
-	</mx:Script>	
-	<mx:Button id="roleBtn" enabled="false" width="20" height="20" click="assignPresenterClicked()" />
+	</mx:Script>
+	<mx:Image id="roleImg" visible="true" width="16" height="16" includeInLayout="{roleImg.visible}" />
+	<mx:Button id="roleBtn" visible="false" enabled="false" width="20" height="20" click="assignPresenterClicked()" includeInLayout="{roleBtn.visible}" />
+	
+	<!-- Helper objects because direct bindings to data break when the itemRenderer is recycled -->
 	<mx:Image id="presenterInd" includeInLayout="false" visible="{data.presenter}" />
 	<mx:Image id="moderatorInd" includeInLayout="false" visible="{data.role == Role.MODERATOR}" />
 	<mx:Image id="raiseHandInd" includeInLayout="false" visible="{data.raiseHand}" />
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
index 997e62b1f53f785c8a9c7592a4b3e011ed4cfda7..00aefdc1ad36b9a4b4df7a2fb8aa1507ecde8b4a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
@@ -92,6 +92,8 @@
 			private const MUTE_USER:String = "Mute User";
 			private const MUTE_ALL_USER:String = "Mute All User";
 			
+			private var muteMeRolled:Boolean = false;
+			
 			private function onCreationComplete():void {
 				dispatcher = new Dispatcher();
 			
@@ -101,6 +103,8 @@
 				BindingUtils.bindSetter(changeButtons, UserManager.getInstance().getConference(), "amIPresenter");
 				BindingUtils.bindSetter(updateNumberofUsers, users, "length");
 				
+				BindingUtils.bindSetter(updateMuteMeBtn, UserManager.getInstance().getConference(), "voiceMuted"); 
+				
 				this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
 				ResourceUtil.getInstance().addEventListener(Event.CHANGE, localeChanged); // Listen for locale changing
 				
@@ -179,7 +183,8 @@
 					myMenuData[2] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.lowerAllHands'), icon: images.hand_new};
 					if (!roomMuted) {
 						myMenuData[3] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAll'), icon: images.audio_muted};
-						myMenuData[4] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAllExcept'), icon: images.audio_muted};
+						if (UserManager.getInstance().getConference().getPresenter())
+							myMenuData[4] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAllExcept') + ": " + UserManager.getInstance().getConference().getPresenter().name, icon: images.audio_muted};
 					} else
 						myMenuData[3] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.unmuteAll'), icon: images.audio};
 				}
@@ -378,6 +383,23 @@
 				usersGrid.drawFocus(true);
 			}
 			
+			private function updateMuteMeBtn(voiceMuted:Boolean = false):void {
+				if (UserManager.getInstance().getConference().voiceMuted == muteMeRolled)
+					muteMeBtn.setStyle("icon", images.audio);
+				else
+					muteMeBtn.setStyle("icon", images.audio_muted);
+			}
+			
+			private function mouseOverHandler():void {
+				muteMeRolled = true;
+				updateMuteMeBtn();
+			}
+			
+			private function mouseOutHandler():void {
+				muteMeRolled = false;
+				updateMuteMeBtn();
+			}
+			
 		]]>
 	</mx:Script>
 	
@@ -405,8 +427,9 @@
 					visible="false" includeInLayout="{raiseHandBtn.visible}" tabIndex="{partOptions.baseTabIndex+15}" />
 		<mx:Spacer width="100%"/>
 		<mx:Button id="muteMeBtn" click="toggleMuteMeState()" height="30" width="30" 
-					icon="{UserManager.getInstance().getConference().voiceMuted ? images.audio_muted : images.audio}"
 					visible="{UserManager.getInstance().getConference().voiceJoined}"
+					mouseOver="mouseOverHandler()"
+					mouseOut="mouseOutHandler()"
 					toolTip="{UserManager.getInstance().getConference().voiceMuted ? ResourceUtil.getInstance().getString('bbb.users.pushToTalk.toolTip') : ResourceUtil.getInstance().getString('bbb.users.pushToMute.toolTip')}" 
 					tabIndex="{partOptions.baseTabIndex+20}"/>