diff --git a/CustomModels/usermodel.h b/CustomModels/usermodel.h
index 4b222980036130b317e11f3ca5f8c3e91cd2663b..0c0da919ad029d726bd09dc6ef0cc8f121cb8249 100644
--- a/CustomModels/usermodel.h
+++ b/CustomModels/usermodel.h
@@ -31,6 +31,9 @@
 #include <QList>
 
 #include "repos/entities/rocketchatuser.h"
+
+typedef QSharedPointer<RocketChatUser> User;
+
 class UserModel: public QAbstractListModel
 {
         Q_OBJECT
@@ -40,11 +43,13 @@ class UserModel: public QAbstractListModel
             UserId,
             name
         };
+    public slots:
+        bool insertUser( const QString &, const QSharedPointer<RocketChatUser> & );
+
     public:
         UserModel( QObject *parent = 0 );
         int rowCount( const QModelIndex &parent = QModelIndex() ) const;
         QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const;
-        bool insertUser( const QString &, const QSharedPointer<RocketChatUser> & );
         QString getCurrent() const;
         void setCurrent( const QString &value );
         void onCurrentChannelChanged( const QString &newText );
diff --git a/repos/entities/rocketchatmessage.cpp b/repos/entities/rocketchatmessage.cpp
index a7915bd437e9bd7040acefe4bf1a5eac435f0927..4cd0e50c5c93058791e6f3cca64100686c6cb65a 100755
--- a/repos/entities/rocketchatmessage.cpp
+++ b/repos/entities/rocketchatmessage.cpp
@@ -180,7 +180,7 @@ QString RocketChatMessage::getAuthorId() const
     return authorId;
 }
 
-void RocketChatMessage::setAuthorId(const QString &value)
+void RocketChatMessage::setAuthorId( const QString &value )
 {
     authorId = value;
 }
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index 13d5b6650f569ca6b9cfe4e0d5cb9fabac90f3aa..950bf168a7ee0e713d192937bb76d3c9071a822b 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -27,6 +27,9 @@ RocketChatServerData::RocketChatServerData( const QString &pId, QString pBaseUrl
         QString pApiUri ): mBaseUrl( pBaseUrl ), mApiUri( pApiUri ), mServerId( pId ), userModel( Models::getUsersModel() ), loginMethodsModel( Models::getLoginMethodsModel() ), channelsModel( Models::getPublicGroupsModel() ),
     directModel( Models::getDirectChannelsModel() ), groupsModel( Models::getPublicGroupsModel() )
 {
+    qRegisterMetaType<User>( "User" );
+
+
     mStorage = PersistanceLayer::instance();
     mEmojiRepo = new EmojiRepo;
     historyLoaded = [ = ]( QMultiMap<QString, QSharedPointer<RocketChatMessage>> *messages ) {
@@ -485,7 +488,7 @@ void RocketChatServerData::onUsersLoaded( const QString &pChannelId, const QVect
             for ( const auto &user : pUserList ) {
                 if ( !user.isNull() ) {
                     channel->addUser( user );
-                    userModel->insertUser( pChannelId, user );
+                    QMetaObject::invokeMethod( userModel, "insertUser", Q_ARG( QString, pChannelId ), Q_ARG( User, user ) );
                 }
             }
         }
@@ -941,10 +944,19 @@ void RocketChatServerData::handleChannelMessage( const QJsonObject &pMessage )
                 QJsonObject data = args[1].toObject();
                 int unread = data[QStringLiteral( "unread" )].toInt();
                 QString rid = data[QStringLiteral( "rid" )].toString();
+                QString type = data[QStringLiteral( "t" )].toString();
                 bool blocked = false;
                 QString name = data[QStringLiteral( "name" )].toString();
+                QString username = "";
+
+                if ( type == "d" ) {
+                    username = name;
+                    name = data[QStringLiteral( "fname" )].toString();
+                }
+
                 bool hidden = false;
 
+
                 if ( data.contains( QStringLiteral( "open" ) ) ) {
                     hidden = !data[QStringLiteral( "open" )].toBool();
                 }
@@ -972,9 +984,10 @@ void RocketChatServerData::handleChannelMessage( const QJsonObject &pMessage )
                         channel->setName( name );
                         channel->setBlocked( blocked );
                         channel->setUnreadMessages( unread );
+                        channel->setUsername( username );
 
                     } else {
-                        QSharedPointer<RocketChatChannel> channel  = mChannelService->createChannelObject( rid, name, data["t"].toString() );
+                        QSharedPointer<RocketChatChannel> channel  = mChannelService->createChannelObject( rid, name, data["t"].toString(), username );
                         channel->setBlocked( blocked );
                         channel->setUnreadMessages( unread );
                         mChannels->add( rid, channel );
@@ -1252,8 +1265,13 @@ void RocketChatServerData::handleStreamRoomMessage( const QJsonObject &pMessage
                     auto message = mMessageService->parseMessage( currentArgObj, true );
 
                     if ( Q_LIKELY( mChannels->contains( roomId ) ) ) {
+                        auto channel = mChannels->get( roomId );
                         mChannels->get( roomId )->addMessage( message );
                         mMessageService->persistMessage( message );
+
+                        if ( message->getMessageType() == "au" ) {
+                            mChannelService->loadUsersOfChannel( channel );
+                        }
                     }
                 }
             }
@@ -1278,12 +1296,10 @@ void RocketChatServerData::handleUserJoinMessage( const QJsonObject &pMessage )
                     QSharedPointer<RocketChatChannel> channel = mChannels->get( roomId );
 
                     if ( !channel.isNull() ) {
-                        QSharedPointer<RocketChatUser> ptr( new RocketChatUser( username ) );
-                        ptr->setUserId( userId );
-
-                        if ( Q_LIKELY( channel->addUser( ptr ) ) ) {
-                            emit userJoined( roomId, username );
-                        }
+                        /*   QSharedPointer<RocketChatUser> ptr( new RocketChatUser( username ) );
+                           ptr->setUserId( userId );
+                        */
+                        mChannelService->loadUsersOfChannel( channel );
                     }
                 }
             }
