diff --git a/bigbluebutton-client/.gitignore b/bigbluebutton-client/.gitignore
index 331d2ccc0d8034039b7e698e32fbb43e90c58d68..5a3aee9615f41b757515f863a2d3fb93b31ad7f5 100755
--- a/bigbluebutton-client/.gitignore
+++ b/bigbluebutton-client/.gitignore
@@ -2,7 +2,7 @@
 .actionScriptProperties
 .flexProperties
 linker-report.xml
-bin
+bundles.txt
 client
 bbbResources.properties.*
 asdoc/
diff --git a/bigbluebutton-client/bin/.gitignore b/bigbluebutton-client/bin/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f2c4ee513a971d1e1670eea8946649cc2b24fdd5
--- /dev/null
+++ b/bigbluebutton-client/bin/.gitignore
@@ -0,0 +1 @@
+*.*
diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml
old mode 100644
new mode 100755
index 3927e5cc82743e06d90b646514c5729de11029cf..22de0c69a68871315fee9c0208b7c37fc598d7a1
--- a/bigbluebutton-client/build.xml
+++ b/bigbluebutton-client/build.xml
@@ -29,22 +29,129 @@
 	<property name="BREAKOUT" value="BreakoutModule" />
 	<property name="CLASSROOM_AUDIO" value="ClassroomAudioModule" />
 	<property name="SETTINGS" value="SettingsModule" />
+	<property name="VIDEO_DOCK" value="VideodockModule" />
+	
+	<xmlproperty file="${SRC_DIR}/conf/locales.xml" collapseAttributes="true"/>
+	
 	<target name="init-ant-contrib">
 		<property name="ant-contrib.jar" location="${BASE_DIR}/build/lib/ant-contrib-0.6.jar"/>
 		<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${ant-contrib.jar}"/>
 	</target>
-	
+	  
+	<target name="locales" depends="init-ant-contrib">
+		<echo message="Checking if locale output dir exists"/>
+		<available file="${OUTPUT_DIR}/locale" type="file" property="locale.dir.present"/>
+		<if> 
+        	<equals arg1="${locale.dir.present}" arg2="true"/> 
+           	<then> 
+				<echo message="Locale output dir exists. Deleting contents of ${OUTPUT_DIR}/locale"/> 
+				<delete>
+					<fileset dir="${OUTPUT_DIR}/locale">
+						<include name="**/*"/>
+					</fileset>
+				</delete>
+           	</then> 
+           	<else> 
+				<echo message="Locale output dir does not exists. Creating ${OUTPUT_DIR}/locale"/> 
+				<mkdir dir="${OUTPUT_DIR}/locale"/>
+           	</else> 
+        </if>
+
+		<echo message="Determining supported locales."/>
+		<foreach target="build-locale" param="supportedlocale">
+			<path id="locales.path.ref">
+		    	<dirset dir="${BASE_DIR}/locale"/>
+		  	</path>
+		</foreach>
+	</target>
+		
 	<target name="branding" depends="init-ant-contrib">
 		<sequential>
-			<mxmlc file="${SRC_DIR}/branding/css/${themeFile}" output="${OUTPUT_DIR}/branding/css/${themeFile}.swf" debug="false" mxml.compatibility-version="3.0.0" swf-version="13" optimize="true">
+			<mxmlc file="${SRC_DIR}/branding/css/${themeFile}" 
+				output="${OUTPUT_DIR}/branding/css/${themeFile}.swf" 
+				debug="false" 
+				mxml.compatibility-version="3.0.0" 
+				swf-version="13" 
+				optimize="true">
 			</mxmlc>
 		</sequential>
 	</target>
 		
 	<target name="build-bbb-main-test" description="Compile BigBlueButton Main Test">
-                <build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" />
+    	<build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" />
 	</target>
 
+	<target name="build-locale">
+		<echo message="Locale dir is ${supportedlocale}. Extract locale name." />
+	   	<basename property="locale.name" file="${supportedlocale}"/>  
+   		<echo message="Locale name is ${locale.name}"/>
+
+		<sequential>
+			<echo message="Building ${locale.name}"/>
+			<available file="${LOCALE_DIR}/${locale.name}" type="dir" property="locale.dir.present"/>
+			<if>
+                <equals arg1="${locale.name}" arg2="locale"/>
+                <then>
+                	<echo message="Somehow, the dirset for locales is passing the parent (${locale.name}) dir."/>
+                	<echo message="We don't want it, so we need to skip it."/> 
+                </then>
+              	<else>		
+					<if> 
+		           		<equals arg1="${locale.dir.present}" arg2="true"/> 
+		           		<then> 
+		           			<echo message="We already have a copy of the framework locale. No need to copy ${LOCALE_DIR}/${locale.name}"/>
+		           		</then> 
+		           		<else> 	
+		           			<echo message="No copy of the framework locale. Copying ${LOCALE_DIR}/${locale.name}"/>       
+		              		<exec  vmlauncher="true" executable="copylocale">
+								<arg value="en_US"/>
+		    					<arg value="${locale.name}"/>
+							</exec>	
+			  			</else>
+					</if>	
+					<echo message="Compiling locale ${locale.name}"/>
+					<compileLocale locale="${locale.name}" />  
+           		</else> 
+        	</if>       	   
+       </sequential>
+	</target>
+		
+	<macrodef name="compileLocale" description="Compiles the Resource package for the given locale">
+		<attribute name="locale" default="en_US"/>
+		<sequential>
+			<echo message="Start building @{locale}"/>
+			<echo message="**********************************************"/>
+			<echo message="*    Did you check bundles.txt  and made     *"/>
+			<echo message="*    all resources listed here?              *"/>
+			<echo message="**********************************************"/>			
+			<!-- Invoke MXMLC -->
+			<mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf">
+				<locale>@{locale}</locale>
+				<target-player>10.3.0</target-player>
+				<source-path path-element="locale/{locale}"/>
+				
+				<!--
+				  Look into bundles.txt to find out what resources to include here.
+				  http://forums.adobe.com/thread/758619
+				  ralam - sept 20, 2011
+				-->
+				<include-resource-bundles>bbbResources</include-resource-bundles>
+				<include-resource-bundles>collections</include-resource-bundles> 
+				<include-resource-bundles>containers</include-resource-bundles> 
+				<include-resource-bundles>controls</include-resource-bundles> 
+				<include-resource-bundles>core</include-resource-bundles> 
+				<include-resource-bundles>effects</include-resource-bundles> 
+				<include-resource-bundles>logging</include-resource-bundles> 
+				<include-resource-bundles>messaging</include-resource-bundles> 
+				<include-resource-bundles>modules</include-resource-bundles> 
+				<include-resource-bundles>rpc</include-resource-bundles> 
+				<include-resource-bundles>skins</include-resource-bundles> 
+				<include-resource-bundles>styles</include-resource-bundles>
+				<source-path path-element="${FLEX_HOME}/frameworks"/>
+			</mxmlc>
+		</sequential>
+	</macrodef>
+	
 	<target name="build-bbb-main" description="Compile BigBlueButton Main">
 		<build-main src="${SRC_DIR}" target="${BBB_MAIN}" />
 		
@@ -110,7 +217,11 @@
 	<target name="build-video" description="Compile Video Module">
 		<build-module src="${SRC_DIR}" target="${VIDEO}" />
 	</target>
-	
+
+	<target name="build-videodock" description="Compile Video Dock Module">
+		<build-module src="${SRC_DIR}" target="${VIDEO_DOCK}" />
+	</target>
+		
 	<target name="build-whiteboard" description="Compile Whiteboard Module">
 		<build-module src="${SRC_DIR}" target="${WHITEBOARD}" />
 	</target>
@@ -127,7 +238,7 @@
 	
 	<!-- just a grouping of modules to compile -->
 	<target name="build-deskshare-phone-video-whiteboard-dyn" 
-			depends="build-deskshare, build-phone, build-video, build-whiteboard, build-dyn, build-classroom-audio, build-settings"
+			depends="build-deskshare, build-phone, build-video, build-videodock, build-whiteboard, build-dyn, build-classroom-audio, build-settings"
 			description="Compile deskshare, phone, video, whiteboard, dynamic info modules">
 	</target>
 	
@@ -141,6 +252,14 @@
 					<target-player>10.3.0</target-player>
 					<load-config filename="@{flex}/frameworks/flex-config.xml" />
 					<source-path path-element="@{flex}/frameworks" />
+					
+					<!--
+				  		Dump out resources to find out what resources to include building the locales.
+				  		http://forums.adobe.com/thread/758619
+				  		ralam - sept 20, 2011
+					-->
+					<resource-bundle-list>bundles.txt</resource-bundle-list>
+					
 					<compiler.library-path dir="@{flex}/frameworks" append="true">
 						<include name="libs" />
 						<include name="../bundles/{locale}" />
@@ -153,6 +272,11 @@
 
 					<default-size width="500" height="600" />
 				</mxmlc>
+				<echo message="**********************************************"/>
+				<echo message="*    Generated bundles.txt                   *"/>
+				<echo message="* Make sure you include all resources listed *"/>
+				<echo message="* in the file when building the locales.     *"/>
+				<echo message="**********************************************"/>
 			</sequential>
 		</macrodef>
 	
@@ -220,10 +344,10 @@
 			<fileset dir="${PROD_RESOURCES_DIR}/assets/" />
 		</copy>	
 		<copy todir="${OUTPUT_DIR}/swfobject/" >
-			<fileset dir="${BASE_DIR}/src/swfobject/" />
+			<fileset dir="${PROD_RESOURCES_DIR}/swfobject" />
 		</copy>	
-		<copy todir="${OUTPUT_DIR}/locale" >
-			<fileset dir="${BASE_DIR}/locale/" />
+		<copy todir="${OUTPUT_DIR}/lib/" >
+			<fileset dir="${PROD_RESOURCES_DIR}/lib"/>
 		</copy>	
 		<copy file="${PROD_RESOURCES_DIR}/BigBlueButtonTest.html" todir="${OUTPUT_DIR}" overwrite="true"/>
 		<copy file="${PROD_RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/>
@@ -231,12 +355,6 @@
 		<copy file="${PROD_RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/>		
 		<copy file="${PROD_RESOURCES_DIR}/locales.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>		
 		<copy file="${PROD_RESOURCES_DIR}/example-info-data.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/>
-		<copy file="${PROD_RESOURCES_DIR}/jquery-1.5.1.min.js" todir="${OUTPUT_DIR}" overwrite="true" />
-		<copy file="${PROD_RESOURCES_DIR}/bigbluebutton.js" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="${PROD_RESOURCES_DIR}/deployJava.js" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="${PROD_RESOURCES_DIR}/bbb_blinker.js" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="${PROD_RESOURCES_DIR}/bbb_deskshare.js" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="${PROD_RESOURCES_DIR}/bbb_localization.js" todir="${OUTPUT_DIR}" overwrite="true"/>
 		<if>
            	   <equals arg1="${BUILD_ENV}" arg2="DEV"/>
            	      <then>
@@ -301,8 +419,16 @@
 	</target>
 
 	<target name="clean">
-		<delete dir="${OUTPUT_DIR}" />
-		<mkdir dir="${OUTPUT_DIR}"/>
+		<delete>
+			<fileset dir="${OUTPUT_DIR}" >
+		  		<exclude name="locale/*.swf"/>
+		  		<exclude name=".gitignore"/>
+			</fileset>
+			<dirset dir="${OUTPUT_DIR}">
+		  		<include name="**/*"/>
+		  		<exclude name="locale"/>
+			</dirset>
+  		</delete>
 	</target>
 
 	<!-- NOTE: compile-deskshare-standalone MUST come first before compile-bbb as we need the deskshare-standalone
