diff --git a/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee b/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee
index 883fafb1e7d3adf83dca26e86fd9510fa55b9942..cf53dcea561bef920273734ef499d135210878e5 100755
--- a/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee
+++ b/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee
@@ -29,6 +29,9 @@ Template.slide.rendered = ->
   wpm.scale(adjustedDimensions.width, adjustedDimensions.height)
 
 @manuallyDisplayShapes = ->
+
+  return if Meteor.WhiteboardCleanStatus.findOne({in_progress: true})?
+
   currentSlide = getCurrentSlideDoc()
   wpm = @whiteboardPaperModel
   shapes = Meteor.Shapes.find({whiteboardId: currentSlide?.slide?.id}).fetch()
diff --git a/bigbluebutton-html5/app/collections/collections.coffee b/bigbluebutton-html5/app/collections/collections.coffee
index 49987e25c01fc64aea070a8367777c523be89c46..200fe01e361467d22dff7faa22bcc7a2c7a32c68 100755
--- a/bigbluebutton-html5/app/collections/collections.coffee
+++ b/bigbluebutton-html5/app/collections/collections.coffee
@@ -4,3 +4,5 @@ Meteor.Meetings = new Meteor.Collection("meetings")
 Meteor.Presentations = new Meteor.Collection("presentations")
 Meteor.Shapes = new Meteor.Collection("shapes")
 Meteor.Slides = new Meteor.Collection("slides")
+
+Meteor.WhiteboardCleanStatus = new Meteor.Collection("whiteboard-clean-status")
\ No newline at end of file
diff --git a/bigbluebutton-html5/app/lib/router.coffee b/bigbluebutton-html5/app/lib/router.coffee
index 791efcb5ed5c8049e9a9b7b907a0a47c101c212f..575f6371d2419b31ccd9b6d83046a81d67e62119 100755
--- a/bigbluebutton-html5/app/lib/router.coffee
+++ b/bigbluebutton-html5/app/lib/router.coffee
@@ -55,29 +55,30 @@
             Meteor.subscribe 'meetings', meetingId, onReady: =>
               Meteor.subscribe 'presentations', meetingId, onReady: =>
                 Meteor.subscribe 'users', meetingId, userId, authToken, onError: onErrorFunction, onReady: =>
-                  # done subscribing
-                  onLoadComplete()
-
-                  handleLogourUrlError = () ->
-                    alert "Error: could not find the logoutURL"
-                    setInSession("logoutURL", document.location.hostname)
-                    return
-
-                  # obtain the logoutURL
-                  a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'})
-                  a.done (data) ->
-                    if data.response.logoutURL? # for a meeting with 0 users
-                      setInSession("logoutURL", data.response.logoutURL)
+                  Meteor.subscribe 'whiteboard-clean-status', meetingId, onReady: =>
+                    # done subscribing
+                    onLoadComplete()
+
+                    handleLogourUrlError = () ->
+                      alert "Error: could not find the logoutURL"
+                      setInSession("logoutURL", document.location.hostname)
                       return
-                    else
-                      if data.response.logoutUrl? # for a running meeting
-                        setInSession("logoutURL", data.response.logoutUrl)
+
+                    # obtain the logoutURL
+                    a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'})
+                    a.done (data) ->
+                      if data.response.logoutURL? # for a meeting with 0 users
+                        setInSession("logoutURL", data.response.logoutURL)
                         return
                       else
-                        handleLogourUrlError()
-
-                  a.fail (data, textStatus, errorThrown) ->
-                    handleLogourUrlError()
+                        if data.response.logoutUrl? # for a running meeting
+                          setInSession("logoutURL", data.response.logoutUrl)
+                          return
+                        else
+                          handleLogourUrlError()
+
+                    a.fail (data, textStatus, errorThrown) ->
+                      handleLogourUrlError()
 
       @render('main')
 
diff --git a/bigbluebutton-html5/app/server/collection_methods/shapes.coffee b/bigbluebutton-html5/app/server/collection_methods/shapes.coffee
index 2f73effb9d3ae8ac9bca7336a8a38a00cd437efd..d4c0e1607e7c1a655f6a543ce29a194b7e6c000b 100755
--- a/bigbluebutton-html5/app/server/collection_methods/shapes.coffee
+++ b/bigbluebutton-html5/app/server/collection_methods/shapes.coffee
@@ -67,15 +67,13 @@
 @removeAllShapesFromSlide = (meetingId, whiteboardId) ->
   Meteor.log.info "removeAllShapesFromSlide__" + whiteboardId
   if meetingId? and whiteboardId? and Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId})?