@@ -1935,7 +1951,7 @@ void RocketChatServerData::createPrivateGroup( const QString &pChannelName, cons
     mDdpApi->sendRequest( request );
 }
 
-void RocketChatServerData::addUsersToChannel( const QString &pChannelName, const QStringList &pUsers )
+void RocketChatServerData::addUsersToChannel( const QString &pChannelId, const QStringList &pUsers )
 {
     for ( const auto &user : pUsers ) {
         DdpCallback success = [ = ]( QJsonObject response, MeteorDDP * ddpApi ) {
@@ -1946,7 +1962,8 @@ void RocketChatServerData::addUsersToChannel( const QString &pChannelName, const
 
         if ( Q_LIKELY( !user.isEmpty() ) ) {
             QStringList usernames( user );
-            QSharedPointer<RocketChatAddUsersToChannel > request( new RocketChatAddUsersToChannel( pChannelName, usernames ) );
+            QSharedPointer<RocketChatAddUsersToChannel > request( new RocketChatAddUsersToChannel( pChannelId, usernames ) );
+            request->setSuccess( success );
             mDdpApi->sendRequest( request );
         }
     }
diff --git a/rocketchatserver.h b/rocketchatserver.h
index fec4ea2ad680506294df49c05aba55897777305a..e7a6359f56d0070b39b4b9294690ceb6440d44d9 100755
--- a/rocketchatserver.h
+++ b/rocketchatserver.h
@@ -126,7 +126,7 @@ class RocketChatServerData : public QObject
 
         void createChannel( const QString &pChannelName, const QStringList &pUsers, bool pReadonly );
         void createPrivateGroup( const QString &pChannelName, const QStringList &pUsers, bool pReadonly );
-        void addUsersToChannel( const QString &pChannelName, const QStringList &pUsers );
+        void addUsersToChannel( const QString &pChannelId, const QStringList &pUsers );
         void sendMessage( const QString &pMessage, const QString &pChannelId );
 
         void uploadFile( const QString &pChannelId, const QString &pFile );
@@ -327,7 +327,6 @@ class RocketChatServerData : public QObject
         void onHashLoggedIn( const QString &pServer );
         void privateChannelCreated( const QString &pServerId, const QString &pRid, const QString &pUsername );
         void loginError( void );
-        void userJoined( const QString &pChannelId, const QString &pUsername );
         void loggedOut( const QString &pServerId );
         void suggestionsReady( QVariantMap );
         void fileUploadFinished( const QString &pData );