diff --git a/HanoiTowers/Server/hanoiserver.cpp b/HanoiTowers/Server/hanoiserver.cpp
index 5f1413c..2ac9c81 100644
--- a/HanoiTowers/Server/hanoiserver.cpp
+++ b/HanoiTowers/Server/hanoiserver.cpp
@@ -129,7 +129,7 @@ bool HanoiServer::workWirthUserData(const UserData *obj,
         return false;
     }
 
-    return sendData(userData.data(), sender->networkAddress());
+    return sendData(userData.data(), sender->networkAddress(), oldHeader);
 }
 
 void HanoiServer::updateUserInWorld(const UserData *data) {
diff --git a/HanoiTowers/client/backEnd.cpp b/HanoiTowers/client/backEnd.cpp
index 15d8005..98c4872 100644
--- a/HanoiTowers/client/backEnd.cpp
+++ b/HanoiTowers/client/backEnd.cpp
@@ -45,7 +45,7 @@ BackEnd::BackEnd(QQmlApplicationEngine *engine):
     _recordsTable   = new RecordListModel(this);
     _world          = new RecordListModel(this);
 
-    _imageProvider = new HanoiImageProvider(&_profile);
+    _imageProvider = new HanoiImageProvider(_client->getUsersCache());
     _dataConverter = new DataConverter;
 
     _loginModel->setComponents(LoginView::Nickname |
@@ -321,7 +321,7 @@ void BackEnd::setNewAvatar(QString pathToAvatar) {
     img.save(&buf, "PNG");
     buf.close();
 
-    _profile.setAvatar(arr);
+    _client->setNewAvatar(_profile.getId().toString(), arr);
 
 }
 
diff --git a/HanoiTowers/client/dataconverter.cpp b/HanoiTowers/client/dataconverter.cpp
index ba6cc4b..421bbbc 100644
--- a/HanoiTowers/client/dataconverter.cpp
+++ b/HanoiTowers/client/dataconverter.cpp
@@ -54,6 +54,20 @@ QSharedPointer<UserData> DataConverter::toUserDataPtr(const LocalUser &input) {
     return result;
 }
 
+QSharedPointer<LocalUser> DataConverter::toLocalUser(const QSharedPointer<UserData> &input) {
+    return toLocalUser(*input.data());
+}
+
+QSharedPointer<LocalUser> DataConverter::toLocalUser(const UserData &input) {
+    auto result = QSharedPointer<LocalUser>::create();
+    result->setId(input.getId());
+    result->setUpdateTime(input.updateTime());
+    result->setUserData(input.userData());
+    result->setToken(input.getSignToken());
+
+    return result;
+}
+
 QH::PKG::UserMember DataConverter::toUserMember(const QSharedPointer<LocalUser> &input) {
     return toUserMember(*input.data());
 }
diff --git a/HanoiTowers/client/dataconverter.h b/HanoiTowers/client/dataconverter.h
index 502cc8e..6577421 100644
--- a/HanoiTowers/client/dataconverter.h
+++ b/HanoiTowers/client/dataconverter.h
@@ -27,6 +27,9 @@ public:
     static QSharedPointer<UserData> toUserDataPtr(const QSharedPointer<LocalUser>& input);
     static QSharedPointer<UserData> toUserDataPtr(const LocalUser& input);
 
+    static QSharedPointer<LocalUser> toLocalUser(const QSharedPointer<UserData>& input);
+    static QSharedPointer<LocalUser> toLocalUser(const UserData& input);
+
     static QH::PKG::UserMember toUserMember(const QSharedPointer<LocalUser>& input);
     static QH::PKG::UserMember toUserMember(const LocalUser& input);
 
diff --git a/HanoiTowers/client/hanoiclient.cpp b/HanoiTowers/client/hanoiclient.cpp
index 0b03049..bd19cd6 100644
--- a/HanoiTowers/client/hanoiclient.cpp
+++ b/HanoiTowers/client/hanoiclient.cpp
@@ -159,13 +159,18 @@ bool HanoiClient::isOnlineAndLoginned(const QSharedPointer<LocalUser> &data) {
 
 }
 
+void HanoiClient::updateLocalCache(const QSharedPointer<LocalUser>& localUser) {
+    _usersCache[localUser->getId().toString()] = localUser;
+
+    emit userDataChanged(localUser);
+
+}
+
 bool HanoiClient::workWithUserData(const QSharedPointer<UserData>& obj) {
     auto userId = getMember().getId();
 
-    QSharedPointer<LocalUser> localUser;
-
     if (userId == obj->getId()) {
-        localUser = getLocalUser(obj->getId().toString());
+        QSharedPointer<LocalUser> localUser = getLocalUser(obj->getId().toString());
 
         if (obj->updateTime() > localUser->updateTime()) {
             localUser->setUserData(obj->userData());
@@ -178,18 +183,21 @@ bool HanoiClient::workWithUserData(const QSharedPointer<UserData>& obj) {
                         QmlNotificationService::NotificationData::Normal);
 
         }
+
+        emit userDataChanged(localUser);
+
     } else {
-        localUser = QSharedPointer<LocalUser>::create();
-        localUser->setUserData(obj->userData());
-        _usersCache[obj->getId().toString()] = localUser;
+        updateLocalCache(DataConverter::toLocalUser(obj));
     }
 
-    emit userDataChanged(localUser);
-
-
     return true;
 }
 
+const QHash<QString, QSharedPointer<LocalUser>>*
+HanoiClient::getUsersCache() const {
+    return &_usersCache;
+}
+
 bool HanoiClient::setNewAvatar(const QString &userId, const QByteArray &image) {
 
     auto profile = LocalUser();
@@ -204,6 +212,7 @@ bool HanoiClient::setNewAvatar(const QString &userId, const QByteArray &image) {
         }
 
         obj->setAvatar(image);
+        updateLocalCache(obj);
 
         if (isOnlineAndLoginned(obj)) {
             return sendUserData(DataConverter::toUserDataPtr(obj));
@@ -224,6 +233,9 @@ bool HanoiClient::subscribeToWorld() {
 }
 
 bool HanoiClient::getUserData(const QString& userId) {
+    if (userId.isEmpty())
+        return false;
+
     if (_usersCache.contains(userId)) {
         emit userDataChanged(_usersCache[userId]);
         return true;
@@ -270,6 +282,8 @@ bool HanoiClient::setProfile(const QString &userId,
         *selectedProfileData = user;
     }
 
+    _usersCache[user->getId().toString()] = user;
+
     emit userDataChanged(user);
     resetUser();
 
@@ -278,6 +292,7 @@ bool HanoiClient::setProfile(const QString &userId,
         login(userMember);
     }
 
+
     return true;
 }
 
diff --git a/HanoiTowers/client/hanoiclient.h b/HanoiTowers/client/hanoiclient.h
index feb71fb..bbc769e 100644
--- a/HanoiTowers/client/hanoiclient.h
+++ b/HanoiTowers/client/hanoiclient.h
@@ -64,6 +64,13 @@ public:
      */
     bool getUserData(const QString &userId);
 
+    /**
+     * @brief getUsersCache return a pointer to the cache of users.
+     * @return
+     */
+    const QHash<QString, QSharedPointer<LocalUser> >*
+    getUsersCache() const;
+
 protected:
     QStringList SQLSources() const override;
     QH::HostAddress serverAddress() const override;
@@ -89,6 +96,7 @@ private:
     bool isOnlineAndLoginned(const QSharedPointer<LocalUser>& data);
 
     bool workWithUserData(const QSharedPointer<UserData> & userData);
+    void updateLocalCache(const QSharedPointer<LocalUser> &localUser);
 
     QHash<QString, QSharedPointer<LocalUser>> _usersCache;
     QSharedPointer<WorldClient> _world;
diff --git a/HanoiTowers/client/hanoiimageprovider.cpp b/HanoiTowers/client/hanoiimageprovider.cpp
index fa6da05..a06b418 100644
--- a/HanoiTowers/client/hanoiimageprovider.cpp
+++ b/HanoiTowers/client/hanoiimageprovider.cpp
@@ -12,13 +12,13 @@
 #include <QThread>
 #include <QThreadPool>
 
-HanoiImageProvider::HanoiImageProvider(const LocalUser *user) {
+HanoiImageProvider::HanoiImageProvider(const QHash<QString, QSharedPointer<LocalUser> > *cache) {
     _pool = new QThreadPool();
-    _currentUser = user;
+    _cache = cache;
 }
 
 void HanoiImageProvider::stop() {
-    _currentUser = nullptr;
+    _cache = nullptr;
 }
 
 HanoiImageProvider::~HanoiImageProvider() {
@@ -28,15 +28,15 @@ HanoiImageProvider::~HanoiImageProvider() {
 QQuickImageResponse *HanoiImageProvider::requestImageResponse(const QString &id,
                                                               const QSize &requestedSize) {
 
-    AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize, _currentUser);
+    AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize, _cache);
     _pool->start(response);
     return response;
 
 }
 
 AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize,
-                                       const LocalUser *client)
-    : m_id(id), m_requestedSize(requestedSize), m_texture(0), _currentUser(client) {
+                                       const QHash<QString, QSharedPointer<LocalUser> > *cache)
+    : m_id(id), m_requestedSize(requestedSize), m_texture(0), _cache(cache) {
     setAutoDelete(false);
 }
 
@@ -45,12 +45,18 @@ QQuickTextureFactory *AsyncImageResponse::textureFactory() const {
 }
 
 void AsyncImageResponse::run() {
-    if (!_currentUser) {
+    if (!_cache) {
         emit finished();
         return;
     }
 
-    QByteArray imageData = _currentUser->avatarData();
+    auto ids = m_id.split(":");
+    QByteArray imageData;
+
+    if (ids.size() && _cache->contains(ids[0])) {
+        imageData = _cache->value(ids[0])->avatarData();
+
+    }
 
     QImage image;
     if (imageData.size()) {
diff --git a/HanoiTowers/client/hanoiimageprovider.h b/HanoiTowers/client/hanoiimageprovider.h
index 30ec6e8..3aa978f 100644
--- a/HanoiTowers/client/hanoiimageprovider.h
+++ b/HanoiTowers/client/hanoiimageprovider.h
@@ -17,7 +17,9 @@ class LocalUser;
 class AsyncImageResponse : public QQuickImageResponse, public QRunnable
 {
     public:
-        AsyncImageResponse(const QString &id, const QSize &requestedSize, const LocalUser *client);
+        AsyncImageResponse(const QString &id,
+                           const QSize &requestedSize,
+                           const QHash<QString, QSharedPointer<LocalUser>>* cache);
 
         QQuickTextureFactory *textureFactory() const override;
 
@@ -28,14 +30,14 @@ class AsyncImageResponse : public QQuickImageResponse, public QRunnable
         QQuickTextureFactory *m_texture;
 
 private:
-        const LocalUser *_currentUser = nullptr;
+        const QHash<QString, QSharedPointer<LocalUser>>* _cache = nullptr;
 };
 
 
 class HanoiImageProvider: public QQuickAsyncImageProvider
 {
 public:
-    HanoiImageProvider(const LocalUser *user);
+    HanoiImageProvider(const QHash<QString, QSharedPointer<LocalUser>> *cache);
     void stop();
     ~HanoiImageProvider() override;
 
@@ -43,7 +45,7 @@ public:
 
 private:
     QThreadPool *_pool = nullptr;
-    const LocalUser *_currentUser = nullptr;
+    const QHash<QString, QSharedPointer<LocalUser>>* _cache = nullptr;
 };
 
 #endif // HANOIIMAGEPROVIDER_H
diff --git a/HanoiTowers/client/languages/en.ts b/HanoiTowers/client/languages/en.ts
index 78bfb97..feeba87 100644
--- a/HanoiTowers/client/languages/en.ts
+++ b/HanoiTowers/client/languages/en.ts
@@ -191,7 +191,7 @@
         <translation>Local user accept new data from the server.</translation>
     </message>
     <message>
-        <location filename="../hanoiclient.cpp" line="352"/>
+        <location filename="../hanoiclient.cpp" line="363"/>
         <source>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</source>
         <translation>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</translation>
     </message>
diff --git a/HanoiTowers/client/languages/ja.ts b/HanoiTowers/client/languages/ja.ts
index 95ea1fa..37551fb 100644
--- a/HanoiTowers/client/languages/ja.ts
+++ b/HanoiTowers/client/languages/ja.ts
@@ -202,7 +202,7 @@
         <translation>ローカルユーザはサーバからNBEWデータを受け入れます。</translation>
     </message>
     <message>
-        <location filename="../hanoiclient.cpp" line="352"/>
+        <location filename="../hanoiclient.cpp" line="363"/>
         <source>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</source>
         <translation>内部エラー、サーバーが無効なデータを送信し、このデータをローカルデータベースに保存することはできません。</translation>
     </message>
diff --git a/HanoiTowers/client/languages/ru.ts b/HanoiTowers/client/languages/ru.ts
index 235cc0f..e289a0e 100644
--- a/HanoiTowers/client/languages/ru.ts
+++ b/HanoiTowers/client/languages/ru.ts
@@ -202,7 +202,7 @@
         <translation>Локальный пользователь принял новые данные с сервера.</translation>
     </message>
     <message>
-        <location filename="../hanoiclient.cpp" line="352"/>
+        <location filename="../hanoiclient.cpp" line="363"/>
         <source>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</source>
         <translation>Внутренняя ошибка, сервер отправил неверные данные, и эти данные не могут быть сохранены в локальной базе данных.</translation>
     </message>
diff --git a/HanoiTowers/client/languages/tr.ts b/HanoiTowers/client/languages/tr.ts
index cd14148..0b6c10f 100644
--- a/HanoiTowers/client/languages/tr.ts
+++ b/HanoiTowers/client/languages/tr.ts
@@ -203,7 +203,7 @@ Bu seviye için minimum adımlar: %2</translation>
         <translation>yerel kullanıcı sunucudan yeni verileri kabul eder.</translation>
     </message>
     <message>
-        <location filename="../hanoiclient.cpp" line="352"/>
+        <location filename="../hanoiclient.cpp" line="363"/>
         <source>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</source>
         <translation>Dahili Hata, sunucu geçersiz veri gönderdi ve bu veriler yerel veritabanına kaydedilemez.</translation>
     </message>
diff --git a/HanoiTowers/client/languages/ua.ts b/HanoiTowers/client/languages/ua.ts
index 72f88f4..d94617c 100644
--- a/HanoiTowers/client/languages/ua.ts
+++ b/HanoiTowers/client/languages/ua.ts
@@ -203,7 +203,7 @@
         <translation>локальний користувач приймає нові дані з сервера.</translation>
     </message>
     <message>
-        <location filename="../hanoiclient.cpp" line="352"/>
+        <location filename="../hanoiclient.cpp" line="363"/>
         <source>Internal Error, server send invalid data, and this data can&apos;t be saved into local database.</source>
         <translation>Внутрішня помилка, сервер надсилає недійсні дані, і ці дані не можна зберегти в локальній базі даних.</translation>
     </message>
diff --git a/HanoiTowers/client/localuser.cpp b/HanoiTowers/client/localuser.cpp
index b20affc..440b1ff 100644
--- a/HanoiTowers/client/localuser.cpp
+++ b/HanoiTowers/client/localuser.cpp
@@ -163,6 +163,8 @@ ProfileData *LocalUser::userData() {
 
 void LocalUser::setUserData(const ProfileData &userData) {
     _userData = userData;
+    _avatarHash = qHash(_userData._avatar);
+
 }
 
 QH::AccessToken LocalUser::token() const {
@@ -205,11 +207,13 @@ void LocalUser::setRecord(int record) {
 }
 
 void LocalUser::setAvatar(const QByteArray& avatar) {
-    if (_userData._avatar == avatar)
+    auto hash = qHash(avatar);
+
+    if (_avatarHash == hash)
         return;
 
     _userData._avatar = avatar;
-    _avatarHash = qHash(avatar);
+    _avatarHash = hash;
     emit avatarChanged(_avatarHash);
 
 }
diff --git a/HanoiTowers/client/menu/UserView.qml b/HanoiTowers/client/menu/UserView.qml
index bd74bf2..69a7194 100644
--- a/HanoiTowers/client/menu/UserView.qml
+++ b/HanoiTowers/client/menu/UserView.qml
@@ -22,7 +22,7 @@ GridLayout {
         Layout.rowSpan: 1
         Image {
             id: userAvatar
-            source: "image://HanoiImages/" + ((userModel)? userModel.avatarHash: "")
+            source: "image://HanoiImages/" + ((userModel)? userModel.userId + ":" + userModel.avatarHash: "")
             anchors.fill: parent
 
             fillMode: Image.PreserveAspectFit
diff --git a/HanoiTowers/client/menu/World.qml b/HanoiTowers/client/menu/World.qml
index 4754f78..d422062 100644
--- a/HanoiTowers/client/menu/World.qml
+++ b/HanoiTowers/client/menu/World.qml
@@ -46,6 +46,10 @@ Item {
         id: privateRoot
 
         function showUser(id) {
+            if (backEnd)
+                backEnd.selectUserFromWorldTable(id);
+
+            preview.open()
 
         }
     }
diff --git a/Heart b/Heart
index ec8c160..7b4fab5 160000
--- a/Heart
+++ b/Heart
@@ -1 +1 @@
-Subproject commit ec8c160ed3dc6dda9f88a564279b8fa97db6d936
+Subproject commit 7b4fab59425e740d0deabcf4fe95dec6c094146d
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
index d2b6d1c..3912adf 100644
--- a/snap/snapcraft.yaml
+++ b/snap/snapcraft.yaml
@@ -26,12 +26,8 @@ parts:
       - libasn1-8-heimdal
       - libgssapi3-heimdal
       - libldap-2.4-2
-    after: [libsgl, hanoi-tower-wrapper, qtlib]
+    after: [libsgl, qtlib]
     
-    
-  hanoi-tower-wrapper:
-    plugin: dump
-    source: QtNetworkProtocol/QuasarAppLib/Etalons/snap/wrapper
   
   qtlib:
     plugin: dump