diff --git a/CustomModels/emojismodel.cpp b/CustomModels/emojismodel.cpp
index 520afdda884b233075bad04977fd018d62b9f5a9..2b246fac9eb582a21ee01211cd7dc6180b8d5285 100644
--- a/CustomModels/emojismodel.cpp
+++ b/CustomModels/emojismodel.cpp
@@ -1,4 +1,5 @@
 #include "emojismodel.h"
+#include <QDebug>
 
 EmojisModel::EmojisModel()
 {
@@ -91,6 +92,10 @@ void EmojisModel::addEmoji( const QSharedPointer<Emoji> &pEmoji )
 
 void EmojisModel::addEmojisByCategory( const QString &pCategory, const QList<QSharedPointer<Emoji> > &pList )
 {
+    static int counter = 0;
+    qDebug() << "called: " << counter++;
+    qDebug() << "category: " << pCategory;
+
     if ( mCurrentCategory == pCategory ) {
         beginResetModel();
     }
@@ -102,8 +107,8 @@ void EmojisModel::addEmojisByCategory( const QString &pCategory, const QList<QSh
 
     for ( const auto &element : pList ) {
         if ( !mDuplicateCheck.contains( element->getIdentifier() ) ) {
-            mData[pCategory].append( element );
             mDuplicateCheck.insert( element->getIdentifier() );
+            mData[pCategory].append( std::move( element ) );
         }
     }
 
diff --git a/CustomModels/messagemodel.cpp b/CustomModels/messagemodel.cpp
index 36aa0520958f67ea31d580f415923b3b27028d56..dc15ebb6c0b8ba830d68633eb3051dcbf7aa55fb 100644
--- a/CustomModels/messagemodel.cpp
+++ b/CustomModels/messagemodel.cpp
@@ -157,7 +157,7 @@ QString MessagesModel::getCurrent() const
 
 void MessagesModel::setCurrent( const QString &value )
 {
-    QMutexLocker( &this->mutex );
+    //QMutexLocker( &this->mutex );
     current = value;
     beginResetModel();
 
@@ -165,7 +165,7 @@ void MessagesModel::setCurrent( const QString &value )
         messagesOfCurrentChannel = mChannelMap[value]->getMessageRepo()->timestampIndex().values().toVector();
         duplicateCheck.clear();
 
-        for ( auto currentMessage : messagesOfCurrentChannel ) {
+        for ( const auto &currentMessage : messagesOfCurrentChannel ) {
             duplicateCheck.insert( currentMessage->getId() );
         }
     } else {
@@ -262,7 +262,7 @@ QHash<int, QByteArray> MessagesModel::roleNames() const
 
 void MessagesModel::onNewMessage( const QSharedPointer<RocketChatChannel> &channel, qint64 timestamp )
 {
-    QMutexLocker( &this->mutex );
+    //QMutexLocker( &this->mutex );
 
     if ( timestamp == 0 ) {
         setCurrent( current );
diff --git a/CustomModels/usermodel.cpp b/CustomModels/usermodel.cpp
index 56c3e56deef72566d3ab86005d7e1809816fe049..137059d3f314fe93a3e93b513924018f43024c6d 100644
--- a/CustomModels/usermodel.cpp
+++ b/CustomModels/usermodel.cpp
@@ -43,7 +43,7 @@ QVariant UserModel::data( const QModelIndex &index, int role ) const
         return QVariant();
     }
 
-    auto user = userList.at( index.row() );
+    const auto &user = userList.at( index.row() );
 
     auto roleType = static_cast<UserRoles>( role );
 
@@ -151,7 +151,7 @@ void UserModel::setCurrent( const QString &value )
     QList<QSharedPointer<RocketChatUser>> userList = userMap.values( value );
     mMutex.unlock();
 
-    for ( auto current : userList ) {
+    for ( const auto &current : userList ) {
         userOfCurrentChannel.insert( current->getUserId(), current );
     }
 
diff --git a/api/meteorddp.cpp b/api/meteorddp.cpp
index 35f0ff54493204df0ff0aa144a7a15db74f4237a..3aa72349eac3f59b2d37d7d53ee09f5f0191936d 100755
--- a/api/meteorddp.cpp
+++ b/api/meteorddp.cpp
@@ -42,6 +42,7 @@ void MeteorDDP::init( const QString &pUri, bool pUnsecure )
 
     QString protocol = QStringLiteral( "wss://" );
     unsecure = pUnsecure;
+
     if ( pUnsecure ) {
         protocol = QStringLiteral( "ws://" );
     }
@@ -65,14 +66,14 @@ void MeteorDDP::init( const QString &pUri, bool pUnsecure )
     mLastPing = currentTime;
 }
 
-void MeteorDDP::registerMessageHandler(MessageListener &listener)
+void MeteorDDP::registerMessageHandler( MessageListener &listener )
 {
-    connect(this, &MeteorDDP::messageReceived , &listener, &MessageListener::handlesMessage);
+    connect( this, &MeteorDDP::messageReceived, &listener, &MessageListener::handlesMessage );
 }
 
-void MeteorDDP::registerMessageHandler(MessageListener *listener)
+void MeteorDDP::registerMessageHandler( MessageListener *listener )
 {
-    connect(this, &MeteorDDP::messageReceived , listener, &MessageListener::handlesMessage);
+    connect( this, &MeteorDDP::messageReceived, listener, &MessageListener::handlesMessage );
 }
 
 void MeteorDDP::connectWithServer()
@@ -248,8 +249,8 @@ void MeteorDDP::resume()
         if ( mWsClient->isDisconnected() ) {
             mWsClient->open( wsUri );
         } else if ( !mWsClient->isConnecting() ) {
-            QMetaObject::Connection *const connection = new QMetaObject::Connection;
-            *connection = connect( mWsClient, &Websocket::closed, [&]() {
+            auto const connection = new QMetaObject::Connection;
+            *connection = connect( mWsClient, &Websocket::closed, [ = ]() {
                 qDebug() << "websocket closed";
                 mWsClient->open( wsUri );
                 QDateTime now = QDateTime::currentDateTime();
diff --git a/ddpRequests/ddprequest.cpp b/ddpRequests/ddprequest.cpp
index b3c65acf3059c9b7e1eadf297d3830856d87da90..1c3aa474fe3490d633604a308f727b441bf97c0f 100755
--- a/ddpRequests/ddprequest.cpp
+++ b/ddpRequests/ddprequest.cpp
@@ -28,12 +28,12 @@ DDPRequest::DDPRequest( const QJsonObject &pRequest ): mRawRequest( pRequest )
 
 }
 
-DDPRequest::DDPRequest( const QJsonObject &pRequest, const DdpCallback &pSuccess ): mRawRequest( pRequest ), mSuccess( pSuccess )
+DDPRequest::DDPRequest( const QJsonObject &pRequest, DdpCallback pSuccess ): mRawRequest( pRequest ), mSuccess( std::move( pSuccess ) )
 {
 
 }
 
-DDPRequest::DDPRequest( const QJsonObject &pRequest, const DdpCallback &pSuccess, const DdpCallback &error ): mRawRequest( pRequest ), mSuccess( pSuccess ), mError( error )
+DDPRequest::DDPRequest( const QJsonObject &pRequest, DdpCallback pSuccess, DdpCallback error ): mRawRequest( pRequest ), mSuccess( std::move( pSuccess ) ), mError( std::move( error ) )
 {
 
 }
diff --git a/ddpRequests/ddprequest.h b/ddpRequests/ddprequest.h
index 34d3d4057fe99a6faf7cb3d959c6a052dbd3d758..e925b27c8ec3f6d150993cce11324d00a7b41543 100755
--- a/ddpRequests/ddprequest.h
+++ b/ddpRequests/ddprequest.h
@@ -34,8 +34,8 @@ class DDPRequest : public QObject
         Q_OBJECT
     public:
         DDPRequest( const QJsonObject &pRequest );
-        DDPRequest( const QJsonObject &pRequest, const DdpCallback &pSuccess );
-        DDPRequest( const QJsonObject &pRequest, const DdpCallback &pSuccess, const DdpCallback &pError );
+        DDPRequest( const QJsonObject &pRequest, DdpCallback pSuccess );
+        DDPRequest( const QJsonObject &pRequest, DdpCallback pSuccess, DdpCallback pError );
         QJsonObject getRawRequest() const;
         QString getFrame() const;
         void setFrame( const QString &value );
diff --git a/fileuploader.cpp b/fileuploader.cpp
index 8e7e4e56ee36a7fc5b5a5769504a3f617c3028c0..58a53080f2bc72e458e026c148cc10963826a607 100755
--- a/fileuploader.cpp
+++ b/fileuploader.cpp
@@ -111,7 +111,7 @@ void FileUploader::onUfsCreated( const QJsonObject &pResponse )
             qDebug() << "creating partials: " << chunkNum << "of bytes:" << mSize;
 
             if ( mSize == 0 ) {
-                throw new std::logic_error( "Zero byte file!" );
+                throw std::logic_error( "Zero byte file!" );
             }
 
             bool cancel = mCanceled;
diff --git a/notifications/ios/applepushnotifications.h b/notifications/ios/applepushnotifications.h
index a9452a14786317f9d1d6c45dc7cc722acbbbb575..63d2dd6fed96e258b13ebcab83393dad9514712f 100755
--- a/notifications/ios/applepushnotifications.h
+++ b/notifications/ios/applepushnotifications.h
@@ -31,11 +31,11 @@ class ApplePushNotifications: public NotificationAbstract
     public:
         virtual void registerWithService();
         ApplePushNotifications();
-        void receiveMessage( QString server, QString rid, QString name, QString type );
+        void receiveMessage( const QString &server, const QString &rid, const QString &name, const QString &type );
 
         void checkForPendingMessages();
 
-        void onSwitchRequest( QString pName );
+        void onSwitchRequest( const QString &pName );
     protected:
         void receiveToken();
 
diff --git a/persistancelayer.cpp b/persistancelayer.cpp
index 150761ff5f64d37e271448510026f3746bf373ba..10e14cb306343a1f3926649cde3289c60c075656 100755
--- a/persistancelayer.cpp
+++ b/persistancelayer.cpp
@@ -1455,7 +1455,11 @@ void PersistanceLayer::init()
     }
 
     initShema();
-    emit( ready() );
+
+    if ( !mDbReady ) {
+        mDbReady = true;
+        emit( ready() );
+    }
 }
 
 void PersistanceLayer::close()
diff --git a/persistancelayer.h b/persistancelayer.h
index 6e65901454fd229f8e7ba224ec1ca2c80dd5c728..e055c2a7dcca1090c4e50e3d95d522c8eec3260c 100755
--- a/persistancelayer.h
+++ b/persistancelayer.h
@@ -99,6 +99,7 @@ class PersistanceLayer : public QObject
         QMimeDatabase mMimeDb;
         QMutex mMutex;
         QAtomicInt counter = 0;
+        bool mDbReady = false;
         void initShema();
 
         void upgradeSchema();
diff --git a/repos/entities/emoji.cpp b/repos/entities/emoji.cpp
index 2bb9f0e574c724ea4ebacef0f6733ed1a1733448..560f5b4b8e4f2cf0a7a2424d88a69c001a081acc 100644
--- a/repos/entities/emoji.cpp
+++ b/repos/entities/emoji.cpp
@@ -21,7 +21,7 @@
 
 #include "emoji.h"
 
-Emoji::Emoji( const QString &name, const QString &extension, const QString &category ): mCategory( category )
+Emoji::Emoji( QString name, QString extension, QString category ): mCategory( std::move( category ) )
 {
 
     this->mIdentifier = ':' + name + ':';
@@ -30,7 +30,7 @@ Emoji::Emoji( const QString &name, const QString &extension, const QString &cate
     this->mType = QStringLiteral( "emoji" );
 }
 
-Emoji::Emoji( const QString &name, const QString &category, const QString &filePath, const QString &html ): mCategory( category )
+Emoji::Emoji( QString name, QString category, QString filePath, QString html ): mCategory( std::move( category ) )
 {
     this->mIdentifier = name;
     QFileInfo fileInfo( filePath );
@@ -39,7 +39,7 @@ Emoji::Emoji( const QString &name, const QString &category, const QString &fileP
     mExtension = fileInfo.completeSuffix();
 }
 
-Emoji::Emoji( const QString &name, const QString &category, const QString &filePath, const QString &html, const QString &unicode ): mCategory( category ), mUnicodeChar( unicode )
+Emoji::Emoji( QString name, QString category, QString filePath, QString html, QString unicode ): mCategory( std::move( category ) ), mUnicodeChar( std::move( unicode ) )
 {
     this->mIdentifier = name;
     QFileInfo fileInfo( filePath );
@@ -48,7 +48,7 @@ Emoji::Emoji( const QString &name, const QString &category, const QString &fileP
     mExtension = fileInfo.completeSuffix();
 }
 
-Emoji::Emoji( const QString &name, const QString &category, const QString &filePath, const QString &html, const QString &unicode, int order ): mCategory( category ), mUnicodeChar( unicode ), mOrder( order )
+Emoji::Emoji( QString name, QString category, QString filePath, QString html, QString unicode, int order ): mCategory( std::move( category ) ), mUnicodeChar( std::move( unicode ) ), mOrder( order )
 {
     this->mIdentifier = name;
     QFileInfo fileInfo( filePath );
diff --git a/repos/entities/emoji.h b/repos/entities/emoji.h
index 79cd3f19ffe4e25fa39ff958e83da75f51e8221f..1a830a3083dd4410f74f42c04e27c42b73074ab8 100644
--- a/repos/entities/emoji.h
+++ b/repos/entities/emoji.h
@@ -29,10 +29,10 @@
 class Emoji : public TempFile
 {
     public:
-        Emoji( const QString &name, const QString &extension, const QString &category );
-        Emoji( const QString &name, const QString &category, const QString &file, const QString &html );
-        Emoji( const QString &name, const QString &category, const QString &file, const QString &html, const QString &unicode );
-        Emoji( const QString &name, const QString &category, const QString &file, const QString &html, const QString &unicode, int order );
+        Emoji( QString name, QString extension, QString category );
+        Emoji( QString name, QString category, QString file, QString html );
+        Emoji( QString name, QString category, QString file, QString html, QString unicode );
+        Emoji( QString name, QString category, QString file, QString html, QString unicode, int order );
 
         QString getIdentifier() const;
         QVariantMap toQVariantMap();
diff --git a/repos/entities/loginmethod.cpp b/repos/entities/loginmethod.cpp
index 8b603dca9fcd63ec2a6112e63fa113deafe4b4d0..b01f00fa5592578c64686bd7f949714dabc6ad0e 100644
--- a/repos/entities/loginmethod.cpp
+++ b/repos/entities/loginmethod.cpp
@@ -52,7 +52,7 @@ QString LoginMethod::getServerUrl() const
     return mServerUrl;
 }
 
-void LoginMethod::setServerUrl( const QString pServerUrl )
+void LoginMethod::setServerUrl( const QString &pServerUrl )
 {
     mServerUrl = pServerUrl;
 }
@@ -62,7 +62,7 @@ QString LoginMethod::getService() const
     return mService;
 }
 
-void LoginMethod::setService( const QString pService )
+void LoginMethod::setService( const QString &pService )
 {
     mService = pService;
 }
@@ -72,7 +72,7 @@ QString LoginMethod::getClientId() const
     return mClientId;
 }
 
-void LoginMethod::setClientId( const QString pClientId )
+void LoginMethod::setClientId( const QString &pClientId )
 {
     mClientId = pClientId;
 }
@@ -82,7 +82,7 @@ QString LoginMethod::getTokenPath() const
     return mTokenPath;
 }
 
-void LoginMethod::setTokenPath( const QString pTokenPath )
+void LoginMethod::setTokenPath( const QString &pTokenPath )
 {
     mTokenPath = pTokenPath;
 }
@@ -92,7 +92,7 @@ QString LoginMethod::getIdentityPath() const
     return mIdentityPath;
 }
 
-void LoginMethod::setIdentityPath( const QString pIdentityPath )
+void LoginMethod::setIdentityPath( const QString &pIdentityPath )
 {
     mIdentityPath = pIdentityPath;
 }
@@ -102,7 +102,7 @@ QString LoginMethod::getAuthorizePath() const
     return mAuthorizePath;
 }
 
-void LoginMethod::setAuthorizePath( const QString pAuthorizationPath )
+void LoginMethod::setAuthorizePath( const QString &pAuthorizationPath )
 {
     mAuthorizePath = pAuthorizationPath;
 }
diff --git a/repos/entities/loginmethod.h b/repos/entities/loginmethod.h
index 6bb5f239b0485d37153e29c33a86e164b4911842..416b64c383029d139a5360da610597982646e401 100644
--- a/repos/entities/loginmethod.h
+++ b/repos/entities/loginmethod.h
@@ -45,22 +45,22 @@ class LoginMethod
         void setRedirectPath( const QString &pUrl );
 
         QString getServerUrl() const;
-        void setServerUrl( const QString pServerUrl );
+        void setServerUrl( const QString &pServerUrl );
 
         QString getService() const;
-        void setService( const QString pService );
+        void setService( const QString &pService );
 
         QString getClientId() const;
-        void setClientId( const QString pClientId );
+        void setClientId( const QString &pClientId );
 
         QString getTokenPath() const;
-        void setTokenPath( const QString pTokenPath );
+        void setTokenPath( const QString &pTokenPath );
 
         QString getIdentityPath() const;
-        void setIdentityPath( const QString pIdentityPath );
+        void setIdentityPath( const QString &pIdentityPath );
 
         QString getAuthorizePath() const;
-        void setAuthorizePath( const QString pAuthorizationPath );
+        void setAuthorizePath( const QString &pAuthorizationPath );
 
         QString getCredentialToken() const;
         void setCredentialToken( const QString &pCredentialToken );
diff --git a/repos/entities/rocketchatuser.cpp b/repos/entities/rocketchatuser.cpp
index 66a3d4a98052b775cd929368b4a5057b79711280..a90c578aeaa7a70a82f73abb0af1e140562e2ced 100755
--- a/repos/entities/rocketchatuser.cpp
+++ b/repos/entities/rocketchatuser.cpp
@@ -22,7 +22,7 @@
 
 #include "rocketchatuser.h"
 
-RocketChatUser::RocketChatUser( const QString &pId ): mUserId( pId )
+RocketChatUser::RocketChatUser( QString pId ): mUserId( std::move( pId ) )
 {
 
 }
@@ -74,10 +74,10 @@ RocketChatUser::status RocketChatUser::getStatus() const
 
 void RocketChatUser::setStatus( status pStatus )
 {
-    if ( pStatus != mStatus ) {
-        mStatus = pStatus;
-        emit statusChanged();
-    }
+    // if ( pStatus != mStatus ) {
+    mStatus = pStatus;
+    emit statusChanged();
+    //  }
 }
 
 void RocketChatUser::setStatus( const QString &pStatus )
diff --git a/repos/entities/rocketchatuser.h b/repos/entities/rocketchatuser.h
index df7c840cf7d726e5b50409556ffd10cdf5332e00..c7c5ebedd35abc3c1f6d33bc72c368a194ed5a8b 100755
--- a/repos/entities/rocketchatuser.h
+++ b/repos/entities/rocketchatuser.h
@@ -37,7 +37,7 @@ class RocketChatUser : public QObject
             OFFLINE = 2,
             BUSY = 3
         };
-        explicit RocketChatUser( const QString &pId )                                            ;
+        explicit RocketChatUser( QString pId )                                            ;
 
         QString getUserName() const;
         void setUserName( const QString &pValue );
diff --git a/rocketchat.cpp b/rocketchat.cpp
index 31a08fb67dc518ab3c10b818c01120fe0ae0a6c8..5ccfb945c4580dc729f98400150d1b4db11a87c9 100755
--- a/rocketchat.cpp
+++ b/rocketchat.cpp
@@ -561,7 +561,7 @@ void RocketChat::openIosFile( const QString &fileName )
     openShareDialog();
 }
 
-void RocketChat::openUrl( const QString url )
+void RocketChat::openUrl( const QString &url )
 {
     if ( !QDesktopServices::openUrl( url ) ) {
         qDebug() << "Jitsi meet could not be opened";
@@ -619,7 +619,7 @@ void RocketChat::onLoggedIn( const QString &pServerId )
     emit loggedIn( pServerId );
 }
 
-void RocketChat::onChannelSwitchRequest( QSharedPointer<RocketChatChannel> pChannel )
+void RocketChat::onChannelSwitchRequest( const QSharedPointer<RocketChatChannel> &pChannel )
 {
     //TODO: fix
     bool readonly = pChannel->getReadOnly() && pChannel->getOwnerName() != getUsername( "default" );
@@ -664,7 +664,10 @@ void RocketChat::serverReadySlot()
 
     connect( pServer, &RocketChatServerData::loggingIn, this, &RocketChat::loggingIn, Qt::UniqueConnection );
 
-    connect( pServer, &RocketChatServerData::userStatusChanged, this, &RocketChat::userStatusChanged, Qt::UniqueConnection );
+    connect( pServer, &RocketChatServerData::userStatusChanged, [ = ]( int pStatus ) {
+        mUserStatus = pStatus;
+        emit userStatusChanged( pStatus );
+    } );
 
     connect( pServer, &RocketChatServerData::videoPath, this, &RocketChat::videoPath, Qt::UniqueConnection );
 
@@ -727,6 +730,11 @@ void RocketChat::openFileNameReady( const QString &pFile )
     }
 }
 
+int RocketChat::getUserStatus()
+{
+    return mUserStatus;
+}
+
 void RocketChat::onEmojisReady( const QVariantList &pEmojiList )
 {
     mEmojisReady = true;
diff --git a/rocketchat.h b/rocketchat.h
index 5ce07bea9ab7480d83b72a98037677e1acef27dc..812fbb5b2600175e113a032fd7bd24eca800f4f3 100755
--- a/rocketchat.h
+++ b/rocketchat.h
@@ -43,6 +43,8 @@ using namespace std;
 class RocketChat : public QObject
 {
         Q_OBJECT
+        Q_PROPERTY( int userStatus READ getUserStatus NOTIFY userStatusChanged )
+
     public:
         RocketChat( QGuiApplication *mApp );
         ~RocketChat();
@@ -142,10 +144,12 @@ class RocketChat : public QObject
         void openIosFile( const QString &fileName );
 
         void registerForPush();
-        void openUrl( const QString url );
+        void openUrl( const QString &url );
 
         void openFileNameReady( const QString &pFile );
 
+        int getUserStatus();
+
     protected:
         QMutex newServerMutex;
 
@@ -159,6 +163,8 @@ class RocketChat : public QObject
         QInputMethod *mInputMethod = nullptr;
         QHash<QString, uint> mUnreadSum;
 
+        int mUserStatus = 2;
+
 
 
 #ifdef Q_OS_ANDROID
@@ -187,7 +193,7 @@ class RocketChat : public QObject
         void onLogout( const QString &pServerId );
         void onUnreadCountChanged( const QString &pServerId, uint pUnread );
         void onLoggedIn( const QString &pServerId );
-        void onChannelSwitchRequest( QSharedPointer<RocketChatChannel> pChannel );
+        void onChannelSwitchRequest( const QSharedPointer<RocketChatChannel> &pChannel );
 
         void serverReadySlot();
         void storageReadySlot();
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index ac6e4eea70a7820f34a7b7954e6f7adb9deac005..0373ea078f896126ce59f9ab75d42e45416c5b28 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -23,7 +23,7 @@
 
 #include "CustomModels/models.h"
 
-RocketChatServerData::RocketChatServerData( const QString &pId, QString pBaseUrl, bool pUnsecure ): mBaseUrl( pBaseUrl ), mServerId( pId ), userModel( Models::getUsersModel() ), loginMethodsModel( Models::getLoginMethodsModel() ), channelsModel( Models::getPublicGroupsModel() ),
+RocketChatServerData::RocketChatServerData( QString pId, QString pBaseUrl, bool pUnsecure ): mBaseUrl( std::move( pBaseUrl ) ), mServerId( std::move( pId ) ), userModel( Models::getUsersModel() ), loginMethodsModel( Models::getLoginMethodsModel() ), channelsModel( Models::getPublicGroupsModel() ),
     directModel( Models::getDirectChannelsModel() ), groupsModel( Models::getPublicGroupsModel() )
 {
     qRegisterMetaType<User>( "User" );
@@ -38,6 +38,7 @@ RocketChatServerData::RocketChatServerData( const QString &pId, QString pBaseUrl
     }
 
     mApiUri = QStringLiteral( "/api/v1" );
+    mEmojiRepo = new EmojiRepo;
 
     setRestApi( new RestApi( this, protocol + mBaseUrl ) );
 }
@@ -46,7 +47,6 @@ void RocketChatServerData::init()
 {
     mStorage = PersistanceLayer::instance();
     connect( mStorage, &PersistanceLayer::ready, [ = ]() {
-        mEmojiRepo = new EmojiRepo;
         historyLoaded = [ = ]( QMultiMap<QString, QSharedPointer<RocketChatMessage>> *messages ) {
             if ( messages ) {
                 mStorage->transaction();
@@ -69,16 +69,10 @@ void RocketChatServerData::init()
         mFileService = new FileService( this );
         mEmojiService = new EmojiService( this, mFileService, mStorage );
 
-        if ( mUnsecureConnection ) {
-            mDdpApi = new MeteorDDP( this, mBaseUrl, true );
-
-        } else {
-            mDdpApi = new MeteorDDP( this, mBaseUrl );
-        }
+        mDdpApi = new MeteorDDP( this, mBaseUrl, mUnsecureConnection );
 
         mRestApi->moveToThread( QThread::currentThread() );
         mDdpApi->moveToThread( QThread::currentThread() );
-        mUsername = mStorage->getUserName();
 
         mChannels = new ChannelRepository( );
 
@@ -101,13 +95,9 @@ void RocketChatServerData::init()
         setUserId( mStorage->getUserId() );
         mUsername = mStorage->getUserName();
 
-        // mEmojisMap.reserve(3000);
-        mDownloadsInProgress.reserve( 100 );
-
         loadEmojis();
-        //mMessageService = new MessageService( mStorage, this, mEmojisMap );
-        mMessageService = new MessageService( mStorage, this, mEmojiRepo );
 
+        mMessageService = new MessageService( mStorage, this, mEmojiRepo );
         mChannelService = new RocketChatChannelService( this, mMessageService );
         mChannelService->setDdp( mDdpApi );
         mChannelService->setChannels( mChannels );
@@ -130,9 +120,11 @@ void RocketChatServerData::init()
                 loginWithToken( userDb, tokenDb.first );
             } else {
                 mStorage->wipeDb();
+                emit loggedOut( mServerId );
             }
         } else if ( !lastServer.isEmpty() ) {
             mStorage->wipeDb();
+            emit loggedOut( mServerId );
         }
 
         emit readyToCheckForPendingNotification();
@@ -147,7 +139,6 @@ void RocketChatServerData::setRestApi( RestApi *pNewRestApi )
 {
 
     connect( pNewRestApi, &RestApi::loggedIn, this, &RocketChatServerData::onLoggedIn, Qt::UniqueConnection );
-    connect( pNewRestApi, &RestApi::fileDownloaded, this, &RocketChatServerData::onFileDownloaded, Qt::UniqueConnection );
     connect( pNewRestApi, &RestApi::loginError, this, &RocketChatServerData::onLoginError, Qt::UniqueConnection );
     this->mRestApi = pNewRestApi;
     QPair<QString, uint> token = mStorage->getToken();
@@ -192,24 +183,22 @@ void RocketChatServerData::loadEmojis()
     for ( const auto &emoji : emojiList ) {
         if ( mEmojiRepo != nullptr && !emoji.isNull() ) {
             mEmojiRepo->add( emoji->getIdentifier(), emoji );
-            //        if(emoji->getCategory() == "custom"){
-            //            mCustomEmojisHash = Utils::hash(mCustomEmojis);
-            //        }
         }
 
         auto category = emoji->getCategory();
 
         if ( !emojisByCategory.contains( category ) ) {
             emojisByCategory.insert( category, QList<QSharedPointer<Emoji>>() );
+            emojisByCategory[category].reserve( 500 );
         }
 
-        emojisByCategory[category].append( emoji );
+        emojisByCategory[category].append( std::move( emoji ) );
     }
 
     auto keys = emojisByCategory.keys();
 
-    for ( auto key : keys ) {
-        QMetaObject::invokeMethod( emojiModel, "addEmojisByCategory", Q_ARG( QString, key ), Q_ARG( QList<QSharedPointer<Emoji>>, emojisByCategory[key] ) );
+    for ( const auto &key : keys ) {
+        QMetaObject::invokeMethod( emojiModel, "addEmojisByCategory", Q_ARG( QString, key ), Q_ARG( QList<QSharedPointer<Emoji>>, std::move( emojisByCategory[key] ) ) );
     }
 }
 
@@ -464,7 +453,7 @@ void RocketChatServerData::setUserId( const QString &userId )
     auto users = Models::getUsersModel();
     auto user = users->getUserById( userId );
 
-    if ( user.isNull() ) {
+    if ( user.isNull() && !userId.isEmpty() ) {
         user = QSharedPointer<RocketChatUser>( new RocketChatUser( userId ) );
         QMetaObject::invokeMethod( userModel, "addUser", Q_ARG( User, user ) );
     }
@@ -476,11 +465,6 @@ void RocketChatServerData::setUserId( const QString &userId )
     } );
 }
 
-void RocketChatServerData::checkForMissedMessages()
-{
-
-}
-
 void RocketChatServerData::disconnectFromServer()
 {
     mConnectionState = ConnectionState::OFFLINE;
@@ -522,15 +506,6 @@ void RocketChatServerData::loadHistoryTill( const QString &pChannelId, qint64 pT
     mMessageService->loadHistory( request );
 }
 
-QString RocketChatServerData::parseMessageReceived( const QString &pMessage )
-{
-    auto message = Utils::emojiFy( pMessage, mEmojiRepo );
-    //    message = Utils::linkiFy( message );
-    //    message = message.replace( "\n", "<br>" );
-    return message;
-}
-
-
 void RocketChatServerData::onUsersLoaded( const QString &pChannelId, const QVector<QSharedPointer<RocketChatUser> > &pUserList )
 {
     if ( Q_LIKELY( mChannels->contains( pChannelId ) ) ) {
@@ -720,32 +695,32 @@ void RocketChatServerData::loginWithToken( const QString &pUsername, const QStri
         };
 
         QSharedPointer<DDPLoginRequest> request( new DDPLoginRequest( pToken ) );
-        DdpCallback success = [ self, request, meCallBackSuccess ]( QJsonObject pResponse, MeteorDDP * ) {
+        DdpCallback success = [ = ]( QJsonObject pResponse, MeteorDDP * ) {
             qDebug() << "authenticated";
-            self->mConnectionState = ConnectionState::ONLINE;
+            mConnectionState = ConnectionState::ONLINE;
 
             if ( pResponse.contains( QStringLiteral( "result" ) ) ) {
                 QJsonObject result = pResponse[QStringLiteral( "result" )].toObject();
 
                 if ( result.contains( QStringLiteral( "token" ) ) && result.contains( QStringLiteral( "id" ) ) ) {
-                    self->mResumeToken = result[QStringLiteral( "token" )].toString();
+                    mResumeToken = result[QStringLiteral( "token" )].toString();
                     QJsonObject expireObject = result[QStringLiteral( "tokenExpires" )].toObject();
                     double expireDouble = expireObject[QStringLiteral( "$date" )].toDouble();
-                    self->mTokenExpire = static_cast<uint>( expireDouble / 1000 );
+                    mTokenExpire = static_cast<uint>( expireDouble / 1000 );
 
                     QString userId = result[QStringLiteral( "id" )].toString();
-                    self->setUserId( userId );
-                    self->mStorage->setToken( self->mResumeToken, self->mTokenExpire );
-                    self->mStorage->setUserId( userId );
-                    self->mRestApi->setToken( self->mResumeToken );
-                    self->mRestApi->setUserId( userId );
-                    self->mDdpApi->setToken( self-> mResumeToken );
-                    self->mDdpApi->unsetResponseBinding( request->getFrame() );
+                    setUserId( userId );
+                    mStorage->setToken( self->mResumeToken, self->mTokenExpire );
+                    mStorage->setUserId( userId );
+                    mRestApi->setToken( self->mResumeToken );
+                    mRestApi->setUserId( userId );
+                    mDdpApi->setToken( self-> mResumeToken );
+                    mDdpApi->unsetResponseBinding( request->getFrame() );
 
                     RestApiRequest meRequest
                         = RestApiRequest( new restMeRequest( meCallBackSuccess ) );
 
-                    self->mRestApi->sendRequest( meRequest );
+                    mRestApi->sendRequest( meRequest );
                 }
             }
         };
@@ -877,21 +852,21 @@ void RocketChatServerData::loginWithOpenIDToken( const QString &pToken, const QS
                 QJsonObject result = pResponse[QStringLiteral( "result" )].toObject();
 
                 if ( result.contains( QStringLiteral( "token" ) ) && result.contains( QStringLiteral( "id" ) ) ) {
-                    self->mConnectionState = ConnectionState::ONLINE;
-                    self->mResumeToken = result[QStringLiteral( "token" )].toString();
+                    mConnectionState = ConnectionState::ONLINE;
+                    mResumeToken = result[QStringLiteral( "token" )].toString();
                     QJsonObject expireObject = result[QStringLiteral( "tokenExpires" )].toObject();
                     double expireDouble = expireObject[QStringLiteral( "$date" )].toDouble();
-                    self->mTokenExpire = static_cast<uint>( expireDouble / 1000 );
+                    mTokenExpire = static_cast<uint>( expireDouble / 1000 );
 
                     QString userId = result[QStringLiteral( "id" )].toString();
 
-                    self->setUserId( userId );
-                    self->mRestApi->setToken( mResumeToken );
-                    self->mRestApi->setUserId( userId );
-                    self->mDdpApi->setToken( mResumeToken );
-                    self->mDdpApi->unsetResponseBinding( request->getFrame() );
+                    setUserId( userId );
+                    mRestApi->setToken( mResumeToken );
+                    mRestApi->setUserId( userId );
+                    mDdpApi->setToken( mResumeToken );
+                    mDdpApi->unsetResponseBinding( request->getFrame() );
 
-                    emit self->onHashLoggedIn( self->mServerId ) ;
+                    // emit onHashLoggedIn( self->mServerId ) ;
 
                     RestApiRequest meRequest
                         = RestApiRequest( new restMeRequest( meCallBackSuccess ) );
@@ -1122,7 +1097,7 @@ void RocketChatServerData::sendUnsentMessages()
 
     if ( mConnectionState == ConnectionState::ONLINE
        ) {
-        mUnsentMutex.lock();
+        // mUnsentMutex.lock();
 
         for ( const auto &request : mUnsendDdpRequests ) {
             if ( !request.isNull() ) {
@@ -1140,10 +1115,10 @@ void RocketChatServerData::sendUnsentMessages()
         }
 
         mUnsendRestRequests.clear();
-        mUnsentMutex.unlock();
+        // mUnsentMutex.unlock();
         qDebug() << "all messages send";
     } else if ( mConnectionState == ConnectionState::CONNECTED ) {
-        mUnsentMutex.lock();
+        // mUnsentMutex.lock();
 
         for ( const auto &request : mUnsendDdpRequestsOnConnected ) {
             if ( !request.isNull() ) {
@@ -1154,7 +1129,7 @@ void RocketChatServerData::sendUnsentMessages()
         mUnsendDdpRequestsOnConnected.clear();
         qDebug() << "send unsend rest messages";
 
-        mUnsentMutex.unlock();
+        //  mUnsentMutex.unlock();
     }
 }
 
@@ -1399,27 +1374,6 @@ void RocketChatServerData::onResume()
 
 }
 
-
-QJsonObject RocketChatServerData::formatMessageTime( const QJsonObject &pJsonObject )
-{
-    if ( Q_LIKELY( pJsonObject.contains( QStringLiteral( "ts" ) ) ) ) {
-        QJsonObject ts = pJsonObject[QStringLiteral( "ts" )].toObject();
-
-        if ( Q_LIKELY( ts.contains( QStringLiteral( "$date" ) ) ) ) {
-            double timeStamp = ts[QStringLiteral( "$date" )].toDouble();
-            QDateTime dateTime = QDateTime::fromMSecsSinceEpoch( timeStamp );
-            QString formattedTime = dateTime.toString( QStringLiteral( "hh:mm" ) );
-            QString formattedDate = dateTime.toString( QStringLiteral( "dd.MM.yyyy" ) );
-            pJsonObject[QStringLiteral( "formattedDate" )] = formattedDate;
-            pJsonObject[QStringLiteral( "formattedTime" )] = formattedTime;
-            pJsonObject[QStringLiteral( "msg" )] = parseMessageReceived( pJsonObject[QStringLiteral( "msg" )].toString() );
-            return pJsonObject;
-        }
-    }
-
-    return QJsonObject();
-}
-
 void RocketChatServerData::joinJitsiCall( const QString &pRoomId )
 {
 
@@ -1540,12 +1494,6 @@ void RocketChatServerData::onChannelsLoaded( const QVector<QSharedPointer<Rocket
     loadHistories();
 }
 
-void RocketChatServerData::onFileDownloaded( const QString &pUrl, const QString &pTempfile )
-{
-    Q_UNUSED( pUrl );
-    Q_UNUSED( pTempfile );
-}
-
 void RocketChatServerData::onLoggedIn()
 {
     mLoggedIn = true;
@@ -1635,12 +1583,6 @@ void RocketChatServerData::joinChannelByNameAndType( const QString &pChannelName
     }
 }
 
-
-void RocketChatServerData::connectWithServer()
-{
-    mDdpApi->connectWithServer();
-}
-
 QString RocketChatServerData::getServerId() const
 {
     return mServerId;
@@ -1651,12 +1593,6 @@ void RocketChatServerData::setServerId( const QString &pValue )
     mServerId = pValue;
 }
 
-void RocketChatServerData::setServerAddress( const QString &pServerAddress )
-{
-    mBaseUrl = pServerAddress;
-    mApiUri = QStringLiteral( "https://" ) + pServerAddress + QStringLiteral( "/api/v1" );
-}
-
 bool RocketChatServerData::isConnected() const
 {
     return mConnected;
@@ -1712,52 +1648,53 @@ void RocketChatServerData::sendMessage( const QString &pMessage, const QString &
 
 void RocketChatServerData::getCustomEmojis()
 {
-    std::function<void ( QList<QSharedPointer<Emoji>> )> success = [ = ]( QList<QSharedPointer<Emoji>> pEmojiList ) {
-        auto emojiModel = Models::getEmojisModel();
+    std::function<void ( QList<QSharedPointer<Emoji>> )> success = [ = ]( const QList<QSharedPointer<Emoji>> &pEmojiList ) {
 
-        if ( pEmojiList.size() ) {
+        if ( !pEmojiList.isEmpty() ) {
+            auto emojiModel = Models::getEmojisModel();
             mStorage->transaction();
 
+            QList<QSharedPointer<Emoji>> newEmojis;
+
             for ( const auto &emoji : pEmojiList ) {
                 if ( !emoji.isNull() ) {
-                    mEmojiService->persistEmoji( emoji );
-
                     if ( !mEmojiRepo->contains( emoji->getIdentifier() ) ) {
+                        mEmojiService->persistEmoji( emoji );
                         mEmojiRepo->add( emoji->getIdentifier(), emoji );
+                        newEmojis.append( std::move( emoji ) );
                     }
                 }
             }
 
-            QMetaObject::invokeMethod( emojiModel, "addEmojisByCategory", Q_ARG( QString, "custom" ), Q_ARG( QList<QSharedPointer<Emoji>>, pEmojiList ) );
-
+            if ( !newEmojis.isEmpty() ) {
+                QMetaObject::invokeMethod( emojiModel, "addEmojisByCategory", Q_ARG( QString, "custom" ), Q_ARG( QList<QSharedPointer<Emoji>>, std::move( newEmojis ) ) );
+            }
 
             mStorage->commit();
         }
 
-        //emit customEmojisReceived( getEmojisByCategory() );
-
-        QSharedPointer<RocketChatSubscribeRoomsChanged> notifyRoomsChanged( new RocketChatSubscribeRoomsChanged( this->mUserId ) );
-        QSharedPointer<RocketChatSubscribeUserNotify> notifySubSubscription( new RocketChatSubscribeUserNotify( this->mUserId ) );
-        QSharedPointer<RocketChatNotifyNoticesRequest> notifyNoticeSubSubscription( new RocketChatNotifyNoticesRequest( this->mUserId ) );
-        QSharedPointer<RocketChatSubScriptionChangedRequest> noitfySubscriptionsSubscription( new RocketChatSubScriptionChangedRequest( this->mUserId ) );
-        QSharedPointer<RocketChatSubscribeActiveUsers> activeUsersSubscription( new RocketChatSubscribeActiveUsers() );
-        QSharedPointer<RocketChatSubscribeUserData> userData( new RocketChatSubscribeUserData() );
-        sendDdprequest( notifySubSubscription, true );
-        sendDdprequest( notifyNoticeSubSubscription, true );
-        sendDdprequest( noitfySubscriptionsSubscription, true );
-        sendDdprequest( activeUsersSubscription, true );
-        sendDdprequest( notifyRoomsChanged, true );
-        sendDdprequest( userData, true );
-
         onLoggedIn();
-        sendUnsentMessages();
-        getServerSettings();
-        emit registerForPush();
 
         qDebug() << "ddp authenticated";
-        this->initialised = 1;
+        this->initialised = true;
     };
-    mEmojiService->loadCustomEmojis( success );
+    QSharedPointer<RocketChatSubscribeRoomsChanged> notifyRoomsChanged( new RocketChatSubscribeRoomsChanged( this->mUserId ) );
+    QSharedPointer<RocketChatSubscribeUserNotify> notifySubSubscription( new RocketChatSubscribeUserNotify( this->mUserId ) );
+    QSharedPointer<RocketChatNotifyNoticesRequest> notifyNoticeSubSubscription( new RocketChatNotifyNoticesRequest( this->mUserId ) );
+    QSharedPointer<RocketChatSubScriptionChangedRequest> noitfySubscriptionsSubscription( new RocketChatSubScriptionChangedRequest( this->mUserId ) );
+    QSharedPointer<RocketChatSubscribeActiveUsers> activeUsersSubscription( new RocketChatSubscribeActiveUsers() );
+    QSharedPointer<RocketChatSubscribeUserData> userData( new RocketChatSubscribeUserData() );
+    sendDdprequest( notifySubSubscription, true );
+    sendDdprequest( notifyNoticeSubSubscription, true );
+    sendDdprequest( noitfySubscriptionsSubscription, true );
+    sendDdprequest( activeUsersSubscription, true );
+    sendDdprequest( notifyRoomsChanged, true );
+    sendDdprequest( userData, true );
+
+    sendUnsentMessages();
+    getServerSettings();
+    emit registerForPush();
+    mEmojiService->loadCustomEmojis( std::move( success ) );
 }
 
 void RocketChatServerData::openPrivateChannelWith( const QString &pUsername )
@@ -1785,7 +1722,7 @@ void RocketChatServerData::uploadFile( const QString &pChannelId, const QString
             file.close();
         }
 
-        FileUploader *uploader = new FileUploader( this, uri, pChannelId );
+        auto uploader = new FileUploader( this, uri, pChannelId );
         std::function<void( void )> success = [ = ]() {
             emit fileUploadFinished( uploader->getFileId() );
             delete uploader;
@@ -1813,7 +1750,7 @@ void RocketChatServerData::uploadFile( const QString &pChannelId, const QString
 
         try {
             uploader->upload( success );
-        } catch ( std::exception e ) {
+        } catch ( std::exception &e ) {
             qCritical() << e.what();
         }
     }
diff --git a/rocketchatserver.h b/rocketchatserver.h
index cf04c770a54a9bed38c2167c6d7ee01c72120888..3a0b73809dac1f88f2bdac805ab20da47f730c7e 100755
--- a/rocketchatserver.h
+++ b/rocketchatserver.h
@@ -115,13 +115,11 @@ class RocketChatServerData : public MessageListener
 
         Q_OBJECT
     public:
-        RocketChatServerData( const QString &pId, QString pBaseUrl,
+        RocketChatServerData( QString pId, QString pBaseUrl,
                               bool pUnsecure = false );
 
         void setServerId( const QString &pValue );
 
-        void setServerAddress( const QString &pServerAddress );
-
     public slots:
 
         void init();
@@ -144,7 +142,6 @@ class RocketChatServerData : public MessageListener
         void joinChannel( const QString &pChannelId, bool pForce = false );
         void joinChannelByNameAndType( const QString &pChannelName, const QString &pType );
 
-        void connectWithServer();
         void loadRecentHistory( const QString &pChannelId );
 
         void loadHistoryTill( const QString &pChannelId, qint64 pTs );
@@ -225,12 +222,9 @@ class RocketChatServerData : public MessageListener
         RocketChatChannelService *mChannelService;
         void handleChannelMessage( const QJsonObject &pMessage );
         uint diffToLastDDPPing();
-        QString parseMessageReceived( const QString &pMessage );
         void sendUnsentMessages( void );
         void sendApiRequest( const RestApiRequest &pRequest, bool pRetry = true );
         void sendDdprequest( const QSharedPointer<DDPRequest> &pRequest, bool pRetry = true, bool pSendWhenConnected = false );
-        QJsonObject getMessageData( const QString &pChannelId, const QString &pMesssageId );
-        QJsonObject formatMessageTime( const QJsonObject &pJsonObject );
         bool initialised = 0;
         ConnectionState getConnectionState() const;
 
@@ -277,7 +271,6 @@ class RocketChatServerData : public MessageListener
         PersistanceLayer *mStorage = nullptr;
         EmojiService *mEmojiService = nullptr;
         FileService *mFileService = nullptr;
-        QHash<QString, bool> mDownloadsInProgress;
         QLinkedList<QSharedPointer<DDPRequest>> mUnsendDdpRequests;
         QLinkedList<QSharedPointer<DDPRequest>> mUnsendDdpRequestsOnConnected;
         QLinkedList<RestApiRequest> mUnsendRestRequests;
@@ -293,11 +286,6 @@ class RocketChatServerData : public MessageListener
         QString mPendingSwitchRoomRequest;
         QString mPendingSwitchRoomRequestType;
 
-
-
-        //TODO: only a quick and dirty solution, move it out and clean up!
-        QStringList mBlockedUsers;
-
         void getServerSettings( void );
         void onDDPConnected();
         void onDDPDisonnected();
@@ -305,7 +293,6 @@ class RocketChatServerData : public MessageListener
         void onDDPAuthenticated();
         void onDDPMessageReceived( const QJsonObject &pMessage );
         void onChannelsLoaded( const QVector<QSharedPointer<RocketChatChannel> > &pChannels );
-        void onFileDownloaded( const QString &pUrl, const QString &pTempfile );
         void onLoggedIn();
         bool isStreamRoomMessage( const QJsonObject &pMessage ) const;
         bool isUserJoinMessage( const QJsonObject &pMessage ) const;
@@ -318,7 +305,6 @@ class RocketChatServerData : public MessageListener
 
         void loadEmojis();
         void loadHistories( void );
-        void checkForMissedMessages( void );
         void onUsersLoaded( const QString &pChannelId, const QVector<QSharedPointer<RocketChatUser>> &pUserList );
 
         void onUnreadCountChanged();
diff --git a/segfaulthandler.cpp b/segfaulthandler.cpp
index 426f48ec8450a268970c736df4332836bdd36c9b..9a5d49261deff997bbb6d10374d90eebc8b86579 100755
--- a/segfaulthandler.cpp
+++ b/segfaulthandler.cpp
@@ -44,7 +44,7 @@ SegfaultHandler::SegfaultHandler( QObject *parent ) : QObject( parent )
     init();
 }
 
-SegfaultHandler::SegfaultHandler( QString pText )
+SegfaultHandler::SegfaultHandler( const QString &pText )
 {
     mFailurePoint = pText;
     SegfaultHandler::mFailurePoints[QThread::currentThreadId()] = pText;
diff --git a/segfaulthandler.h b/segfaulthandler.h
index 47e51055a93ed81fe5e85c0cbad4115b4bd1617c..879dba7161d26eca499fafd7a6e72d9d35133556 100755
--- a/segfaulthandler.h
+++ b/segfaulthandler.h
@@ -36,7 +36,7 @@ class SegfaultHandler : public QObject
         Q_OBJECT
     public:
         explicit SegfaultHandler( QObject *parent = 0 );
-        explicit SegfaultHandler( QString );
+        explicit SegfaultHandler( const QString & );
 
         ~SegfaultHandler();
 
diff --git a/services/emojiservice.cpp b/services/emojiservice.cpp
index 2a7336089b9e54b6bdcaf6d3304234bb6484946f..34552fa0d9e0827327712622f5c155020b1343e2 100755
--- a/services/emojiservice.cpp
+++ b/services/emojiservice.cpp
@@ -46,7 +46,7 @@ void EmojiService::loadCustomEmojis( const std::function<void ( QList<QSharedPoi
     DdpCallback success = [ = ]( const QJsonObject & pResponse, MeteorDDP * pDdp ) {
         Q_UNUSED( pDdp );
         QJsonArray result = pResponse[QStringLiteral( "result" )].toArray();
-        EmojiData *data = new EmojiData( result );
+        auto data = new EmojiData( result );
         data->success = pSuccess;
         handleCustomEmojisReceived( data );
     };
@@ -66,8 +66,8 @@ QList<QSharedPointer<Emoji>> EmojiService::loadEmojisFromDb()
     emojiList.reserve( 3000 );
 
     for ( const auto &current : emojiData ) {
-        auto parsedEmojis = parseEmoji( current );
-        emojiList.append( parsedEmojis );
+        auto parsedEmojis = parseEmoji( std::move( current ) );
+        emojiList.append( std::move( parsedEmojis ) );
     }
 
     return emojiList;
@@ -141,7 +141,7 @@ QSharedPointer<Emoji> EmojiService::parseEmoji( const QHash<QString, QString> &p
     QString unicode = pEmojiData[QStringLiteral( "unicode" )];
     int order = pEmojiData[QStringLiteral( "sort_order" )].toInt();
 
-    QSharedPointer<Emoji> emoji( new Emoji( name, catgeory, filePath, html, unicode, order ) );
+    QSharedPointer<Emoji> emoji( new Emoji( std::move( name ), std::move( catgeory ), std::move( filePath ), std::move( html ), std::move( unicode ), order ) );
     return emoji;
 }
 
@@ -151,7 +151,7 @@ QSharedPointer<Emoji> EmojiService::parseEmoji( const QJsonObject &pEmojiData )
     QString extension = pEmojiData[QStringLiteral( "extension" )].toString();
     QString category = pEmojiData[QStringLiteral( "category" )].toString();
 
-    QSharedPointer<Emoji> emoji( new Emoji( name,  extension,  category ) );
+    QSharedPointer<Emoji> emoji( new Emoji( std::move( name ),  std::move( extension ),  std::move( category ) ) );
     return emoji;
 }
 
@@ -166,7 +166,7 @@ EmojiData::EmojiData( const QJsonArray &data )
     this->emojiCounter = data.count();
 }
 
-QJsonArray EmojiData::getEmojiData() const
+const QJsonArray &EmojiData::getEmojiData() const
 {
     return emojiData;
 }
diff --git a/services/emojiservice.h b/services/emojiservice.h
index 14cbbf8a0d475fe8126a2367e50778fd8442649e..46af61b6c0dda65711c0bbbd1ee90a487c8d1b3c 100644
--- a/services/emojiservice.h
+++ b/services/emojiservice.h
@@ -38,7 +38,7 @@ class EmojiData
 {
     public:
         EmojiData( const QJsonArray &data );
-        QJsonArray getEmojiData() const;
+        const QJsonArray &getEmojiData() const;
         QAtomicInt emojiCounter = 0;
         QAtomicInt emojisProcessed = 0;
         QJsonArray emojiData = {};
diff --git a/services/messageservice.cpp b/services/messageservice.cpp
index b30d378268b93d7f286a5981e0372eadd55fc9fe..a71d576e11424fc6ed7b67aa2c4f093f5a5c9cfa 100644
--- a/services/messageservice.cpp
+++ b/services/messageservice.cpp
@@ -281,7 +281,7 @@ void MessageService::loadHistoryFromServer( const QSharedPointer<LoadHistoryRequ
         QSharedPointer<QSet<QString>> duplicateCheck( new QSet<QString> );
 
         if ( requests.length() ) {
-            QMultiMap<QString, ChatMessage> *list = new QMultiMap<QString, ChatMessage>;
+            auto list = new QMultiMap<QString, ChatMessage>;
 
             //loop over all channels
             for ( const auto &currentChannelRequest : requests ) {
@@ -373,7 +373,7 @@ void MessageService::loadHistoryFromServer( const QSharedPointer<LoadHistoryServ
 QMultiMap<QString, ChatMessage> *MessageService::loadHistoryFromDb(
     const QSharedPointer<LoadHistoryServiceRequest> &pRequest )
 {
-    QMultiMap<QString, ChatMessage> *channelMap  = new QMultiMap<QString, ChatMessage>;
+    auto channelMap  = new QMultiMap<QString, ChatMessage>;
 
     if ( !pRequest.isNull() ) {
         QStringList channelIds = pRequest->getChannelIds();
diff --git a/services/requests/loadhistoryservicerequest.cpp b/services/requests/loadhistoryservicerequest.cpp
index f19d18fcc458e959e83fff4eb3c935a43ad1e0a1..7e3df1d19449ea146f290e84a82d5e047fbfee9d 100644
--- a/services/requests/loadhistoryservicerequest.cpp
+++ b/services/requests/loadhistoryservicerequest.cpp
@@ -27,17 +27,17 @@ LoadHistoryServiceRequest::LoadHistoryServiceRequest( const QString &pChannelId
 
 }
 
-LoadHistoryServiceRequest::LoadHistoryServiceRequest( const QStringList &pChannelIds ): mChannelIds( pChannelIds )
+LoadHistoryServiceRequest::LoadHistoryServiceRequest( QStringList pChannelIds ): mChannelIds( std::move( pChannelIds ) )
 {
 
 }
 
-LoadHistoryServiceRequest::LoadHistoryServiceRequest( const QString &pChannelId, int pLimit ): LoadHistoryServiceRequest( pChannelId )
+LoadHistoryServiceRequest::LoadHistoryServiceRequest( QString pChannelId, int pLimit ): LoadHistoryServiceRequest( std::move( pChannelId ) )
 {
     mLimit = pLimit;
 }
 
-LoadHistoryServiceRequest::LoadHistoryServiceRequest( const QStringList &pChannelIds, int pLimit ): LoadHistoryServiceRequest( pChannelIds )
+LoadHistoryServiceRequest::LoadHistoryServiceRequest( QStringList pChannelIds, int pLimit ): LoadHistoryServiceRequest( std::move( pChannelIds ) )
 {
     mLimit = pLimit;
 }
diff --git a/services/requests/loadhistoryservicerequest.h b/services/requests/loadhistoryservicerequest.h
index b64ba989e82d427d11e57e92e299f50b3ecac19e..b93ce2111cfaff9ede10d33b78e3ae1f222818f6 100644
--- a/services/requests/loadhistoryservicerequest.h
+++ b/services/requests/loadhistoryservicerequest.h
@@ -32,9 +32,9 @@ class LoadHistoryServiceRequest
 {
     public:
         LoadHistoryServiceRequest( const QString &pChannelId );
-        LoadHistoryServiceRequest( const QStringList &pChannelIds );
-        LoadHistoryServiceRequest( const QString &pChannelId, int pLimit );
-        LoadHistoryServiceRequest( const QStringList &pChannelIds, int pLimit );
+        LoadHistoryServiceRequest( QStringList pChannelIds );
+        LoadHistoryServiceRequest( QString pChannelId, int pLimit );
+        LoadHistoryServiceRequest( QStringList pChannelIds, int pLimit );
 
         enum class Source {
             AUTO,
diff --git a/services/rocketchatchannelservice.cpp b/services/rocketchatchannelservice.cpp
index e57afc42586c36ee1eb7f5da69a30a2168acc663..66e097e2643f6000bab59651e974ca2dde2008cf 100755
--- a/services/rocketchatchannelservice.cpp
+++ b/services/rocketchatchannelservice.cpp
@@ -126,17 +126,6 @@ QVector<QSharedPointer<RocketChatChannel> > RocketChatChannelService::processCha
 
                 if ( type == "d" ) {
                     channel->setChatPartnerId( chatPartnerId );
-
-                    /* QString name = currentChannelObject["name"].toString();
-                     QString fname = currentChannelObject["fname"].toString();
-
-                     if ( fname.isEmpty() ) {
-                         channel->setName( name );
-                     } else {
-                         channel->setName( fname );
-                     }
-
-                     channel->setUsername( name );*/
                 }
 
                 if ( !name.isEmpty() ) {
@@ -226,10 +215,10 @@ void RocketChatChannelService::loadJoinedChannelsFromServer( void )
 
             auto channelsLocal = mChannels->getElements();
 
-            for ( auto channelKey : channelsLocal.keys() ) {
+            for ( const auto &channelKey : channelsLocal.keys() ) {
                 bool deleteFlag = true;
 
-                for ( auto channelServer : channelsParsed ) {
+                for ( const auto &channelServer : channelsParsed ) {
                     if ( channelServer->getRoomId() == channelKey ) {
                         deleteFlag = false;
                     }
@@ -603,7 +592,7 @@ channelVector RocketChatChannelService::searchRoomLocal( const QString &pTerm, c
     channelVector list;
     QString term = pTerm.toLower();
 
-    for ( auto channel : mChannels->getElements() ) {
+    for ( const auto &channel : mChannels->getElements() ) {
         QString id = channel->getRoomId();
         QString type = channel->getType();
         QString name = channel->getName().toLower();
diff --git a/utils.cpp b/utils.cpp
index 95ee297f9a1dff8296152a873a4c7b4d17b2586c..3b3c4c35a576f95cb94cf491a8b80ae283a7de34 100755
--- a/utils.cpp
+++ b/utils.cpp
@@ -154,7 +154,7 @@ QString Utils::linkiFy( const QString &pText )
 
         parts.append( pText.right( pText.length() - idx_last ) );
 
-        for ( const auto part : parts ) {
+        for ( const auto &part : parts ) {
             html += part;
         }