diff --git a/akka-bbb-apps/build.sbt b/akka-bbb-apps/build.sbt
index b4a2aa6c32e56f01e33985f43a60a4a7054dec98..b338a7788c5f09bf97587d73ce64613732668418 100755
--- a/akka-bbb-apps/build.sbt
+++ b/akka-bbb-apps/build.sbt
@@ -50,7 +50,7 @@ libraryDependencies ++= {
 	  "com.google.code.gson"      %  "gson"              % "1.7.1",
 	  "redis.clients"             %  "jedis"             % "2.7.2",
       "org.apache.commons"        %  "commons-lang3"     % "3.2",
-      "org.bigbluebutton"         %  "bbb-common-message" % "0.0.16"
+      "org.bigbluebutton"         %  "bbb-common-message" % "0.0.17"
 	)}
 
 seq(Revolver.settings: _*)
diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java
index 1c083591efba8426aab7196377545f1770f9a9ec..86ae822764d49bbf9143f1705eaa32ec599f1040 100755
--- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java
+++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/api/IBigBlueButtonInGW.java
@@ -34,7 +34,7 @@ public interface IBigBlueButtonInGW {
 	
 	// Users
 	void validateAuthToken(String meetingId, String userId, String token, String correlationId, String sessionId);
-	void registerUser(String roomName, String userid, String username, String role, String externUserID, String authToken);
+	void registerUser(String roomName, String userid, String username, String role, String externUserID, String authToken, String avatarURL);
 	void userEmojiStatus(String meetingId, String userId, String emojiStatus);	
 	void shareWebcam(String meetingId, String userId, String stream);
 	void unshareWebcam(String meetingId, String userId, String stream);
@@ -59,7 +59,7 @@ public interface IBigBlueButtonInGW {
 	void ejectUserFromVoice(String meetingID, String userId, String ejectedBy);
 	void ejectUserFromMeeting(String meetingId, String userId, String ejectedBy);
 	void voiceUserJoined(String voiceConfId, String voiceUserId, String userId, String callerIdName, 
-								String callerIdNum, Boolean muted, Boolean talking);
+								String callerIdNum, Boolean muted, String avatarURL, Boolean talking);
 	void voiceUserLeft(String meetingId, String userId);
 	void voiceUserLocked(String meetingId, String userId, Boolean locked);
 	void voiceUserMuted(String meetingId, String userId, Boolean muted);
diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java
index 3186bc8e06ec3a49214a0d74d4a26d5a15563f7c..414851d1ff700e2bbc039438bba7950e0c494b3f 100755
--- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java
+++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/MeetingMessageReceiver.java
@@ -50,7 +50,7 @@ public class MeetingMessageReceiver implements MessageHandler {
 							  emm.moderatorPass, emm.viewerPass, emm.createTime, emm.createDate);
 				} else if (msg instanceof RegisterUserMessage) {
 					RegisterUserMessage emm = (RegisterUserMessage) msg;
-					bbbGW.registerUser(emm.meetingID, emm.internalUserId, emm.fullname, emm.role, emm.externUserID, emm.authToken);
+					bbbGW.registerUser(emm.meetingID, emm.internalUserId, emm.fullname, emm.role, emm.externUserID, emm.authToken, emm.avatarURL);
 				} else if (msg instanceof DestroyMeetingMessage) {
 					DestroyMeetingMessage emm = (DestroyMeetingMessage) msg;
 					bbbGW.destroyMeeting(emm.meetingId);
@@ -133,4 +133,4 @@ public class MeetingMessageReceiver implements MessageHandler {
 		this.bbbGW = bbbGW;
 	}
 	
-}
\ No newline at end of file
+}
diff --git a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java
index 46ebec54b6e7234906414cc8318fdc8aaf41621f..bdbe9a86c0607a99ac9d3823853416260370ec99 100755
--- a/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java
+++ b/akka-bbb-apps/src/main/java/org/bigbluebutton/core/pubsub/receivers/UsersMessageReceiver.java
@@ -158,7 +158,7 @@ public class UsersMessageReceiver implements MessageHandler{
 	private void processUserJoinedVoiceConfMessage(String json) {
 		UserJoinedVoiceConfMessage msg = UserJoinedVoiceConfMessage.fromJson(json);
 		if (msg != null) {
-			bbbInGW.voiceUserJoined(msg.voiceConfId, msg.voiceUserId, msg.userId, msg.callerIdName, msg.callerIdNum, msg.muted, msg.talking);
+			bbbInGW.voiceUserJoined(msg.voiceConfId, msg.voiceUserId, msg.userId, msg.callerIdName, msg.callerIdNum, msg.muted, msg.avatarURL, msg.talking);
 		}
 	}
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
index c781e7b579bdd1d501c3a99815024c9b0e021613..1e3fe220fc92ecae71b7aa0b26472394ab729b31 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala
@@ -83,9 +83,9 @@ class BigBlueButtonInGW(val system: ActorSystem, recorderApp: RecorderApplicatio
     bbbActor ! new ValidateAuthToken(meetingId, userId, token, correlationId, sessionId)
   }
 
-  def registerUser(meetingID: String, userID: String, name: String, role: String, extUserID: String, authToken: String): Unit = {
+  def registerUser(meetingID: String, userID: String, name: String, role: String, extUserID: String, authToken: String, avatarURL: String): Unit = {
     val userRole = if (role == "MODERATOR") Role.MODERATOR else Role.VIEWER
-    bbbActor ! new RegisterUser(meetingID, userID, name, userRole, extUserID, authToken)
+    bbbActor ! new RegisterUser(meetingID, userID, name, userRole, extUserID, authToken, avatarURL)
   }
 
   def sendLockSettings(meetingID: String, userId: String, settings: java.util.Map[String, java.lang.Boolean]) {
@@ -416,10 +416,10 @@ class BigBlueButtonInGW(val system: ActorSystem, recorderApp: RecorderApplicatio
   }
 
   def voiceUserJoined(voiceConfId: String, voiceUserId: String, userId: String, callerIdName: String,
-    callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean) {
+    callerIdNum: String, muted: java.lang.Boolean, avatarURL: String, talking: java.lang.Boolean) {
 
     bbbActor ! new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, userId, callerIdName,
-      callerIdNum, muted, talking, false /*hardcode listenOnly to false as the message for listenOnly is ConnectedToGlobalAudio*/ )
+      callerIdNum, muted, talking, avatarURL, false /*hardcode listenOnly to false as the message for listenOnly is ConnectedToGlobalAudio*/ )
 
   }
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala
index 6ea5ffdc7656629d3b7444b1c7d73123e4635814..bc5b3633ff27f838398cab1bb3ee5840e91ca6ea 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala
@@ -512,6 +512,7 @@ class MessageSenderActor(val meetingId: String, val service: MessageSender)
   private def handleUserRegistered(msg: UserRegistered) {
     val json = UsersMessageToJsonConverter.userRegisteredToJson(msg)
     service.send(MessagingConstants.FROM_MEETING_CHANNEL, json)
+    handleRegisteredUser(msg);
   }
 
   private def handleUserStatusChange(msg: UserStatusChange) {
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
index 642c6a3be297d80233d3f2312f6097077c08ff67..d8fdb2f859d532157d5f801cdbafb343d56d4b31 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala
@@ -28,7 +28,7 @@ case class GetLockSettings(meetingID: String, userId: String) extends InMessage
 case class ValidateAuthToken(meetingID: String, userId: String, token: String,
   correlationId: String, sessionId: String) extends InMessage
 case class RegisterUser(meetingID: String, userID: String, name: String, role: Role,
-  extUserID: String, authToken: String) extends InMessage
+  extUserID: String, authToken: String, avatarURL: String) extends InMessage
 case class UserJoining(meetingID: String, userID: String, authToken: String) extends InMessage
 case class UserLeaving(meetingID: String, userID: String, sessionId: String) extends InMessage
 case class GetUsers(meetingID: String, requesterID: String) extends InMessage
@@ -100,7 +100,7 @@ case class EjectUserFromVoiceRequest(meetingID: String, userId: String, ejectedB
 case class VoiceUserJoinedMessage(meetingID: String, user: String, voiceConfId: String,
   callerIdNum: String, callerIdName: String, muted: Boolean, talking: Boolean) extends InMessage
 case class UserJoinedVoiceConfMessage(voiceConfId: String, voiceUserId: String, userId: String, externUserId: String,
-  callerIdName: String, callerIdNum: String, muted: Boolean, talking: Boolean, listenOnly: Boolean)
+  callerIdName: String, callerIdNum: String, muted: Boolean, talking: Boolean, avatarURL: String, listenOnly: Boolean)
 case class UserLeftVoiceConfMessage(voiceConfId: String, voiceUserId: String)
 case class UserLockedInVoiceConfMessage(voiceConfId: String, voiceUserId: String, locked: Boolean)
 case class UserMutedInVoiceConfMessage(voiceConfId: String, voiceUserId: String, muted: Boolean)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala
index 34744822316b5e403540adf6bd755012cccda550..00e6459b11eae1b099eeae144311fbcfe53e1a06 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/ValueObjects.scala
@@ -69,7 +69,8 @@ case class RegisteredUser(
   externId: String,
   name: String,
   role: Role.Role,
-  authToken: String)
+  authToken: String,
+  avatarURL: String)
 
 case class Voice(
   id: String,
@@ -94,6 +95,7 @@ case class UserVO(
   phoneUser: Boolean,
   voiceUser: VoiceUser,
   listenOnly: Boolean,
+  avatarURL: String,
   joinedWeb: Boolean)
 
 case class VoiceUser(
@@ -105,6 +107,7 @@ case class VoiceUser(
   locked: Boolean,
   muted: Boolean,
   talking: Boolean,
+  avatarURL: String,
   listenOnly: Boolean)
 
 case class MeetingConfig(name: String,
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
index 2103c9e3f1818ae9378e180a33f0da99409d5444..3473a160372ccab9402df7aef7852bfbf26202d2 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala
@@ -120,7 +120,7 @@ trait UsersApp {
       log.info("Register user failed. Mmeeting has ended. meetingId=" + mProps.meetingID + " userId=" + msg.userID)
       sendMeetingHasEnded(msg.userID)
     } else {
-      val regUser = new RegisteredUser(msg.userID, msg.extUserID, msg.name, msg.role, msg.authToken)
+      val regUser = new RegisteredUser(msg.userID, msg.extUserID, msg.name, msg.role, msg.authToken, msg.avatarURL)
       usersModel.addRegisteredUser(msg.authToken, regUser)
 
       log.info("Register user success. meetingId=" + mProps.meetingID + " userId=" + msg.userID + " user=" + regUser)
@@ -329,7 +329,7 @@ trait UsersApp {
              */
             new VoiceUser(u.voiceUser.userId, msg.userID, ru.name, ru.name,
               joined = false, locked = false, muted = false,
-              talking = false, listenOnly = u.listenOnly)
+              talking = false, u.avatarURL, listenOnly = u.listenOnly)
           }
         }
         case None => {
@@ -339,7 +339,7 @@ trait UsersApp {
            */
           new VoiceUser(msg.userID, msg.userID, ru.name, ru.name,
             joined = false, locked = false,
-            muted = false, talking = false, listenOnly = false)
+            muted = false, talking = false, ru.avatarURL, listenOnly = false)
         }
       }
 
@@ -363,7 +363,7 @@ trait UsersApp {
         ru.role, emojiStatus = "none", presenter = false,
         hasStream = false, locked = getInitialLockStatus(ru.role),
         webcamStreams = new ListSet[String](), phoneUser = false, vu,
-        listenOnly = vu.listenOnly, joinedWeb = true)
+        listenOnly = vu.listenOnly, avatarURL = vu.avatarURL, joinedWeb = true)
 
       usersModel.addUser(uvo)
 
