diff --git a/CustomModels/models.cpp b/CustomModels/models.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f9eed2d7f8c175f86deffd3b312b6156a72b9ada
--- /dev/null
+++ b/CustomModels/models.cpp
@@ -0,0 +1,78 @@
+#include "models.h"
+
+UserModel *Models::mUserModel = nullptr;
+LoginMethodsModel *Models::mLoginMethodsModel = nullptr;
+ChannelModel *Models::mDirectChannelsModel = nullptr;
+ChannelModel *Models::mPublicGroupsModel = nullptr;
+ChannelModel *Models::mPrivateGroupsModel = nullptr;
+MessagesModel *Models::mMessagesModel = nullptr;
+
+UserModel* Models::getUsersModel()
+{
+    return mUserModel;
+}
+
+LoginMethodsModel* Models::getLoginMethodsModel()
+{
+    return mLoginMethodsModel;
+}
+
+ChannelModel* Models::getDirectChannelsModel()
+{
+    return mDirectChannelsModel;
+}
+
+ChannelModel* Models::getPublicGroupsModel()
+{
+    return mPublicGroupsModel;
+}
+
+ChannelModel* Models::getPrivateGroupsModel()
+{
+    return mPrivateGroupsModel;
+}
+
+MessagesModel *Models::getMessagesModel()
+{
+    return mMessagesModel;
+}
+
+void Models::resetModels()
+{
+    mDirectChannelsModel->clear();
+    mLoginMethodsModel->clear();
+    mPublicGroupsModel->clear();
+    mPrivateGroupsModel->clear();
+}
+
+void Models::init()
+{
+    if(mDirectChannelsModel == nullptr){
+        mDirectChannelsModel = new ChannelModel();
+    }
+    if(mLoginMethodsModel == nullptr){
+        mLoginMethodsModel = new LoginMethodsModel();
+    }
+    if(mPublicGroupsModel == nullptr){
+        mPublicGroupsModel = new ChannelModel();
+    }
+    if(mPrivateGroupsModel == nullptr){
+        mPrivateGroupsModel = new ChannelModel();
+    }
+    if(mMessagesModel == nullptr){
+        mMessagesModel = new MessagesModel();
+    }
+    if(mUserModel == nullptr){
+        mUserModel = new UserModel();
+    }
+}
+
+Models::~Models()
+{
+    Models::mDirectChannelsModel->deleteLater();
+    Models::mLoginMethodsModel->deleteLater();
+    Models::mMessagesModel->deleteLater();
+    Models::mPrivateGroupsModel->deleteLater();
+    Models::mPublicGroupsModel->deleteLater();
+    Models::mUserModel->deleteLater();
+}
diff --git a/CustomModels/models.h b/CustomModels/models.h
new file mode 100644
index 0000000000000000000000000000000000000000..0e216cb4ceb418636179fcdab818a0864200e7fb
--- /dev/null
+++ b/CustomModels/models.h
@@ -0,0 +1,37 @@
+#ifndef MODELS_H
+#define MODELS_H
+
+#include "channelmodel.h"
+#include "loginmethodsmodel.h"
+#include "messagemodel.h"
+#include "usermodel.h"
+
+class ChannelModel;
+class MessagesModel;
+class Models
+{
+public:
+    Models() = delete;
+    Models& operator=(const Models&) = delete;
+
+    static UserModel* getUsersModel();
+    static LoginMethodsModel* getLoginMethodsModel();
+    static ChannelModel* getDirectChannelsModel();
+    static ChannelModel* getPublicGroupsModel();
+    static ChannelModel* getPrivateGroupsModel();
+    static MessagesModel* getMessagesModel();
+    static void resetModels();
+    static void init();
+
+    ~Models();
+
+private:
+    static UserModel *mUserModel;
+    static LoginMethodsModel *mLoginMethodsModel;
+    static ChannelModel *mDirectChannelsModel;
+    static ChannelModel *mPublicGroupsModel;
+    static ChannelModel *mPrivateGroupsModel;
+    static MessagesModel *mMessagesModel;
+};
+
+#endif // MODELS_H
diff --git a/engine.pro b/engine.pro
index b8a88425f3d5e335c6bf7ba9df2a8bd25623eaa7..5a218813118bd2d488ac4485e3fb177a7380815c 100644
--- a/engine.pro
+++ b/engine.pro
@@ -83,6 +83,7 @@ SOURCES +=  api/meteorddp.cpp \
     ddpRequests/rocketchatchangeuserpresancedefaultstatus.cpp \
     CustomModels/messagemodel.cpp \
     CustomModels/loginmethodsmodel.cpp \
