diff --git a/bbb-api-examples/PHP/bbb_api.inc.php b/bbb-api-examples/PHP/bbb_api.inc.php
deleted file mode 100755
index 013e9cda9b43ffd1c7ac9d07203210cc46572948..0000000000000000000000000000000000000000
--- a/bbb-api-examples/PHP/bbb_api.inc.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?
-/*
-BigBlueButton - http://www.bigbluebutton.org
-
-Copyright (c) 2008-2009 by respective authors (see below). All rights reserved.
-
-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 3 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, If not, see <http://www.gnu.org/licenses/>.
-
-Author: DJP <DJP@architectes.org>
-
-*/
-require('bbb_api_conf.inc.php');
-
-/*
- * Create a meeting and return a URL to join it as moderator
- */
-function getJoinURL($username, $meetingID, $welcome = '')
-{
-	$base_url_create = BIGBLUEBUTTONURL."api/create?";
-	$base_url_join = BIGBLUEBUTTONURL."api/join?";
-	$voiceBridge = 70000 + rand(0, 9999);
-
-	//
-	// When creating a meeting, the 'name' parameter is the name of the meeting (not to be confused with
-	// the username).  For example, the name could be "Fred's meeting" and the meetingID could be "ID-1234312".
-	//
-	// While name and meetinID could be different, we'll keep them the same.  Why?  Because calling api/create?
-	// with a previously used meetingID will return same meetingToken (regardless if the meeting is running or not).
-	//
-	// This means the first person to call getJoinURL with meetingID="Demo Meeting" will actually create the
-	// meeting.  Subsequent calls will return the same meetingToken and thus subsequent users will join the same
-	// meeting.
-	//
-	// Note: We're hard-coding the password for moderator and attendee (viewer) for purposes of demo.
-	//
-
-	$params = 'name='.urlencode($meetingID).'&meetingID='.urlencode($meetingID).'&attendeePW='.ATTENDEEPW.'&moderatorPW='.MODERATORPW.'&voiceBridge='.$voiceBridge;
-	if (trim($welcome))
-		$params .= '&welcome='.urlencode($welcome);
-	$xml = bbb_wrap_simplexml_load_file($base_url_create.$params.'&checksum='.sha1($params.SALT));
-	if ($xml && $xml->returncode == 'SUCCESS' && $meetingToken = trim($xml->meetingToken))
-	{
-		$params = 'meetingToken='.$meetingToken.'&fullName='.urlencode($username).'&password='.MODERATORPW;
-		return ($base_url_join.$params.'&checksum='.sha1($params.SALT));
-	} else if ($xml)
-		return ($xml->messageKey.' : '.$xml->message);
-	else
-		return ('Unable to fetch URL '.$base_url_create.$params.'&checksum='.sha1($params.SALT));
-}
-
-/*
- * getJoinURLViewer() -- Get the URL to join a meeting as viewer
- */
-function getJoinURLViewer($username, $meetingToken, $welcome = '')
-{
-	$base_url_join = BIGBLUEBUTTONURL."api/join?";
-
-	$params = 'meetingToken='.$meetingToken.'&fullName='.urlencode($username).'&password='.ATTENDEEPW;
-
-	return ($base_url_join.$params.'&checksum='.sha1($params.SALT));
-}
-
-/*
- * getURLisMeetingRunning() -- return a URL that the client can use to poll for whether the given meeting is running
- * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...)
- */
-
-function getURLisMeetingRunning($meetingToken, $meetingID)
-{
-	$base_url = BIGBLUEBUTTONURL."api/isMeetingRunning?";
-	$params = 'meetingToken='.$meetingToken.'&meetingID='.urlencode($meetingID);
-
-	return ($base_url.$params.'&checksum='.sha1($params.SALT));
-}
-
-/*
- * isMeetingRunning() -- check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting)
- */
-function isMeetingRunning($meetingToken, $meetingID)
-{
-	$xml = bbb_wrap_simplexml_load_file(getURLisMeetingRunning($meetingToken, $meetingID));
-	if ($xml && $xml->returncode == 'SUCCESS')
-		return (($xml->running == 'TRUE')?true:false);
-	else
-		return (false);
-}
-
-/*
- * getURLMeetingInfo() -- return a URL to get MeetingInfo
- * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...)
- */
-function getURLMeetingInfo($meetingID, $moderatorPW)
-{
-	$base_url = BIGBLUEBUTTONURL."api/getMeetingInfo?";
-	$params = 'meetingID='.urlencode($meetingID).'&password='.$moderatorPW;
-
-	return ($base_url.$params.'&checksum='.sha1($params.SALT));
-}
-
-/*
- * getMeetings() -- Calls getMeetingInfo to obtain information on a given meeting.
- */
-function getMeetingInfo($meetingID, $moderatorPW)
-{
-	$xml = bbb_wrap_simplexml_load_file(getURLMeetingInfo($meetingID, $moderatorPW));
-	return (str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
-}
-
-/*
- * getURLMeetings() -- return a URL for listing all running meetings
- * Beware : check that BIGBLUEBUTTONURL is reachable internally from your PHP Web Application Server. (Hosts, firewall...)
- */
-function getURLMeetings()
-{
-	$base_url = BIGBLUEBUTTONURL."api/getMeetings?";
-	$params = 'random='.(rand() * 1000);
-
-	return ($base_url.$params.'&checksum='.sha1($params.SALT));
-}
-
-/*
- * getMeetings() -- Calls getMeetings to obtain the list of meetings, then calls getMeetingInfo for each meeting and concatenates the result.
- */
-function getMeetings()
-{
-	$xml = bbb_wrap_simplexml_load_file(getURLMeetings());
-	if ($xml && $xml->returncode == 'SUCCESS')
-	{
-		if ($xml->messageKey)
-			return ($xml->message->asXML());
-		ob_start();
-		echo '<meetings>';
-		if (count($xml->meetings) && count($xml->meetings->meeting))
-		{
-			foreach ($xml->meetings->meeting as $meeting)
-			{
-				echo '<meeting>';
-				echo getMeetingInfo($meeting->meetingID, $meeting->moderatorPW);
-				echo '</meeting>';
-			}
-		}
-		echo '</meetings>';
-		return (ob_get_clean());
-	}
-	else
-		return (false);
-}
-?>
\ No newline at end of file
diff --git a/bbb-api-examples/PHP/bbb_api.php b/bbb-api-examples/PHP/bbb_api.php
new file mode 100755
index 0000000000000000000000000000000000000000..dee5ba24303880f76c7dfe441c822ecdc8cacb7b
--- /dev/null
+++ b/bbb-api-examples/PHP/bbb_api.php
@@ -0,0 +1,356 @@
+<?php
+
+if(function_exists("curl_init()"))
+{
+	function bbb_wrap_simplexml_load_file($url)
+	{
+		$ch = curl_init() or die ( curl_error() );
+		curl_setopt( $ch, CURLOPT_URL, $url );
+		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
+		$data = curl_exec( $ch );
+		curl_close( $ch );
+		return (new SimpleXMLElement($data));
+	} 	
+}
+else
+{
+	/*
+	 * REQUIREMENT - PHP.INI
+	 * allow_url_fopen = On
+	*/
+	 function bbb_wrap_simplexml_load_file($url)
+	 {
+	 	return (simplexml_load_file($url));
+	 }
+}
+
+/*
+@param
+$userName = userName AND meetingID (string) 
+$welcomeString = welcome message (string)
+$modPW = moderator password (string)
+$vPW = viewer password (string)
+$voiceBridge = voice bridge (integer)
+$logout = logout url (url)
+*/
+// create a meeting and return the url to join as moderator
+
+
+// TODO::
+// create some set methods 
+class BigBlueButton {
+	
+	var $userName = array();
+	var $meetingID; // the meeting id
+	
+	var $welcomeString;
+	// the next 2 fields are maybe not needed?!?
+	var $modPW; // the moderator password 
+	var $attPW; // the attendee pw
+	
+	var $securitySalt; // the security salt; gets encrypted with sha1
+	var $URL; // the url the bigbluebutton server is installed
+	var $sessionURL; // the url for the administrator to join the sessoin
+	var $userURL;
+	
+	var $conferenceIsRunning = false;
+	// this constructor is used to create a BigBlueButton Object
+	// use this object to create servers
+	// Use is either 0 arguments or all 7 arguments
+public function __construct() {
+
+
+	$numargs = func_num_args();
+
+	if( $numargs == 0 ) {
+		echo "Constructor created";
+	}
+	// pass the information to the class variables
+	else if( $numargs >= 6 ) {
+		$this->userName = func_get_arg(0);
+		$this->meetingID = func_get_arg(1);
+		$this->welcomeString = func_get_arg(2);
+		$this->modPW = func_get_arg(3);
+		$this->attPW = func_get_arg(4);
+		$this->securitySalt = func_get_arg(5);
+		$this->URL = func_get_arg(6);
+		
+
+ 		$arg_list = func_get_args();
+    	for ($i = 0; $i < $numargs; $i++) {
+        	echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
+    	}
+    
+//    $this->createMeeting( $this->userName, $this->meetingID, $this->welcomeString, $this->modPW, $this->attPW, $this->securitySalt, $this->URL );
+ //   echo "Object created";
+//	 echo '<br />';
+	}// end else if
+}
+
+public function checkCurl($url) {
+	/*
+ * Is libcurl available ?
+ */
+if(function_exists("curl_init()"))
+{
+	//function bbb_wrap_simplexml_load_file($url)
+	//{
+		$ch = curl_init() or die ( curl_error() );
+		curl_setopt( $ch, CURLOPT_URL, $url );
+		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
+		$data = curl_exec( $ch );
+		curl_close( $ch );
+		return (new SimpleXMLElement($data));
+//	} 	
+}
+else
+{
+	/*
+	 * REQUIREMENT - PHP.INI
+	 * allow_url_fopen = On
+	*/
+	// function bbb_wrap_simplexml_load_file($url)
+	// {
+	 	return (simplexml_load_file($url));
+	// }
+}
+}
+
+// a whole bunch of set and get functions for the variables
+// set the user name
+
+public function setUserName( $userName ) {
+	$this->userName = urlencode($userName);
+}
+
+public function getUserName() { return $this->userName; }
+
+// set the meetingID
+public function setMeetingID( $meetingID ) {
+	$this->meetingID = urlencode($meetingID);
+}
+
+public function getMeetingID() { return $this->meetingID; }
+
+// unsafe function, try not to use it
+public function setModeratorPW( $modPW ) {
+	$this->modPW = $modPW;
+}
+
+public function getModeratorPW() { return $this->modPW; }
+
+// same comment as for setModeratorPW
+public function setAttendeePW( $attPW ) {
+	$this->attPW = $attPW;
+}
+
+public function getAttendeePW() { $this->attPW; }
+
+public function setSecuritySalt( $salt ) {
+	$this->securitySalt = $salt;
+}
+
+public function getSecuritySalt() { return $this->securitySalt; }
+
+public function setURL( $URL ) {
+	$this->URL = $URL;
+}
+
+public function getURL() { return $this->URL; }
+	
+public function createMeeting( $username, $meetingID, $welcomeString, $mPW, $aPW, $SALT, $URL ) {
+	$url_create = $URL."api/create?";
+	$url_join = $URL."api/join?";
+	$voiceBridge = 70000 + rand(0, 9999);
+
+	$params = 'name='.urlencode($meetingID).'&meetingID='.urlencode($meetingID).'&attendeePW='.$aPW.'&moderatorPW='.$mPW.'&voiceBridge='.$voiceBridge;
+
+	if( trim( $welcomeString ) ) 
+		$params .= '&welcome='.urlencode($welcomeString);
+
+	$xml = bbb_wrap_simplexml_load_file($url_create.$params.'&checksum='.sha1("create".$params.$SALT) );
+	
+	if( $xml && $xml->returncode == 'SUCCESS' ) {
+		$params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($username).'&password='.$mPW;
+		// create the url
+		$this->sessionURL = $url_join.$params.'&checksum='.sha1("join".$params.$SALT);
+		$conferenceIsRunning = true;
+		return ($url_join.$params.'&checksum='.sha1("join".$params.$SALT) );
+	}	
+	else if( $xml ) {
+		return ( $xml->messageKey.' : '.$xml->message );
+	}
+	else {
+		return ('Unable to fetch URL '.$url_create.$params.'&checksum='.sha1("create".$params.$SALT) );
+	}
+}
+
+// return the url to join a meeting as viewer
+public function joinAsViewer( $userName, $welcomeString = '', $aPW, $SALT, $URL ) {
+	$url_join = $URL."api/join?";
+	$params = 'meetingID='.urlencode($meetingID).'&fullName='.urlencode($userName).'&password='.$aPW;
+	$this->userURL = $url_join.$params.'&checksum='.sha1("join".$params.$SALT);
+	return ($url_join.$params.'&checksum='.sha1("join".$params.$SALT) );
+}
+
+// getURLisMeetingRunning() -- return an URL that the client can use to poll for whether the given meeting is running
+public function getUrlOfRunningMeeting( $meetingID, $URL, $SALT ) {
+	$base_url = $URL."api/isMeetingRunning?";
+	$params = '&meetingID='.urlencode($meetingID);
+	return ($base_url.$params.'&checksum='.sha1("isMeetingRunning".$params.$SALT) );	
+}
+
+// isMeetingRunning() -- check the BigBlueButton server to see if the meeting is running (i.e. there is someone in the meeting)
+public function isMeetingRunning( $meetingID, $meetingID, $URL ) {
+	$xml = bbb_wrap_simplexml_load_file( $this->getUrlOfRunningMeeting( $meetingID, $meetingID, $URL ) );
+	if( $xml && $xml->returncode == 'SUCCESS' ) 
+		return ( ( $xml->running == 'TRUE' ) ? true : false);
+	else
+		return ( false );
+}
+
+// getURLMeetingInfo() -- return a URL to get MeetingInfo
+public function getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) {
+	$base_url = $URL."api/getMeetingInfo?";
+	$params = 'meetingID='.urlencode($meetingID).'&password='.$modPW;
+	return ( $base_url.$params.'&checksum='.sha1("getMeetingInfo".$params.$SALT));	
+}
+
+ // getMeetingInfo() -- Calls getMeetingInfo to obtain information on a given meeting.
+public function getMeetingInfo( $meetingID, $modPW, $URL, $SALT ) {
+	$xml = bbb_wrap_simplexml_load_file( $this->getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) );
+	return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
+}
+
+ // getMeetingXML() --calls isMeetingRunning to obtain the xml values of the response of the returned URL
+public function getMeetingXML( $meetingID, $URL, $SALT ) {
+	$xml = bbb_wrap_simplexml_load_file( $this->getUrlOfRunningMeeting( $meetingID, $URL, $SALT ) );
+	return ( str_replace('</response>', '', str_replace("<?xml version=\"1.0\"?>\n<response>", '', $xml->asXML())));
+}
+
+// getURLMeetings() -- return a URL for listing all running meetings
+public function getUrlMeetings($URL, $SALT) { 
+	$base_url = $URL."api/getMeetings?";
+	$params = 'random='.(rand() * 1000 );
+	return ( $base_url.$params.'&checksum='.sha1("getMeetings".$params.$SALT));
+}
+
+public function endMeeting( $meetingID, $mPW, $URL, $SALT ) {
+	$base_url = $URL."api/end?";
+	$params = 'meetingID='.urlencode($meetingID).'&password='.$mPW;
+	return ( $base_url.$params.'&checksum='.sha1("end".$params.$SALT) );
+}
+
+
+
+// TODO: WRITE AN ITERATOR WHICH GOES OVER WHATEVER IT IS BEING TOLD IN THE API AND LIST INFORMATION
+/* we have to define at least 2 variable fields for getInformation to read out information at any position
+The first is: An identifier to chose if we look for attendees or the meetings or something else
+The second is: An identifier to chose what integrated functions are supposed to be used
+
+@param IDENTIFIER -- needs to be put in for the function to identify the information to print out
+		     current values which can be used are 'attendee' and 'meetings'
+@param meetingID -- needs to be put in to identify the meeting
+@param modPW -- needs to be put in if the users are supposed to be shown or to retrieve information about the meetings
+@param URL -- needs to be put in the URL to the bigbluebutton server
+@param SALT -- needs to be put in for the security salt calculation
+
+Note: If 'meetings' is used, then only the parameters URL and SALT needs to be used
+      If 'attendee' is used, then all the parameters needs to be used
+*/
+public function getInformation( $IDENTIFIER, $meetingID, $modPW, $URL, $SALT ) {
+	// if the identifier is null or '', then return false
+	if( $IDENTIFIER == "" || $IDENTIFIER == null ) {
+		echo "You need to type in a valid value into the identifier.";
+		return false;
+	}
+	// if the identifier is attendee, call getUsers
+	else if( $IDENTIFIER == 'attendee' ) {
+		return getUsers( $meetingID, $modPW, $URL, $SALT );
+	}
+	// if the identifier is meetings, call getMeetings
+	else if( $IDENTIFIER == 'meetings' ) {
+		return getMeetings( $URL, $SALT );
+	}
+	// return nothing
+	else {
+		return true;
+	}
+	
+}
+
+
+// return the users in the current conference
+public function getUsers( $meetingID, $modPW, $URL, $SALT ) {
+	$xml = bbb_wrap_simplexml_load_file( $this->getUrlFromMeetingInfo( $meetingID, $modPW, $URL, $SALT ) );
+	if( $xml && $xml->returncode == 'SUCCESS' ) {
+		ob_start();
+		if( count( $xml->attendees ) && count( $xml->attendees->attendee ) ) {
+
+			foreach ( $xml->attendees->attendee as $attendee ) {
+				echo $attendee->fullName.'<br />';
+			}
+		}
+		return (ob_end_flush());
+	}
+	else {
+		return (false);
+	}
+}
+
+// following FUNCTION is for TESTING!!!
+public function getUsersXML( $meetingID, $modPW, $URL, $SALT ) {
+	$xml = bbb_wrap_simplexml_load_file( getUrlMeetingInfo( $meetingID, $modPW, $URL, $SALT ) );
+	if( $xml && $xml->returncode == 'SUCCESS' ) {
+		ob_start();
+		echo '<attendees>';		
+		if( count( $xml->attendees ) && count( $xml->attendees->attendee ) ) {
+			foreach ( $xml->attendees->attendee as $attendee ) {
+				echo '<attendee>';
+				echo $attendee->fullName.'<br />';
+				echo '</attendee>';
+			}
+		}
+		else {
+			echo '<br />'."There are currently no users in the session right now.".'<br />';
+		}
+		echo '</attendees>';
+			return (ob_end_flush());
+	}
+	else {
+		return (false);
+	}
+}
+
+// getMeetings() -- Calls getMeetings to obtain the list of meetings, then calls getMeetingInfo for each meeting and concatenates the result.
+public function getMeetings( $URL, $SALT ) {
+	$xml = bbb_wrap_simplexml_load_file(getUrlMeetings( $URL, $SALT ) );
+	if( $xml && $xml->returncode == 'SUCCESS' ) {
+		if( $xml->messageKey )
+			return ( $xml->message->asXML() );	
+		ob_start();
+		echo '<meetings>';
+		if( count( $xml->meetings ) && count( $xml->meetings->meeting ) ) {
+			foreach ($xml->meetings->meeting as $meeting)
+                        {
+                                echo '<meeting>';
+                                echo getMeetingInfo($meeting->meetingID, $meeting->moderatorPW, $URL, $SALT);
+                                echo '</meeting>';
+                        }
+                }
+       echo '</meetings>';
+                return (ob_get_clean());
+        }
+        else {
+                return (false);
+        }
+}
+
+function getServerIP() {
+         // get the server url
+         $sIP = $_SERVER['SERVER_ADDR'];
+         return $serverIP = 'http://'.$sIP.'/bigbluebutton/';
+}
+
+}
+?>
diff --git a/bbb-api-examples/PHP/bbb_api_conf.inc.php b/bbb-api-examples/PHP/bbb_api_conf.inc.php
deleted file mode 100755
index 13b85f0ee07cf084b8d558062b2a7bf198b9007b..0000000000000000000000000000000000000000
--- a/bbb-api-examples/PHP/bbb_api_conf.inc.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?
-// This is the security salt that must match the value set in the BigBlueButton server
-define('SALT', '639259d4-9dd8-4b25-bf01-95f9567eaf4b');
-
-// This is the URL for the BigBlueButton server
-define('BIGBLUEBUTTONURL', 'http://192.168.7.131/bigbluebutton/');
-
-/*
- * Note: We're hard-coding the password for moderator and attendee (viewer) for purposes of demo.
- */
-define('ATTENDEEPW', 'ap');
-define('MODERATORPW', 'mp');
-
-/*
- * Is libcurl available ?
- */
-if(function_exists(curl_init))
-{
-	function bbb_wrap_simplexml_load_file($url)
-	{
-		$ch = curl_init() or die ( curl_error() );
-		curl_setopt( $ch, CURLOPT_URL, $url );
-		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
-		$data = curl_exec( $ch );
-		curl_close( $ch );
-		return (new SimpleXMLElement($data));
-	}
-}
-else
-{
-	/*
-	 * REQUIREMENT - PHP.INI
-	 * allow_url_fopen = On
-	 */
-	 function bbb_wrap_simplexml_load_file($url)
-	 {
-	 	return (simplexml_load_file($url));
-	 }
-}
-?>
\ No newline at end of file
diff --git a/bbb-api-examples/PHP/demo1.php b/bbb-api-examples/PHP/demo1.php
index 12b22c6951dcaf1c8c9597786a29c282ac75daf1..308ea72b0779a08a442165d648a509c9618b48af 100755
--- a/bbb-api-examples/PHP/demo1.php
+++ b/bbb-api-examples/PHP/demo1.php
@@ -20,7 +20,7 @@ Author: DJP <DJP@architectes.org>
 
 */
 
