diff --git a/deskshare/app/build.gradle b/deskshare/app/build.gradle
index 1384db20f8bf5c339251cbd2a97b12740d261675..baf747da04698b45e35c999e7c861064f7c06835 100755
--- a/deskshare/app/build.gradle
+++ b/deskshare/app/build.gradle
@@ -20,6 +20,7 @@ task resolveDeps(type: Copy) {
  */
 repositories {
   mavenCentral()
+  mavenLocal()
 	   add(new org.apache.ivy.plugins.resolver.ChainResolver()) {
 		 name = 'remote'
 		   returnFirst = true
@@ -138,6 +139,8 @@ dependencies {
   compile 'redis.clients:jedis:1.5.1'
   providedCompile 'commons-pool:commons-pool:1.5.6'
 	compile 'com.google.code.gson:gson:1.7.1'
+
+  compile 'org.bigbluebutton:bbb-common-message:0.0.16'
 }
 
 test {
diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb4f0f5b5a26e376281ec9785ee16dbd694a24f7
--- /dev/null
+++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/GenericObjectPoolConfigWrapper.java
@@ -0,0 +1,138 @@
+/**
+* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+*
+* Copyright (c) 2017 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.red5.pubsub;
+
+import org.apache.commons.pool.impl.GenericObjectPool;
+
+public class GenericObjectPoolConfigWrapper {
+
+	private final GenericObjectPool.Config config;
+
+	public GenericObjectPoolConfigWrapper() {
+		this.config = new GenericObjectPool.Config();
+	}
+
+	public GenericObjectPool.Config getConfig() {
+		return config;
+	}
+
+	public int getMaxIdle() {
+		return this.config.maxIdle;
+	}
+
+	public void setMaxIdle(int maxIdle) {
+		this.config.maxIdle = maxIdle;
+	}
+
+	public int getMinIdle() {
+		return this.config.minIdle;
+	}
+
+	public void setMinIdle(int minIdle) {
+		this.config.minIdle = minIdle;
+	}
+
+	public int getMaxActive() {
+		return this.config.maxActive;
+	}
+
+	public void setMaxActive(int maxActive) {
+		this.config.maxActive = maxActive;
+	}
+
+	public long getMaxWait() {
+		return this.config.maxWait;
+	}
+
+	public void setMaxWait(long maxWait) {
+		this.config.maxWait = maxWait;
+	}
+
+	public byte getWhenExhaustedAction() {
+		return this.config.whenExhaustedAction;
+	}
+
+	public void setWhenExhaustedAction(byte whenExhaustedAction) {
+		this.config.whenExhaustedAction = whenExhaustedAction;
+	}
+
+	public boolean isTestOnBorrow() {
+		return this.config.testOnBorrow;
+	}
+
+	public void setTestOnBorrow(boolean testOnBorrow) {
+		this.config.testOnBorrow = testOnBorrow;
+	}
+
+	public boolean isTestOnReturn() {
+		return this.config.testOnReturn;
+	}
+
+	public void setTestOnReturn(boolean testOnReturn) {
+		this.config.testOnReturn = testOnReturn;
+	}
+
+	public boolean isTestWhileIdle() {
+		return this.config.testWhileIdle;
+	}
+
+	public void setTestWhileIdle(boolean testWhileIdle) {
+		this.config.testWhileIdle = testWhileIdle;
+	}
+
+	public long getTimeBetweenEvictionRunsMillis() {
+		return this.config.timeBetweenEvictionRunsMillis;
+	}
+
+	public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
+		this.config.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
+	}
+
+	public int getNumTestsPerEvictionRun() {
+		return this.config.numTestsPerEvictionRun;
+	}
+
+	public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
+		this.config.numTestsPerEvictionRun = numTestsPerEvictionRun;
+	}
+
+	public long getMinEvictableIdleTimeMillis() {
+		return this.config.minEvictableIdleTimeMillis;
+	}
+
+	public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
+		this.config.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
+	}
+
+	public long getSoftMinEvictableIdleTimeMillis() {
+		return this.config.softMinEvictableIdleTimeMillis;
+	}
+
+	public void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) {
+		this.config.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
+	}
+
+	public boolean isLifo() {
+		return this.config.lifo;
+	}
+
+	public void setLifo(boolean lifo) {
+		this.config.lifo = lifo;
+	}
+}
diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7da742c76f920597e53a4faf9f10e368cf37ae3
--- /dev/null
+++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessagePublisher.java
@@ -0,0 +1,55 @@
+/**
+* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+*
+* Copyright (c) 2017 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.deskshare.server.red5.pubsub;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.bigbluebutton.common.messages.MessagingConstants;
+import org.bigbluebutton.common.messages.Constants;
+import org.bigbluebutton.common.messages.StartTranscoderRequestMessage;
+import org.bigbluebutton.common.messages.StopTranscoderRequestMessage;
+import org.bigbluebutton.deskshare.server.red5.pubsub.MessageSender;
+
+public class MessagePublisher {
+
+	private MessageSender sender;
+
+	public void setMessageSender(MessageSender sender) {
+		this.sender = sender;
+	}
+
+	public void startH264ToH263TranscoderRequest(String meetingId, String streamName, String ipAddress) {
+		Map<String, String> params = new HashMap<String, String>();
+		params.put(Constants.TRANSCODER_TYPE, Constants.TRANSCODE_H264_TO_H263);
+		params.put(Constants.MODULE, "deskShare");
+		params.put(Constants.LOCAL_IP_ADDRESS, ipAddress);
+		params.put(Constants.DESTINATION_IP_ADDRESS, ipAddress);
+		params.put(Constants.INPUT, streamName);
+		// TODO: transcoderId is getting meetingId, this may have to change
+		StartTranscoderRequestMessage msg = new StartTranscoderRequestMessage(meetingId, meetingId, params);
+		sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson());
+	}
+
+	public void stopTranscoderRequest(String meetingId) {
+		// TODO: transcoderId is getting meetingId, this may have to change
+		StopTranscoderRequestMessage msg = new StopTranscoderRequestMessage(meetingId, meetingId);
+		sender.send(MessagingConstants.TO_BBB_TRANSCODE_SYSTEM_CHAN, msg.toJson());
+	}
+}
diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java
new file mode 100644
index 0000000000000000000000000000000000000000..25ef088b9fbbf685e3b7cf9237d87f326ef00f85
--- /dev/null
+++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageSender.java
@@ -0,0 +1,94 @@
+/**
+* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+*
+* Copyright (c) 2017 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.deskshare.server.red5.pubsub;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+public class MessageSender {
+	private static Logger log = Red5LoggerFactory.getLogger(MessageSender.class, "deskshare");
+
+	private JedisPool redisPool;
+	private volatile boolean sendMessage = false;
+
+	private final Executor msgSenderExec = Executors.newSingleThreadExecutor();
+	private final Executor runExec = Executors.newSingleThreadExecutor();
+	private BlockingQueue<MessageToSend> messages = new LinkedBlockingQueue<MessageToSend>();
+
+	public void stop() {
+		sendMessage = false;
+	}
+
+	public void start() {
+		log.info("Redis message publisher starting!");
+		try {
+			sendMessage = true;
+
+			Runnable messageSender = new Runnable() {
+				public void run() {
+					while (sendMessage) {
+						try {
+							MessageToSend msg = messages.take();
+							publish(msg.getChannel(), msg.getMessage());
+						} catch (InterruptedException e) {
+							log.warn("Failed to get message from queue.");
+						}
+					}
+				}
+			};
+			msgSenderExec.execute(messageSender);
+		} catch (Exception e) {
+			log.error("Error subscribing to channels: " + e.getMessage());
+		}
+	}
+
+	public void send(String channel, String message) {
+		MessageToSend msg = new MessageToSend(channel, message);
+		messages.add(msg);
+	}
+
+	private void publish(final String channel, final String message) {
+		Runnable task = new Runnable() {
+			public void run() {
+				Jedis jedis = redisPool.getResource();
+				try {
+					jedis.publish(channel, message);
+				} catch(Exception e){
+					log.warn("Cannot publish the message to redis", e);
+				} finally {
+					redisPool.returnResource(jedis);
+				}
+			}
+		};
+
+		runExec.execute(task);
+	}
+
+	public void setRedisPool(JedisPool redisPool){
+		this.redisPool = redisPool;
+	}
+}
diff --git a/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a2ccb77538a9954bfb471cb33692b51d48b5a6a
--- /dev/null
+++ b/deskshare/app/src/main/java/org/bigbluebutton/deskshare/server/red5/pubsub/MessageToSend.java
@@ -0,0 +1,37 @@
+/**
+* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+*
+* Copyright (c) 2017 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.deskshare.server.red5.pubsub;
+
+public class MessageToSend {
+	private final String channel;
+	private final String message;
+
+	public MessageToSend(String channel, String message) {
+		this.channel = channel;
+		this.message = message;
+	}
+
+	public String getChannel() {
+		return channel;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+}
diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala
index bae1803c4d9fa3e708ff6f9e91efac5f9f2253ee..74d53963759201bb11a18c4b1dd302f5f5dabdc6 100755
--- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala
+++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/red5/DeskshareApplication.scala
@@ -27,6 +27,7 @@ import org.bigbluebutton.deskshare.server.RtmpClientAdapter
 import org.bigbluebutton.deskshare.server.stream.StreamManager
 import org.bigbluebutton.deskshare.server.socket.DeskShareServer
 import org.bigbluebutton.deskshare.server.MultiThreadedAppAdapter
+import org.bigbluebutton.deskshare.server.red5.pubsub.MessagePublisher
 import scala.actors.Actor
 import scala.actors.Actor._
 import net.lag.configgy.Configgy
@@ -37,7 +38,7 @@ import org.red5.server.api.scope.{IScope}
 import org.red5.server.util.ScopeUtils
 import com.google.gson.Gson
 
-class DeskshareApplication(streamManager: StreamManager, deskShareServer: DeskShareServer) extends MultiThreadedAppAdapter {
+class DeskshareApplication(streamManager: StreamManager, deskShareServer: DeskShareServer, messagePublisher: MessagePublisher) extends MultiThreadedAppAdapter {
 	private val deathSwitch = new CountDownLatch(1)
 
 	// load our config file and configure logfiles.
diff --git a/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml b/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml
new file mode 100644
index 0000000000000000000000000000000000000000..68c5ba118d598d7cbf105815e8ddbcdbb9d14048
--- /dev/null
+++ b/deskshare/app/src/main/webapp/WEB-INF/bbb-redis-pool.xml
@@ -0,0 +1,64 @@
+<?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/>.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+			http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+			http://www.springframework.org/schema/util
+			http://www.springframework.org/schema/util/spring-util-2.0.xsd">
+
+	<bean id="redisPool" class="redis.clients.jedis.JedisPool">
+		<constructor-arg index="0">
+			<bean factory-bean="config" factory-method="getConfig" />
+		</constructor-arg>
+		<constructor-arg index="1" value="${redis.host}"/>
+		<constructor-arg index="2" value="${redis.port}"/>
+	</bean>
+
+	<bean id="config" class="org.bigbluebutton.deskshare.server.red5.pubsub.GenericObjectPoolConfigWrapper">
+		<!-- Action to take when trying to acquire a connection and all connections are taken -->
+		<property name="whenExhaustedAction">
+			<!-- Fail-fast behaviour, we don't like to keep the kids waiting -->
+			<util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_FAIL"/>
+			<!-- Default behaviour, block the caller until a resource becomes available -->
+			<!--<util:constant static-field="org.apache.commons.pool.impl.GenericObjectPool.WHEN_EXHAUSTED_BLOCK" />-->
+		</property>
+		<!-- Maximum active connections to Redis instance -->
+		<property name="maxActive" value="12"/>
+		<!-- Number of connections to Redis that just sit there and do nothing -->
+		<property name="maxIdle" value="6"/>
+		<!-- Minimum number of idle connections to Redis - these can be seen as always open and ready to serve -->
+		<property name="minIdle" value="1"/>
+		<!-- Tests whether connection is dead when connection retrieval method is called -->
+		<property name="testOnBorrow" value="true"/>
+		<!-- Tests whether connection is dead when returning a connection to the pool -->
+		<property name="testOnReturn" value="true"/>
+		<!-- Tests whether connections are dead during idle periods -->
+		<property name="testWhileIdle" value="true"/>
+		<!-- Maximum number of connections to test in each idle check -->
+		<property name="numTestsPerEvictionRun" value="12"/>
+		<!-- Idle connection checking period -->
+		<property name="timeBetweenEvictionRunsMillis" value="60000"/>
+		<!-- Maximum time, in milliseconds, to wait for a resource when exausted action is set to WHEN_EXAUSTED_BLOCK -->
+		<property name="maxWait" value="5000"/>
+	</bean>
+</beans>
diff --git a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
index f83f636841b7072675323e869ac65c5f8f6bdc7f..928dfda8f743ee28d76d023c640d143be3065f9e 100755
--- a/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
+++ b/deskshare/app/src/main/webapp/WEB-INF/red5-web.xml
@@ -39,6 +39,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
   <bean id="web.handler" class="org.bigbluebutton.deskshare.server.red5.DeskshareApplication">
     <constructor-arg ref="streamManager"/>
     <constructor-arg ref="deskShareServer"/>
+    <constructor-arg ref="messagePublisher"/>
   </bean>
   <bean id="deskshare.service" class="org.bigbluebutton.deskshare.server.stream.DeskshareService">
     <constructor-arg ref="streamManager"/>
@@ -71,4 +72,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
     <constructor-arg index="1" value="${redis.port}"/>
     <constructor-arg index="2" value="${redis.keyExpiry}"/>
   </bean>
+  <bean id="messageSender" class="org.bigbluebutton.deskshare.server.red5.pubsub.MessageSender"
+      init-method="start" destroy-method="stop">
+    <property name="redisPool" ref="redisPool"/>
+  </bean>
+  <bean id="messagePublisher" class="org.bigbluebutton.deskshare.server.red5.pubsub.MessagePublisher">
+    <property name="messageSender" ref="messageSender"/>
+  </bean>
+  <import resource="bbb-redis-pool.xml"/>
 </beans>