+    CustomModels/models.cpp \
     repos/loginmethodsrepository.cpp \
     repos/entities/loginmethod.cpp \
     restRequests/getserverinforequest.cpp \
@@ -177,6 +178,7 @@ HEADERS += \
     config.h \
     CustomModels/messagemodel.h \
     CustomModels/loginmethodsmodel.h \
+    CustomModels/models.h \
     repos/loginmethodsrepository.h \
     repos/entities/loginmethod.h \
     restRequests/getserverinforequest.h \
diff --git a/repos/channelrepository.cpp b/repos/channelrepository.cpp
index 87ff5df7159783ac15be143088c3b42b65cd7638..b6fa758285d7762664f521884e59e2614b9de9d2 100755
--- a/repos/channelrepository.cpp
+++ b/repos/channelrepository.cpp
@@ -21,9 +21,8 @@
 
 
 #include "channelrepository.h"
-ChannelRepository::ChannelRepository( ChannelModel &channelsModel, ChannelModel &groupsModel,
-                                      ChannelModel &directModel, MessagesModel &messagesModel ):
-    mChannelsModel( channelsModel ), mGroupsModel( groupsModel ), mDirectModel( directModel ), mMessagesModel( messagesModel )
+ChannelRepository::ChannelRepository( ):
+    mChannelsModel( Models::getPublicGroupsModel() ), mGroupsModel( Models::getPublicGroupsModel() ), mDirectModel( Models::getDirectChannelsModel() ), mMessagesModel( Models::getMessagesModel() )
 {
     mElements.reserve( 50 );
 }
