diff --git a/bigbluebutton-html5/.Trash-1000/files/clearCursors.js b/bigbluebutton-html5/.Trash-1000/files/clearCursors.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d3905a7a0128dd86d398bd17f3b5b22a0d7ab4d
--- /dev/null
+++ b/bigbluebutton-html5/.Trash-1000/files/clearCursors.js
@@ -0,0 +1,10 @@
+import Cursor from '/imports/api/cursor';
+import Logger from '/imports/startup/server/logger';
+
+export default function clearCursor(meetingId) {
+  if (meetingId) {
+    return Cursor.remove({ meetingId }, Logger.info(`Cleared Cursor (${meetingId})`));
+  } else {
+    return Cursor.remove({}, Logger.info('Cleared Cursor (all)'));
+  }
+};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/eventHandlers.js b/bigbluebutton-html5/.Trash-1000/files/eventHandlers.js
similarity index 100%
rename from bigbluebutton-html5/imports/api/cursor/server/modifiers/eventHandlers.js
rename to bigbluebutton-html5/.Trash-1000/files/eventHandlers.js
diff --git a/bigbluebutton-html5/imports/api/cursor/server/publications.js b/bigbluebutton-html5/.Trash-1000/files/publications.js
similarity index 100%
rename from bigbluebutton-html5/imports/api/cursor/server/publications.js
rename to bigbluebutton-html5/.Trash-1000/files/publications.js
diff --git a/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo
new file mode 100644
index 0000000000000000000000000000000000000000..b7fb8148a174c9e0c3c98e9acfcdf5b761e65c16
--- /dev/null
+++ b/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo
@@ -0,0 +1,3 @@
+[Trash Info]
+Path=imports/api/cursor/server/modifiers/clearCursors.js
+DeletionDate=2016-11-18T09:49:05
diff --git a/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo
new file mode 100644
index 0000000000000000000000000000000000000000..395cce760ff756b5483ffb639c5c377b4eeb8cf9
--- /dev/null
+++ b/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo
@@ -0,0 +1,3 @@
+[Trash Info]
+Path=imports/api/cursor/server/modifiers/eventHandlers.js
+DeletionDate=2016-11-18T09:49:29
diff --git a/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo
new file mode 100644
index 0000000000000000000000000000000000000000..4d86c5b6409e24b21bf6a3601e55c7a2f0d3164e
--- /dev/null
+++ b/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo
@@ -0,0 +1,3 @@
+[Trash Info]
+Path=imports/api/cursor/server/publications.js
+DeletionDate=2016-11-18T09:46:05
diff --git a/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js b/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc02337a12b12eba1d2e5173b6bc9bfdc4c76851
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js
@@ -0,0 +1,4 @@
+import RedisPubSub from '/imports/startup/server/redis';
+import handleCursorUpdate from './handlers/cursorUpdate';
+
+RedisPubSub.on('presentation_cursor_updated_message', handleCursorUpdate);
diff --git a/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js
new file mode 100644
index 0000000000000000000000000000000000000000..c14e2a7b9a620c6ae403f8de48ee3761d7a6f83d
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js
@@ -0,0 +1,15 @@
+import Logger from '/imports/startup/server/logger';
+import { check } from 'meteor/check';
+import updateCursor from '../modifiers/updateCursor';
+
+export default function handleCursorUpdate({ payload }) {
+  const meetingId = payload.meeting_id;
+  const x = payload.x_percent;
+  const y = payload.y_percent;
+
+  check(meetingId, String);
+  check(x, Number);
+  check(y, Number);
+
+  return updateCursor(meetingId, x, y);
+};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/index.js b/bigbluebutton-html5/imports/api/cursor/server/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..92451ac76bf27410726e8f3cd2eebac46cd7b83e
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/index.js
@@ -0,0 +1,3 @@
+import './eventHandlers';
+import './methods';
+import './publishers';
diff --git a/bigbluebutton-html5/imports/api/cursor/server/methods.js b/bigbluebutton-html5/imports/api/cursor/server/methods.js
new file mode 100644
index 0000000000000000000000000000000000000000..1ce65c369863cac02b7c5224a46ab766a38cf8b3
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/methods.js
@@ -0,0 +1,4 @@
+import { Meteor } from 'meteor/meteor';
+
+Meteor.methods({
+});
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js
new file mode 100755
index 0000000000000000000000000000000000000000..1d3905a7a0128dd86d398bd17f3b5b22a0d7ab4d
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js
@@ -0,0 +1,10 @@
+import Cursor from '/imports/api/cursor';
+import Logger from '/imports/startup/server/logger';
+
+export default function clearCursor(meetingId) {
+  if (meetingId) {
+    return Cursor.remove({ meetingId }, Logger.info(`Cleared Cursor (${meetingId})`));
+  } else {
+    return Cursor.remove({}, Logger.info('Cleared Cursor (all)'));
+  }
+};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js
deleted file mode 100755
index ff7fea40718c9edefaefee08c976ae1c1ce40f07..0000000000000000000000000000000000000000
--- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import Cursor from '/imports/api/cursor';
-import { logger } from '/imports/startup/server/logger';
-
-// called on server start and meeting end
-export function clearCursorCollection() {
-  const meetingId = arguments[0];
-  if (meetingId != null) {
-    return Cursor.remove({
-      meetingId: meetingId,
-    }, () => logger.info(`cleared Cursor Collection (meetingId: ${meetingId})!`));
-  } else {
-    return Cursor.remove({}, () => logger.info('cleared Cursor Collection (all meetings)!'));
-  }
-};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js
index 172a98fe719500b8748bc57b58bfe8468fd18a69..0b4c162e3cb39171b8d3aaa202ec30a17a42ab69 100755
--- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js
+++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js
@@ -1,17 +1,8 @@
 import Cursor from '/imports/api/cursor';
