diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as
deleted file mode 100755
index 003354f83ec4d736ed61c35a4b357f10d51e8d67..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
-* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
-* 
-* Copyright (c) 2012 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 3.0 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
-{
-	import flash.display.DisplayObject;
-	
-	import org.bigbluebutton.modules.whiteboard.business.shapes.GraphicObject;
-	
-	/**
-	 * An interface currently used to interface the Whiteboard module with the Presentation module in a decoupled sort of way.
-	 * 
-	 */	
-	public interface IBbbCanvas
-	{
-		function addRawChild(child:DisplayObject):void;
-		function removeRawChild(child:DisplayObject):void;
-		function doesContain(child:DisplayObject):Boolean;
-		function acceptOverlayCanvas(overlay:IBbbCanvas):void;
-		function moveCanvas(x:Number, y:Number):void;
-		function zoomCanvas(width:Number, height:Number):void;
-		function showCanvas(show:Boolean):void;
-	}
-}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as b/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as
deleted file mode 100755
index fee4a71ea289fa6041438528e32e8559b974dff3..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/api/PresentationAPI.as
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
-* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
-* 
-* Copyright (c) 2012 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 3.0 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.present.api
-{
-	import com.asfusion.mate.events.Dispatcher;
-	
-	import mx.containers.Canvas;
-	import mx.controls.Button;
-	
-	import org.bigbluebutton.common.IBbbCanvas;
-	import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
-
-	public class PresentationAPI
-	{
-		private static var instance:PresentationAPI;
-		
-		private var dispatcher:Dispatcher;
-		
-		public function PresentationAPI(enforcer:SingletonEnforcer)
-		{
-			if (enforcer == null){
-				throw new Error("There can only be 1 UserManager instance");
-			}
-			initialize();
-		}
-		
-		private function initialize():void{
-			dispatcher = new Dispatcher();
-		}
-		
-		/**
-		 * Return the single instance of the PresentationAPI class, which is a singleton
-		 */
-		public static function getInstance():PresentationAPI{
-			if (instance == null){
-				instance = new PresentationAPI(new SingletonEnforcer());
-			}
-			return instance;
-		}
-		
-		public function addOverlayCanvas(canvas:IBbbCanvas):void{
-			var overlayEvent:AddOverlayCanvasEvent = new AddOverlayCanvasEvent(AddOverlayCanvasEvent.ADD_OVERLAY_CANVAS);
-			overlayEvent.canvas = canvas;
-			dispatcher.dispatchEvent(overlayEvent);
-		}
-	}
-}
-class SingletonEnforcer{}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as
deleted file mode 100755
index 1b9ac1bfd1dccf04beaf6269f19476a22f4a465e..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/events/AddOverlayCanvasEvent.as
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
- * 
- * Copyright (c) 2012 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 3.0 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.present.events
-{
-	import flash.events.Event;
-	
-	import org.bigbluebutton.common.IBbbCanvas;
-	
-	public class AddOverlayCanvasEvent extends Event
-	{
-		public static const ADD_OVERLAY_CANVAS:String = "ADD_OVERLAY_CANVAS";
-		
-		public var canvas:IBbbCanvas;
-		
-		public function AddOverlayCanvasEvent(type:String)
-		{
-			super(type, true, false);
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml
index 39e7e39bee7e169c1e1062c6bb76adca8672f53a..ed9bd0a7369e38d8d080fa4d6dbfafeac4ea3395 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml
@@ -25,8 +25,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
       import mx.events.FlexEvent;
       
       import org.bigbluebutton.main.events.BBBEvent;
-      import org.bigbluebutton.main.model.users.events.RoleChangeEvent;
-      import org.bigbluebutton.modules.present.api.PresentationAPI;
       import org.bigbluebutton.modules.present.business.PresentProxy;
       import org.bigbluebutton.modules.present.commands.ChangePageCommand;
       import org.bigbluebutton.modules.present.commands.ChangePresentationCommand;
@@ -34,34 +32,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
       import org.bigbluebutton.modules.present.commands.GoToPageCommand;
       import org.bigbluebutton.modules.present.commands.GoToPrevPageCommand;
       import org.bigbluebutton.modules.present.commands.UploadFileCommand;
-      import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
+      import org.bigbluebutton.modules.present.events.DownloadEvent;
       import org.bigbluebutton.modules.present.events.GetListOfPresentationsRequest;
       import org.bigbluebutton.modules.present.events.PresentModuleEvent;
-      import org.bigbluebutton.modules.present.events.PresentationChangedEvent;
-      import org.bigbluebutton.modules.present.events.PresentationEvent;
       import org.bigbluebutton.modules.present.events.PresenterCommands;
       import org.bigbluebutton.modules.present.events.RemovePresentationEvent;
-      import org.bigbluebutton.modules.present.events.DownloadEvent;
       import org.bigbluebutton.modules.present.events.UploadEvent;
       import org.bigbluebutton.modules.present.managers.PresentManager;
       import org.bigbluebutton.modules.present.services.PageLoaderService;
-      import org.bigbluebutton.modules.present.services.PresentationService;
-      import org.bigbluebutton.modules.present.ui.views.PresentationWindow;
-      import org.bigbluebutton.modules.whiteboard.events.GetCurrentPresentationInfo;
-
-			private var apiInstance:PresentationAPI;
-			
-			private function createAPI():void{
-				apiInstance = PresentationAPI.getInstance();
-			}
 		]]>
 	</mx:Script>
 	
 	<EventHandlers type="{FlexEvent.PREINITIALIZE}">
 		<ObjectBuilder generator="{PresentManager}" cache="global" />
 		<ObjectBuilder generator="{PresentProxy}" cache="global" />
-    
-		<InlineInvoker method="createAPI" />
 	</EventHandlers>
 	
 	<EventHandlers type="{PresentModuleEvent.START_MODULE}" >
@@ -121,10 +105,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		<MethodInvoker generator="{PresentProxy}" method="zoomSlide" arguments="{event}" />
 	</EventHandlers>
 
-  <EventHandlers type="{GetCurrentPresentationInfo.GET_CURRENT_PRESENTATION_INFO}" >
-    <MethodInvoker generator="{PresentProxy}" method="getCurrentPresentationInfo" />
-  </EventHandlers>
-
   <EventHandlers type="{GetListOfPresentationsRequest.GET_LIST_OF_PRESENTATIONS}" >
     <MethodInvoker generator="{PresentProxy}" method="handleGetListOfPresentationsRequest" />
   </EventHandlers>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
index 4af2f02731c8a88e1a39a65887d73e08d0615e75..3aaf94504170e6f9130ba42f23e220401933c217 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml
@@ -27,20 +27,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	xmlns:code="http://code.google.com/p/flexlib/" 
 	xmlns:containers="flexlib.containers.*"
 	xmlns:mate="http://mate.asfusion.com/"
+	xmlns:views="org.bigbluebutton.modules.present.ui.views.*" 
+	xmlns:poll="org.bigbluebutton.modules.polling.views.*"
 	showCloseButton="false" layout="absolute"
 	verticalScrollPolicy="off" 
 	horizontalScrollPolicy="off" 
 	showControls="true" resize="resizeHandler()"
   	styleNameFocus="presentationWindowStyleFocus"
   	styleNameNoFocus="presentationWindowStyleNoFocus"
-	implements="org.bigbluebutton.common.IBbbModuleWindow"
+	implements="org.bigbluebutton.common.IBbbModuleWindow,org.bigbluebutton.modules.whiteboard.views.IWhiteboardReceiver"
 	initialize="init()"
 	creationComplete="onCreationComplete()" 
 	width="{DEFAULT_WINDOW_WIDTH}" height="{DEFAULT_WINDOW_HEIGHT}" 
 	x="{DEFAULT_X_POSITION}" y="{DEFAULT_Y_POSITION}"
 	title="{ResourceUtil.getInstance().getString('bbb.presentation.title')}"
-	xmlns:views="org.bigbluebutton.modules.present.ui.views.*" 
-	xmlns:poll="org.bigbluebutton.modules.polling.views.*"
 	>
 	
 	<mate:Dispatcher id="globalDispatcher" />
@@ -50,7 +50,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	<mate:Listener type="{PresentationChangedEvent.PRESENTATION_CHANGED_EVENT}" method="handlePresentationChangedEvent" />
 	<mate:Listener type="{UploadEvent.CLEAR_PRESENTATION}" method="clearPresentation" />
 	<mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleDisplaySlideEvent" />
-	<mate:Listener type="{AddOverlayCanvasEvent.ADD_OVERLAY_CANVAS}" method="addOverlayCanvas" />
 	<mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" />	
 	<mate:Listener type="{ShortcutEvent.UPLOAD_PRESENTATION}" method="remoteUpload" />
 	<mate:Listener type="{ShortcutEvent.PREVIOUS_SLIDE}" method="remotePrevious" />
@@ -75,31 +74,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		<![CDATA[
 			import flash.geom.Point;
 			
+			import flexlib.mdi.events.MDIWindowEvent;
+			
 			import mx.collections.ArrayCollection;
 			import mx.controls.Menu;
 			import mx.events.MenuEvent;
 			import mx.managers.PopUpManager;
 			
-			import flexlib.mdi.events.MDIWindowEvent;
-			
 			import org.as3commons.logging.api.ILogger;
 			import org.as3commons.logging.api.getClassLogger;
-			import org.bigbluebutton.common.IBbbCanvas;
 			import org.bigbluebutton.common.IBbbModuleWindow;
+			import org.bigbluebutton.common.events.AddUIComponentToMainCanvas;
 			import org.bigbluebutton.common.events.LocaleChangeEvent;
 			import org.bigbluebutton.core.BBB;
 			import org.bigbluebutton.core.KeyboardUtil;
 			import org.bigbluebutton.core.PopUpUtil;
 			import org.bigbluebutton.core.UsersUtil;
 			import org.bigbluebutton.main.events.MadePresenterEvent;
-			import org.bigbluebutton.main.events.ShortcutEvent;
 			import org.bigbluebutton.main.events.PresenterStatusEvent;
+			import org.bigbluebutton.main.events.ShortcutEvent;
 			import org.bigbluebutton.main.views.MainCanvas;
-			import org.bigbluebutton.modules.screenshare.events.ShareEvent;
-			import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing;
-			import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing;
-			import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing;
-			import org.bigbluebutton.modules.screenshare.view.components.ScreenshareViewWindow;
 			import org.bigbluebutton.modules.polling.events.PollShowResultEvent;
 			import org.bigbluebutton.modules.polling.events.PollStartedEvent;
 			import org.bigbluebutton.modules.polling.events.PollStoppedEvent;
@@ -109,18 +103,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			import org.bigbluebutton.modules.polling.views.PollResultsModal;
 			import org.bigbluebutton.modules.present.commands.GoToNextPageCommand;
 			import org.bigbluebutton.modules.present.commands.GoToPrevPageCommand;
-			import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
 			import org.bigbluebutton.modules.present.events.DisplaySlideEvent;
 			import org.bigbluebutton.modules.present.events.DownloadEvent;
+			import org.bigbluebutton.modules.present.events.PageLoadedEvent;
 			import org.bigbluebutton.modules.present.events.PresentationChangedEvent;
 			import org.bigbluebutton.modules.present.events.PresenterCommands;
 			import org.bigbluebutton.modules.present.events.RemovePresentationEvent;
 			import org.bigbluebutton.modules.present.events.UploadEvent;
 			import org.bigbluebutton.modules.present.model.Page;
 			import org.bigbluebutton.modules.present.model.PresentationModel;
+			import org.bigbluebutton.modules.screenshare.events.RequestToPauseSharing;
+			import org.bigbluebutton.modules.screenshare.events.RequestToRestartSharing;
+			import org.bigbluebutton.modules.screenshare.events.RequestToStartSharing;
+			import org.bigbluebutton.modules.screenshare.events.ShareEvent;
+			import org.bigbluebutton.modules.screenshare.view.components.ScreenshareViewWindow;
+			import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent;
 			import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
-			import org.bigbluebutton.modules.present.events.PageLoadedEvent;
+			import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
+			import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
+			import org.bigbluebutton.modules.whiteboard.views.WhiteboardTextToolbar;
+			import org.bigbluebutton.modules.whiteboard.views.WhiteboardToolbar;
 			import org.bigbluebutton.util.i18n.ResourceUtil;
              		
 			private static const LOGGER:ILogger = getClassLogger(PresentationWindow);      
@@ -174,9 +176,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			private var noticeSoundClass:Class;
 			private var noticeSound:Sound = new noticeSoundClass() as Sound;
 
-			private var whiteboardOverlay:IBbbCanvas = null;
+			private var whiteboardOverlay:WhiteboardCanvas = null;
 			private var screenshareView:ScreenshareViewWindow = null;
-			private var whiteboardAdded:Boolean = false;
 			
 			private function init():void{
 				presentOptions = new PresentOptions();
@@ -199,8 +200,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				hotkeyCapture();
                 
         //Necessary now because of module loading race conditions
-        var t:Timer = new Timer(2000, 1);
-        t.addEventListener(TimerEvent.TIMER, addWhiteboardToolbar);
+        var t:Timer = new Timer(5000, 1);
+        t.addEventListener(TimerEvent.TIMER, requestWhiteboardCanvas);
         t.start();
         
         presenterTabs.addEventListener(Event.CHANGE, onSelectTabEvent, true);
@@ -214,15 +215,14 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
         setPollMenuData();
       }
 			
-      private function addWhiteboardToolbar(event:TimerEvent):void {
-        LOGGER.debug("Sending event to add whiteboard canvas.");
-         callLater(fitSlideToWindowMaintainingAspectRatio);
-         // Tell the WhiteboardManager to add the toolbar
-         var e:WhiteboardButtonEvent = new WhiteboardButtonEvent(WhiteboardButtonEvent.WHITEBOARD_ADDED_TO_PRESENTATION);
-         e.window = this;
-         dispatchEvent(e);
-      }
-            
+			private function requestWhiteboardCanvas(event:TimerEvent):void {
+				LOGGER.debug("Sending event to add whiteboard canvas.");
+				callLater(fitSlideToWindowMaintainingAspectRatio);
+				
+				var dispatcher:Dispatcher = new Dispatcher();
+				dispatcher.dispatchEvent(new RequestNewCanvasEvent(this));
+			}
+			
 			private function hotkeyCapture():void{
 			    LOGGER.debug("Entering hotkeyCapture");
 			    this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
@@ -508,19 +508,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
       private function showThumbnails():void{
         slideView.thumbnailView.visible = !slideView.thumbnailView.visible;
       }
-      
-      private function addOverlayCanvas(e:AddOverlayCanvasEvent):void{
-        LOGGER.debug("OVERLAYING WHITEBOARD CANVAS");
-        whiteboardOverlay = e.canvas;
-      }
 
-      private function addWhiteboardCanvasToSlideView(e:PageLoadedEvent):void{
-        if(!whiteboardAdded && whiteboardOverlay != null) {
+      private function addWhiteboardCanvasToSlideView(e:PageLoadedEvent = null):void{
+        if(whiteboardOverlay != null) {
            LOGGER.debug("addWhiteboardCanvasToSlideView: Adding whiteboard canvas to SlideView");
            changeWhiteboardPageOnly(PresentationModel.getInstance().getCurrentPage().id);
-           whiteboardOverlay.acceptOverlayCanvas(slideView);
            slideView.acceptOverlayCanvas(whiteboardOverlay);
-           whiteboardAdded = true;
+           if (screenshareView) {
+             screenshareView.removeOverlayCanvas();
+           }
         } else LOGGER.debug("addWhiteboardCanvasToSlideView: NOT adding whiteboard canvas to Slide View.");
       }
 					
@@ -922,9 +918,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				}
 
 				if (whiteboardOverlay != null) {
-					changeWhiteboardPageOnly(PresentationModel.getInstance().getCurrentPage().id);
-					slideView.acceptOverlayCanvas(whiteboardOverlay);
-					whiteboardOverlay.acceptOverlayCanvas(slideView);
+					this.addWhiteboardCanvasToSlideView();
 				}
 
 				if(!presenterTabs.getTabAt(PRESENTATION_TAB_INDEX).visible) {
@@ -970,12 +964,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 					LOGGER.debug("Adding whiteboard layer to Deskshare View Canvas");
 					changeWhiteboardPageOnly("deskshare");
 					screenshareView.acceptOverlayCanvas(whiteboardOverlay);
-					whiteboardOverlay.acceptOverlayCanvas(screenshareView);
+					slideView.removeOverlayCanvas();
 					if(UsersUtil.amIPresenter()) {
 						annotationsPermissionChanged(true);
 					}
-					if(!whiteboardAdded)
-						whiteboardAdded = true;
 				} else {
 					LOGGER.debug("openScreenshareViewTab: whiteboard overlay or desktop view canvas is null!");
 				}
@@ -991,10 +983,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 
 			private function changeWhiteboardPageOnly(whiteboardId:String):void {
-				LOGGER.debug("Dispatching whiteboard page changed event. Id: " + whiteboardId);
-				var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.CHANGE_PAGE);
-				e.pageID = whiteboardId;
-				dispatchEvent(e);
+				if (whiteboardOverlay) {
+					LOGGER.debug("Telling the WhiteboardCanvas to switch ids. Id: " + whiteboardId);
+					whiteboardOverlay.displayWhiteboardById(whiteboardId);
+				} else {
+					LOGGER.debug("No WhiteboardCanvas overlayed cannot switch ids. Id: " + whiteboardId);
+				}
 			}
 
 			private function stopSharing():void {
@@ -1103,6 +1097,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				screenshareTab.label = ResourceUtil.getInstance().getString('bbb.screensharePublish.restart.label');
 				dispatchEvent(new RequestToPauseSharing());
 			}
+			
+			public function receiveToolbars(wt:WhiteboardToolbar, wtt:WhiteboardTextToolbar):void {
+				var addUIEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT);
+				addUIEvent.component = wt;
+				globalDispatcher.dispatchEvent(addUIEvent);
+				wt.positionToolbar(this);
+				
+				var addTextToolbarEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT);
+				addTextToolbarEvent.component = wtt;
+				globalDispatcher.dispatchEvent(addTextToolbarEvent);
+				wtt.positionToolbar(this);
+			}
+			
+			public function receiveCanvas(wc:WhiteboardCanvas):void {
+				whiteboardOverlay = wc;
+			}
 		]]>
 	</mx:Script>
 	
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml
index 1d1457a0fae0240f2a5651120dfff4f5d2bef0d5..0a2ffd2a13d2d84ec587077ca16db1253aca4faa 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml
@@ -30,8 +30,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	verticalScrollPolicy="off" 
 	horizontalScrollPolicy="off"      
   rollOut="hideCursor()" styleName="presentationSlideViewStyle"