diff --git a/bigbluebutton-client/config/bigbluebutton.nginx b/bigbluebutton-client/config/bigbluebutton.nginx
index f169df0ed181e6e91acb7a8e36fc2f2f03cdefee..21145ace3a62c329bbffdc7a63ced657e260be1a 100644
--- a/bigbluebutton-client/config/bigbluebutton.nginx
+++ b/bigbluebutton-client/config/bigbluebutton.nginx
@@ -7,7 +7,7 @@ server {
 	 # Handle RTMPT (RTMP Tunneling).  Forwards requests
 	 # to Red5 on port 8088.
       location ~ (/open/|/close/|/idle/|/send/) {
-          proxy_pass         http://127.0.0.1:8088;
+          proxy_pass         http://127.0.0.1:5080;
           proxy_redirect     off;
           proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
 
diff --git a/bigbluebutton-client/locale/bg_BG/bbbResources.properties b/bigbluebutton-client/locale/bg_BG/bbbResources.properties
index edf99daab426364dbcc2360736e6cbeea33292ef..2cf803939f591727076418442f5079d0abe7cd41 100755
--- a/bigbluebutton-client/locale/bg_BG/bbbResources.properties
+++ b/bigbluebutton-client/locale/bg_BG/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = заредено.
 bbb.mainshell.logBtn.toolTip = Отвори Дневник Прозорецът
 bbb.desktopPublish.stop.tooltip = Затвори екрана за споделяне
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Микрофон
 bbb.settings.voice.volume = Микрофон
 bbb.logout.unknown = Вашият клиент е загубил връзка със сървъра
 bbb.presentation.slideNumLbl.toolTip = Кликнете, за да изберете слайда
diff --git a/bigbluebutton-client/locale/bn_BN/bbbResources.properties b/bigbluebutton-client/locale/bn_BN/bbbResources.properties
index f8193710c0d8a940f620479f509f07a0fb27d9ff..4abc0ff56bc4512fdf630ba636a2fa15841748a6 100755
--- a/bigbluebutton-client/locale/bn_BN/bbbResources.properties
+++ b/bigbluebutton-client/locale/bn_BN/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = আপলোড হয়েছে।
 bbb.mainshell.logBtn.toolTip = লগ উইন্ডোটি খুলুন
 bbb.desktopPublish.stop.tooltip = স্ক্রীন শেয়ার বন্ধ করুন
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = মাইক্রোফোন সক্রিয়তা
 bbb.settings.voice.volume = মাইক্রোফোন সক্রিয়তা
 bbb.logout.unknown = আপনার গ্রাহক সার্ভারের সঙ্গে সংযোগ হারিয়েছে
 bbb.presentation.slideNumLbl.toolTip = স্লাইড নির্বাচন করতে ক্লিক করুন
diff --git a/bigbluebutton-client/locale/da_DK/bbbResources.properties b/bigbluebutton-client/locale/da_DK/bbbResources.properties
index 98f7d574e363835e55a535c450c5afab025f665a..ed7080619712d465deaa96e1d75fc18c1ae0416e 100755
--- a/bigbluebutton-client/locale/da_DK/bbbResources.properties
+++ b/bigbluebutton-client/locale/da_DK/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = uploaded.
 bbb.mainshell.logBtn.toolTip = Ã…bn log-vinduet
 bbb.desktopPublish.stop.tooltip = Luk skærmdeling
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Mikrofonaktivitet
 bbb.settings.voice.volume = Mikrofonaktivitet
 bbb.logout.unknown = Din klient mistede forbindelsen til serveren
 bbb.presentation.slideNumLbl.toolTip = Klik for at vælge en slide
diff --git a/bigbluebutton-client/locale/de_DE/bbbResources.properties b/bigbluebutton-client/locale/de_DE/bbbResources.properties
index 79d98c7a6b634c6baad106227abe179623baa443..758654219c85947c34b1f5f5378ea9dccb7a19c2 100755
--- a/bigbluebutton-client/locale/de_DE/bbbResources.properties
+++ b/bigbluebutton-client/locale/de_DE/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = hochgeladen.
 bbb.mainshell.logBtn.toolTip = Öffne Protokoll Fenster
 bbb.desktopPublish.stop.tooltip = Screen share schliessen
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Mikrophon Aktivität
 bbb.settings.voice.volume = Mikrophon Aktivität
 bbb.logout.unknown = Die Verbindung zwisch Ihrem Client und dem Server wurde abgebrochen
 bbb.presentation.slideNumLbl.toolTip = Klicken um eine Folie auszuwählen
diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties
index 8eb0d3f841af9335b05129f122bc30c141f37861..4b527d5c5d7c46dc9e2576522fd4cb35379e07a4 100755
--- a/bigbluebutton-client/locale/en_US/bbbResources.properties
+++ b/bigbluebutton-client/locale/en_US/bbbResources.properties
@@ -122,6 +122,9 @@ bbb.publishVideo.title = Share your webcam
 bbb.publishVideo.startPublishBtn.toolTip = Start Sharing
 bbb.video.publish.close.tooltip = Stop sharing your video
 bbb.video.publish.close.label = Close
+bbb.video.keepAspectBtn.tooltip = Keep window aspect
+bbb.video.fitVideoBtn.tooltip = Fit video
+bbb.video.originalSizeBtn.tooltip = Original size
 
 # Desktop Sharing
 bbb.desktopPublish.title = Desktop Sharing: Presenter's Preview
@@ -183,3 +186,5 @@ bbb.settings.warning.label = Warning
 bbb.settings.warning.close = Close this Warning
 bbb.settings.noissues = No outstanding issues have been detected.
 bbb.settings.instructions = Accept the Flash prompt that asks you for camera permissions. If you can see yourself and  hear yourself, your browser has been set up correctly. Other potentials issues are shown bellow. Click on each to find a possible solution.
+
+bbb.videodock.title = Video dock
\ No newline at end of file
diff --git a/bigbluebutton-client/locale/es_ES/bbbResources.properties b/bigbluebutton-client/locale/es_ES/bbbResources.properties
index 0976455e028d6621f616e86eb9a41699b12730a1..072ba2ce162b824b084d776d9f081a9fcd866d0f 100755
--- a/bigbluebutton-client/locale/es_ES/bbbResources.properties
+++ b/bigbluebutton-client/locale/es_ES/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = cargado.
 bbb.mainshell.logBtn.toolTip = Abrir ventana de histórico
 bbb.desktopPublish.stop.tooltip = Detener la compartición de pantalla
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Actividad del micrófono
 bbb.settings.voice.volume = Actividad del micrófono
 bbb.logout.unknown = Se ha perdido la conexión con el servidor
 bbb.presentation.slideNumLbl.toolTip = Pulsa para selecionar una página
diff --git a/bigbluebutton-client/locale/es_LA/bbbResources.properties b/bigbluebutton-client/locale/es_LA/bbbResources.properties
index 6ddea207a4df0ca5a6554b4cdf0a89560fcff8dc..23ba6b9fac99cce4fe1301408e0dbe67450cd71e 100755
--- a/bigbluebutton-client/locale/es_LA/bbbResources.properties
+++ b/bigbluebutton-client/locale/es_LA/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = cargado.
 bbb.mainshell.logBtn.toolTip = Abrir la ventana de Registro (Log)
 bbb.desktopPublish.stop.tooltip = Cerrar ventana compartida
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Actividad del Micrófono
 bbb.settings.voice.volume = Actividad del Micrófono
 bbb.logout.unknown = Su cliente ha perdido conexión con el servidor
 bbb.presentation.slideNumLbl.toolTip = Clic para seleccionar una diapositiva
diff --git a/bigbluebutton-client/locale/eu_EU/bbbResources.properties b/bigbluebutton-client/locale/eu_EU/bbbResources.properties
index bac19694c52f5877e2ed3a22ef33f16a92029259..b0ebf731b825c09aa38e7dcc1b380ec2a2519e34 100644
--- a/bigbluebutton-client/locale/eu_EU/bbbResources.properties
+++ b/bigbluebutton-client/locale/eu_EU/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = igota.
 bbb.mainshell.logBtn.toolTip = Zabaldu agerraldien leihoa
 bbb.desktopPublish.stop.tooltip = Itxi pantailaren partekatzea
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Mikrofonoaren jarduera
 bbb.settings.voice.volume = Mikrofonoaren jarduera
 bbb.logout.unknown = Zure berezioak galdu du zerbitzari honekiko konexioa
 bbb.presentation.slideNumLbl.toolTip = Sakatu diapositiba bat aukeratzeko
diff --git a/bigbluebutton-client/locale/fa_IR/bbbResources.properties b/bigbluebutton-client/locale/fa_IR/bbbResources.properties
index 49c71d8752320839ccdbdd925fd9105d2a0c8039..c79004a9f3346514c5350b828f9c1023ac9a2338 100755
--- a/bigbluebutton-client/locale/fa_IR/bbbResources.properties
+++ b/bigbluebutton-client/locale/fa_IR/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = بارگزاري شد.
 bbb.mainshell.logBtn.toolTip = مشاهده ی پنجره ی ثبت وقایع
 bbb.desktopPublish.stop.tooltip = بستن پنجره اشتراک صفحه
 bbb.presentation.uploadwindow.excel = اکسل
-bbb.micSettings.micActivity = فعالیت میکروفن
 bbb.settings.voice.volume = فعالیت میکروفن
 bbb.logout.unknown = اتصال کلاینت شما از سرور قطع شده است
 bbb.presentation.slideNumLbl.toolTip = جهت انتخاب یک اسلاید خاص کليک کنيد
diff --git a/bigbluebutton-client/locale/fr_FR/bbbResources.properties b/bigbluebutton-client/locale/fr_FR/bbbResources.properties
index 91c1e358b69f2622b5d3b1689860c2bbf5739a40..be1f4de64476546a6e7ab1a226b0e018c4253629 100755
--- a/bigbluebutton-client/locale/fr_FR/bbbResources.properties
+++ b/bigbluebutton-client/locale/fr_FR/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = envoyé.
 bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log
 bbb.desktopPublish.stop.tooltip = Fermer le partage d'écran
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Activité du microphone
 bbb.settings.voice.volume = Activité du microphone
 bbb.logout.unknown = Votre client a perdu la connexion avec le serveur
 bbb.presentation.slideNumLbl.toolTip = Cliquez pour sélectionner une page
diff --git a/bigbluebutton-client/locale/id_ID/bbbResources.properties b/bigbluebutton-client/locale/id_ID/bbbResources.properties
index f4de9388aeae2279712feecae810054b995c395e..ded2d2eddf4ba20cff8da15a3f16543431a8970f 100644
--- a/bigbluebutton-client/locale/id_ID/bbbResources.properties
+++ b/bigbluebutton-client/locale/id_ID/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = Telah terunggah
 bbb.mainshell.logBtn.toolTip = Buka Jendela Log
 bbb.desktopPublish.stop.tooltip = Tutup layar berbagi
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Aktifitas Mikrofon
 bbb.settings.voice.volume = Aktifitas Mikrofon
 bbb.logout.unknown = Klien anda telah kehilangan hubungan ke server.
 bbb.presentation.slideNumLbl.toolTip = Klik untuk pilih slide
diff --git a/bigbluebutton-client/locale/it_IT/bbbResources.properties b/bigbluebutton-client/locale/it_IT/bbbResources.properties
index d5f92e265be7ae0cfb996773d95fc68a2e3245df..89391ee7fd386519bc160dbf42ee8c71440e6533 100755
--- a/bigbluebutton-client/locale/it_IT/bbbResources.properties
+++ b/bigbluebutton-client/locale/it_IT/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = Caricato.
 bbb.mainshell.logBtn.toolTip = Apri finestra Log
 bbb.desktopPublish.stop.tooltip = Chiudi la condivisione dello schermo
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Attività del microfono
 bbb.settings.voice.volume = Attività del microfono
 bbb.logout.unknown = Hai perso la connessione con il server
 bbb.presentation.slideNumLbl.toolTip = Clicca per selezionare una diapositiva
diff --git a/bigbluebutton-client/locale/mn_MN/bbbResources.properties b/bigbluebutton-client/locale/mn_MN/bbbResources.properties
index bc3bafe79e86fe68e23661cb5f9576b09f79c831..5c7621018b1801db95427af5f4e9c74661a16710 100644
--- a/bigbluebutton-client/locale/mn_MN/bbbResources.properties
+++ b/bigbluebutton-client/locale/mn_MN/bbbResources.properties
@@ -2,16 +2,16 @@ bbb.logout.usercommand = Та конференсээс гарлаа
 bbb.settings.flash.command = Шинэ Флаш суулгах
 bbb.oldlocalewindow.reminder2 = хөтөчийнхөө каш - ийг цэвэрлэнэ үү
 bbb.presentation.maxUploadFileExceededAlert = Алдаа: Файлын хэмжээ хэтэрсэн байна
-bbb.logout.invalidapp = Улаан5 програм байхгүй байна
+bbb.logout.invalidapp = Ред5 про байхгүй байна
 bbb.fileupload.title = Танилцуулга илгээх
 bbb.chat.publicMsgAwaiting2 = Нийтийн захидал хүлээж байна
 bbb.viewers.viewersGrid.roleItemRenderer = Үүрэг
 bbb.oldlocalewindow.windowTitle = Анхааруулга: Хуучирсан толь байна
 bbb.presentation.converted = {1} -с {0} хуудсыг хөрвүүллээ
 bbb.viewers.presentBtn.toolTip = Вебд оролцогчийг танилцуулагч болгох
-bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Эд дараад харах.
+bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Харах
 bbb.highlighter.toolbar.undo = Хэлбэрт буцаах
-bbb.desktopPublish.minimizeBtn.toolTip = Энэ цонхийг доош оруулах
+bbb.desktopPublish.minimizeBtn.toolTip = Цонхыг нуух
 bbb.viewers.presentBtn.label = Танилцуулагчыг солих
 bbb.viewers.kickUserBtn.toolTip = Хэрэглэгчийг хөөх
 bbb.listeners.ejectTooltip = Хэрэглэгчийг хөөх
@@ -23,11 +23,11 @@ bbb.desktopPublish.region.tooltip = Өөрийнхөө дэлгэцийн тал
 bbb.presentation.error.convert.swf = Илгээсэн файлыг хөрвүүлэх явцад алдаа гарлаа. Энэ програмыг хариуцсан систем админтай холбогдоно уу.
 bbb.fileupload.progBarLbl = Явц
 bbb.presentation.error.security = Нууцлалын алдаа: Системийн админд хандана уу
-bbb.desktopPublish.maximizeRestoreBtn.toolTip = Та энэ цонхийг томруулж чадахгүй
-bbb.listenerItem.nameLbl.toolTip = Энэ хэрэглэгчийг сонгоод, дуугуй болгох
-bbb.desktopPublish.region.label = Бүс нутаг
+bbb.desktopPublish.maximizeRestoreBtn.toolTip = Цонх томрох боломжгүй
+bbb.listenerItem.nameLbl.toolTip = Хэрэглэгчийн дууг хаах, нээх
+bbb.desktopPublish.region.label = Хэсэгчилэн үзүүлэх
 bbb.chat.cmpColorPicker.toolTip = Бичгийн өнгө
-bbb.listenerItem.muteUnmute.toolTip = Энэ хэрэглэгчийг дуугуй болгох, дуутай болгох
+bbb.listenerItem.muteUnmute.toolTip = Хэрэглэгчийн дууг Хаах, Нээх
 bbb.chat.chatOptions = Чат тохиргоо
 bbb.presentation.uploadwindow.closeLabel = Ок товчлуурыг дараад энэ цонхыг нуух
 bbb.viewers.title = Хэрэглэгчид {0} {1}
@@ -38,7 +38,7 @@ bbb.fileupload.showBtn = Дүрслэх
 bbb.fileupload.fileLbl = Файл:
 bbb.listenerItem.talkImg.toolTip = Ярьж байна
 bbb.settings.warning.label = Анхаар
-bbb.mainshell.copyrightLabel2 = (c), BigBlueButton буйлд {0} - Илүү ихийг http://www.bigbluebutton.org/ сайтаас харна уу.
+bbb.mainshell.copyrightLabel2 = ТомЦэнхэрТовчлуур Хувилбар {0} - Илүү ихийг сургуулийн сайтнаас олж авна уу
 bbb.presentation.uploadwindow.powerpoint = POWERPOINT
 bbb.toolbar.video.toolTip = Миний камерийг түгээ
 bbb.chat.publicMsgAwaiting = Нийтийн захидал хүлээж байна
@@ -71,9 +71,8 @@ bbb.mainshell.locale.version = 0.71
 bbb.chat.title = Чат
 bbb.presentation.uploaded = Илгээгдсэн
 bbb.mainshell.logBtn.toolTip = Лог цонхийг нээх
-bbb.desktopPublish.stop.tooltip = Хуваасан дэлгэцээ хаах
+bbb.desktopPublish.stop.tooltip = Хаах
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Микрофонийн идэвхи
 bbb.settings.voice.volume = Микрофонийн идэвхи
 bbb.logout.unknown = Та серверээс холбоо тасарлаа
 bbb.presentation.slideNumLbl.toolTip = Энд дараад хуудас солих
@@ -81,10 +80,10 @@ bbb.settings.flash.text = Таньд флаш {0} суусан байна, гэ
 bbb.highlighter.toolbar.rectangle = Тэгш өнцөгт
 bbb.settings.voice.adjust = Дууг тохируулах
 bbb.presentation.uploadwindow.word = WORD
-bbb.mainshell.statusProgress.loading = Модулийг {0} уншиж байна
+bbb.mainshell.statusProgress.loading = Нийт {0} Модуль байна
 bbb.presentation.error.io = Оролт гаралтийн алдаа: систем админд хандана уу.
 bbb.chat.sendBtn.toolTip = Захидал илгээх
-bbb.highlighter.button.toolTipHide = Цагаан самбарыг нуух
+bbb.highlighter.button.toolTipHide = Самбарыг нуух
 bbb.settings.java.command = Шинэ Жава суулгах
 bbb.mainToolbar.logoutBtn = Гарах
 bbb.chat.privateMsgAwaiting2 = Хувийн захидал хүлээж байна
@@ -99,7 +98,7 @@ bbb.publishVideo.startPublishBtn.toolTip = Хуваалтыг эхлүүлэх
 bbb.logout.connectionfailed = Сервер луу холбогдож чадсангүй
 bbb.settings.isight.text = Таны iSight камерт ямар нэгэн проблем байгаа бол, Энэ нь магадгүй та OS X 10.6.5 үйлдлийн систем дээр ажиллаж байна. Энэ алдааг сийрүүлэхийн тулд та энд линкэн дээр дараад шинэ адобе флаш плэур татаж авна уу.
 bbb.highlighter.toolbar.clear = Хуудасыг цэвэрлэх
-bbb.toolbar.phone.toolTip = Миний микрофонийг бусдад тараах
+bbb.toolbar.phone.toolTip = Миний микрофоныг түгээ
 bbb.chat.privateChatSelect = Хувийн талаар чатлах хүнээ сонгоно уу
 bbb.micSettings.cancel = Болих
 bbb.fileupload.okCancelBtn = Болих
@@ -109,7 +108,7 @@ bbb.logout.asyncerror = Дуу дүрсийг дамжуулах үед алда
 bbb.presentation.presenterNameLbl = {0} хүн танилцуулга хийж байна
 bbb.chat.privateMsgAwaiting = Хувийн захидал ирсэн байна
 bbb.desktopView.fitToWindow = Цонхонд тохируулах
-bbb.highlighter.toolbar.pencil = Харандаа
+bbb.highlighter.toolbar.pencil = Тодруулагч
 bbb.mainshell.statusProgress.connecting = Сервер луу холбогдож байна.
 bbb.listenerItem.lockImg.toolTip = Энд дараад өөрийгөө дуугуй болгох, дуутай болгох
 bbb.listeners.unmuteAllBtn.toolTip = Бүгдийг дуутай болгох
@@ -143,4 +142,4 @@ bbb.highlighter.toolbar.thickness = Үе давхраа солих
 bbb.presentation.uploadwindow.presentationfile = Танилцуулга файл
 bbb.viewers.raiseHandBtn.toolTip = Энд дараад гараа өргөнө үү
 bbb.presentation.error.convert.format = Алдаа: Таны илгээсэн файл буруу өргөтгөлтэй байна
-bbb.desktopPublish.fullscreen.label = Дэлгэцэнд бүтнээр гаргах
+bbb.desktopPublish.fullscreen.label = Бүтнээр
diff --git a/bigbluebutton-client/locale/nb_NO/bbbResources.properties b/bigbluebutton-client/locale/nb_NO/bbbResources.properties
index 29dff72b96fc9f4c0291db2be55e28965168250e..d99424cd62e2a2deedc46449492ef38fa8f169a9 100755
--- a/bigbluebutton-client/locale/nb_NO/bbbResources.properties
+++ b/bigbluebutton-client/locale/nb_NO/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = lastet opp.
 bbb.mainshell.logBtn.toolTip = Ã…pne loggvindu
 bbb.desktopPublish.stop.tooltip = Lukk skjermdeling
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Mikrofonaktivitet
 bbb.settings.voice.volume = Mikrofonaktivitet
 bbb.logout.unknown = Din klient har mistet forbindelsen til serveren
 bbb.presentation.slideNumLbl.toolTip = Klikk for å velge et lysark
diff --git a/bigbluebutton-client/locale/nl_NL/bbbResources.properties b/bigbluebutton-client/locale/nl_NL/bbbResources.properties
index e384dc96aa7d87976aded89a34d85875ec21ef38..23bcb494e44cc9567c12adb9a2838577d1455ede 100644
--- a/bigbluebutton-client/locale/nl_NL/bbbResources.properties
+++ b/bigbluebutton-client/locale/nl_NL/bbbResources.properties
@@ -72,7 +72,6 @@ bbb.presentation.uploaded = verstuurd.
 bbb.mainshell.logBtn.toolTip = Open log scherm
 bbb.desktopPublish.stop.tooltip = Sluit het delen van uw scherm
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Microfoon activiteit
 bbb.settings.voice.volume = Microfoon activiteit
 bbb.logout.unknown = Uw toepassing heeft de connectie met de server verbroken
 bbb.presentation.slideNumLbl.toolTip = Klik om een slide te selecteren.
diff --git a/bigbluebutton-client/locale/pl_PL/bbbResources.properties b/bigbluebutton-client/locale/pl_PL/bbbResources.properties
index 30f669e5e79e1415f70eb506d52f8677eecc7c70..8ad751ed1707e17b310fbc3c09851d58ea8ce85e 100755
--- a/bigbluebutton-client/locale/pl_PL/bbbResources.properties
+++ b/bigbluebutton-client/locale/pl_PL/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = Wgrane na serwer.
 bbb.mainshell.logBtn.toolTip = Otwórz okno dziennika
 bbb.desktopPublish.stop.tooltip = Zamknij współdzielenie
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Uaktywnij mikrofon
 bbb.settings.voice.volume = Uaktywnij mikrofon
 bbb.logout.unknown = Klient stracił połączenie z serwerem
 bbb.presentation.slideNumLbl.toolTip = Kliknij podwójnie, aby wyświetlić slajd
diff --git a/bigbluebutton-client/locale/pt_BR/bbbResources.properties b/bigbluebutton-client/locale/pt_BR/bbbResources.properties
index c31a7a838f1510dae12b7ca69e6a425faf9e0c36..60620a140ec784210d3647af34e63a0d3851c58a 100644
--- a/bigbluebutton-client/locale/pt_BR/bbbResources.properties
+++ b/bigbluebutton-client/locale/pt_BR/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = Enviado.
 bbb.mainshell.logBtn.toolTip = Abrir Janela de Registro
 bbb.desktopPublish.stop.tooltip = Fechar compartilhamento de tela
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Atividade no microfone
 bbb.settings.voice.volume = Atividade no microfone
 bbb.logout.unknown = Seu cliente perdeu conexão com o servidor
 bbb.presentation.slideNumLbl.toolTip = Cique para selecionar um slide
diff --git a/bigbluebutton-client/locale/pt_PT/bbbResources.properties b/bigbluebutton-client/locale/pt_PT/bbbResources.properties
index 7505ad438a3d67d2d9362c3b0c4b4ab3c68a8a70..168cfc06ec382b8ebdfd51ad7ed6a95b98d12aaa 100755
--- a/bigbluebutton-client/locale/pt_PT/bbbResources.properties
+++ b/bigbluebutton-client/locale/pt_PT/bbbResources.properties
@@ -70,7 +70,6 @@ bbb.presentation.uploaded = Enviado.
 bbb.mainshell.logBtn.toolTip = Abrir janela de registo
 bbb.desktopPublish.stop.tooltip = Fechar partilha de ecrã
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Actividade de Microfone
 bbb.settings.voice.volume = Actividade de Microfone
 bbb.toolbar.video.toolTip = Iniciar a sua webcam
 bbb.presentation.slideNumLbl.toolTip = Pressione para seleccionar um slide
diff --git a/bigbluebutton-client/locale/ro_RO/bbbResources.properties b/bigbluebutton-client/locale/ro_RO/bbbResources.properties
index 5411d72a60f31dd4e7245b078143f12d8a075f6d..c5b3c1381bab37945dcc550b80dd120c26e4003d 100755
--- a/bigbluebutton-client/locale/ro_RO/bbbResources.properties
+++ b/bigbluebutton-client/locale/ro_RO/bbbResources.properties
@@ -68,7 +68,6 @@ bbb.chat.title = Chat
 bbb.presentation.uploaded = încărcat.
 bbb.mainshell.logBtn.toolTip = Afişaţi Jurnalul
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Activitate Microfon
 bbb.settings.voice.volume = Activitate Microfon
 bbb.logout.unknown = Clientul dumneavoastră a pierdut conexiunea cu serverul
 bbb.presentation.slideNumLbl.toolTip = Click pentru a selecta un slide
diff --git a/bigbluebutton-client/locale/ru_RU/bbbResources.properties b/bigbluebutton-client/locale/ru_RU/bbbResources.properties
index 92461cc414a6169e0af32e8f382ddd769ce07149..1582b590ad93e1ab35659a886b908576a3f9a87e 100755
--- a/bigbluebutton-client/locale/ru_RU/bbbResources.properties
+++ b/bigbluebutton-client/locale/ru_RU/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = загружено.
 bbb.mainshell.logBtn.toolTip = Открыть окно журнала
 bbb.desktopPublish.stop.tooltip = Закрыть трансляцию экрана
 bbb.presentation.uploadwindow.excel = Таблица Excel
-bbb.micSettings.micActivity = Активность микрофона
 bbb.settings.voice.volume = Активность микрофона
 bbb.logout.unknown = Соединение с сервером потеряно
 bbb.presentation.slideNumLbl.toolTip = Щёлкните для выбора слайда
diff --git a/bigbluebutton-client/locale/sr_RS/bbbResources.properties b/bigbluebutton-client/locale/sr_RS/bbbResources.properties
index 1840cb0a705f5ba3168bde70b82ec8ac5322552c..4b832ea334f98de5ba3fd1f6ea15db60bc981fb0 100755
--- a/bigbluebutton-client/locale/sr_RS/bbbResources.properties
+++ b/bigbluebutton-client/locale/sr_RS/bbbResources.properties
@@ -1,11 +1,12 @@
 bbb.logout.usercommand = Uspešno ste izašli iz konferencije
+bbb.settings.flash.command = Instaliraj najnoviji Flash
 bbb.oldlocalewindow.reminder2 = Molimo ispraznite keš pretraživača i pokušajte ponovo.
 bbb.presentation.maxUploadFileExceededAlert = Greška: Datoteka je veća od dozvoljene.
 bbb.logout.invalidapp = red5 aplikacija ne postoji
 bbb.fileupload.title = Prebaci prezentaciju
 bbb.chat.publicMsgAwaiting2 = * Javna poruka na čekanju *
 bbb.viewers.viewersGrid.roleItemRenderer = Uloga
-bbb.oldlocalewindow.windowTitle = Warning: Staru verziju prevoda
+bbb.oldlocalewindow.windowTitle = Upozorenje: Stara verzija prevoda
 bbb.presentation.converted = Konvertiran {0} od {1} slajdova.
 bbb.viewers.presentBtn.toolTip = Izaberi korisnika da bude prezentator.
 bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Klikni da vidiš.
@@ -16,6 +17,7 @@ bbb.viewers.kickUserBtn.toolTip = Izbaci korisnika
 bbb.listeners.ejectTooltip = Izbaci korisnika
 bbb.presentation.uploadcomplete = Prebacivanje kompletno. Molimo sačekajte dok se dokument konvertuje.
 bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Podigli su ruke {0}
+bbb.mainToolbar.settingsBtn.toolTip = Otvori podešavanja
 bbb.desktopView.actualSize = Prikaži trenutnu veličinu
 bbb.desktopPublish.region.tooltip = Podeli deo tvog prozora
 bbb.presentation.error.convert.swf = Greška prilikom konvertovanja prebačenog dokumenta. Molimo kontaktirajte administratora.
@@ -28,16 +30,19 @@ bbb.chat.cmpColorPicker.toolTip = Boja teksta
 bbb.listenerItem.muteUnmute.toolTip = Ućutkaj ili dozvoli da priča ovaj korisnik.
 bbb.chat.chatOptions = Podešavanja ćaskanja
 bbb.presentation.uploadwindow.closeLabel = Kliknite OK da zatvorite prozor
-bbb.viewers.title = Users{0} {1}
+bbb.viewers.title = Korisnika {0} {1}
+bbb.settings.flash.label = Greška u Flash verziji
 bbb.presentation.ok = OK
 bbb.mainToolbar.helpBtn = Pomoć
 bbb.fileupload.showBtn = Prikaži
 bbb.fileupload.fileLbl = Datoteka:
-bbb.toolbar.deskshare.toolTip = Podeli radnu ploču
+bbb.listenerItem.talkImg.toolTip = Pričaj
+bbb.settings.warning.label = Upozorenje
 bbb.mainshell.copyrightLabel2 = (c) 2011, CallPal by BigBlueButton - For more information see http://www.bigbluebutton.org/.
 bbb.presentation.uploadwindow.powerpoint = POWERPOINT
 bbb.toolbar.video.toolTip = Koristi kameru
 bbb.chat.publicMsgAwaiting = Javna poruka na čekanju
+bbb.settings.instructions = Prihvatite Flash zahtev koji Vas pita za dozvolu korišćenja kamere. Ako možete da vidite i čujete sebe, Vaš pretraživač je podešen kako treba. Druge potencijalne mogućnosti su prikazane dole. Kliknite na svaku da bi našli moguće rešenje.
 bbb.chat.sendBtn = Pošalji
 bbb.publishVideo.title = Podeli svoju web kameru
 bbb.logout.appshutdown = Serverska aplikacija je isključena
@@ -45,13 +50,17 @@ bbb.presentation.uploadPresBtn = Prebaci dokument za prezentaciju.
 bbb.presentation.uploadPresBtn.toolTip = Prebaci dokument za prezentaciju.
 bbb.highlighter.toolbar.ellipse = Å estar
 bbb.fileupload.deleteBtn.toolTip = Izbriši prezentaciju
-bbb.listenerItem.talkImg.toolTip = Pričaj
+bbb.toolbar.deskshare.toolTip = Podeli radnu ploču
 bbb.presentation.document.converted = Uspešno konvertovan office dokument.
 bbb.presentation.error.convert.maxnbpagereach = Greška: Prebačeni dokument ima previše stranica.
 bbb.desktopView.title = Podela radne ploče
+bbb.settings.java.label = Greška u Java verziji
 bbb.presentation.forwardBtn.toolTip = Sledeći slajd
+bbb.settings.java.text = Imate instaliranu Java verziju {0}, ali vam je potrebna verzija {1} kako bi mogli da koristite opciju deljenje radne ploče. Kliknite na dugme dole, kako bi instalirali najnoviju verziju Jave.
 bbb.fileupload.genThumbText = Generiši sličice.
+bbb.viewers.viewersGrid.statusItemRenderer = Status
 bbb.desktopPublish.title = Podeli radnu ploču: Prezentatorov pregled
+bbb.mainToolbar.settingsBtn = Podešavanja
 bbb.fileupload.uploadBtn = Prebaci
 bbb.fileupload.uploadBtn.toolTip = Prebaci datoteku
 bbb.fileupload.showBtn.toolTip = Prikaži prezentaciju
@@ -64,26 +73,30 @@ bbb.presentation.uploaded = prebačen.
 bbb.mainshell.logBtn.toolTip = Otvori log prozor
 bbb.desktopPublish.stop.tooltip = Zatvori podelu radne ploče
 bbb.presentation.uploadwindow.excel = EXCEL
+bbb.settings.voice.volume = Aktivitet mikrofona
 bbb.logout.unknown = Izgubljena veza sa serverom
 bbb.presentation.slideNumLbl.toolTip = Kliknite da izaberete slajd
+bbb.settings.flash.text = Imate instaliran Flash {0}, a vama je potrebna najmanje verzija {1}, da bi BigBlueButtor radio kako treba. Kliknite na dugme ispod, kako bi instalirali najnoviju verziju Adobe Flash-a.
 bbb.highlighter.toolbar.rectangle = Lenjir
-bbb.viewers.viewersGrid.statusItemRenderer = Status
+bbb.settings.voice.adjust = Podesi jačinu
 bbb.presentation.uploadwindow.word = WORD
 bbb.mainshell.statusProgress.loading = Podiže {0} modula
 bbb.presentation.error.io = IO greška: Molimo kontaktirajte administratora.
 bbb.chat.sendBtn.toolTip = Pošalji poruku
 bbb.highlighter.button.toolTipHide = Sakri tablu za pisanje
+bbb.settings.java.command = Instaliraj najnoviju Javu
 bbb.mainToolbar.logoutBtn = Odjava
-bbb.highlighter.toolbar.color = Izaberi boju
 bbb.chat.privateMsgAwaiting2 = * Privatna poruka na čekanju *
 bbb.presentation.document.supported = Prebačeni dokument je podržan. Počinje konvertovanje...
 bbb.listeners.title = Slušaoca {0} {1}
 bbb.fileupload.presentationNamesLbl = Prebačene prezentacije:
 bbb.pageTitle = BigBlueButton
 bbb.mainshell.resetLayoutBtn.toolTip = Resetuj izgled
+bbb.highlighter.toolbar.color = Izaberi boju
 bbb.presentation.uploadwindow.pdf = PDF
 bbb.publishVideo.startPublishBtn.toolTip = Počni da deliš
 bbb.logout.connectionfailed = Veza sa serverom nije uspela
+bbb.settings.isight.text = Ukoliko imate problema sa iSight kamerom, to je zbog toka Å¡to koristite OS X 10.6.5, koji je poznat po tome da ima problema sa Flash video prnosom sa iSight kemere.\r\nDa ispravite ovo, kliknite na link dole kako bi instalirali novu verziju Flash-a ili nadogradili Mac na najnoviju verziju.
 bbb.highlighter.toolbar.clear = Ibriši sve
 bbb.toolbar.phone.toolTip = Koristi mikrofon
 bbb.chat.privateChatSelect = Izaberite osobu sa kojom želite privatno ćaskati
@@ -94,23 +107,27 @@ bbb.desktopPublish.stop.label = Zatvori
 bbb.logout.asyncerror = Došlo je do greške u sinhronizaciji
 bbb.presentation.presenterNameLbl = {0} je trenutno prisutno.
 bbb.chat.privateMsgAwaiting = Privatna poruka na čekanju
-bbb.desktopView.fitToWindow = Podesi prozoru
+bbb.desktopView.fitToWindow = Podesi prozor
 bbb.highlighter.toolbar.pencil = Marker
 bbb.mainshell.statusProgress.connecting = Povezuje se sa serverom
 bbb.listenerItem.lockImg.toolTip = Klikni da ućutkaš ili dozvoliš da priča.
 bbb.listeners.unmuteAllBtn.toolTip = Da pričaju svi
 bbb.logout.rejected = Konekcija sa serverom odbačena
 bbb.presentation.title = Prezentacija
+bbb.settings.noissues = Nema pronađenih otvorenih stavki.
 bbb.desktopPublish.closeBtn.toolTip = Prekini podelu radne ploče i zatvori prozor.
 bbb.fileupload.selectBtn.toolTip = Pronađi datoteku
 bbb.presentation.uploadwindow.image = IMAGE
+bbb.settings.warning.close = Zatvori ovo upozorenje
 bbb.presentation.clickToUpload = Prebacite prezentaciju
 bbb.presentation.backBtn.toolTip = Prethodni slajd.
 bbb.desktopPublish.fullscreen.tooltip = Podeli svoj ceo prozor
+bbb.settings.isight.command = Instaliraj Flash 10.2 RC2
 bbb.presentation.error.document.convert.failed = Greška: Neuspelo konvertovanje dokumenta.
 bbb.viewers.viewersGrid.nameItemRenderer = Ime
-bbb.oldlocalewindow.reminder1 = Moguce imate staru verziju prevoda.
+bbb.oldlocalewindow.reminder1 = Moguće imate staru verziju prevoda.
 bbb.highlighter.button.toolTipShow = Prikaži tablu za pisanje
+bbb.settings.deskshare.start = Označi podelu radne ploče
 bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Prijavljeni ste kao sledeći korisnik.
 bbb.chat.fontSize = Veličina fonta
 bbb.presentation.resetZoomBtn.toolTip = Resetujte uveličavanje
@@ -118,7 +135,8 @@ bbb.mainshell.statusProgress.cannotConnectServer = Nažalost nije moguće uspost
 bbb.logout.connectionclosed = Veza sa serverom je zatvorena
 bbb.chat.publicChatUsername = Sve
 bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Prezentator
-bbb.mainToolbar.logoutBtn.toolTip = odjavi se
+bbb.settings.isight.label = Greška sa iSight kamerom
+bbb.mainToolbar.logoutBtn.toolTip = Odjavi se
 bbb.presentation.error.convert.notsupported = Greška: Prebačeni dokument nije podržan. Molimo prebacite kompatibilnu datoteku.
 bbb.highlighter.toolbar.thickness = Promeni debljinu
 bbb.presentation.uploadwindow.presentationfile = Prezentaciona datoteka
diff --git a/bigbluebutton-client/locale/sr_SR/bbbResources.properties b/bigbluebutton-client/locale/sr_SR/bbbResources.properties
index f2a1ba4b2ae6b579a11a02f16c35fe5884beafc1..deec50459c2c263dd18367024f63c2fb2c8496fd 100755
--- a/bigbluebutton-client/locale/sr_SR/bbbResources.properties
+++ b/bigbluebutton-client/locale/sr_SR/bbbResources.properties
@@ -1,8 +1,9 @@
 bbb.logout.usercommand = Успешно сте се исклјучили из конференције
+bbb.settings.flash.command = Инсталирај најновији Flash
 bbb.oldlocalewindow.reminder2 = Молимо вас да избрисете кеш вашег бровсера и пробајте поново.
-bbb.presentation.maxUploadFileExceededAlert = Грешка: овај фајл је већи него што је дозвољено.
-bbb.logout.invalidapp = Ред5 аппликација не постоји на овом серверу
-bbb.fileupload.title = Ставите документ за презентацију.
+bbb.presentation.maxUploadFileExceededAlert = Грешка: ова датотека је већа него што је дозвољено.
+bbb.logout.invalidapp = ред5 аппликација не постоји
+bbb.fileupload.title = Пребаци презентацију.
 bbb.chat.publicMsgAwaiting2 = * Нова порука *
 bbb.viewers.viewersGrid.roleItemRenderer = Улога
 bbb.oldlocalewindow.windowTitle = Упозорење: Стари превод језика
@@ -12,115 +13,128 @@ bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Притисни
 bbb.highlighter.toolbar.undo = Поништи задње
 bbb.desktopPublish.minimizeBtn.toolTip = Смањи овај прозор
 bbb.viewers.presentBtn.label = Промените Предавача
-bbb.viewers.kickUserBtn.toolTip = Избаци слушаоца
-bbb.listeners.ejectTooltip = Избаци слушаоца
-bbb.presentation.uploadcomplete = Молимо сачекајте док процесујемо документ.
+bbb.viewers.kickUserBtn.toolTip = Избаците учесника
+bbb.listeners.ejectTooltip = Избаците учесника
+bbb.presentation.uploadcomplete = Пребацивање успешно. Молимо сачекајте док се документ конвертује.
 bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Подигнута рука на {0}
+bbb.mainToolbar.settingsBtn.toolTip = Отвори подешавања
 bbb.desktopView.actualSize = Стварна величина
 bbb.desktopPublish.region.tooltip = Покажите део екрана
-bbb.presentation.error.convert.swf = Грешка: нисмо могли да процесујемо документ.
+bbb.presentation.error.convert.swf = Грешка приликом конвертовања документа. Молимо контактирајте администратора.
 bbb.fileupload.progBarLbl = Статус:
 bbb.presentation.error.security = Безбедносна греска: Контактујте администратора.
+bbb.desktopPublish.maximizeRestoreBtn.toolTip = Не можете увећати прозор.
+bbb.listenerItem.nameLbl.toolTip = Изабери овог корисникаикликни на дугме да га ућуткаш или му дозволиш да прича
 bbb.desktopPublish.region.label = Област
 bbb.chat.cmpColorPicker.toolTip = Боја текста
-bbb.listenerItem.muteUnmute.toolTip = Ућути овог учесника
-bbb.chat.chatOptions = Чет опције
+bbb.listenerItem.muteUnmute.toolTip = Ућуткај или дозволи да прича овај учесник
+bbb.chat.chatOptions = Опције ћаскања
 bbb.presentation.uploadwindow.closeLabel = Притисните ОК да затворите прозор
 bbb.viewers.title = Учесници{0} {1}
+bbb.settings.flash.label = Грешка у Flash верзији
 bbb.presentation.ok = OK
 bbb.mainToolbar.helpBtn = Помоћ
 bbb.fileupload.showBtn = Покажи
-bbb.fileupload.fileLbl = Фајл:
-bbb.toolbar.deskshare.toolTip = Покажите екран
-bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
+bbb.fileupload.fileLbl = Датотека:
+bbb.listenerItem.talkImg.toolTip = Причај
+bbb.settings.warning.label = Упозорење
+bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton верзија {0} - за више информација погледајте http://www.bigbluebutton.org/.
 bbb.presentation.uploadwindow.powerpoint = POWERPOINT
 bbb.toolbar.video.toolTip = Покажите камеру
 bbb.chat.publicMsgAwaiting = Нова порука
 bbb.chat.sendBtn = Пошаљи
 bbb.publishVideo.title = Покажите камеру
 bbb.logout.appshutdown = Изгубили смо конекцију са сервером
-bbb.presentation.uploadPresBtn = Ставите документ за презентацију.
-bbb.presentation.uploadPresBtn.toolTip = Ставите документ за презентацију.
+bbb.presentation.uploadPresBtn = Пребаци документ за презентацију.
+bbb.presentation.uploadPresBtn.toolTip = Пребаци документ за презентацију.
 bbb.highlighter.toolbar.ellipse = Круг
 bbb.fileupload.deleteBtn.toolTip = Избриши презентацију
-bbb.listenerItem.talkImg.toolTip = Прича
+bbb.toolbar.deskshare.toolTip = Подели радну плочу
 bbb.presentation.document.converted = Документ успешно процесован.
 bbb.presentation.error.convert.maxnbpagereach = Грешка: Документ има превише страна.
 bbb.desktopView.title = Декстоп презентација
+bbb.settings.java.label = Грешка у Јава верзији
 bbb.presentation.forwardBtn.toolTip = Следећи слајд
-bbb.fileupload.genThumbText = Процесујемо слике..
+bbb.fileupload.genThumbText = Генеришу се сличице..
+bbb.viewers.viewersGrid.statusItemRenderer = Статус
 bbb.desktopPublish.title = Декстоп: Преглед
-bbb.fileupload.uploadBtn = Селектуј фајл
-bbb.fileupload.uploadBtn.toolTip = Селектуј фајл
+bbb.mainToolbar.settingsBtn = Подешавања
+bbb.fileupload.uploadBtn = Пребаци
+bbb.fileupload.uploadBtn.toolTip = Пребаци датотеку
 bbb.fileupload.showBtn.toolTip = Покажи презентацију
 bbb.listeners.muteAllBtn.toolTip = Ућути све
 bbb.video.publish.close.tooltip = Престаните камеру
 bbb.presentation.error.convert.nbpage = Грешка: нисмо могли да установимо колико слајдова има у документу.
 bbb.mainshell.locale.version = 0.71
-bbb.chat.title = Чет
-bbb.presentation.uploaded = .
-bbb.mainshell.logBtn.toolTip = Отвори лог грешки
+bbb.chat.title = Ћаскање
+bbb.presentation.uploaded = пребачен.
+bbb.mainshell.logBtn.toolTip = Отвори лог прозор
 bbb.desktopPublish.stop.tooltip = Затвори десктоп
 bbb.presentation.uploadwindow.excel = EXCEL
+bbb.settings.voice.volume = Активитет микрофона
 bbb.logout.unknown = Изгубили смо конекцију са сервером
 bbb.presentation.slideNumLbl.toolTip = Притисни да изабереш слајд
 bbb.highlighter.toolbar.rectangle = Правоугаоник
-bbb.viewers.viewersGrid.statusItemRenderer = Статус
+bbb.settings.voice.adjust = Подеси јачину
 bbb.presentation.uploadwindow.word = WORD
-bbb.mainshell.statusProgress.loading = Покрећемо {0} компонената
+bbb.mainshell.statusProgress.loading = Покреће {0} компонената
 bbb.presentation.error.io = I/O Грешка: Контактујте администратора.
 bbb.chat.sendBtn.toolTip = Пошаљи поруку
 bbb.highlighter.button.toolTipHide = Сакри таблу
+bbb.settings.java.command = Инсталирај најновију Јаву
 bbb.mainToolbar.logoutBtn = Излаз
-bbb.highlighter.toolbar.color = Изабери боју
 bbb.chat.privateMsgAwaiting2 = * Нова приватна порука *
-bbb.presentation.document.supported = Молимо сачекајте док процесујемо документ.
-bbb.listeners.title = Слушаоци{0} {1}
-bbb.fileupload.presentationNamesLbl = Претходне презентације:
+bbb.presentation.document.supported = Пребачени документ је подржан. Починје конвертованје...
+bbb.listeners.title = Слушаоца {0} {1}
+bbb.fileupload.presentationNamesLbl = Пребачене презентације:
 bbb.pageTitle = BigBlueButton
 bbb.mainshell.resetLayoutBtn.toolTip = Ресетуј распоред
+bbb.highlighter.toolbar.color = Изабери боју
 bbb.presentation.uploadwindow.pdf = PDF
 bbb.publishVideo.startPublishBtn.toolTip = Покажите камеру
-bbb.logout.connectionfailed = Изгубили смо конекцију са сервером
+bbb.logout.connectionfailed = Неуспело повезивање са сервером
 bbb.highlighter.toolbar.clear = Избриши све
-bbb.toolbar.phone.toolTip = Зкључи микрофон
+bbb.toolbar.phone.toolTip = Користи микрофон
 bbb.chat.privateChatSelect = Изаберите особу да пришате приватно
 bbb.micSettings.cancel = Откажи
 bbb.fileupload.okCancelBtn = Откажи
 bbb.video.publish.close.label = Затвори
 bbb.desktopPublish.stop.label = Затвори
-bbb.logout.asyncerror = Изгубили смо конекцију са сервером
+bbb.logout.asyncerror = Изгубљена веза са сервером
 bbb.presentation.presenterNameLbl = {0} тренутно представља.
 bbb.chat.privateMsgAwaiting = Нова приватна порука
 bbb.desktopView.fitToWindow = Попуни прозор
 bbb.highlighter.toolbar.pencil = Маркер
 bbb.mainshell.statusProgress.connecting = Успостављамо везу са сервером
-bbb.listenerItem.lockImg.toolTip = Притисните да закључате статус овог учесника
-bbb.listeners.unmuteAllBtn.toolTip = Ућути све
+bbb.listenerItem.lockImg.toolTip = Кликни да ућуткаш или дозволиш да говори
+bbb.listeners.unmuteAllBtn.toolTip = Ућуткај све
 bbb.logout.rejected = Сервер није прохватио конекцију
 bbb.presentation.title = Презентација
 bbb.desktopPublish.closeBtn.toolTip = Затвори десктоп
-bbb.fileupload.selectBtn.toolTip = Изаберите фајл
+bbb.fileupload.selectBtn.toolTip = Изабери датотеку
 bbb.presentation.uploadwindow.image = IMAGE
 bbb.settings.warning.close = Искључите ово упозорење
 bbb.presentation.clickToUpload = Ставите документ за презентацију
 bbb.presentation.backBtn.toolTip = Претходни слајд
 bbb.desktopPublish.fullscreen.tooltip = Покажите цео екран
-bbb.presentation.error.document.convert.failed = Грешка: нисмо могли да процесујемо документ.
+bbb.settings.isight.command = Инсталирај Flash 10.2 RC2
+bbb.presentation.error.document.convert.failed = Грешка: конвертовање документа није могуће.
 bbb.viewers.viewersGrid.nameItemRenderer = Име
 bbb.oldlocalewindow.reminder1 = Могуће је да имате стари превод BigBlueButton-а.
 bbb.highlighter.button.toolTipShow = Покажи таблу
+bbb.settings.deskshare.start = Обележи поделу радне плоче
 bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Ви сте овај учесник.
 bbb.chat.fontSize = Величина фонта
-bbb.presentation.resetZoomBtn.toolTip = Ресетуј зоом
+bbb.presentation.resetZoomBtn.toolTip = Ресетуј увеличање
 bbb.mainshell.statusProgress.cannotConnectServer = Извините, не можемо да успоставимо везу са сервером
-bbb.logout.connectionclosed = Сервер је искључио конекцију
+bbb.logout.connectionclosed = Веза са серверпм је затворена
 bbb.chat.publicChatUsername = Сви
 bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Предавач
+bbb.settings.isight.label = Грешка са iSight камером
 bbb.mainToolbar.logoutBtn.toolTip = Излаз
-bbb.presentation.error.convert.notsupported = Грешка: фајл је у непознатом формату.
+bbb.presentation.error.convert.notsupported = Грешка: датотека је у непознатом формату.
 bbb.highlighter.toolbar.thickness = Промени дебљину
 bbb.presentation.uploadwindow.presentationfile = Презентаџија
 bbb.viewers.raiseHandBtn.toolTip = Притисни да подигнеш руку.
 bbb.presentation.error.convert.format = Грешка: фајл је у непознатом формату.
-bbb.desktopPublish.fullscreen.label = Цео Екран
+bbb.desktopPublish.fullscreen.label = Цео екран
diff --git a/bigbluebutton-client/locale/tr_TR/bbbResources.properties b/bigbluebutton-client/locale/tr_TR/bbbResources.properties
index 4bb0228101e807bcbae5984f57c0bf015a2190a1..4b4f9c62b9690b00d5fb3cd864e077fbf6d426f2 100755
--- a/bigbluebutton-client/locale/tr_TR/bbbResources.properties
+++ b/bigbluebutton-client/locale/tr_TR/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = yüklendi.
 bbb.mainshell.logBtn.toolTip = Sistem Kayıtlarını Aç
 bbb.desktopPublish.stop.tooltip = Ekran paylaşımını kapat
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Mikrofon Aktivitesi
 bbb.settings.voice.volume = Mikrofon Aktivitesi
 bbb.logout.unknown = Katılımcının sunucuyla bağlantısı koptu.
 bbb.presentation.slideNumLbl.toolTip = Seçmek istediğiniz slaydı tıklayın.
diff --git a/bigbluebutton-client/locale/uk_UA/bbbResources.properties b/bigbluebutton-client/locale/uk_UA/bbbResources.properties
index eb0bcc7a3e071bc3f6ba0bd151983d3286265c81..5e154472d015b1c84251b52127cd074b1ecd94f6 100755
--- a/bigbluebutton-client/locale/uk_UA/bbbResources.properties
+++ b/bigbluebutton-client/locale/uk_UA/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = завантажено.
 bbb.mainshell.logBtn.toolTip = Відкрити вікно журналу
 bbb.desktopPublish.stop.tooltip = Зупинити трансляцію екрана
 bbb.presentation.uploadwindow.excel = Таблиця Excel
-bbb.micSettings.micActivity = Мікрофонна активність
 bbb.settings.voice.volume = Мікрофонна активність
 bbb.logout.unknown = Ваш клієнт втратив зв'язок з сервером
 bbb.presentation.slideNumLbl.toolTip = Клацніть для вибору слайда
diff --git a/bigbluebutton-client/locale/vi_VN/bbbResources.properties b/bigbluebutton-client/locale/vi_VN/bbbResources.properties
index 49f91854d54687343f3101032c4cae3269490182..b949c602f6cb58e10278d2500e181159549ee51b 100755
--- a/bigbluebutton-client/locale/vi_VN/bbbResources.properties
+++ b/bigbluebutton-client/locale/vi_VN/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = tải lên xong.
 bbb.mainshell.logBtn.toolTip = Mở cửa sổ Nhập ký
 bbb.desktopPublish.stop.tooltip = Đóng chia sẻ màn hình
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = Tình trạng của Micro
 bbb.settings.voice.volume = Tình trạng của Micro
 bbb.logout.unknown = Trình duyệt của bạn đã mất kết nối tới máy chủ
 bbb.presentation.slideNumLbl.toolTip = Nhấn vào để chọn một trang trình chiếu
diff --git a/bigbluebutton-client/locale/zh_CN/bbbResources.properties b/bigbluebutton-client/locale/zh_CN/bbbResources.properties
index 775729233f4ed55e4874a2cef0d546ffd7dcc50b..83ffe945689b1fef6487e57c6fb759b3d6348de0 100755
--- a/bigbluebutton-client/locale/zh_CN/bbbResources.properties
+++ b/bigbluebutton-client/locale/zh_CN/bbbResources.properties
@@ -73,7 +73,6 @@ bbb.presentation.uploaded = 已上传
 bbb.mainshell.logBtn.toolTip = 打开日志
 bbb.desktopPublish.stop.tooltip = 关闭桌面共享
 bbb.presentation.uploadwindow.excel = EXCEL
-bbb.micSettings.micActivity = 麦克风状态
 bbb.settings.voice.volume = 麦克风状态
 bbb.logout.unknown = 您已掉线
 bbb.presentation.slideNumLbl.toolTip = 选择一页
diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template
index 60ab2daf79694c00701f8b48fc251771486757b8..a37bf7aab5a7ad532232dce3cb913db8d3deb9de 100755
--- a/bigbluebutton-client/resources/config.xml.template
+++ b/bigbluebutton-client/resources/config.xml.template
@@ -94,6 +94,12 @@
 			dependsOn="ViewersModule"
 		/>
 
+		<!--<module name="VideodockModule" url="VideodockModule.swf?v=VERSION"
+			uri="rtmp://HOST/bigbluebutton" 
+			dependsOn="VideoconfModule"
+			autoDock="true"
+		/>-->
+		
 		<!-- new module in development: 
 		<module name="DynamicInfoModule" url="DynamicInfoModule.swf?v=VERSION" 
 			uri="rtmp://HOST/bigbluebutton" 
diff --git a/bigbluebutton-client/resources/prod/BigBlueButton.html b/bigbluebutton-client/resources/prod/BigBlueButton.html
index decda046881a960f98a7b49be856953533911e45..53f3ece458ce6ce0356dcdf799bd334dde4c67c6 100755
--- a/bigbluebutton-client/resources/prod/BigBlueButton.html
+++ b/bigbluebutton-client/resources/prod/BigBlueButton.html
@@ -1,115 +1,42 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- saved from url=(0014)about:internet -->
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
-    <!-- 
-    Smart developers always View Source. 
-    
-    This application was built using Adobe Flex, an open source framework
-    for building rich Internet applications that get delivered via the
-    Flash Player or to desktops via Adobe AIR. 
-    
-    Learn more about Flex at http://flex.org 
-    // -->
-    <head>
-        <title>BigBlueButton</title>
-        <meta name="google" value="notranslate" />         
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-        <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and 
-             the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as 
-             the percentage of the height of its parent container, which has to be set explicitly.  Fix for
-             Firefox 3.6 focus border issues.  Initially, don't display flashContent div so it won't show 
-             if JavaScript disabled.
-        -->
-        <style type="text/css" media="screen"> 
-            html, body  { height:100%; }
-            body { margin:0; padding:0; overflow:auto; text-align:center; 
-                   background-color: #ffffff; }   
-            object:focus { outline:none; }
-            #flashContent { display:none; }
-        </style>
-        
-        <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
-        <!-- BEGIN Browser History required section -->
-        <link rel="stylesheet" type="text/css" href="history/history.css" />
-        <script type="text/javascript" src="history/history.js"></script>
-        <!-- END Browser History required section -->  
-        
-        <script src="jquery-1.5.1.min.js" language="javascript"></script>
-		<script src="bigbluebutton.js" language="javascript"></script>
-		<script src="bbb_localization.js" language="javascript"></script>
-		<script src="deployJava.js" language="javascript"></script>
-		<script src="bbb_blinker.js" language="javascript"></script>
-		<script src="bbb_deskshare.js" language="javascript"></script>
-            
-        <script type="text/javascript" src="swfobject.js"></script>
-        <script type="text/javascript">
-            // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. 
-            var swfVersionStr = "10.3.0";
-            // To use express install, set to playerProductInstall.swf, otherwise the empty string. 
-            var xiSwfUrlStr = "playerProductInstall.swf";
-            var flashvars = {};
-            var params = {};
-            params.quality = "high";
-            params.bgcolor = "#ffffff";
-            params.allowscriptaccess = "sameDomain";
-            params.allowfullscreen = "true";
-            var attributes = {};
-            attributes.id = "BigBlueButton";
-            attributes.name = "BigBlueButton";
-            attributes.align = "middle";
-            swfobject.embedSWF(
-                "BigBlueButton.swf", "flashContent", 
-                "100%", "100%", 
-                swfVersionStr, xiSwfUrlStr, 
-                flashvars, params, attributes);
-            // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.
-            swfobject.createCSS("#flashContent", "display:block;text-align:left;");
-        </script>
-    </head>
-    <body>
-        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough 
-             JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
-             when JavaScript is disabled.
-        -->
-        <div id="flashContent">
-            <p>
-                To view this page ensure that Adobe Flash Player version 
-                10.3.0 or greater is installed. 
-            </p>
-            <script type="text/javascript"> 
-                var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 
-                document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
-                                + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
-            </script> 
-        </div>
-        
-        <noscript>
-            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="BigBlueButton">
-                <param name="movie" value="BigBlueButton.swf" />
-                <param name="quality" value="high" />
-                <param name="bgcolor" value="#ffffff" />
-                <param name="allowScriptAccess" value="sameDomain" />
-                <param name="allowFullScreen" value="true" />
-                <!--[if !IE]>-->
-                <object type="application/x-shockwave-flash" data="BigBlueButton.swf" width="100%" height="100%">
-                    <param name="quality" value="high" />
-                    <param name="bgcolor" value="#ffffff" />
-                    <param name="allowScriptAccess" value="sameDomain" />
-                    <param name="allowFullScreen" value="true" />
-                <!--<![endif]-->
-                <!--[if gte IE 6]>-->
-                    <p> 
-                        Either scripts and active content are not permitted to run or Adobe Flash Player version
-                        10.3.0 or greater is not installed.
-                    </p>
-                <!--<![endif]-->
-                    <a href="http://www.adobe.com/go/getflashplayer">
-                        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
-                    </a>
-                <!--[if !IE]>-->
-                </object>
-                <!--<![endif]-->
-            </object>
-        </noscript>     
-   </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+        <head>
+                <title></title>
+                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+                <style type="text/css" media="screen">
+                        html, body, #content    { height:100%; }
+                        body                                    { margin:0; padding:0; overflow:auto; }
+                        #altContent                             { /* style alt content */ }
+                </style>
+                <script type="text/javascript" src="swfobject/swfobject.js"></script>
+                <script type="text/javascript">
+                        swfobject.registerObject("BigBlueButton", "10.3.0", "expressInstall.swf");
+                </script>
+                <script src="lib/jquery-1.5.1.min.js" language="javascript"></script>
+                <script src="lib/bigbluebutton.js" language="javascript"></script>
+                <script src="lib/bbb_localization.js" language="javascript"></script>
+                <script src="lib/bbb_blinker.js" language="javascript"></script>
+                <script src="lib/bbb_deskshare.js" language="javascript"></script>
+        </head>
+        <body>
+                <div id="content">
+                        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="BigBlueButton" name="BigBlueButton" align="middle">
+                                <param name="movie" value="BigBlueButton.swf?v=VERSION" />
+                                <param name="quality" value="high" />
+                                <param name="allowfullscreen" value="true" />
+                                <param name="bgcolor" value="#869ca7" />
+                                <!--[if !IE]>-->
+                                <object type="application/x-shockwave-flash" data="BigBlueButton.swf?v=VERSION" width="100%" height="100%" align="middle">
+                                        <param name="quality" value="high" />
+                                        <param name="bgcolor" value="#869ca7" />
+                                <!--<![endif]-->
+                                        <a href="http://www.adobe.com/go/getflashplayer">
+                                                <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
+                                        </a>
+                                <!--[if !IE]>-->
+                                </object>
+                                <!--<![endif]-->
+                        </object>
+                </div>
+        </body>
 </html>
diff --git a/bigbluebutton-client/resources/prod/expressInstall.swf b/bigbluebutton-client/resources/prod/expressInstall.swf
new file mode 100755
index 0000000000000000000000000000000000000000..0fbf8fca961e6319d84442248f6ba314797dccec
Binary files /dev/null and b/bigbluebutton-client/resources/prod/expressInstall.swf differ
diff --git a/bigbluebutton-client/resources/prod/bbb_blinker.js b/bigbluebutton-client/resources/prod/lib/bbb_blinker.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/bbb_blinker.js
rename to bigbluebutton-client/resources/prod/lib/bbb_blinker.js
diff --git a/bigbluebutton-client/resources/prod/bbb_deskshare.js b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/bbb_deskshare.js
rename to bigbluebutton-client/resources/prod/lib/bbb_deskshare.js
diff --git a/bigbluebutton-client/resources/prod/bbb_localization.js b/bigbluebutton-client/resources/prod/lib/bbb_localization.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/bbb_localization.js
rename to bigbluebutton-client/resources/prod/lib/bbb_localization.js
diff --git a/bigbluebutton-client/resources/prod/bigbluebutton.js b/bigbluebutton-client/resources/prod/lib/bigbluebutton.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/bigbluebutton.js
rename to bigbluebutton-client/resources/prod/lib/bigbluebutton.js
diff --git a/bigbluebutton-client/resources/prod/deployJava.js b/bigbluebutton-client/resources/prod/lib/deployJava.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/deployJava.js
rename to bigbluebutton-client/resources/prod/lib/deployJava.js
diff --git a/bigbluebutton-client/resources/prod/jquery-1.5.1.min.js b/bigbluebutton-client/resources/prod/lib/jquery-1.5.1.min.js
similarity index 100%
rename from bigbluebutton-client/resources/prod/jquery-1.5.1.min.js
rename to bigbluebutton-client/resources/prod/lib/jquery-1.5.1.min.js
diff --git a/bigbluebutton-client/resources/prod/swfobject/swfobject.js b/bigbluebutton-client/resources/prod/swfobject/swfobject.js
new file mode 100755
index 0000000000000000000000000000000000000000..8eafe9dd83f91b52c2decd532db81527bb98e488
--- /dev/null
+++ b/bigbluebutton-client/resources/prod/swfobject/swfobject.js
@@ -0,0 +1,4 @@
+/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
\ No newline at end of file
diff --git a/bigbluebutton-client/src/DynamicInfoModule.mxml b/bigbluebutton-client/src/DynamicInfoModule.mxml
index e01b6a6c791b8078efcd590277615c4c05b9673c..255fa225a7797460507aa1633339fe6fea1c47db 100755
--- a/bigbluebutton-client/src/DynamicInfoModule.mxml
+++ b/bigbluebutton-client/src/DynamicInfoModule.mxml
@@ -20,7 +20,11 @@
   $Id: $
 -->
 
-<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()" implements="org.bigbluebutton.common.IBigBlueButtonModule" xmlns:maps="org.bigbluebutton.modules.dynamicinfo.maps.*" xmlns:views="org.bigbluebutton.modules.dynamicinfo.views.*">
+<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" 
+		   creationComplete="onCreationComplete()" 
+		   implements="org.bigbluebutton.common.IBigBlueButtonModule" 
+		   xmlns:maps="org.bigbluebutton.modules.dynamicinfo.maps.*" 
+		   xmlns:views="org.bigbluebutton.modules.dynamicinfo.views.*">
 	<mx:Script>
 		<![CDATA[
 			import com.asfusion.mate.events.Dispatcher;
@@ -142,7 +146,8 @@
 						cmp.height = 22;
 						var evt:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.ADD);
 						evt.button = cmp as IBbbToolbarComponent;
-						globalDispatcher.dispatchEvent(evt);
+						var dispatcher:Dispatcher = new Dispatcher();
+						dispatcher.dispatchEvent(evt);
 					}
 				}
 			}
diff --git a/bigbluebutton-client/src/VideodockModule.mxml b/bigbluebutton-client/src/VideodockModule.mxml
new file mode 100755
index 0000000000000000000000000000000000000000..87315b5ba57730ce43a7d317422f429d28feadd5
--- /dev/null
+++ b/bigbluebutton-client/src/VideodockModule.mxml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300" 
+		   xmlns:maps="org.bigbluebutton.modules.videodock.maps.*" implements="org.bigbluebutton.common.IBigBlueButtonModule">
+	<mx:Script>
+		<![CDATA[
+			import org.bigbluebutton.common.LogUtil;
+			
+			private var _moduleName:String = "Videodock Module";			
+			private var _attributes:Object; 
+			
+			private function onCreationComplete():void {
+				LogUtil.debug("VideodockModule initialized");	
+			}
+			
+			public function get moduleName():String {
+				return _moduleName;
+			}
+			
+			public function get autoDock():Boolean {
+				return (_attributes.autoDock == "true");
+			}
+			
+			public function start(attributes:Object):void {	
+				LogUtil.debug("Videodock attr: " + attributes.username);
+				_attributes = attributes;
+				
+				eventMap.module = this;
+				eventMap.startModule();
+			}
+			
+			public function stop():void {
+				eventMap.stopModule();
+			}
+			
+		]]>
+	</mx:Script>
+	
+	<maps:VideoDockEventMap id="eventMap"/>
+</mx:Module>
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as b/bigbluebutton-client/src/org/bigbluebutton/common/Images.as
index adaaca2328c8b032abe33532752e89a1c3bcbd18..6b4773ef7f44c44eda52805a77a51d974863394c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/common/Images.as
@@ -141,5 +141,17 @@ package org.bigbluebutton.common
 		
 		[Embed(source="assets/images/presenter.png")]
 		public var presenter:Class;
+		
+		[Embed(source="assets/images/lock_open.png")]
+		public var lock_open:Class;
+		
+		[Embed(source="assets/images/lock_close.png")]
+		public var lock_close:Class;
+		
+		[Embed(source="assets/images/arrow_in.png")]
+		public var arrow_in:Class;
+		
+		[Embed(source="assets/images/shape_handles.png")]
+		public var shape_handles:Class;		
 	}
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png
new file mode 100755
index 0000000000000000000000000000000000000000..745c65134db478a64016d63a7104e585452f2b9f
Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png differ
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png
new file mode 100755
index 0000000000000000000000000000000000000000..2ebc4f6f9663e32cad77d67ef93ab8843dfea3c0
Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png differ
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png
new file mode 100755
index 0000000000000000000000000000000000000000..a471765ff1432092e7113e56b42f2798968b443f
Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png differ
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png
new file mode 100755
index 0000000000000000000000000000000000000000..ce27fe3a0345e03e919b54ca3b6a8498743b2ee9
Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png differ
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as
old mode 100644
new mode 100755
index 6885264784127db4520343779dec95db97cc05f6..fa503285ad5c02d9031cb3df9901bb79a0b6256f
--- a/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as
@@ -36,7 +36,7 @@ package org.bigbluebutton.common.events
 		
 		public static const CLOSE_WINDOW_EVENT:String = 'CLOSE_WINDOW_EVENT';
 		
