diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
index f259b77323537ea990eddcf92d1e193339ff9462..a0afefad684db9d1b207216b8e66220b0bce7e7c 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala
@@ -43,23 +43,12 @@ trait WhiteboardApp {
 
   }
 
-  /*
-  private def initWhiteboard(wbId: String) {
-    if (!wbModel.hasWhiteboard(wbId)) {
-      wbModel.createWhiteboard(wbId)
-    }
-  }
-  */
-
   def handleGetWhiteboardShapesRequest(msg: GetWhiteboardShapesRequest) {
     //println("WB: Received page history [" + msg.whiteboardId + "]")
     val history = wbModel.getHistory(msg.whiteboardId);
     if (history.length > 0) {
       outGW.send(new GetWhiteboardShapesReply(mProps.meetingID, mProps.recorded, msg.requesterID, msg.whiteboardId, history, msg.replyTo))
     }
-    //wbModel.history(msg.whiteboardId) foreach { wb =>
-    //  outGW.send(new GetWhiteboardShapesReply(mProps.meetingID, mProps.recorded, msg.requesterID, wb.id, wb.shapes.toArray, msg.replyTo))
-    //}
   }
 
   def handleClearWhiteboardRequest(msg: ClearWhiteboardRequest) {
@@ -72,7 +61,9 @@ trait WhiteboardApp {
 
   def handleUndoWhiteboardRequest(msg: UndoWhiteboardRequest) {
     //    println("WB: Received undo whiteboard")
-
+    wbModel.undoWhiteboard(msg.whiteboardId, msg.requesterID) foreach { last =>
+      outGW.send(new UndoWhiteboardEvent(mProps.meetingID, mProps.recorded, msg.requesterID, msg.whiteboardId, last.id))
+    }
     // wbModel.getWhiteboard(msg.whiteboardId) foreach { wb =>
     // wbModel.undoWhiteboard(msg.whiteboardId) foreach { last =>
     // outGW.send(new UndoWhiteboardEvent(mProps.meetingID, mProps.recorded, msg.requesterID, wb.id, last.id))
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala
index 6aba79cf919f399e29c4e98e4934c844438e0889..f9173548ef4b1729670a52611311faa29b8757fb 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardModel.scala
@@ -86,20 +86,38 @@ class WhiteboardModel {
   }
   */
 
-  /*
-  def undoWhiteboard(wbId: String): Option[AnnotationVO] = {
+  def undoWhiteboard(wbId: String, userId: String): Option[AnnotationVO] = {
     var last: Option[AnnotationVO] = None
-    getWhiteboard(wbId) foreach { wb =>
-      if (!wb.shapes.isEmpty) {
-        last = Some(wb.shapes.last)
-        val remaining = wb.shapes.dropRight(1)
-        val newWb = wb.copy(shapes = remaining)
+    val wb = getWhiteboard(wbId)
+
+    if (_multiUser) {
+      val usersShapes = getShapesByUserId(wb, userId)
+
+      //not empty and head id equals shape id
+      if (!usersShapes.isEmpty) {
+        last = Some(usersShapes.head)
+
+        val newWb = removeHeadShape(wb, userId, usersShapes)
+        //println("Removing shape on page [" + wb.id + "]. After numShapes=[" + getShapesByUserId(wb, userId).length + "].")
+        saveWhiteboard(newWb)
+      }
+    } else {
+      if (wb.shapesMap.nonEmpty) {
+        val lastElement = wb.shapesMap.maxBy(_._2.head.position)
+        val lastList = lastElement._2
+        last = Some(lastList.head)
+        val newWb = removeHeadShape(wb, lastElement._1, lastList)
+        //println("Removing shape on page [" + wb.id + "]. After numShapes=[" + getShapesByUserId(wb, userId).length + "].")
         saveWhiteboard(newWb)
       }
     }
     last
   }
-  */
+
+  private def removeHeadShape(wb: Whiteboard, key: String, list: List[AnnotationVO]): Whiteboard = {
+    val newShapesMap = if (list.tail == Nil) wb.shapesMap - key else wb.shapesMap + (key -> list.tail)
+    wb.copy(shapesMap = newShapesMap)
+  }
 
   def modifyWhiteboardAccess(multiUser: Boolean) {
     _multiUser = multiUser
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
index 243c81305b97cff66baf856e4318d3cae7f6c72b..c9dcbb2f86cfbeb26ffc0dfb6801d2cc01dd8eed 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as
@@ -299,10 +299,13 @@ package org.bigbluebutton.modules.whiteboard
       wbCanvas.textToolbar.visible = false;
     }
     
-    public function undoAnnotation(id:String):void {
-      /** We'll just remove the last annotation for now **/
+    public function undoAnnotation(annotation:Annotation):void {
       if (this._annotationsList.length > 0) {
-        removeLastGraphic();
+        if (annotation.type == DrawObject.TEXT) {
+          removeText(annotation.id);
+        } else {
+          removeGraphic(annotation.id);
+        }
       }
     }
         
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 66554b127f531762221b8bfc075eb1a762a38aed..e5881a8232f2018a71ccb26fc2b9393a6fc374e7 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/managers/WhiteboardManager.as
@@ -122,7 +122,7 @@ package org.bigbluebutton.modules.whiteboard.managers
     }
 		
 		public function undoAnnotation(event:WhiteboardUpdate):void {
-      displayModel.undoAnnotation(event.annotationID);
+			displayModel.undoAnnotation(event.annotation);
 		}
 		
 		public function toggleGrid(event:ToggleGridEvent = null):void {
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 1e7e0cd0a683e099b5d673390a9f7a06f8338d67..01e43038e54c95c29f957ce3516c50aa0df0c702 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as
@@ -105,8 +105,17 @@ package org.bigbluebutton.modules.whiteboard.models
       _dispatcher.dispatchEvent(new WhiteboardShapesEvent(wb.id));
     }
         
-		public function removeAnnotation(id:String):void {
-			
+		public function removeAnnotation(wbId:String, shapeId:String):void {
+			LOGGER.debug("Removing annotation");
+			var wb:Whiteboard = getWhiteboard(wbId);
+			if (wb != null) {
+				var removedAnnotation:Annotation = wb.undo(shapeId);
+				if (removedAnnotation != null) {
+					var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION);
+					e.annotation = removedAnnotation;
+					_dispatcher.dispatchEvent(e);
+				}
+			}
 		}
 		
     public function getAnnotation(id:String):Annotation {
@@ -128,16 +137,6 @@ package org.bigbluebutton.modules.whiteboard.models
       // Just return an empty array.
       return new Array();
     }
-        
-		public function undo(wbId:String):void {
-      LOGGER.debug("Undoing whiteboard");
-      var wb:Whiteboard = getWhiteboard(wbId);
-      if (wb != null) {
-        wb.undo();
-        _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.UNDO_ANNOTATION));
-      }
-      
-		}
 		
 		public function clear(wbId:String = null):void {
       LOGGER.debug("Clearing whiteboard");
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as
index 681c0933e84a880b3191ee3b8233247d7808b80b..a1e149b5f2ec50638857a696fbdf4678cbd4e2ba 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/services/MessageReceiver.as
@@ -74,8 +74,8 @@ package org.bigbluebutton.modules.whiteboard.services
 
     private function handleUndoCommand(message:Object):void {
       var map:Object = JSON.parse(message.msg);      
-      if (map.hasOwnProperty("whiteboardId")) {
-        whiteboardModel.undo(map.whiteboardId);
+      if (map.hasOwnProperty("whiteboardId") && map.hasOwnProperty("shapeId")) {
+        whiteboardModel.removeAnnotation(map.whiteboardId, map.shapeId);
       }
     }