@@ -401,7 +401,7 @@ trait UsersApp {
            */
           switchUserToPhoneUser((new UserJoinedVoiceConfMessage(mProps.voiceBridge,
             vu.userId, u.userID, u.externUserID, vu.callerName,
-            vu.callerNum, vu.muted, vu.talking, u.listenOnly)));
+            vu.callerNum, vu.muted, vu.talking, vu.avatarURL, u.listenOnly)));
         }
       }
 
@@ -436,7 +436,7 @@ trait UsersApp {
          * If user is not joined listenOnly then user is joined calling through phone or webrtc.
          */
         val vu = new VoiceUser(msg.voiceUserId, webUserId, msg.callerIdName, msg.callerIdNum,
-          joined = !msg.listenOnly, locked = false, muted = msg.muted, talking = msg.talking, listenOnly = msg.listenOnly)
+          joined = !msg.listenOnly, locked = false, muted = msg.muted, talking = msg.talking, msg.avatarURL, listenOnly = msg.listenOnly)
 
         /**
          * If user is not joined listenOnly then user is joined calling through phone or webrtc.
@@ -446,7 +446,7 @@ trait UsersApp {
           Role.VIEWER, emojiStatus = "none", presenter = false,
           hasStream = false, locked = getInitialLockStatus(Role.VIEWER),
           webcamStreams = new ListSet[String](),
-          phoneUser = !msg.listenOnly, vu, listenOnly = msg.listenOnly, joinedWeb = false)
+          phoneUser = !msg.listenOnly, vu, listenOnly = msg.listenOnly, avatarURL = msg.avatarURL, joinedWeb = false)
 
         usersModel.addUser(uvo)
 
@@ -480,7 +480,7 @@ trait UsersApp {
       case Some(user) => {
         val vu = new VoiceUser(msg.voiceUserId, msg.userId, msg.callerIdName,
           msg.callerIdNum, joined = true, locked = false,
-          msg.muted, msg.talking, msg.listenOnly)
+          msg.muted, msg.talking, msg.avatarURL, msg.listenOnly)
         val nu = user.copy(voiceUser = vu, listenOnly = msg.listenOnly)
         usersModel.addUser(nu)
 
@@ -510,7 +510,7 @@ trait UsersApp {
 
         val vu = new VoiceUser(msg.voiceUserId, msg.userId, msg.callerIdName,
           msg.callerIdNum, joined = true, locked = false,
-          msg.muted, msg.talking, msg.listenOnly)
+          msg.muted, msg.talking, msg.avatarURL, msg.listenOnly)
         val nu = user.copy(voiceUser = vu, listenOnly = msg.listenOnly)
         usersModel.addUser(nu)
 
@@ -550,7 +550,7 @@ trait UsersApp {
        * Reset user's voice status.
        */
       val vu = new VoiceUser(user.userID, user.userID, user.name, user.name,
-        joined = false, locked = false, muted = false, talking = false, listenOnly = false)
+        joined = false, locked = false, muted = false, talking = false, user.avatarURL, listenOnly = false)
       val nu = user.copy(voiceUser = vu, phoneUser = false, listenOnly = false)
       usersModel.addUser(nu)
 
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala
index 1214da64a5449d91d0b84dafcfb8bb3aab2dd344..1c003c65d18eadd762ccbafaa8144aa1864b1b41 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/UsersMessageToJsonConverter.scala
@@ -23,6 +23,7 @@ object UsersMessageToJsonConverter {
     wuser += "webcam_stream" -> user.webcamStreams.toArray
     wuser += "phone_user" -> user.phoneUser
     wuser += "listenOnly" -> user.listenOnly
+    wuser += "avatarURL" -> user.avatarURL
 
     val vuser = new scala.collection.mutable.HashMap[String, Any]
     vuser += "userid" -> user.voiceUser.userId
@@ -46,6 +47,7 @@ object UsersMessageToJsonConverter {
     wuser += "name" -> user.name
     wuser += "role" -> user.role.toString()
     wuser += "authToken" -> user.authToken
+    wuser += "avatarURL" -> user.avatarURL
 
     mapAsJavaMap(wuser)
   }
@@ -429,4 +431,4 @@ object UsersMessageToJsonConverter {
     val header = Util.buildHeader(MessageNames.USER_LISTEN_ONLY, None)
     Util.buildJson(header, payload)
   }
-}
\ No newline at end of file
+}
diff --git a/akka-bbb-fsesl/build.sbt b/akka-bbb-fsesl/build.sbt
index 762dd4bee3bcd2bb880cb409d6103d160504cfaa..a3cfcc18b19a329f588dc44d0e97a47faa079b2f 100755
--- a/akka-bbb-fsesl/build.sbt
+++ b/akka-bbb-fsesl/build.sbt
@@ -50,7 +50,7 @@ libraryDependencies ++= {
 	  "com.google.code.gson"      %  "gson"              % "1.7.1",
 	  "redis.clients"             %  "jedis"             % "2.1.0",
       "org.apache.commons"        %  "commons-lang3"     % "3.2",
-      "org.bigbluebutton"         %  "bbb-common-message" % "0.0.16",
+      "org.bigbluebutton"         %  "bbb-common-message" % "0.0.17",
       "org.bigbluebutton"         %  "bbb-fsesl-client"   % "0.0.3"
 	)}
 
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/FreeswitchConferenceEventListener.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/FreeswitchConferenceEventListener.java
index 69326c4956ad119fde6f2722e3a3d18f99227c63..2037ed8634e8fd6ae5229ed538ab4c7011ed7ea0 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/FreeswitchConferenceEventListener.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/FreeswitchConferenceEventListener.java
@@ -61,7 +61,7 @@ public class FreeswitchConferenceEventListener implements ConferenceEventListene
 				System.out.println("************** FreeswitchConferenceEventListener received voiceUserJoined ");
 				VoiceUserJoinedEvent evt = (VoiceUserJoinedEvent) event;
 				vcs.userJoinedVoiceConf(evt.getRoom(), evt.getVoiceUserId(), evt.getUserId(), evt.getCallerIdName(), 
-						evt.getCallerIdNum(), evt.getMuted(), evt.getSpeaking());
+						evt.getCallerIdNum(), evt.getMuted(), evt.getSpeaking(), evt.getAvatarURL());
 				} else if (event instanceof VoiceUserLeftEvent) {
 					System.out.println("************** FreeswitchConferenceEventListener received VoiceUserLeftEvent ");
 					VoiceUserLeftEvent evt = (VoiceUserLeftEvent) event;
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/IVoiceConferenceService.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/IVoiceConferenceService.java
index 6bf57784fff2cb0074cfdae2f15540bb1af7e1ea..a919ef95a1cab1e48b98e68b05c718acd0eab749 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/IVoiceConferenceService.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/IVoiceConferenceService.java
@@ -3,7 +3,7 @@ package org.bigbluebutton.freeswitch.voice;
 public interface IVoiceConferenceService {
 	void voiceConfRecordingStarted(String voiceConfId, String recordStream, Boolean recording, String timestamp);	
 	void userJoinedVoiceConf(String voiceConfId, String voiceUserId, String userId, String callerIdName, 
-			String callerIdNum, Boolean muted, Boolean speaking);
+			String callerIdNum, Boolean muted, Boolean speaking, String avatarURL);
 	void userLeftVoiceConf(String voiceConfId, String voiceUserId);
 	void userLockedInVoiceConf(String voiceConfId, String voiceUserId, Boolean locked);
 	void userMutedInVoiceConf(String voiceConfId, String voiceUserId, Boolean muted);
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/events/VoiceUserJoinedEvent.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/events/VoiceUserJoinedEvent.java
index 29dd0c86619345c7596076e5e9793c78b714a2f0..7ac8f398e7d277346d6d7c0f1e6b18b814c5723c 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/events/VoiceUserJoinedEvent.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/events/VoiceUserJoinedEvent.java
@@ -27,10 +27,11 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
 	private final Boolean speaking;
 	private final Boolean locked = false;
 	private final String userId;
+	private final String avatarURL;
 	
 	public VoiceUserJoinedEvent(String userId, String voiceUserId, String room, 
 								String callerIdNum, String callerIdName,
-								Boolean muted, Boolean speaking) {
+								Boolean muted, Boolean speaking, String avatarURL) {
 		super(room);
 		this.userId = userId;
 		this.voiceUserId = voiceUserId;
@@ -38,6 +39,7 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
 		this.callerIdNum = callerIdNum;
 		this.muted = muted;
 		this.speaking = speaking;
+		this.avatarURL = avatarURL;
 	}
 
 	public String getUserId() {
@@ -67,4 +69,8 @@ public class VoiceUserJoinedEvent extends VoiceConferenceEvent {
 	public Boolean isLocked() {
 		return locked;
 	}
+
+	public String getAvatarURL() {
+		return avatarURL;
+	}
 }
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ESLEventListener.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ESLEventListener.java
index 7e6c2b4a3432f8228b8714121cfd66b64c50a0bf..977dd5964dbfd8b402d025aaa55150e5b378e9a6 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ESLEventListener.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/ESLEventListener.java
@@ -74,7 +74,7 @@ public class ESLEventListener implements IEslEventListener {
 			    callerIdName = matcher.group(2).trim();
 		    } 
         
-        VoiceUserJoinedEvent pj = new VoiceUserJoinedEvent(voiceUserId, memberId.toString(), confName, callerId, callerIdName, muted, speaking);
+        VoiceUserJoinedEvent pj = new VoiceUserJoinedEvent(voiceUserId, memberId.toString(), confName, callerId, callerIdName, muted, speaking, null);
         conferenceEventListener.handleConferenceEvent(pj);
     }
 
diff --git a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/GetAllUsersCommand.java b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/GetAllUsersCommand.java
index 00482e01f1547c7e58d0333e24d1cdd229e11458..f4f1aab7a0452623823aeb13314734c5812c520c 100755
--- a/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/GetAllUsersCommand.java
+++ b/akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/voice/freeswitch/actions/GetAllUsersCommand.java
@@ -99,7 +99,7 @@ public class GetAllUsersCommand extends FreeswitchCommand {
         		} 
         		
                 pj = new VoiceUserJoinedEvent(voiceUserId, member.getId().toString(), confXML.getConferenceRoom(),
-                		callerId, callerIdName, member.getMuted(), member.getSpeaking());
+                		callerId, callerIdName, member.getMuted(), member.getSpeaking(), null);
                 eventListener.handleConferenceEvent(pj);
             }
 
