diff --git a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
index 664722133a20c2b1417a71885781d5544dc497f8..705fdfa35a69f2c8ee10ce8f4c53527d5e009bd5 100755
--- a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
+++ b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
@@ -12,6 +12,38 @@
       return swfobject.getObjectById("BigBlueButton");
     }
 
+     /**
+     * Get info if user is sharing webcam.
+     */  
+    BBB.amISharingWebcam = function(callback) {
+      var swfObj = getSwfObj();
+      if (swfObj) {
+        if (arguments.length == 0) {
+          swfObj.amISharingCameraRequestAsync();
+        } else {
+          if (typeof callback === 'function') {
+            callback(swfObj.amISharingCameraRequestSync());
+          }
+        }
+      }
+    }
+    
+    /**
+     * Get my user info.
+     */  
+    BBB.isUserSharingWebcam = function(userID, callback) {
+      var swfObj = getSwfObj();
+      if (swfObj) {
+        if (arguments.length == 1) {
+          swfObj.isUserPublishingCamRequestAsync(userID);
+        } else {
+          if (arguments.length == 2 && typeof callback === 'function') {
+            callback(swfObj.isUserPublishingCamRequestSync(userID));
+          }
+        }
+      }
+    }
+    
     BBB.switchPresenter = function(newPresenterUserID) {
       var swfObj = getSwfObj();
       if (swfObj) {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as
index 1f58411492c524c69d76bed18fa31be8da617031..0806631337d4c8df5168fe32777d51cc1d00f047 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as
@@ -41,5 +41,7 @@ package org.bigbluebutton.core
     public static const USER_LOCKED_VOICE:String          = 'UserLockedVoiceEvent';
     public static const START_PRIVATE_CHAT:String         = "StartPrivateChatEvent";
     public static const GET_MY_USER_INFO_REP:String       = "GetMyUserInfoResponse";
+    public static const IS_USER_PUBLISHING_CAM_RESP:String = "IsUserPublishingCamResponse";
+    
   }
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
index 69467363b0177e5d33645f4f34dbed7b2ab0406d..6e488fbeafb1d9ee8b7daf589e145b7ab0ab2498 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
@@ -33,7 +33,7 @@ package org.bigbluebutton.core
     
     public static function getWebcamStream(userID:String):String {
       var u:BBBUser = getUser(userID);
-      if (u != null) {
+      if (u != null && u.hasStream) {
         return u.streamName;
       }
       
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as b/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as
new file mode 100755
index 0000000000000000000000000000000000000000..f73dfd0902b32e27e0dcebd8c58dce5c2c74ee8a
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/events/IsUserPublishingCamRequest.as
@@ -0,0 +1,16 @@
+package org.bigbluebutton.core.events
+{
+  import flash.events.Event;
+  
+  public class IsUserPublishingCamRequest extends Event
+  {
+    public static const IS_USER_PUBLISHING_CAM_REQ:String = "is user publishing webcam request event";
+      
+    public var userID:String;
+    
+    public function IsUserPublishingCamRequest(bubbles:Boolean=true, cancelable:Boolean=false)
+    {
+      super(IS_USER_PUBLISHING_CAM_REQ, bubbles, cancelable);
+    }
+  }
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as
index 0afa3d1a73a038b1fe10161850c873736f6ab4fc..9365640bac50438dc80c83e1d365ff6dbab7dd4b 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/CameraSettingsVO.as
@@ -2,9 +2,9 @@ package org.bigbluebutton.core.vo
 {
   public class CameraSettingsVO
   {
-    public var camIndex:int;
-    public var camWidth:int;
-    public var camHeight:int;
+    public var camIndex:int = 0;
+    public var camWidth:int = 0;
+    public var camHeight:int = 0;
     public var isPublishing:Boolean = false;
     
   }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
index 8b599bf7102bfc4ff785302a00e4875f720da924..6e455965feb442eb9446a0586a2a57f7afa8e1ee 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
@@ -13,6 +13,7 @@ package org.bigbluebutton.main.api
   import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent;
   import org.bigbluebutton.core.events.CoreEvent;
   import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent;
+  import org.bigbluebutton.core.events.IsUserPublishingCamRequest;
   import org.bigbluebutton.core.managers.UserManager;
   import org.bigbluebutton.core.vo.CameraSettingsVO;
   import org.bigbluebutton.main.events.BBBEvent;
@@ -39,7 +40,9 @@ package org.bigbluebutton.main.api
         ExternalInterface.addCallback("getMyUserID", handleGetMyUserID);
         ExternalInterface.addCallback("getExternalMeetingID", handleGetExternalMeetingID);
         ExternalInterface.addCallback("joinVoiceRequest", handleJoinVoiceRequest);
-        ExternalInterface.addCallback("leaveVoiceRequest", handleLeaveVoiceRequest);        
+        ExternalInterface.addCallback("leaveVoiceRequest", handleLeaveVoiceRequest);   
+        ExternalInterface.addCallback("isUserPublishingCamRequestSync", handleIsUserPublishingCamRequestSync);
+        ExternalInterface.addCallback("isUserPublishingCamRequestAsync", handleIsUserPublishingCamRequestAsync);
         ExternalInterface.addCallback("getMyRoleRequestSync", handleGetMyRoleRequestSync);
         ExternalInterface.addCallback("getMyRoleRequestAsync", handleGetMyRoleRequestAsynch);
         ExternalInterface.addCallback("amIPresenterRequestSync", handleAmIPresenterRequestSync);
@@ -59,6 +62,31 @@ package org.bigbluebutton.main.api
       }
     }
 
+    private function handleIsUserPublishingCamRequestAsync(userID:String):void {
+      var event:IsUserPublishingCamRequest = new IsUserPublishingCamRequest();
+      event.userID = UsersUtil.externalUserIDToInternalUserID(userID);
+      if (event.userID != null) {
+        _dispatcher.dispatchEvent(event);
+      } else {
+        LogUtil.warn("Cannot find user with external userID [" + userID + "] to query is sharing webcam or not.");
+      }
+    }
+ 
+    private function handleIsUserPublishingCamRequestSync(userID:String):Object {
+      var obj:Object = new Object();
+      var isUserPublishing:Boolean = false;
+      
+      var streamName:String = UsersUtil.getWebcamStream(UsersUtil.externalUserIDToInternalUserID(userID));
+      if (streamName != null) {
+        isUserPublishing = true; 
+      }
+      
+      obj.isUserPublishing = isUserPublishing;
+      obj.streamName = streamName;
+      
+      return obj;
+    }
+    
     private function handleGetMyUserInfoAsynch():void {
       _dispatcher.dispatchEvent(new GetMyUserInfoRequestEvent());
     }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as
index 0e08ff857f0b9bf8a051579953b656af96bc2e77..134f7a28b2f8a6bdc8ae7eb97d9396199e19986c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as
@@ -10,6 +10,7 @@ package org.bigbluebutton.main.api
   import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent;
   import org.bigbluebutton.core.events.CoreEvent;
   import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent;
+  import org.bigbluebutton.core.events.IsUserPublishingCamRequest;
   import org.bigbluebutton.core.events.SwitchedLayoutEvent;
   import org.bigbluebutton.core.managers.UserManager;
   import org.bigbluebutton.core.vo.CameraSettingsVO;
@@ -26,6 +27,26 @@ package org.bigbluebutton.main.api
 
   public class ExternalApiCalls { 
     
+    public function handleIsUserPublishingCamRequest(event:IsUserPublishingCamRequest):void {
+      var payload:Object = new Object();
+      var isUserPublishing:Boolean = false;
+      
+      var streamName:String = UsersUtil.getWebcamStream(event.userID);
+      if (streamName != null) {
+        isUserPublishing = true; 
+      }
+      
+      payload.eventName = EventConstants.IS_USER_PUBLISHING_CAM_RESP;
+      payload.userID = UsersUtil.internalUserIDToExternalUserID(event.userID);
+      payload.isUserPublishing = isUserPublishing;
+      
+      var vidConf:VideoConfOptions = new VideoConfOptions();
+      payload.uri = vidConf.uri + "/" + UsersUtil.getInternalMeetingID();
+      
+      payload.streamName = streamName; 
+      broadcastEvent(payload);
+    }
+    
     public function handleGetMyUserInfoRequest(event:GetMyUserInfoRequestEvent):void {
       var payload:Object = new Object();
       payload.eventName = EventConstants.GET_MY_USER_INFO_REP;
@@ -85,6 +106,7 @@ package org.bigbluebutton.main.api
     
     public function handleAmISharingCamQueryEvent(event:AmISharingWebcamQueryEvent):void {
       var camSettings:CameraSettingsVO = UsersUtil.amIPublishing();
+      var vidConf:VideoConfOptions = new VideoConfOptions();
       
       var payload:Object = new Object();
       payload.eventName = EventConstants.AM_I_SHARING_CAM_RESP;
@@ -92,6 +114,10 @@ package org.bigbluebutton.main.api
       payload.camIndex = camSettings.camIndex;
       payload.camWidth = camSettings.camWidth;
       payload.camHeight = camSettings.camHeight;
+      payload.camKeyFrameInterval = vidConf.camKeyFrameInterval;
+      payload.camModeFps = vidConf.camModeFps;
+      payload.camQualityBandwidth = vidConf.camQualityBandwidth;
+      payload.camQualityPicture = vidConf.camQualityPicture;
       
       broadcastEvent(payload);        
     }
@@ -110,12 +136,12 @@ package org.bigbluebutton.main.api
       payload.eventName = EventConstants.SWITCHED_PRESENTER;
       payload.amIPresenter = event.amIPresenter;
       payload.role = event.amIPresenter ? Role.PRESENTER : Role.VIEWER;
-      payload.newPresenterUserID = event.newPresenterUserID;
+      payload.newPresenterUserID = UsersUtil.internalUserIDToExternalUserID(event.newPresenterUserID);
       broadcastEvent(payload);
       
       payload.eventName = EventConstants.NEW_ROLE;
       payload.amIPresenter = event.amIPresenter;
-      payload.newPresenterUserID = event.newPresenterUserID;
+      payload.newPresenterUserID = UsersUtil.internalUserIDToExternalUserID(event.newPresenterUserID);
       payload.role = event.amIPresenter ? Role.PRESENTER : Role.VIEWER;
       broadcastEvent(payload);      
     }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml
index a311230e4f39aa0c41f6a2c049260ab1b86e9c60..45f6a10e09f15719ae5af4735b8b00a0a8bcc164 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml
@@ -27,6 +27,7 @@
       import org.bigbluebutton.core.events.AmIPresenterQueryEvent;
       import org.bigbluebutton.core.events.AmISharingWebcamQueryEvent;
       import org.bigbluebutton.core.events.GetMyUserInfoRequestEvent;
+      import org.bigbluebutton.core.events.IsUserPublishingCamRequest;
       import org.bigbluebutton.core.events.SwitchedLayoutEvent;
       import org.bigbluebutton.main.api.ExternalApiCalls;
       import org.bigbluebutton.main.events.BBBEvent;
@@ -43,6 +44,10 @@
   -->
   
 
+  <EventHandlers type="{IsUserPublishingCamRequest.IS_USER_PUBLISHING_CAM_REQ}" >
+    <MethodInvoker generator="{ExternalApiCalls}" method="handleIsUserPublishingCamRequest" arguments="{event}"/>
+  </EventHandlers>
+  
   <EventHandlers type="{StreamStartedEvent.STREAM_STARTED}" >
     <MethodInvoker generator="{ExternalApiCalls}" method="handleStreamStartedEvent" arguments="{event}"/>
   </EventHandlers>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
index 67ea880461d859f0a5049b3224c910e193b8e02b..80686b50d06ed5da61de9b2d4787033170a5de7f 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
@@ -30,7 +30,7 @@ package org.bigbluebutton.main.model.users {
     public var internalMeetingID:String;
     public var avatarURL:String;
     
-    private var _myCamSettings:CameraSettingsVO;
+    private var _myCamSettings:CameraSettingsVO = new CameraSettingsVO();
     
 		[Bindable] private var me:BBBUser = null;		
 		[Bindable] public var users:ArrayCollection = null;