-		public function CloseWindowEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
+		public function CloseWindowEvent(type:String=CLOSE_WINDOW_EVENT, bubbles:Boolean=true, cancelable:Boolean=false)
 		{
 			super(type, bubbles, cancelable);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as
new file mode 100755
index 0000000000000000000000000000000000000000..1951e35ac35bbefe84379fb6ae63e2de824ca3af
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as
@@ -0,0 +1,44 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 2.1 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+package org.bigbluebutton.common.events
+{
+	import flash.events.Event;
+	import flash.geom.Point;
+	import mx.core.UIComponent;
+	import flexlib.mdi.containers.*;
+	
+	public class DragWindowEvent extends Event
+	{
+		public static const DRAG_WINDOW_EVENT:String = "DRAG_WINDOW_EVENT";
+		public static const DRAG_START:String = "DRAG_START";
+		public static const DRAG_END:String = "DRAG_END";
+		public static const DRAG:String = "DRAG";
+		
+		public var mouseGlobal:Point;
+		public var window:MDIWindow;
+		public var mode:String;
+		
+		public function DragWindowEvent(mode:String, type:String = DRAG_WINDOW_EVENT)
+		{
+			super(type, true, false);
+			this.mode = mode;
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
index 86f5963ba230b4d74081de7174400c6b5d6a1252..781373d585d21cc76f261de4ac8b6684a854bc12 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
@@ -62,6 +62,7 @@ package org.bigbluebutton.main.model
 		 */		
 		public var welcome:String;
 		
+		public var meetingID:String;
 		/**
 		 * External unique user id.
 		 */		
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as
index 3dd111ab29c8033f7fdf30a48d09a8fe13af020f..af966d0358ec95ae37e6f316b1342c259f532682 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as
@@ -180,7 +180,7 @@ package org.bigbluebutton.main.model.modules
 			addAttribute("webvoiceconf", conferenceParameters.webvoiceconf);
 			addAttribute("welcome", conferenceParameters.welcome);
 			addAttribute("externUserID", conferenceParameters.externUserID);
-			
+			addAttribute("meetingID", conferenceParameters.meetingID);
 			addAttribute("protocol", protocol);
 			useProtocol(protocol);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as
index 4bf27f9e4e4a38db144b65a43efa3c3f680244f4..de27aa3e84bccded9323ae97334ff7607dd28028 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as
@@ -80,6 +80,7 @@ package org.bigbluebutton.main.model.users
 				_conferenceParameters.webvoiceconf = result.webvoiceconf;
 				_conferenceParameters.voicebridge = result.voicebridge;
 				_conferenceParameters.welcome = result.welcome;
+				_conferenceParameters.meetingID = result.meetingID;
 				_conferenceParameters.externUserID = result.externUserID;
 				_conferenceParameters.logoutUrl = result.logoutUrl;
 				_conferenceParameters.record = true;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
index cdc0af45976a963fcfde96daa5ba96a337fd1746..718a5da456e108fcfe5c5f08e8fd36382ae05fa8 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
@@ -77,9 +77,7 @@
 			import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent;
 			import org.bigbluebutton.util.i18n.ResourceUtil;
 			import org.bigbluebutton.util.logging.Logger;
-			
-			import spark.components.Application;
-			
+	
 			private var globalDispatcher:Dispatcher;
 			
 			private var dispState:String; //full-screen?
@@ -213,11 +211,10 @@
 				var micSettings:MicSettings = MicSettings(PopUpManager.createPopUp(mdiCanvas, MicSettings, true));				
 				var point1:Point = new Point();
 				// Calculate position of TitleWindow in Application's coordinates. 
-				point1.x = 400;
-				point1.y = 300;                
-				point1 = mdiCanvas.localToGlobal(point1);
-				micSettings.x = point1.x + 25;
-				micSettings.y = point1.y + 25;	
+				point1.x = width/2;
+				point1.y = height/2;                
+				micSettings.x = point1.x - (micSettings.width/2);
+				micSettings.y = point1.y - (micSettings.height/2);	
 			}
 			
 	   		private function wrongLocaleVersion():void {
@@ -225,11 +222,10 @@
 
 				var point1:Point = new Point();
 	        	// Calculate position of TitleWindow in Application's coordinates. 
-	        	point1.x = 400;
-	        	point1.y = 300;                
-	        	point1 = mdiCanvas.localToGlobal(point1);
-				localeWindow.x = point1.x + 25;
-				localeWindow.y = point1.y + 25;	
+				point1.x = width/2;
+				point1.y = height/2;              
+				localeWindow.x = point1.x - (localeWindow.width/2);
+				localeWindow.y = point1.y - (localeWindow.height/2);	
             }
 			
 			private function handleLogout(e:ConnectionFailedEvent):void {
@@ -239,11 +235,11 @@
 					
 					var point1:Point = new Point();
 					// Calculate position of TitleWindow in Application's coordinates. 
-					point1.x = 400;
-					point1.y = 300;                
-					point1 = localToGlobal(point1);
-					logoutWindow.x = point1.x + 25;
-					logoutWindow.y = point1.y + 25;	
+					point1.x = width/2;
+					point1.y = height/2;                 
+					logoutWindow.x = point1.x - (logoutWindow.width/2);
+					logoutWindow.y = point1.y - (logoutWindow.height/2);
+					
 					if (e is ConnectionFailedEvent) logoutWindow.setReason((e as ConnectionFailedEvent).type);
 					else logoutWindow.setReason("You have logged out of the conference");	
 					
@@ -313,6 +309,8 @@
            <mx:dataProvider>
               <mx:Array>
 			      <mx:String>Small videos</mx:String>
+				  <mx:String>Presenter + presentation</mx:String>
+				  <mx:String>Meeting</mx:String>
               </mx:Array>
            </mx:dataProvider>
       	</mx:ComboBox>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml
index 1e5cef3ea656d08866e921884f46b56d74e0b054..c53f398b5f4bc87a69e3061d417afcd36734c18c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml
@@ -27,7 +27,7 @@
 			import flexlib.mdi.containers.MDIWindow;
 			
 			import mx.controls.Alert;
-			
+			import mx.utils.ArrayUtil;
 			import org.bigbluebutton.common.IBbbModuleWindow;
 			import org.bigbluebutton.common.LogUtil;
 
@@ -35,8 +35,10 @@
 			public static const BOTTOM_LEFT:String = "BOTTOM_LEFT_WINDOW";
 			public static const MIDDLE:String = "MIDDLE_WINDOW";
 			public static const BOTTOM:String = "BOTTOM_WINDOW";
-			public static const RIGHT:String = "RIGHT_WINDOW";
+			public static const TOP_RIGHT:String = "TOP_RIGHT_WINDOW";
+			public static const BOTTOM_RIGHT:String = "BOTTOM_RIGHT_WINDOW";
 			public static const POPUP:String = "POP_UP_WINDOW";
+			public static const UNTOUCHED:String = "UNTOUCHED_WINDOW";
 			
 			public static const DESKTOP_SHARING_VIEW:String = "POP_UP_DESKSHARE_VIEW";
 			public static const DESKTOP_SHARING_PUBLISH:String = "POP_UP_DESKSHARE_PUBLISH";
@@ -60,7 +62,13 @@
 			}
 			
 			public function removeWindow(window:IBbbModuleWindow):void{
-				windowManager.remove(window as MDIWindow);
+				// the flexlib windowManager remove method doesn't test if the given window is on the windows list
+				// this test avoid some exceptions when run the app on debugger flash player
+				if (ArrayUtil.getItemIndex(window, windowManager.windowList) != -1) {
+					windowManager.remove(window as MDIWindow);
+				} else {
+					LogUtil.debug("Trying to remove the window [ " + window + " ] but it's not a MainCanvas child");
+				}
 			}
 			
 			public function removeAllWindows():void{
@@ -114,12 +122,18 @@
 						win.width = this.width - 5;
 						win.height = 300;
 						break;
-					case RIGHT:
+					case TOP_RIGHT:
 						x = this.width - rightWindowWidth - 10;
 						y = 1;
 						win.width = rightWindowWidth;
 						win.height = rightWindowHeight;
 						break;
+					case BOTTOM_RIGHT:
+						x = this.width - rightWindowWidth - 10;
+						y = rightWindowHeight + 10;;
+						win.width = rightWindowWidth;
+						win.height = this.height - rightWindowHeight - 10;
+						break;					
 					case POPUP:
 						x = (Math.random() * this.width) - 640;
 						y = (Math.random() * this.height) - 520;
@@ -134,6 +148,10 @@
 						x = 1;
 						y = 1;
 						break;
+					case UNTOUCHED:
+						// don't reposition the window
+						x = win.x;
+						y = win.y;
 				}
 				windowManager.absPos(win, x, y);
 			}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml
index dd2fa49d68272b153fd9be2d2a043373b75ed561..f5e9fcfdfa110fe85e7c1b2b48e65614fefbc814 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
-		width="100%" height="100%" creationComplete="initDefaultMic()">
+		width="600" height="300" creationComplete="initDefaultMic()" showCloseButton="true" close="onCancelClicked()">
 	<mx:Script>
 		<![CDATA[
 			import mx.events.ItemClickEvent;
@@ -120,11 +120,10 @@
 			}
 		]]>
 	</mx:Script>
-	<mx:VBox width="100%" height="100%">
+	<mx:VBox width="100%" height="100%"  paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
 		<mx:HBox width="100%">
 			<mx:Spacer width="50%"/>
 			<mx:Spacer width="50%"/>
-			<mx:Button id="cancelBtn" icon="{cancelIcon}" width="20" height="20" toolTip="{ResourceUtil.getInstance().getString('bbb.micSettings.cancel')}" click="onCancelClicked()"/>
 		</mx:HBox>
 		<mx:HBox width="100%" height="20">
 			<mx:Spacer width="50%"/>
@@ -132,12 +131,11 @@
 		</mx:HBox>
 		<mx:HBox width="100%" height="50%">
 			<mx:VBox width="70%" height="100%">
-				<mx:Text text="{ResourceUtil.getInstance().getString('bbb.micSettings.hearFromHeadset')}"/>
+				<mx:Text width="100%" text="{ResourceUtil.getInstance().getString('bbb.micSettings.hearFromHeadset')}"/>
 			</mx:VBox>	
 			<mx:VBox width="50%" height="100%">
 				<mx:Button id="playButton" label="{ResourceUtil.getInstance().getString('bbb.micSettings.playSound')}" 
 						   click="playButtonClickHandler()" toggle="true"/>
-				<mx:Spacer width="100%"/>
 			</mx:VBox>			
 		</mx:HBox>
 		<mx:HBox width="100%" height="20">
@@ -146,17 +144,15 @@
 		</mx:HBox>
 		<mx:HBox width="100%" height="50%">
 			<mx:VBox width="70%" height="100%">
-				<mx:Text text="{ResourceUtil.getInstance().getString('bbb.micSettings.speakIntoMic')}"/>
+				<mx:Text width="100%" text="{ResourceUtil.getInstance().getString('bbb.micSettings.speakIntoMic')}"/>
 			</mx:VBox>			
 			<mx:Spacer width="10%"/>
 			<mx:VBox width="20%" height="100%">		
-				<mx:Spacer width="10%"/>
-				<mx:Label id="mic1Label" text="Microphone Name" />
+				<mx:Text id="mic1Label" text="Microphone Name" />
 				<mx:ProgressBar id="micLevel1" minimum="0" maximum="100"  
 								labelPlacement="right" label=""
 								direction="right" mode="manual" visible="true" width="120"/>				
-				<mx:Button id="settingBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.changeMic')}" click="showMicSettingsPanel()"/>
-				
+				<mx:Button id="settingBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.changeMic')}" click="showMicSettingsPanel()"/>				
 			</mx:VBox>
 		</mx:HBox>	
 		<mx:HBox width="100%" height="20">
@@ -167,7 +163,7 @@
 			<mx:Spacer width="80%"/>
 			<mx:Button id="okBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.join')}" click="onJoinClicked()"/>
 			<mx:Spacer width="10%"/>
-			<mx:LinkButton fontSize="14" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" click="onHelpButtonClicked()"/>
+			<mx:LinkButton fontSize="10" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" click="onHelpButtonClicked()"/>
 		</mx:HBox>
 		<mx:HBox width="100%">
 			<mx:Spacer width="50%"/>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml
index 3e4ae7e9c141465c1d45456995f8b4b7b04bb48d..f247bca29aaa1d89bcb3dff753f9ae72737ae674 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml
@@ -53,7 +53,7 @@
 			[Bindable] public var chatOptions:ChatOptions;
 			
 			public function getPrefferedPosition():String{
-				return MainCanvas.RIGHT;
+				return MainCanvas.TOP_RIGHT;
 			} 
 			
 			private function onCreationComplete():void {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as
new file mode 100755
index 0000000000000000000000000000000000000000..246e5e7ce97670ed4ba48f868eee9766a839ad6a
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as
@@ -0,0 +1,55 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 2.1 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+
+package org.bigbluebutton.modules.videoconf.business
+{
+	import mx.containers.HBox;
+	import mx.controls.Button;
+	import flash.utils.Dictionary;
+	import flash.events.MouseEvent;
+	import org.bigbluebutton.common.LogUtil;
+	
+	public class ButtonsOverlay extends HBox
+	{
+		private var buttons:Dictionary = new Dictionary;
+		private var BUTTONS_SIZE:int = 20;
+		private var BUTTONS_PADDING:int = 10;
+		
+		public function add(name:String, icon:Class, tooltip:String, listener:Function):void {
+			var button:Button = new Button;
+			button.setStyle("icon", icon);
+			button.toolTip = tooltip;
+			button.addEventListener(MouseEvent.CLICK, listener);
+			button.width = button.height = BUTTONS_SIZE;
+			this.addChild(button);
+			buttons[name] = button;
+		}
+		
+		public function get(name:String):Button {
+			var tmp:Object = buttons[name];
+			//return (flash.utils.getQualifiedClassName(tmp) == "mx.controls::Button"? (tmp as Button): null);
+			return (tmp as Button);
+		}
+		
+		public function get padding():int {
+			return BUTTONS_PADDING;
+		}
+	}
+	
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as
new file mode 100755
index 0000000000000000000000000000000000000000..8549329f47a109601f30f0945de3f64b7518fdbc
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as
@@ -0,0 +1,322 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 2.1 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+
+package org.bigbluebutton.modules.videoconf.business
+{
+	import flexlib.mdi.containers.MDIWindow;
+	import flexlib.mdi.events.MDIWindowEvent;
+	
+	import org.bigbluebutton.common.LogUtil;
+	import org.bigbluebutton.common.Images;
+	import org.bigbluebutton.common.IBbbModuleWindow;
+	import org.bigbluebutton.common.events.DragWindowEvent;
+	import org.bigbluebutton.common.events.CloseWindowEvent;
+	import org.bigbluebutton.main.views.MainCanvas;
+	import org.bigbluebutton.util.i18n.ResourceUtil;
+	
+	import mx.core.UIComponent;
+	import mx.controls.Button;	
+	
+	import flash.events.MouseEvent;
+	import flash.media.Video;
+	import flash.geom.Point;
+	
+	public class VideoWindowItf extends MDIWindow implements IBbbModuleWindow
+	{
+		protected var _video:Video;
+		protected var _videoHolder:UIComponent;
+		// images must be static because it needs to be created *before* the PublishWindow creation
+		static protected var images:Images = new Images();
+		
+		static public var PADDING_HORIZONTAL:Number = 6;
+		static public var PADDING_VERTICAL:Number = 29;
+		protected var _minWidth:int = 160 + PADDING_HORIZONTAL;
+		protected var _minHeight:int = 120 + PADDING_VERTICAL;
+		protected var aspectRatio:Number = 1;
+		protected var keepAspect:Boolean = false;
+		protected var originalWidth:Number;
+		protected var originalHeight:Number;
+		
+		protected var mousePositionOnDragStart:Point;
+		
+		public var streamName:String;
+		public var userId:int;
+		[Bindable] public var resolutions:Array;
+		
+		protected function getVideoResolution(stream:String):Array {
+			for each (var resStr:String in resolutions){
+				if (resStr == stream.substr(0, resStr.length))
+					return resStr.split( "x" );
+			}
+			return null;
+		}
+		
+		protected function get paddingVertical():Number {
+			return this.borderMetrics.top + this.borderMetrics.bottom;
+		}
+		
+		protected function get paddingHorizontal():Number {
+			return this.borderMetrics.left + this.borderMetrics.right;
+		}
+		
+		static private var RESIZING_DIRECTION_UNKNOWN:int = 0; 
+		static private var RESIZING_DIRECTION_VERTICAL:int = 1; 
+		static private var RESIZING_DIRECTION_HORIZONTAL:int = 2; 
+		static private var RESIZING_DIRECTION_BOTH:int = 3;
+		private var resizeDirection:int = RESIZING_DIRECTION_BOTH;
+		
+		/**
+		 * when the window is resized by the user, the application doesn't know
+		 * about the resize direction
+		 */
+		public function onResizeStart(event:MDIWindowEvent = null):void {
+			resizeDirection = RESIZING_DIRECTION_UNKNOWN;
+		}
+		
+		/**
+		 * after the resize ends, the direction is set to BOTH because of the
+		 * non-user resize actions - like when the window is docked, and so on
+		 */
+		public function onResizeEnd(event:MDIWindowEvent = null):void {
+			resizeDirection = RESIZING_DIRECTION_BOTH;
+		}
+		
+		protected function onResize():void {
+			if (_video == null || _videoHolder == null || this.minimized) return;
+			
+			// limits the window size to the parent size
+			this.width = (this.parent != null? Math.min(this.width, this.parent.width): this.width);
+			this.height = (this.parent != null? Math.min(this.height, this.parent.height): this.height); 
+			
+			var tmpWidth:Number = this.width - PADDING_HORIZONTAL;
+			var tmpHeight:Number = this.height - PADDING_VERTICAL;
+			
+			// try to discover in which direction the user is resizing the window
+			if (resizeDirection != RESIZING_DIRECTION_BOTH) {
+				if (tmpWidth == _video.width && tmpHeight != _video.height)
+					resizeDirection = (resizeDirection == RESIZING_DIRECTION_VERTICAL || resizeDirection == RESIZING_DIRECTION_UNKNOWN? RESIZING_DIRECTION_VERTICAL: RESIZING_DIRECTION_BOTH);
+				else if (tmpWidth != _video.width && tmpHeight == _video.height)
+					resizeDirection = (resizeDirection == RESIZING_DIRECTION_HORIZONTAL || resizeDirection == RESIZING_DIRECTION_UNKNOWN? RESIZING_DIRECTION_HORIZONTAL: RESIZING_DIRECTION_BOTH);
+				else
+					resizeDirection = RESIZING_DIRECTION_BOTH;
+			}
+			
+			// depending on the direction, the tmp size is different
+			switch (resizeDirection) {
+				case RESIZING_DIRECTION_VERTICAL:
+					tmpWidth = Math.floor(tmpHeight * aspectRatio);
+					break;
+				case RESIZING_DIRECTION_HORIZONTAL:
+					tmpHeight = Math.floor(tmpWidth / aspectRatio);
+					break;
+				case RESIZING_DIRECTION_BOTH:
+					// this direction is used also for non-user window resize actions
+					tmpWidth = Math.min (tmpWidth, Math.floor(tmpHeight * aspectRatio));
+					tmpHeight = Math.min (tmpHeight, Math.floor(tmpWidth / aspectRatio));
+					break;
+			}
+			
+			_video.width = _videoHolder.width = tmpWidth;
+			_video.height = _videoHolder.height = tmpHeight;
+			
+			if (!keepAspect || this.maximized) {
+				// center the video in the window
+				_video.x = Math.floor ((this.width - PADDING_HORIZONTAL - tmpWidth) / 2);
+				_video.y = Math.floor ((this.height - PADDING_VERTICAL - tmpHeight) / 2);
+			} else {
+				// fit window dimensions on video
+				_video.x = 0;
+				_video.y = 0;
+				this.width = tmpWidth + PADDING_HORIZONTAL;
+				this.height = tmpHeight + PADDING_VERTICAL;
+			}
+			
+			// reposition the window to fit inside the parent window
+			if (this.parent != null) {
+				if (this.x + this.width > this.parent.width)
+					this.x = this.parent.width - this.width;
+				if (this.x < 0)
+					this.x = 0;
+				if (this.y + this.height > this.parent.height)
+					this.y = this.parent.height - this.height;
+				if (this.y < 0)
+					this.y = 0;
+			}
+			
+			updateButtonsPosition();
+		}
+		
+		public function updateWidth():void {
+			this.width = Math.floor((this.height - paddingVertical) * aspectRatio) + paddingHorizontal;
+			onResize();
+		}
+		
+		public function updateHeight():void {
+			this.height = Math.floor((this.width - paddingHorizontal) / aspectRatio) + paddingVertical;
+			onResize();
+		}
+		
+		protected function setAspectRatio(width:int,height:int):void {
+			aspectRatio = (width/height);
+			this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL;
+		}
+		
+		public function getPrefferedPosition():String{
+			if (_buttonsEnabled)
+				return MainCanvas.POPUP;
+			else
+				// the window is docked, so it should not be moved on reset layout
+				return MainCanvas.UNTOUCHED;
+		}
+		
+		public function onDrag(event:MDIWindowEvent = null):void {
+			var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG);
+			e.mouseGlobal = this.localToGlobal(new Point(mouseX, mouseY));
+			e.window = this;
+			dispatchEvent(e);
+		}
+		
+		public function onDragStart(event:MDIWindowEvent = null):void {
+			var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG_START);
+			e.window = this;
+			dispatchEvent(e);
+		}
+		
+		public function onDragEnd(event:MDIWindowEvent = null):void {
+			var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG_END);
+			e.mouseGlobal = this.localToGlobal(new Point(mouseX, mouseY));
+			e.window = this;
+			dispatchEvent(e);
+		}
+		
+		override public function close(event:MouseEvent = null):void{
+			var e:CloseWindowEvent = new CloseWindowEvent();
+			e.window = this;
+			dispatchEvent(e);
+			
+			super.close(event);
+		}
+		
+		private var _buttons:ButtonsOverlay = null;
+		private var _buttonsEnabled:Boolean = true;
+		
+		private var img_unlock_keep_aspect:Class = images.lock_open;
+		private var img_lock_keep_aspect:Class = images.lock_close;
+		private var img_fit_video:Class = images.arrow_in;
+		private var img_original_size:Class = images.shape_handles;
+		
+		protected function get buttons():ButtonsOverlay {
+			if (_buttons == null) {
+				_buttons = new ButtonsOverlay;
+				_buttons.add("originalSizeBtn", img_original_size, ResourceUtil.getInstance().getString('bbb.video.originalSizeBtn.tooltip'), onOriginalSizeClick);
+				
+				// hiding the other buttons
+				//_buttons.add("keepAspectBtn", img_lock_keep_aspect, ResourceUtil.getInstance().getString('bbb.video.keepAspectBtn.tooltip'), onKeepAspectClick);
+				//_buttons.add("fitVideoBtn", img_fit_video, ResourceUtil.getInstance().getString('bbb.video.fitVideoBtn.tooltip'), onFitVideoClick);
+				
+				_buttons.visible = false;
+				
+				this.addChild(_buttons);
+			} 
+			return _buttons;
+		}
+		
+		protected function createButtons():void {
+			// creates the window keeping the aspect ratio 
+			onKeepAspectClick();
+		}
+		
+		protected function updateButtonsPosition():void {
+			if (buttons.visible == false) {
+				buttons.y = buttons.x = 0;
+			} else {
+				buttons.y = _video.y + _video.height - buttons.height - buttons.padding;
+				buttons.x = _video.x + _video.width - buttons.width - buttons.padding;
+			}
+		}
+		
+		protected function showButtons(event:MouseEvent = null):void {
+			if (_buttonsEnabled && buttons.visible == false) {
+				buttons.visible = true;
+				updateButtonsPosition();
+			}
+		}
+		
+		protected function hideButtons(event:MouseEvent = null):void {
+			if (_buttonsEnabled && buttons.visible == true) {
+				buttons.visible = false;
+				updateButtonsPosition();
+			}
+		}
+		
+		protected function onDoubleClick(event:MouseEvent = null):void {
+			// it occurs when the window is docked, for example
+			if (!this.maximizeRestoreBtn.visible) return;
+			
+			this.maximizeRestore();
+		}
+		
+		override public function maximizeRestore(event:MouseEvent = null):void {
+			// if the user is maximizing the window, the control buttons should disappear
+			buttonsEnabled = this.maximized;
+			super.maximizeRestore(event);
+		}
+		
+		public function set buttonsEnabled(enabled:Boolean):void {
+			if (!enabled) 
+				hideButtons();
+			_buttonsEnabled = enabled;
+		}
+		
+		protected function onOriginalSizeClick(event:MouseEvent = null):void {
+			_video.width = _videoHolder.width = originalWidth;
+			_video.height = _videoHolder.height = originalHeight;
+			onFitVideoClick();
+		}		
+		
+		protected function onFitVideoClick(event:MouseEvent = null):void {
+			var newWidth:int = _video.width + paddingHorizontal;
+			var newHeight:int = _video.height + paddingVertical;
+			
+			this.x += (this.width - newWidth)/2;
+			this.y += (this.height - newHeight)/2;
+			this.width = newWidth;
+			this.height = newHeight;
+			onResize();
+		}
+		
+		protected function onKeepAspectClick(event:MouseEvent = null):void {
+			keepAspect = !keepAspect;
+			
+			var keepAspectBtn:Button = buttons.get("keepAspectBtn");
+			if (keepAspectBtn != null) { 
+				keepAspectBtn.selected = keepAspect;
+				keepAspectBtn.setStyle("icon", (keepAspect? img_lock_keep_aspect: img_unlock_keep_aspect));
+			}
+			
+			var fitVideoBtn:Button = buttons.get("fitVideoBtn");
+			if (fitVideoBtn != null) {
+				fitVideoBtn.enabled = !keepAspect;
+			}		
+			
+			onFitVideoClick();
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as
new file mode 100755
index 0000000000000000000000000000000000000000..1fe01c195174918cf3c564d62362ed9ca43bbfec
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as
@@ -0,0 +1,44 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 2.1 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+ * 
+ */
+package org.bigbluebutton.modules.videoconf.events
+{
+	import flash.events.Event;
+	
+	import org.bigbluebutton.common.IBbbModuleWindow;
+	
+	/**
+	 * Dispatch this event with your IBbbModuleWindow instance attached to add the MDIWindow to the main canvas area of bbb-client.
+	 * 
+	 */	
+	public class OpenVideoWindowEvent extends Event
+	{
+		/**
+		 * The MDIWindow instance to show on the main canvas 
+		 */		
+		public var window:IBbbModuleWindow;
+		
+		public static const OPEN_VIDEO_WINDOW_EVENT:String = 'OPEN_VIDEO_WINDOW_EVENT';
+		
+		public function OpenVideoWindowEvent(type:String=OPEN_VIDEO_WINDOW_EVENT, bubbles:Boolean=true, cancelable:Boolean=false)
+		{
+			super(type, bubbles, cancelable);
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml
index 3ccb4a2803c0ab95cef36a23b897cdd642da9f56..0d3f0591a3dd1dfd3eaa040c5a00048ea19d9bf2 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml
@@ -39,6 +39,7 @@
 			import org.bigbluebutton.modules.videoconf.business.VideoProxy;
 			import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent;
 			import org.bigbluebutton.modules.videoconf.events.OpenPublishWindowEvent;
+			import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent;
 			import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent;
 			import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent;
 			import org.bigbluebutton.modules.videoconf.views.PublishWindow;
@@ -70,6 +71,11 @@
 				var windowEvent:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT);
 				windowEvent.window = window;
 				globalDispatcher.dispatchEvent(windowEvent);
+				
+				// this event will dock the window, if it's enabled
+				var openVideoEvent:OpenVideoWindowEvent = new OpenVideoWindowEvent();
+				openVideoEvent.window = window;
+				globalDispatcher.dispatchEvent(openVideoEvent);
 			}
 
 			private function viewVideoFile(e:BBBEvent):void {
@@ -93,7 +99,7 @@
 			private function openPublishWindow():void{
 				publishWindow = new PublishWindow();
 				publishWindow.videoOptions = proxy.videoOptions;
-				publishWindow.streamName = "-" + module.userid.toString();
+				publishWindow.userId = module.userid;
 				publishWindow.userrole = module.role;
 				publishWindow.quality = module.quality;
 				publishWindow.resolutions = module.resolutions.split(",");
@@ -110,6 +116,7 @@
 				broadcastEvent.stream = e.stream;
 				broadcastEvent.userid = module.userid;
 				globalDispatcher.dispatchEvent(broadcastEvent);
+				publishWindow.title = module.username + " (you)";
 			}
 			
 			private function stopPublishing(e:StopBroadcastEvent):void{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml
index cb1a815582f0fc5525f88aca612d1d2f22ccf93d..c2ce6e8cec2f60cef62f154320616a95da77b7b6 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml
@@ -20,20 +20,23 @@
   $Id: $
 --> 
 
-<pubVid:MDIWindow xmlns="flexlib.mdi.containers.*" 
+<pubVid:VideoWindowItf xmlns="org.bigbluebutton.modules.videoconf.business.*"
 	xmlns:mx="http://www.adobe.com/2006/mxml" 
-	xmlns:pubVid="flexlib.mdi.containers.*"
+	xmlns:pubVid="org.bigbluebutton.modules.videoconf.business.*"
 	implements="org.bigbluebutton.common.IBbbModuleWindow"
 	creationComplete="init()"
 	width="{camWidth + 6}" height="{camHeight + 80}" 
-	title="{ResourceUtil.getInstance().getString('bbb.publishVideo.title')}" 
 	xmlns:mate="http://mate.asfusion.com/"
-	resize="onResize()">
+	resize="onResize()"
+	horizontalScrollPolicy="off"
+	verticalScrollPolicy="off"
+	layout="absolute">
 	
 	<mx:Script>
 		<![CDATA[
 			import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
 			import org.bigbluebutton.common.LogUtil;
+			import org.bigbluebutton.common.events.CloseWindowEvent;
 			import flexlib.mdi.events.MDIWindowEvent;
 			
 			import mx.core.UIComponent;
@@ -43,34 +46,20 @@
 			import org.bigbluebutton.common.LogUtil;
 			import org.bigbluebutton.common.events.LocaleChangeEvent;
 			import org.bigbluebutton.main.views.MainCanvas;
+			import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent;
 			import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent;
 			import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent;
 			import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent;
 			import org.bigbluebutton.util.i18n.ResourceUtil;
 			
-			private var images:Images = new Images();
 			[Bindable] public var camIcon:Class = images.control_play;
 			[Bindable] public var bbbLogo:Class = images.bbb_logo;
-			[Bindable] public var resolutions:Array = new Array("320x240", "640x480");
-			
-			private var video:Video;
-			public var streamName:String;
+
 			[Bindable] private var camWidth:Number = 320;
 			[Bindable] private var camHeight:Number = 240;
 			private var _userrole:String;
 			public var quality:Number = 0;
-			
-			private var _bResizePossible:Boolean = true;
-			private var _nAspectRatio:Number = 1;
-			
-			static private var _minWidth:int = 86;
-			static private var _minHeight:int = 174;
-
-			private var _nSavedVideoWidth:Number = 0;
-			private var _nSavedVideoHeight:Number = 0;
-			private var _nOldWindowWidth:Number = 0;
-			private var _nOldWindowHeight:Number = 0;
-			
+						
 			// Timer to auto-publish webcam. We need this timer to delay
 			// the auto-publishing until after the Viewers's window has loaded
 			// to receive the publishing events. Otherwise, the user joining next
@@ -81,14 +70,16 @@
 			public var videoOptions:VideoConfOptions;
 			
 			private function init():void{
+				_videoHolder = new UIComponent();
+				_videoHolder.width = camWidth;
+				_videoHolder.height = camHeight;
+				this.addChild(_videoHolder);				
+				this.title = ResourceUtil.getInstance().getString('bbb.publishVideo.title');
+
 				checkIfMacCamera();
 				if (isPresenter()) showResControls(true);
 				if (Camera.names.length > 1) showVideoControls(true);
 				if (!isPresenter() && Camera.names.length == 1) startPublishing();
-				addEventListener(MDIWindowEvent.RESIZE_END, onResizeEvent);
-				addEventListener(MDIWindowEvent.RESIZE, onResizeEvent);
-				addEventListener(MDIWindowEvent.MAXIMIZE, onMaximize);
-				addEventListener(MDIWindowEvent.RESTORE, onRestore);
 
 				this.minWidth = _minWidth;
 				this.minHeight = _minHeight;
@@ -121,11 +112,7 @@
 					if (Camera.names[i] == webcam) cmbCameraSelector.selectedIndex = i;
 				}
 			}
-			
-			public function getPrefferedPosition():String{
-				return MainCanvas.POPUP;
-			}
-			
+						
 			private function startPublishing():void{
 				var camera:Camera = Camera.getCamera(cmbCameraSelector.selectedIndex.toString());
 				if (camera == null) return;
@@ -136,13 +123,13 @@
 				camera.setMode(camWidth, camHeight, videoOptions.camModeFps);
 				camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture);
 				
-				video = new Video(camWidth, camHeight);
+				_video = new Video(camWidth, camHeight);
 				//Next two lines may seem redundant but they're not. Do not delete.
-				video.width = camWidth;
-				video.height = camHeight;
-				adjustWindowSize();
-				video.attachCamera(camera);
-				videoHolder.addChild(video);
+				_video.width = camWidth;
+				_video.height = camHeight;
+				onResize();
+				_video.attachCamera(camera);
+				_videoHolder.addChild(_video);
 //				addChild(videoHolder);
 				
 				var e:StartBroadcastEvent = new StartBroadcastEvent();
@@ -155,6 +142,22 @@
 
 				maximizeRestoreBtn.visible = true;
 				this.resizable = true;
+				
+				addEventListener(MDIWindowEvent.RESIZE_START, onResizeStart);
+				addEventListener(MDIWindowEvent.RESIZE_END, onResizeEnd);
+				addEventListener(MDIWindowEvent.DRAG_START, onDragStart);
+				addEventListener(MDIWindowEvent.DRAG, onDrag);
+				addEventListener(MDIWindowEvent.DRAG_END, onDragEnd);
+				addEventListener(MouseEvent.MOUSE_OVER, showButtons);
+				addEventListener(MouseEvent.MOUSE_OUT, hideButtons);
+				addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);
+				
+				createButtons();
+				
+				// this event will dock the window, if it's enabled
+				var openVideoEvent:OpenVideoWindowEvent = new OpenVideoWindowEvent();
+				openVideoEvent.window = this;
+				dispatchEvent(openVideoEvent);					
 			}
 			
 			override public function close(event:MouseEvent=null):void{
@@ -163,28 +166,28 @@
 			}
 			
 			private function stopPublishing():void{
-				if (video != null) {
-					video.attachCamera(null);
-					video.clear();
-					video = null;
+				if (_video != null) {
+					_video.attachCamera(null);
+					_video.clear();
+					_video = null;
 				}
 				var e:StopBroadcastEvent = new StopBroadcastEvent()
-				e.stream = this.streamName;
+				e.stream = streamName;
 				dispatchEvent(e);
 			}
 			
 			private function setResolution():void{
 				var res:Array = cmbResolution.selectedLabel.split( "x" );
-				camWidth = Number(res[0]);
-				camHeight = Number(res[1]);
-				_nAspectRatio = (camWidth/camHeight);
+				camWidth = originalWidth = Number(res[0]);
+				camHeight = originalHeight = Number(res[1]);
+				setAspectRatio(camWidth, camHeight);
 				
  				/**
          		* Add timestamp to create a unique stream name. This way we can record	 	
          		* stream without overwriting previously recorded streams.	 	
          		*/	 	
 				var curTime:Number = new Date().getTime();	 	
-        		this.streamName = cmbResolution.selectedLabel.concat(this.streamName) + "-" + curTime;
+        		this.streamName = cmbResolution.selectedLabel.concat(this.userId) + "-" + curTime;
 			}
 			
 			public function set userrole(role:String):void{
@@ -203,9 +206,12 @@
 					cmbCameraSelector.visible = true;
 				} else{					
 					videoOptionsBar.visible = false;
+					videoOptionsBar.width = 0;
+					videoOptionsBar.height = 0;
 					btnStartPublish.visible = false;
 					cmbCameraSelector.visible = false;
 					videoOptionsBar.visible = false;
+					
 				}
 			}
 			
@@ -233,146 +239,19 @@
 				}
 			}
 			
-			private function adjustWindowSize():void{
-				videoHolder.width = video.width;
-				videoHolder.height = video.height;
-				this.width = video.width + 6;
-				this.height = video.height + 74;
-				
-				// prevent to show a video window bigger than the parent window
-				if (this.width > this.parent.width) {
-					video.width = this.parent.width - 6;
-					video.height = Math.floor(video.width / _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.height > this.parent.height) {
-					video.height = this.parent.height - 74;
-					video.width = Math.floor(video.height * _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.width < _minWidth) {
-					video.width = _minWidth - 6;
-					video.height = Math.floor(video.width / _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.height < _minHeight) {
-					video.height = _minHeight - 74;
-					video.width = Math.floor(video.height * _nAspectRatio);
-					adjustWindowSize();
-				}
-			}			
-			
-			public function onResizeEvent(event:MDIWindowEvent):void {
-				if (event.type == MDIWindowEvent.RESIZE) {
-					// test if we are already resizing
-					if (_bResizePossible) {
-						_bResizePossible = false;
-						resizeWindow();
-						_bResizePossible = true;
-					}
-				} else if (event.type == MDIWindowEvent.RESIZE_END) {
-					adjustWindowSize();
-				}
-			}
-			
-			private function resizeWindow():void {
-				// prevent the window for blinking
-				if (this.width == _nOldWindowWidth && this.height == _nOldWindowHeight) {
-					adjustWindowSize();
-					return;
-				}
-
-				_nOldWindowWidth = this.width;
-				_nOldWindowHeight = this.height;
-
-				if (this.width == video.width + 6) {
-					// if it's a vertical resizing
-					video.height = this.height - 74;
-					video.width = video.height * _nAspectRatio;
-				} else {
-					// if it's a horizontal resizing
-					video.width = this.width - 6;
-					video.height  = Math.floor (video.width / _nAspectRatio);
-				}
-				adjustWindowSize();
-			}
-			
-			public function onMaximize(event:MDIWindowEvent):void {
-				_nSavedVideoWidth = video.width;
-				_nSavedVideoHeight = video.height;
-			
-			
-				var tmpWidth:Number = this.parent.width - 6;
-				var tmpHeight:Number = this.parent.height - 74;
-
-				if (tmpWidth > tmpHeight * _nAspectRatio)
-					tmpWidth = tmpHeight * _nAspectRatio;
-				if (tmpHeight > Math.floor(tmpWidth / _nAspectRatio))
-					tmpHeight = Math.floor(tmpWidth / _nAspectRatio);
-				
-				video.width = tmpWidth;
-				video.height = tmpHeight;
-				
-				video.x = Math.floor ((this.parent.width - 6 - video.width) / 2);
-				video.y = Math.floor ((this.parent.height - 74 - video.height) / 2);
-			}
-			
-			public function onRestore(event:MDIWindowEvent):void {
-				video.x = 0;
-				video.y = 0;
-				video.width = _nSavedVideoWidth;
-				video.height = _nSavedVideoHeight;
-				adjustWindowSize();
-			}
-
-			public function setWindowWidth(width:int):void {
-				if (video == null) return;
-				
-				video.width = width - 6;
-				video.height = Math.floor(video.width / _nAspectRatio);
-				adjustWindowSize();
-			}
-			
-			static public function getMinWidth():int {
-				return _minWidth;
-			}
-		
-			static public function getMinHeight():int {
-				return _minHeight;
-			}
-			
-			static public function getWindowHeightByWidth(width:int, aspect:Number):int {
-				return Math.floor((width - 6) / aspect) + 74;
-			}
-			
-			static public function getWindowWidthByHeight(height:int, aspect:Number):int {
-				return Math.floor((height - 74) * aspect) + 6;
-			}
-
 			override protected function resourcesChanged():void{
 				super.resourcesChanged();
-				this.title = ResourceUtil.getInstance().getString('bbb.publishVideo.title');
-			}
-			
-			private function localeChanged(e:LocaleChangeEvent):void{
-				resourcesChanged();
-			}
-			
-			private function onResize():void{
-				setWindowWidth(this.width);
-			}
-			
+			}		
+
 		]]>
 	</mx:Script>
-	
-	<mx:UIComponent id="videoHolder" width="{camWidth}" height="{camHeight}" />
-	
+
+	<mx:UIComponent id="videoHolder" width="{camWidth}" height="{camHeight}" />	
 	<mx:ControlBar id="videoOptionsBar" visible="true">
 		<mx:Button id="btnStartPublish" toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.toolTip')}" icon="{camIcon}" click="startPublishing()" />
 		<mx:ComboBox id="cmbCameraSelector" dataProvider="{Camera.names}" width="150" visible="false" />
 		<mx:ComboBox id="cmbResolution" dataProvider="{resolutions}" width="20%" visible="false" />
 	</mx:ControlBar>
-
+	
 	<mate:Listener type="{CloseAllWindowsEvent.CLOSE_ALL_WINDOWS}" method="closeWindow" />
-	<mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" />
-</pubVid:MDIWindow>
+</pubVid:VideoWindowItf>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml
index e61ca42c3cfceda71d875661f4d25c4998617b21..05308984e06721d884f1e0b36eea3b1a8c762338 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml
@@ -20,66 +20,50 @@
   $Id: $
 -->
 
-<MDIWindow xmlns="flexlib.mdi.containers.*" 
+<VideoWindowItf xmlns="org.bigbluebutton.modules.videoconf.business.*" 
 	xmlns:mx="http://www.adobe.com/2006/mxml" 
 	creationComplete="init()" 
 	implements="org.bigbluebutton.common.IBbbModuleWindow"
 	xmlns:mate="http://mate.asfusion.com/"
-	resize="onResize()">
+	resize="onResize()"
+	layout="absolute">
 	
 	<mx:Script>
 		<![CDATA[
-			import com.asfusion.mate.events.Dispatcher;
-			
-			import flexlib.mdi.events.MDIWindowEvent;
-			
+			import com.asfusion.mate.events.Dispatcher;			
+			import flexlib.mdi.events.MDIWindowEvent;			
 			import mx.controls.Alert;
-			import mx.core.UIComponent;
-			
+			import mx.core.UIComponent;			
 			import org.bigbluebutton.common.LogUtil;
 			import org.bigbluebutton.main.events.BBBEvent;
 			import org.bigbluebutton.main.views.MainCanvas;
 			import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent;
+			import org.bigbluebutton.common.events.CloseWindowEvent;
 			import org.bigbluebutton.modules.videoconf.model.VideoConfOptions;
-		
-			public var resolutions:Array = new Array("320x240", "640x480");
-			
-			private var video:Video;
-			private var ns:NetStream;
-			private var videoHolder:UIComponent;
-			private var stream:String;
-			private var videoHeight:Number;
-			private var videoWidth:Number;
-
-			private var _bResizePossible:Boolean = true;
-			private var _nAspectRatio:Number = 1;
-
-			static private var _minWidth:int = 166;
-			static private var _minHeight:int = 149;
-
-			private var _nSavedVideoWidth:Number = 0;
-			private var _nSavedVideoHeight:Number = 0;
-			private var _nOldWindowWidth:Number = 0;
-			private var _nOldWindowHeight:Number = 0;
-							
-			private var _xPosition:int;
-			private var _yPosition:int;
-			
+					
+			private var ns:NetStream;			
 			private var globalDispatcher:Dispatcher;
 
 			[Bindable]
 			public var videoOptions:VideoConfOptions;
 			
 			private function init():void{
-				videoHolder = new UIComponent();
-				videoHolder.addChild(video);
-				this.addChild(videoHolder);
+				_videoHolder = new UIComponent();
+				_videoHolder.addChild(_video);
+				this.addChild(_videoHolder);
 				
-				addEventListener(MDIWindowEvent.RESIZE_END, onResizeEvent);
-				addEventListener(MDIWindowEvent.RESIZE, onResizeEvent);
-				addEventListener(MDIWindowEvent.MAXIMIZE, onMaximize);
-				addEventListener(MDIWindowEvent.RESTORE, onRestore);
+				addEventListener(MDIWindowEvent.RESIZE_START, onResizeStart);
+				addEventListener(MDIWindowEvent.RESIZE_END, onResizeEnd);
 				addEventListener(MDIWindowEvent.CLOSE, onCloseEvent);
+
+				addEventListener(MDIWindowEvent.DRAG_START, onDragStart);
+				addEventListener(MDIWindowEvent.DRAG, onDrag);
+				addEventListener(MDIWindowEvent.DRAG_END, onDragEnd);
+				addEventListener(MouseEvent.MOUSE_OVER, showButtons);
+				addEventListener(MouseEvent.MOUSE_OUT, hideButtons);
+				addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);
+				
+				createButtons();
 				
 				globalDispatcher = new Dispatcher();
 
@@ -87,14 +71,24 @@
 				this.minHeight = _minHeight;
 				maximizeRestoreBtn.visible = true;
 				this.resizable = true;
+				
+				/**
+				 *  At this point, the function startVideo has been called, and 
+				 *   the video has the exactly dimensions of the original stream.
+				 *  It's needed to call onResize() to fit the video window in the
+				 *  main canvas in case that the video dimensions are larger than
+				 *  the parent window. 
+				 */
+				onResize();				
+				
 				if (videoOptions.viewerWindowMaxed)
 					this.maximize();
 			}
 			
 			private function onCloseEvent(event:MDIWindowEvent = null):void {
-				LogUtil.debug("ViewWindow closing " + stream);
+				LogUtil.debug("ViewWindow closing " + streamName);
 				var bbbEvt:BBBEvent = new BBBEvent("ViewVideoCloseEvent");
-				bbbEvt.message = stream;
+				bbbEvt.message = streamName;
 				dispatchEvent(bbbEvt);
 			}
 			
@@ -107,58 +101,43 @@
 				ns.receiveVideo(true);
 				ns.receiveAudio(false);
 				
-				setVideoResolution(stream);
-				video = new Video(this.width, this.height);
-				video.width = this.width;
-				video.height = this.height;
-				video.attachNetStream(ns);
-				ns.play(stream);	
-				this.stream = stream;
-
-				this.width = video.width + 6;
-				this.height = video.height + 29;
-			}
-			
-			private function setVideoResolution(stream:String):void{
-				for each (var resStr:String in resolutions){
-					LogUtil.debug("VideoWindow::setVideoResolution testing " + resStr);
-					if (resStr == stream.substr(0, resStr.length)) {
-						var res:Array = resStr.split( "x" );
-						this.width = Number(res[0]);
-						this.height = Number(res[1]);
-						LogUtil.debug("VideoWindow::setVideoResolution width=" + this.width + " height=" + this.height);
-						_nAspectRatio = (this.width/this.height);
-						break;
-					}
-				}
+				var res:Array = getVideoResolution(stream);
+				if (res == null) // error
+					return;
+				_video = new Video(Number(res[0]), Number(res[1]));
+				_video.width = originalWidth = Number(res[0]);
+				_video.height = originalHeight = Number(res[1]);
+				setAspectRatio(Number(res[0]), Number(res[1])); 
+				_video.attachNetStream(ns);
+				ns.play(stream);
+				this.streamName = stream;
+				
+				this.width = _video.width + paddingHorizontal;
+				this.height = _video.height + paddingVertical;	
 			}
-			
+						
 			private function onAsyncError(e:AsyncErrorEvent):void{
 				LogUtil.debug("VideoWindow::asyncerror " + e.toString());
 			}
 			
 			public function onMetaData(info:Object):void{
 				LogUtil.debug("metadata: width=" + info.width + " height=" + info.height);
-				video.width = info.width;
-				video.height = info.height;
-				adjustWindowSize();
-			}
-			
-			public function getPrefferedPosition():String {
-				if (videoOptions.viewerWindowLocation == "MIDDLE") {
-					return MainCanvas.MIDDLE;
-				}
-				return MainCanvas.POPUP;
+				_video.width = info.width;
+				_video.height = info.height;
+				setAspectRatio(info.width, info.height);
+				onResize();
 			}
-			
+						
 			private function onNetStatus(e:NetStatusEvent):void{
 				switch(e.info.code){
 					case "NetStream.Publish.Start":
-						LogUtil.debug("NetStream.Publish.Start for broadcast stream " + stream);
+						LogUtil.debug("NetStream.Publish.Start for broadcast stream " + streamName);
 						break;
 					case "NetStream.Play.UnpublishNotify":
 						ns.close();
 						this.close();
+						// shouldn't call onCloseEvent() here because of the viewer cam icon
+						super.close();
 						break;
 					case "NetStream.Play.Start":
 						LogUtil.debug("Netstatus: " + e.info.code);
@@ -175,131 +154,16 @@
 			
 			override public function close(event:MouseEvent=null):void{
 				ns.close();
-				//onCloseEvent();
+				onCloseEvent();
 				super.close(event);
 			}		
 			
 			private function closeWindow(e:CloseAllWindowsEvent):void{
 				this.close();
 			}
-			
-			private function adjustWindowSize():void{
-				if (videoHolder == null) return; 
-				
-				videoHolder.width = video.width;
-				videoHolder.height = video.height;
-				this.width = video.width + 6;
-				this.height = video.height + 29;
-				
-				// prevent to show a video window bigger than the parent window
-				if (this.width > this.parent.width) {
-					video.width = this.parent.width - 6;
-					video.height = Math.floor(video.width / _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.height > this.parent.height) {
-					video.height = this.parent.height - 29;
-					video.width = Math.floor(video.height * _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.width < _minWidth) {
-					video.width = _minWidth - 6;
-					video.height = Math.floor(video.width / _nAspectRatio);
-					adjustWindowSize();
-				}
-				if (this.height < _minHeight) {
-					video.height = _minHeight - 29;
-					video.width = Math.floor(video.height * _nAspectRatio);
-					adjustWindowSize();
-				}
-			}			
-			
-			public function onResizeEvent(event:MDIWindowEvent):void {
-				if (event.type == MDIWindowEvent.RESIZE) {
-					// test if we are already resizing
-					if (_bResizePossible) {
-						_bResizePossible = false;
-						resizeWindow();
-						_bResizePossible = true;
-					}
-				} else if (event.type == MDIWindowEvent.RESIZE_END) {
-					adjustWindowSize();
-				}
-			}
-			
-			private function resizeWindow():void {
-				// prevent the window for blinking
-				if (this.width == _nOldWindowWidth && this.height == _nOldWindowHeight) {
-					adjustWindowSize();
-					return;
-				}
-
-				_nOldWindowWidth = this.width;
-				_nOldWindowHeight = this.height;
-
-				if (this.width == video.width + 6) {
-					// if it's a vertical resizing
-					video.height = this.height - 29;
-					video.width = video.height * _nAspectRatio;
-				} else {
-					// if it's a horizontal resizing
-					video.width = this.width - 6;
-					video.height  = Math.floor (video.width / _nAspectRatio);
-				}
-
-				adjustWindowSize();
-			}
-			
-			public function onMaximize(event:MDIWindowEvent):void {
-				_nSavedVideoWidth = video.width;
-				_nSavedVideoHeight = video.height;
-			
-			
-				var tmpWidth:Number = this.parent.width - 6;
-				var tmpHeight:Number = this.parent.height - 29;
-
-				if (tmpWidth > tmpHeight * _nAspectRatio)
-					tmpWidth = tmpHeight * _nAspectRatio;
-				if (tmpHeight > Math.floor(tmpWidth / _nAspectRatio))
-					tmpHeight = Math.floor(tmpWidth / _nAspectRatio);
-				
-				video.width = tmpWidth;
-				video.height = tmpHeight;
-				
-				video.x = Math.floor ((this.parent.width - 6 - video.width) / 2);
-				video.y = Math.floor ((this.parent.height - 29 - video.height) / 2);
-			}
-			
-			public function onRestore(event:MDIWindowEvent):void {
-				video.x = 0;
-				video.y = 0;
-				video.width = _nSavedVideoWidth;
-				video.height = _nSavedVideoHeight;
-				adjustWindowSize();
-			}
-			
-			public function setWindowWidth(width:int):void {
-				if (video == null) return;
-				
-				video.width = width - 6;
-				video.height = Math.floor(video.width / _nAspectRatio);
-				adjustWindowSize();
-			}
-			
-			static public function getMinWidth():int {
-				return _minWidth;
-			}
-		
-			static public function getMinHeight():int {
-				return _minHeight;
-			}
-			
-			private function onResize():void{
-				setWindowWidth(this.width);
-			}
-
+												
 		]]>
 	</mx:Script>
 	
 	<mate:Listener type="{CloseAllWindowsEvent.CLOSE_ALL_WINDOWS}" method="closeWindow" />
-</MDIWindow>
+</VideoWindowItf>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml
new file mode 100755
index 0000000000000000000000000000000000000000..28b17f7750bbf172c9bf31683f62a4c9bfc9179e
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+BigBlueButton open source conferencing system - http://www.bigbluebutton.org
+
+Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+
+BigBlueButton is free software; you can redistribute it and/or modify it under the 
+terms of the GNU Lesser General Public License as published by the Free Software 
+Foundation; either version 2.1 of the License, or (at your option) any later 
+version. 
+
+BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY 
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
+PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along 
+with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+
+$Id: $
+-->
+
+<EventMap xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="http://mate.asfusion.com/">
+	<mx:Script>
+		<![CDATA[
+			import org.bigbluebutton.common.LogUtil;
+			import org.bigbluebutton.common.events.OpenWindowEvent;
+			import org.bigbluebutton.common.events.CloseWindowEvent;
+			
+			import org.bigbluebutton.modules.videodock.views.VideoDock;
+			
+			public var module:VideodockModule;
+			private var videoDock:VideoDock;
+			
+			public function startModule():void{
+				videoDock = new VideoDock();
+				videoDock.autoDock = module.autoDock;
+				
+				var windowEvent:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT);
+				windowEvent.window = videoDock;
+				globalDispatcher.dispatchEvent(windowEvent);
+			}
+			
+			public function stopModule():void {
+				videoDock.removeAllChildren();
+			}
+			
+		]]>
+	</mx:Script>
+	
+</EventMap>
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml
new file mode 100755
index 0000000000000000000000000000000000000000..4b9e09059a1efed71c6f598dba038651a4ec47ff
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+BigBlueButton open source conferencing system - http://www.bigbluebutton.org
+
+Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below).
+
+BigBlueButton is free software; you can redistribute it and/or modify it under the 
+terms of the GNU Lesser General Public License as published by the Free Software 
+Foundation; either version 2.1 of the License, or (at your option) any later 
+version. 
+
+BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY 
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
+PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along 
+with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
+
+$Id: $
+-->
+
+<MDIWindow xmlns="flexlib.mdi.containers.*" 
+		   xmlns:mx="http://www.adobe.com/2006/mxml" 
+		   creationComplete="init()" 
+		   implements="org.bigbluebutton.common.IBbbModuleWindow"
+		   title="{ResourceUtil.getInstance().getString('bbb.videodock.title')}"
+		   xmlns:mate="http://mate.asfusion.com/"
+		   layout="absolute"
+		   horizontalAlign="center"
+		   verticalAlign="middle"
+		   resize="onChildAdd()"
+		   backgroundColor="0xDDDDDD">
+	
+	<mx:Script>
+		<![CDATA[
+			
+			import org.bigbluebutton.common.LogUtil;
+			import org.bigbluebutton.common.events.DragWindowEvent;
+			import org.bigbluebutton.common.events.OpenWindowEvent;
+			import org.bigbluebutton.common.events.CloseWindowEvent;
+			import org.bigbluebutton.main.views.MainCanvas;
+			import org.bigbluebutton.modules.videoconf.business.VideoWindowItf;
+			import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent;
+			import org.bigbluebutton.util.i18n.ResourceUtil;
+			
+			import mx.events.ChildExistenceChangedEvent;
+			
+			public var autoDock:Boolean = false;
+			private var childrenDimension:Dictionary = new Dictionary();
+			private var borderColor:String;
+			
+			private function init():void{
+				this.showCloseButton = false;
+				
+				this.minWidth = 172;
+				this.minHeight = 179;
+				this.maxWidth = this.parent.width;
+				this.maxHeight = this.parent.height;
+				
+				this.width = this.minWidth;
+				this.height = this.minHeight;
+				
+				addEventListener(ChildExistenceChangedEvent.CHILD_ADD, onChildAdd);			
+				addEventListener(ChildExistenceChangedEvent.CHILD_REMOVE, onChildRemove);
+				addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);
+			}
+			
+			private function onChildAdd(e:ChildExistenceChangedEvent = null):void {
+				updateChildrenDimensions(this.getChildren());
+			}
+			
+			private function onChildRemove(e:ChildExistenceChangedEvent = null):void {
+				// copy the children array to "remove" the removing child and update the dimensions correctly
+				var children:Array = this.getChildren();
+				var index:int = children.indexOf(e.relatedObject);
+				if (index != -1)
+					children.splice(index, 1);
+				updateChildrenDimensions(children);
+			}
+			
+			public function getPrefferedPosition():String{
+				return MainCanvas.BOTTOM_RIGHT;
+			}
+			
+			private function onDragVideoWindow(e:DragWindowEvent):void{
+				switch (e.mode) {
+					case DragWindowEvent.DRAG:
+						if (hitTestPoint(e.mouseGlobal.x, e.mouseGlobal.y, true)) {
+							setStyle("borderColor","0xFF0000");
+							e.window.width = e.window.minWidth;
+							e.window.height = e.window.minHeight;
+						} else {
+							setStyle("borderColor",borderColor);
+							restoreWindowDimensions(e.window);
+						}
+						break;
+					case DragWindowEvent.DRAG_START:
+						borderColor = getStyle("borderColor");
+						removeVideoChild(e.window as VideoWindowItf);
+						saveWindowDimensions(e.window);
+						break;
+					case DragWindowEvent.DRAG_END:
+						setStyle("borderColor",borderColor);
+						restoreWindowDimensions(e.window);
+						if (hitTestPoint(e.mouseGlobal.x, e.mouseGlobal.y, true))
+							addVideoChild(e.window as VideoWindowItf);
+						break;
+				}
+			}
+			
+			private function saveWindowDimensions(window:MDIWindow):void {
+				var dimensions:Object = {width:window.width, height:window.height};
+				childrenDimension[window] = dimensions;
+			}
+			
+			private function restoreWindowDimensions(window:MDIWindow):void {
+				window.width = childrenDimension[window].width;
+				window.height = childrenDimension[window].height;
+			}
+			
+			private function repositionWindow(window:MDIWindow):void {
+				// \TODO reposition the window correctly between the windows
+				// setChildIndex(window, ?);
+			}
+			
+			private function isVideoWindow(window:Object):Boolean {
+				return (getQualifiedSuperclassName(window) == "org.bigbluebutton.modules.videoconf.business::VideoWindowItf")
+			}
+			
+			private function onCloseWindow(e:CloseWindowEvent):void {
+				// it should not just undock the window, it should close the window forever
+				if (isVideoWindow(e.window) && this.contains(e.window as VideoWindowItf))
+					this.removeChild(e.window as VideoWindowItf);
+			}
+			
+			private function onOpenWindow(e:OpenVideoWindowEvent):void {
+				if (isVideoWindow(e.window) && autoDock)
+					addVideoChild(e.window as VideoWindowItf);
+			}
+			
+			private function addVideoChild(window:VideoWindowItf):void {
+				if (this.contains(window))
+					return;
+				
+				LogUtil.debug("Docking window");
+				
+				saveWindowDimensions(window);
+				
+				window.minimizeBtn.visible = false;
+				window.maximizeRestoreBtn.visible = false;
+				window.resizable = false;
+				window.buttonsEnabled = false;
+				
+				var e:CloseWindowEvent = new CloseWindowEvent();
+				e.window = window;
+				dispatchEvent(e);
+				this.addChild(window);
+			}
+			
+			private function removeVideoChild(window:VideoWindowItf):void {
+				if (!this.contains(window))
+					return;
+				
+				window.minimizeBtn.visible = true;
+				window.maximizeRestoreBtn.visible = true;
+				window.resizable = true;
+				window.buttonsEnabled = true;
+				
+				this.removeChild(window);
+				var e:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT);
+				e.window = window;
+				dispatchEvent(e);
+				
+				restoreWindowDimensions(window);
+			}
+			
+			override public function close(event:MouseEvent = null):void {
+				removeAllChildren();
+				super.close(event);
+			}
+			
+			private function updateChildrenDimensions(children:Array):void {
+				var numChildren:int = children.length;
+				if (numChildren == 0) return;
+				
+				var horizontalGap:Number = getStyle("horizontalGap");
+				var verticalGap:Number = getStyle("verticalGap");
+				
+				var availableWidth:Number = this.width
+					- this.borderMetrics.left - this.borderMetrics.right;
+				var availableHeight:Number = this.height
+					- this.borderMetrics.top - this.borderMetrics.bottom;
+				
+				var childWidth:Number = 0;
+				var childHeight:Number = 0;
+				var nRows:Number = 0;
+				var nColumns:Number = 0;
+				
+				// we would like to maximize the window size
+				for (var rows:Number = 1; rows <= numChildren; ++rows) {
+					var columns:Number = Math.ceil(numChildren / rows);
+					var maxWidth:Number = Math.floor((availableWidth - horizontalGap * (columns - 1)) / columns) - VideoWindowItf.PADDING_HORIZONTAL;
+					var maxHeight:Number = Math.floor((availableHeight - verticalGap * (rows - 1)) / rows) - VideoWindowItf.PADDING_VERTICAL;
+					
+					// the possible dimensions shouldn't be less or equal 0 (it could happen with many videos)
+					if (maxWidth <= 0 || maxHeight <=0)
+						continue;
+					
+					var desiredAR:Number = 4/3;
+					var width:Number = maxWidth;
+					var height:Number = maxHeight;
+					if (maxWidth / maxHeight > desiredAR)
+						width = Math.floor(maxHeight * desiredAR);
+					else
+						height = Math.floor(maxWidth / desiredAR);
+					
+					if (width > childWidth) {
+						childWidth = width;
+						childHeight = height;
+						nRows = rows;
+						nColumns = columns;
+					}
+				}                        
+				
+				childWidth += VideoWindowItf.PADDING_HORIZONTAL;
+				childHeight += VideoWindowItf.PADDING_VERTICAL;
+				
+				for (var childIndex:int = 0; childIndex < numChildren; ++childIndex) {
+					var window:VideoWindowItf = children[childIndex];
+					window.width = childWidth;
+					window.updateHeight();
+					
+					if (window.height > childHeight) {
+						window.height = childHeight;
+						window.updateWidth();
+					}
+					
+					var row:int = childIndex / nColumns;
+					var column:int = childIndex % nColumns;
+					
+					var borderTop:int = (availableHeight - nRows * childHeight - (nRows - 1) * verticalGap) / 2;
+					var borderLeft:int = (availableWidth - nColumns * childWidth - (nColumns - 1) * horizontalGap) / 2;
+					
+					window.y = row * (childHeight + verticalGap) + borderTop;
+					window.x = column * (childWidth + horizontalGap) + borderLeft;
+				} 
+			}
+			
+			protected function onDoubleClick(event:MouseEvent = null):void {
+				this.maximizeRestore();
+			}
+			
+			override protected function resourcesChanged():void{
+				super.resourcesChanged();
+				this.title = ResourceUtil.getInstance().getString('bbb.videodock.title');
+			}			
+			
+		]]>
+	</mx:Script>
+	
+	<mate:Listener type="{DragWindowEvent.DRAG_WINDOW_EVENT}" method="onDragVideoWindow" />
+	<mate:Listener type="{OpenVideoWindowEvent.OPEN_VIDEO_WINDOW_EVENT}" method="onOpenWindow" />
+	<mate:Listener type="{CloseWindowEvent.CLOSE_WINDOW_EVENT}" method="onCloseWindow" />
+</MDIWindow>
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
index a927baced0bf5521f95811a4d89ddd2b8a2e5321..6395b428100597fd0adcd8fd3ec743996f641b05 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
@@ -19,8 +19,6 @@
 package org.bigbluebutton.util.i18n
 {
 	import com.adobe.utils.StringUtil;
-	import com.asfusion.mate.events.Dispatcher;
-	
 	import flash.events.Event;
 	import flash.events.EventDispatcher;
 	import flash.events.IEventDispatcher;
@@ -48,7 +46,7 @@ package org.bigbluebutton.util.i18n
 		private static var BBB_RESOURCE_BUNDLE:String = 'bbbResources';
 		public static var DEFAULT_LANGUAGE:String = "en_US";
 		private static var currentLanguage:String = DEFAULT_LANGUAGE;
-		private var eventDispatcher:Dispatcher = new Dispatcher();
+		private var eventDispatcher:IEventDispatcher;
 		
 		private var localeChain:Array = new Array();
 		private var resourceManager:IResourceManager;
@@ -94,11 +92,23 @@ package org.bigbluebutton.util.i18n
 				if (resourceManager.localeChain[0] == localeChain[i]) localeAvailable = true;
 			}
 			
-			//Locale not found, set default
-			changeLocale(DEFAULT_LANGUAGE);			
+			/**
+			 *  http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/resources/IResourceManager.html#localeChain
+			 *  Always load the default language, so if the chosen language 
+			 *  doesn't provide a resource, the default language resource is used
+			 */
+			load(DEFAULT_LANGUAGE);
 			
+			if (!localeAvailable)
+				resourceManager.localeChain = [DEFAULT_LANGUAGE];
+			changeLocale(resourceManager.localeChain[0]);					
 		}
 		
