diff --git a/bbb-video/build.gradle b/bbb-video/build.gradle
index ec4da48f70ee4209ac56b827e8bc9504aeaa97af..f8850422b8e725b6e02aaa4b2e3b4c8a08521ee4 100755
--- a/bbb-video/build.gradle
+++ b/bbb-video/build.gradle
@@ -81,7 +81,7 @@ dependencies {
 	providedCompile 'org.springframework:spring-core:3.1.1.RELEASE@jar'
 	
 	// Red5
-	providedCompile 'org/red5:red5:1.0r4597@jar'
+	providedCompile 'org/red5:red5:1.0r4599@jar'
 	
 	// Logging
 	providedCompile 'ch.qos.logback:logback-core:1.0.9@jar'
diff --git a/bbb-voice/build.gradle b/bbb-voice/build.gradle
index 1523dc6909f1a6a2d9477aceb9d68d221b796eea..1f6f3926f0048e66f682992bb0aa9ee0531ca30e 100755
--- a/bbb-voice/build.gradle
+++ b/bbb-voice/build.gradle
@@ -81,7 +81,7 @@ dependencies {
 	providedCompile 'org.springframework:spring-core:3.1.1.RELEASE@jar'
 	
 	// Red5
-	providedCompile 'org/red5:red5:1.0r4597@jar'
+	providedCompile 'org/red5:red5:1.0r4599@jar'
 	
 	// Logging
 	providedCompile 'ch.qos.logback:logback-core:1.0.9@jar'
diff --git a/bigbluebutton-apps/build.gradle b/bigbluebutton-apps/build.gradle
index 02a2b1d02e05446d3290450fe3fe4cef05f4b24d..4c4802d09664445ef910f6559eb6024a1250b8d9 100755
--- a/bigbluebutton-apps/build.gradle
+++ b/bigbluebutton-apps/build.gradle
@@ -73,7 +73,7 @@ dependencies {
 	providedCompile 'org.springframework:spring-core:3.1.1.RELEASE@jar'
 	
 	// Red5
-	providedCompile 'org/red5:red5:1.0r4597@jar'
+	providedCompile 'org/red5:red5:1.0r4599@jar'
 	
 	// Logging
 	providedCompile 'ch.qos.logback:logback-core:1.0.9@jar'
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/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template
index 21bec108543fc79b011e9ec8a9beefe987d72f05..53a65b6972657c9190790c004ef35f17bd85a1f9 100755
--- a/bigbluebutton-client/resources/config.xml.template
+++ b/bigbluebutton-client/resources/config.xml.template
@@ -23,6 +23,7 @@
 			position="top-right"
 			baseTabIndex="701"
 		/>
+		
 <!--		
 		<module name="ViewersModule" url="http://HOST/client/ViewersModule.swf?v=VERSION" 
 			uri="rtmp://HOST/bigbluebutton" 
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}"/>
 		
diff --git a/deskshare/app/build.gradle b/deskshare/app/build.gradle
index 39a441e89af262ea6d27c0c743439151406a63ac..f6e4c593857f122598aba138d546c51a80d9f09c 100755
--- a/deskshare/app/build.gradle
+++ b/deskshare/app/build.gradle
@@ -24,7 +24,7 @@ dependencies {
 	providedCompile 'org.springframework:spring-core:3.1.1.RELEASE@jar'
 	
 	// Red5
-	providedCompile 'org/red5:red5:1.0r4597@jar'
+	providedCompile 'org/red5:red5:1.0r4599@jar'
 	
 	// Logging
 	providedCompile 'ch.qos.logback:logback-core:1.0.9@jar'
diff --git a/deskshare/build.gradle b/deskshare/build.gradle
index 19e5aa160ea6c9bae461d54b759b4df2244def3d..05af7d148b7bc419c33bc5f23469e21005ed5eb6 100755
--- a/deskshare/build.gradle
+++ b/deskshare/build.gradle
@@ -73,7 +73,7 @@ dependencies {
 	compile 'org.springframework:spring-core:3.1.1.RELEASE@jar'
 	
 	// Red5
-	compile 'org/red5:red5:1.0r4597@jar'
+	compile 'org/red5:red5:1.0r4599@jar'
 	
 	// Logging
 	compile 'ch.qos.logback:logback-core:1.0.9@jar'