diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
index b5b3ab65e1c91300750ab194c5f4be04acb0a5a4..ced4ccc8d1da8414c814940fa6c0127a0e21b21f 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/LiveMeeting.scala
@@ -115,6 +115,12 @@ class LiveMeeting(val mProps: MeetingProperties,
 
   def handleEndMeeting(msg: EndMeeting) {
     meetingModel.meetingHasEnded
+
+    /**
+     * See if this meeting has breakout rooms. If so, we also need to end them.
+     */
+    handleEndAllBreakoutRooms(new EndAllBreakoutRooms(msg.meetingId))
+
     outGW.send(new MeetingEnded(msg.meetingId, mProps.recorded, mProps.voiceBridge))
     outGW.send(new DisconnectAllUsers(msg.meetingId))
   }
diff --git a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
index 90dab66a69a4664863ca8fd09bada0cf0448d180..8cb890fb09bd8a37ff4e3a31067398e199b2d1a2 100755
--- a/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
+++ b/bigbluebutton-client/resources/prod/lib/bbb_api_bridge.js
@@ -126,6 +126,21 @@
       }
     }
 
+    /**
+     * Query user's sessionToken.
+     *
+     * Params:
+     *    callback - function if you want a callback as response.
+     */
+    BBB.getSessionToken = function(callback) {
+      var swfObj = getSwfObj();
+      if (swfObj) {
+        if (typeof callback === 'function') {
+          callback(swfObj.getSessionToken());
+        }
+      }
+    }
+    
     /**
      * Eject a user.
      *
diff --git a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
old mode 100644
new mode 100755
index bb8c39250aee14acb4aa9bb9635e0460579694a2..5c97dc94fc27fbbca2ee10a11ebbc7feea22f900
--- a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
+++ b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
@@ -144,26 +144,29 @@ function createUA(username, server, callback, makeCallFunc) {
 
 	console.log("Fetching STUN/TURN server info for user agent");
 
-	$.ajax({
-		dataType: 'json',
-		url: '/bigbluebutton/api/stuns'
-	}).done(function(data) {
-		var stunsConfig = {};
-		stunsConfig['stunServers'] = ( data['stunServers'] ? data['stunServers'].map(function(data) {
-			return data['url'];
-		}) : [] );
-		stunsConfig['turnServers'] = ( data['turnServers'] ? data['turnServers'].map(function(data) {
-			return {
-				'urls': data['url'],
-				'username': data['username'],
-				'password': data['password']
-			};
-		}) : [] );
-		createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc);
-	}).fail(function(data, textStatus, errorThrown) {
-		BBBLog.error("Could not fetch stun/turn servers", {error: textStatus, user: callerIdName, voiceBridge: conferenceVoiceBridge});
-		callback({'status':'failed', 'errorcode': 1009});
-	});
+  BBB.getSessionToken(function(sessionToken) {
+  	$.ajax({
+  		dataType: 'json',
+  		url: '/bigbluebutton/api/stuns',
+  		data: {sessionToken:sessionToken}
+  	}).done(function(data) {
+  		var stunsConfig = {};
+  		stunsConfig['stunServers'] = ( data['stunServers'] ? data['stunServers'].map(function(data) {
+  			return data['url'];
+  		}) : [] );
+  		stunsConfig['turnServers'] = ( data['turnServers'] ? data['turnServers'].map(function(data) {
+  			return {
+  				'urls': data['url'],
+  				'username': data['username'],
+  				'password': data['password']
+  			};
+  		}) : [] );
+  		createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc);
+  	}).fail(function(data, textStatus, errorThrown) {
+  		BBBLog.error("Could not fetch stun/turn servers", {error: textStatus, user: callerIdName, voiceBridge: conferenceVoiceBridge});
+  		callback({'status':'failed', 'errorcode': 1009});
+  	});
+  });
 }
 
 function createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc) {
@@ -181,8 +184,8 @@ function createUAWithStuns(username, server, callback, stunsConfig, makeCallFunc
 		traceSip: true,
 		autostart: false,
 		userAgentString: "BigBlueButton",
-		//stunServers: stunsConfig['stunServers'],
-		//turnServers: stunsConfig['turnServers']
+		stunServers: stunsConfig['stunServers'],
+		turnServers: stunsConfig['turnServers']
 	};
 	
 	uaConnected = false;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as
index f04cfea57ece935b43d57da9f5039f27b2df93a6..0c9c0e7318f32162d4d5601dbf52155f2544f02c 100644
--- a/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/TimerUtil.as
@@ -17,23 +17,23 @@
  *
  */
 package org.bigbluebutton.core {
-	
+
 	import flash.events.TimerEvent;
 	import flash.utils.Dictionary;
 	import flash.utils.Timer;
 	import mx.controls.Label;
 	import org.bigbluebutton.util.i18n.ResourceUtil;
-	
+
 	public final class TimerUtil {
 		public static var timers:Dictionary = new Dictionary(true);
-		
-		public static function setCountDownTimer(label:Label, seconds:int, preLabel:String = ''):void {
+
+		public static function setCountDownTimer(label:Label, seconds:int):void {
 			var timer:Timer = getTimer(label.id, seconds);
 			if (!timer.hasEventListener(TimerEvent.TIMER)) {
 				timer.addEventListener(TimerEvent.TIMER, function():void {
 					var remainingSeconds:int = timer.repeatCount - timer.currentCount;
 					var formattedTime:String = (Math.floor(remainingSeconds / 60)) + ":" + (remainingSeconds % 60 >= 10 ? "" : "0") + (remainingSeconds % 60);
-					label.text = preLabel + ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTime', [formattedTime]);
+					label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTime', [formattedTime]);
 				});
 				timer.addEventListener(TimerEvent.TIMER_COMPLETE, function():void {
 					label.text = ResourceUtil.getInstance().getString('bbb.users.breakout.remainingTimeEnded');
@@ -44,7 +44,7 @@ package org.bigbluebutton.core {
 			}
 			timer.start();
 		}
-		
+
 		public static function getTimer(name:String, defaultRepeatCount:Number):Timer {
 			if (timers[name] == undefined) {
 				timers[name] = new Timer(1000, defaultRepeatCount);
@@ -52,7 +52,7 @@ package org.bigbluebutton.core {
 			Timer(timers[name]).repeatCount = defaultRepeatCount;
 			return timers[name];
 		}
-		
+
 		public static function stopTimer(name:String):void {
 			if (timers[name] != undefined) {
 				timers[name].stop();
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
index 629c03fdce21cb945d28fd5399444bae237f5a31..18e7c56d911850134ccc4f4cab4bcd1fe9e15b47 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCallbacks.as
@@ -21,7 +21,7 @@ package org.bigbluebutton.main.api
   import com.asfusion.mate.events.Dispatcher;
   
   import flash.external.ExternalInterface;
-  
+  import org.bigbluebutton.core.BBB;
   import org.as3commons.logging.api.ILogger;
   import org.as3commons.logging.api.getClassLogger;
   import org.bigbluebutton.core.EventConstants;
@@ -49,6 +49,7 @@ package org.bigbluebutton.main.api
   import org.bigbluebutton.modules.videoconf.events.ClosePublishWindowEvent;
   import org.bigbluebutton.modules.videoconf.events.ShareCameraRequestEvent;
   import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
+  import org.bigbluebutton.util.SessionTokenUtil;
 
   public class ExternalApiCallbacks {
 	private static const LOGGER:ILogger = getClassLogger(ExternalApiCallbacks);
@@ -104,6 +105,8 @@ package org.bigbluebutton.main.api
         ExternalInterface.addCallback("webRTCMediaSuccess", handleWebRTCMediaSuccess);
         ExternalInterface.addCallback("webRTCMediaFail", handleWebRTCMediaFail);
         ExternalInterface.addCallback("javaAppletLaunched", handleJavaAppletLaunched);
+        ExternalInterface.addCallback("getSessionToken", handleGetSessionToken);
+        
       }
       
       // Tell out JS counterpart that we are ready.
@@ -246,6 +249,11 @@ package org.bigbluebutton.main.api
       return UserManager.getInstance().getConference().internalMeetingID;
     }
     
+    private function handleGetSessionToken():String {
+      return BBB.getSessionTokenUtil().getSessionToken();
+    }
+    
+    
     private function handleSendLockLayoutRequest(lock:Boolean):void {
       if (lock) {
         var lockEvent:CoreEvent = new CoreEvent(EventConstants.LOCK_LAYOUT_REQ);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
index 56eb5aca301c2b52c22d38197d4894d3baacede7..4c852f1d004d65c97af7c18290be0804a75ce207 100644
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/BreakoutRoomSettings.mxml
@@ -138,27 +138,27 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 					 id="textArea" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"
 					 styleName="breakoutRoomSettingTitleStyle"/>
 		
+		<mx:Canvas width="100%" styleName="breakoutTipBox" backgroundColor="0xcccccc">
+			<mx:Text horizontalCenter="0" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.dragAndDropToolTip')}"/>
+		</mx:Canvas>
+		
 		<mx:HBox id="roomsBox" paddingTop="20" width="100%">
-			<mx:HBox width="50%" horizontalAlign="left">
+			<mx:HBox width="50%" height="100%" horizontalAlign="left" verticalAlign="middle">
 				<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.rooms')}" />
 				<mx:ComboBox id="roomsCombo" width="80%" change="{assignUsers()}" dataProvider="{roomsProvider}"/>				
 			</mx:HBox>
-			<mx:HBox width="50%" horizontalAlign="center">
-				<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" />
-				<mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/>
-				<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/>
-			</mx:HBox>
+			<mx:Button paddingLeft="20" width="50%" id="randomAssignBtn"
+					   label="{ResourceUtil.getInstance().getString('bbb.users.breakout.randomAssign')}" click="assignUsers()"/>
+		</mx:HBox>
+		
+		<mx:HBox width="100%" paddingTop="12">
+			<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" />
+			<mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/>
+			<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/>
 		</mx:HBox>
 		
 		<mx:Tile id="roomsContainer" styleName="roomsContainer" width="100%" height="100%"/>
 			
-		<mx:VBox width="100%" horizontalAlign="center" verticalGap="12">
-			<mx:Button paddingLeft="20" id="randomAssignBtn" label="{ResourceUtil.getInstance().getString('bbb.users.breakout.randomAssign')}" click="assignUsers()"/>
-			<mx:Canvas width="100%" styleName="breakoutTipBox" backgroundColor="0xcccccc">
-				<mx:Text horizontalCenter="0" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.dragAndDropToolTip')}"/>
-			</mx:Canvas>
-		</mx:VBox>
-		
 		<mx:HBox width="100%" horizontalAlign="right" verticalGap="15">
 			<mx:Button id="startButton" label="{ResourceUtil.getInstance().getString('bbb.users.breakout.start')}" click="onStartClicked()"/>
 			<mx:Button label="{ResourceUtil.getInstance().getString('bbb.users.breakout.close')}" click="onCloseClicked()"/>
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 0d2e3fbdbdcf1d96b12078a44446498ca701a5c4..0ab1c7c7743877807d1d5420afa2dd2c45c770b7 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml
@@ -312,7 +312,7 @@
 			}
 			
 			private function handleRemainingTimeUpdate(event:BreakoutRoomEvent):void {
-				TimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes, ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms'));
+				TimerUtil.setCountDownTimer(breakoutTimeLabel, event.durationInMinutes);
 			}
 
 			private function breakoutRoomsListChangeListener(event:CollectionEvent):void {
@@ -585,8 +585,11 @@
 	<mx:VBox id="roomsBox" styleName="breakoutRoomsBox"
 			 visible="{breakoutRoomsList.length > 0 &amp;&amp; amIModerator}"
 			 includeInLayout="{breakoutRoomsList.length > 0 &amp;&amp; amIModerator}"
-			 width="100%" height="50%">
-		<mx:Label id="breakoutTimeLabel" text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"/>
+			 width="100%" height="180">
+		<mx:HBox width="100%">
+			<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"/>
+			<mx:Label width="100%" textAlign="right" id="breakoutTimeLabel"/>
+		</mx:HBox>
 
 		<mx:DataGrid id="roomsGrid" editable="false" sortableColumns="false" dataProvider="{breakoutRoomsList}"
 					 dragEnabled="false" width="100%" height="100%" draggableColumns="false">