-  xmlns:views="org.bigbluebutton.modules.present.views.*"
-  implements="org.bigbluebutton.common.IBbbCanvas">
+  xmlns:views="org.bigbluebutton.modules.present.views.*">
      
   <mate:Listener type="{PageChangedEvent.PRESENTATION_PAGE_CHANGED_EVENT}" method="handlePageChangedEvent" />
   <mate:Listener type="{PageLoadedEvent.PAGE_LOADED_EVENT}" method="handlePageLoadedEvent" />
@@ -51,7 +50,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			
 			import org.as3commons.logging.api.ILogger;
 			import org.as3commons.logging.api.getClassLogger;
-			import org.bigbluebutton.common.IBbbCanvas;
 			import org.bigbluebutton.core.UsersUtil;
 			import org.bigbluebutton.core.managers.UserManager;
 			import org.bigbluebutton.main.events.MadePresenterEvent;
@@ -67,6 +65,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			import org.bigbluebutton.modules.present.model.PresentationModel;
 			import org.bigbluebutton.modules.present.ui.views.models.SlideCalcUtil;
 			import org.bigbluebutton.modules.present.ui.views.models.SlideViewModel;
+			import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
 			import org.bigbluebutton.util.i18n.ResourceUtil;
 			
 			private static const LOGGER:ILogger = getClassLogger(SlideView);      
@@ -76,8 +75,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			public static const THUMBNAILS_CLOSED:String = "ThumbnailsClosed";
 									
 			private var cursor:Shape;
-			private var whiteboardCanvasHolder:Canvas = new Canvas();
-			private var whiteboardCanvas:IBbbCanvas;
+			private var whiteboardCanvas:WhiteboardCanvas;
 										
 			private var dispatcher:Dispatcher = new Dispatcher();
 						
@@ -101,12 +99,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				this.rawChildren.addChild(cursor);
 				cursor.visible = false;
 				
-				whiteboardCanvasHolder = new Canvas();
-				this.addChild(whiteboardCanvasHolder);
-				whiteboardCanvasHolder.x = 0;
-				whiteboardCanvasHolder.y = 0;
-				whiteboardCanvasHolder.clipContent = true;
-				
 				this.setChildIndex(thumbnailView, this.numChildren - 1);
 				
 				/*
@@ -464,52 +456,33 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			
 			private function hideCursor():void{
 				cursor.visible = false;
-			}			
-			
-			/** Inherited from IBbbCanvas*/
-			public function addRawChild(child:DisplayObject):void{
-				this.whiteboardCanvasHolder.rawChildren.addChild(child);
-			}
-			
-			public function removeRawChild(child:DisplayObject):void{
-				this.whiteboardCanvasHolder.rawChildren.removeChild(child);
 			}
 			
-			public function doesContain(child:DisplayObject):Boolean{
-				return this.whiteboardCanvasHolder.rawChildren.contains(child);
-			}
-			
-			public function acceptOverlayCanvas(overlay:IBbbCanvas):void{
-				cleanCanvasHolder();
+			public function acceptOverlayCanvas(overlay:WhiteboardCanvas):void{
 				whiteboardCanvas = overlay;
-				var c:Canvas = overlay as Canvas;
                 // add the canvas below the thumbnails
-				this.addChildAt(c, this.getChildIndex(thumbnailView));
-				c.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM;
-				c.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM;
-				c.width = slideLoader.width;
-				c.height = slideLoader.height;
+				this.addChildAt(whiteboardCanvas, this.getChildIndex(thumbnailView));
+				zoomCanvas(slideLoader.width, slideLoader.height);
 				fitSlideToLoader();
-				c.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick);
+				whiteboardCanvas.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick);
 				slideLoader.addEventListener(MouseEvent.MOUSE_DOWN, handleWhiteboardCanvasClick);
 			}
 			
+			public function removeOverlayCanvas():void {
+				whiteboardCanvas = null;
+			}
+			
 			private function handleWhiteboardCanvasClick(e:MouseEvent):void {
 				if (thumbnailView.visible) thumbnailView.visible = false;
 			}
 			
 			public function moveCanvas(x:Number, y:Number):void{
-				whiteboardCanvasHolder.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM;
-				whiteboardCanvasHolder.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM;
-				
 				if (whiteboardCanvas != null) {
-					whiteboardCanvas.moveCanvas(whiteboardCanvasHolder.x, whiteboardCanvasHolder.y);
+					whiteboardCanvas.moveCanvas(x * SlideCalcUtil.MYSTERY_NUM, y * SlideCalcUtil.MYSTERY_NUM);
 				}
 			}
 			
 			public function zoomCanvas(width:Number, height:Number):void{
-				whiteboardCanvasHolder.width = width;
-				whiteboardCanvasHolder.height = height;
 				moveCanvas(slideLoader.x, slideLoader.y);
 				if (whiteboardCanvas != null) {
 					//LogUtil.debug("Zooming Canvas " + width + " " + height);
@@ -517,20 +490,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				}
 			}
 			
-			public function showCanvas(show:Boolean):void{
-				
-			}
-			
 			private function focusSlide(e:ShortcutEvent):void{
 				focusManager.setFocus(slideLoader);
 				slideLoader.drawFocus(true);
 			}
-
-			private function cleanCanvasHolder():void{
-				while (this.whiteboardCanvasHolder.rawChildren.numChildren > 0) {
-					this.whiteboardCanvasHolder.rawChildren.removeChildAt(0);
-				}
-			}
 			
 		]]>
 	</mx:Script>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml
index 37950685fc9f30ef7ac6244737b3bf9b4eb57f6b..23c147e9431d8a80bd85ca8ceb91a84f3db3b1e4 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/view/components/ScreenshareViewWindow.mxml
@@ -25,7 +25,6 @@
         width="100%"
         height="100%"
         creationComplete="onCreationComplete()"
-        implements="org.bigbluebutton.common.IBbbCanvas"
         xmlns:mate="http://mate.asfusion.com/"
         backgroundColor="#C0C0C0">
 
@@ -35,27 +34,28 @@
 
     <mx:Script>
         <![CDATA[
-      import mx.core.UIComponent;
-      import mx.events.ResizeEvent;
-      
-      import flexlib.mdi.events.MDIWindowEvent;
-      
-      import org.as3commons.logging.api.ILogger;
-      import org.as3commons.logging.api.getClassLogger;
-      import org.bigbluebutton.common.Images;
-      import org.bigbluebutton.common.events.LocaleChangeEvent;
-      import org.bigbluebutton.core.UsersUtil;
-      import org.bigbluebutton.core.managers.ReconnectionManager;
-      import org.bigbluebutton.main.api.JSLog;
-      import org.bigbluebutton.main.events.BBBEvent;
-      import org.bigbluebutton.main.views.MainCanvas;
-      import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent;
-      import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent;
-      import org.bigbluebutton.modules.screenshare.managers.SmartWindowResizer;
-      import org.bigbluebutton.modules.screenshare.model.ScreenshareModel;
-      import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
-      import org.bigbluebutton.modules.screenshare.services.red5.Connection;
-      import org.bigbluebutton.util.i18n.ResourceUtil;
+			import flexlib.mdi.events.MDIWindowEvent;
+			
+			import mx.core.UIComponent;
+			import mx.events.ResizeEvent;
+			
+			import org.as3commons.logging.api.ILogger;
+			import org.as3commons.logging.api.getClassLogger;
+			import org.bigbluebutton.common.Images;
+			import org.bigbluebutton.common.events.LocaleChangeEvent;
+			import org.bigbluebutton.core.UsersUtil;
+			import org.bigbluebutton.core.managers.ReconnectionManager;
+			import org.bigbluebutton.main.api.JSLog;
+			import org.bigbluebutton.main.events.BBBEvent;
+			import org.bigbluebutton.main.views.MainCanvas;
+			import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent;
+			import org.bigbluebutton.modules.screenshare.events.ViewWindowEvent;
+			import org.bigbluebutton.modules.screenshare.managers.SmartWindowResizer;
+			import org.bigbluebutton.modules.screenshare.model.ScreenshareModel;
+			import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
+			import org.bigbluebutton.modules.screenshare.services.red5.Connection;
+			import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
+			import org.bigbluebutton.util.i18n.ResourceUtil;
       
       private static const LOG:String = "SC::ScreenshareViewWIndow - ";
       private static const LOGGER:ILogger = getClassLogger(ScreenshareViewWindow);
@@ -84,8 +84,7 @@
 
 			private var resizer:SmartWindowResizer = new SmartWindowResizer();
 
-			private var whiteboardCanvas:IBbbCanvas = null;
-			private var whiteboardCanvasHolder:Canvas = new Canvas();
+			private var whiteboardCanvas:WhiteboardCanvas = null;
 
 			// The following code block is to deal with a bug in FLexLib 
 			// with MDI windows not responding well to being maximized
@@ -213,7 +212,6 @@
 					videoWithWarnings.height = video.height = internalHeight;
 
 					// update the whiteboard canvas holder and overlay with new video dimensions
-					updateWhiteboardCanvasHolder();
 					updateWhiteboardCanvasOverlay();
 				}
 			}
@@ -221,34 +219,10 @@
 			private function setVideo():void {
 				LOGGER.debug("Callback called. Adding video, its whiteboard canvas and resizing components...");
 				videoHolder.addChild(video);
-				addWhiteboardCanvasHolder();
 				addWhiteboardCanvasOverlay();
 				onResizeEvent();
 			}
 