-require('bbb_api.inc.php');
+require('bbb_api.php');
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
@@ -33,6 +33,8 @@ require('bbb_api.inc.php');
 <?
 if ($_REQUEST['action'] == 'create' && trim($_REQUEST['username']))
 {
+         $sIP = $_SERVER['SERVER_ADDR'];
+         $serverIP = 'http://'.$sIP.'/bigbluebutton/';
    /*
 	* Got an action=create
 	*
@@ -40,8 +42,9 @@ if ($_REQUEST['action'] == 'create' && trim($_REQUEST['username']))
 	* Pass null for welcome message to use the default message (see defaultWelcomeMessage in bigbluebutton.properties)
 	*
 	*/
-
-    $joinURL = getJoinURL($_REQUEST['username'], "Demo Meeting", null);
+    $joinURL = new BigBlueButton( $_REQUEST['username'], "Demo Meeting", null, "mp", "ap", $SALT, $sIP );
+    $joinURL->createMeeting( $_REQUEST['username'], "Demo Meeting", null, "mp", "ap", $SALT, $sIP );
+    //$joinURL = getJoinURL($_REQUEST['username'], "Demo Meeting", null);
     if (substr($joinURL, 0, 7) == 'http://')
     {
     	?>
@@ -81,4 +84,4 @@ else
 include('demo_footer.php');
 ?>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/bbb-voice-conference/config/app_konference/app_konference.so b/bbb-voice-conference/config/app_konference/app_konference.so
old mode 100755
new mode 100644
index 32b12b71a80fc07864ed5641c1d19a2faea003d5..7a65fc3adc8a8b07a6bb2d772330e8e7a390e14b
Binary files a/bbb-voice-conference/config/app_konference/app_konference.so and b/bbb-voice-conference/config/app_konference/app_konference.so differ
diff --git a/bigbluebutton-client/README b/bigbluebutton-client/README
new file mode 100644
index 0000000000000000000000000000000000000000..6822178493da88f65324843aef377abb22ca652f
--- /dev/null
+++ b/bigbluebutton-client/README
@@ -0,0 +1,4 @@
+see http://code.google.com/p/bigbluebutton
+
+Developing the client
+1. Copy src/conf/config.xml.dev to src/cong/config.xml
diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml
index e27a1f0d3fd7d3c859d5ed61f0273a0108a1cd0e..c19e20a2ff74b37cbfb5ea9a5a2d29eb83a07aa1 100755
--- a/bigbluebutton-client/build.xml
+++ b/bigbluebutton-client/build.xml
@@ -1,60 +1,216 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- BigBlueButton Client build.xml for use by Hudson builds.   -->
-<project name="BigBlueButton Client" basedir="." default="cleanandmake" >
+<project name="BigBlueButton Client" basedir="." default="clean-build-all" >
     <property environment="env" />
     <property name="FLEX_HOME" value="${env.FLEX_HOME}" />
-	<property name="RESOURCES_DIR" value="./resources" />
-	<property name="APP_ROOT" value="./src" />
-	<property name="ROOT_DIR" value="." />
-	<property name="OUTPUT_DIR" value="./bin" />
+    <property name="LOCALE_DIR" value="${FLEX_HOME}/frameworks/locale"/>
+    <property name="BASE_DIR" value="${basedir}" />
+	<property name="RESOURCES_DIR" value="${BASE_DIR}/resources" />	
+	<property name="SRC_DIR" value="${BASE_DIR}/src" />
+		
+	<property name="OUTPUT_DIR" value="${BASE_DIR}/bin" />
 	<taskdef resource="flexTasks.tasks" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar" />
 
-	<target name="compile-bbb" depends="copy-config-xml, compile-bbb-dev" description="Compiling the BBB mxml files"/>
-
-	<target name="cds" description="Compile Desktop standalone sharing">
-		<mxmlc-compile src="${APP_ROOT}" target="DeskshareStandalone" />
+	<!-- Declare module names here -->
+	<property name="BBB_MAIN" value="BigBlueButton" />
+	<property name="CHAT" value="ChatModule" />
+	<property name="VIEWERS" value="ViewersModule" />
+	<property name="LISTENERS" value="ListenersModule" />
+	<property name="PRESENT" value="PresentModule" />
+	<property name="DESKSHARE" value="DeskShareModule" />
+	<property name="DESKSHARE_SA" value="DeskshareStandalone" />
+	<property name="PHONE" value="PhoneModule" />
+	<property name="VIDEO" value="VideoconfModule" />
+	<property name="HIGHLIGHTER" value="HighlighterModule" />
+	<property name="DYN_INFO" value="DynamicInfoModule" />
+	
+	<property name="AVAILABLE_LOCALES" value="az_AZ,de_DE,el_GR,en_US,es_ES,es_LA,fr_FR,hu_HU,it_IT,lt_LT,nb_NO,nl_NL,pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,tr_TR,vi_VN,zh_CN,zh_TW"/>
+	
+	<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="compile-bbb-dev" description="Compiling the BBB without copying config.xml">
-		<mxmlc-compile src="${APP_ROOT}" target="BigBlueButton" />
-		<mxmlc-compile src="${APP_ROOT}" target="ChatModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="ViewersModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="ListenersModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="PresentModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="DeskShareModule" />	
-		<mxmlc-compile src="${APP_ROOT}" target="DeskshareStandalone" />	
-		<mxmlc-compile src="${APP_ROOT}" target="PhoneModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="VideoconfModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="HighlighterModule" />
-		<mxmlc-compile src="${APP_ROOT}" target="DynamicInfoModule" />
+	<target name="localization" depends="init-ant-contrib">
+		<echo message="Parsing ${SRC_DIR}/conf/locales.xml for supported locales"/>
+		<echo message="Available locales ${AVAILABLE_LOCALES}"/>
+		<!--foreach list="${locales.locale.code}" target="build-locale" param="supportedlocale" delimiter=","/-->
+		<foreach list="${AVAILABLE_LOCALES}" target="build-locale" param="supportedlocale" delimiter=","/>
+	</target>
+	
+	<target name="build-locale">
+		<echo message="Building ${supportedlocale}"/>
+		<available file="${LOCALE_DIR}/${supportedlocale}" type="dir" property="locale.dir.present"/>
+		<if> 
+           <equals arg1="${locale.dir.present}" arg2="true"/> 
+           <then> 
+              <echo message="No need to copy ${LOCALE_DIR}/${supportedlocale}"/> 
+           </then> 
+           <else> 
+              <echo message="Need to copy ${LOCALE_DIR}/${supportedlocale}"/> 
+              <exec dir="${BASE_DIR}" vmlauncher="true" executable="copylocale">
+				<arg value="en_US"/>
+    			<arg value="${supportedlocale}"/>
+			</exec>
+           </else> 
+        </if>
+        <compileLocale locale="${supportedlocale}" />        
+	</target>
 		
-		<copy todir="${OUTPUT_DIR}/conf" >
-			<fileset dir="./src/conf" />
-		</copy>
-
-		<copy todir="${OUTPUT_DIR}/swfobject/" >
-			<fileset dir="./src/swfobject/" />
-		</copy>
+	<macrodef name="compileLocale" description="Compiles the Resource package for the given locale">
+		<attribute name="locale" default="en_US"/>
+		<sequential>
+			<echo message="Building @{locale}"/>
+		<available file="${LOCALE_DIR}/@{locale}" type="dir" property="locale.dir.present"/>
+		<if> 
+           <equals arg1="${locale.dir.present}" arg2="true"/> 
+           <then> 
+              <echo message="No need to copy ${LOCALE_DIR}/@{locale}"/> 
+           </then> 
+           <else> 
+              <echo message="Need to copy ${LOCALE_DIR}/@{locale}"/> 
+              <exec dir="${BASE_DIR}" vmlauncher="true" executable="copylocale">
+				<arg value="en_US"/>
+    			<arg value="@{locale}"/>
+			</exec>
+           </else> 
+        </if>
+        
+			<!--
+			Create the Flex Home directory for the language in question.
+			This is necessary to compensate for a bug in pre-3.2 releases of 
+			mxmlc.
+			
+			<mkdir dir="${FLEX_HOME}/frameworks/locale/@{locale}"/>-->
+			
+			<!-- Invoke MXMLC -->
+			<mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf">
+				<locale>@{locale}</locale>
+				<source-path path-element="locale/{locale}"/>
+				<include-resource-bundles>bbbResources</include-resource-bundles>
+				<source-path path-element="${FLEX_HOME}/frameworks"/>
+			</mxmlc>
+		</sequential>
+	</macrodef>
+		
+	<target name="build-bbb-main" description="Compile BigBlueButton Main">
+		<build-module src="${SRC_DIR}" target="${BBB_MAIN}" />
 		
+		<echo message="Copying common assets for BBB Main" />
 		<copy todir="${OUTPUT_DIR}/org/bigbluebutton/common/assets/images" >
-			<fileset dir="./src/org/bigbluebutton/common/assets/images/" />
-		</copy>
-
+			<fileset dir="${BASE_DIR}/src/org/bigbluebutton/common/assets/images/" />
+		</copy>		
+	</target>
+	
+	<target name="build-chat" description="Compile Chat Module">
+		<build-module src="${SRC_DIR}" target="${CHAT}" />
+	</target>
+	
+	<target name="build-viewers" description="Compile Viewers Module">
+		<build-module src="${SRC_DIR}" target="${VIEWERS}" />
+	</target>
+	
+	<target name="build-listeners" description="Compile Listeners Module">
+		<build-module src="${SRC_DIR}" target="${LISTENERS}" />
+		
+		<echo message="Copying common assets for Listeners Module" />
 		<copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/listeners/view/assets/images/" >
-			<fileset dir="./src/org/bigbluebutton/modules/listeners/view/assets/images/" />
-		</copy>
+			<fileset dir="${BASE_DIR}/src/org/bigbluebutton/modules/listeners/view/assets/images/" />
+		</copy>		
+	</target>
+	
+	<target name="build-present" description="Compile Present Module">
+		<build-module src="${SRC_DIR}" target="${PRESENT}" />
+	</target>
 
-		<copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/phone/views/assets/images/" >
-			<fileset dir="./src/org/bigbluebutton/modules/phone/views/assets/images/" />
-		</copy>
+	<target name="build-deskshare-standalone" depends="build-deskshare" description="Compile Deskshare Standalone Module">
+		<build-module src="${SRC_DIR}" target="${DESKSHARE_SA}" />
+	</target>
+	
+	<target name="build-deskshare" description="Compile Deskshare Module">
+		<build-module src="${SRC_DIR}" target="${DESKSHARE}" />
+		<echo message="Copying deskshare applet for Deskshare Module" />
+		<copy file="${RESOURCES_DIR}/bbb-deskshare-applet-0.64.jar" todir="${OUTPUT_DIR}"/>		
+	</target>
+	
+	<target name="build-phone" description="Compile Phone Module">
+		<build-module src="${SRC_DIR}" target="${PHONE}" />
 		
-		<copy file="./${RESOURCES_DIR}/bbb-deskshare-applet-0.64.jar" todir="${OUTPUT_DIR}"/>
+		<echo message="Copying assets for Phone Module" />
+		<copy todir="${OUTPUT_DIR}/org/bigbluebutton/modules/phone/views/assets/images/" >
+			<fileset dir="${BASE_DIR}/src/org/bigbluebutton/modules/phone/views/assets/images/" />
+		</copy>		
+	</target>
+	
+	<target name="build-video" description="Compile Video Module">
+		<build-module src="${SRC_DIR}" target="${VIDEO}" />
+	</target>
+	
+	<target name="build-highlighter" description="Compile Highlighter Module">
+		<build-module src="${SRC_DIR}" target="${HIGHLIGHTER}" />
+	</target>
+	
+	<target name="build-dyn" description="Compile Dynamic Info Module">
+		<build-module src="${SRC_DIR}" target="${DYN_INFO}" />
+	</target>
+	
+	<!-- just a grouping of modules to compile -->
+	<target name="build-main-chat-viewers-listeners-present" 
+			depends="build-bbb-main, build-chat, build-viewers, build-listeners, build-present"
+			description="Compile main, chat, viewers, listeners, present modules">
+	</target>
+	
+	<!-- just a grouping of modules to compile -->
+	<target name="build-deskshare-phone-video-highlighter-dyn" 
+			depends="build-deskshare-standalone, build-phone, build-video, build-highlighter, build-dyn"
+			description="Compile deskshare, phone, video, highlighter, dynamic info modules">
+	</target>
+	
+	<macrodef name="build-module">
+		<attribute name="target" description="Module to compile" />
+		<attribute name="flex" default="${FLEX_HOME}" description="Location of the Flex install." />
+		<attribute name="app" default="."/>
+		<attribute name="src" default="${SRC_DIR}" description="Path to the module to compile" />
+		<sequential>
+			<mxmlc file="@{src}/@{target}.mxml" output="${OUTPUT_DIR}/@{target}.swf" debug="false">
+				<load-config filename="@{flex}/frameworks/flex-config.xml" />
+				<source-path path-element="@{flex}/frameworks" />
+				<compiler.library-path dir="@{flex}/frameworks" append="true">
+					<include name="libs" />
+					<include name="../bundles/{locale}" />
+				</compiler.library-path>
+
+				<compiler.library-path dir="@{app}" append="true">
+					<include name="libs" />
+					<include name="libs/generated" />
+				</compiler.library-path>
+
+				<default-size width="500" height="600" />
+			</mxmlc>
+		</sequential>
+	</macrodef>
 		
-		<!--move todir="${OUTPUT_DIR}" >
-			<fileset dir="${OUTPUT_DIR}/src" />
-		</move-->
+	<target name="compile-bbb"
+			depends="build-main-chat-viewers-listeners-present, build-deskshare-phone-video-highlighter-dyn, copy-resource-files"
+			description="Compiling the BBB without copying config.xml">	
 	</target>
 
+	<target name="copy-resource-files">
+		<copy todir="${OUTPUT_DIR}/conf" >
+			<fileset dir="${BASE_DIR}/src/conf" />
+		</copy>
+
+		<copy todir="${OUTPUT_DIR}/swfobject/" >
+			<fileset dir="${BASE_DIR}/src/swfobject/" />
+		</copy>	
+		<copy file="${RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/>
+		<copy file="${RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/>
+		<copy file="${RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/>		
+			
+	</target>
+	
 	<target name="check-config-xml">
     		<available file="/var/www/bigbluebutton/client/conf/config.xml" property="config-xml.present"/>
 	</target>
@@ -64,7 +220,7 @@
 		<copy file="/var/www/bigbluebutton/client/conf/config.xml" todir="${OUTPUT_DIR}/conf" /> 
 	</target>
 
-	<target name="generate-wrapper" depends="compile-bbb">
+	<target name="generate-html-wrapper">
 		<html-wrapper
 			title="BigBlueButton"
 			file="BigBlueButton.html"
@@ -73,103 +229,23 @@
 			bgcolor="grey"
 			application="BBB"
 			swf="BigBlueButton"
-			version-major="9"
+			version-major="10"
 			version-minor="0"
 			version-revision="0"
 			history="true"
 			template="express-installation"
 			output="${OUTPUT_DIR}"
 		/>
-		<copy file="./${RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="./${RESOURCES_DIR}/DeskshareStandalone.html" todir="${OUTPUT_DIR}" overwrite="true"/>
-		<copy file="./${RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/>
 	</target>
 
 	<target name="clean">
 		<delete dir="${OUTPUT_DIR}" />
+		<mkdir dir="${OUTPUT_DIR}"/>
 	</target>
 
-	<target name="cleanandbuild" depends="clean, generate-wrapper"></target>
+	<target name="clean-build-bbb" depends="clean, generate-html-wrapper, compile-bbb" description="Build BBB client skipping compiling of locales"/>
 	
-	<target name="cleanandmake" depends="clean, localization, generate-wrapper"></target>
-	
-	<macrodef name="mxmlc-compile">
-		<attribute name="target" description="Path to the file being compiled." />
-		<attribute name="flex" default="${env.FLEX_HOME}" description="Location of the Flex install." />
-		<attribute name="app" default="."/>
-		<attribute name="src" default="./src" description="" />
-		<sequential>
-			<mxmlc 
-				file="@{src}/@{target}.mxml" 
-				output="${OUTPUT_DIR}/@{target}.swf" 
-				debug="false"
-			>
-				<load-config filename="@{flex}/frameworks/flex-config.xml" />
-				<source-path path-element="@{flex}/frameworks" />
-				<compiler.library-path dir="@{flex}/frameworks" append="true">
-					<include name="libs" />
-					<include name="../bundles/{locale}" />
-				</compiler.library-path>
-
-				<compiler.library-path dir="@{app}" append="true">
-					<include name="libs" />
-					<include name="libs/generated" />
-				</compiler.library-path>
-
-				<default-size width="500" height="600" />
-			</mxmlc>
-		</sequential>
-	</macrodef>
-
-	<target name="setuplocale" depends="" description="Checking to see if need to copylocale">
-		<exec dir="." vmlauncher="true" executable="/bin/bash">
-			<arg value="setuplocale.sh"/> 
-		</exec>
-	</target>
-	
-	<target name="localization" depends="setuplocale" description="Builds BigBlueButton localization files">
-		<echo>Building Localization .swf's</echo>
-		<compileLocale locale="az_AZ" />
-		<compileLocale locale="de_DE" />
-		<compileLocale locale="el_GR" />
-		<compileLocale locale="en_US" />
-		<compileLocale locale="es_ES" />
-		<compileLocale locale="es_LA" />
-		<compileLocale locale="fr_FR" />
-		<compileLocale locale="hu_HU" />
-		<compileLocale locale="it_IT" />
-		<compileLocale locale="lt_LT" />
-		<compileLocale locale="nb_NO" />
-		<compileLocale locale="nl_NL" />
-		<compileLocale locale="pl_PL" />
-		<compileLocale locale="pt_BR" />
-		<compileLocale locale="pt_PT" />
-		<compileLocale locale="ro_RO" />
-		<compileLocale locale="ru_RU" />
-		<compileLocale locale="tr_TR" />
-		<compileLocale locale="vi_VN" />
-		<compileLocale locale="zh_CN" />
-		<compileLocale locale="zh_TW" />
-	</target>
-	
-	<!-- Compiles Localization Resource Bundle. -->
-	<macrodef name="compileLocale" description="Compiles the Resource package for the given locale">
-		<attribute name="locale" default="en_US"/>
-		<sequential>
-			<!--
-			Create the Flex Home directory for the language in question.
-			This is necessary to compensate for a bug in pre-3.2 releases of 
-			mxmlc.
-			
-			<mkdir dir="${FLEX_HOME}/frameworks/locale/@{locale}"/>-->
-			
-			<!-- Invoke MXMLC -->
-			<mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf">
-				<locale>@{locale}</locale>
-				<source-path path-element="locale/{locale}"/>
-				<include-resource-bundles>bbbResources</include-resource-bundles>
-				<source-path path-element="${FLEX_HOME}/frameworks"/>
-			</mxmlc>
-		</sequential>
-	</macrodef>
+	<target name="clean-build-all" depends="clean, generate-html-wrapper, localization, compile-bbb" description="Build BBB client including locales"/>
+		
+	<target name="cleanandmake" depends="clean-build-all" description="Build BBB client including locales"/>
 </project>
diff --git a/bigbluebutton-client/build/lib/ant-contrib-0.6.jar b/bigbluebutton-client/build/lib/ant-contrib-0.6.jar
new file mode 100644
index 0000000000000000000000000000000000000000..db90b0aae85e0aba2dc79a75bec216ce678b450c
Binary files /dev/null and b/bigbluebutton-client/build/lib/ant-contrib-0.6.jar differ
diff --git a/bigbluebutton-client/copyright.txt b/bigbluebutton-client/copyright.txt
deleted file mode 100644
index c1f56c138c2780e4d9563e8e340c4d70287ad4e1..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/copyright.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-Copyright 2006-2010 by respective authors (see below). All rights reserved.
- 
-This library 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. 
- 
-This library 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 this library; if not, write to the Free Software Foundation, Inc., 
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
- 
-The Blindside Project
diff --git a/bigbluebutton-client/resources/BigBlueButton.html b/bigbluebutton-client/resources/BigBlueButton.html
old mode 100644
new mode 100755
index 4800d875ea3d7359d364a19acf27d69ac5c09f0c..01a1278973ef48db7e64cf25385fc77dda2b284d
--- a/bigbluebutton-client/resources/BigBlueButton.html
+++ b/bigbluebutton-client/resources/BigBlueButton.html
@@ -66,7 +66,7 @@ if ( hasProductInstall && !hasRequestedVersion ) {
 	// see. http://stackoverflow.com/questions/313966/mousewheel-not-working-when-published-movie-has-wmodetransparent
 	// ralam (mar 31, 2010)
 	AC_FL_RunContent(
-			"src", "BigBlueButton",
+			"src", "BigBlueButton-VERSION",
 			"width", "100%",
 			"height", "100%",
 			"align", "middle",
@@ -182,12 +182,12 @@ function getLanguage(){
   	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 			id="BigBlueButton" width="100%" height="100%"
 			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
-			<param name="movie" value="BigBlueButton.swf" />
+			<param name="movie" value="BigBlueButton-VERSION.swf" />
 			<param name="quality" value="high" />
 			<param name="bgcolor" value="#869ca7" />
 			<param name="allowScriptAccess" value="sameDomain" />
 			<param name="allowFullScreen" value="true" />
-			<embed src="BigBlueButton.swf" quality="high" bgcolor="#869ca7"
+			<embed src="BigBlueButton-VERSION.swf" quality="high" bgcolor="#869ca7"
 				width="100%" height="100%" name="BigBlueButton" align="middle"
 				play="true"
 				loop="false"
diff --git a/bigbluebutton-client/resources/DeskshareStandalone.html b/bigbluebutton-client/resources/DeskshareStandalone.html
old mode 100644
new mode 100755
index b6c4684d1ecc78a3a8c29a6fcedf732f04af16f4..588fca8573ba63ea51eb8f19af61b9212c2eafe3
--- a/bigbluebutton-client/resources/DeskshareStandalone.html
+++ b/bigbluebutton-client/resources/DeskshareStandalone.html
@@ -66,7 +66,7 @@ if ( hasProductInstall && !hasRequestedVersion ) {
 	// see. http://stackoverflow.com/questions/313966/mousewheel-not-working-when-published-movie-has-wmodetransparent
 	// ralam (mar 31, 2010)
 	AC_FL_RunContent(
-			"src", "DeskshareStandalone",
+			"src", "DeskshareStandalone-VERSION",
 			"width", "100%",
 			"height", "100%",
 			"align", "middle",
@@ -182,12 +182,12 @@ function getLanguage(){
   	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 			id="DeskshareStandalone" width="100%" height="100%"
 			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
-			<param name="movie" value="DeskshareStandalone.swf" />
+			<param name="movie" value="DeskshareStandalone-VERSION.swf" />
 			<param name="quality" value="high" />
 			<param name="bgcolor" value="#869ca7" />
 			<param name="allowScriptAccess" value="sameDomain" />
 			<param name="allowFullScreen" value="true" />
-			<embed src="DeskshareStandalone.swf" quality="high" bgcolor="#869ca7"
+			<embed src="DeskshareStandalone-VERSION.swf" quality="high" bgcolor="#869ca7"
 				width="100%" height="100%" name="DeskshareStandalone" align="middle"
 				play="true"
 				loop="false"
diff --git a/bigbluebutton-client/src/DeskshareStandalone.mxml b/bigbluebutton-client/src/DeskshareStandalone.mxml
index 73c7178239e7718a56558e7f577c6956e71636a6..494e3a11d1864f85bb10328d7154882d952f96aa 100755
--- a/bigbluebutton-client/src/DeskshareStandalone.mxml
+++ b/bigbluebutton-client/src/DeskshareStandalone.mxml
@@ -12,7 +12,6 @@
 	<mate:Listener type="{CursorEvent.UPDATE_CURSOR_LOC_EVENT}" method="onUpdateCursorEvent" />
 	<mx:Script>
 		<![CDATA[
-			import mx.effects.Move;
 			import mx.controls.Image;
 
 			import org.bigbluebutton.modules.deskShare.events.CursorEvent;
@@ -32,14 +31,6 @@
 			private var images:Images = new Images();
 			[Bindable] public var bbbLogo:Class = images.bbb_logo;
 
-//			[Embed("org/bigbluebutton/modules/deskShare/assets/images/Cursor.png")]
-//			private const CursorImage:Class;
- 
-// 			[Bindable]
-//			private var cursorImg:DisplayObject = new CursorImage();
-
-//			private var cursorMove:Move;
-			
 			private var video:Video;
 			private var ns:NetStream;
 			private var stream:String;
@@ -65,9 +56,6 @@
 				
 				displayWidth = this.parent.width;
 				displayHeight = this.parent.height;
-//				cursorImg.x = 0;
-//				cursorImg.y = 0;
-//				cursorMove = new Move(cursorImg);
 			}
 			
 			private function onAppletStart(event:AppletStartedEvent):void{
@@ -131,13 +119,11 @@
 //				cursor.visible = true;
 				
 				cursorImg.visible = true;
-                cursorMove.end();
-                cursorMove.xTo = ((event.x/video.videoWidth)) * videoHolder.width;
-                cursorMove.yTo = ((event.y/video.videoHeight)) * videoHolder.height; 
-                cursorMove.play();
-                
-                cursorImg.x = ((event.x/video.videoWidth)) * videoHolder.width;
-                cursorImg.y = ((event.x/video.videoWidth)) * videoHolder.width;
+           
+                // DO NOT compute the x and y coordinate and assign directly to the cursorImg
+                // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010).
+                cursorImg.x = cursor.x;
+                cursorImg.y = cursor.y;
                 
 			}
 			
@@ -186,7 +172,6 @@
 			}			
 		]]>
 	</mx:Script>
-		<mx:Move id="cursorMove" target="{cursorImg}"/>
 		<mx:Image id="cursorImg" visible="false" source="@Embed('org/bigbluebutton/modules/deskShare/assets/images/cursor4.png')"/>
 		<mx:Canvas id="vbox" width="100%" height="100%"/>	
 </mx:Application>
diff --git a/bigbluebutton-client/src/conf/.gitignore b/bigbluebutton-client/src/conf/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..7e90cf108542922e8926c2dc54486e23d0ec7032
--- /dev/null
+++ b/bigbluebutton-client/src/conf/.gitignore
@@ -0,0 +1 @@
+config.xml
diff --git a/bigbluebutton-client/src/conf/config.xml b/bigbluebutton-client/src/conf/config.xml.dev
old mode 100755
new mode 100644
similarity index 70%
rename from bigbluebutton-client/src/conf/config.xml
rename to bigbluebutton-client/src/conf/config.xml.dev
index 1601107c2d3c062910188e8c1e417e230561e75c..246a5cd9f7f231f67f4e5cb64d2384b6634c383c
--- a/bigbluebutton-client/src/conf/config.xml
+++ b/bigbluebutton-client/src/conf/config.xml.dev
@@ -1,12 +1,12 @@
 <?xml version="1.0" ?>
 <config>
     <version>dev build</version>
-    <help url="http://192.168.0.172/help.html"/>
-    <porttest host="192.168.0.172" application="video"/>    
+    <help url="http://192.168.0.120/help.html"/>
+    <porttest host="192.168.0.120" application="video"/>    
 	<modules>
 
 		<module name="ChatModule" url="ChatModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
+			uri="rtmp://192.168.0.120/bigbluebutton" 
 			loadNextModule="ListenersModule"	
 			onUserJoinedEvent="START"
 			onUserLogoutEvent="STOP"		 
@@ -14,55 +14,55 @@
 		<!--host="http://192.168.0.172/bigbluebutton/conference-session/enter"-->
 		<!--host="conf/join-mock.xml"-->
 		<module name="ViewersModule" url="ViewersModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
+			uri="rtmp://192.168.0.120/bigbluebutton" 
 			host="conf/join-mock.xml"
 			onAppInitEvent="LOAD" loadNextModule="ChatModule"
 			onAppStartEvent="START"
 			onUserLogoutEvent="STOP"
 		/>	
 		<module name="ListenersModule" url="ListenersModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
-			recordingHost="http://192.168.0.172"
+			uri="rtmp://192.168.0.120/bigbluebutton" 
+			recordingHost="http://192.168.0.120"
 			loadNextModule="DeskShareModule"
 			onUserJoinedEvent="START"
 			onUserLogoutEvent="STOP"
 		/>
 		
-		<module name="DeskShareModule" url="DeskShareModule.swf" uri="rtmp://192.168.0.172/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" />
+		<module name="DeskShareModule" url="DeskShareModule.swf" uri="rtmp://192.168.0.120/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" />
 		
 		<module name="PhoneModule" url="PhoneModule.swf" 
-			uri="rtmp://192.168.0.172/sip" 
+			uri="rtmp://192.168.0.120/sip" 
 			onUserJoinedEvent="START" 
 			onUserLogoutEvent="STOP"
 			loadNextModule="VideoconfModule"
 		/>
 		
 		<module name="VideoconfModule" url="VideoconfModule.swf" 
-			uri="rtmp://192.168.0.172/video"
+			uri="rtmp://192.168.0.120/video"
 			onUserJoinedEvent="START"
 			onUserLogoutEvent="STOP"	
-			loadNextModule="PresentModule"
+			loadNextModule="HighlighterModule"
 		/>
 		
 		<module name="HighlighterModule" url="HighlighterModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
+			uri="rtmp://192.168.0.120/bigbluebutton" 
 			onUserJoinedEvent="START" 
 			onUserLogoutEvent="STOP"
+			loadNextModule="PresentModule"
 		/>
 		
 		<module name="PresentModule" url="PresentModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
-			host="http://192.168.0.172" 
+			uri="rtmp://192.168.0.120/bigbluebutton" 
+			host="http://192.168.0.120" 
 			onUserJoinedEvent="START" 
 			onUserLogoutEvent="STOP"
-			loadNextModule="HighlighterModule"
 		/>
 
 		<!-- new module in development: 
 		<module name="DynamicInfoModule" url="DynamicInfoModule.swf" 
-			uri="rtmp://192.168.0.172/bigbluebutton" 
-			host="http://192.168.0.172" 
-			infoURL="http://192.168.0.172/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}"
+			uri="rtmp://192.168.0.120/bigbluebutton" 
+			host="http://192.168.0.120" 
+			infoURL="http://192.168.0.120/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}"
 			onUserJoinedEvent="START" 
 			onUserLogoutEvent="STOP"
 		/>
diff --git a/bigbluebutton-client/src/conf/config.xml.template b/bigbluebutton-client/src/conf/config.xml.template
new file mode 100755
index 0000000000000000000000000000000000000000..54a9adafdee3b7240d49cc911ea06e175bdee673
--- /dev/null
+++ b/bigbluebutton-client/src/conf/config.xml.template
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<config>
+    <version>VERSION</version>
+    <help url="http://HOST/help.html"/>
+    <porttest host="HOST" application="video"/>    
+	<modules>
+
+		<module name="ChatModule" url="ChatModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			loadNextModule="ListenersModule"	
+			onUserJoinedEvent="START"
+			onUserLogoutEvent="STOP"		 
+		/>
+		
+		<module name="ViewersModule" url="ViewersModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			host="http://HOST/bigbluebutton/conference-session/enter"
+			onAppInitEvent="LOAD" loadNextModule="ChatModule"
+			onAppStartEvent="START"
+			onUserLogoutEvent="STOP"
+		/>	
+		<module name="ListenersModule" url="ListenersModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			recordingHost="http://HOST"
+			loadNextModule="DeskShareModule"
+			onUserJoinedEvent="START"
+			onUserLogoutEvent="STOP"
+		/>
+		
+		<module name="DeskShareModule" url="DeskShareModule-VERSION.swf" uri="rtmp://HOST/deskShare" onUserJoinedEvent="START" onUserLogoutEvent="STOP" loadNextModule="PhoneModule" />
+		
+		<module name="PhoneModule" url="PhoneModule-VERSION.swf" 
+			uri="rtmp://HOST/sip" 
+			onUserJoinedEvent="START" 
+			onUserLogoutEvent="STOP"
+			loadNextModule="VideoconfModule"
+		/>
+		
+		<module name="VideoconfModule" url="VideoconfModule-VERSION.swf" 
+			uri="rtmp://HOST/video"
+			onUserJoinedEvent="START"
+			onUserLogoutEvent="STOP"	
+			loadNextModule="HighlighterModule"
+		/>
+		
+		<module name="HighlighterModule" url="HighlighterModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			onUserJoinedEvent="START" 
+			onUserLogoutEvent="STOP"
+			loadNextModule="PresentModule"
+		/>
+		
+		<module name="PresentModule" url="PresentModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			host="http://HOST" 
+			onUserJoinedEvent="START" 
+			onUserLogoutEvent="STOP"
+		/>
+
+		<!-- new module in development: 
+		<module name="DynamicInfoModule" url="DynamicInfoModule-VERSION.swf" 
+			uri="rtmp://HOST/bigbluebutton" 
+			host="http://HOST" 
+			infoURL="http://HOST/client/conf/example-info-data.xml?user={userID}&role={role}&meetingID={meetingID}"
+			onUserJoinedEvent="START" 
+			onUserLogoutEvent="STOP"
+		/>
+		-->
+		
+	</modules>
+</config>
diff --git a/bigbluebutton-client/src/conf/locales.xml b/bigbluebutton-client/src/conf/locales.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2143a3b1391c9f7a3cf6bd42f8920038993e58fd
--- /dev/null
+++ b/bigbluebutton-client/src/conf/locales.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+<locales>
+	<locale code="az_AZ" name="Azerbaijani"/>
+	<locale code="de_DE" name="German"/>
+	<locale code="el_GR" name="Greek"/>
+	<locale code="en_US" name="English"/>
+	<locale code="es_ES" name="Spanish"/>
+	<locale code="es_LA" name="Spanish (Latin American)"/>
+	<locale code="fr_FR" name="French"/>
+	<locale code="hu_HU" name="Hungarian"/>
+	<locale code="it_IT" name="Italian"/>
+	<locale code="lt_LT" name="Lithuania"/>
+	<locale code="nb_NO" name="Norwegian"/>
+	<locale code="nl_NL" name="Netherland"/>
+	<locale code="pl_PL" name="Polish"/>
+	<locale code="pt_BR" name="Portuguese (Brazilian)"/>
+	<locale code="pt_PT" name="Portuguese"/>
+	<locale code="ro_RO" name="Romanian"/>
+	<locale code="ru_RU" name="Russian"/>
+	<locale code="tr_TR" name="Turkish"/>
+	<locale code="vi_VN" name="Vietnamese"/>
+	<locale code="zh_CN" name="Chinese (Simplified)"/>
+	<locale code="zh_TW" name="Chinese (Traditional)"/>
+</locales>
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as b/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as
old mode 100644
new mode 100755
index 5791323cdf28cdf7ca6a048166e396cdf82ce7fe..b814baa1264f7bd31867664b427f634ef4502824
--- a/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/managers/BigBlueButtonPreloader.as
@@ -20,11 +20,11 @@ package org.bigbluebutton.main.managers
 		override public function set preloader(value:Sprite):void{
 			super.preloader = value;
 			value.addEventListener(RSLEvent.RSL_ERROR, sharedLibraryLoadingFailed);
-			ResourceUtil.getInstance();
+//			ResourceUtil.getInstance();
 		}
 		
 		private function sharedLibraryLoadingFailed(e:RSLEvent):void{
-			ResourceUtil.getInstance().changeLocale([ResourceUtil.DEFAULT_LANGUAGE]);
+//			ResourceUtil.getInstance().changeLocale([ResourceUtil.DEFAULT_LANGUAGE]);
 		}
 
 	}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as
old mode 100644
new mode 100755
index ab8f11b34a279960ae5ce06c1498377036671235..b58ba75660d6ccccc27e9aef2fd58f03bf397b6b
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ModuleDescriptor.as
@@ -92,6 +92,7 @@ package org.bigbluebutton.main.model
 //			loader.addEventListener("error", resultHandler);
 //			loader.addEventListener("unload", resultHandler);
 			_loader.url = _attributes.url;
+			LogUtil.debug("Loading " + _attributes.url);
 			_loader.loadModule();
 		}
 		
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml
index 9ed5d303f3fc2e618cd7d9dfa0349439c36384a3..ec69046a195fa201dfe365c15bf8a4ecff96a9f8 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopPublishWindow.mxml
@@ -149,10 +149,10 @@
 //				cursor.visible = true;
 				
 				cursorImg.visible = true;
-                cursorMove.end();
-                cursorMove.xTo=cursor.x;
-                cursorMove.yTo=cursor.y; 
-                cursorMove.play();
+                // DO NOT compute the x and y coordinate and assign directly to the cursorImg
+                // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010).
+                cursorImg.x = cursor.x;
+                cursorImg.y = cursor.y;
 			}
 			
 			private function onAppletStart(event:AppletStartedEvent):void{
@@ -237,6 +237,5 @@
 			
 		]]>
 	</mx:Script>
-	<mx:Move id="cursorMove" target="{cursorImg}"/>
 	<mx:Image id="cursorImg" visible="false" source="@Embed('../../assets/images/cursor4.png')"/>
 </MDIWindow>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml
index ed7e5a68a1b9a9b049a40e99d12fb89ba9c19ccf..7da49462cb505d690036cbcbe400a055b5019804 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskShare/view/components/DesktopViewWindow.mxml
@@ -145,10 +145,10 @@
 //				cursor.visible = true;
 				
 				cursorImg.visible = true;
-                cursorMove.end();
-                cursorMove.xTo=cursor.x;
-                cursorMove.yTo=cursor.y; 
-                cursorMove.play();
+                // DO NOT compute the x and y coordinate and assign directly to the cursorImg
+                // as it results in a flickering and jerky mouse pointer (ralam jun 10, 2010).
+                cursorImg.x = cursor.x;
+                cursorImg.y = cursor.y;
 			}
 			
 			public function startVideo(connection:NetConnection, stream:String, width:Number, height:Number):void{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
old mode 100644
new mode 100755
index 0a660c330581dc5c9723f902f18c115a9c1ab36e..c71c4e55dc9b913212308f79bb90c8080e06be0b
--- a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
@@ -23,27 +23,58 @@ package org.bigbluebutton.util.i18n
 	import flash.events.EventDispatcher;
 	import flash.events.IEventDispatcher;
 	import flash.external.ExternalInterface;
+	import flash.net.URLLoader;
+	import flash.net.URLRequest;
 	
 	import mx.events.ResourceEvent;
 	import mx.resources.IResourceManager;
 	import mx.resources.ResourceManager;
 
-	public class ResourceUtil extends EventDispatcher
-	{
+	public class ResourceUtil extends EventDispatcher {
 		private static var instance:ResourceUtil = null;
+		public static const LOCALES_FILE:String = "conf/locales.xml";
+		private var inited:Boolean = false;
 		
 		private static var MSG_RESOURCE:String = 'bbbResources';
 		public static var DEFAULT_LANGUAGE:String = "en_US";
+		private var eventDispatcher:IEventDispatcher;
 		
-		private var localeChain:Array = ["az_AZ", "de_DE", "el_GR", "en_US", "es_ES", "es_LA", "fr_FR", "hu_HU", "it_IT", "lt_LT", "nb_NO", "nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU", "tr_TR", "vi_VN", "zh_CN", "zh_TW"];
+		private var localeChain:Array = new Array();
 		
 		private var resourceManager:IResourceManager;
 		
-		public function ResourceUtil(enforcer:SingletonEnforcer)
-		{
+		public function ResourceUtil(enforcer:SingletonEnforcer) {
 			if (enforcer == null) {
 				throw new Error( "You Can Only Have One ResourceUtil" );
 			}
+			initialize();
+		}
+		
+		private function isInited():Boolean {
+			return inited;
+		}
+		
+		public function initialize():void {
+			// Add a random string on the query so that we always get an up-to-date config.xml
+			var date:Date = new Date();
+			LogUtil.debug("Loading " + LOCALES_FILE);
+			var _urlLoader:URLLoader = new URLLoader();
+			_urlLoader.addEventListener(Event.COMPLETE, handleComplete);
+			_urlLoader.load(new URLRequest(LOCALES_FILE + "?a=" + date.time));
+		}
+				
+		private function handleComplete(e:Event):void{
+			parse(new XML(e.target.data));				
+		}
+		
+		public function parse(xml:XML):void{			
+			var list:XMLList = xml.locale;
+			LogUtil.debug("--- Supported locales --- \n" + xml.toString() + "\n --- \n");
+			var locale:XML;
+						
+			for each(locale in list){
+				localeChain.push(locale.@code);
+			}							
 			
 			resourceManager = ResourceManager.getInstance();
 			resourceManager.localeChain = [ExternalInterface.call("getLanguage")];
@@ -51,25 +82,27 @@ package org.bigbluebutton.util.i18n
 			for (var i:Number = 0; i<localeChain.length; i++){
 				if (resourceManager.localeChain[0] == localeChain[i]) localeAvailable = true;
 			}
+			
 			if (!localeAvailable){
 				resourceManager.localeChain = [DEFAULT_LANGUAGE];
 				changeLocale([DEFAULT_LANGUAGE]);
-			} else changeLocale(resourceManager.localeChain[0]);
+			} else changeLocale(resourceManager.localeChain[0]);			
+			
 		}
 		
 		public static function getInstance():ResourceUtil {
 			if (instance == null) {
+				LogUtil.debug("Setting up supported locales.");
 				instance = new ResourceUtil(new SingletonEnforcer);
-			}
+			} 
 			return instance;
         }
         
-        public function changeLocale(... chain):void{
-        	
+        public function changeLocale(... chain):void{        	
         	if(chain != null && chain.length > 0)
         	{
         		var localeURI:String = 'locale/' + chain[0] + '_resources.swf';
-        		var eventDispatcher:IEventDispatcher = resourceManager.loadResourceModule(localeURI,true);
+        		eventDispatcher = resourceManager.loadResourceModule(localeURI,true);
 				localeChain = [chain[0]];
 				eventDispatcher.addEventListener(ResourceEvent.COMPLETE, localeChangeComplete);
 				eventDispatcher.addEventListener(ResourceEvent.ERROR, handleResourceNotLoaded);