-    shapesOnSlide = Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch()
-    Meteor.log.info "number of shapes:" + shapesOnSlide.length
-    for s in shapesOnSlide
-      Meteor.log.info "shape=" + s.shape.id
-      id = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": s.shape.id})
-      if id?
-        Meteor.Shapes.remove(id._id)
-        Meteor.log.info "----removed shape[" + s.shape.id + "] from " + whiteboardId
-        Meteor.log.info "remaining shapes on the slide:" + Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch().length
+    Meteor.Shapes.remove {meetingId: meetingId, whiteboardId: whiteboardId}, ->
+      Meteor.log.info "clearing all shapes from slide"
+
+      # After shapes are cleared, wait 1 second and set cleaning off
+      Meteor.setTimeout ->
+        Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
+      , 1000
 
 @removeShapeFromSlide = (meetingId, whiteboardId, shapeId) ->
   shapeToRemove = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": shapeId})
@@ -88,9 +86,13 @@
 # called on server start and meeting end
 @clearShapesCollection = (meetingId) ->
   if meetingId?
-    Meteor.Shapes.remove({meetingId: meetingId}, Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!")
+    Meteor.Shapes.remove {}, ->
+      Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!"
+      Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
   else
-    Meteor.Shapes.remove({}, Meteor.log.info "cleared Shapes Collection (all meetings)!")
+    Meteor.Shapes.remove {}, ->
+      Meteor.log.info "cleared Shapes Collection (all meetings)!"
+      Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}})
 
 # --------------------------------------------------------------------------------------------
 # end Private methods on server
diff --git a/bigbluebutton-html5/app/server/publish.coffee b/bigbluebutton-html5/app/server/publish.coffee
index ef7510d74d9656be67ea3e1a6376e56c1e2e35a5..b1500de47f5323f1ab691b70ea37f749260037d9 100755
--- a/bigbluebutton-html5/app/server/publish.coffee
+++ b/bigbluebutton-html5/app/server/publish.coffee
@@ -70,3 +70,7 @@ Meteor.publish 'meetings', (meetingId) ->
 Meteor.publish 'presentations', (meetingId) ->
   Meteor.log.info "publishing presentations for #{meetingId}"
   Meteor.Presentations.find({meetingId: meetingId})
+
+Meteor.publish 'whiteboard-clean-status', (meetingId) ->
+  Meteor.log.info "whiteboard clean status #{meetingId}"
+  Meteor.WhiteboardCleanStatus.find({meetingId: meetingId})
diff --git a/bigbluebutton-html5/app/server/redispubsub.coffee b/bigbluebutton-html5/app/server/redispubsub.coffee
index 3d81454bb15b1a3e5eaf9334d003c4cf7b3a3cf4..07bebcf6fe28742299f80797aa791a6719b61d81 100755
--- a/bigbluebutton-html5/app/server/redispubsub.coffee
+++ b/bigbluebutton-html5/app/server/redispubsub.coffee
@@ -219,6 +219,11 @@ class Meteor.RedisPubSub
         return
 
       if message.header.name is "get_whiteboard_shapes_reply" and message.payload.requester_id is "nodeJSapp"
+
+        # Create a whiteboard clean status or find one for the current meeting
+        if not Meteor.WhiteboardCleanStatus.findOne({meetingId: meetingId})?
+            Meteor.WhiteboardCleanStatus.insert({meetingId: meetingId, in_progress: false})
+
         for shape in message.payload.shapes
           whiteboardId = shape.wb_id
           addShapeToCollection meetingId, whiteboardId, shape
@@ -238,6 +243,7 @@ class Meteor.RedisPubSub
 
       if message.header.name is "whiteboard_cleared_message"
         whiteboardId = message.payload.whiteboard_id
+        Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {'in_progress': true}})
         removeAllShapesFromSlide meetingId, whiteboardId
         return
 
diff --git a/bigbluebutton-html5/app/server/server.coffee b/bigbluebutton-html5/app/server/server.coffee
index 125492a669988db89201196ae24a0bcd2a501425..e85cf7dd068ecd590b6d23bdf079722a707ba2ca 100755
--- a/bigbluebutton-html5/app/server/server.coffee
+++ b/bigbluebutton-html5/app/server/server.coffee
@@ -2,6 +2,7 @@ Meteor.startup ->
   Meteor.log.info "server start"
 
   #remove all data
+  Meteor.WhiteboardCleanStatus.remove({})
   clearUsersCollection()
   clearChatCollection()
   clearMeetingsCollection()