diff --git a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/freeswitch/VoiceConferenceService.scala b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/freeswitch/VoiceConferenceService.scala
index f7a44b71593455ac074375eef5240dfd7966fbcf..e90b5eb6ef779e0e8294a79f507ef3ea0caf6928 100755
--- a/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/freeswitch/VoiceConferenceService.scala
+++ b/akka-bbb-fsesl/src/main/scala/org/bigbluebutton/freeswitch/VoiceConferenceService.scala
@@ -14,9 +14,9 @@ class VoiceConferenceService(sender: RedisPublisher) extends IVoiceConferenceSer
   }
 
   def userJoinedVoiceConf(voiceConfId: String, voiceUserId: String, userId: String, callerIdName: String,
-    callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean) {
+    callerIdNum: String, muted: java.lang.Boolean, talking: java.lang.Boolean, avatarURL: String) {
     //    println("******** FreeswitchConferenceService received voiceUserJoined vui=[" + userId + "] wui=[" + webUserId + "]")
-    val msg = new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking)
+    val msg = new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking, avatarURL)
     sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
   }
 
@@ -41,4 +41,4 @@ class VoiceConferenceService(sender: RedisPublisher) extends IVoiceConferenceSer
     val msg = new UserTalkingInVoiceConfMessage(voiceConfId, voiceUserId, talking)
     sender.publish(FROM_VOICE_CONF_SYSTEM_CHAN, msg.toJson())
   }