@@ -34,15 +33,15 @@ bool ChannelRepository::add( QString id, QSharedPointer<RocketChatChannel> msg )
     QString type = msg->getType();
 
     if ( type == "c" ) {
-        QMetaObject::invokeMethod( &mChannelsModel,  "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
+        QMetaObject::invokeMethod( mChannelsModel,  "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
     } else if ( type == "d" ) {
-        QMetaObject::invokeMethod( &mDirectModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
+        QMetaObject::invokeMethod( mDirectModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
     } else if ( type == "p" ) {
-        QMetaObject::invokeMethod( &mGroupsModel,  "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
+        QMetaObject::invokeMethod( mGroupsModel,  "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
     }
 
     mNameIndex[msg->getName()] = msg;
-    QMetaObject::invokeMethod( &mMessagesModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
+    QMetaObject::invokeMethod( mMessagesModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) );
     return AbstractBaseRepository::add( id, msg );
 }
 
diff --git a/repos/channelrepository.h b/repos/channelrepository.h
index 86eaf6cada23403d5be29140d3c79e4b8c91d872..49e7396f17bed12a920809032d747778b40faf59 100755
--- a/repos/channelrepository.h
+++ b/repos/channelrepository.h
@@ -29,6 +29,7 @@
 #include "repos/entities/rocketchatchannel.h"
 #include "CustomModels/channelmodel.h"
 #include "CustomModels/messagemodel.h"
+#include "CustomModels/models.h"
 class MessagesModel;
 class RocketChatChannel;
 class ChannelModel;
@@ -38,8 +39,7 @@ class ChannelRepository : public QObject, public AbstractBaseRepository<RocketCh
         Q_OBJECT
     public:
 
-        explicit ChannelRepository( ChannelModel &channelsModel, ChannelModel &groupsModel, ChannelModel &directModel,
-                                    MessagesModel &messagesModel );
+        explicit ChannelRepository( );
         unsigned long  getYoungestMessageDate();
         unsigned long  getOldestMessageDate();
         bool add( QString id, QSharedPointer<RocketChatChannel> );
@@ -50,9 +50,9 @@ class ChannelRepository : public QObject, public AbstractBaseRepository<RocketCh
     private:
         QHash<QSharedPointer<RocketChatChannel>, qint64 >  mChannelTimeIndex;
         QMap<qint64, QSharedPointer<RocketChatChannel> > mTimestampIndex;
-        ChannelModel &mChannelsModel, &mGroupsModel, &mDirectModel;
+        ChannelModel *mChannelsModel, *mGroupsModel, *mDirectModel;
         QHash<QString, QSharedPointer<RocketChatChannel> > mNameIndex;
-        MessagesModel &mMessagesModel;
+        MessagesModel *mMessagesModel;
 
     signals:
         void orderChanged( QString channelId );
diff --git a/rocketchat.cpp b/rocketchat.cpp
index f30c87e5800c7dddca0d6c47e5d79b5477827da5..92d1359d2da62c67977da220ab2a86c326daa0e7 100755
--- a/rocketchat.cpp
+++ b/rocketchat.cpp
@@ -28,6 +28,7 @@
 #include <QDesktopServices>
 #include <QClipboard>
 
+#include "CustomModels/models.h"
 
 #ifdef Q_OS_IOS
 
@@ -47,8 +48,7 @@
  * @param restApi
  * @param ddp
  */
-RocketChat::RocketChat( QGuiApplication *app, ChannelModel &channelModel, ChannelModel &groupsModel, ChannelModel &directmodel, MessagesModel &messagesModel, UserModel &userModel, LoginMethodsModel &loginMethodsModel )
-    : channelModel( channelModel ), groupsModel( groupsModel ), directmodel( directmodel ), userModel( userModel ), messagesModel( messagesModel ), loginMethodsModel( loginMethodsModel )
+RocketChat::RocketChat( QGuiApplication *app )
 {
 #ifdef Q_OS_IOS
     //UrlHandler *handler = new UrlHandler;
@@ -262,19 +262,14 @@ bool RocketChat::newServerByDomain( const QString &domain )
 
         auto self = this;
         connect( firstServer, &RocketChatServerData::destroyed, [ &, self, domain]() {
-            qDebug() << "test0";
             qDebug() << "domain: " << domain;
             QString baseUrl = domain;
             QString apiUri = QStringLiteral( "https://" ) + domain + QStringLiteral( "/api/v1" );
-            qDebug() << "test1";
-            self->channelModel.clear();
-            self->groupsModel.clear();
-            self->directmodel.clear();
-            self->loginMethodsModel.clear();
-
-            RocketChatServerData *server =  new RocketChatServerData( domain, baseUrl, apiUri, self->userModel, self->channelModel, self->groupsModel, self->directmodel, self->messagesModel, self->loginMethodsModel );
-            qDebug() << "test2";
-            qDebug() << "test3";
+
+            Models::resetModels();
+
+            RocketChatServerData *server =  new RocketChatServerData( domain, baseUrl, apiUri );
+
             registerServer( server );
             newServerMutex.unlock();
         } );
@@ -283,19 +278,16 @@ bool RocketChat::newServerByDomain( const QString &domain )
     } else {
         QString baseUrl = domain;
         QString apiUri = QStringLiteral( "https://" ) + domain + QStringLiteral( "/api/v1" );
-        this->channelModel.clear();
-        this->groupsModel.clear();
-        this->directmodel.clear();
-        this->loginMethodsModel.clear();
-        RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri, userModel, channelModel, groupsModel, directmodel, messagesModel, loginMethodsModel );
+
+        Models::resetModels();
+
+        RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri );
 
         registerServer( server );
         newServerMutex.unlock();
 
     }
 
-
-
     return 0;
 }
 
@@ -636,12 +628,12 @@ void RocketChat::registerServer( RocketChatServerData *pServer )
 
 void RocketChat::addLoginMethod( const QMap<QString, QVariant> &pMethod )
 {
-    loginMethodsModel.addLoginMethod( pMethod );
+    Models::getLoginMethodsModel()->addLoginMethod(pMethod);
 }
 
 void RocketChat::resetLoginMethods()
 {
-    loginMethodsModel.clear();
+    Models::getLoginMethodsModel()->clear();
 }
 
 void RocketChat::openIosFile( const QString &fileName )
diff --git a/rocketchat.h b/rocketchat.h
index 5d3bfcb526207e5ac3980e48197af8981c6d62e5..e22ead31974eecebc08cf1551f5cb70f0144f489 100755
--- a/rocketchat.h
+++ b/rocketchat.h
@@ -44,9 +44,7 @@ class RocketChat : public QObject
 {
         Q_OBJECT
     public:
-        RocketChat( QGuiApplication *mApp, ChannelModel &channelModel, ChannelModel &groupsModel,
-                    ChannelModel &directmodel, MessagesModel &messagesModel, UserModel &userModel,
-                    LoginMethodsModel &LoginMethodsModel );
+        RocketChat( QGuiApplication *mApp );
         ~RocketChat();
 
         //TODO: check for depricated methods
@@ -226,13 +224,6 @@ class RocketChat : public QObject
 
         void onExternalChannelSwitchRequest( const QString &pName );
 
-        ChannelModel &channelModel;
-        ChannelModel &groupsModel;
-        ChannelModel &directmodel;
-        UserModel &userModel;
-        MessagesModel &messagesModel;
-        LoginMethodsModel &loginMethodsModel;
-
     signals:
 
         void fileRessourceProcessed( QString url, QString path, bool showInline );
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index 86524d7776d873adf6450b28b5f9e61fe16d22f0..5d3d10b1afc684ebc38b11303a784455fbe6e048 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -21,18 +21,11 @@
 
 #include "rocketchatserver.h"
 
+#include "CustomModels/models.h"
 
-
-RocketChatServerData::RocketChatServerData( const QString &pId,  QString pBaseUrl,
-        QString pApiUri,
-        UserModel &pUserModel,
-        ChannelModel &channelModel,
-        ChannelModel &groupsModel,
-        ChannelModel &directModel,
-        MessagesModel &messagesModel,
-        LoginMethodsModel &loginMethodsModel )
-    : mBaseUrl( pBaseUrl ), mApiUri( pApiUri ), mServerId( pId ), userModel( pUserModel ),
-      channelsModel( channelModel ), groupsModel( groupsModel ), directModel( directModel ), mMessagesModel( messagesModel ), loginMethodsModel( loginMethodsModel )
+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())
 {
     mStorage = PersistanceLayer::instance();
     mEmojiRepo = new EmojiRepo;
@@ -68,7 +61,7 @@ void RocketChatServerData::init()
     mDdpApi->moveToThread( QThread::currentThread() );
     mUsername = mStorage->getUserName();
 
-    mChannels = new ChannelRepository( channelsModel, channelsModel, groupsModel, mMessagesModel );
+    mChannels = new ChannelRepository( );
 
     RocketChatServerConfig::init();
 
@@ -94,7 +87,7 @@ void RocketChatServerData::init()
 
     loadEmojis();
     //mMessageService = new MessageService( mStorage, this, mEmojisMap );
-    mMessageService = new MessageService( mStorage, this, mEmojiRepo, &mMessagesModel );
+    mMessageService = new MessageService( mStorage, this, mEmojiRepo );
 
     mChannelService = new RocketChatChannelService( this, mMessageService );
     mChannelService->setDdp( mDdpApi );
@@ -103,9 +96,9 @@ void RocketChatServerData::init()
     connect( mChannelService, &RocketChatChannelService::channelsLoaded, this, &RocketChatServerData::onChannelsLoaded, Qt::UniqueConnection );
     connect( mChannelService, &RocketChatChannelService::usersLoaded, this, &RocketChatServerData::onUsersLoaded, Qt::UniqueConnection );
     connect( mChannelService, &RocketChatChannelService::directChannelReady, this, &RocketChatServerData::switchChannelByRid, Qt::UniqueConnection );
-    connect( &channelsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
-    connect( &directModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
-    connect( &groupsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
+    connect( channelsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
+    connect( directModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
+    connect( groupsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection );
 
 
     QString lastServer = mStorage->getSetting( QStringLiteral( "currentServer" ) );
@@ -459,7 +452,7 @@ void RocketChatServerData::onUsersLoaded( const QString &pChannelId, const QVect
             for ( const auto &user : pUserList ) {
                 if ( !user.isNull() ) {
                     channel->addUser( user );
-                    userModel.insertUser( pChannelId, user );
+                    userModel->insertUser( pChannelId, user );
                 }
             }
         }
diff --git a/rocketchatserver.h b/rocketchatserver.h
index 6b090b8af435ceb6df521650c8620ec4c74eab33..a66cb86c8eed9ce8e0b8bfdeaa49a361d5510d66 100755
--- a/rocketchatserver.h
+++ b/rocketchatserver.h
@@ -111,14 +111,8 @@ class RocketChatServerData : public QObject
 
         Q_OBJECT
     public:
-        RocketChatServerData( const QString &pId,  QString pBaseUrl,
-                              QString pApiUri,
-                              UserModel &pUserModel,
-                              ChannelModel &channelModel,
-                              ChannelModel &groupsModel,
-                              ChannelModel &directModel,
-                              MessagesModel &messagesModel,
-                              LoginMethodsModel &loginMethodsModel );
+        RocketChatServerData( const QString &pId, QString pBaseUrl,
+                              QString pApiUri);
 
         void setServerId( const QString &pValue );
 
@@ -279,12 +273,11 @@ class RocketChatServerData : public QObject
         QMap<QString, FileUploader *> mFileUploads;
         QString mCurrentChannel;
         QMutex mUnsentMutex;
-        UserModel &userModel;
-        ChannelModel &channelsModel;
-        ChannelModel &groupsModel;
-        ChannelModel &directModel;
-        MessagesModel &mMessagesModel;
-        LoginMethodsModel &loginMethodsModel;
+        UserModel *userModel;
+        ChannelModel *channelsModel;
+        ChannelModel *groupsModel;
+        ChannelModel *directModel;
+        LoginMethodsModel *loginMethodsModel;
         std::function<void ( QMultiMap<QString, QSharedPointer<RocketChatMessage>> *messages )> historyLoaded;
         QString mPendingSwitchRoomRequest;
 
diff --git a/services/messageservice.cpp b/services/messageservice.cpp
index a5bfaf813df2a2486019f993b5c6ddbea1c1475c..c441e85107b19604bd6b5db2e2f44595a1367224 100644
--- a/services/messageservice.cpp
+++ b/services/messageservice.cpp
@@ -34,8 +34,7 @@
 
 MessageService::MessageService( PersistanceLayer *pPersistanceLayer,
                                 RocketChatServerData *pServer,
-                                EmojiRepo *pEmojiRepo,
-                                MessagesModel *pMessagesModel ): mEmojiRepo( pEmojiRepo ), mMessagesModel( pMessagesModel )
+                                EmojiRepo *pEmojiRepo): mEmojiRepo( pEmojiRepo ), mMessagesModel( Models::getMessagesModel() )
 {
     this->mPersistanceLayer = pPersistanceLayer;
     this->mServer = pServer;
diff --git a/services/messageservice.h b/services/messageservice.h
index cff2513e511f3e2101fc92299f0c787206ad0086..56c84f6188b7f4a21149ebd06ed23a80ed2b097e 100644
--- a/services/messageservice.h
+++ b/services/messageservice.h
@@ -50,7 +50,7 @@ class MessageService : public QObject
         Q_OBJECT
     public:
         // MessageService(PersistanceLayer *pPersistanceLayer, RocketChatServerData* pServer,QHash<QString, QString> &pEmojisMap);
-        MessageService( PersistanceLayer *pPersistanceLayer, RocketChatServerData *pServer, EmojiRepo *mEmojiRepo, MessagesModel *pMessagesModel );
+        MessageService( PersistanceLayer *pPersistanceLayer, RocketChatServerData *pServer, EmojiRepo *mEmojiRepo );
         void loadHistory( QSharedPointer<LoadHistoryServiceRequest> );
         void checkForMissingMessages( QSharedPointer<LoadMissedMessageServiceRequest> pRequest );
         void sendMessage( QSharedPointer<RocketChatMessage> pMessage );
@@ -59,6 +59,7 @@ class MessageService : public QObject
         QSharedPointer<RocketChatMessage> parseMessage( const QJsonObject &pMessage, bool linkify = true );
         void addUserToBlockList( const QString &pId );
         void addChannelToBlockList( const QString &pId );
+        void searchMessage(const QString &pTerm, const QString &pRoom);
     protected:
         const static int mExpectedSize = 50;
         PersistanceLayer *mPersistanceLayer;