diff --git a/client/bbb-html5-client/iotest.coffee b/client/bbb-html5-client/iotest.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..9f7aa204291902620a6cab33b55cb8bd67f8f890
--- /dev/null
+++ b/client/bbb-html5-client/iotest.coffee
@@ -0,0 +1,14 @@
+postal = require('postal')
+{SocketIoMessageHandler} = require './lib/clientproxy'
+crypto = require 'crypto'
+
+io = require('socket.io').listen(3019)
+sio = new SocketIoMessageHandler(io)
+
+
+
+
+
+
+
+
diff --git a/client/bbb-html5-client/lib/bbblogger.coffee b/client/bbb-html5-client/lib/bbblogger.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..81f4acb860cf1ff50ba30c15f59eb46d6da80ec0
--- /dev/null
+++ b/client/bbb-html5-client/lib/bbblogger.coffee
@@ -0,0 +1,17 @@
+bunyan = require 'bunyan'
+
+logger = bunyan.createLogger({
+  name: 'bbbnode',
+  streams: [
+    {
+      level: 'debug',
+      stream: process.stdout,
+    },
+    {
+      level: 'info',
+      path: '/var/log/bigbluebutton/bbbnode.log'
+    }
+  ]
+});
+
+module.exports = logger;
diff --git a/client/bbb-html5-client/lib/clientproxy.coffee b/client/bbb-html5-client/lib/clientproxy.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..e00f8d8cfd750827ebdd8ac654a6aff4a4929457
--- /dev/null
+++ b/client/bbb-html5-client/lib/clientproxy.coffee
@@ -0,0 +1,63 @@
+{Controller} = require './controller'
+log = require './bbblogger'
+
+MESSAGE = "message"
+
+class SocketIoMessageHandler
+  constructor: (io) ->
+    @io = io 
+    @controller = new Controller(@)
+    @initialize()
+
+  initialize: () ->  
+    @io.sockets.on('connection', (socket) ->
+      console.log("Client has connected.")
+      log.debug("LOG: Client has connected.")
+      socket.on('message', (jsonMsg) ->
+        log.debug("Received message #{jsonMsg}")
+        handleMessage(socket, @controller, jsonMsg)
+      )
+      socket.on('disconnect', () -> 
+        handleClientDisconnected socket
+      )
+    )
+
+exports.SocketIoMessageHandler = SocketIoMessageHandler
+
+handleClientDisconnected = (socket) ->
+  log.debug("LOG: Client has disconnected.")
+
+handleMessage = (socket, controller, message) ->
+  if message.name?
+    handleValidMessage(socket, controller, message)
+  else
+    log.error({error: "Invalid message", message: JSON.stringify(message)})
+
+handleValidMessage = (socket, controller, message) ->
+  switch message.name
+    when 'authenticateMessage'
+      handleLoginMessage socket, controller, message
+    when 'Sandra'
+      connectJackNumber 22
+    when 'Toby'
+      connectJackNumber 9
+    else
+      console.log('I am sorry, your call cannot be connected')
+
+handleLoginMessage = (socket, controller, data) ->
+  controller.processLoginMessage(data, (err, result) ->
+    if (err)
+      message = {name: "authenticationReply", error: err}
+      sendMessageToClient message
+    else
+      message = {name: "authenticationReply", data: result}
+      sendMessageToClient message
+   )
+
+sendMessageToClient = (socket, message) ->
+  socket.emit(MESSAGE, JSON.stringify(message))
+
+
+
+
+
diff --git a/client/bbb-html5-client/lib/controller.coffee b/client/bbb-html5-client/lib/controller.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..c1339b98b5ede9deede3fc227565d663e5768805
--- /dev/null
+++ b/client/bbb-html5-client/lib/controller.coffee
@@ -0,0 +1,22 @@
+bus = require './messagebus'
+logger = require './bbblogger'
+
+class Controller
+  constructor: (clientProxy) ->
+    @proxy = clientProxy
+
+  processLoginMessage = (data, callback) ->
+    bus.sendMessage(data, (err, result) ->
+      if (err)
+        errLog = {message: "Authentication Failure", reason: err, data: data}
+        log.error(JSON.stringify(errLog))
+        callback(err, null)
+      else
+        console.log("SUCCESS: #{result}")
+        if result.error?
+          callback(result.error, null) 
+        else
+          callback(null, result.data)
+    )
+
+exports.Controller = Controller
\ No newline at end of file
diff --git a/client/bbb-html5-client/lib/messagebus.coffee b/client/bbb-html5-client/lib/messagebus.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..be8662456ba585a340514cc8a0a7f30ce3fd9f54
--- /dev/null
+++ b/client/bbb-html5-client/lib/messagebus.coffee
@@ -0,0 +1,50 @@
+postal = require('postal')
+redisrpc = require './redispubsub'
+crypto = require 'crypto'
+
+io = require('socket.io').listen(3009)
+
+io.sockets.on('connection', (socket) ->
+  console.log("Connected")
+  socket.on('login', (data) ->
+   console.log("User login #{data}")
+   sendMessage(data, (err, result) ->
+     if (err)
+      console.log("ERROR: #{err}")
+     else
+      console.log("SUCCESS: #{result}")
+      socket.emit('authenticated', JSON.stringify(result))
+   )
+  )
+
+  socket.on('event', (data) -> 
+    console.log("Server received event.")
+  )
+
+  socket.on('disconnect', () -> 
+    console.log("Server disconnect event.")
+  )
+
+  socket.emit('ready')
+)
+
+
+sendMessage = (data, callback) ->
+  replyTo = {
+    channel: 'model.data',
+    topic: 'get.' + crypto.randomBytes(16).toString('hex')
+  };
+
+  postal.subscribe({
+    channel: replyTo.channel,
+    topic: replyTo.topic,
+    callback: (msg, envelope) ->
+      callback( msg.err, msg.data )
+  }).once()
+
+  postal.publish({
+    channel: 'publishChannel',
+    topic: 'broadcast',
+    replyTo: replyTo,
+    data: data
+  })
\ No newline at end of file
diff --git a/client/bbb-html5-client/lib/redispubsub.coffee b/client/bbb-html5-client/lib/redispubsub.coffee
new file mode 100755
index 0000000000000000000000000000000000000000..e5551a75e92a81b73182ad39bd5bcb64cd84a012
--- /dev/null
+++ b/client/bbb-html5-client/lib/redispubsub.coffee
@@ -0,0 +1,95 @@
+redis = require 'redis'
+crypto = require 'crypto'
+postal = require 'postal'
+
+# default timeout to wait for response
+TIMEOUT = 5000; 
+
+pubClient = redis.createClient()
+subClient = redis.createClient()
+
+# hash to store requests waiting for response
+pendingRequests = {}; 
+
+initialize = () ->
+  postal.subscribe({
+    channel: 'publishChannel',
+    topic: 'broadcast',
+    callback: ( msg, envelope ) -> 
+      if (envelope.replyTo?)
+        sendAndWaitForReply(msg, envelope)
+      else
+        sendMessage(msg, envelope)
+    })
+
+sendAndWaitForReply = (message, envelope) ->
+  # generate a unique correlation id for this call
+  correlationId = crypto.randomBytes(16).toString('hex');
+  
+  # create a timeout for what should happen if we don't get a response
+  timeoutId = setTimeout( (correlationId) ->
+    response = {}
+    #if this ever gets called we didn't get a response in a 
+    #timely fashion
+    error = {code: "503", message: "Waiting for reply timeout.", description: "Waiting for reply timeout."}
+    response.err = error
+    postal.publish({
+      channel: envelope.replyTo.channel,
+      topic: envelope.replyTo.topic,
+      data: response
+    })
+    # delete the entry from hash
+    delete pendingRequests[correlationId];
+  , TIMEOUT, correlationId)
+
+  # create a request entry to store in a hash
+  entry = {
+    replyTo: envelope.replyTo,
+    timeout: timeoutId #the id for the timeout so we can clear it
+  };
+  
+  # put the entry in the hash so we can match the response later
+  pendingRequests[correlationId] = entry;
+  console.log("Publishing #{message}")
+
+  message.correlationId = correlationId
+  
+  pubClient.publish("bigbluebuttonAppChannel", JSON.stringify(message))
+
+subClient.on("subscribe", (channel, count) ->
+  console.log("Subscribed to #{channel}")
+)
+
+subClient.on("message", (channel, jsonMsg) ->
+  console.log("Received message on [channel] = #{channel} [message] = #{jsonMsg}")
+  message = JSON.parse(jsonMsg)
+
+  if (message.correlationId?)
+    #retreive the request entry
+    entry = pendingRequests[message.correlationId];
+    #make sure we don't timeout by clearing it
+    clearTimeout(entry.timeout);
+    #delete the entry from hash
+    delete pendingRequests[message.correlationId];
+    response = {}
+    response.data = message
+    postal.publish({
+      channel: entry.replyTo.channel,
+      topic: entry.replyTo.topic,
+      data: response
+    })
+  else
+    if message.meetingId?
+      postal.publish({
+        channel: "bigbluebuttonAppChannel"
+        topic: message.meetingId,
+        data: message
+      })
+    else 
+      console.log("Invalid message: #{jsonMsg}")
+)
+
+initialize()
+
+console.log("RPC: Subscribing message on channel [responseChannel]")
+subClient.subscribe("responseChannel")
diff --git a/client/bbb-html5-client/package.json b/client/bbb-html5-client/package.json
old mode 100644
new mode 100755
index 55ef66218ab6919c4db1b6d58bcf7c344587b8bb..8d0022edddd8c73281cd306b343cea5316dffa41
--- a/client/bbb-html5-client/package.json
+++ b/client/bbb-html5-client/package.json
@@ -9,8 +9,11 @@
     "connect-redis": "1.4.5",
     "connect": "2.8.5",
     "socket.io": "0.9.16",
-    "redis": "0.9.0",
-    "hiredis": "0.1.15",
+    "postal" : "0.9.0-rc1",
+    "redis": "0.10.1",
+    "hiredis": "0.1.16",
+    "bunyan": "0.22.2",
+    "crypto-js": "3.1.2-3",
     "sanitizer": "0.0.15",
     "hat": "0.0.3",
     "imagemagick": "0.1.3",