+		private function load(language:String):IEventDispatcher {
+			var localeURI:String = 'locale/' + language + '_resources.swf';
+			return resourceManager.loadResourceModule(localeURI, false);
+		}		
+		
 		public static function getInstance():ResourceUtil {
 			if (instance == null) {
 				LogUtil.debug("Setting up supported locales.");
@@ -107,62 +117,41 @@ package org.bigbluebutton.util.i18n
 			return instance;
         }
         
-        public function changeLocale(language:String):void{        	
-    		var localeURI:String = 'locale/' + language + '/bbbResources.properties';
-
-			var date:Date = new Date();
-			var _urlLoader:URLLoader = new URLLoader();
-			_urlLoader.addEventListener(Event.COMPLETE, handleLocaleLoaded);
-			_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, handleResourceNotLoaded);
-			_urlLoader.load(new URLRequest(localeURI + "?a=" + date.time));
-			
-			currentLanguage = language;
-        }
-		
-		private function handleLocaleLoaded(e:Event):void{
-			var fulltext:String = (e.target.data as String);
-			fulltext = com.adobe.utils.StringUtil.remove(fulltext, "\r");
-			
-			var allStrings:Array = fulltext.split("\n");
-			for (var i:Number=0; i<allStrings.length; i++){
-				var str:String = allStrings[i] as String;
+		public function changeLocale(... chain):void{        	
+			if(chain != null && chain.length > 0)
+			{
+				eventDispatcher = load(chain[0]);
+				localeChain = [chain[0]];
+				eventDispatcher.addEventListener(ResourceEvent.COMPLETE, localeChangeComplete);
+				eventDispatcher.addEventListener(ResourceEvent.ERROR, handleResourceNotLoaded);
 				
-				if (str.charAt(0) != '#'){
-					var keyValue:Array = str.split("=");
-					var key:String = mx.utils.StringUtil.trim(keyValue[0] as String);
-					var value:String = mx.utils.StringUtil.trim(keyValue[1] as String);
-					currentLocalization[key] = value;
-					trace(key + "=" + value);
-				}
+				currentLanguage = chain[0];
 			}
-			
-			trace(currentLocalization['bbb.logout.usercommand']);
-			
+		}
+		
+		private function localeChangeComplete(event:ResourceEvent):void{
+			if (localeChain[0] != DEFAULT_LANGUAGE)
+				localeChain.push(DEFAULT_LANGUAGE);
+			resourceManager.localeChain = localeChain;
 			update();
 		}
-        
-        /**
-         * Defaults to DEFAULT_LANGUAGE when an error is thrown by the ResourceManager 
-         * @param event
-         */        
-        private function handleResourceNotLoaded(event:ResourceEvent):void{
-			currentLanguage = DEFAULT_LANGUAGE;
-        	update();
-        }
-        
-        public function update():void{
-			eventDispatcher.dispatchEvent(new LocaleChangeEvent(LocaleChangeEvent.LOCALE_CHANGED));
-        	dispatchEvent(new Event(Event.CHANGE));
-        }
-        
-        [Bindable("change")]
-        public function getString(resourceName:String, parameters:Array = null, locale:String = null):String{
-			if (!parameters) return currentLocalization[resourceName]; //resourceManager.getString(BBB_RESOURCE_BUNDLE, resourceName, parameters, locale);
-			else return insertParameters(currentLocalization[resourceName], parameters);
+		
+		/**
+		 * Defaults to DEFAULT_LANGUAGE when an error is thrown by the ResourceManager 
+		 * @param event
+		 */        
+		private function handleResourceNotLoaded(event:ResourceEvent):void{
+			resourceManager.localeChain = [DEFAULT_LANGUAGE];
+			update();
+		}
+		
+		public function update():void{
+			dispatchEvent(new Event(Event.CHANGE));
 		}
 		
-		private function insertParameters(text:String, parameters:Array):String{
-			return mx.utils.StringUtil.substitute(text, parameters);
+		[Bindable("change")]
+		public function getString(resourceName:String, parameters:Array = null, locale:String = null):String{
+			return resourceManager.getString(BBB_RESOURCE_BUNDLE, resourceName, parameters, locale);
 		}
 		
 		public function getCurrentLanguageCode():String{
diff --git a/bigbluebutton-client/src/swfobject/swfobject.js b/bigbluebutton-client/src/swfobject/swfobject.js
deleted file mode 100644
index 083b9b1a06de3677761affd37fe7f23aed24d0c6..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/swfobject/swfobject.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * SWFObject v1.4.3: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
- *
- * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
- *   legal reasons.
- */
-if(typeof deconcept=="undefined"){var deconcept=new Object();}
-if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}
-if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
-deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){
-if(!document.getElementById){return;}
-this.DETECT_KEY=_b?_b:"detectflash";
-this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
-this.params=new Object();
-this.variables=new Object();
-this.attributes=new Array();
-if(_1){this.setAttribute("swf",_1);}
-if(id){this.setAttribute("id",id);}
-if(w){this.setAttribute("width",w);}
-if(h){this.setAttribute("height",h);}
-if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
-this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
-if(c){this.addParam("bgcolor",c);}
-var q=_8?_8:"high";
-this.addParam("quality",q);
-this.setAttribute("useExpressInstall",_7);
-this.setAttribute("doExpressInstall",false);
-var _d=(_9)?_9:window.location;
-this.setAttribute("xiRedirectUrl",_d);
-this.setAttribute("redirectUrl","");
-if(_a){this.setAttribute("redirectUrl",_a);}};
-deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
-this.attributes[_e]=_f;
-},getAttribute:function(_10){
-return this.attributes[_10];
-},addParam:function(_11,_12){
-this.params[_11]=_12;
-},getParams:function(){
-return this.params;
-},addVariable:function(_13,_14){
-this.variables[_13]=_14;
-},getVariable:function(_15){
-return this.variables[_15];
-},getVariables:function(){
-return this.variables;
-},getVariablePairs:function(){
-var _16=new Array();
-var key;
-var _18=this.getVariables();
-for(key in _18){_16.push(key+"="+_18[key]);}
-return _16;
-},getSWFHTML:function(){
-var _19="";
-if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
-if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");}
-_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
-_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
-var _1a=this.getParams();
-for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
-var _1c=this.getVariablePairs().join("&");
-if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}
-_19+="/>";
-}else{
-if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
-_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
-_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
-var _1d=this.getParams();
-for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
-var _1f=this.getVariablePairs().join("&");
-if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}
-_19+="</object>";}
-return _19;
-},write:function(_20){
-if(this.getAttribute("useExpressInstall")){
-var _21=new deconcept.PlayerVersion([6,0,65]);
-if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
-this.setAttribute("doExpressInstall",true);
-this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
-document.title=document.title.slice(0,47)+" - Flash Player Installation";
-this.addVariable("MMdoctitle",document.title);}}
-if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
-var n=(typeof _20=="string")?document.getElementById(_20):_20;
-n.innerHTML=this.getSWFHTML();
-return true;
-}else{
-if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
-return false;}};
-deconcept.SWFObjectUtil.getPlayerVersion=function(){
-var _23=new deconcept.PlayerVersion([0,0,0]);
-if(navigator.plugins&&navigator.mimeTypes.length){
-var x=navigator.plugins["Shockwave Flash"];
-if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
-}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}
-catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
-_23=new deconcept.PlayerVersion([6,0,21]);
-axo.AllowScriptAccess="always";
-}catch(e){
-if(_23.major==6){return _23;}}
-try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}
-catch(e){}}
-if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}
-return _23;};
-deconcept.PlayerVersion=function(_27){
-this.major=_27[0]!=null?parseInt(_27[0]):0;
-this.minor=_27[1]!=null?parseInt(_27[1]):0;
-this.rev=_27[2]!=null?parseInt(_27[2]):0;
-};
-deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
-if(this.major<fv.major){return false;}
-if(this.major>fv.major){return true;}
-if(this.minor<fv.minor){return false;}
-if(this.minor>fv.minor){return true;}
-if(this.rev<fv.rev){return false;}return true;};
-deconcept.util={getRequestParameter:function(_29){
-var q=document.location.search||document.location.hash;
-if(q){var _2b=q.substring(1).split("&");
-for(var i=0;i<_2b.length;i++){
-if(_2b[i].substring(0,_2b[i].indexOf("="))==_29){
-return _2b[i].substring((_2b[i].indexOf("=")+1));}}}
-return "";}};
-deconcept.SWFObjectUtil.cleanupSWFs=function(){
-var _2d=document.getElementsByTagName("OBJECT");
-if(_2d.length>0){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};}
-for(var i=0;i<_2d.length;i++){
-_2d[i].style.display="none";
-for(var x in _2d[i]){
-if(typeof _2d[i][x]=="function"){_2d[i][x]=function(){};}}}};
-if(typeof window.onbeforeunload=="function"){
-var oldBeforeUnload=window.onbeforeunload;
-window.onbeforeunload=function(){
-deconcept.SWFObjectUtil.cleanupSWFs();
-oldBeforeUnload();};
-}else{window.onbeforeunload=deconcept.SWFObjectUtil.cleanupSWFs;}
-if(Array.prototype.push==null){
-Array.prototype.push=function(_30){
-this[this.length]=_30;
-return this.length;};}
-
-var getQueryParamValue=deconcept.util.getRequestParameter;
-var FlashObject=deconcept.SWFObject;
-var SWFObject=deconcept.SWFObject;
-