diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
index 6414a44f3f525cac37cb989ee88c0245f36d9d3f..f68c33e2ff221e78c5d630639a0e2bd4db4093c7 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala
@@ -34,9 +34,9 @@ trait MuteUserCmdMsgHdlr extends RightsManagementTrait {
         requester <- Users2x.findWithIntId(liveMeeting.users2x, msg.header.userId)
         u <- VoiceUsers.findWithIntId(liveMeeting.voiceUsers, msg.body.userId)
       } yield {
-        if (requester.role != Roles.MODERATOR_ROLE && permissions.disableMic &&
+        if (requester.role != Roles.MODERATOR_ROLE && permissions.disableMic && u.muted &&
           msg.body.userId == msg.header.userId) {
-          // muting/unmuting self while not moderator and mic disabled. Do not allow.
+          // unmuting self while not moderator and mic disabled. Do not allow.
         } else {
           if (u.muted != msg.body.mute) {
             log.info("Send mute user request. meetingId=" + meetingId + " userId=" + u.intId + " user=" + u)
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/chat/views/ChatViewMediator.as b/clients/flash/air-client/src/org/bigbluebutton/air/chat/views/ChatViewMediator.as
index 7123e8f5cd4b051cd404b661043309a3dfafdbeb..d22d118315e95575c44000ba5e42686a4cd4722f 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/chat/views/ChatViewMediator.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/chat/views/ChatViewMediator.as
@@ -179,6 +179,7 @@ package org.bigbluebutton.air.chat.views {
 			chatMessageService.sendMessageOnSuccessSignal.remove(onSendSuccess);
 			chatMessageService.sendMessageOnFailureSignal.remove(onSendFailure);
 			meetingData.users.userChangeSignal.remove(onUserChange);
+			meetingData.meetingStatus.lockSettingsChangeSignal.remove(onLockSettingsChanged);
 			
 			if (_chat) {
 				_chat.newMessageSignal.remove(onNewMessage);
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/ConnectCommand.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/ConnectCommand.as
index 3dc462ea4c86106d559765e4ee1a0d3041a7eba9..8ecf4a352c28fe6ee9d73ea921759acff850ba45 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/ConnectCommand.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/ConnectCommand.as
@@ -16,7 +16,6 @@ package org.bigbluebutton.air.main.commands {
 	import org.bigbluebutton.air.user.models.User2x;
 	import org.bigbluebutton.air.user.models.UserChangeEnum;
 	import org.bigbluebutton.air.user.services.IUsersService;
-	import org.bigbluebutton.air.video.commands.ShareCameraSignal;
 	import org.bigbluebutton.air.video.services.IVideoConnection;
 	import org.bigbluebutton.air.voice.commands.ShareMicrophoneSignal;
 	import org.bigbluebutton.air.voice.models.PhoneOptions;
@@ -85,10 +84,7 @@ package org.bigbluebutton.air.main.commands {
 		
 		[Inject]
 		public var shareMicrophoneSignal:ShareMicrophoneSignal;
-		
-		[Inject]
-		public var shareCameraSignal:ShareCameraSignal;
-		
+			
 		private var authTokenTimeout:Timer;
 		
 		private var joinMeetingTimeout:Timer;
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/models/IUserSession.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/models/IUserSession.as
index 925e2eb748030176c6fb8af686455aafb539aec5..3140c02fe5e89b057f750a45004b846ddcf94007 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/main/models/IUserSession.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/models/IUserSession.as
@@ -37,7 +37,6 @@ package org.bigbluebutton.air.main.models {
 		function get videoProfileManager():VideoProfileManager
 		function set videoProfileManager(value:VideoProfileManager):void;
 		function get authTokenSignal():ISignal
-		function get lockSettings():LockSettings;
 		function set meetingMuted(mute:Boolean):void;
 		function get meetingMuted():Boolean;
 		function get pushToTalk():Boolean;
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/models/UserSession.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/models/UserSession.as
index 7285feb4787c6840f3b77677be40d70caa89a2e5..9d1943bdab1dd3e8d85e4a5344f1dfce4eafb009 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/main/models/UserSession.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/models/UserSession.as
@@ -37,9 +37,7 @@ package org.bigbluebutton.air.main.models {
 		protected var _meetingMuted:Boolean;
 		
 		protected var _joinUrl:String;
-		
-		protected var _lockSettings:LockSettings;
-		
+			
 		protected var _pushToTalk:Boolean;
 		
 		protected var _assignedDeskshareSignal:ISignal = new Signal();
@@ -67,11 +65,7 @@ package org.bigbluebutton.air.main.models {
 		public function set videoProfileManager(value:VideoProfileManager):void {
 			_videoProfileManager = value;
 		}
-		
-		public function get lockSettings():LockSettings {
-			return _lockSettings;
-		}
-		
+				
 		public function get meetingMuted():Boolean {
 			return _meetingMuted;
 		}
@@ -164,7 +158,6 @@ package org.bigbluebutton.air.main.models {
 		
 		public function UserSession() {
 			_presentationList = new PresentationList();
-			_lockSettings = new LockSettings();
 		}
 		
 		public function get presentationList():PresentationList {
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as
index 82ef96956655a30df2e3f8d833139a8d2ceada46..03ad8f983549925f71debb889a6a8c2d4dd178de 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as
@@ -1,22 +1,22 @@
 package org.bigbluebutton.air.main.views {
 	
 	import flash.events.MouseEvent;
-	
+	import spark.components.CalloutPosition;	
 	import spark.components.Alert;
 	import spark.components.CalloutPosition;
-	
 	import org.bigbluebutton.air.common.PageEnum;
 	import org.bigbluebutton.air.main.models.IConferenceParameters;
 	import org.bigbluebutton.air.main.models.IMedia;
 	import org.bigbluebutton.air.main.models.IMeetingData;
 	import org.bigbluebutton.air.main.models.IUISession;
+	import org.bigbluebutton.air.main.models.LockSettings2x;
+	import org.bigbluebutton.air.user.models.UserRole;
 	import org.bigbluebutton.air.video.commands.ShareCameraSignal;
 	import org.bigbluebutton.air.video.models.WebcamStreamInfo;
 	import org.bigbluebutton.air.voice.commands.MicrophoneMuteSignal;
 	import org.bigbluebutton.air.voice.commands.ShareMicrophoneSignal;
 	import org.bigbluebutton.air.voice.models.AudioTypeEnum;
 	import org.bigbluebutton.air.voice.models.VoiceUser;
-	
 	import robotlegs.bender.bundles.mvcs.Mediator;
 	import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap;
 	
@@ -52,7 +52,7 @@ package org.bigbluebutton.air.main.views {
 		public override function initialize():void {
 			meetingData.voiceUsers.userChangeSignal.add(onVoiceUserChanged);
 			meetingData.webcams.webcamChangeSignal.add(onWebcamChange);
-			
+
 			media.cameraPermissionSignal.add(onCameraPermission);
 			media.microphonePermissionSignal.add(onMicrophonePermission);
 			
@@ -64,6 +64,16 @@ package org.bigbluebutton.air.main.views {
 			updateButtons();
 		}
 		
+		private function lockCamButtonBasedOnSetting():void {
+			if (meetingData.users.me.locked && meetingData.users.me.role != UserRole.MODERATOR) {
+				if (meetingData.meetingStatus.lockSettings.disableCam) {
+					view.camButton.enabled = false;
+				} else {
+					view.camButton.enabled = true;		
+				}
+			}
+		}
+		
 		private function changeStatus(e:MouseEvent):void {
 			var emojicallout:EmojiCallout = new EmojiCallout();
 			emojicallout.horizontalPosition = CalloutPosition.MIDDLE;
@@ -72,7 +82,24 @@ package org.bigbluebutton.air.main.views {
 		}
 		
 		protected function micOnOff(e:MouseEvent):void {
-			microphoneMuteSignal.dispatch(meetingData.users.me.intId);
+			muteUnmuteUser();
+		}
+		
+		private function muteUnmuteUser():void {
+			if (meetingData.voiceUsers.me != null) {
+				if (meetingData.users.me.locked && meetingData.users.me.role != UserRole.MODERATOR) {
+					var vu:VoiceUser = meetingData.voiceUsers.getUser(meetingData.users.me.intId);
+					if (vu != null) {
+						if (meetingData.meetingStatus.lockSettings.disableMic && vu.muted) {
+							Alert.show("Unmuting denied.");
+						} else {
+							microphoneMuteSignal.dispatch(meetingData.users.me.intId);
+						}
+					}
+				}	 else {
+					microphoneMuteSignal.dispatch(meetingData.users.me.intId);
+				}			
+			}
 		}
 		
 		protected function audioOnOff(e:MouseEvent):void {
@@ -87,18 +114,30 @@ package org.bigbluebutton.air.main.views {
 		
 		private function joinOrLeaveAudio():void {
 			if (meetingData.voiceUsers.me == null) {
-				uiSession.pushPage(PageEnum.AUDIO);
+				if (meetingData.users.me.locked && 
+					meetingData.users.me.role != UserRole.MODERATOR &&
+					meetingData.meetingStatus.lockSettings.disableMic) {
+					shareMicrophoneSignal.dispatch(AudioTypeEnum.LISTEN_ONLY, conferenceParameters.webvoiceconf);
+				} else {
+					uiSession.pushPage(PageEnum.AUDIO);	
+				}			
 			} else {
 				shareMicrophoneSignal.dispatch(AudioTypeEnum.LEAVE, "");
 			}
 		}
 		
 		private function camOnOff(e:MouseEvent):void {
-			if (media.cameraAvailable) {
-				if (!media.cameraPermissionGranted) {
-					media.requestCameraPermission();
-				} else {
-					enableDisableWebcam();
+			if (meetingData.users.me.locked && 
+				meetingData.users.me.role != UserRole.MODERATOR && 
+				meetingData.meetingStatus.lockSettings.disableCam) {
+				Alert.show("Sharing webcam denied.");
+			} else {
+				if (media.cameraAvailable) {
+					if (!media.cameraPermissionGranted) {
+						media.requestCameraPermission();
+					} else {
+						enableDisableWebcam();
+					}
 				}
 			}
 		}
@@ -116,7 +155,7 @@ package org.bigbluebutton.air.main.views {
 				view.camButton.label = "Cam on"; // ResourceManager.getInstance().getString('resources', 'menuButtons.camOn');
 				view.camButton.styleName = "icon-video menuButton"
 			}
-			
+						
 			if (meetingData.voiceUsers.me) {
 				view.micButton.visible = view.micButton.includeInLayout = !meetingData.voiceUsers.me.listenOnly;
 				view.audioButton.styleName = "icon-audio-off menuButtonRed";
@@ -170,6 +209,7 @@ package org.bigbluebutton.air.main.views {
 		public override function destroy():void {
 			meetingData.voiceUsers.userChangeSignal.remove(onVoiceUserChanged);
 			meetingData.webcams.webcamChangeSignal.remove(onWebcamChange);
+
 			media.cameraPermissionSignal.remove(onCameraPermission);
 			media.microphonePermissionSignal.remove(onMicrophonePermission);
 			view.audioButton.removeEventListener(MouseEvent.CLICK, audioOnOff);
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/screenshare/views/ScreenshareDock.as b/clients/flash/air-client/src/org/bigbluebutton/air/screenshare/views/ScreenshareDock.as
index 7dddb1453a85e83d9f48054e433fdd50af414255..ff3947fd60968bec9aae14997c6764d57bd9054c 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/screenshare/views/ScreenshareDock.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/screenshare/views/ScreenshareDock.as
@@ -38,7 +38,7 @@ package org.bigbluebutton.air.screenshare.views {
 			
 			//available = false; // for testing to force using Video instead of StageVideo!!!
 			
-			trace("************ ScreenshareView: STAGE VIDEO available=" + available);
+			//trace("************ ScreenshareView: STAGE VIDEO available=" + available);
 			stage.removeEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoState);
 			// Detect if StageVideo is available and decide what to do in toggleStageVideo 
 			toggleStageVideo(available);
@@ -49,7 +49,7 @@ package org.bigbluebutton.air.screenshare.views {
 			if (available) {				
 				if (_sv == null) {
 					_usingStageVideo = true;
-					trace("***** Using StageVideo length=" + stage.stageVideos.length);
+					//trace("***** Using StageVideo length=" + stage.stageVideos.length);
 					_screenshareRunningListener(_usingStageVideo, true);
 					
 					setupNetstream();
@@ -63,8 +63,8 @@ package org.bigbluebutton.air.screenshare.views {
 					// to be relative to this container.
 					var point:Point = this.localToGlobal(new Point(viewPort.x, viewPort.y));
 					var newViewPort:Rectangle = new Rectangle(point.x, point.y, viewPort.width, viewPort.height);	
-					trace("****toggleStageVideo ViewPort x=" + viewPort.x + ",y=" + viewPort.y 
-						+ " newViewPort x=" + newViewPort.x + ",y=" + newViewPort.y);
+					//trace("****toggleStageVideo ViewPort x=" + viewPort.x + ",y=" + viewPort.y 
+					//	+ " newViewPort x=" + newViewPort.x + ",y=" + newViewPort.y);
 					_sv.viewPort = newViewPort;
 					
 					// Listen for event if StageVideo can play the stream.
@@ -111,7 +111,7 @@ package org.bigbluebutton.air.screenshare.views {
 		private function playStream():void {
 			if (!_played) {
 				_played = true;
-				trace("***** Playing stream " + _streamId);
+				//trace("***** Playing stream " + _streamId);
 				_ns.play(_streamId);
 			}
 		}
@@ -138,7 +138,7 @@ package org.bigbluebutton.air.screenshare.views {
 			
 			setupNetstream();
 			
-			trace("***** Using classic Video");
+			//trace("***** Using classic Video");
 			var viewPort:Rectangle = positionAndSize(this.width, this.height, _origVidWidth, _origVidHeight);
 			//trace("**** ViewPort x=" + viewPort.x + ",y=" + viewPort.y);
 
@@ -156,7 +156,7 @@ package org.bigbluebutton.air.screenshare.views {
 		
 		private function stageVideoStateChange(event:StageVideoEvent):void {
 			var status:String = event.status;
-			trace("***** stageVideoStateChange " + status + ",codec=" + event.codecInfo + ",color=" + event.colorSpace);
+			//trace("***** stageVideoStateChange " + status + ",codec=" + event.codecInfo + ",color=" + event.colorSpace);
 			var switchToVideo:Boolean = status == flash.media.VideoStatus.UNAVAILABLE;
 			//trace("***** stageVideoStateChange Forcing to use Video " + switchToVideo);
 			//switchToVideo = true; // for testing to force using video
@@ -168,14 +168,14 @@ package org.bigbluebutton.air.screenshare.views {
 		}
 			
 		public function viewStream(conn:NetConnection, streamId:String, width:int, height:int):void {
-			trace("************ ScreenshareView: viewing of screenshare streamId=" + streamId + " w=" + width + " h=" + height);
+			//trace("************ ScreenshareView: viewing of screenshare streamId=" + streamId + " w=" + width + " h=" + height);
 			_conn = conn;
 			_streamId = streamId;
 			_origVidWidth = width;
 			_origVidHeight = height;
 						
 			if (stage == null) {
-				trace("************ ScreenshareView: STAGE IS NULL!!!!!!!!");
+				//trace("************ ScreenshareView: STAGE IS NULL!!!!!!!!");
 			} else {
 				stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoState);
 			}
@@ -191,7 +191,7 @@ package org.bigbluebutton.air.screenshare.views {
 		
 		override protected function updateDisplayList(w:Number, h:Number):void {
 			super.updateDisplayList(w, h);
-			trace("************ ScreenshareView: updateDisplayList !!!!!!!!");
+			//trace("************ ScreenshareView: updateDisplayList !!!!!!!!");
 			updateDisplayStream(w, h);
 		}
 		
@@ -203,26 +203,26 @@ package org.bigbluebutton.air.screenshare.views {
 				// to be relative to this container.
 				var point:Point = this.localToGlobal(new Point(viewPort.x, viewPort.y));
 				var newViewPort:Rectangle = new Rectangle(point.x, point.y, viewPort.width, viewPort.height);	
-				trace("**** updateDisplayStream ViewPort x=" + viewPort.x + ",y=" + viewPort.y + " newViewPort x=" 
-					+ newViewPort.x + ",y=" + newViewPort.y);
+				//trace("**** updateDisplayStream ViewPort x=" + viewPort.x + ",y=" + viewPort.y + " newViewPort x=" 
+				//	+ newViewPort.x + ",y=" + newViewPort.y);
 				_sv.viewPort = newViewPort;
 				var tRectCoord:Rectangle = calculateTopBlackRect(this.width, this.height, 
 					viewPort.x, viewPort.y, newViewPort.width, newViewPort.height);
 				
-				trace("**** updateDisplayStream TopRect x=" + tRectCoord.x + ",y=" + tRectCoord.y + " w=" 
-					+ tRectCoord.width + ",h=" + tRectCoord.height);
+				//trace("**** updateDisplayStream TopRect x=" + tRectCoord.x + ",y=" + tRectCoord.y + " w=" 
+				//	+ tRectCoord.width + ",h=" + tRectCoord.height);
 				
 				positionRect(_topRect, tRectCoord);
 				
 				var bottRectCoord:Rectangle = calculateBottomBlackRect(this.width, this.height, 
 					viewPort.x, viewPort.y, newViewPort.width, newViewPort.height);
 				
-				trace("**** updateDisplayStream BottomRect x=" + bottRectCoord.x + ",y=" + bottRectCoord.y + " w=" 
-					+ bottRectCoord.width + ",h=" + bottRectCoord.height);
+				//trace("**** updateDisplayStream BottomRect x=" + bottRectCoord.x + ",y=" + bottRectCoord.y + " w=" 
+				//	+ bottRectCoord.width + ",h=" + bottRectCoord.height);
 				positionRect(_bottomRect, bottRectCoord);
 				
 			} else if (_usingVideo) {
-				trace("***** Using classic Video");
+				//trace("***** Using classic Video");
 				//trace("**** ViewPort x=" + viewPort.x + ",y=" + viewPort.y);
 				_ssView.x = viewPort.x;
 				_ssView.y = viewPort.y;
@@ -258,14 +258,14 @@ package org.bigbluebutton.air.screenshare.views {
 		}
 		
 		public function onMetaData(info:Object):void {
-			trace("ScreenshareView::ScreenshareView width={0} height={1}", [info.width, info.height]);
+			//trace("ScreenshareView::ScreenshareView width={0} height={1}", [info.width, info.height]);
 
 		}
 		
 		public function dispose():void {
-			trace("************ ScreenshareView: dispose *********************");
+			//trace("************ ScreenshareView: dispose *********************");
 			if (stage != null) {
-				trace("************ ScreenshareView::dispose - remove listener ****************");
+				//trace("************ ScreenshareView::dispose - remove listener ****************");
 				stage.removeEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onStageVideoState);
 			}
 			stopViewing();
@@ -336,13 +336,13 @@ package org.bigbluebutton.air.screenshare.views {
 		
 		private function calculateTopBlackRect(contWidth:int, contHeight:int, vidX:int, vidY:int, vidWidth:int, vidHeight:int):Rectangle {
 			if (vidHeight < contHeight) {
-				trace("**** calculateTopBlackRect TopRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
-					+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
+				//trace("**** calculateTopBlackRect TopRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
+				//	+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
 				// Display rectangle at top of video.
 				return new Rectangle(0, 0, contWidth, vidY);
 			} else {
-				trace("**** calculateTopBlackRect LeftRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
-					+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
+				//trace("**** calculateTopBlackRect LeftRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
+				//	+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
 				// Display rectangle on left of video
 				return new Rectangle(0, 0, vidX, contHeight);
 			}			
@@ -350,13 +350,13 @@ package org.bigbluebutton.air.screenshare.views {
 		
 		private function calculateBottomBlackRect(contWidth:int, contHeight:int, vidX:int, vidY:int, vidWidth:int, vidHeight:int):Rectangle {
 			if (vidHeight < contHeight) {
-				trace("**** calculateTopBlackRect BottomRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
-					+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
+				//trace("**** calculateTopBlackRect BottomRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
+				//	+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
 				// Display rect at bottom of video
 				return new Rectangle(0, vidY + vidHeight, contWidth, contHeight - (vidY + vidHeight));
 			} else {
-				trace("**** calculateTopBlackRect RightRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
-					+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
+				//trace("**** calculateTopBlackRect RightRect cw=" + contWidth + ",ch=" + contHeight + " vidx=" + vidX 
+				//	+ ",vidy=" + vidY + " vidw=" + vidWidth + ",vidh=" + vidHeight);
 				// Display rect at right of video
 				return new Rectangle(vidX + vidWidth, 0, contWidth - (vidX + vidWidth), contHeight);
 			}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/SettingsViewMediatorBase.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/SettingsViewMediatorBase.as
index 1fc012c6cb6c4b9b58801b017fcff454498524ce..8ff8d3b5421dce6098dc6db44ba41c21e4ba6242 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/SettingsViewMediatorBase.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/SettingsViewMediatorBase.as
@@ -22,7 +22,10 @@ package org.bigbluebutton.air.settings.views {
 			view.participantIcon.setInitials(UserUtils.getInitials(meetingData.users.me.name));
 			view.participantIcon.setRole(meetingData.users.me.role);
 			view.participantLabel.text = meetingData.users.me.name;
-			view.settingsList.dataProvider = dataProvider = new ArrayCollection([{label: "Audio", icon: "icon-unmute", page: "audio"}, {label: "Video", icon: "icon-video", page: "camera"}, {label: "Application", icon: "icon-application", page: "chat"}, {label: "Participants", icon: "icon-user", page: "lock"}, {label: "Leave Session", icon: "icon-logout", page: "exit"}]);
+			view.settingsList.dataProvider = dataProvider = new ArrayCollection([{label: "Audio", icon: "icon-unmute", page: "audio"}, 
+				{label: "Video", icon: "icon-video", page: "camera"}, 
+				{label: "Application", icon: "icon-application", page: "chat"}, 
+				{label: "Leave Session", icon: "icon-logout", page: "exit"}]);
 			
 			view.settingsList.addEventListener(IndexChangeEvent.CHANGE, onListIndexChangeEvent);
 		}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewBase.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewBase.as
index 9a775d91cacd761c22df716371f6765973dde0d2..b16102b2d49996c5da876ab2e3773cf74a9d5550 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewBase.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewBase.as
@@ -1,9 +1,6 @@
 package org.bigbluebutton.air.settings.views.camera {
 	import mx.core.ClassFactory;
 	import mx.graphics.SolidColor;
-	
-	import org.bigbluebutton.air.user.views.UserItemRenderer;
-	
 	import spark.components.Button;
 	import spark.components.Group;
 	import spark.components.HGroup;
@@ -12,7 +9,6 @@ package org.bigbluebutton.air.settings.views.camera {
 	import spark.components.ToggleSwitch;
 	import spark.components.VGroup;
 	import spark.components.VideoDisplay;
-	import spark.components.supportClasses.ToggleButtonBase;
 	import spark.layouts.HorizontalAlign;
 	import spark.layouts.VerticalLayout;
 	import spark.primitives.Rect;
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorAIR.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorAIR.as
index 311c030a906ce2498f205053bb21459132b92d30..a3a45fafd2a176e1486d5035461ee585441954f7 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorAIR.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorAIR.as
@@ -5,6 +5,7 @@ package org.bigbluebutton.air.settings.views.camera {
 	import flash.geom.Matrix;
 	import flash.geom.Point;
 	import flash.media.Camera;
+	import flash.media.CameraPosition;
 	import flash.media.Video;
 	
 	import org.bigbluebutton.air.common.PageEnum;
@@ -37,7 +38,7 @@ package org.bigbluebutton.air.settings.views.camera {
 				//setSwapCameraButtonEnable(!userMe.hasStream);
 				view.swapCameraButton.addEventListener(MouseEvent.CLICK, mouseClickHandler);
 			}
-			
+						
 			//setRotateCameraButtonEnable(!userMe.hasStream);
 			// FlexGlobals.topLevelApplication.stage.addEventListener(ResizeEvent.RESIZE, stageOrientationChangingHandler);
 			// view.startCameraButton.addEventListener(MouseEvent.CLICK, onShareCameraClick);
@@ -86,6 +87,9 @@ package org.bigbluebutton.air.settings.views.camera {
 				userSession.videoConnection.selectedCameraRotation = 0;
 			}
 			saveData.save("cameraRotation", userSession.videoConnection.selectedCameraRotation);
+			
+			//trace("CAMERA ROTATION = " + userSession.videoConnection.selectedCameraRotation);
+			
 			displayPreviewCamera();
 		}
 		
@@ -102,18 +106,31 @@ package org.bigbluebutton.air.settings.views.camera {
 		}
 		
 		override protected function displayPreviewCamera():void {
+			//trace("DISPLAY PREVIEW CAMERA = " + userSession.videoConnection.selectedCameraRotation);
+			
 			var profile:VideoProfile = userSession.videoConnection.selectedCameraQuality;
 			var camera:Camera = getCamera(userSession.videoConnection.cameraPosition);
+			
 			if (camera && profile) {
 				var myCam:Video = new Video();
+				
+				//trace("Orientation chW=" + view.cameraHolder.width + " chH=" + view.cameraHolder.height 
+				//	+ " profileW=" + profile.width + " profileH=" + profile.height);
+				
 				var screenAspectRatio:Number = (view.cameraHolder.width / profile.width) / (view.cameraHolder.height / profile.height);
+				
 				if (screenAspectRatio > 1) { //landscape
+					//trace("DISPLAY PREVIEW CAMERA LANDSCAPE screenAspectRatio=" + screenAspectRatio);
 					myCam.height = view.cameraHolder.height;
 					myCam.width = profile.width * view.cameraHolder.height / profile.height;
 				} else { //portrait
+					//trace("DISPLAY PREVIEW CAMERA PORTRAIT screenAspectRatio=" + screenAspectRatio);
 					myCam.width = view.cameraHolder.width;
 					myCam.height = profile.height * view.cameraHolder.width / profile.width;
 				}
+				
+				//trace("A0 MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
 				if (isCamRotatedSideways()) {
 					camera.setMode(profile.height, profile.width, profile.modeFps);
 					var temp:Number = myCam.width;
@@ -122,24 +139,41 @@ package org.bigbluebutton.air.settings.views.camera {
 				} else {
 					camera.setMode(profile.width, profile.height, profile.modeFps);
 				}
-				rotateObjectAroundInternalPoint(myCam, myCam.x + myCam.width / 2, myCam.y + myCam.height / 2, userSession.videoConnection.selectedCameraRotation);
+				
+				//trace("B0 MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
+				rotateObjectAroundInternalPoint(myCam, myCam.x + myCam.width / 2, myCam.y + myCam.height / 2, 
+					userSession.videoConnection.selectedCameraRotation);
+				
+				//trace("C0 MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
 				myCam.x = (view.cameraHolder.width - myCam.width) / 2;
+				
+				//trace("D0 MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
 				if (userSession.videoConnection.selectedCameraRotation == 90) {
-					myCam.y = 0;
-						//myCam.x = (view.cameraHolder.width + myCam.width) / 2;
+					myCam.x = (view.cameraHolder.width + myCam.width) / 2;
 				} else if (userSession.videoConnection.selectedCameraRotation == 270) {
 					myCam.y = myCam.height;
 				} else if (userSession.videoConnection.selectedCameraRotation == 180) {
 					myCam.x = (view.cameraHolder.width + myCam.width) / 2;
 					myCam.y = myCam.height;
 				}
+				
+				//trace("E0 MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
 				myCam.attachCamera(camera);
+				
 				view.previewVideo.removeChildren();
+				
+				//trace("MyCam x=" + myCam.x + " y=" + myCam.y + " w=" + myCam.width + " h=" + myCam.height);
+				
 				view.previewVideo.addChild(myCam);
 					// view.settingsGroup.y = myCam.height;
 			} else {
 				view.noVideoMessage.visible = true;
 			}
+			
 			view.positionActionButtons();
 		}
 		
@@ -169,8 +203,10 @@ package org.bigbluebutton.air.settings.views.camera {
 		 */
 		//close old stream on swap
 		private function mouseClickHandler(e:MouseEvent):void {
-			/*
-			if (!userSession.userList.me.hasStream) {
+			var myWebcams:Array = meetingData.webcams.findWebcamsByUserId(meetingData.users.me.intId);
+			var isPublishing:Boolean = myWebcams.length > 0;
+			
+			if (!isPublishing) {
 				if (String(userSession.videoConnection.cameraPosition) == CameraPosition.FRONT) {
 					userSession.videoConnection.cameraPosition = CameraPosition.BACK;
 				} else {
@@ -178,16 +214,15 @@ package org.bigbluebutton.air.settings.views.camera {
 				}
 			} else {
 				if (String(userSession.videoConnection.cameraPosition) == CameraPosition.FRONT) {
-					shareCameraSignal.dispatch(!userSession.userList.me.hasStream, CameraPosition.FRONT);
-					shareCameraSignal.dispatch(userSession.userList.me.hasStream, CameraPosition.BACK);
+					shareCameraSignal.dispatch(!isPublishing, CameraPosition.FRONT);
+					shareCameraSignal.dispatch(isPublishing, CameraPosition.BACK);
 				} else {
-					shareCameraSignal.dispatch(!userSession.userList.me.hasStream, CameraPosition.BACK);
-					shareCameraSignal.dispatch(userSession.userList.me.hasStream, CameraPosition.FRONT);
+					shareCameraSignal.dispatch(!isPublishing, CameraPosition.BACK);
+					shareCameraSignal.dispatch(isPublishing, CameraPosition.FRONT);
 				}
 			}
 			saveData.save("cameraPosition", userSession.videoConnection.cameraPosition);
 			displayPreviewCamera();
-			*/
 		}
 		
 		override public function destroy():void {
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorBase.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorBase.as
index 177ca16f7505c883c5e305ed14beb8d292c96fad..bb2b087b9f75247f6598e6843adf9f72f8f5891d 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorBase.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/camera/CameraSettingsViewMediatorBase.as
@@ -3,16 +3,17 @@ package org.bigbluebutton.air.settings.views.camera {
 	import mx.collections.ArrayCollection;
 	import mx.events.ItemClickEvent;
 	
+	import spark.events.IndexChangeEvent;
+	
 	import org.bigbluebutton.air.common.models.ISaveData;
 	import org.bigbluebutton.air.main.models.IMeetingData;
 	import org.bigbluebutton.air.main.models.IUserSession;
+	import org.bigbluebutton.air.main.models.LockSettings2x;
 	import org.bigbluebutton.air.user.models.User2x;
 	import org.bigbluebutton.air.video.models.VideoProfile;
 	
 	import robotlegs.bender.bundles.mvcs.Mediator;
 	
-	import spark.events.IndexChangeEvent;
-	
 	public class CameraSettingsViewMediatorBase extends Mediator {
 		
 		[Inject]
@@ -48,7 +49,7 @@ package org.bigbluebutton.air.settings.views.camera {
 			dataProvider.refresh();
 			view.cameraProfilesList.selectedIndex = dataProvider.getItemIndex(userSession.videoConnection.selectedCameraQuality);
 			
-			userSession.lockSettings.disableCamSignal.add(disableCam);
+			meetingData.meetingStatus.lockSettingsChangeSignal.add(onLockSettingsChangeSignal);
 			//setQualityListEnable(!meetingData.users.me.hasStream);
 		}
 		
@@ -69,11 +70,11 @@ package org.bigbluebutton.air.settings.views.camera {
 		protected function userChangeHandler(user:User2x, type:int):void {
 		}
 		
-		private function disableCam(disable:Boolean):void {
-			if (disable) {
-				// view.startCameraButton.enabled = false;
+		private function onLockSettingsChangeSignal(newSettings:LockSettings2x):void {
+			if (newSettings.disableCam) {
+				//view..enabled = false;
 			} else {
-				// view.startCameraButton.enabled = true;
+				//view.startCameraButton.enabled = true;
 			}
 		}
 		
@@ -83,7 +84,7 @@ package org.bigbluebutton.air.settings.views.camera {
 		
 		override public function destroy():void {
 			super.destroy();
-			userSession.lockSettings.disableCamSignal.remove(disableCam);
+			meetingData.meetingStatus.lockSettingsChangeSignal.remove(onLockSettingsChangeSignal);
 			meetingData.users.userChangeSignal.remove(userChangeHandler);
 			view.cameraProfilesList.removeEventListener(ItemClickEvent.ITEM_CLICK, onCameraQualitySelected);
 		}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorAIR.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorAIR.as
index f3caaf9c0a712ed7c0a68b3dffdfa938a3197d5e..3cecc775ed8b8f0af947491d2f3810a4e3ea00fc 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorAIR.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorAIR.as
@@ -28,8 +28,8 @@ package org.bigbluebutton.air.settings.views.lock {
 			newLockSettings.disablePrivateChat = !view.privateChatCheckbox.selected;
 			newLockSettings.disablePublicChat = !view.publicChatCheckbox.selected;
 			newLockSettings.lockedLayout = !view.layoutCheckbox.selected;
-			newLockSettings.lockOnJoin = userSession.lockSettings.lockOnJoin;
-			newLockSettings.lockOnJoinConfigurable = userSession.lockSettings.lockOnJoinConfigurable;
+			newLockSettings.lockOnJoin = meetingData.meetingStatus.lockSettings.lockOnJoin;
+			newLockSettings.lockOnJoinConfigurable = meetingData.meetingStatus.lockSettings.lockOnJoinConfigurable;
 			saveLockSettingsSignal.dispatch(newLockSettings);
 			userUISession.popPage();
 		}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorBase.as b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorBase.as
index 8a12d194a04ce694fb16f2a3a6a9ff03be54e0fa..9437eed4d8c32ff4ff641b1cfdd5d7998e07229b 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorBase.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/settings/views/lock/LockSettingsViewMediatorBase.as
@@ -1,6 +1,5 @@
 package org.bigbluebutton.air.settings.views.lock {
-	import org.bigbluebutton.air.main.models.IUserSession;
-	
+	import org.bigbluebutton.air.main.models.IMeetingData;
 	import robotlegs.bender.bundles.mvcs.Mediator;
 	
 	public class LockSettingsViewMediatorBase extends Mediator {
@@ -9,18 +8,18 @@ package org.bigbluebutton.air.settings.views.lock {
 		public var view:LockSettingsViewBase;
 		
 		[Inject]
-		public var userSession:IUserSession;
+		public var meetingData:IMeetingData;
 		
 		override public function initialize():void {
 			loadLockSettings();
 		}
 		
 		private function loadLockSettings():void {
-			view.webcamCheckbox.selected = !userSession.lockSettings.disableCam;
-			view.microphoneCheckbox.selected = !userSession.lockSettings.disableMic;
-			view.privateChatCheckbox.selected = !userSession.lockSettings.disablePrivateChat;
-			view.publicChatCheckbox.selected = !userSession.lockSettings.disablePublicChat;
-			view.layoutCheckbox.selected = !userSession.lockSettings.lockedLayout;
+			view.webcamCheckbox.selected = !meetingData.meetingStatus.lockSettings.disableCam;
+			view.microphoneCheckbox.selected = !meetingData.meetingStatus.lockSettings.disableMic;
+			view.privateChatCheckbox.selected = !meetingData.meetingStatus.lockSettings.disablePrivChat;
+			view.publicChatCheckbox.selected = !meetingData.meetingStatus.lockSettings.disablePubChat;
+			view.layoutCheckbox.selected = !meetingData.meetingStatus.lockSettings.lockedLayout;
 		}
 	
 	}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/video/VideoConfig.as b/clients/flash/air-client/src/org/bigbluebutton/air/video/VideoConfig.as
index 659d78a12f46b5d772f93418074b7c115c53a706..06a16ae3b48e395b8e12256d2d236831bfbc9c82 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/video/VideoConfig.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/video/VideoConfig.as
@@ -2,6 +2,8 @@ package org.bigbluebutton.air.video {
 	
 	import org.bigbluebutton.air.video.commands.ShareCameraCommand;
 	import org.bigbluebutton.air.video.commands.ShareCameraSignal;
+	import org.bigbluebutton.air.video.commands.StopShareCameraCommand;
+	import org.bigbluebutton.air.video.commands.StopShareCameraSignal;
 	import org.bigbluebutton.air.video.views.WebcamDock;
 	import org.bigbluebutton.air.video.views.WebcamDockMediator;
 	
@@ -31,6 +33,7 @@ package org.bigbluebutton.air.video {
 		
 		private function signals():void {
 			signalCommandMap.map(ShareCameraSignal).toCommand(ShareCameraCommand);
+			signalCommandMap.map(StopShareCameraSignal).toCommand(StopShareCameraCommand);
 		}
 	}
 }
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraCommand.as b/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraCommand.as
new file mode 100755
index 0000000000000000000000000000000000000000..0fbd928b557b9101041cdea93d6f6e04e250e0ef
--- /dev/null
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraCommand.as
@@ -0,0 +1,62 @@
+package org.bigbluebutton.air.video.commands
+{
+	import flash.media.Camera;
+	
+	import org.bigbluebutton.air.main.models.IConferenceParameters;
+	import org.bigbluebutton.air.main.models.IMeetingData;
+	import org.bigbluebutton.air.main.models.IUserSession;
+	import org.bigbluebutton.air.user.services.IUsersService;
+	import org.bigbluebutton.air.video.models.WebcamStreamInfo;
+	
+	import robotlegs.bender.bundles.mvcs.Command;
+
+	public class StopShareCameraCommand extends Command
+	{
+		[Inject]
+		public var userSession:IUserSession;
+		
+		[Inject]
+		public var usersService:IUsersService;
+		
+		[Inject]
+		public var meetingData:IMeetingData;
+		
+		[Inject]
+		public var conferenceParameters:IConferenceParameters;
+		
+		override public function execute():void {
+			disableCamera();
+		}
+		
+		private function disableCamera():void {
+			var webcams:Array = meetingData.webcams.findWebcamsByUserId(meetingData.users.me.intId);
+			if (webcams.length > 0) {
+				usersService.removeStream(meetingData.users.me.intId, (webcams[0] as WebcamStreamInfo).streamId);
+				userSession.videoConnection.stopPublishing(setupCamera(userSession.videoConnection.cameraPosition));
+			}
+		}
+		
+		private function setupCamera(position:String):Camera {
+			return findCamera(position);
+		}
+		
+		private function findCamera(position:String):Camera {
+			if (!Camera.isSupported) {
+				return null;
+			}
+			var cam:Camera = this.getCamera(position);
+			return cam;
+		}
+		
+		// Get the requested camera. If it cannot be found,
+		// return the device's default camera.
+		private function getCamera(position:String):Camera {
+			for (var i:uint = 0; i < Camera.names.length; ++i) {
+				var cam:Camera = Camera.getCamera(String(i));
+				if (cam.position == position)
+					return cam;
+			}
+			return Camera.getCamera();
+		}
+	}
+}
\ No newline at end of file
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraSignal.as b/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraSignal.as
new file mode 100755
index 0000000000000000000000000000000000000000..83f318d6887baacb551c71aae013a7a52bde7074
--- /dev/null
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/video/commands/StopShareCameraSignal.as
@@ -0,0 +1,12 @@
+package org.bigbluebutton.air.video.commands
+{
+	import org.osflash.signals.Signal;
+
+	public class StopShareCameraSignal extends Signal
+	{
+		public function StopShareCameraSignal()
+		{
+			super();
+		}
+	}
+}
\ No newline at end of file
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/video/services/VideoConnection.as b/clients/flash/air-client/src/org/bigbluebutton/air/video/services/VideoConnection.as
index 19889901f6f673b6b75f15e9ff2a6821a4d67d85..b8b8dc714cbba765edfb09f614133618567cc37e 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/video/services/VideoConnection.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/video/services/VideoConnection.as
@@ -15,9 +15,9 @@ package org.bigbluebutton.air.video.services {
 	import org.bigbluebutton.air.main.models.IMeetingData;
 	import org.bigbluebutton.air.main.models.IUserSession;
 	import org.bigbluebutton.air.main.models.LockSettings2x;
-	import org.bigbluebutton.air.user.models.User2x;
 	import org.bigbluebutton.air.user.models.UserRole;
 	import org.bigbluebutton.air.video.commands.ShareCameraSignal;
+	import org.bigbluebutton.air.video.commands.StopShareCameraSignal;
 	import org.bigbluebutton.air.video.models.VideoProfile;
 	import org.osflash.signals.ISignal;
 	import org.osflash.signals.Signal;
@@ -43,6 +43,9 @@ package org.bigbluebutton.air.video.services {
 		[Inject]
 		public var shareCameraSignal:ShareCameraSignal;
 		
+		[Inject]
+		public var stopShareCameraSignal:StopShareCameraSignal;
+		
 		private var cameraToNetStreamMap:Object = new Object();
 		
 		private var cameraToStreamNameMap:Object = new Object;
@@ -70,8 +73,9 @@ package org.bigbluebutton.air.video.services {
 		}
 		
 		private function lockSettingsChange(lockSettings:LockSettings2x):void {
-			if (lockSettings.disableCam && meetingData.users.me.locked && meetingData.users.me.role != UserRole.MODERATOR) {
-				shareCameraSignal.dispatch(false, null);
+			if (lockSettings.disableCam && meetingData.users.me.locked && 
+				meetingData.users.me.role != UserRole.MODERATOR) {
+				stopShareCameraSignal.dispatch();
 			}
 		}
 		
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/voice/commands/MicrophoneMuteCommand.as b/clients/flash/air-client/src/org/bigbluebutton/air/voice/commands/MicrophoneMuteCommand.as
index 000f2e2e8991473fe70290e75e54aa8bdea51e8b..9e5013897cd94f292d66d21fcfefcda4a7fc22f1 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/voice/commands/MicrophoneMuteCommand.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/voice/commands/MicrophoneMuteCommand.as
@@ -18,13 +18,12 @@ package org.bigbluebutton.air.voice.commands {
 		public var userId:String;
 		
 		override public function execute():void {
-			trace("MicrophoneMuteCommand.execute() - userId = " + userId);
 			var vu:VoiceUser = meetingData.voiceUsers.getUser(userId);
 			if (vu != null) {
-				if (vu.muted) {
-					voiceService.unmute(userId);
-				} else {
+				if (!vu.muted || meetingData.meetingStatus.lockSettings.disableMic) {
 					voiceService.mute(userId);
+				} else {
+					voiceService.unmute(userId);
 				}
 			}
 		}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/voice/models/VoiceUsers.as b/clients/flash/air-client/src/org/bigbluebutton/air/voice/models/VoiceUsers.as
index 41c1e6421122fd3edd4f8c5f24eb1b0da5c1c523..015b597260ae216ac19d72ab3a444faa633880a3 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/voice/models/VoiceUsers.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/voice/models/VoiceUsers.as
@@ -39,7 +39,7 @@ package org.bigbluebutton.air.voice.models {
 			if (index >= 0) {
 				var removedUser:VoiceUser = _users.removeItemAt(index) as VoiceUser;
 				
-				if (_me == removedUser) {
+				if (_me.intId == removedUser.intId) {
 					_me = null;
 				}
 				
@@ -77,6 +77,7 @@ package org.bigbluebutton.air.voice.models {
 					// Force user to not talking if muted.
 					user.talking = false;
 				}
+
 				_userChangeSignal.dispatch(user, VoiceUserChangeEnum.MUTE);
 			}
 		}
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceConnection.as b/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceConnection.as
index 24feb443499e6de6b1cae23d4c3b4906e0ed6c46..b6f4d5dae3576c3315bc98399a5776471ad6fdb3 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceConnection.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceConnection.as
@@ -13,7 +13,9 @@ package org.bigbluebutton.air.voice.services {
 	import org.bigbluebutton.air.main.models.IUserSession;
 	import org.bigbluebutton.air.main.models.LockSettings2x;
 	import org.bigbluebutton.air.user.models.UserRole;
+	import org.bigbluebutton.air.voice.commands.MicrophoneMuteSignal;
 	import org.bigbluebutton.air.voice.commands.ShareMicrophoneSignal;
+	import org.bigbluebutton.air.voice.models.VoiceUser;
 	import org.osflash.signals.ISignal;
 	import org.osflash.signals.Signal;
 	
@@ -30,9 +32,9 @@ package org.bigbluebutton.air.voice.services {
 		public var meetingData:IMeetingData;
 		
 		[Inject]
-		public var shareMicrophoneSignal:ShareMicrophoneSignal;
+		public var microphoneMuteSignal:MicrophoneMuteSignal;
 		
-		public var _callActive:Boolean = false;
+		private var _callActive:Boolean = false;
 		
 		protected var _connectionSuccessSignal:ISignal = new Signal();
 		
@@ -61,8 +63,12 @@ package org.bigbluebutton.air.voice.services {
 		
 		private function lockSettingsChange(lockSettings:LockSettings2x):void {
 			if (lockSettings.disableMic && meetingData.users.me.locked && meetingData.users.me.role != UserRole.MODERATOR) {
-				trace("TODO: Disabling the mic still needs to be finished");
-				//shareMicrophoneSignal.dispatch(audioOptions);
+				if (meetingData.voiceUsers.me != null) {
+					var vu:VoiceUser = meetingData.voiceUsers.getUser(meetingData.users.me.intId);
+					if (!vu.muted && meetingData.meetingStatus.lockSettings.disableMic) {
+						microphoneMuteSignal.dispatch(meetingData.users.me.intId);
+					}					
+				}		
 			}
 		}
 		
diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceMessageReceiver.as b/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceMessageReceiver.as
index 44ac4bdb2a2726f9a6eae81ac81f0c332b17f454..1b442ecc7c10849cc09d44c85e016eca3add96cc 100755
--- a/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceMessageReceiver.as
+++ b/clients/flash/air-client/src/org/bigbluebutton/air/voice/services/VoiceMessageReceiver.as
@@ -68,12 +68,11 @@ package org.bigbluebutton.air.voice.services {
 			meetingData.voiceUsers.remove(intId);
 		}
 		
-		private function handleUserMutedEvtMsg(msg:Object):void {
+		private function handleUserMutedEvtMsg(msg:Object):void {			
 			var header:Object = msg.header as Object;
 			var body:Object = msg.body as Object;
 			var intId:String = body.intId as String;
 			var muted:Boolean = body.muted as Boolean;
-			
 			meetingData.voiceUsers.changeUserMute(intId, muted);
 		}