diff --git a/.ci/app.rc b/.ci/app.rc
index 92f6518..8a785d2 100644
--- a/.ci/app.rc
+++ b/.ci/app.rc
@@ -24,7 +24,7 @@ BEGIN
             VALUE   "FileDescription",  "gta5view"
             VALUE   "FileVersion",      "MAJOR_VER.MINOR_VER.PATCH_VERSTR_BUILD_VER"
             VALUE   "InternalName",     "gta5view"
-            VALUE   "LegalCopyright",   "Copyright � 2016-2021 Syping"
+            VALUE   "LegalCopyright",   "Copyright � 2016-2023 Syping"
             VALUE   "OriginalFilename", "gta5view.exe"
             VALUE   "ProductName",      "gta5view"
             VALUE   "ProductVersion",   "MAJOR_VER.MINOR_VER.PATCH_VERSTR_BUILD_VER"
diff --git a/.ci/donate.txt b/.ci/donate.txt
index ab58641..407130d 100644
--- a/.ci/donate.txt
+++ b/.ci/donate.txt
@@ -1 +1 @@
-btc:187NSQSPzdMpQDGhxZAuw4AhZ7LgoAPV7D,eth:0x19d71DfCa86104d37a13D3c5d419936421CDC569,ltc:LKr6yvBoMMGmcxViS8Kc1A2sDjVSWTXn4m,xmr:43TB3ZMP5nk1pu5EQXRGPzdTKvmFEBGgccX3tNhRknLLiUYQ7z7dNedVHEA6WrWdByZv1isvFmjSGhCF7ddx3eRxFdm5Fzz,zec:t1SpfDKj6qGZFwyRdzJBw9w2PTj8rUixZGh
\ No newline at end of file
+btc:187NSQSPzdMpQDGhxZAuw4AhZ7LgoAPV7D,eth:0x19d71DfCa86104d37a13D3c5d419936421CDC569,ltc:LKr6yvBoMMGmcxViS8Kc1A2sDjVSWTXn4m,xmr:43TB3ZMP5nk1pu5EQXRGPzdTKvmFEBGgccX3tNhRknLLiUYQ7z7dNedVHEA6WrWdByZv1isvFmjSGhCF7ddx3eRxFdm5Fzz
\ No newline at end of file
diff --git a/.ci/gta5view.nsi b/.ci/gta5view.nsi
index ee89b81..1ddd882 100644
--- a/.ci/gta5view.nsi
+++ b/.ci/gta5view.nsi
@@ -4,8 +4,8 @@
 !define APP_EXT ".g5e"
 !define COMP_NAME "Syping"
 !define WEB_SITE "https://gta5view.syping.de/"
-!define VERSION "1.10.1.0"
-!define COPYRIGHT "Copyright © 2016-2021 Syping"
+!define VERSION "1.10.2.0"
+!define COPYRIGHT "Copyright © 2016-2022 Syping"
 !define DESCRIPTION "Open Source Snapmatic and Savegame viewer/editor for GTA V"
 !define INSTALLER_NAME "gta5view_setup.exe"
 !define MAIN_APP_EXE "gta5view.exe"
diff --git a/.flatpak/de.syping.gta5view.yaml b/.flatpak/de.syping.gta5view.yaml
index 2e6fa1d..c9a9775 100644
--- a/.flatpak/de.syping.gta5view.yaml
+++ b/.flatpak/de.syping.gta5view.yaml
@@ -1,6 +1,6 @@
 app-id: de.syping.gta5view
 runtime: org.kde.Platform
-runtime-version: '5.15'
+runtime-version: '5.15-21.08'
 sdk: org.kde.Sdk
 command: gta5view
 finish-args:
diff --git a/.travis.yml b/.travis.yml
index 2a04b89..f6c3397 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,7 +5,7 @@ language: cpp
 
 services:
   - docker
-  
+
 env:
   global:
     - BUILD_TYPE=REL
@@ -22,22 +22,12 @@ matrix:
     - BUILD_SCRIPT=windows_docker.sh
     - QT_SELECT=qt5-x86_64-w64-mingw32
     - RELEASE_LABEL="Windows 64-Bit Portable"