-}
\ No newline at end of file
+}
diff --git a/bbb-common-message/build.sbt b/bbb-common-message/build.sbt
index 27cdbc62e0e1499d1ac4838e327fc03ca55bed0d..4fdd12e8bafeeeee4eddddeffbdaaeba5eca70b8 100755
--- a/bbb-common-message/build.sbt
+++ b/bbb-common-message/build.sbt
@@ -4,7 +4,7 @@ name := "bbb-common-message"
 
 organization := "org.bigbluebutton"
 
-version := "0.0.16"
+version := "0.0.17"
 
 // We want to have our jar files in lib_managed dir.
 // This way we'll have the right path when we import
@@ -48,19 +48,19 @@ autoScalaLibrary := false
 * publish to the local maven repo using "sbt publish"
 */
 // Uncomment this to publish to local maven repo while commenting out the nexus repo
-//publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))
+publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))
 
 
 // Comment this out when publishing to local maven repo using SNAPSHOT version.
 // To push to sonatype "sbt publishSigned"
 
-publishTo := {
-  val nexus = "https://oss.sonatype.org/"
-  if (isSnapshot.value)
-    Some("snapshots" at nexus + "content/repositories/snapshots")
-  else
-    Some("releases"  at nexus + "service/local/staging/deploy/maven2")
-}
+// publishTo := {
+//   val nexus = "https://oss.sonatype.org/"
+//   if (isSnapshot.value)
+//     Some("snapshots" at nexus + "content/repositories/snapshots")
+//   else
+//     Some("releases"  at nexus + "service/local/staging/deploy/maven2")
+// }
 
 
 // Enables publishing to maven repo
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
index d1f91c90b1971737625268a0bef7c6f831524d31..830c68309a2876bedf298fa0a5231afccb802a2b 100755
--- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Constants.java
@@ -125,4 +125,5 @@ public class Constants {
   public static final String PERM_LOCK_ON_JOIN               = "lockOnJoin";
   public static final String PERM_LOCK_ON_JOIN_CONFIG        = "lockOnJoinConfigurable";
   public static final String ENABLED                         = "enabled";
+  public static final String AVATAR_URL                      = "avatarURL";
 }
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
index 5e74558fab28205e7ffa736f7ba03f54b3d34226..74052848809f93034fff9efb0b66f36042581264 100755
--- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/RegisterUserMessage.java
@@ -14,14 +14,16 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
 	public final String role;
 	public final String externUserID;
 	public final String authToken;