-import { logger } from '/imports/startup/server/logger';
+import updateCursor from './updateCursor';
 
-export function initializeCursor(meetingId) {
-  return Cursor.upsert({
-    meetingId: meetingId,
-  }, {
-    meetingId: meetingId,
-    x: 0,
-    y: 0,
-  }, (err, numChanged) => {
-    if (err) {
-      return logger.error(`err upserting cursor for ${meetingId}`);
-    }
+export default function initializeCursor(meetingId) {
+  check(meetingId, String);
 
-  });
+  return updateCursor(meetingId, 0, 0);
 };
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js
new file mode 100755
index 0000000000000000000000000000000000000000..2e6217849d566b849965d418e55c4c921a33be6d
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js
@@ -0,0 +1,37 @@
+import Logger from '/imports/startup/server/logger';
+import Cursor from '/imports/api/cursor';
+
+export default function updateCursor(meetingId, x = 0, y = 0) {
+  check(meetingId, String);
+  check(x, Number);
+  check(y, Number);
+
+  const selector = {
+    meetingId,
+  };
+
+  const modifier = {
+    $set: {
+      meetingId,
+      x,
+      y,
+    },
+  };
+
+  const cb = (err, numChanged) => {
+    if (err) {
+      return Logger.error(`Upserting cursor to collection: ${err}`);
+    }
+
+    const { insertedId } = numChanged;
+    if (insertedId) {
+      return Logger.info(`Initialized cursor meeting=${meetingId}`);
+    }
+
+    if (numChanged) {
+      return Logger.info(`Updated cursor meeting=${meetingId}`);
+    }
+  };
+
+  return Cursor.upsert(selector, modifier, cb);
+};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js
deleted file mode 100755
index f16c0a5f518c377555de19a44f5ece03c2118e84..0000000000000000000000000000000000000000
--- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import Cursor from '/imports/api/cursor';
-import { logger } from '/imports/startup/server/logger';
-
-export function updateCursorLocation(meetingId, cursorObject) {
-  return Cursor.upsert({
-    meetingId: meetingId,
-  }, {
-    $set: {
-      meetingId: meetingId,
-      x: cursorObject.x,
-      y: cursorObject.y,
-    },
-  }, (err, numChanged) => {
-    if (err != null) {
-      return logger.error(`_unsucc update of cursor for ${meetingId} err=${JSON.stringify(err)}`);
-    }
-
-  });
-};
diff --git a/bigbluebutton-html5/imports/api/cursor/server/publishers.js b/bigbluebutton-html5/imports/api/cursor/server/publishers.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd435ecbf7008d8e1ea7625f1ad3dbb494c66d2a
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/cursor/server/publishers.js
@@ -0,0 +1,22 @@
+import Cursor from '/imports/api/cursor';
+import { Meteor } from 'meteor/meteor';
+import { check } from 'meteor/check';
+import Logger from '/imports/startup/server/logger';
+import { isAllowedTo } from '/imports/startup/server/userPermissions';
+
+Meteor.publish('cursor', (credentials) => {
+  // TODO: Some publishers have ACL and others dont
+  // if (!isAllowedTo('@@@', credentials)) {
+  //   this.error(new Meteor.Error(402, "The user was not authorized to subscribe for 'cursor'"));
+  // }
+
+  const { meetingId, requesterUserId, requesterToken } = credentials;
+
+  check(meetingId, String);
+  check(requesterUserId, String);
+  check(requesterToken, String);
+
+  Logger.info(`Publishing Cursor for ${meetingId} ${requesterUserId} ${requesterToken}`);
+
+  return Cursor.find({ meetingId });
+});
diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js
index 7c9943b3b771a0e1acad6a27687eac471d67c96e..eb34b099f286406503eaea921c4ec5c3b6ed9f91 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js
@@ -1,7 +1,7 @@
 import { check } from 'meteor/check';
 import Meetings from '/imports/api/meetings';
 import Logger from '/imports/startup/server/logger';
-import { initializeCursor } from '/imports/api/cursor/server/modifiers/initializeCursor';
+import initializeCursor from '/imports/api/cursor/server/modifiers/initializeCursor';
 
 export default function addMeeting(meeting) {
   const APP_CONFIG = Meteor.settings.public.app;
diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js
index 110b699bf2a0c5312425502937a8294b5c6cde39..e9036cc13dc1e24c0a15ae4bd0a6b84a25e5e5fa 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js
@@ -7,7 +7,7 @@ import clearChats from '/imports/api/chat/server/modifiers/clearChats';
 import { clearShapesCollection } from '/imports/api/shapes/server/modifiers/clearShapesCollection';
 import clearSlides from '/imports/api/slides/server/modifiers/clearSlides';
 import clearPolls from '/imports/api/polls/server/modifiers/clearPolls';
-import { clearCursorCollection } from '/imports/api/cursor/server/modifiers/clearCursorCollection';
+import clearCursor from '/imports/api/cursor/server/modifiers/clearCursor';
 import { clearCaptionsCollection }
   from '/imports/api/captions/server/modifiers/clearCaptionsCollection';
 import clearPresentations from '/imports/api/presentations/server/modifiers/clearPresentations';
@@ -16,7 +16,7 @@ export default function clearMeetings() {
   return Meetings.remove({}, (err) => {
     clearCaptionsCollection();
     clearChats();
-    clearCursorCollection();
+    clearCursor();
     clearPresentations();
     clearPolls();
     clearShapesCollection();
diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js
index 5460bf01d4f2ad51120998e63fd6bb1794c2d476..75f2e9eb890615514bab77a8a97ef14beb5cd01a 100755
--- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js
+++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js
@@ -7,7 +7,7 @@ import clearChats from '/imports/api/chat/server/modifiers/clearChats';
 import { clearShapesCollection } from '/imports/api/shapes/server/modifiers/clearShapesCollection';
 import clearSlides from '/imports/api/slides/server/modifiers/clearSlides';
 import clearPolls from '/imports/api/polls/server/modifiers/clearPolls';
-import { clearCursorCollection } from '/imports/api/cursor/server/modifiers/clearCursorCollection';
+import clearCursor from '/imports/api/cursor/server/modifiers/clearCursor';
 import { clearCaptionsCollection }
   from '/imports/api/captions/server/modifiers/clearCaptionsCollection';
 import clearPresentations from '/imports/api/presentations/server/modifiers/clearPresentations';
diff --git a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js
index 868290d952268eff20ea244d83ed90ab40b0e945..be66ed0ec6312054b1d888b4876f08bc9871c09e 100755
--- a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js
+++ b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js
@@ -3,7 +3,7 @@ import Logger from '/imports/startup/server/logger';
 
 export default function clearSlides(meetingId) {
   if (meetingId) {
-    return Slides.remove({ meetingId: meetingId }, Logger.info(`Cleared Slides (${meetingId})`));
+    return Slides.remove({ meetingId }, Logger.info(`Cleared Slides (${meetingId})`));
   } else {
     return Slides.remove({}, Logger.info('Cleared Slides (all)'));
   }
diff --git a/bigbluebutton-html5/server/main.js b/bigbluebutton-html5/server/main.js
index d1256192fe2f115b164ba056648bc8d26f0c61ab..0edfeb00497c5fabba6fdfd2eeebe9bd0aa34455 100755
--- a/bigbluebutton-html5/server/main.js
+++ b/bigbluebutton-html5/server/main.js
@@ -1,11 +1,7 @@
 import '/imports/startup/server';
 import '/imports/api/chat/server';
 
-import '/imports/api/cursor/server/publications';
-import '/imports/api/cursor/server/modifiers/clearCursorCollection';
-import '/imports/api/cursor/server/modifiers/initializeCursor';
-import '/imports/api/cursor/server/modifiers/updateCursorLocation';
-import '/imports/api/cursor/server/modifiers/eventHandlers';
+import '/imports/api/cursor/server';
 
 import '/imports/api/deskshare/server/publications';
 import '/imports/api/deskshare/server/modifiers/clearDeskshareCollection';