-  - env:
-    - BUILD_SCRIPT=windows_docker.sh
-    - QT_SELECT=qt5-x86_64-w64-mingw32
-    - RELEASE_LABEL="Windows 64-Bit Portable for gta5-mods"
-    - PACKAGE_CODE=gta5-mods
-  - env:
-    - BUILD_SCRIPT=windows_docker.sh
-    - QT_SELECT=qt5-x86_64-w64-mingw32
-    - RELEASE_LABEL="Windows 64-Bit Portable for gtainside"
-    - PACKAGE_CODE=gtainside
   - env:
     - BUILD_SCRIPT=wininstall_docker.sh
     - QT_SELECT=qt5-x86_64-w64-mingw32
     - RELEASE_LABEL="Windows 64-Bit Installer"
   - os: osx
-    osx_image: xcode10.3
+    osx_image: xcode14.2
     env:
         - BUILD_SCRIPT=osx_ci.sh
         - RELEASE_LABEL="Mac OS X 64-Bit Disk Image"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6d748c3..dbd21a8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,7 +38,7 @@ if(APPLE)
         res/gta5view.icns
     )
     set(MACOSX_BUNDLE_BUNDLE_NAME gta5view)
-    set(MACOSX_BUNDLE_BUNDLE_VERSION 1.10.0)
+    set(MACOSX_BUNDLE_BUNDLE_VERSION 1.10.2)
     set(MACOSX_BUNDLE_ICON_FILE gta5view.icns)
     set(MACOSX_BUNDLE_GUI_IDENTIFIER de.syping.gta5view)
     set_source_files_properties(res/gta5view.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
diff --git a/ImportDialog.cpp b/ImportDialog.cpp
index 61f3e50..594cbf8 100644
--- a/ImportDialog.cpp
+++ b/ImportDialog.cpp
@@ -1,6 +1,6 @@
 /*****************************************************************************
 * gta5view Grand Theft Auto V Profile Viewer
-* Copyright (C) 2017-2021 Syping
+* Copyright (C) 2017-2022 Syping
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -111,8 +111,12 @@ ImportDialog::ImportDialog(QString profileName, QWidget *parent) :
     ui->vlButtom->setSpacing(6 * screenRatio);
 #ifndef Q_OS_MAC
     ui->vlButtom->setContentsMargins(9 * screenRatio, 6 * screenRatio, 9 * screenRatio, 9 * screenRatio);
+#else
+#if QT_VERSION >= 0x060000
+    if (QApplication::style()->objectName() == "macos") {
 #else
     if (QApplication::style()->objectName() == "macintosh") {
+#endif
         ui->vlButtom->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio);
     }
     else {
diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp
index 15d6559..d096383 100644
--- a/OptionsDialog.cpp
+++ b/OptionsDialog.cpp
@@ -282,6 +282,7 @@ void OptionsDialog::setupRadioButtons()
         case 0:
         case 20:
             ui->rbModern->setChecked(true);
+            ui->cbDoubleclick->setChecked(false);
             break;
         case 1:
         case 2:
@@ -291,11 +292,12 @@ void OptionsDialog::setupRadioButtons()
             break;
         case 10:
             ui->rbClassic->setChecked(true);
-#if QT_VERSION >= 0x050800
-            Q_FALLTHROUGH();
-#endif
+            ui->cbDoubleclick->setChecked(false);
+            break;
         case 11:
+            ui->rbClassic->setChecked(true);
             ui->cbDoubleclick->setChecked(true);
+            break;
         }
     }
 }
diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp
index 375069e..8eca40a 100644
--- a/ProfileInterface.cpp
+++ b/ProfileInterface.cpp
@@ -1,6 +1,6 @@
 /*****************************************************************************
 * gta5view Grand Theft Auto V Profile Viewer
-* Copyright (C) 2016-2021 Syping
+* Copyright (C) 2016-2022 Syping
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -124,8 +124,12 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre
 #ifndef Q_OS_MAC
     ui->hlButtons->setSpacing(6 * screenRatio);
     ui->hlButtons->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio);
+#else
+#if QT_VERSION >= 0x060000
+    if (QApplication::style()->objectName() == "macos") {
 #else
     if (QApplication::style()->objectName() == "macintosh") {
+#endif
         ui->hlButtons->setSpacing(6 * screenRatio);
         ui->hlButtons->setContentsMargins(9 * screenRatio, 15 * screenRatio, 15 * screenRatio, 17 * screenRatio);
     }
@@ -283,8 +287,16 @@ void ProfileInterface::directoryChanged(const QString &path)
         }
         if (fileName.startsWith("PGTA5") && !fileName.endsWith(".bak")) {
             t_snapmaticPics << fileName;
-            if (!snapmaticPics.contains(fileName)) {
-                n_snapmaticPics << fileName;
+            if (fileName.endsWith(".hidden")) {
+                const QString originalFileName = fileName.left(fileName.length() - 7);
+                if (!snapmaticPics.contains(fileName) && !snapmaticPics.contains(originalFileName)) {
+                    n_snapmaticPics << fileName;
+                }
+            }
+            else {
+                if (!snapmaticPics.contains(fileName) && !snapmaticPics.contains(fileName % ".hidden")) {
+                    n_snapmaticPics << fileName;
+                }
             }
         }
     }
@@ -1554,7 +1566,11 @@ void ProfileInterface::settingsApplied(int _contentMode, bool languageChanged)
 #ifdef Q_OS_MAC
     // DPI calculation
     qreal screenRatio = AppEnv::screenRatio();
+#if QT_VERSION >= 0x060000
+    if (QApplication::style()->objectName() == "macos") {
+#else
     if (QApplication::style()->objectName() == "macintosh") {
+#endif
         ui->hlButtons->setSpacing(6 * screenRatio);
         ui->hlButtons->setContentsMargins(9 * screenRatio, 15 * screenRatio, 15 * screenRatio, 17 * screenRatio);
     }
diff --git a/README.md b/README.md
index 3713ce2..8831699 100644
--- a/README.md
+++ b/README.md
@@ -14,36 +14,32 @@ Open Source Snapmatic and Savegame viewer/editor for GTA V
 #### Build gta5view for Windows
 
     # Note: Install Docker Community Edition and Git before continuing
-    git clone https://gitlab.com/Syping/gta5view && cd gta5view
     docker pull sypingauto/gta5view-build:1.10-static
-    docker run --rm -v "$PWD:/gta5view" -it sypingauto/gta5view-build:1.10-static
-    cd /gta5view && mkdir -p build && cd build
-    mingw64-qt-cmake ../
-    make -j $(nproc --all)
+    git clone https://gitlab.com/Syping/gta5view
+    docker run --rm -v "$PWD/gta5view:/gta5view" -it sypingauto/gta5view-build:1.10-static
+    mingw64-qt-cmake -B /gta5view/build /gta5view
+    cmake --build /gta5view/build
 
 #### Build gta5view for Debian/Ubuntu
 
     sudo apt-get install cmake git gcc g++ libqt5svg5-dev make qtbase5-dev qttranslations5-l10n
-    git clone https://gitlab.com/Syping/gta5view && cd gta5view
-    mkdir -p build && cd build
-    cmake ../
-    make -j $(nproc --all)
-    sudo make install
+    git clone https://gitlab.com/Syping/gta5view
+    cmake -B gta5view-build gta5view
+    cmake --build gta5view-build
+    sudo cmake --install gta5view-build
 
 #### Build gta5view for Arch/Manjaro
 
     sudo pacman -S cmake gcc git make qt5-base qt5-svg qt5-tools qt5-translations
-    git clone https://gitlab.com/Syping/gta5view && cd gta5view
-    mkdir -p build && cd build
-    cmake ../
-    make -j $(nproc --all)
-    sudo make install
+    git clone https://gitlab.com/Syping/gta5view
+    cmake -B gta5view-build gta5view
+    cmake --build gta5view-build
+    sudo cmake --install gta5view-build
 
-#### Build gta5view for Fedora
+#### Build gta5view for Fedora/RHEL
 
     sudo dnf install cmake git gcc gcc-c++ make qt5-qtbase-devel qt5-qtsvg-devel qt5-qttranslations
-    git clone https://gitlab.com/Syping/gta5view && cd gta5view
-    mkdir -p build && cd build
-    cmake ../
-    make -j $(nproc --all)
-    sudo make install
+    git clone https://gitlab.com/Syping/gta5view
+    cmake -B gta5view-build gta5view
+    cmake --build gta5view-build
+    sudo cmake --install gta5view-build
diff --git a/RagePhoto.cpp b/RagePhoto.cpp
index 5e2113a..ba03159 100644
--- a/RagePhoto.cpp
+++ b/RagePhoto.cpp
@@ -1,6 +1,6 @@
 /*****************************************************************************
 * gta5view Grand Theft Auto V Profile Viewer
-* Copyright (C) 2020-2021 Syping
+* Copyright (C) 2020-2022 Syping
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -22,12 +22,29 @@
 #include <QFile>
 #if QT_VERSION < 0x060000
 #include <QTextCodec>
+#else
+#include <QStringEncoder>
+#include <QStringDecoder>
 #endif
 #ifdef RAGEPHOTO_BENCHMARK
 #include <QFileInfo>
 #include <chrono>
 #endif
 
+inline quint32 joaatFromSI(const char *data, size_t size)
+{
+    quint32 val = 0xE47AB81CUL;
+    for (size_t i = 0; i != size; i++) {
+        val += data[i];
+        val += (val << 10);
+        val ^= (val >> 6);
+    }
+    val += (val << 3);
+    val ^= (val >> 11);
+    val += (val << 15);
+    return val;
+}
+
 RagePhoto::RagePhoto()
 {
     p_photoFormat = PhotoFormat::Undefined;
@@ -527,8 +544,15 @@ bool RagePhoto::setJsonData(const QByteArray &data)
     QJsonDocument t_jsonDocument = QJsonDocument::fromJson(data);
     if (t_jsonDocument.isNull())
         return false;
-    p_jsonData = t_jsonDocument.toJson(QJsonDocument::Compact);
     p_jsonObject = t_jsonDocument.object();
+    // serializer band-aid
+    QJsonObject t_jsonObject = p_jsonObject;
+    t_jsonObject["sign"] = "__gta5view.sign";
+    t_jsonDocument.setObject(t_jsonObject);
+    p_jsonData = t_jsonDocument.toJson(QJsonDocument::Compact);
+    char sign_char[24];
+    sprintf(sign_char, "%llu", (0x100000000000000ULL | joaatFromSI(p_photoData.constData(), p_photoData.size())));
+    p_jsonData.replace("\"__gta5view.sign\"", sign_char);
     return true;
 }
 
@@ -552,6 +576,8 @@ bool RagePhoto::setPhotoData(const QByteArray &data)
     if (size > p_photoBuffer)
         return false;
     p_photoData = data;
+    // serializer band-aid
+    setJsonData(p_jsonData);
     return true;
 }
 
@@ -560,6 +586,8 @@ bool RagePhoto::setPhotoData(const char *data, int size)
     if (static_cast<quint32>(size) > p_photoBuffer)
         return false;
     p_photoData = QByteArray(data, size);
+    // serializer band-aid
+    setJsonData(p_jsonData);
     return true;
 }
 
@@ -637,6 +665,9 @@ QByteArray RagePhoto::save(PhotoFormat photoFormat)
 
 void RagePhoto::save(QIODevice *ioDevice, PhotoFormat photoFormat)
 {
+    // serializer band-aid
+    setJsonData(p_jsonData);
+
     if (photoFormat == PhotoFormat::G5EX) {
         char uInt32Buffer[4];
         quint32 format = static_cast<quint32>(PhotoFormat::G5EX);
diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp
index 3a0197b..c3664fd 100644
--- a/SnapmaticPicture.cpp
+++ b/SnapmaticPicture.cpp
@@ -34,6 +34,8 @@
 
 #if QT_VERSION < 0x060000
 #include <QTextCodec>
+#else
+#include <QStringDecoder>
 #endif
 
 #if QT_VERSION >= 0x050000
diff --git a/config.h b/config.h
index 98de378..6f96056 100644
--- a/config.h
+++ b/config.h
@@ -47,11 +47,11 @@
 #endif
 
 #ifndef GTA5SYNC_COPYRIGHT
-#define GTA5SYNC_COPYRIGHT "2016-2021"
+#define GTA5SYNC_COPYRIGHT "2016-2023"
 #endif
 
 #ifndef GTA5SYNC_APPVER
-#define GTA5SYNC_APPVER "1.10.1"
+#define GTA5SYNC_APPVER "1.10.2"
 #endif
 
 #if __cplusplus
diff --git a/res/app.rc b/res/app.rc
index a0fd25d..56b1561 100644
--- a/res/app.rc
+++ b/res/app.rc
@@ -4,8 +4,8 @@ IDI_ICON1 ICON DISCARDABLE "5sync.ico"
 CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest"
 #include <windows.h>
 VS_VERSION_INFO     VERSIONINFO
-FILEVERSION         1, 10, 1, 0
-PRODUCTVERSION      1, 10, 1, 0
+FILEVERSION         1, 10, 2, 0
+PRODUCTVERSION      1, 10, 2, 0
 FILEFLAGSMASK       0x3fL
 FILEFLAGS           0
 FILEOS              VOS_NT_WINDOWS32
@@ -22,12 +22,12 @@ BEGIN
         BEGIN
             VALUE   "CompanyName",      "Syping"
             VALUE   "FileDescription",  "gta5view"
-            VALUE   "FileVersion",      "1.10.1"
+            VALUE   "FileVersion",      "1.10.2"
             VALUE   "InternalName",     "gta5view"
-            VALUE   "LegalCopyright",   "Copyright � 2016-2021 Syping"
+            VALUE   "LegalCopyright",   "Copyright � 2016-2023 Syping"
             VALUE   "OriginalFilename", "gta5view.exe"
             VALUE   "ProductName",      "gta5view"
-            VALUE   "ProductVersion",   "1.10.1"
+            VALUE   "ProductVersion",   "1.10.2"
         END
     END
 END
diff --git a/res/de.syping.gta5view.metainfo.xml b/res/de.syping.gta5view.metainfo.xml
index 9bc50a1..c5ab767 100644
--- a/res/de.syping.gta5view.metainfo.xml
+++ b/res/de.syping.gta5view.metainfo.xml
@@ -34,6 +34,7 @@
     <developer_name>Syping</developer_name>
 
     <releases>
+        <release date="2023-03-15" version="1.10.2"/>
         <release date="2021-06-17" version="1.10.1"/>
         <release date="2021-05-27" version="1.10.0"/>
         <release date="2021-03-22" version="1.9.2"/>
diff --git a/res/donate.qrc b/res/donate.qrc
index fcad17d..e4a0005 100644
--- a/res/donate.qrc
+++ b/res/donate.qrc
@@ -8,8 +8,6 @@
         <file>ltc.svgz</file>
         <file>xmr.str</file>
         <file>xmr.svgz</file>
-        <file>zec.str</file>
-        <file>zec.svgz</file>
     </qresource>
     <qresource prefix="/img">
         <file>donate.svgz</file>
diff --git a/res/qt6/qtbase_de.qm b/res/qt6/qtbase_de.qm
index a108050..a0d2672 100644
Binary files a/res/qt6/qtbase_de.qm and b/res/qt6/qtbase_de.qm differ
diff --git a/res/zec.str b/res/zec.str
deleted file mode 100644
index b7160ff..0000000
--- a/res/zec.str
+++ /dev/null
@@ -1 +0,0 @@
-Zcash
\ No newline at end of file
diff --git a/res/zec.svgz b/res/zec.svgz
deleted file mode 100644
index a39853d..0000000
Binary files a/res/zec.svgz and /dev/null differ