+	public final String avatarURL;
 
-	public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
+	public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL) {
 		this.meetingID = meetingID;
 		this.internalUserId = internalUserId;
 		this.fullname = fullname;
 		this.role = role;
 		this.externUserID = externUserID;
 		this.authToken = authToken;
+		this.avatarURL = avatarURL;
 	}
 
 	public String toJson() {
@@ -33,6 +35,7 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
 		payload.put(Constants.ROLE, role);
 		payload.put(Constants.EXT_USER_ID, externUserID);
 		payload.put(Constants.AUTH_TOKEN, authToken);
+		payload.put(Constants.AVATAR_URL, avatarURL);
 
 		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(REGISTER_USER, VERSION, null);
 
@@ -60,9 +63,10 @@ public class RegisterUserMessage implements IBigBlueButtonMessage {
 						String role = payload.get(Constants.ROLE).getAsString();
 						String externUserID = payload.get(Constants.EXT_USER_ID).getAsString();
 						String authToken = payload.get(Constants.AUTH_TOKEN).getAsString();
+						String avatarURL = payload.get(Constants.AVATAR_URL).getAsString();
 
 						//use externalUserId twice - once for external, once for internal
-						return new RegisterUserMessage(meetingID, externUserID, fullname, role, externUserID, authToken);
+						return new RegisterUserMessage(meetingID, externUserID, fullname, role, externUserID, authToken, avatarURL);
 					}
 				}
 			}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