-			private function addWhiteboardCanvasHolder():void{
-				if(video != null) {
-					this.addChildAt(whiteboardCanvasHolder, 1);
-					LOGGER.debug("Whiteboard canvas holder added");
-				}
-			}
-
-			private function cleanCanvasHolder():void{
-				while (this.whiteboardCanvasHolder.rawChildren.numChildren > 0) {
-					this.whiteboardCanvasHolder.rawChildren.removeChildAt(0);
-				}
-			}
-
-			private function updateWhiteboardCanvasHolder():void{
-				if (video != null && videoHolder != null) {
-					whiteboardCanvasHolder.x = videoWithWarnings.x;
-					whiteboardCanvasHolder.y = videoWithWarnings.y;
-					whiteboardCanvasHolder.width = videoWithWarnings.width;
-					whiteboardCanvasHolder.height = videoWithWarnings.height;
-					LOGGER.debug("Whiteboard canvas holder dimensions updated");
-				}
-			}
-
 			public function addWhiteboardCanvasOverlay():void {
 				updateWhiteboardCanvasOverlay();
 				if (video != null && whiteboardCanvas != null && videoHolder != null) {
@@ -343,39 +317,13 @@
 				resourcesChanged();
 			}
 
-			/** Inherited from IBbbCanvas*/
-			public function addRawChild(child:DisplayObject):void {
-				whiteboardCanvasHolder.rawChildren.addChild(child);
-			}
-
-			public function removeRawChild(child:DisplayObject):void {
-				this.whiteboardCanvasHolder.rawChildren.removeChild(child);
-			}
-
-			public function doesContain(child:DisplayObject):Boolean {
-				return this.whiteboardCanvasHolder.rawChildren.contains(child);
-			}
-
-			public function acceptOverlayCanvas(overlay:IBbbCanvas):void {
+			public function acceptOverlayCanvas(overlay:WhiteboardCanvas):void {
 				LOGGER.debug("ScreenshareViewWindow: acceptOverlayCanvas");
-				cleanCanvasHolder();
 				whiteboardCanvas = overlay;
 			}
-
-			private function handleWhiteboardCanvasClick(e:MouseEvent):void {
-				LOGGER.debug("ScreenshareViewWindow: handleWhiteboardCanvasClick");
-			}
-
-			public function moveCanvas(x:Number, y:Number):void {
-				LOGGER.debug("ScreenshareViewWindow: moveCanvas");
-			}
-
-			public function zoomCanvas(width:Number, height:Number):void {
-				LOGGER.debug("ScreenshareViewWindow: zoomCanvas");
-			}
-
-			public function showCanvas(show:Boolean):void {
-				LOGGER.debug("ScreenshareViewWindow: showCanvas");
+			
+			public function removeOverlayCanvas():void {
+				whiteboardCanvas = null;
 			}
             
        public function handleDisconnectedEvent(event:BBBEvent):void {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
index f23345a19ec9d8c7ef20b86c159cea8deee5d432..0f137f4bf6a70264f56d4159bf8ce2a96f766e10 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
@@ -26,7 +26,6 @@ package org.bigbluebutton.modules.whiteboard
   
   import org.as3commons.logging.api.ILogger;
   import org.as3commons.logging.api.getClassLogger;
-  import org.bigbluebutton.common.IBbbCanvas;
   import org.bigbluebutton.core.managers.UserManager;
   import org.bigbluebutton.main.events.MadePresenterEvent;
   import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
@@ -36,7 +35,7 @@ package org.bigbluebutton.modules.whiteboard
   import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject;
   import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants;
   import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-  import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
+  import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
   import org.bigbluebutton.modules.whiteboard.models.Annotation;
   import org.bigbluebutton.modules.whiteboard.models.AnnotationStatus;
   import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
@@ -56,7 +55,6 @@ package org.bigbluebutton.modules.whiteboard
     private var shapeFactory:ShapeFactory = new ShapeFactory();
     private var textUpdateListener:TextUpdateListener = new TextUpdateListener();
     
-    private var bbbCanvas:IBbbCanvas;
     private var width:Number;
     private var height:Number;
 	
@@ -64,7 +62,7 @@ package org.bigbluebutton.modules.whiteboard
 		wbCanvas = whiteboardCanvas;
 		this.whiteboardModel = whiteboardModel;
 		
-		textUpdateListener.setDependencies(wbCanvas, whiteboardModel, shapeFactory);
+		textUpdateListener.setDependencies(wbCanvas, shapeFactory);
 	}
 	
 	public function isEditingText():Boolean {
@@ -75,8 +73,7 @@ package org.bigbluebutton.modules.whiteboard
       if (textUpdateListener) textUpdateListener.canvasMouseDown();
     }
     
-    public function drawGraphic(event:WhiteboardUpdate):void {
-      var o:Annotation = event.annotation;
+    public function drawGraphic(o:Annotation):void {
       //  LogUtil.debug("**** Drawing graphic [" + o.type + "] *****");
       var gobj:GraphicObject;
       switch (o.status) {
@@ -152,11 +149,11 @@ package org.bigbluebutton.modules.whiteboard
       wbCanvas.removeGraphic(gobj as DisplayObject);
     }
     
-    public function clearBoard(event:WhiteboardUpdate = null):void {
-      if (event && event.userId) {
+    public function clearBoard(userId:String=null):void {
+      if (userId) {
         for (var i:Number = _annotationsList.length-1; i >= 0; i--){
           var gobj:GraphicObject = _annotationsList[i] as GraphicObject;
-          if (gobj.userId == event.userId) {
+          if (gobj.userId == userId) {
             removeGraphic(_annotationsList[i].id);
           }
         }
@@ -192,29 +189,8 @@ package org.bigbluebutton.modules.whiteboard
         }
       }
 	}
-        /*********************************************************
-        * HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! HACK! 
-        * To tell us that the Whiteboard Canvas has been overlayed into the Presentation Canvas.
-        * The problem was that latecomers query for annotations history before the Whiteboard Canvas has
-        * been overlayed on top of the presentation canvas. When we receive the history and try to
-        * display the TEXT annotation, the text will be very small because when we calculate the font size,
-        * the value for the canvas width and height is still zero.
-        * 
-        * We need to setup the sequence of whiteboard startup properly to handle latecomers but this will
-        * do for now.
-        */
-        private var wbCanvasInitialized:Boolean = false;
-        public function parentCanvasInitialized():void {
-            wbCanvasInitialized = true;
-        }
-        
-        public function get canvasInited():Boolean {
-            return wbCanvasInitialized;
-        }
         
-        /**********************************************************/
-        
-        public function changePage(wbId:String):void{
+        public function changeWhiteboard(wbId:String):void{
             textUpdateListener.canvasMouseDown();
             
 //            LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****");
@@ -222,29 +198,15 @@ package org.bigbluebutton.modules.whiteboard
             
             var annotations:Array = whiteboardModel.getAnnotations(wbId);
 //            LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****");
-            if (annotations.length == 0) {
-                /***
-                * Check if the whiteboard canvas has already been overlayed into the presentation canvas.
-                * If not, don't query for history. The overlay canvas event will trigger the querying of
-                * the history.
-                */
-                if (wbCanvasInitialized) wbCanvas.queryForAnnotationHistory(wbId);
-            } else {
-                for (var i:int = 0; i < annotations.length; i++) {
-                    var an:Annotation = annotations[i] as Annotation;
-                    // LogUtil.debug("**** Drawing graphic from changePage [" + an.type + "] *****");
-                    var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel);
-                    if (gobj != null) {
-                        gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight);
-                        wbCanvas.addGraphic(gobj as DisplayObject);
-                        _annotationsList.push(gobj);
-                    }
-                }  
-                /*
-                for (var ij:int = 0; ij < this._annotationsList.length; ij++){
-                    redrawGraphic(this._annotationsList[ij] as GraphicObject, ij);
+            for (var i:int = 0; i < annotations.length; i++) {
+                var an:Annotation = annotations[i] as Annotation;
+                // LogUtil.debug("**** Drawing graphic from changePage [" + an.type + "] *****");
+                var gobj:GraphicObject = shapeFactory.makeGraphicObject(an, whiteboardModel);
+                if (gobj != null) {
+                    gobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight);
+                    wbCanvas.addGraphic(gobj as DisplayObject);
+                    _annotationsList.push(gobj);
                 }
-				*/
             }
         }
     
@@ -261,9 +223,5 @@ package org.bigbluebutton.modules.whiteboard
     private function redrawGraphic(gobj:GraphicObject, objIndex:int):void {
       gobj.redraw(shapeFactory.parentWidth, shapeFactory.parentHeight);
     }
-    
-    public function isPageEmpty():Boolean {
-      return _annotationsList.length == 0;
-    }
   }
 }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as
index a415afa9c25b24cd76d02ce3bf7f2b1598031037..93bb55d31a4bb2f2d04a792495fb38aeebca70a3 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasModel.as
@@ -20,6 +20,8 @@ package org.bigbluebutton.modules.whiteboard
 {
   import flash.events.KeyboardEvent;
   
+  import mx.containers.Canvas;
+  
   import org.bigbluebutton.core.managers.UserManager;
   import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory;
   import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
@@ -35,7 +37,6 @@ package org.bigbluebutton.modules.whiteboard
     * Class responsible for handling actions from presenter and sending annotations to the server.
     */
   public class WhiteboardCanvasModel {
-    public var whiteboardModel:WhiteboardModel;
     private var _wbCanvas:WhiteboardCanvas;	      
     private var drawListeners:Array = new Array();
     private var wbTool:WhiteboardTool = new WhiteboardTool();
@@ -52,11 +53,12 @@ package org.bigbluebutton.modules.whiteboard
     private var width:Number;
     private var height:Number;
         
-    public function set wbCanvas(canvas:WhiteboardCanvas):void {
+    public function setDependencies(canvas:WhiteboardCanvas, displayModel:WhiteboardCanvasDisplayModel):void {
       _wbCanvas = canvas;
-      drawListeners.push(new PencilDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel));
-      drawListeners.push(new ShapeDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel));
-      drawListeners.push(new TextDrawListener(idGenerator, _wbCanvas, sendShapeFrequency, shapeFactory, whiteboardModel));
+      
+      drawListeners.push(new PencilDrawListener(idGenerator, _wbCanvas, shapeFactory));
+      drawListeners.push(new ShapeDrawListener(idGenerator, _wbCanvas, shapeFactory));
+      drawListeners.push(new TextDrawListener(idGenerator, _wbCanvas, shapeFactory));
     }
         
     public function zoomCanvas(width:Number, height:Number):void {
@@ -80,10 +82,10 @@ package org.bigbluebutton.modules.whiteboard
       }
     }
 
-    public function doMouseDown(mouseX:Number, mouseY:Number):void {
+    public function doMouseDown(mouseX:Number, mouseY:Number, wbId:String):void {
       // LogUtil.debug("*** CanvasModel doMouseDown");
       for (var ob:int = 0; ob < drawListeners.length; ob++) {
-        (drawListeners[ob] as IDrawListener).onMouseDown(mouseX, mouseY, wbTool);
+        (drawListeners[ob] as IDrawListener).onMouseDown(mouseX, mouseY, wbTool, wbId);
       }
     }
 
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as
index d0f79668c5356095e0e403a5a416b52bad6a8c6d..b7cd9a86034b92b883e7bfe84100535987ace14d 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawAnnotation.as
@@ -34,6 +34,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
             _status = s;
         }
         
-        public function createAnnotation(wbModel:WhiteboardModel):Annotation {return null}
+        public function createAnnotation(wbId:String):Annotation {return null}
     }
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as
index 2bf14741467ec6cc8fbe48aea109c47e3bd0e74e..6291efbc72cb1056626d484c7b37654397bc79cf 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/EllipseAnnotation.as
@@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			return shape;
 		}
 		
-		override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+		override public function createAnnotation(wbId:String):Annotation {
 			var ao:Object = new Object();
 			ao["type"] = _type;
 			ao["points"] = optimize(_shape);
@@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			ao["status"] = _status;
 			ao["transparency"] = _transparent;
 
-      var wbId:String = wbModel.getCurrentWhiteboardId();
       if (wbId != null) {
         ao["whiteboardId"] = wbId;
       }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as
index c02eba9316bfc0985e91a9e119bdb5690610c5a7..0c9bf747e0b4ef6a23946b970f52346bd57b2636 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/IDrawAnnotation.as
@@ -23,6 +23,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 
     public interface IDrawAnnotation
     {
-        function createAnnotation(wbModel:WhiteboardModel):Annotation;
+        function createAnnotation(wbId:String):Annotation;
     }
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as
index f771554baf9a96cd2c154c9de4ad8e16940afe32..94abad2334e8b7b12201548615ab67a8344412b9 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/LineAnnotation.as
@@ -56,7 +56,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			return shape;
 		}
 		
-		override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+		override public function createAnnotation(wbId:String):Annotation {
 			var ao:Object = new Object();
 			ao["type"] = _type;
 			ao["points"] = optimize(_shape);
@@ -66,7 +66,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			ao["status"] = _status;
 			ao["transparency"] = _transparent;
 
-      var wbId:String = wbModel.getCurrentWhiteboardId();
       if (wbId != null) {
         ao["whiteboardId"] = wbId;
       }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as
index 1af1c88e1e7efc1aae41fb1bb575c87b4f149971..59a466d1562e3616391bbfb9d17ae4993bd1e38e 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/PencilDrawAnnotation.as
@@ -41,7 +41,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
             _transparent = trans;
         }
                
-        override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+        override public function createAnnotation(wbId:String):Annotation {
             var ao:Object = new Object();
             ao["type"] = _type;
             ao["points"] = _shape;
@@ -51,7 +51,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
             ao["status"] = _status;
             ao["transparency"] = _transparent;
 
-            var wbId:String = wbModel.getCurrentWhiteboardId();
             if (wbId != null) {
               ao["whiteboardId"] = wbId;
             }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as
index 055a79b8795acadeefaa438bccda5fb6e04edc03..5e0f34d82e39c9f2e73ea43e6442e140850fe60e 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/RectangleAnnotation.as
@@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			return shape;
 		}
 		
-		override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+		override public function createAnnotation(wbId:String):Annotation {
 			var ao:Object = new Object();
 			ao["type"] = _type;
 			ao["points"] = optimize(_shape);
@@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			ao["status"] = _status;
 			ao["transparency"] = _transparent;
 			
-      var wbId:String = wbModel.getCurrentWhiteboardId();
       if (wbId != null) {
         ao["whiteboardId"] = wbId;
       }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as
index 471bacdbd4978bfd4ec7df4ba9ce3f5a06f7644a..2ec07adcb7b099035cc29fb46d59c471a6a4b915 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawAnnotation.as
@@ -48,7 +48,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
       _calcedFontSize = calcedFontSize;
     }
         
-    override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+    override public function createAnnotation(wbId:String):Annotation {
       var ao:Object = new Object();
       ao["type"] = AnnotationType.TEXT;
       ao["id"] = _id;
@@ -63,7 +63,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
       ao["textBoxWidth"] = _textBoxWidth;
       ao["textBoxHeight"] = _textBoxHeight;
             
-      var wbId:String = wbModel.getCurrentWhiteboardId();
       if (wbId != null) {
         ao["whiteboardId"] = wbId;
       }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as
index 0cf0bb95bf25a322e715fd868fabe563f8e62c2f..c31848357b7bbb28b6d57f325df6c7e5e93ac5ce 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextObject.as
@@ -78,6 +78,10 @@ package org.bigbluebutton.modules.whiteboard.business.shapes {
 			return _fontSize;
 		}
 		
+		public function get whiteboardId():String {
+			return _ao.whiteboardId;
+		}
+		
 		public function denormalize(val:Number, side:Number):Number {
 			return (val*side)/100.0;
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as
index 56a7d91b1f73abfe0a4dc92a53c643975fb18331..34bab71c890085998b4518e7febfb843d1f76db7 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TriangleAnnotation.as
@@ -55,7 +55,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			return shape;
 		}
 		
-		override public function createAnnotation(wbModel:WhiteboardModel):Annotation {
+		override public function createAnnotation(wbId:String):Annotation {
 			var ao:Object = new Object();
 			ao["type"] = _type;
 			ao["points"] = optimize(_shape);
@@ -65,7 +65,6 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
 			ao["status"] = _status;
 			ao["transparency"] = _transparent;
       
-      var wbId:String = wbModel.getCurrentWhiteboardId();
       if (wbId != null) {
         ao["whiteboardId"] = wbId;
       }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as
deleted file mode 100755
index 3e3feab7015c3e764381ad9f66651b638b0421c5..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/GetCurrentPresentationInfo.as
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.bigbluebutton.modules.whiteboard.events
-{
-  import flash.events.Event;
-  
-  public class GetCurrentPresentationInfo extends Event
-  {
-    public static const GET_CURRENT_PRESENTATION_INFO:String = "Get Current Presentation Info Event";
-    
-    public function GetCurrentPresentationInfo()
-    {
-      super(GET_CURRENT_PRESENTATION_INFO, true, false);
-    }
-  }
-}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as
deleted file mode 100755
index 4d6e1bce20db731a878bb633753914e2d3ba6a8f..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/PageEvent.as
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
-* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
-* 
-* Copyright (c) 2012 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 3.0 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.whiteboard.events
-{
-	import flash.events.Event;
-	
-	import mx.collections.ArrayCollection;
-	
-	public class PageEvent extends Event
-	{
-		public static const CHANGE_PAGE:String = "ChangePage";
-		public static const LOAD_PAGE:String = "LoadPage";
-		
-		public var pageNum:Number;
-		public var graphicObjs:ArrayCollection;
-		public var isGrid:Boolean;
-		
-		public function PageEvent(type:String)
-		{
-			super(type, true, false);
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as
new file mode 100755
index 0000000000000000000000000000000000000000..748ac0e3630c74f3e21ca6e8ea5a507b982341c1
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/RequestNewCanvasEvent.as
@@ -0,0 +1,16 @@
+package org.bigbluebutton.modules.whiteboard.events {
+	import flash.events.Event;
+	
+	import org.bigbluebutton.modules.whiteboard.views.IWhiteboardReceiver;
+	
+	public class RequestNewCanvasEvent extends Event {
+		public static const REQUEST_NEW_CANVAS:String = "request_new_whiteboard_canvas";
+		
+		public var receivingObject:IWhiteboardReceiver;
+		
+		public function RequestNewCanvasEvent(ro:IWhiteboardReceiver) {
+			super(REQUEST_NEW_CANVAS, false, false);
+			receivingObject = ro;
+		}
+	}
+}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as
similarity index 87%
rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as
rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as
index 415cd097d9570835338e537c2934044927e0e9b7..413f9e3098481c7730b4875db645331a05a67881 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardPresenterEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardAccessEvent.as
@@ -20,14 +20,15 @@ package org.bigbluebutton.modules.whiteboard.events
 {
 	import flash.events.Event;
 	
-	public class WhiteboardPresenterEvent extends Event
+	public class WhiteboardAccessEvent extends Event
 	{
 		public static const MODIFY_WHITEBOARD_ACCESS:String = "MODIFY_WHITEBOARD_ACCESS_EVENT";
 		public static const MODIFIED_WHITEBOARD_ACCESS:String = "MODIFIED_WHITEBOARD_ACCESS_EVENT";
 		
 		public var multiUser:Boolean;
+		public var whiteboardId:String;
 		
-		public function WhiteboardPresenterEvent(type:String)
+		public function WhiteboardAccessEvent(type:String)
 		{
 			super(type, false, false);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as
index e4469dd6cd60c563860baf164d91cd529a0e17c2..f81458caee099cbde45852cfae0d3db96e3bc83c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardButtonEvent.as
@@ -26,16 +26,12 @@ package org.bigbluebutton.modules.whiteboard.events
 	{
 		public static const ENABLE_WHITEBOARD:String = "enable_whiteboard";
 		public static const DISABLE_WHITEBOARD:String = "disable_whiteboard";
-		public static const WHITEBOARD_ADDED_TO_PRESENTATION:String = "whiteboard_added";		
-		public static const CHANGE_TO_PENCIL:String = "change-to-pencil";
 		
 		public static const WHITEBOARD_BUTTON_PRESSED:String = "WhiteboardButtonPressedEvent";
 		
 		public var toolType:String;
 		public var graphicType:String;
 		
-		public var window:PresentationWindow;
-		
 		public function WhiteboardButtonEvent(type:String)
 		{
 			super(type, true, false);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as
index 5361200038abe373379ab1ee1d3db7e848ef2e71..1cd5987adc9325a701fd3f96ad7162257cba4ff0 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardDrawEvent.as
@@ -29,10 +29,9 @@ package org.bigbluebutton.modules.whiteboard.events
 		public static const SEND_SHAPE:String = "sendShape";
 		public static const CLEAR:String = "WhiteboardClearCommand";
 		public static const UNDO:String = "WhiteboardUndoCommand";
-        
-    public static const GET_ANNOTATION_HISTORY:String = "WhiteboardGetAnnotationHistory";
 		
 		public var annotation:Annotation;
+		public var wbId:String;
 		       
 		public function WhiteboardDrawEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = false)
 		{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as
deleted file mode 100755
index 1b15a20971372f4d34674a58bbe672cc213580b3..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardShapesEvent.as
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.bigbluebutton.modules.whiteboard.events
-{
-  import flash.events.Event;
-  
-  public class WhiteboardShapesEvent extends Event
-  {
-    
-    public static const SHAPES_EVENT:String = "whiteboard shapes history event";
-    
-    public var whiteboardId:String;
-    
-    public function WhiteboardShapesEvent(wbId:String)
-    {
-      super(SHAPES_EVENT, true, false);
-      whiteboardId = wbId;
-    }
-  }
-}
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as
similarity index 61%
rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as
rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as
index a10c2f1567d4ded99c3b67545592b50543a0c09b..6281d1d7df0c46c86cb5da0ddd71f4f5f99abeb1 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdate.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/events/WhiteboardUpdateReceived.as
@@ -22,27 +22,19 @@ package org.bigbluebutton.modules.whiteboard.events
 	
 	import org.bigbluebutton.modules.whiteboard.models.Annotation;
 	
-	public class WhiteboardUpdate extends Event
+	public class WhiteboardUpdateReceived extends Event
 	{
-		public static const BOARD_UPDATED:String = "boardUpdated";
-		public static const BOARD_CLEARED:String = "boardClear";
-		public static const BOARD_ENABLED:String = "boardEnabled";
-		public static const GRAPHIC_UNDONE:String = "graphicUndone";
-        
-        
-    // Event to notify display of presenter's request.
-    public static const UNDO_ANNOTATION:String = "WhiteboardUndoAnnotationEvent";
-    public static const CLEAR_ANNOTATIONS:String = "WhiteboardClearAnnotationEvent";
+		public static const NEW_ANNOTATION:String = "boardUpdated";
+		public static const UNDO_ANNOTATION:String = "WhiteboardUndoAnnotationEvent";
+		public static const CLEAR_ANNOTATIONS:String = "WhiteboardClearAnnotationEvent";
 		public static const RECEIVED_ANNOTATION_HISTORY:String = "WhiteboardReceivedAnnotationHistoryEvent";
-    public static const CHANGE_PAGE:String = "WhiteboardChangePageEvent";
         
 		public var annotation:Annotation;
-		public var boardEnabled:Boolean;
 		public var annotationID:String;
-		public var pageID:String;
+		public var wbId:String;
 		public var userId:String;
 		
-		public function WhiteboardUpdate(type:String)
+		public function WhiteboardUpdateReceived(type:String)
 		{
 			super(type, true, false);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
index 659425b0dc7f18ec038ec0898586332278efb61d..29e447454a04758afee301e59a1e52f3c4df32aa 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
@@ -26,13 +26,12 @@ package org.bigbluebutton.modules.whiteboard.managers
 	import org.as3commons.logging.api.ILogger;
 	import org.as3commons.logging.api.getClassLogger;
 	import org.bigbluebutton.common.events.AddUIComponentToMainCanvas;
-	import org.bigbluebutton.modules.present.api.PresentationAPI;
 	import org.bigbluebutton.modules.present.events.PageLoadedEvent;
 	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
 	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
+	import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent;
 	import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
 	import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
 	import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
 	import org.bigbluebutton.modules.whiteboard.views.WhiteboardTextToolbar;
@@ -44,107 +43,23 @@ package org.bigbluebutton.modules.whiteboard.managers
     
     /* Injected by Mate */
     public var whiteboardModel:WhiteboardModel;
-        
-		private var globalDispatcher:Dispatcher;
-		private var highlighterCanvas:WhiteboardCanvas;
-		private var highlighterToolbar:WhiteboardToolbar;
-		private var textToolbar:WhiteboardTextToolbar;
-
-		private var model:WhiteboardCanvasModel = new WhiteboardCanvasModel();
-		private var displayModel:WhiteboardCanvasDisplayModel = new WhiteboardCanvasDisplayModel();
-
-		private var previousWhiteboardPageId:String;
-        
+	
 		public function WhiteboardManager() {
-			globalDispatcher = new Dispatcher();
+			
 		}
 		
-		public function handleStartModuleEvent():void {	
-			if (highlighterCanvas != null) return;
-            
-			highlighterCanvas = new WhiteboardCanvas();
-			highlighterCanvas.model = model;
-      highlighterCanvas.displayModel = displayModel;
-      model.whiteboardModel = whiteboardModel
-                
-		  model.wbCanvas = highlighterCanvas;
-			displayModel.setDependencies(highlighterCanvas, whiteboardModel);
-			
-			if (highlighterToolbar != null) return;
-            
-			highlighterToolbar = new WhiteboardToolbar();
-			highlighterToolbar.canvas = highlighterCanvas;
-            
-			if (textToolbar != null) return;
-            
-			textToolbar = new WhiteboardTextToolbar();
-			textToolbar.canvas = highlighterCanvas;
-			textToolbar.init();
-			highlighterCanvas.textToolbar = textToolbar;
+		public function handleStartModuleEvent():void {
             
 			//Necessary now because of module loading race conditions
-			var t:Timer = new Timer(1000, 1);
-			t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas);
-			t.start();
-		}
-		
-		private function addHighlighterCanvas(e:TimerEvent):void {
-      		LOGGER.debug("Adding Whiteboard Overlay Canvas");
-			PresentationAPI.getInstance().addOverlayCanvas(highlighterCanvas);
-		}	
-
-		public function positionToolbar(e:WhiteboardButtonEvent):void {
-			// add text toolbar for allowing customization of text	
-			var addUIEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT);
-			addUIEvent.component = highlighterToolbar;
-			globalDispatcher.dispatchEvent(addUIEvent);
-			highlighterToolbar.positionToolbar(e.window);
-			highlighterToolbar.stage.focus = highlighterToolbar;
-			
-			var addTextToolbarEvent:AddUIComponentToMainCanvas = new AddUIComponentToMainCanvas(AddUIComponentToMainCanvas.ADD_COMPONENT);
-			addTextToolbarEvent.component = textToolbar;
-			globalDispatcher.dispatchEvent(addTextToolbarEvent);
-			textToolbar.positionToolbar(e.window);
-		}
-
-		public function drawGraphic(event:WhiteboardUpdate):void {
-			if (event.annotation.whiteboardId == whiteboardModel.getCurrentWhiteboardId()) {
-				displayModel.drawGraphic(event);
-			}
+			//var t:Timer = new Timer(1000, 1);
+			//t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas);
+			//t.start();
 		}
 		
-		public function clearAnnotations(event:WhiteboardUpdate):void {
-      displayModel.clearBoard(event);
-		}
-        
-    public function receivedAnnotationsHistory(event:WhiteboardShapesEvent):void {
-      displayModel.receivedAnnotationsHistory(event.whiteboardId);
-    }
-		
-		public function undoAnnotation(event:WhiteboardUpdate):void {
-			displayModel.undoAnnotation(event.annotation);
-		}
-			
-		public function enableWhiteboard(e:WhiteboardButtonEvent):void {
-			highlighterCanvas.enableWhiteboard(e);
+		public function handleRequestNewCanvas(e:RequestNewCanvasEvent):void {
+			var whiteboardCanvas:WhiteboardCanvas = new WhiteboardCanvas(whiteboardModel);
+			whiteboardCanvas.attachToReceivingObject(e.receivingObject);
 		}
-		
-		public function disableWhiteboard(e:WhiteboardButtonEvent):void {
-			highlighterCanvas.disableWhiteboard(e);
-		}
-    
-    public function handlePageChangedEvent(e:PageLoadedEvent):void {
-      if(!whiteboardModel.isOverlayingDeskshare()) {
-         whiteboardModel.setCurrentWhiteboardId(e.pageId);
-         displayModel.changePage(e.pageId);
-      }
-      else LOGGER.debug("Got new slide page loaded, but current whiteboard page is deskshare: doing nothing.");
-    }
-
-    public function handleChangeWhiteboardPageEvent(e:WhiteboardUpdate):void {
-      whiteboardModel.setCurrentWhiteboardId(e.pageID);
-      displayModel.changePage(e.pageID);
-    }
 
     public function removeAnnotationsHistory():void {
       // it will dispatch the cleanAnnotations in the displayModel later
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml
index cc9305e738c80df6a67afb6ac486c820e5ef1197..75f5c2ff5492cb82ac4f9bf8bd99f3e172d57136 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml
@@ -24,33 +24,27 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	<mx:Script>
 		<![CDATA[
 			import org.bigbluebutton.main.events.BBBEvent;
-			import org.bigbluebutton.main.events.ModuleStartedEvent;
-			import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
 			import org.bigbluebutton.modules.present.events.PageLoadedEvent;
 			import org.bigbluebutton.modules.present.events.PresentationEvent;
-			import org.bigbluebutton.modules.present.events.UploadEvent;
-			import org.bigbluebutton.modules.present.events.WindowResizedEvent;
 			import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand;
 			import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
-			import org.bigbluebutton.modules.whiteboard.events.PageEvent;
+			import org.bigbluebutton.modules.whiteboard.events.RequestNewCanvasEvent;
 			import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent;
+			import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
 			import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
 			import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
+			import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
 			import org.bigbluebutton.modules.whiteboard.managers.WhiteboardManager;
 			import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
 			import org.bigbluebutton.modules.whiteboard.services.MessageReceiver;
 			import org.bigbluebutton.modules.whiteboard.services.MessageSender;
 			import org.bigbluebutton.modules.whiteboard.services.WhiteboardService;
-			import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
 			
 		]]>
 	</mx:Script>
 	
 	
-	<EventHandlers type="{WhiteboardPresenterEvent.MODIFY_WHITEBOARD_ACCESS}" >
+	<EventHandlers type="{WhiteboardAccessEvent.MODIFY_WHITEBOARD_ACCESS}" >
 		<MethodInvoker generator="{WhiteboardService}" method="modifyAccess" arguments="{event}" />
 	</EventHandlers>
 	
@@ -65,13 +59,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	<EventHandlers type="{StartWhiteboardModuleEvent.START_HIGHLIGHTER_MODULE_EVENT}">
 		<MethodInvoker generator="{WhiteboardManager}" method="handleStartModuleEvent" />
 	</EventHandlers>
-
+	
+	<EventHandlers type="{RequestNewCanvasEvent.REQUEST_NEW_CANVAS}">
+		<MethodInvoker generator="{WhiteboardManager}" method="handleRequestNewCanvas" arguments="{event}"/>
+	</EventHandlers>
+	
     <EventHandlers type="{GetWhiteboardShapesCommand.GET_SHAPES}">
         <MethodInvoker generator="{WhiteboardService}" method="getAnnotationHistory" arguments="{event}"/>
     </EventHandlers>
     
 	<EventHandlers type="{WhiteboardDrawEvent.CLEAR}" >
-		<MethodInvoker generator="{WhiteboardService}" method="clearBoard" />
+		<MethodInvoker generator="{WhiteboardService}" method="clearBoard" arguments="{event}" />
 	</EventHandlers>
 	
 	<EventHandlers type="{WhiteboardDrawEvent.SEND_SHAPE}">
@@ -79,45 +77,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	</EventHandlers>
 	
 	<EventHandlers type="{WhiteboardDrawEvent.UNDO}" >
-		<MethodInvoker generator="{WhiteboardService}" method="undoGraphic" />
-	</EventHandlers>
-					
-	<EventHandlers type="{WhiteboardButtonEvent.WHITEBOARD_ADDED_TO_PRESENTATION}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="positionToolbar" arguments="{event}" />
+		<MethodInvoker generator="{WhiteboardService}" method="undoGraphic" arguments="{event}" />
 	</EventHandlers>
 	
-    <EventHandlers type="{WhiteboardShapesEvent.SHAPES_EVENT}" >
-        <MethodInvoker generator="{WhiteboardManager}" method="receivedAnnotationsHistory" arguments="{event}"/>
-    </EventHandlers>
-  
-	<EventHandlers type="{WhiteboardUpdate.CLEAR_ANNOTATIONS}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="clearAnnotations" arguments="{event}"/>
-	</EventHandlers>
-  
-	<EventHandlers type="{WhiteboardUpdate.BOARD_UPDATED}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="drawGraphic" arguments="{event}"/>
-	</EventHandlers>
-  
-	<EventHandlers type="{WhiteboardUpdate.UNDO_ANNOTATION}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="undoAnnotation" arguments="{event}" />
-	</EventHandlers>
-  
-	<EventHandlers type="{WhiteboardButtonEvent.ENABLE_WHITEBOARD}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="enableWhiteboard" arguments="{event}" />
-	</EventHandlers>
-  
-	<EventHandlers type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" >
-		<MethodInvoker generator="{WhiteboardManager}" method="disableWhiteboard" arguments="{event}" />
+	<EventHandlers type="{GetWhiteboardShapesCommand.GET_SHAPES}" >
+		<MethodInvoker generator="{WhiteboardService}" method="getAnnotationHistory" arguments="{event}" />
 	</EventHandlers>
 
-  <EventHandlers type="{PageLoadedEvent.PAGE_LOADED_EVENT}" >
-    <MethodInvoker generator="{WhiteboardManager}" method="handlePageChangedEvent" arguments="{event}" />
-  </EventHandlers>
-
-  <EventHandlers type="{WhiteboardUpdate.CHANGE_PAGE}" >
-    <MethodInvoker generator="{WhiteboardManager}" method="handleChangeWhiteboardPageEvent" arguments="{event}" />
-  </EventHandlers>
-  
   <EventHandlers type="{BBBEvent.RECONNECT_BIGBLUEBUTTON_SUCCEEDED_EVENT}" >
     <MethodInvoker generator="{WhiteboardManager}" method="removeAnnotationsHistory" />
   </EventHandlers>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as
index 05c33f36bded704ba457801bf96c240f0a472ca5..981d9b739c217794c4b34abd4774f5f1aac163ac 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Whiteboard.as
@@ -7,6 +7,7 @@ package org.bigbluebutton.modules.whiteboard.models
   public class Whiteboard
   {
     private var _id:String;
+    private var _historyLoaded:Boolean = false;
     private var _annotations:ArrayCollection = new ArrayCollection();
     
     public function Whiteboard(id:String) {
@@ -17,10 +18,22 @@ package org.bigbluebutton.modules.whiteboard.models
       return _id;
     }
     
+    public function get historyLoaded():Boolean {
+      return _historyLoaded;
+    }
+    
+    public function set historyLoaded(v:Boolean):void {
+      _historyLoaded = v;
+    }
+    
     public function addAnnotation(annotation:Annotation):void {
       _annotations.addItem(annotation);
     }
     
+    public function addAnnotationAt(annotation:Annotation, index:int):void {
+      _annotations.addItemAt(annotation, index);
+    }
+    
     public function updateAnnotation(annotation:Annotation):void {
       var a:Annotation = getAnnotation(annotation.id);
       if (a != null) {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
index 2bc50519e4c7311c90c298819a1195cd2ae5c31d..fa03f109d1415cada308684b68e35c3aafa77ff3 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
@@ -18,6 +18,7 @@
  */
 package org.bigbluebutton.modules.whiteboard.models
 {
+	import flash.events.EventDispatcher;
 	import flash.events.IEventDispatcher;
 	
 	import mx.collections.ArrayCollection;
@@ -28,11 +29,12 @@ package org.bigbluebutton.modules.whiteboard.models
 	import org.bigbluebutton.modules.present.model.Page;
 	import org.bigbluebutton.modules.present.model.PresentationModel;
 	import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardShapesEvent;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
+	import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
 
-	public class WhiteboardModel
+	public class WhiteboardModel extends EventDispatcher
 	{
 		private static const LOGGER:ILogger = getClassLogger(WhiteboardModel);      
 		private var _whiteboards:ArrayCollection = new ArrayCollection();
@@ -40,69 +42,63 @@ package org.bigbluebutton.modules.whiteboard.models
 		private var _multiUser:Boolean = false;
 
     private var _dispatcher:IEventDispatcher;
-
-    private var currentWhiteboardId:String;
         
     public function WhiteboardModel(dispatcher:IEventDispatcher) {
       _dispatcher = dispatcher;
     }		
 		
-    private function getWhiteboard(id:String):Whiteboard {
-       for (var i:int = 0; i < _whiteboards.length; i++) {
-         var wb:Whiteboard = _whiteboards.getItemAt(i) as Whiteboard;
-         if (wb.id == id) return wb;
-       }
-       return null;
+    private function getWhiteboard(id:String, requestHistory:Boolean=true):Whiteboard {
+      var wb:Whiteboard;
+      
+      for (var i:int = 0; i < _whiteboards.length; i++) {
+        wb = _whiteboards.getItemAt(i) as Whiteboard;
+        if (wb.id == id) return wb;
+      }
+      
+      wb = new Whiteboard(id);
+      _whiteboards.addItem(wb);
+      
+      if (requestHistory) {
+        _dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(id));
+      }
+      
+      return wb;
     }
     
-		public function addAnnotation(annotation:Annotation):void {
-     // LOGGER.debug("*** Adding annotation [{0},{1},{2}] ****", [annotation.id, annotation.type, annotation.status]);
-      var wb:Whiteboard;
+    public function addAnnotation(annotation:Annotation):void {
+      // LOGGER.debug("*** Adding annotation [{0},{1},{2}] ****", [annotation.id, annotation.type, annotation.status]);
+      var wb:Whiteboard = getWhiteboard(annotation.whiteboardId);;
       if (annotation.status == AnnotationStatus.DRAW_START || annotation.type == AnnotationType.POLL) {
-        wb = getWhiteboard(annotation.whiteboardId);
-        if (wb != null) {
-          wb.addAnnotation(annotation);
-        } else {
-          wb = new Whiteboard(annotation.whiteboardId);
-          wb.addAnnotation(annotation);
-          _whiteboards.addItem(wb);
-        }         
-       } else {
-         wb = getWhiteboard(annotation.whiteboardId);
-         if (wb != null) {
-           wb.updateAnnotation(annotation);
-         }
-       }
-			 
+        wb.addAnnotation(annotation);
+      } else {
+        wb.updateAnnotation(annotation);
+      }
       // LOGGER.debug("*** Dispatching WhiteboardUpdate.BOARD_UPDATED Event ****");
-       var event:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.BOARD_UPDATED);
-       event.annotation = annotation;
-       _dispatcher.dispatchEvent(event);
-//       trace(LOG + "*** Dispatched WhiteboardUpdate.BOARD_UPDATED Event ****");
-		}
+      var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.NEW_ANNOTATION);
+      event.annotation = annotation;
+      dispatchEvent(event);
+    }
 		
     private function addShapes(wb:Whiteboard, shapes:Array):void {
       for (var i:int = 0; i < shapes.length; i++) {
         var an:Annotation = shapes[i] as Annotation;
-        wb.addAnnotation(an);
+        wb.addAnnotationAt(an, i);
       }  
     }
     
     
     public function addAnnotationFromHistory(whiteboardId:String, annotation:Array):void {                
       //LOGGER.debug("addAnnotationFromHistory: wb id=[{0}]", [whiteboardId]);
-      var wb:Whiteboard = getWhiteboard(whiteboardId);
-      if (wb != null) {
-       // LOGGER.debug("Whiteboard is already present. Adding shapes.");
-        addShapes(wb, annotation);
-      } else {
-       // LOGGER.debug("Whiteboard is NOT present. Creating WB and adding shapes.");
-        wb = new Whiteboard(whiteboardId);
+      var wb:Whiteboard = getWhiteboard(whiteboardId, false);
+      if (wb != null && !wb.historyLoaded) {
+        // LOGGER.debug("Whiteboard is already present. Adding shapes.");
         addShapes(wb, annotation);
-        _whiteboards.addItem(wb);
-      } 
-
-      _dispatcher.dispatchEvent(new WhiteboardShapesEvent(wb.id));
+        wb.historyLoaded = true;
+        
+        var e:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.RECEIVED_ANNOTATION_HISTORY);
+        e.wbId = wb.id;
+        dispatchEvent(e);
+      }
     }
         
 		public function removeAnnotation(wbId:String, shapeId:String):void {
@@ -111,23 +107,12 @@ package org.bigbluebutton.modules.whiteboard.models
 			if (wb != null) {
 				var removedAnnotation:Annotation = wb.undo(shapeId);
 				if (removedAnnotation != null) {
-					var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION);
+					var e:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.UNDO_ANNOTATION);
 					e.annotation = removedAnnotation;
-					_dispatcher.dispatchEvent(e);
+					dispatchEvent(e);
 				}
 			}
 		}
-		
-    public function getAnnotation(id:String):Annotation {
-      var wbId:String = getCurrentWhiteboardId();
-      if (wbId != null) {
-        var wb:Whiteboard = getWhiteboard(wbId);
-        if (wb != null) {
-          return wb.getAnnotation(id);
-        }        
-      }
-      return null;
-    }
         
     public function getAnnotations(wbId:String):Array {
       var wb:Whiteboard = getWhiteboard(wbId);
@@ -142,48 +127,33 @@ package org.bigbluebutton.modules.whiteboard.models
       LOGGER.debug("Clearing whiteboard");
       var wb:Whiteboard = getWhiteboard(wbId);
       if (wb != null) {
+        var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS);
+        event.wbId = wbId;
         if (fullClear) {
           wb.clearAll();
-          _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS));
         } else {
           wb.clear(userId);
-          var event:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS);
           event.userId = userId;
-          _dispatcher.dispatchEvent(event);
         }
+        dispatchEvent(event);
       }
     }
     
     public function clearAll():void {
       _whiteboards.removeAll();
-      _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CLEAR_ANNOTATIONS));
+      
+      var event:WhiteboardUpdateReceived = new WhiteboardUpdateReceived(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS);
+      event.wbId = "all";
+      dispatchEvent(event);
     }
 
     public function accessModified(multiUser:Boolean):void {
       _multiUser = multiUser;
       
-      var event:WhiteboardPresenterEvent = new WhiteboardPresenterEvent(WhiteboardPresenterEvent.MODIFIED_WHITEBOARD_ACCESS);
+      var event:WhiteboardAccessEvent = new WhiteboardAccessEvent(WhiteboardAccessEvent.MODIFIED_WHITEBOARD_ACCESS);
       event.multiUser = multiUser;
-      _dispatcher.dispatchEvent(event);
+      dispatchEvent(event);
    }
-        
-      
-    public function getCurrentWhiteboardId():String {
-      if(currentWhiteboardId)
-        return currentWhiteboardId;
-
-      return null;
-    }
-    
-    public function setCurrentWhiteboardId(whiteboardId:String):void {
-      currentWhiteboardId = whiteboardId;
-      LOGGER.debug("currentWhiteboardId set to: " + currentWhiteboardId);
-      LOGGER.debug("(current page id: " + PresentationModel.getInstance().getCurrentPage().id + ")");
-    }
-
-    public function isOverlayingDeskshare():Boolean {
-      return (currentWhiteboardId && currentWhiteboardId == "deskshare");
-    }
 
 	}
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as
index e508fefef57a7e72b2e4971a8a8481c450d5d3a7..b187e2f6e9a4f66fe5c7f181240e663e91bc0933 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageSender.as
@@ -23,13 +23,13 @@ package org.bigbluebutton.modules.whiteboard.services
 	import org.bigbluebutton.core.BBB;
 	import org.bigbluebutton.core.managers.ConnectionManager;
 	import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-	import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
 
 	public class MessageSender
 	{	
 		private static const LOGGER:ILogger = getClassLogger(MessageSender);
 
-		public function modifyAccess(e:WhiteboardPresenterEvent):void {
+		public function modifyAccess(e:WhiteboardAccessEvent):void {
 //			LogUtil.debug("Sending [whiteboard.enableWhiteboard] to server.");
 			var message:Object = new Object();
 			message["multiUser"] = e.multiUser;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as
index 74a639f9126185a750b62f30092eefa616b099a0..4e54ef4ae96ca771bb162a861e558b732541e66c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/WhiteboardService.as
@@ -22,7 +22,7 @@ package org.bigbluebutton.modules.whiteboard.services
   import org.as3commons.logging.api.getClassLogger;
   import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
   import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-  import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
+  import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
   import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
 
   public class WhiteboardService
@@ -38,7 +38,7 @@ package org.bigbluebutton.modules.whiteboard.services
       sender.requestAnnotationHistory(cmd.whiteboardId);
     }
     
-    public function modifyAccess(e:WhiteboardPresenterEvent):void {
+    public function modifyAccess(e:WhiteboardAccessEvent):void {
       sender.modifyAccess(e);
     }
     
@@ -50,19 +50,15 @@ package org.bigbluebutton.modules.whiteboard.services
       sender.toggleGrid();
     }
 
-    public function undoGraphic():void {
-      var wbId:String = whiteboardModel.getCurrentWhiteboardId();
-      if (wbId != null) {
-        
-        sender.undoGraphic(wbId)
+    public function undoGraphic(e:WhiteboardDrawEvent):void {
+      if (e.wbId != null) {
+        sender.undoGraphic(e.wbId)
       }      
     }
 
-    public function clearBoard():void {
-      var wbId:String = whiteboardModel.getCurrentWhiteboardId();
-      if (wbId != null) {
-        LOGGER.debug("Clear shape for wb [{0}]", [wbId]);
-        sender.clearBoard(wbId);
+    public function clearBoard(e:WhiteboardDrawEvent):void {
+      if (e.wbId != null) {
+        sender.clearBoard(e.wbId);
       }
     }
 
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as
index 916198f2f58b99f29407e96223b2674467cd2724..428adaa4dc25c2f8aa8a54719e8be9e36ce00a9b 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IDrawListener.as
@@ -22,7 +22,7 @@ package org.bigbluebutton.modules.whiteboard.views
 
     public interface IDrawListener
     {
-        function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void;
+        function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void;
         function onMouseMove(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void;
         function onMouseUp(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void;
     }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as
similarity index 77%
rename from bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as
rename to bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as
index c5913859524e7ea1f6e072dd095386bddc772910..29bce8fc4a2a08eaeebc7e0ddc1d5e6248a25735 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/models/WhiteboardCanvasModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/IWhiteboardReceiver.as
@@ -16,12 +16,10 @@
  * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
  *
  */
-package org.bigbluebutton.modules.whiteboard.views.models
-{
-	public class WhiteboardCanvasModel
-	{
-		public function WhiteboardCanvasModel()
-		{
-		}
+
+package org.bigbluebutton.modules.whiteboard.views {
+	public interface IWhiteboardReceiver {
+		function receiveToolbars(wt:WhiteboardToolbar, wtt:WhiteboardTextToolbar):void;
+		function receiveCanvas(wc:WhiteboardCanvas):void;
 	}
 }
\ No newline at end of file
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as
index 49332f8c7cc4efe1422e5befc81f1c3e0fa28ee2..2c9f6ce08a38a605d97f2d317e0ed7efa51b3e38 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/PencilDrawListener.as
@@ -37,28 +37,22 @@ package org.bigbluebutton.modules.whiteboard.views
     private var _isDrawing:Boolean = false;; 
     private var _segment:Array = new Array();
     private var _wbCanvas:WhiteboardCanvas;
-    private var _sendFrequency:int;
     private var _shapeFactory:ShapeFactory;
     private var _idGenerator:AnnotationIDGenerator;
     private var _curID:String;
-    private var _wbModel:WhiteboardModel;
     private var _wbId:String = null;
     
     
     public function PencilDrawListener(idGenerator:AnnotationIDGenerator, 
                                        wbCanvas:WhiteboardCanvas, 
-                                       sendShapeFrequency:int, 
-                                       shapeFactory:ShapeFactory, 
-                                       wbModel:WhiteboardModel)
+                                       shapeFactory:ShapeFactory)
     {
       _idGenerator = idGenerator;
       _wbCanvas = wbCanvas;
-      _sendFrequency = sendShapeFrequency;
       _shapeFactory = shapeFactory;
-      _wbModel = wbModel;
     }
     
-    public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void {
+    public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void {
       //if (tool.graphicType == WhiteboardConstants.TYPE_SHAPE) {
       if (tool.toolType == AnnotationType.PENCIL) {
         if (_isDrawing) {
@@ -69,7 +63,7 @@ package org.bigbluebutton.modules.whiteboard.views
         _isDrawing = true;
         _drawStatus = AnnotationStatus.DRAW_START;
         
-        _wbId = _wbModel.getCurrentWhiteboardId();
+        _wbId = wbId;
         
         // Generate a shape id so we can match the mouse down and up events. Then we can
         // remove the specific shape when a mouse up occurs.
@@ -131,11 +125,7 @@ package org.bigbluebutton.modules.whiteboard.views
       dobj.status = status;
       dobj.id = _curID;
       
-      var an:Annotation = dobj.createAnnotation(_wbModel);
-      
-      if (_wbId != null) {
-        an.annotation["whiteboardId"] = _wbId;
-      }
+      var an:Annotation = dobj.createAnnotation(_wbId);
       
       if (an != null) {
         _wbCanvas.sendGraphicToServer(an);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as
index 0ba108b1ac141388e0ebded101f2c18a26e73008..50463b10725dcddeced9e1de1f2ec1b19ae8761f 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/ShapeDrawListener.as
@@ -21,14 +21,11 @@ package org.bigbluebutton.modules.whiteboard.views
   import flash.geom.Point;
   
   import org.bigbluebutton.modules.whiteboard.business.shapes.DrawAnnotation;
-  import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
   import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory;
   import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants;
-  import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
   import org.bigbluebutton.modules.whiteboard.models.Annotation;
   import org.bigbluebutton.modules.whiteboard.models.AnnotationStatus;
   import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
-  import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
   import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardTool;
   
   public class ShapeDrawListener implements IDrawListener
@@ -37,26 +34,20 @@ package org.bigbluebutton.modules.whiteboard.views
     private var _isDrawing:Boolean = false; 
     private var _segment:Array = new Array();
     private var _wbCanvas:WhiteboardCanvas;
-    private var _sendFrequency:int;
     private var _shapeFactory:ShapeFactory;
     private var _idGenerator:AnnotationIDGenerator;
     private var _curID:String;
-    private var _wbModel:WhiteboardModel;
     private var _wbId:String = null;
         
     public function ShapeDrawListener(idGenerator:AnnotationIDGenerator, 
                                        wbCanvas:WhiteboardCanvas, 
-                                       sendShapeFrequency:int, 
-                                       shapeFactory:ShapeFactory, 
-                                       wbModel:WhiteboardModel) {
+                                       shapeFactory:ShapeFactory) {
       _idGenerator = idGenerator;
       _wbCanvas = wbCanvas;
-      _sendFrequency = sendShapeFrequency;
       _shapeFactory = shapeFactory;
-      _wbModel = wbModel;
     }
     
-    public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void {
+    public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void {
       if (tool.toolType == AnnotationType.RECTANGLE || 
           tool.toolType == AnnotationType.TRIANGLE || 
           tool.toolType == AnnotationType.ELLIPSE || 
@@ -69,7 +60,7 @@ package org.bigbluebutton.modules.whiteboard.views
         _isDrawing = true;
         _drawStatus = AnnotationStatus.DRAW_START;
         
-        _wbId = _wbModel.getCurrentWhiteboardId();
+        _wbId = wbId;
         
         // Generate a shape id so we can match the mouse down and up events. Then we can
         // remove the specific shape when a mouse up occurs.
@@ -128,11 +119,7 @@ package org.bigbluebutton.modules.whiteboard.views
       dobj.status = status;
       dobj.id = _curID;
       
-      var an:Annotation = dobj.createAnnotation(_wbModel);
-      
-      if (_wbId != null) {
-        an.annotation["whiteboardId"] = _wbId;
-      }
+      var an:Annotation = dobj.createAnnotation(_wbId);
       
       if (an != null) {
         _wbCanvas.sendGraphicToServer(an);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as
index f5e906fae0235a49bfd8f9c381c2b53b24a60f64..1632e0a2441804095cad05a6454dea7d63d250e2 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextDrawListener.as
@@ -29,8 +29,6 @@ package org.bigbluebutton.modules.whiteboard.views {
     public class TextDrawListener implements IDrawListener {
         private var _wbCanvas:WhiteboardCanvas;
 
-        private var _sendFrequency:int;
-
         private var _shapeFactory:ShapeFactory;
 
         private var _mouseXDown:Number = 0;
@@ -53,19 +51,17 @@ package org.bigbluebutton.modules.whiteboard.views {
 
         private var _curID:String;
 
-        private var feedback:RectangleFeedbackTextBox = new RectangleFeedbackTextBox();
+        private var _wbId:String;
 
-        private var _wbModel:WhiteboardModel;
+        private var feedback:RectangleFeedbackTextBox = new RectangleFeedbackTextBox();
 
-        public function TextDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, sendShapeFrequency:int, shapeFactory:ShapeFactory, wbModel:WhiteboardModel) {
+        public function TextDrawListener(idGenerator:AnnotationIDGenerator, wbCanvas:WhiteboardCanvas, shapeFactory:ShapeFactory) {
             _idGenerator = idGenerator;
             _wbCanvas = wbCanvas;
-            _sendFrequency = sendShapeFrequency;
             _shapeFactory = shapeFactory;
-            _wbModel = wbModel;
         }
 
-        public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool):void {
+        public function onMouseDown(mouseX:Number, mouseY:Number, tool:WhiteboardTool, wbId:String):void {
             if (tool.graphicType == WhiteboardConstants.TYPE_TEXT) {
                 _mouseXDown = _mouseXMove = mouseX;
                 _mouseYDown = _mouseYMove = mouseY;
@@ -75,10 +71,12 @@ package org.bigbluebutton.modules.whiteboard.views {
                 // even if the user has mousedDown yet.
                 _mousedDown = true;
                 
+                _wbId = wbId;
+                
                 // Need to check whether we were editing on mouse down because the edit will be finished by the time mouse up happens
                 _wasEditing = _wbCanvas.isEditingText();
                 
-                _wbCanvas.addRawChild(feedback);
+                _wbCanvas.addGraphic(feedback);
             }
         }
 
@@ -98,7 +96,7 @@ package org.bigbluebutton.modules.whiteboard.views {
             if (tool.graphicType == WhiteboardConstants.TYPE_TEXT && _mousedDown) {
                 feedback.clear();
                 if (_wbCanvas.contains(feedback)) {
-                    _wbCanvas.removeRawChild(feedback);
+                    _wbCanvas.removeGraphic(feedback);
                 }
 
                 _mousedDown = false;
@@ -130,7 +128,7 @@ package org.bigbluebutton.modules.whiteboard.views {
             tobj.status = status;
             tobj.id = _curID;
 
-            _wbCanvas.sendGraphicToServer(tobj.createAnnotation(_wbModel));
+            _wbCanvas.sendGraphicToServer(tobj.createAnnotation(_wbId));
         }
     }
 }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as
index b229c499ae51328c7c96773b50d651d44e5d33b5..00b4fc2c48d50753681ac57dfc5c718d917a74b6 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/TextUpdateListener.as
@@ -16,18 +16,15 @@ package org.bigbluebutton.modules.whiteboard.views {
 
 	public class TextUpdateListener {
 		private var _whiteboardCanvas:WhiteboardCanvas;
-		private var _whiteboardModel:WhiteboardModel;
 		private var _shapeFactory:ShapeFactory;
 		
 		private var _currentTextObject:TextObject;
-		private var _whiteboardId:String;
 		
 		public function TextUpdateListener() {
 		}
 		
-		public function setDependencies(whiteboardCanvas:WhiteboardCanvas, whiteboardModel:WhiteboardModel, shapeFactory:ShapeFactory):void {
+		public function setDependencies(whiteboardCanvas:WhiteboardCanvas, shapeFactory:ShapeFactory):void {
 			_whiteboardCanvas = whiteboardCanvas;
-			_whiteboardModel = whiteboardModel;
 			_shapeFactory = shapeFactory;
 		}
 		
@@ -54,8 +51,7 @@ package org.bigbluebutton.modules.whiteboard.views {
 				canvasMouseDown();
 			}
 			_currentTextObject = tobj;
-			_whiteboardId = _whiteboardModel.getCurrentWhiteboardId();
-			_whiteboardCanvas.textToolbar.syncPropsWith(_currentTextObject);
+			_whiteboardCanvas.textToolbarSyncProxy(_currentTextObject);
 			_whiteboardCanvas.stage.focus = tobj;
 			tobj.registerListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener);
 		}
@@ -63,7 +59,7 @@ package org.bigbluebutton.modules.whiteboard.views {
 		public function removedTextObject(tobj:TextObject):void {
 			if (tobj == _currentTextObject) {
 				_currentTextObject = null;
-				_whiteboardCanvas.textToolbar.syncPropsWith(null);
+				_whiteboardCanvas.textToolbarSyncProxy(null);
 				tobj.deregisterListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener);
 			}
 		}
@@ -106,7 +102,7 @@ package org.bigbluebutton.modules.whiteboard.views {
 			if (status == AnnotationStatus.DRAW_END) {
 				tobj.deregisterListeners(textObjLostFocusListener, textObjTextChangeListener, textObjKeyDownListener);
 				_currentTextObject = null;
-				_whiteboardCanvas.textToolbar.syncPropsWith(null);
+				_whiteboardCanvas.textToolbarSyncProxy(null);
 			}
 			
 			//      LogUtil.debug("SENDING TEXT: [" + tobj.textSize + "]");
@@ -115,11 +111,7 @@ package org.bigbluebutton.modules.whiteboard.views {
 			tda.status = status;
 			tda.id = tobj.id;
 			
-			var an:Annotation = tda.createAnnotation(_whiteboardModel);
-			
-			if (_whiteboardId != null) {
-				an.annotation["whiteboardId"] = _whiteboardId;
-			}
+			var an:Annotation = tda.createAnnotation(tobj.whiteboardId);
 			
 			_whiteboardCanvas.sendGraphicToServer(an);
 		}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as
new file mode 100755
index 0000000000000000000000000000000000000000..2e16caeef5635fe59e58a5643412de3b7d040267
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.as
@@ -0,0 +1,300 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ * 
+ * Copyright (c) 2012 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 3.0 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.whiteboard.views {
+	
+	import com.asfusion.mate.events.Dispatcher;
+	import com.asfusion.mate.events.Listener;
+	
+	import flash.display.DisplayObject;
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.containers.Canvas;
+	import mx.managers.CursorManager;
+	
+	import org.bigbluebutton.common.Images;
+	import org.bigbluebutton.main.events.MadePresenterEvent;
+	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
+	import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
+	import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
+	import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject;
+	import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand;
+	import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
+	import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdateReceived;
+	import org.bigbluebutton.modules.whiteboard.models.Annotation;
+	import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
+	import org.bigbluebutton.modules.whiteboard.models.WhiteboardModel;
+	
+	public class WhiteboardCanvas extends Canvas {
+		private var canvasModel:WhiteboardCanvasModel;
+		private var canvasDisplayModel:WhiteboardCanvasDisplayModel;
+		private var whiteboardToolbar:WhiteboardToolbar;
+		private var textToolbar:WhiteboardTextToolbar;
+		
+		private var graphicObjectHolder:Canvas = new Canvas();
+		private var images:Images = new Images();
+		
+		[Bindable] private var pencil_icon:Class = images.pencil_icon;
+		[Bindable] private var rectangle_icon:Class = images.square_icon;
+		[Bindable] private var triangle_icon:Class = images.triangle_icon;
+		[Bindable] private var ellipse_icon:Class = images.circle_icon;
+		[Bindable] private var line_icon:Class = images.line_icon;
+		[Bindable] private var text_icon:Class = images.text_icon;
+		private var toolType:String = AnnotationType.PENCIL;
+		private var whiteboardEnabled:Boolean = false;
+		private var currentWhiteboardId:String;
+		
+		public function WhiteboardCanvas(wbModel:WhiteboardModel):void {
+			canvasModel = new WhiteboardCanvasModel();
+			canvasDisplayModel = new WhiteboardCanvasDisplayModel();
+			
+			//set up model cross dependencies
+			canvasModel.setDependencies(this, canvasDisplayModel);
+			canvasDisplayModel.setDependencies(this, wbModel);
+			
+			whiteboardToolbar = new WhiteboardToolbar();
+			whiteboardToolbar.canvas = this;
+			
+			textToolbar = new WhiteboardTextToolbar();
+			textToolbar.canvas = this;
+			
+			//create the annotation display container
+			this.addChild(graphicObjectHolder);
+			graphicObjectHolder.x = 0;
+			graphicObjectHolder.y = 0;
+			graphicObjectHolder.clipContent = true;
+			graphicObjectHolder.tabFocusEnabled = false;
+			
+			addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
+			addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
+			
+			wbModel.addEventListener(WhiteboardUpdateReceived.NEW_ANNOTATION, onNewAnnotationEvent);
+			wbModel.addEventListener(WhiteboardUpdateReceived.RECEIVED_ANNOTATION_HISTORY, onReceivedAnnotationsHistory);
+			wbModel.addEventListener(WhiteboardUpdateReceived.CLEAR_ANNOTATIONS, onClearAnnotations);
+			wbModel.addEventListener(WhiteboardUpdateReceived.UNDO_ANNOTATION, onUndoAnnotation);
+			wbModel.addEventListener(WhiteboardAccessEvent.MODIFIED_WHITEBOARD_ACCESS, onModifiedAccess);
+			
+			whiteboardToolbar.addEventListener(WhiteboardButtonEvent.ENABLE_WHITEBOARD, onEnableWhiteboardEvent);
+			whiteboardToolbar.addEventListener(WhiteboardButtonEvent.DISABLE_WHITEBOARD, onDisableWhiteboardEvent);
+		}
+		
+		public function attachToReceivingObject(ro:IWhiteboardReceiver):void {
+			ro.receiveCanvas(this);
+			ro.receiveToolbars(whiteboardToolbar, textToolbar);
+		}
+		
+		private function registerForMouseEvents():void {
+			addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
+		}
+		
+		private function unregisterForMouseEvents():void {
+			removeEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
+		}
+		
+		private function doMouseUp(event:MouseEvent):void {
+			canvasModel.doMouseUp(Math.min(Math.max(parent.mouseX, 0), parent.width) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height) - this.y);
+			
+			stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp);
+			stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove);
+		}
+		
+		private function doMouseDown(event:MouseEvent):void {
+			canvasModel.doMouseDown(this.mouseX, this.mouseY, currentWhiteboardId);
+			canvasDisplayModel.doMouseDown(this.mouseX, this.mouseY);
+			event.stopPropagation(); // we want to stop the bubbling so slide doesn't move
+			
+			stage.addEventListener(MouseEvent.MOUSE_UP, doMouseUp);
+			stage.addEventListener(MouseEvent.MOUSE_MOVE, doMouseMove);	
+		}
+		
+		private function doMouseMove(event:MouseEvent):void {
+			canvasModel.doMouseMove(Math.min(Math.max(parent.mouseX, 0), parent.width-1) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-1) - this.y);
+		}
+		
+		public function changeColor(e:Event):void {
+			canvasModel.changeColor(e.target.selectedColor);
+		}
+		
+		public function isEditingText():Boolean {
+			return canvasDisplayModel.isEditingText();
+		}
+		
+		public function sendGraphicToServer(gobj:Annotation):void {
+			// LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]");
+			var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE);
+			event.annotation = gobj;
+			var dispatcher:Dispatcher = new Dispatcher();
+			dispatcher.dispatchEvent(event);					
+		}
+		
+		public function sendUndoToServer():void {
+			var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.UNDO);
+			event.wbId = currentWhiteboardId;
+			var dispatcher:Dispatcher = new Dispatcher();
+			dispatcher.dispatchEvent(event);
+		}
+		
+		public function sendClearToServer():void {
+			var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.CLEAR);
+			event.wbId = currentWhiteboardId;
+			var dispatcher:Dispatcher = new Dispatcher();
+			dispatcher.dispatchEvent(event);			
+		}
+		
+		public function setGraphicType(type:String):void {
+			if (canvasModel == null) return;
+			canvasModel.setGraphicType(type);
+		}
+		
+		public function setTool(s:String):void {
+			if (canvasModel == null) return;
+			canvasModel.setTool(s);
+			toolType = s;
+		}
+		
+		public function changeThickness(e:Event):void {
+			canvasModel.changeThickness(e.target.value);
+		}
+		
+		private function setWhiteboardInteractable():void {
+			if (this.whiteboardEnabled) {
+				registerForMouseEvents();
+			} else {
+				unregisterForMouseEvents();
+			}
+		}
+		
+		private function onMouseOver(e:MouseEvent):void {
+			setCursor(toolType);
+		}
+		
+		private function onMouseOut(e:MouseEvent):void {
+			removeCursor();
+		}
+		
+		private function setCursor(toolType:String):void {
+			if(toolType == AnnotationType.ELLIPSE) {
+				CursorManager.setCursor(ellipse_icon);
+			} else if(toolType == AnnotationType.RECTANGLE) {
+				CursorManager.setCursor(rectangle_icon);
+			} else if(toolType == AnnotationType.TRIANGLE) {
+				CursorManager.setCursor(triangle_icon);
+			} else if(toolType == AnnotationType.PENCIL) {
+				CursorManager.setCursor(pencil_icon, 2, -2, -22);
+			} else if(toolType == AnnotationType.LINE) {
+				CursorManager.setCursor(line_icon);
+			} else if(toolType == AnnotationType.TEXT) {
+				CursorManager.setCursor(text_icon);
+			} 
+		}
+		
+		private function removeCursor():void {
+			CursorManager.removeCursor(CursorManager.currentCursorID);
+		}
+		
+		public function doesContain(child:DisplayObject):Boolean {
+			return this.graphicObjectHolder.rawChildren.contains(child);
+		}
+		
+		public function getMouseXY():Array {
+			return [Math.min(Math.max(parent.mouseX, 0), parent.width-2) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-2) - this.y];
+		}
+		
+		public function removeGraphic(child:DisplayObject):void {
+			if (doesContain(child)) this.graphicObjectHolder.rawChildren.removeChild(child);
+			else trace("Does not contain");
+		}
+		
+		public function addGraphic(child:DisplayObject):void {
+			this.graphicObjectHolder.rawChildren.addChild(child);
+		}
+		
+		public function textToolbarSyncProxy(tobj:TextObject):void {
+			textToolbar.syncPropsWith(tobj);
+		}
+		
+		public function moveCanvas(x:Number, y:Number):void {
+			this.x = x;
+			this.y = y;
+		}
+		
+		public function zoomCanvas(width:Number, height:Number):void {
+			graphicObjectHolder.width = width;
+			graphicObjectHolder.height = height;
+			this.width = width;
+			this.height = height;	
+			canvasDisplayModel.zoomCanvas(width, height);
+			canvasModel.zoomCanvas(width, height);
+			textToolbar.adjustForZoom(width, height);
+		}
+		
+		public function displayWhiteboardById(wbId:String):void {
+			currentWhiteboardId = wbId;
+			canvasDisplayModel.changeWhiteboard(wbId);
+		}
+		
+		private function onNewAnnotationEvent(e:WhiteboardUpdateReceived):void {
+			if (e.annotation.whiteboardId == currentWhiteboardId) {
+				canvasDisplayModel.drawGraphic(e.annotation);
+			}
+		}
+		
+		private function onClearAnnotations(e:WhiteboardUpdateReceived):void {
+			if (e.wbId == currentWhiteboardId || e.wbId == "all") {
+				canvasDisplayModel.clearBoard(e.userId);
+			}
+		}
+		
+		private function onReceivedAnnotationsHistory(e:WhiteboardUpdateReceived):void {
+			if (e.wbId == currentWhiteboardId) {
+				canvasDisplayModel.receivedAnnotationsHistory(e.wbId);
+			}
+		}
+		
+		private function onUndoAnnotation(e:WhiteboardUpdateReceived):void {
+			if (e.annotation.whiteboardId == currentWhiteboardId) {
+				canvasDisplayModel.undoAnnotation(e.annotation);
+			}
+		}
+		
+		private function onModifiedAccess(e:WhiteboardAccessEvent):void {
+			//if (e.whiteboardId == currentWhiteboardId) {
+			whiteboardToolbar.whiteboardAccessModified(e.multiUser);
+			//}
+		}
+		
+		private function onEnableWhiteboardEvent(e:WhiteboardButtonEvent):void {
+			e.stopPropagation();
+			
+			this.whiteboardEnabled = true;
+			setWhiteboardInteractable();
+		}
+		
+		private function onDisableWhiteboardEvent(e:WhiteboardButtonEvent):void {
+			e.stopPropagation();
+			
+			this.whiteboardEnabled = false;
+			setWhiteboardInteractable();
+		}
+	}
+}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml
deleted file mode 100755
index 1662be845e2dd23061d0fbe5ca4571b5ea6f04c2..0000000000000000000000000000000000000000
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml
+++ /dev/null
@@ -1,279 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-
-BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
-
-Copyright (c) 2012 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 3.0 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/>.
-
--->
-
-<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" xmlns:mate="http://mate.asfusion.com/"	 
-    creationComplete="init()" visible="false" mouseOver="setCursor(toolType)" mouseOut="removeCursor()" implements="org.bigbluebutton.common.IBbbCanvas">
-	<mx:Script>
-		<![CDATA[		
-			import com.asfusion.mate.events.Dispatcher;
-			
-			import mx.managers.CursorManager;
-			
-			import org.bigbluebutton.common.IBbbCanvas;
-			import org.bigbluebutton.common.Images;
-			import org.bigbluebutton.main.events.MadePresenterEvent;
-			import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
-			import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
-			import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
-			import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardAccessCommand;
-			import org.bigbluebutton.modules.whiteboard.commands.GetWhiteboardShapesCommand;
-			import org.bigbluebutton.modules.whiteboard.events.PageEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
-			import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-			import org.bigbluebutton.modules.whiteboard.models.Annotation;
-			import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
-			
-			public var model:WhiteboardCanvasModel;	
-            public var displayModel:WhiteboardCanvasDisplayModel;
-
-			public var textToolbar:WhiteboardTextToolbar;		
-			private var bbbCanvas:IBbbCanvas;
-			private var _xPosition:int;
-			private var _yPosition:int;
-			private var images:Images = new Images();
-
-			[Bindable] private var pencil_icon:Class = images.pencil_icon;
-			[Bindable] private var rectangle_icon:Class = images.square_icon;
-			[Bindable] private var triangle_icon:Class = images.triangle_icon;
-			[Bindable] private var ellipse_icon:Class = images.circle_icon;
-			[Bindable] private var line_icon:Class = images.line_icon;
-			[Bindable] private var text_icon:Class = images.text_icon;
-			private var toolType:String = AnnotationType.PENCIL;
-			private var whiteboardEnabled:Boolean = false;
-			private var showWhiteboard:Boolean = true;
-          
-			private function init():void {
-				this.label = "Highlighter";
-                registerForMouseEvents();
-			}
-            
-      public function queryForAnnotationHistory(webId:String):void {
-         var dispatcher:Dispatcher = new Dispatcher();
-         dispatcher.dispatchEvent(new GetWhiteboardShapesCommand(webId));
-      }
-      
-      public function queryForWhiteboardAccess():void {
-          var dispatcher:Dispatcher = new Dispatcher();
-          dispatcher.dispatchEvent(new GetWhiteboardAccessCommand());
-      }
-			
-      public function registerForMouseEvents():void {
-          addEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
-      }
-            
-      public function unregisterForMouseEvents():void {
-          removeEventListener(MouseEvent.MOUSE_DOWN, doMouseDown);
-       }
-            
-			private function doMouseUp(event:MouseEvent):void {
-				model.doMouseUp(Math.min(Math.max(parent.mouseX, 0), parent.width) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height) - this.y);
-				
-				stage.removeEventListener(MouseEvent.MOUSE_UP, doMouseUp);
-				stage.removeEventListener(MouseEvent.MOUSE_MOVE, doMouseMove);
-			}
-						
-			private function doMouseDown(event:MouseEvent):void {
-				model.doMouseDown(this.mouseX, this.mouseY);
-				displayModel.doMouseDown(this.mouseX, this.mouseY);
-				event.stopPropagation(); // we want to stop the bubbling so slide doesn't move
-				
-				stage.addEventListener(MouseEvent.MOUSE_UP, doMouseUp);
-				stage.addEventListener(MouseEvent.MOUSE_MOVE, doMouseMove);	
-			}
-			
-			private function doMouseMove(event:MouseEvent):void {
-				model.doMouseMove(Math.min(Math.max(parent.mouseX, 0), parent.width-1) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-1) - this.y);
-			}
-				
-			public function changeColor(e:Event):void {
-				model.changeColor(e.target.selectedColor);
-			}
-			
-			public function isEditingText():Boolean {
-				return displayModel.isEditingText();
-			}
-
-			public function sendGraphicToServer(gobj:Annotation):void {
- //               LogUtil.debug("DISPATCHING SEND sendGraphicToServer [" + type + "]");
-				var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE);
-				event.annotation = gobj;
-                var dispatcher:Dispatcher = new Dispatcher();
-                dispatcher.dispatchEvent(event);					
-			}
-			
-			public function setGraphicType(type:String):void {
-                if (model == null) return;
-				model.setGraphicType(type);
-			}
-			
-			public function setTool(s:String):void {
-                if (model == null) return;
-				model.setTool(s);
-				toolType = s;
-			}
-			
-			public function changeThickness(e:Event):void {
-				model.changeThickness(e.target.value);
-			}
-			
-			public function get xPosition():int {
-				return _xPosition;
-			}
-			
-			public function get yPosition():int {
-				return _yPosition;
-			}
-			
-			public function set xPosition(x:int):void {
-				_xPosition = x;
-			}
-			
-			public function set yPosition(y:int):void {
-				_yPosition = y;
-			}
-			
-			private function setWhiteboardVisibility():void {
-                if (this.whiteboardEnabled && this.showWhiteboard) {
-                    this.visible = true;
-                    registerForMouseEvents();
-                } else {
-                    this.visible = false;
-                    unregisterForMouseEvents();
-                }
-			}
-			
-			/* added this functionality in WhiteboardToolbar.mxml instead to allow a variety of cursors */			
-			public function setCursorPencil():void {
-				CursorManager.setCursor(pencil_icon);
-			}
-			
-			public function setCursor(toolType:String):void {
-				if(toolType == AnnotationType.ELLIPSE) {
-					CursorManager.setCursor(ellipse_icon);
-				} else if(toolType == AnnotationType.RECTANGLE) {
-					CursorManager.setCursor(rectangle_icon);
-				} else if(toolType == AnnotationType.TRIANGLE) {
-					CursorManager.setCursor(triangle_icon);
-				} else if(toolType == AnnotationType.PENCIL) {
-					CursorManager.setCursor(pencil_icon, 2, -2, -22);
-				} else if(toolType == AnnotationType.LINE) {
-					CursorManager.setCursor(line_icon);
-				} else if(toolType == AnnotationType.TEXT) {
-					CursorManager.setCursor(text_icon);
-//				} else if(toolType == SelectObject.SELECT_TOOL) {
-//					CursorManager.setCursor(select_icon);
-				} 
-			}
-			
-			private function removeCursor():void {
-				CursorManager.removeCursor(CursorManager.currentCursorID);
-			}
-			
-			/** Inherited from org.bigbluebutton.common.IBbbCanvas*/
-			public function addRawChild(child:DisplayObject):void {
-				this.bbbCanvas.addRawChild(child);
-			}
-			
-			public function removeRawChild(child:DisplayObject):void {
-				this.bbbCanvas.removeRawChild(child);
-			}
-			
-			public function doesContain(child:DisplayObject):Boolean {
-				return bbbCanvas.doesContain(child);
-			}
-			
-			public function acceptOverlayCanvas(overlay:IBbbCanvas):void {
-//				LogUtil.debug("WhiteboardCanvas::acceptOverlayCanvas()");
-//				LogUtil.debug("OVERLAYING PRESENTATION CANVAS");
-                
-				this.bbbCanvas = overlay;
-				//Load existing shapes onto the canvas.
-				dispatchEvent(new PageEvent(PageEvent.LOAD_PAGE));
-                
-        /**
-         * Check if this is the first time we overlayed the whiteboard canvas into the
-         * presentation canvas. If so, query for annotations history.
-         */
-        if (! displayModel.canvasInited) {
-          displayModel.parentCanvasInitialized();
-          var webId:String = model.whiteboardModel.getCurrentWhiteboardId();
-          if (webId != null) {
-            queryForAnnotationHistory(webId);
-            queryForWhiteboardAccess();
-          }        
-        }
-                    
-			}
-			
-			public function moveCanvas(x:Number, y:Number):void {
-				this.x = x;
-				this.y = y;
-			}
-			
-			public function getMouseXY():Array {
-				return [Math.min(Math.max(parent.mouseX, 0), parent.width-2) - this.x, Math.min(Math.max(parent.mouseY, 0), parent.height-2) - this.y];
-			}
-			
-			public function removeGraphic(child:DisplayObject):void {
-				if (bbbCanvas == null) return;
-				if (doesContain(child)) removeRawChild(child);
-			}
-			
-			public function addGraphic(child:DisplayObject):void {
-				if (bbbCanvas == null) return;
-				addRawChild(child);
-			}
-			
-			public function zoomCanvas(width:Number, height:Number):void {
-				this.width = width;
-				this.height = height;	
-				displayModel.zoomCanvas(width, height);
-                model.zoomCanvas(width, height);
-				textToolbar.adjustForZoom(width, height);
-			}
-					
-			public function showCanvas(show:Boolean):void{
-				this.showWhiteboard = show;
-                
-				setWhiteboardVisibility();
-			}
-			
-			/** End IBBBCanvas*/		
-			public function isPageEmpty():Boolean {
-				return displayModel.isPageEmpty();
-			}
-			
-			public function enableWhiteboard(e:WhiteboardButtonEvent):void{
-				this.whiteboardEnabled = true;
-				setWhiteboardVisibility();
-                useHandCursor = false;
-			}
-			
-			public function disableWhiteboard(e:WhiteboardButtonEvent):void{
-				this.whiteboardEnabled = false;
-				setWhiteboardVisibility();
-                useHandCursor = true;
-			}
-			
-		]]>
-	</mx:Script>
-</mx:Canvas>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml
index 286666552ff4461a2e2aed698580455ee3b14897..08ddea6168192a29880dfddb85eae73c6c496dd4 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardTextToolbar.mxml
@@ -24,20 +24,22 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 	xmlns:mate="http://mate.asfusion.com/" visible="false" backgroundColor="0xCCCCCC"
 	cornerRadius="5" borderStyle="solid"
 	paddingBottom="3" paddingTop="3" paddingLeft="3" paddingRight="3" alpha="0"
-	xmlns:views="org.bigbluebutton.modules.whiteboard.views.*" xmlns:local="*">
+	xmlns:views="org.bigbluebutton.modules.whiteboard.views.*" xmlns:local="*"
+	creationComplete="onCreationComplete()">
 	
 	<mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="viewerMode" />
 	<mate:Listener type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" method="disableTextToolbar" />
 	<mate:Listener type="{StopWhiteboardModuleEvent.STOP_HIGHLIGHTER_MODULE_EVENT}" method="closeToolbar" />
 	<mx:Script>
 		<![CDATA[
+			import flexlib.mdi.containers.MDIWindow;
+			
 			import mx.events.MoveEvent;
 			import mx.events.ResizeEvent;
 			
 			import org.as3commons.logging.api.ILogger;
 			import org.as3commons.logging.api.getClassLogger;
 			import org.bigbluebutton.main.events.MadePresenterEvent;
-			import org.bigbluebutton.modules.present.ui.views.PresentationWindow;
 			import org.bigbluebutton.modules.whiteboard.business.shapes.TextObject;
 			import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent;
 			import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
@@ -51,13 +53,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			public var backgroundVisible:Boolean;
 			
 			private var currentlySelectedTextObject:TextObject = null;	
-			private var presentationWindow:PresentationWindow;
+			private var containerToOverlay:MDIWindow;
 			private var normalAlpha:Number = 0.55;
 			private var focusedAlpha:Number = 1.0;
 			private var hasFocus:Boolean;
 			[Bindable] private var fontSizes:Array = ["12", "14", "16", "18", "22", "24", "32", "36"];
 			
-			public function init():void {
+			private function onCreationComplete():void {
 				this.alpha = normalAlpha;
 				this.addEventListener(MouseEvent.ROLL_OVER, makeFocused);
 				this.addEventListener(MouseEvent.ROLL_OUT, makeDim);
@@ -74,11 +76,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 			
 			/* Following two methods are used for aesthetics when mouse hovers over TextToolbar and when it hovers out of it */
-			public function makeDim(event:MouseEvent):void {
+			private function makeDim(event:MouseEvent):void {
 					this.alpha = normalAlpha;
 			}
 			
-			public function makeFocused(event:MouseEvent):void {
+			private function makeFocused(event:MouseEvent):void {
 					this.alpha = focusedAlpha;
 			}
 			
@@ -141,11 +143,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 			
 			// invoked by WhiteboardManager when the TextToolbar is first loaded
-			public function positionToolbar(window:PresentationWindow):void{
-				this.presentationWindow = window;
-				presentationWindow.addEventListener(ResizeEvent.RESIZE, repositionToolbarByWindow);
-				presentationWindow.addEventListener(MouseEvent.CLICK, repositionToolbarByWindow);
-				presentationWindow.addEventListener(MoveEvent.MOVE, repositionToolbarByWindow);
+			public function positionToolbar(container:MDIWindow):void{
+				containerToOverlay = container;
+				containerToOverlay.addEventListener(ResizeEvent.RESIZE, repositionToolbarByWindow);
+				containerToOverlay.addEventListener(MouseEvent.CLICK, repositionToolbarByWindow);
+				containerToOverlay.addEventListener(MoveEvent.MOVE, repositionToolbarByWindow);
 			}
 			
 			/* required for repositioning the TextToolbar when an event occurs on the presentation window */
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
index 5051144ef9473f94aa1d6fba63ecb4b785f34049..016ee5114a78b4f09b9103710186d8ab106b67fb 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml
@@ -21,7 +21,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 -->
 
 <mx:VBox xmlns="flexlib.containers.*" 
-    initialize="init()" 
     xmlns:mx="http://www.adobe.com/2006/mxml" 
     xmlns:view="org.bigbluebutton.modules.whiteboard.views.*"
     xmlns:wbBtns="org.bigbluebutton.modules.whiteboard.views.buttons.*"
@@ -35,13 +34,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 
   <mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="presenterMode" />
   <mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="viewerMode" />
-  <mate:Listener type="{WhiteboardPresenterEvent.MODIFIED_WHITEBOARD_ACCESS}" method="whiteboardAccessModified" />
   <mate:Listener type="{StopWhiteboardModuleEvent.STOP_HIGHLIGHTER_MODULE_EVENT}" method="closeToolbar" />
   <mate:Listener type="{ShortcutEvent.UNDO_WHITEBOARD}" method="undoShortcut" />
-  <mate:Listener type="{WhiteboardButtonEvent.WHITEBOARD_BUTTON_PRESSED}" method="handleWhiteboardButtonPressed"/>
   <mate:Listener type="{ChangeMyRole.CHANGE_MY_ROLE_EVENT}" method="refreshRole" />
   <mate:Listener type="{DisplaySlideEvent.DISPLAY_SLIDE_EVENT}" method="handleSlideLoaded" />
-  <mate:Listener type="{UploadEvent.PRESENTATION_READY}" method="handlePresentationSwitch" />
   <mate:Listener type="{PresenterStatusEvent.ANNOTATIONS_PERMISSION_CHANGE}" method="handleEnableAnnotations" />
     
   <mx:Style>
@@ -68,6 +64,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		import com.asfusion.mate.core.GlobalDispatcher;
 		import com.asfusion.mate.events.Listener;
 		
+		import flexlib.mdi.containers.MDIWindow;
+		
 		import mx.events.MoveEvent;
 		import mx.events.ResizeEvent;
 		
@@ -80,15 +78,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 		import org.bigbluebutton.main.events.ShortcutEvent;
 		import org.bigbluebutton.main.model.users.events.ChangeMyRole;
 		import org.bigbluebutton.modules.present.events.DisplaySlideEvent;
-		import org.bigbluebutton.modules.present.events.UploadEvent;
-		import org.bigbluebutton.modules.present.model.Presenter;
-		import org.bigbluebutton.modules.present.ui.views.PresentationWindow;
-		import org.bigbluebutton.modules.whiteboard.business.shapes.GraphicObject;
 		import org.bigbluebutton.modules.whiteboard.business.shapes.WhiteboardConstants;
 		import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent;
+		import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
 		import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
-		import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
-		import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
 		import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardOptions;
 		import org.bigbluebutton.util.i18n.ResourceUtil;
 			
@@ -107,7 +100,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			private var enableAnnotations:Boolean = true;
 			
 			public var canvas:WhiteboardCanvas;
-			private var presentationWindow:PresentationWindow;
+			private var containerToOverlay:MDIWindow;
 			
 			[Bindable]
 			private var multiUser:Boolean = false;
@@ -116,14 +109,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
                 '0xCCFF00', '0x00FF00', '0x00FF88', '0x00FFFF', '0x0088FF', '0x0000FF', '0x8800FF', '0xFF00FF', '0xC0C0C0'];
 			
 			private var _hideToolbarTimer:Timer = new Timer(500, 1);
-
-			private function init():void{
-				
-			}
 			
       private function onCreationComplete():void {
         setToolType(WhiteboardConstants.TYPE_ZOOM, null);
         _hideToolbarTimer.addEventListener(TimerEvent.TIMER, onHideToolbarTimerComplete);
+        addEventListener(WhiteboardButtonEvent.WHITEBOARD_BUTTON_PRESSED, handleWhiteboardButtonPressed);
       }
 
       private function handleWhiteboardButtonPressed(e:WhiteboardButtonEvent):void {
@@ -132,7 +122,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 
       private function setToolType(graphicType:String, toolType:String):void {                
         if (graphicType == WhiteboardConstants.TYPE_CLEAR) {
-           dispatchEvent(new WhiteboardDrawEvent(WhiteboardDrawEvent.CLEAR));
+           canvas.sendClearToServer();
         } else if (graphicType == WhiteboardConstants.TYPE_UNDO) {
            sendUndoCommand();
         } else {
@@ -182,7 +172,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				
 				var dispatcher:GlobalDispatcher = new GlobalDispatcher();
 				
-				var event:WhiteboardPresenterEvent = new WhiteboardPresenterEvent(WhiteboardPresenterEvent.MODIFY_WHITEBOARD_ACCESS);
+				var event:WhiteboardAccessEvent = new WhiteboardAccessEvent(WhiteboardAccessEvent.MODIFY_WHITEBOARD_ACCESS);
 				event.multiUser = !multiUser;
 				dispatcher.dispatchEvent(event);
 			}
@@ -196,8 +186,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 				checkVisibility();
 			}
 		
-			private function whiteboardAccessModified(e:WhiteboardPresenterEvent):void {
-				multiUser = e.multiUser;
+			public function whiteboardAccessModified(mu:Boolean):void {
+				multiUser = mu;
 				checkToolReset();
 				checkVisibility();
 			}
@@ -208,28 +198,26 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 			
 			private function sendUndoCommand():void {
-//				if (!canvas.isPageEmpty()) {          
-					dispatchEvent(new WhiteboardDrawEvent(WhiteboardDrawEvent.UNDO));
-//        }
+				canvas.sendUndoToServer();
 			}
 			
-			public function positionToolbar(window:PresentationWindow):void {
+			public function positionToolbar(container:MDIWindow):void {
         		LOGGER.debug("Positioning whiteboard toolbar");
-				presentationWindow = window;
-				presentationWindow.addEventListener(MoveEvent.MOVE, setPositionAndDepth);
-				presentationWindow.addEventListener(ResizeEvent.RESIZE, setPositionAndDepth);
-				presentationWindow.addEventListener(MouseEvent.CLICK, setPositionAndDepth);
+				containerToOverlay = container;
+				containerToOverlay.addEventListener(MoveEvent.MOVE, setPositionAndDepth);
+				containerToOverlay.addEventListener(ResizeEvent.RESIZE, setPositionAndDepth);
+				containerToOverlay.addEventListener(MouseEvent.CLICK, setPositionAndDepth);
 				
-                if (!wbOptions.keepToolbarVisible) {
-    				window.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, handleMouseOut);
-    				window.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, handleMouseIn);
-    				
-    				window.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn);
-    				window.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut);
-    				
-    				this.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn);
-    				this.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut);
-                }
+				if (!wbOptions.keepToolbarVisible) {
+					//containerToOverlay.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, handleMouseOut);
+					//containerToOverlay.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, handleMouseIn);
+					
+					containerToOverlay.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn);
+					containerToOverlay.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut);
+					
+					this.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn);
+					this.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut);
+				}
 			}
 			
 			private function refreshRole(e:ChangeMyRole):void {
@@ -237,7 +225,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 			}
 
             private function checkVisibility(e:MadePresenterEvent = null):void {
-                if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver) && !presentationWindow.minimized) {
+                if (toolbarAllowed() && slideLoaded && enableAnnotations && (wbOptions.keepToolbarVisible || mousedOver) && !containerToOverlay.minimized) {
                     setPositionAndDepth();
                     showToolbar();
                 } else {
@@ -267,8 +255,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
 
 			private function setPositionAndDepth(e:Event = null):void {
 				if (parent == null) return;
-				this.x = presentationWindow.x + presentationWindow.width - 43;
-				this.y = presentationWindow.y + 30;
+				this.x = containerToOverlay.x + containerToOverlay.width - 43;
+				this.y = containerToOverlay.y + 30;
 				parent.setChildIndex(this, parent.numChildren - 1);
 			}
 		
@@ -296,14 +284,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
                slideLoaded = true;
                checkVisibility();
            }
-           
-           private function handlePresentationSwitch(e:UploadEvent):void {
-               slideLoaded = false;
-               if (panzoomBtn) {
-                   panzoomBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
-               }
-               checkVisibility();
-           }
       
       private function toolbarAllowed():Boolean {
         return (multiUser? true : isPresenter);