index cf8319dab09712bc44ed0b866aa8321108f8618c..b09101e98c4f9b9bf58331a8e3184c5340cd659e 100755
--- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/UserJoinedVoiceConfMessage.java
@@ -16,6 +16,7 @@ public class UserJoinedVoiceConfMessage {
 	public static final String CALLER_ID_NUM = "caller_id_num";
 	public static final String MUTED = "muted";
 	public static final String TALKING = "talking";
+	public static final String AVATAR_URL = "avatarURL";
 	
 	public final String voiceConfId;
 	public final String voiceUserId;
@@ -24,9 +25,10 @@ public class UserJoinedVoiceConfMessage {
 	public final String callerIdNum;
 	public final Boolean muted;
 	public final Boolean talking;
+	public final String avatarURL;
 	
 	public UserJoinedVoiceConfMessage(String voiceConfId, String voiceUserId, String userId,
-			String callerIdName, String callerIdNum, Boolean muted, Boolean talking) {
+			String callerIdName, String callerIdNum, Boolean muted, Boolean talking, String avatarURL) {
 		this.voiceConfId = voiceConfId;
 		this.voiceUserId = voiceUserId;
 		this.userId = userId;
@@ -34,6 +36,7 @@ public class UserJoinedVoiceConfMessage {
 		this.callerIdNum = callerIdNum;
 		this.muted = muted;
 		this.talking = talking;
+		this.avatarURL = avatarURL;
 	}
 	
 	public String toJson() {
@@ -45,6 +48,7 @@ public class UserJoinedVoiceConfMessage {
 		payload.put(CALLER_ID_NUM, callerIdNum);
 		payload.put(MUTED, muted);
 		payload.put(TALKING, talking);
+		payload.put(AVATAR_URL, avatarURL);
 		
 		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(USER_JOINED_VOICE_CONF, VERSION, null);
 
@@ -76,7 +80,8 @@ public class UserJoinedVoiceConfMessage {
 						String callerIdNum = payload.get(CALLER_ID_NUM).getAsString();
 						Boolean muted = payload.get(MUTED).getAsBoolean();
 						Boolean talking = payload.get(TALKING).getAsBoolean();
-						return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking);					
+						String avatarURL = payload.get(AVATAR_URL).getAsString();
+						return new UserJoinedVoiceConfMessage(voiceConfId, voiceUserId, userId, callerIdName, callerIdNum, muted, talking, avatarURL);
 					}
 				} 
 			}
diff --git a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
index 6e79a3a7cce415222900f1c86fa6734325aca0ea..2813c724baebc1bf7564243de1a4aba1dc807cac 100755
--- a/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
+++ b/bbb-common-message/src/main/java/org/bigbluebutton/common/messages/Util.java
@@ -88,6 +88,7 @@ public class Util {
 			Boolean locked = user.get(Constants.LOCKED).getAsBoolean();
 			String extUserId = user.get(Constants.EXTERN_USERID).getAsString();
 			String role = user.get(Constants.ROLE).getAsString();
+			String avatarURL = user.get(Constants.AVATAR_URL).getAsString();
 			
 			JsonArray webcamStreamJArray = user.get(Constants.WEBCAM_STREAM).getAsJsonArray();
 			ArrayList<String> webcamStreams = extractWebcamStreams(webcamStreamJArray);
@@ -103,6 +104,7 @@ public class Util {
 			userMap.put("locked", locked);
 			userMap.put("role", role);
 			userMap.put("presenter", presenter);
+			userMap.put("avatarURL", avatarURL);
 			
 			JsonObject vu = (JsonObject) user.get(Constants.VOICEUSER);
 			
@@ -672,4 +674,4 @@ public class Util {
 	}
 	
 	
-}
\ No newline at end of file
+}
diff --git a/bigbluebutton-apps/build.gradle b/bigbluebutton-apps/build.gradle
index b5aa734bd78a62a65d3c4ce1eb7babf03af1d9dc..b603d56b6ada5210621acc0f92dae3b15905fcb6 100755
--- a/bigbluebutton-apps/build.gradle
+++ b/bigbluebutton-apps/build.gradle
@@ -104,7 +104,7 @@ dependencies {
    compile 'com.google.code.gson:gson:1.7.1'
    providedCompile 'org.apache.commons:commons-lang3:3.2'
 
-  compile 'org.bigbluebutton:bbb-common-message:0.0.16'
+  compile 'org.bigbluebutton:bbb-common-message:0.0.17'
 }
 
 test {
diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java
index 9c1d33831d7531a2bd59b005d0143d6d2effd8f1..e7e0d4ec63185b91ea5295392d04e6e7cf4b7d2b 100755
--- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java
+++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/pubsub/redis/RedisPubSubMessageHandler.java
@@ -9,8 +9,11 @@ import org.bigbluebutton.red5.client.ChatClientMessageSender;
 import org.bigbluebutton.red5.client.WhiteboardClientMessageSender;
 import org.bigbluebutton.red5.client.messaging.ConnectionInvokerService;
 import org.bigbluebutton.red5.monitoring.BbbAppsIsKeepAliveHandler;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
 
 public class RedisPubSubMessageHandler implements MessageHandler {
+  private static Logger log = Red5LoggerFactory.getLogger(RedisPubSubMessageHandler.class, "bigbluebutton");
 
 	private ConnectionInvokerService service;
 	private UserClientMessageSender userMessageSender;
@@ -44,6 +47,7 @@ public class RedisPubSubMessageHandler implements MessageHandler {
 		} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_MEETING_CHANNEL)) {
 			meetingMessageSender.handleMeetingMessage(message);
 		} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_USERS_CHANNEL)) {
+			log.info("trace 0 : " + message);
 			userMessageSender.handleUsersMessage(message);
 		} else if (channel.equalsIgnoreCase(MessagingConstants.FROM_WHITEBOARD_CHANNEL)) {
 			whiteboardMessageSender.handleWhiteboardMessage(message);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
index b22c1017315a7e1df15bab306ae4bf69c7413ab0..afedd54b3f05b610a7617d5ad81fe9cdfaa1f910 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
@@ -107,6 +107,10 @@ package org.bigbluebutton.core
     public static function getAvatarURL():String {
       return UserManager.getInstance().getConference().avatarURL;
     }
+
+    public static function getUserAvatarURL(userID:String):String {
+       return UserManager.getInstance().getConference().getUserAvatarURL(userID);
+    }	
 	
 	public static function getVoiceBridge():String {
 		return UserManager.getInstance().getConference().voiceBridge;
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
index 6c120f8058e709ae07879e37c4dc808b70a6eebc..2a3e730cc6d4dd81ddc41c4de6906cc8379f588a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as
@@ -41,6 +41,7 @@ package org.bigbluebutton.main.model
 		 */		
 		public var username:String;
 		
+		public var avatarURL:String;
 		/**
 		 * The role of the local user. Could be MODERATOR or VIEWER 
 		 */		
@@ -98,4 +99,4 @@ package org.bigbluebutton.main.model
     public var authToken:String;
     
 	}
-}
\ No newline at end of file
+}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as
index 626b698e431d06b2936df90c232efc02a8fd758d..0d0f2d047e3890aa372e85b6d001f8e09bcc2c22 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as
@@ -55,6 +55,7 @@ package org.bigbluebutton.main.model.users
 		[Bindable] public var disableMyPrivateChat:Boolean = false;
 		[Bindable] public var disableMyPublicChat:Boolean = false;
     	[Bindable] public var lockedLayout:Boolean = false;
+		[Bindable] public var avatarURL:String="";
     
 		[Bindable]
 		public function get hasStream():Boolean {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
index 4263d715a2bdc090326867c6b922e86a4a71504d..18caedc116dea2e9b02389c35788eda7668236f0 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as
@@ -541,5 +541,20 @@ package org.bigbluebutton.main.model.users {
 			if(myUser != null)
 				myUser.applyLockSettings();
 		}
+
+		public function getUserAvatarURL(userID:String):String { // David, to get specific user avatar url
+                        if(userID != null ){
+                                var p:Object = getUserIndex(userID);
+                                if (p != null) {
+                                        var u:BBBUser = p.participant as BBBUser;
+                                        LOGGER.info("getUserAvatarURL user =" + JSON.stringify(u));
+                                        if(u.avatarURL == null || u.avatarURL == ""){
+                                                return this.avatarURL;
+                                        }
+                                        return u.avatarURL;
+                                }
+                        }
+                        return this.avatarURL;
+               }
 	}
 }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as
index 9d65a3ab671a0eb1750ae5512dbee1731f8b0c3d..b27e0c8aa66fac837de42557067af5f48c6b6f2c 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as
@@ -538,6 +538,7 @@ package org.bigbluebutton.modules.users.services
       user.isLeavingFlag = false;
       user.listenOnly = joinedUser.listenOnly;
       user.userLocked = joinedUser.locked;
+      user.avatarURL = joinedUser.avatarURL;
 	  
 	  LOGGER.info("User joined = " + JSON.stringify(user));
 	  
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml
index dc6f268c79ca2453426c8b60489719bf1ab1ca4c..7c89cf12c30471e3a698cc1f15bc16a2f2163391 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/UserGraphicHolder.mxml
@@ -98,7 +98,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
             public function loadAvatar(options:VideoConfOptions):void {
                 avatar.user = _user;
                 avatar.options = options;
-                avatar.load(UsersUtil.getAvatarURL());
+		avatar.load(UsersUtil.getUserAvatarURL(_user.userID));
 
                 avatarVisibility = true;
                 setUserProperties();
diff --git a/bigbluebutton-web/build.gradle b/bigbluebutton-web/build.gradle
index a5175b6a006104acdabdd91128f07616af47f3ab..377e88eb3e9a68f7c8b0237740c9d32b5f2aa780 100755
--- a/bigbluebutton-web/build.gradle
+++ b/bigbluebutton-web/build.gradle
@@ -52,7 +52,8 @@ dependencies {
 	compile 'commons-httpclient:commons-httpclient:3.1'
 	compile 'com.zaxxer:nuprocess:1.0.4'
 
-	compile 'org.bigbluebutton:bbb-common-message:0.0.13'
+	// compile 'org.bigbluebutton:bbb-common-message:0.0.13'
+	compile 'org.bigbluebutton:bbb-common-message:0.0.17'
 	
   // Logging
   // Commenting out as it results in build failure (ralam - may 11, 2014)
diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy
index ee6201abb5b3be92a29bd87c58a65d5e16ea8e58..e3ba67f6328fe862d6c0d8c125bb5ac3836af3f1 100755
--- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy
+++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy
@@ -419,7 +419,7 @@ class ApiController {
         meetingService.addUserSession(session['user-token'], us);
 
         // Register user into the meeting.
-        meetingService.registerUser(us.meetingID, us.internalUserId, us.fullname, us.role, us.externUserID, us.authToken)
+	meetingService.registerUser(us.meetingID, us.internalUserId, us.fullname, us.role, us.externUserID, us.authToken, us.avatarURL)
 
         log.info("Session user token for " + us.fullname + " [" + session['user-token'] + "]")
         session.setMaxInactiveInterval(SESSION_TIMEOUT);
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java
index 05cd84139fa6eb6da5e8703d7380545088a8b177..5dd7a859ee107e38faf25b0b53e17a7e7c5a2361 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java
@@ -99,9 +99,9 @@ public class MeetingService implements MessageListener {
     }
 
     public void registerUser(String meetingID, String internalUserId,
-            String fullname, String role, String externUserID, String authToken) {
+            String fullname, String role, String externUserID, String authToken, String avatarURL) {
         handle(new RegisterUser(meetingID, internalUserId, fullname, role,
-                externUserID, authToken));
+                externUserID, authToken, avatarURL));
     }
 
     public UserSession getUserSession(String token) {
@@ -295,7 +295,7 @@ public class MeetingService implements MessageListener {
     private void processRegisterUser(RegisterUser message) {
         messagingService.registerUser(message.meetingID,
                 message.internalUserId, message.fullname, message.role,
-                message.externUserID, message.authToken);
+                message.externUserID, message.authToken, message.avatarURL);
     }
 
     public String addSubscription(String meetingId, String event,
@@ -583,7 +583,7 @@ public class MeetingService implements MessageListener {
           }
           
             User user = new User(message.userId, message.externalUserId,
-                    message.name, message.role);
+                    message.name, message.role, message.avatarURL);
             m.userJoined(user);
 
             Map<String, Object> logData = new HashMap<String, Object>();
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/User.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/User.java
index 5ec54946eca4ece105e237767a311f216327a113..3f022263aca21822415688d1d1ac212d77704a90 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/User.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/User.java
@@ -30,16 +30,18 @@ public class User {
 	private String externalUserId;
 	private String fullname;
 	private String role;
+	private String avatarURL;
 	private Map<String,String> status;
 	private Boolean listeningOnly = false;
 	private Boolean voiceJoined = false;
 	private List<String> streams;
 	
-	public User(String internalUserId, String externalUserId, String fullname, String role) {
+	public User(String internalUserId, String externalUserId, String fullname, String role, String avatarURL) {
 		this.internalUserId = internalUserId;
 		this.externalUserId = externalUserId;
 		this.fullname = fullname;
 		this.role = role;
+		this.avatarURL = avatarURL;
 		this.status = new ConcurrentHashMap<String, String>();
 		this.streams = Collections.synchronizedList(new ArrayList<String>());
 	}
@@ -72,6 +74,14 @@ public class User {
 		this.role = role;
 	}
 
+	public String getAvatarUrl() {
+		return avatarURL;
+	}
+
+	public void setAvatarUrl(String avatarURL) {
+		this.avatarURL = avatarURL;
+	}
+
 	public boolean isModerator() {
 		return this.role.equalsIgnoreCase("MODERATOR");
 	}
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/Constants.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/Constants.java
index 3179e5ff3404cf1f79803f16d7b77247d4d9ada8..fed0e687c05c3553bd455e31ac2e8829721d0027 100644
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/Constants.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/Constants.java
@@ -92,4 +92,5 @@ public class Constants {
   public static final String VIEWER_PASS                     = "viewer_pass";
   public static final String CREATE_TIME                     = "create_time";
   public static final String CREATE_DATE                     = "create_date";
+  public static final String AVATAR_URL                      = "avatarURL";
 }
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MeetingMessageHandler.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MeetingMessageHandler.java
index ca0e98202b98b671f8087b88c0160b6af4d9ba93..f1373402a5c906fcc084e7dfff1c62db1346e3e6 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MeetingMessageHandler.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MeetingMessageHandler.java
@@ -98,7 +98,6 @@ public class MeetingMessageHandler implements MessageHandler {
 					
 					if (header.has("name")) {
 						String messageName = header.get("name").getAsString();
-					  
 						if (MessagingConstants.USER_JOINED_EVENT.equalsIgnoreCase(messageName)) {
 							String meetingId = payload.get("meeting_id").getAsString();
 							JsonObject user = (JsonObject) payload.get("user");
@@ -107,9 +106,10 @@ public class MeetingMessageHandler implements MessageHandler {
 							String externuserid = user.get("extern_userid").getAsString();
 							String username = user.get("name").getAsString();
 							String role = user.get("role").getAsString();
+							String avatarURL = user.get("avatarURL").getAsString();
 							
 							for (MessageListener listener : listeners) {
-								listener.handle(new UserJoined(meetingId, userid, externuserid, username, role));
+								listener.handle(new UserJoined(meetingId, userid, externuserid, username, role, avatarURL));
 							}
 						} else if(MessagingConstants.USER_STATUS_CHANGE_EVENT.equalsIgnoreCase(messageName)) {
 						  String meetingId = payload.get("meeting_id").getAsString();
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageSender.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageSender.java
index 9f73c3490b4bd84a0140b7a6bca0c632c45f88ab..5f3b830f6f46515963a199bfa4756ea1a21814d6 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageSender.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageSender.java
@@ -79,6 +79,8 @@ public class MessageSender {
 		  public void run() {
 				Jedis jedis = redisPool.getResource();
 				try {
+					if(channel.equalsIgnoreCase("bigbluebutton:from-bbb-apps:users") || channel.equalsIgnoreCase("bigbluebutton:from-bbb-apps:meeting"))
+						log.info("web-Publishing..." + channel + ":" + message);
 					jedis.publish(channel, message);
 				} catch(Exception e){
 					log.warn("Cannot publish the message to pubsub", e);
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageToJson.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageToJson.java
index 372950a73e1b6dd40ee3c654b1e8c6d9371e2ba0..98649191b5de42c2eff49fd58c3ff82391e57d09 100644
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageToJson.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessageToJson.java
@@ -18,6 +18,7 @@ public class MessageToJson {
 		payload.put(Constants.ROLE, message.role);
 		payload.put(Constants.EXT_USER_ID, message.externUserID);
 		payload.put(Constants.AUTH_TOKEN, message.authToken);
+		payload.put(Constants.AVATAR_URL, message.avatarURL);
 		
 		java.util.HashMap<String, Object> header = MessageBuilder.buildHeader(RegisterUserMessage.REGISTER_USER, message.VERSION, null);
 
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessagingService.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessagingService.java
index 470c9352a497d222716345719c041d16cd03e307..7bc92d091af6aaefa1250ad47386e5ddaf6c31d2 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessagingService.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/MessagingService.java
@@ -35,6 +35,6 @@ public interface MessagingService {
 	String storeSubscription(String meetingId, String externalMeetingID, String callbackURL);
 	boolean removeSubscription(String meetingId, String subscriptionId);
 	List<Map<String,String>> listSubscriptions(String meetingId);
-	void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken);
+	void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL);
 	void sendKeepAlive(String system, Long timestamp);
 }
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/RedisMessagingService.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/RedisMessagingService.java
index b22a31c46f50b1f80127463d5df8305abb5628b3..44aa48e33c4d9db13dbdab117e800cb678b18e18 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/RedisMessagingService.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/RedisMessagingService.java
@@ -68,8 +68,8 @@ public class RedisMessagingService implements MessagingService {
 		sender.send(MessagingConstants.TO_MEETING_CHANNEL, json);	
 	}
 	
-	public void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
-		RegisterUserMessage msg = new RegisterUserMessage(meetingID, internalUserId, fullname, role, externUserID, authToken);
+	public void registerUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL) {
+		RegisterUserMessage msg = new RegisterUserMessage(meetingID, internalUserId, fullname, role, externUserID, authToken, avatarURL);
 		String json = MessageToJson.registerUserToJson(msg);
 		log.info("Sending register user message to bbb-apps:[{}]", json);
 		sender.send(MessagingConstants.TO_MEETING_CHANNEL, json);		
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/converters/messages/RegisterUserMessage.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/converters/messages/RegisterUserMessage.java
index d9593dc34400c5c23d377566f07422ff057f652a..c1bfa9c085d3f76e7854bb90a8561a92f267158a 100644
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/converters/messages/RegisterUserMessage.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/converters/messages/RegisterUserMessage.java
@@ -10,13 +10,15 @@ public class RegisterUserMessage {
 	public final String role;
 	public final String externUserID;
 	public final String authToken;
+	public final String avatarURL;
 	
-	public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
+	public RegisterUserMessage(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL) {
 		this.meetingID = meetingID;
 		this.internalUserId = internalUserId;
 		this.fullname = fullname;
 		this.role = role;
 		this.externUserID = externUserID;	
 		this.authToken = authToken;
+		this.avatarURL = avatarURL;
 	}
 }
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java
index 9a9d3f48e7cdb9e0540ec833be525624b72846da..3c3451297cbb4e709d32ec3ad35f05ad155669fb 100644
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/RegisterUser.java
@@ -8,13 +8,15 @@ public class RegisterUser implements IMessage {
 	public final String role;
 	public final String externUserID;
 	public final String authToken;
+	public final String avatarURL;
 	
-	public RegisterUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken) {
+	public RegisterUser(String meetingID, String internalUserId, String fullname, String role, String externUserID, String authToken, String avatarURL) {
 		this.meetingID = meetingID;
 		this.internalUserId = internalUserId;
 		this.fullname = fullname;
 		this.role = role;
 		this.externUserID = externUserID;
 		this.authToken = authToken;		
+		this.avatarURL = avatarURL;		
 	}
 }
diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/UserJoined.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/UserJoined.java
index 1e415f1af2d8d8caff6eea2c177412bb44608bd2..cad1acb397fa0aba229edc39161f97112024977d 100755
--- a/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/UserJoined.java
+++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/messaging/messages/UserJoined.java
@@ -6,12 +6,14 @@ public class UserJoined implements IMessage {
   public final String externalUserId;
   public final String name;
   public final String role;
+  public final String avatarURL;
   
-  public UserJoined(String meetingId, String userId, String externalUserId, String name, String role) {
+  public UserJoined(String meetingId, String userId, String externalUserId, String name, String role, String avatarURL) {
   	this.meetingId = meetingId;
   	this.userId = userId;
   	this.externalUserId = externalUserId;
   	this.name = name;
   	this.role = role;
+  	this.avatarURL = avatarURL;
   }
 }
diff --git a/bigbluebutton-web/test/unit/org/bigbluebutton/api/messaging/NullMessagingService.java b/bigbluebutton-web/test/unit/org/bigbluebutton/api/messaging/NullMessagingService.java
index 9ff91f6c1dd62b4ca091e4dac15b3b1152f8b054..23ad693a62dd68a7890c9b89caa5f7abeeb9de9b 100644
--- a/bigbluebutton-web/test/unit/org/bigbluebutton/api/messaging/NullMessagingService.java
+++ b/bigbluebutton-web/test/unit/org/bigbluebutton/api/messaging/NullMessagingService.java
@@ -85,7 +85,7 @@ public class NullMessagingService implements MessagingService {
 
 	@Override
   public void registerUser(String meetingID, String internalUserId,
-      String fullname, String role, String externUserID, String authToken) {
+      String fullname, String role, String externUserID, String authToken, String avatarURL) {
 	  // TODO Auto-generated method stub
 	  
   }