diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..41f4538
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,27 @@
+# Auto detect text files and perform LF normalization
+* text=auto eol=lf
+
+# Development files
+*.cpp text eol=lf
+*.h text eol=lf
+*.ui text eol=lf
+*.qrc text eol=lf
+
+# Development resources
+*.ini text eol=lf
+
+# Linux development files
+*.desktop text eol=lf
+
+# Windows development files
+*.rc text eol=crlf
+*.exe.manifest text eol=crlf
+
+# Binary files
+*.png binary
+*.jpg binary
+*.qm binary
+*.ico binary
+*.icns binary
+*.xcf binary
+*.g5e binary
diff --git a/.travis.yml b/.travis.yml
index 5ea857e..0a356bb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ sudo: required
 language: cpp
 
 env:
-- PACKAGE_VERSION="1.4.0"
+- PACKAGE_VERSION="1.5.0"
 
 before_install:
   - test -n $CC  && unset CC
@@ -12,27 +12,42 @@ before_install:
 
 install:
   - sudo apt-get update -qq
-  - sudo apt-get install -qq checkinstall dpkg-dev g++ gcc qtbase5-dev qt5-qmake
+  - sudo apt-get install -qq checkinstall dpkg-dev g++ gcc qtbase5-dev qt5-qmake qttranslations5-l10n libqt4-dev
   
 before_script:
-  - export INSTALL_ROOT=/usr
   - if [ `git name-rev --tags --name-only $(git rev-parse HEAD)` == "undefined" ]; then export APPLICATION_VERSION="$PACKAGE_VERSION.$TRAVIS_BUILD_NUMBER"; else export APPLICATION_VERSION=`git name-rev --tags --name-only $(git rev-parse HEAD)`; fi
   - echo "gta5view build version is $APPLICATION_VERSION"
   - mkdir build
   - mkdir package
+  - chmod -x res/gta5sync_*.qm res/gta5view.desktop res/gta5view.png
   - cd build
+  - mkdir qt4
+  - cd qt4
   - echo "Grand Theft Auto V Snapmatic and Savegame viewer" > ./description-pak
+  - cd ..
+  - mkdir qt5
+  - cd qt5
+  - echo "Grand Theft Auto V Snapmatic and Savegame viewer" > ./description-pak
+  - cd ..
 
 script:
-  - qmake -qt=5 "DEFINES+=GTA5SYNC_BUILDTYPE=\\\\\\\"Release\\\\\\\"" "DEFINES+=GTA5SYNC_DAILYB=\\\\\\\"$APPLICATION_VERSION\\\\\\\"" ../gta5view.pro
+  - cd qt5
+  - qmake -qt=5 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$APPLICATION_VERSION\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro
   - make -j 4
-  - sudo checkinstall -D --default --nodoc --pkgname=gta5view --pkgversion=$APPLICATION_VERSION --pkgrelease=travis1 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>"  --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5 --pakdir=../package
+  - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view --pkgversion=$APPLICATION_VERSION --pkgrelease=travis1 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5,qttranslations5-l10n --conflicts=gta5view-qt4 --replaces=gta5view-qt4 --pakdir=../../package
+  - cd ..
+  - cd qt4
+  - qmake -qt=4 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$APPLICATION_VERSION\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro
+  - make -j 4
+  - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view-qt4 --pkgversion=$APPLICATION_VERSION --pkgrelease=travis1 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqtcore4,libqtgui4,libqt4-network,qtcore4-l10n --conflicts=gta5view --replaces=gta5view --pakdir=../../package
+  - cd ..
 
 deploy:
   provider: releases
   api_key:
     secure: "o7VneEz1aHfdVwZvOZLfopf6uJWNrFsZaBvunTmXFzpmNFhlNS1qwqgMUkIA2yBRbZ3wIzVs4vfwIHv7W9yE/PqK+AYL+R8+AwKGrwlgT4HqJNuk6VM/LNJ6GwT/qkQuaoOVw29bUjmzzgIRdHmw53SlJv6Hh1VE8HphlTT//aex6nCfcFhUZ0BETdZDWz5FSHwL3NalUoqfKfQrJeky5RXzCyCANQC2tKt0bV46GaWIgWrDo2KCTNqPtRWWf5GDmnkXE5IYRMQ3mXvO9iYh0v5Y2jo4PiXGUiFUU6Z3aAWFAiPdGclrBO697cf3lCTzDMhuCETR153qFYsLShUlFf61ITAmCeHAWETjZDri0lmPONo3GoNB6alGfYEA51qw14kXakrTpICtTJj7gw/gtUYOabW6hrzmieNzMBIy62RikDPjyakFnuwW2qNHRlD65e0jYv+6nCpb6E+OV16Ysh1zhV2vTfpfzVmSuyu2J+ELqXD3OZCXRSPpDIih9UQ8335p8FBji6jHORcgym/TRgdgRmENibh8tLzWp+UjpWHuWfcpvZgOskjfwU0iDMCayMJ7tDpOhXHcAhDRnd6XRIiOJ5YZCzflj2nEwmt3YUd7DwXS/AU+WHOmcNQBjXBxF/FJa35XXcy3HKJM5TTKqtph3medo30us5yXHeG6NNg="
-  file: "../package/gta5view_$APPLICATION_VERSION-travis1_amd64.deb"
+  file_glob: true
+  file: "../package/gta5view*.deb"
   skip_cleanup: true
   on:
     tags: true
diff --git a/AboutDialog.cpp b/AboutDialog.cpp
index a7bdb51..bf2d4ed 100755
--- a/AboutDialog.cpp
+++ b/AboutDialog.cpp
@@ -1,121 +1,125 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include <QStringBuilder>
-#include "AboutDialog.h"
-#include "ui_AboutDialog.h"
-#include "AppEnv.h"
-#include "config.h"
-
-AboutDialog::AboutDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::AboutDialog)
-{
-    // Set Window Flags
-    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
-
-    // Build Strings
-    QString appVersion = qApp->applicationVersion();
-    QString buildType = GTA5SYNC_BUILDTYPE;
-    buildType.replace("_", " ");
-    QString projectBuild = GTA5SYNC_BUILDDATETIME;
-    QString buildStr = GTA5SYNC_BUILDSTRING;
-
-    // Additional Content
-    QString usingStr = tr("Using %1 %2", "Exp. Using libmyfuck");
-    QString translatedByStr = tr("Translated by %1", "Exp. Translated by Syping");
-    QString translatedByVal = tr("NAME_OF_TRANSLATOR", "Your Name (The person behind your screen looking at this text!)");
-    QString translatorProfile = tr("TRANSLATOR_PROFILE", "mailto: http:// https:// Exp. https://github.com/Syping/");
-    QString additionalContent = "";
-    if (translatedByVal != "NAME_OF_TRANSLATOR")
-    {
-        if (translatorProfile != "TRANSLATOR_PROFILE")
-        {
-            additionalContent.append(translatedByStr.arg(QString("<a href=\"%1\">%2</a>").arg(translatorProfile, translatedByVal)));
-        }
-        else
-        {
-            additionalContent.append(translatedByStr.arg(translatedByVal));
-        }
-    }
-#ifdef WITH_LIBJPEGTURBO // DONT USE IT FOR NOW
-    bool additionalContentClip = false;
-    if (!additionalContent.isEmpty())
-    {
-        additionalContentClip = true;
-        additionalContent.append(" (");
-    }
-    additionalContent.append(usingStr.arg("libjpegturbo", WITH_LIBJPEGTURBO));
-    if (additionalContentClip)
-    {
-        additionalContent.append(")");
-    }
-#else
-    Q_UNUSED(usingStr)
-#endif
-
-    // Project Description
-#ifdef GTA5SYNC_ENABLED
-    QString projectDes = tr("A project for viewing and sync Grand Theft Auto V Snapmatic<br/>\nPictures and Savegames");
-#else
-    QString projectDes = tr("A project for viewing Grand Theft Auto V Snapmatic<br/>\nPictures and Savegames");
-#endif
-
-    // Copyright Description
-    QString copyrightDes1 = tr("Copyright &copy; <a href=\"%1\">%2</a> %3");
-    copyrightDes1 = copyrightDes1.arg(GTA5SYNC_APPVENDORLINK, GTA5SYNC_APPVENDOR, GTA5SYNC_COPYRIGHT);
-    QString copyrightDes2 = tr("%1 is licensed under <a href=\"https://www.gnu.org/licenses/gpl-3.0.html#content\">GNU GPLv3</a>");
-    copyrightDes2 = copyrightDes2.arg(GTA5SYNC_APPSTR);
-    QString copyrightDesA;
-    if (!additionalContent.isEmpty())
-    {
-        copyrightDesA = copyrightDes1 % "<br/>" % additionalContent % "<br/>" % copyrightDes2;
-    }
-    else
-    {
-        copyrightDesA = copyrightDes1 % "<br/>" % copyrightDes2;
-    }
-
-    // Setup User Interface
-    ui->setupUi(this);
-    aboutStr = ui->labAbout->text();
-    titleStr = this->windowTitle();
-    ui->labAbout->setText(aboutStr.arg(GTA5SYNC_APPSTR, projectDes, appVersion % " (" % buildType % ")", projectBuild, buildStr, qVersion(), copyrightDesA));
-    this->setWindowTitle(titleStr.arg(GTA5SYNC_APPSTR));
-
-    if (QIcon::hasThemeIcon("dialog-close"))
-    {
-        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
-    }
-
-    // DPI calculation
-    qreal screenRatio = AppEnv::screenRatio();
-    if (!additionalContent.isEmpty())
-    {
-        resize(375 * screenRatio, 270 * screenRatio);
-    }
-    else
-    {
-        resize(375 * screenRatio, 260 * screenRatio);
-    }
-}
-
-AboutDialog::~AboutDialog()
-{
-    delete ui;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include <QStringBuilder>
+#include "AboutDialog.h"
+#include "ui_AboutDialog.h"
+#include "AppEnv.h"
+#include "config.h"
+
+AboutDialog::AboutDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::AboutDialog)
+{
+    // Set Window Flags
+    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
+
+    // Build Strings
+    QString appVersion = qApp->applicationVersion();
+    QString buildType = tr(GTA5SYNC_BUILDTYPE);
+    buildType.replace("_", " ");
+    QString projectBuild = GTA5SYNC_BUILDDATETIME;
+    QString buildStr = GTA5SYNC_BUILDSTRING;
+
+    // Translator Comments
+    //: Using specific library, example Using libmyfuck
+    QString usingStr = tr("Using %1 %2");
+    //: Translated by translator, example Translated by Syping
+    QString translatedByStr = tr("Translated by %1");
+    //: Enter your name there
+    QString translatedByVal = tr("NAME_OF_TRANSLATOR");
+    //: Enter your proilfe there, example a GitHub profile, E-Mail with "mailto: afucker@sumfuck.com" or a webpage
+    QString translatorProfile = tr("TRANSLATOR_PROFILE");
+    QString additionalContent = "";
+    if (translatedByVal != "NAME_OF_TRANSLATOR")
+    {
+        if (translatorProfile != "TRANSLATOR_PROFILE")
+        {
+            additionalContent += translatedByStr.arg(QString("<a href=\"%1\">%2</a>").arg(translatorProfile, translatedByVal));
+        }
+        else
+        {
+            additionalContent += translatedByStr.arg(translatedByVal);
+        }
+    }
+#ifdef WITH_LIBJPEGTURBO // DONT USE IT FOR NOW
+    bool additionalContentClip = false;
+    if (!additionalContent.isEmpty())
+    {
+        additionalContentClip = true;
+        additionalContent += " (";
+    }
+    additionalContent += usingStr.arg("libjpegturbo", WITH_LIBJPEGTURBO);
+    if (additionalContentClip)
+    {
+        additionalContent += ")";
+    }
+#else
+    Q_UNUSED(usingStr)
+#endif
+
+    // Project Description
+#ifdef GTA5SYNC_ENABLED
+    QString projectDes = tr("A project for viewing and sync Grand Theft Auto V Snapmatic<br/>\nPictures and Savegames");
+#else
+    QString projectDes = tr("A project for viewing Grand Theft Auto V Snapmatic<br/>\nPictures and Savegames");
+#endif
+
+    // Copyright Description
+    QString copyrightDes1 = tr("Copyright &copy; <a href=\"%1\">%2</a> %3");
+    copyrightDes1 = copyrightDes1.arg(GTA5SYNC_APPVENDORLINK, GTA5SYNC_APPVENDOR, GTA5SYNC_COPYRIGHT);
+    QString copyrightDes2 = tr("%1 is licensed under <a href=\"https://www.gnu.org/licenses/gpl-3.0.html#content\">GNU GPLv3</a>");
+    copyrightDes2 = copyrightDes2.arg(GTA5SYNC_APPSTR);
+    QString copyrightDesA;
+    if (!additionalContent.isEmpty())
+    {
+        copyrightDesA = copyrightDes1 % "<br/>" % additionalContent % "<br/>" % copyrightDes2;
+    }
+    else
+    {
+        copyrightDesA = copyrightDes1 % "<br/>" % copyrightDes2;
+    }
+
+    // Setup User Interface
+    ui->setupUi(this);
+    aboutStr = ui->labAbout->text();
+    titleStr = this->windowTitle();
+    ui->labAbout->setText(aboutStr.arg(GTA5SYNC_APPSTR, projectDes, appVersion % " (" % buildType % ")", projectBuild, buildStr, qVersion(), copyrightDesA));
+    this->setWindowTitle(titleStr.arg(GTA5SYNC_APPSTR));
+
+    if (QIcon::hasThemeIcon("dialog-close"))
+    {
+        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+    }
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    if (!additionalContent.isEmpty())
+    {
+        resize(375 * screenRatio, 270 * screenRatio);
+    }
+    else
+    {
+        resize(375 * screenRatio, 260 * screenRatio);
+    }
+}
+
+AboutDialog::~AboutDialog()
+{
+    delete ui;
+}
diff --git a/AboutDialog.h b/AboutDialog.h
index ef78bd5..a160ae9 100755
--- a/AboutDialog.h
+++ b/AboutDialog.h
@@ -1,44 +1,44 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef ABOUTDIALOG_H
-#define ABOUTDIALOG_H
-
-#include <QDialog>
-
-namespace Ui {
-class AboutDialog;
-}
-
-class AboutDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit AboutDialog(QWidget *parent = 0);
-    ~AboutDialog();
-
-private slots:
-
-private:
-    Ui::AboutDialog *ui;
-    QString aboutStr;
-    QString titleStr;
-};
-
-#endif // ABOUTDIALOG_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef ABOUTDIALOG_H
+#define ABOUTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class AboutDialog;
+}
+
+class AboutDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit AboutDialog(QWidget *parent = 0);
+    ~AboutDialog();
+
+private slots:
+
+private:
+    Ui::AboutDialog *ui;
+    QString aboutStr;
+    QString titleStr;
+};
+
+#endif // ABOUTDIALOG_H
diff --git a/AboutDialog.ui b/AboutDialog.ui
index d44926d..9419485 100755
--- a/AboutDialog.ui
+++ b/AboutDialog.ui
@@ -1,102 +1,102 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AboutDialog</class>
- <widget class="QDialog" name="AboutDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>375</width>
-    <height>260</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>About %1</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlAbout">
-   <item>
-    <widget class="QLabel" name="labAbout">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="text">
-      <string>&lt;span style=&quot; font-weight:600;&quot;&gt;%1&lt;/span&gt;&lt;br/&gt;
-&lt;br/&gt;
-%2&lt;br/&gt;
-&lt;br/&gt;
-Version %3&lt;br/&gt;
-Created on %4&lt;br/&gt;
-Built with Qt %5&lt;br/&gt;
-Running with Qt %6&lt;br/&gt;
-&lt;br/&gt;
-%7</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-     </property>
-     <property name="wordWrap">
-      <bool>false</bool>
-     </property>
-     <property name="openExternalLinks">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="hlButtons">
-     <item>
-      <spacer name="hsButtons">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdClose">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>&amp;Close</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>cmdClose</sender>
-   <signal>clicked()</signal>
-   <receiver>AboutDialog</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>327</x>
-     <y>228</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>187</x>
-     <y>124</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AboutDialog</class>
+ <widget class="QDialog" name="AboutDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>375</width>
+    <height>260</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>About %1</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlAbout">
+   <item>
+    <widget class="QLabel" name="labAbout">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>&lt;span style=&quot; font-weight:600;&quot;&gt;%1&lt;/span&gt;&lt;br/&gt;
+&lt;br/&gt;
+%2&lt;br/&gt;
+&lt;br/&gt;
+Version %3&lt;br/&gt;
+Created on %4&lt;br/&gt;
+Built with Qt %5&lt;br/&gt;
+Running with Qt %6&lt;br/&gt;
+&lt;br/&gt;
+%7</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+     </property>
+     <property name="wordWrap">
+      <bool>false</bool>
+     </property>
+     <property name="openExternalLinks">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="hlButtons">
+     <item>
+      <spacer name="hsButtons">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdClose">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&amp;Close</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>cmdClose</sender>
+   <signal>clicked()</signal>
+   <receiver>AboutDialog</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>327</x>
+     <y>228</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>187</x>
+     <y>124</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/AppEnv.cpp b/AppEnv.cpp
index c1449f8..cab453a 100755
--- a/AppEnv.cpp
+++ b/AppEnv.cpp
@@ -1,155 +1,178 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "config.h"
-#include "AppEnv.h"
-#include "StringParser.h"
-#include "StandardPaths.h"
-#include <QtGlobal>
-#include <QDesktopWidget>
-#include <QApplication>
-#include <QSettings>
-#include <QScreen>
-#include <QDebug>
-#include <QRect>
-#include <QDir>
-#include <iostream>
-using namespace std;
-
-AppEnv::AppEnv()
-{
-
-}
-
-// Folder Stuff
-
-QString AppEnv::getGameFolder(bool *ok)
-{
-    QDir dir;
-    QString GTAV_FOLDER = QString::fromUtf8(qgetenv("GTAV_FOLDER"));
-    if (GTAV_FOLDER != "")
-    {
-        dir.setPath(GTAV_FOLDER);
-        if (dir.exists())
-        {
-            if (ok != NULL) *ok = true;
-            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
-            return dir.absolutePath();
-        }
-    }
-
-    QString GTAV_defaultFolder = StandardPaths::documentsLocation() + QDir::separator() + "Rockstar Games" + QDir::separator() + "GTA V";
-    QString GTAV_returnFolder = GTAV_defaultFolder;
-
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("dir");
-    bool forceDir = settings.value("force", false).toBool();
-    GTAV_returnFolder = settings.value("dir", GTAV_defaultFolder).toString();
-    settings.endGroup();
-
-    if (forceDir)
-    {
-        dir.setPath(GTAV_returnFolder);
-        if (dir.exists())
-        {
-            if (ok != 0) *ok = true;
-            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
-            return dir.absolutePath();
-        }
-    }
-
-    dir.setPath(GTAV_defaultFolder);
-    if (dir.exists())
-    {
-        if (ok != 0) *ok = true;
-        qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
-        return dir.absolutePath();
-    }
-
-    if (!forceDir)
-    {
-        dir.setPath(GTAV_returnFolder);
-        if (dir.exists())
-        {
-            if (ok != 0) *ok = true;
-            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
-            return dir.absolutePath();
-        }
-    }
-
-    if (ok != 0) *ok = false;
-    return "";
-}
-
-bool AppEnv::setGameFolder(QString gameFolder)
-{
-    QDir dir;
-    dir.setPath(gameFolder);
-    if (dir.exists())
-    {
-        qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
-        return true;
-    }
-    return false;
-}
-
-QString AppEnv::getLangFolder()
-{
-    return StringParser::convertBuildedString(QString::fromUtf8(GTA5SYNC_LANG));
-}
-
-QString AppEnv::getPluginsFolder()
-{
-    return StringParser::convertBuildedString(QString::fromUtf8(GTA5SYNC_PLUG));
-}
-
-// Web Stuff
-
-QByteArray AppEnv::getUserAgent()
-{
-    return QString("Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 %1/%2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER).toUtf8();
-}
-
-// QUrl AppEnv::getCrewFetchingUrl(QString crewID)
-// {
-//     return QUrl(QString("https://socialclub.rockstargames.com/reference/crewfeed/%1").arg(crewID));
-// }
-
-QUrl AppEnv::getCrewFetchingUrl(QString crewID)
-{
-    return QUrl(QString("https://socialclub.rockstargames.com/crew/%1/%1").arg(crewID));
-}
-
-QUrl AppEnv::getPlayerFetchingUrl(QString crewID, QString pageNumber)
-{
-    return QUrl(QString("https://socialclub.rockstargames.com/crewsapi/GetMembersList?crewId=%1&pageNumber=%2").arg(crewID, pageNumber));
-}
-
-qreal AppEnv::screenRatio()
-{
-#if QT_VERSION >= 0x050000
-    qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch();
-#else
-    qreal dpi = qApp->desktop()->logicalDpiX();
-#endif
-#ifdef Q_OS_MAC
-    return (dpi / 72);
-#else
-    return (dpi / 96);
-#endif
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "config.h"
+#include "AppEnv.h"
+#include "StringParser.h"
+#include "StandardPaths.h"
+#include <QtGlobal>
+#include <QStringBuilder>
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QSettings>
+#include <QScreen>
+#include <QDebug>
+#include <QRect>
+#include <QDir>
+#include <iostream>
+using namespace std;
+
+AppEnv::AppEnv()
+{
+
+}
+
+// Folder Stuff
+
+QString AppEnv::getGameFolder(bool *ok)
+{
+    QDir dir;
+    QString GTAV_FOLDER = QString::fromUtf8(qgetenv("GTAV_FOLDER"));
+    if (GTAV_FOLDER != "")
+    {
+        dir.setPath(GTAV_FOLDER);
+        if (dir.exists())
+        {
+            if (ok != NULL) *ok = true;
+            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
+            return dir.absolutePath();
+        }
+    }
+
+    QString GTAV_defaultFolder = StandardPaths::documentsLocation() % QDir::separator() % "Rockstar Games" % QDir::separator() % "GTA V";
+    QString GTAV_returnFolder = GTAV_defaultFolder;
+
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("dir");
+    bool forceDir = settings.value("force", false).toBool();
+    GTAV_returnFolder = settings.value("dir", GTAV_defaultFolder).toString();
+    settings.endGroup();
+
+    if (forceDir)
+    {
+        dir.setPath(GTAV_returnFolder);
+        if (dir.exists())
+        {
+            if (ok != 0) *ok = true;
+            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
+            return dir.absolutePath();
+        }
+    }
+
+    dir.setPath(GTAV_defaultFolder);
+    if (dir.exists())
+    {
+        if (ok != 0) *ok = true;
+        qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
+        return dir.absolutePath();
+    }
+
+    if (!forceDir)
+    {
+        dir.setPath(GTAV_returnFolder);
+        if (dir.exists())
+        {
+            if (ok != 0) *ok = true;
+            qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
+            return dir.absolutePath();
+        }
+    }
+
+    if (ok != 0) *ok = false;
+    return "";
+}
+
+bool AppEnv::setGameFolder(QString gameFolder)
+{
+    QDir dir;
+    dir.setPath(gameFolder);
+    if (dir.exists())
+    {
+        qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
+        return true;
+    }
+    return false;
+}
+
+QString AppEnv::getExLangFolder()
+{
+    return StringParser::convertBuildedString(GTA5SYNC_LANG);
+}
+
+QString AppEnv::getInLangFolder()
+{
+#ifdef GTA5SYNC_QCONF
+#ifdef GTA5SYNC_INLANG
+    return StringParser::convertBuildedString(GTA5SYNC_INLANG);
+#else
+    return StringParser::convertBuildedString(GTA5SYNC_SHARE % QLatin1String("SEPARATOR:APPNAME:SEPARATOR:translations"));
+#endif
+#else
+#ifdef GTA5SYNC_INLANG
+    return StringParser::convertBuildedString(GTA5SYNC_INLANG);
+#else
+    return QString(":/tr");
+#endif
+#endif
+}
+
+QString AppEnv::getPluginsFolder()
+{
+    return StringParser::convertBuildedString(GTA5SYNC_PLUG);
+}
+
+// Web Stuff
+
+QByteArray AppEnv::getUserAgent()
+{
+    return QString("Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 %1/%2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER).toUtf8();
+}
+
+// QUrl AppEnv::getCrewFetchingUrl(QString crewID)
+// {
+//     return QUrl(QString("https://socialclub.rockstargames.com/reference/crewfeed/%1").arg(crewID));
+// }
+
+QUrl AppEnv::getCrewFetchingUrl(QString crewID)
+{
+    return QUrl(QString("https://socialclub.rockstargames.com/crew/%1/%1").arg(crewID));
+}
+
+QUrl AppEnv::getPlayerFetchingUrl(QString crewID, QString pageNumber)
+{
+    return QUrl(QString("https://socialclub.rockstargames.com/crewsapi/GetMembersList?crewId=%1&pageNumber=%2").arg(crewID, pageNumber));
+}
+
+QUrl AppEnv::getPlayerFetchingUrl(QString crewID, int pageNumber)
+{
+    return getPlayerFetchingUrl(crewID, QString::number(pageNumber));
+}
+
+qreal AppEnv::screenRatio()
+{
+#if QT_VERSION >= 0x050000
+    qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch();
+#else
+    qreal dpi = qApp->desktop()->logicalDpiX();
+#endif
+#ifdef Q_OS_MAC
+    return (dpi / 72);
+#else
+    return (dpi / 96);
+#endif
+}
diff --git a/AppEnv.h b/AppEnv.h
index 332b6e1..21a8e7b 100755
--- a/AppEnv.h
+++ b/AppEnv.h
@@ -1,45 +1,47 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef APPENV_H
-#define APPENV_H
-
-#include <QString>
-#include <QUrl>
-
-class AppEnv
-{
-public:
-    AppEnv();
-
-    // Folder Stuff
-    static QString getGameFolder(bool *ok = 0);
-    static bool setGameFolder(QString gameFolder);
-    static QString getLangFolder();
-    static QString getPluginsFolder();
-
-    // Web Stuff
-    static QByteArray getUserAgent();
-    static QUrl getCrewFetchingUrl(QString crewID);
-    static QUrl getPlayerFetchingUrl(QString crewID, QString pageNumber);
-
-    // Screen Stuff
-    static qreal screenRatio();
-};
-
-#endif // APPENV_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef APPENV_H
+#define APPENV_H
+
+#include <QString>
+#include <QUrl>
+
+class AppEnv
+{
+public:
+    AppEnv();
+
+    // Folder Stuff
+    static QString getGameFolder(bool *ok = 0);
+    static bool setGameFolder(QString gameFolder);
+    static QString getExLangFolder();
+    static QString getInLangFolder();
+    static QString getPluginsFolder();
+
+    // Web Stuff
+    static QByteArray getUserAgent();
+    static QUrl getCrewFetchingUrl(QString crewID);
+    static QUrl getPlayerFetchingUrl(QString crewID, QString pageNumber);
+    static QUrl getPlayerFetchingUrl(QString crewID, int pageNumber);
+
+    // Screen Stuff
+    static qreal screenRatio();
+};
+
+#endif // APPENV_H
diff --git a/CrewDatabase.cpp b/CrewDatabase.cpp
index 11e3a97..a1b4919 100755
--- a/CrewDatabase.cpp
+++ b/CrewDatabase.cpp
@@ -1,83 +1,165 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "StandardPaths.h"
-#include "CrewDatabase.h"
-#include "config.h"
-#include <QFile>
-#include <QDir>
-
-CrewDatabase::CrewDatabase(QObject *parent) : QObject(parent)
-{
-    QDir dir;
-    dir.mkpath(StandardPaths::dataLocation());
-    dir.setPath(StandardPaths::dataLocation());
-    QString dirPath = dir.absolutePath();
-    QString defaultConfPath = dirPath + QDir::separator() + "crews.ini";
-
-    QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    confPathSettings.beginGroup("Database");
-    QString confPathFile = confPathSettings.value("Crews", defaultConfPath).toString();
-    confPathSettings.endGroup();
-
-    crewDB = new QSettings(confPathFile, QSettings::IniFormat);
-    crewDB->beginGroup("Crews");
-}
-
-CrewDatabase::~CrewDatabase()
-{
-    crewDB->endGroup();
-    delete crewDB;
-}
-
-QStringList CrewDatabase::getCrews()
-{
-    QStringList compatibleCrewList = crewDB->childKeys();
-    crewDB->endGroup();
-    crewDB->beginGroup("CrewList");
-    QStringList crewIDs = crewDB->value("IDs", QStringList()).toStringList();
-    crewIDs.append(compatibleCrewList);
-    crewIDs.removeDuplicates();
-    crewDB->endGroup();
-    crewDB->beginGroup("Crews");
-    return crewIDs;
-}
-
-QString CrewDatabase::getCrewName(int crewID)
-{
-    QString crewStr = crewDB->value(QString::number(crewID), crewID).toString();
-    if (crewID == 0) crewStr = tr("No Crew", "");
-    return crewStr;
-}
-
-void CrewDatabase::setCrewName(int crewID, QString crewName)
-{
-    crewDB->setValue(QString::number(crewID), crewName);
-}
-
-void CrewDatabase::addCrew(int crewID)
-{
-    QStringList crews = getCrews();
-    crews.append(QString::number(crewID));
-    crews.removeDuplicates();
-    crewDB->endGroup();
-    crewDB->beginGroup("CrewList");
-    crewDB->setValue("IDs", crews);
-    crewDB->endGroup();
-    crewDB->beginGroup("Crews");
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "StandardPaths.h"
+#include "CrewDatabase.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QMutexLocker>
+#include <QDebug>
+#include <QFile>
+#include <QDir>
+
+CrewDatabase::CrewDatabase(QObject *parent) : QObject(parent)
+{
+    QDir dir;
+    dir.mkpath(StandardPaths::dataLocation());
+    dir.setPath(StandardPaths::dataLocation());
+    QString dirPath = dir.absolutePath();
+    QString defaultConfPath = dirPath % QDir::separator() % "crews.ini";
+
+    QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    confPathSettings.beginGroup("Database");
+    QString confPathFile = confPathSettings.value("Crews", defaultConfPath).toString();
+    confPathSettings.endGroup();
+
+    crewDB = new QSettings(confPathFile, QSettings::IniFormat);
+    crewDB->beginGroup("Crews");
+
+    addProcess = false;
+}
+
+CrewDatabase::~CrewDatabase()
+{
+    crewDB->endGroup();
+    delete crewDB;
+}
+
+QStringList CrewDatabase::getCrews()
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getCrews";
+#endif
+    return getCrews_p();
+}
+
+QStringList CrewDatabase::getCrews_p()
+{
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getCrews_p";
+#endif
+    QStringList compatibleCrewList = getCompatibleCrews_p();
+    crewDB->endGroup();
+    crewDB->beginGroup("CrewList");
+    QStringList crewIDs = crewDB->value("IDs", QStringList()).toStringList();
+    crewIDs += compatibleCrewList;
+    crewIDs.removeDuplicates();
+    crewDB->endGroup();
+    crewDB->beginGroup("Crews");
+    return crewIDs;
+}
+
+QStringList CrewDatabase::getCompatibleCrews()
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getCompatibleCrews";
+#endif
+    return getCompatibleCrews_p();
+}
+
+QStringList CrewDatabase::getCompatibleCrews_p()
+{
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getCompatibleCrews_p";
+#endif
+    return crewDB->childKeys();
+}
+
+QString CrewDatabase::getCrewName(int crewID)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getCrewName" << crewID;
+#endif
+    QString crewStr = crewDB->value(QString::number(crewID), crewID).toString();
+    if (crewID == 0) crewStr = tr("No Crew", "");
+    return crewStr;
+}
+
+void CrewDatabase::setCrewName(int crewID, QString crewName)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "setCrewName" << crewID << crewName;
+#endif
+    crewDB->setValue(QString::number(crewID), crewName);
+}
+
+void CrewDatabase::addCrew(int crewID)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "addCrew" << crewID;
+#endif
+    QStringList crews = getCrews_p();
+    crews += QString::number(crewID);
+    crews.removeDuplicates();
+    crewDB->endGroup();
+    crewDB->beginGroup("CrewList");
+    crewDB->setValue("IDs", crews);
+    crewDB->endGroup();
+    crewDB->beginGroup("Crews");
+}
+
+bool CrewDatabase::isCompatibleCrew(QString crewNID)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "isCompatibleCrew" << crewNID;
+#endif
+    return crewDB->contains(crewNID);
+}
+
+bool CrewDatabase::isCompatibleCrew(int crewID)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "isCompatibleCrew" << crewID;
+#endif
+    return crewDB->contains(QString::number(crewID));
+}
+
+void CrewDatabase::setAddingCrews(bool addingCrews)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "setAddingCrews" << addingCrews;
+#endif
+    addProcess = addingCrews;
+}
+
+bool CrewDatabase::isAddingCrews()
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "isAddingCrews";
+#endif
+    return addProcess;
+}
diff --git a/CrewDatabase.h b/CrewDatabase.h
index 471b236..b5c7ee0 100755
--- a/CrewDatabase.h
+++ b/CrewDatabase.h
@@ -1,43 +1,53 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef CREWDATABASE_H
-#define CREWDATABASE_H
-
-#include <QSettings>
-#include <QObject>
-#include <QMap>
-
-class CrewDatabase : public QObject
-{
-    Q_OBJECT
-public:
-    explicit CrewDatabase(QObject *parent = 0);
-    void setCrewName(int crewID, QString crewName);
-    QString getCrewName(int crewID);
-    QStringList getCrews();
-    ~CrewDatabase();
-
-private:
-    QSettings *crewDB;
-
-public slots:
-    void addCrew(int crewID);
-};
-
-#endif // CREWDATABASE_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef CREWDATABASE_H
+#define CREWDATABASE_H
+
+#include <QSettings>
+#include <QObject>
+#include <QMutex>
+#include <QMap>
+
+class CrewDatabase : public QObject
+{
+    Q_OBJECT
+public:
+    explicit CrewDatabase(QObject *parent = 0);
+    QString getCrewName(int crewID);
+    QStringList getCompatibleCrews();
+    QStringList getCrews();
+    void setAddingCrews(bool addingCrews);
+    bool isCompatibleCrew(QString crewNID);
+    bool isCompatibleCrew(int crewID);
+    bool isAddingCrews();
+    ~CrewDatabase();
+
+private:
+    mutable QMutex mutex;
+    bool addProcess;
+    QSettings *crewDB;
+    QStringList getCrews_p();
+    QStringList getCompatibleCrews_p();
+
+public slots:
+    void setCrewName(int crewID, QString crewName);
+    void addCrew(int crewID);
+};
+
+#endif // CREWDATABASE_H
diff --git a/DatabaseThread.cpp b/DatabaseThread.cpp
index 0b090d0..4e7d90d 100755
--- a/DatabaseThread.cpp
+++ b/DatabaseThread.cpp
@@ -1,296 +1,276 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "DatabaseThread.h"
-#include "CrewDatabase.h"
-#include "AppEnv.h"
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QStringList>
-#include <QVariantMap>
-#include <QEventLoop>
-#include <QTimer>
-#include <QDebug>
-#include <QUrl>
-
-DatabaseThread::DatabaseThread(CrewDatabase *crewDB, QObject *parent) : QThread(parent), crewDB(crewDB)
-{
-    crewMaxPages = 83;
-    threadRunning = true;
-}
-
-void DatabaseThread::run()
-{
-    QEventLoop threadLoop;
-    QStringList crewList;
-
-    // Register thread loop end signal
-    QObject::connect(this, SIGNAL(threadEndCommited()), &threadLoop, SLOT(quit()));
-
-    // Quick time scan
-    if (crewList.length() <= 3)
-    {
-        scanCrewReference(crewList, 2500);
-        scanCrewMembersList(crewList, 3, 2500);
-        emit playerNameUpdated();
-    }
-    else if (crewList.length() <= 5)
-    {
-        scanCrewReference(crewList, 2500);
-        scanCrewMembersList(crewList, 2, 2500);
-        emit playerNameUpdated();
-    }
-
-    QEventLoop *waitingLoop = new QEventLoop();
-    QTimer::singleShot(10000, waitingLoop, SLOT(quit()));
-    QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
-    waitingLoop->exec();
-    delete waitingLoop;
-
-    while (threadRunning)
-    {
-        crewList = crewDB->getCrews();
-
-        // Long time scan
-        scanCrewReference(crewList, 10000);
-        scanCrewMembersList(crewList, crewMaxPages, 10000);
-        emit playerNameUpdated();
-
-        if (threadRunning)
-        {
-            QTimer::singleShot(300000, &threadLoop, SLOT(quit()));
-            threadLoop.exec();
-        }
-    }
-}
-
-// void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
-// {
-//     foreach (const QString &crewID, crewList)
-//     {
-//         if (threadRunning && crewID != "0")
-//         {
-//             QNetworkAccessManager *netManager = new QNetworkAccessManager();
-
-//             QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID));
-//             netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
-//             netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
-//             netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
-//             netRequest.setRawHeader("Connection", "keep-alive");
-
-//             QNetworkReply *netReply = netManager->get(netRequest);
-
-//             QEventLoop *downloadLoop = new QEventLoop();
-//             QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
-//             QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
-//             QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
-//             downloadLoop->exec();
-//             delete downloadLoop;
-
-//             if (netReply->isFinished())
-//             {
-//                 QByteArray crewJson = netReply->readAll();
-//                 QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson);
-//                 QJsonObject crewObject = crewDocument.object();
-//                 QVariantMap crewMap = crewObject.toVariantMap();
-//                 QString crewName;
-//                 bool isFound = false;
-
-//                 if (crewMap.contains("activities"))
-//                 {
-//                     QList<QVariant> activitiesList = crewMap["activities"].toList();
-//                     foreach (const QVariant &activitiesVariant, activitiesList)
-//                     {
-//                         QMap<QString, QVariant> activityRootMap = activitiesVariant.toMap();
-//                         foreach(const QVariant &activityRootVariant, activityRootMap)
-//                         {
-//                             QMap<QString, QVariant> activityMap = activityRootVariant.toMap();
-//                             foreach(const QVariant &activityVariant, activityMap)
-//                             {
-//                                 QMap<QString, QVariant> activityFinalMap = activityVariant.toMap();
-//                                 if (activityFinalMap.contains("id") && activityFinalMap["id"] == crewID)
-//                                 {
-//                                     if (activityFinalMap.contains("name") && isFound == false)
-//                                     {
-//                                         isFound = true;
-//                                         crewName = activityFinalMap["name"].toString();
-//                                     }
-//                                 }
-//                             }
-//                         }
-//                     }
-//                 }
-//                 if (!crewName.isNull())
-//                 {
-//                     crewDB->setCrewName(crewID.toInt(), crewName);
-//                 }
-//             }
-
-//             QEventLoop *waitingLoop = new QEventLoop();
-//             QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
-//             QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
-//             waitingLoop->exec();
-//             delete waitingLoop;
-
-//             delete netReply;
-//             delete netManager;
-//         }
-//     }
-// }
-
-void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
-{
-    foreach (const QString &crewID, crewList)
-    {
-        if (threadRunning && crewID != "0")
-        {
-            QNetworkAccessManager *netManager = new QNetworkAccessManager();
-
-            QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID));
-#if QT_VERSION >= 0x050600
-            netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
-#endif
-            netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
-            netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
-            netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
-            netRequest.setRawHeader("Connection", "keep-alive");
-
-            QNetworkReply *netReply = netManager->get(netRequest);
-
-            QEventLoop *downloadLoop = new QEventLoop();
-            QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
-            QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
-            QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
-            downloadLoop->exec();
-            delete downloadLoop;
-
-            if (netReply->isFinished())
-            {
-                QString crewName;
-                QByteArray crewHtml = netReply->readAll();
-                QStringList crewHtmlSplit1 = QString::fromUtf8(crewHtml).split("<title>Rockstar Games Social Club - Crew : ");
-                if (crewHtmlSplit1.length() >= 2)
-                {
-                    QStringList crewHtmlSplit2 = QString(crewHtmlSplit1.at(1)).split("</title>");
-                    if (crewHtmlSplit2.length() >= 1)
-                    {
-                        crewName = crewHtmlSplit2.at(0);
-                    }
-                }
-                if (!crewName.isEmpty())
-                {
-                    crewDB->setCrewName(crewID.toInt(), crewName);
-                }
-            }
-
-            QEventLoop *waitingLoop = new QEventLoop();
-            QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
-            QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
-            waitingLoop->exec();
-            delete waitingLoop;
-
-            delete netReply;
-            delete netManager;
-        }
-    }
-}
-
-void DatabaseThread::scanCrewMembersList(QStringList crewList, int maxPages, int requestDelay)
-{
-    foreach (const QString &crewID, crewList)
-    {
-        if (threadRunning && crewID != "0")
-        {
-            int currentPage = 0;
-            int foundPlayers = 0;
-            int totalPlayers = 1000;
-
-            while(foundPlayers < totalPlayers && currentPage < maxPages)
-            {
-                QNetworkAccessManager *netManager = new QNetworkAccessManager();
-
-                QNetworkRequest netRequest(AppEnv::getPlayerFetchingUrl(crewID, QString::number(currentPage)));
-#if QT_VERSION >= 0x050600
-                netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
-#endif
-                netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
-                netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
-                netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
-                netRequest.setRawHeader("Connection", "keep-alive");
-
-                QNetworkReply *netReply = netManager->get(netRequest);
-
-                QEventLoop *downloadLoop = new QEventLoop();
-                QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
-                QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
-                QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
-                downloadLoop->exec();
-                delete downloadLoop;
-
-                if (netReply->isFinished())
-                {
-                    QByteArray crewJson = netReply->readAll();
-                    QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson);
-                    QJsonObject crewObject = crewDocument.object();
-                    QVariantMap crewMap = crewObject.toVariantMap();
-
-                    if (crewMap.contains("Total")) { totalPlayers = crewMap["Total"].toInt(); }
-
-                    if (crewMap.contains("Members"))
-                    {
-                        QList<QVariant> memberList = crewMap["Members"].toList();
-                        foreach (const QVariant &memberVariant, memberList)
-                        {
-                            QMap<QString, QVariant> memberMap = memberVariant.toMap();
-                            foundPlayers++;
-                            if (memberMap.contains("RockstarId") && memberMap.contains("Name"))
-                            {
-                                int RockstarId = memberMap["RockstarId"].toInt();
-                                QString memberName = memberMap["Name"].toString();
-                                if (memberName != "" && RockstarId != 0)
-                                {
-                                    emit playerNameFound(RockstarId, memberName);
-                                }
-                            }
-                        }
-                    }
-
-                    QEventLoop *waitingLoop = new QEventLoop();
-                    QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
-                    QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
-                    waitingLoop->exec();
-                    delete waitingLoop;
-
-                    currentPage++;
-                }
-
-                delete netReply;
-                delete netManager;
-            }
-        }
-    }
-}
-
-void DatabaseThread::doEndThread()
-{
-    threadRunning = false;
-    emit threadEndCommited();
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "DatabaseThread.h"
+#include "CrewDatabase.h"
+#include "AppEnv.h"
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QStringList>
+#include <QVariantMap>
+#include <QEventLoop>
+#include <QTimer>
+#include <QDebug>
+#include <QUrl>
+
+#define crewMaxPages 83
+
+DatabaseThread::DatabaseThread(CrewDatabase *crewDB, QObject *parent) : QThread(parent), crewDB(crewDB)
+{
+    threadRunning = true;
+}
+
+void DatabaseThread::run()
+{
+    QEventLoop threadLoop;
+
+    QStringList crewList;
+    QStringList crewListR;
+
+    // Register thread loop end signal
+    QObject::connect(this, SIGNAL(threadEndCommited()), &threadLoop, SLOT(quit()));
+
+    // Setup crewList for Quick time scan
+    crewList = crewDB->getCrews();
+    if (!crewList.isEmpty())
+    {
+        crewListR = deleteCompatibleCrews(crewList);
+    }
+    else
+    {
+        while (crewList.isEmpty() && threadRunning)
+        {
+            QTimer::singleShot(1000, &threadLoop, SLOT(quit()));
+            threadLoop.exec();
+            if (!crewDB->isAddingCrews())
+            {
+                crewList = crewDB->getCrews();
+            }
+        }
+        if (threadRunning)
+        {
+            crewListR = deleteCompatibleCrews(crewList);
+        }
+    }
+
+    // Only do QTS when Thread should be run
+    if (threadRunning)
+    {
+        // Quick time scan
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "Start QTS";
+#endif
+        if (crewListR.length() <= 5)
+        {
+            scanCrewReference(crewListR, 2500);
+            emit crewNameUpdated();
+        }
+        if (crewList.length() <= 3)
+        {
+            scanCrewMembersList(crewList, 3, 2500);
+            emit playerNameUpdated();
+        }
+        else if (crewList.length() <= 5)
+        {
+            scanCrewMembersList(crewList, 2, 2500);
+            emit playerNameUpdated();
+        }
+
+        if (threadRunning)
+        {
+            QTimer::singleShot(10000, &threadLoop, SLOT(quit()));
+            threadLoop.exec();
+        }
+    }
+
+    while (threadRunning)
+    {
+        crewList = crewDB->getCrews();
+        crewListR = deleteCompatibleCrews(crewList);
+
+        // Long time scan
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "Start LTS";
+#endif
+        scanCrewReference(crewListR, 10000);
+        emit crewNameUpdated();
+        scanCrewMembersList(crewList, crewMaxPages, 10000);
+        emit playerNameUpdated();
+
+        if (threadRunning)
+        {
+            QTimer::singleShot(300000, &threadLoop, SLOT(quit()));
+            threadLoop.exec();
+        }
+    }
+}
+
+void DatabaseThread::scanCrewReference(const QStringList &crewList, const int &requestDelay)
+{
+    foreach (const QString &crewID, crewList)
+    {
+        if (threadRunning && crewID != "0")
+        {
+            QNetworkAccessManager *netManager = new QNetworkAccessManager();
+
+            QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID));
+#if QT_VERSION >= 0x050600
+            netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
+#endif
+            netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
+            netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+            netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
+            netRequest.setRawHeader("Connection", "keep-alive");
+
+            QNetworkReply *netReply = netManager->get(netRequest);
+
+            QEventLoop *downloadLoop = new QEventLoop();
+            QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
+            QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
+            QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
+            downloadLoop->exec();
+            delete downloadLoop;
+
+            if (netReply->isFinished())
+            {
+                QString crewName;
+                QByteArray crewHtml = netReply->readAll();
+                QStringList crewHtmlSplit1 = QString::fromUtf8(crewHtml).split("<title>Rockstar Games Social Club - Crew : ");
+                if (crewHtmlSplit1.length() >= 2)
+                {
+                    QStringList crewHtmlSplit2 = QString(crewHtmlSplit1.at(1)).split("</title>");
+                    if (crewHtmlSplit2.length() >= 1)
+                    {
+                        crewName = crewHtmlSplit2.at(0);
+                    }
+                }
+                if (!crewName.isEmpty())
+                {
+                    emit crewNameFound(crewID.toInt(), crewName);
+                }
+            }
+
+            QEventLoop *waitingLoop = new QEventLoop();
+            QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
+            QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
+            waitingLoop->exec();
+            delete waitingLoop;
+
+            delete netReply;
+            delete netManager;
+        }
+    }
+}
+
+void DatabaseThread::scanCrewMembersList(const QStringList &crewList, const int &maxPages, const int &requestDelay)
+{
+    foreach (const QString &crewID, crewList)
+    {
+        if (threadRunning && crewID != "0")
+        {
+            int currentPage = 0;
+            int foundPlayers = 0;
+            int totalPlayers = 1000;
+
+            while(foundPlayers < totalPlayers && currentPage < maxPages)
+            {
+                QNetworkAccessManager *netManager = new QNetworkAccessManager();
+
+                QNetworkRequest netRequest(AppEnv::getPlayerFetchingUrl(crewID, currentPage));
+#if QT_VERSION >= 0x050600
+                netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
+#endif
+                netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
+                netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
+                netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
+                netRequest.setRawHeader("Connection", "keep-alive");
+
+                QNetworkReply *netReply = netManager->get(netRequest);
+
+                QEventLoop *downloadLoop = new QEventLoop();
+                QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
+                QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
+                QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
+                downloadLoop->exec();
+                delete downloadLoop;
+
+                if (netReply->isFinished())
+                {
+                    QByteArray crewJson = netReply->readAll();
+                    QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson);
+                    QJsonObject crewObject = crewDocument.object();
+                    QVariantMap crewMap = crewObject.toVariantMap();
+
+                    if (crewMap.contains("Total")) { totalPlayers = crewMap["Total"].toInt(); }
+
+                    if (crewMap.contains("Members"))
+                    {
+                        QList<QVariant> memberList = crewMap["Members"].toList();
+                        foreach (const QVariant &memberVariant, memberList)
+                        {
+                            QMap<QString, QVariant> memberMap = memberVariant.toMap();
+                            foundPlayers++;
+                            if (memberMap.contains("RockstarId") && memberMap.contains("Name"))
+                            {
+                                int RockstarId = memberMap["RockstarId"].toInt();
+                                QString memberName = memberMap["Name"].toString();
+                                if (memberName != "" && RockstarId != 0)
+                                {
+                                    emit playerNameFound(RockstarId, memberName);
+                                }
+                            }
+                        }
+                    }
+
+                    QEventLoop *waitingLoop = new QEventLoop();
+                    QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
+                    QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
+                    waitingLoop->exec();
+                    delete waitingLoop;
+
+                    currentPage++;
+                }
+
+                delete netReply;
+                delete netManager;
+            }
+        }
+    }
+}
+
+QStringList DatabaseThread::deleteCompatibleCrews(const QStringList &crewList)
+{
+    QStringList crewListR = crewList;
+    foreach(const QString &crewNID, crewListR)
+    {
+        if (crewDB->isCompatibleCrew(crewNID))
+        {
+            crewListR.removeAll(crewNID);
+        }
+    }
+    return crewListR;
+}
+
+void DatabaseThread::doEndThread()
+{
+    threadRunning = false;
+    emit threadEndCommited();
+}
diff --git a/DatabaseThread.h b/DatabaseThread.h
index 0009291..10a3b47 100755
--- a/DatabaseThread.h
+++ b/DatabaseThread.h
@@ -1,52 +1,54 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef DATABASETHREAD_H
-#define DATABASETHREAD_H
-
-#include "CrewDatabase.h"
-#include <QObject>
-#include <QThread>
-
-class DatabaseThread : public QThread
-{
-    Q_OBJECT
-public:
-    explicit DatabaseThread(CrewDatabase *crewDB, QObject *parent = 0);
-
-public slots:
-    void doEndThread();
-
-private:
-    CrewDatabase *crewDB;
-    void scanCrewMembersList(QStringList crewList, int maxPages, int requestDelay);
-    void scanCrewReference(QStringList crewList, int requestDelay);
-    bool threadRunning;
-    int crewMaxPages;
-    int plyrPerReq;
-
-protected:
-    void run();
-
-signals:
-    void playerNameFound(int playerID, QString playerName);
-    void playerNameUpdated();
-    void threadEndCommited();
-};
-
-#endif // DATABASETHREAD_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef DATABASETHREAD_H
+#define DATABASETHREAD_H
+
+#include "CrewDatabase.h"
+#include <QObject>
+#include <QThread>
+
+class DatabaseThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit DatabaseThread(CrewDatabase *crewDB, QObject *parent = 0);
+
+public slots:
+    void doEndThread();
+
+private:
+    CrewDatabase *crewDB;
+    void scanCrewMembersList(const QStringList &crewList, const int &maxPages, const int &requestDelay);
+    void scanCrewReference(const QStringList &crewList, const int &requestDelay);
+    QStringList deleteCompatibleCrews(const QStringList &crewList);
+    bool threadRunning;
+    int plyrPerReq;
+
+protected:
+    void run();
+
+signals:
+    void crewNameFound(int crewID, QString crewName);
+    void crewNameUpdated();
+    void playerNameFound(int playerID, QString playerName);
+    void playerNameUpdated();
+    void threadEndCommited();
+};
+
+#endif // DATABASETHREAD_H
diff --git a/ExportDialog.cpp b/ExportDialog.cpp
index 6210ea3..9a93c58 100755
--- a/ExportDialog.cpp
+++ b/ExportDialog.cpp
@@ -1,48 +1,48 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "ExportDialog.h"
-#include "ui_ExportDialog.h"
-
-ExportDialog::ExportDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::ExportDialog)
-{
-    ui->setupUi(this);
-    success = false;
-}
-
-ExportDialog::~ExportDialog()
-{
-    delete ui;
-}
-
-bool ExportDialog::isSucceeded()
-{
-    return success;
-}
-
-void ExportDialog::on_cmdSnapmaticClose_clicked()
-{
-    this->close();
-}
-
-void ExportDialog::setupPictureExport()
-{
-    ui->swExport->setCurrentWidget(ui->pageSnapmatic);
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "ExportDialog.h"
+#include "ui_ExportDialog.h"
+
+ExportDialog::ExportDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::ExportDialog)
+{
+    ui->setupUi(this);
+    success = false;
+}
+
+ExportDialog::~ExportDialog()
+{
+    delete ui;
+}
+
+bool ExportDialog::isSucceeded()
+{
+    return success;
+}
+
+void ExportDialog::on_cmdSnapmaticClose_clicked()
+{
+    this->close();
+}
+
+void ExportDialog::setupPictureExport()
+{
+    ui->swExport->setCurrentWidget(ui->pageSnapmatic);
+}
diff --git a/ExportDialog.h b/ExportDialog.h
index cf5a5cd..65354f0 100755
--- a/ExportDialog.h
+++ b/ExportDialog.h
@@ -1,46 +1,46 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef EXPORTDIALOG_H
-#define EXPORTDIALOG_H
-
-#include <QDialog>
-
-namespace Ui {
-class ExportDialog;
-}
-
-class ExportDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit ExportDialog(QWidget *parent = 0);
-    void setupPictureExport();
-    bool isSucceeded();
-    ~ExportDialog();
-
-private slots:
-    void on_cmdSnapmaticClose_clicked();
-
-private:
-    Ui::ExportDialog *ui;
-    bool success;
-};
-
-#endif // EXPORTDIALOG_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef EXPORTDIALOG_H
+#define EXPORTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class ExportDialog;
+}
+
+class ExportDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit ExportDialog(QWidget *parent = 0);
+    void setupPictureExport();
+    bool isSucceeded();
+    ~ExportDialog();
+
+private slots:
+    void on_cmdSnapmaticClose_clicked();
+
+private:
+    Ui::ExportDialog *ui;
+    bool success;
+};
+
+#endif // EXPORTDIALOG_H
diff --git a/ExportDialog.ui b/ExportDialog.ui
index 6e8c254..d00b208 100755
--- a/ExportDialog.ui
+++ b/ExportDialog.ui
@@ -1,226 +1,226 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>ExportDialog</class>
- <widget class="QDialog" name="ExportDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Dialog</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlExport">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QStackedWidget" name="swExport">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <widget class="QWidget" name="pageSnapmatic">
-      <layout class="QVBoxLayout" name="vlSnapmatic">
-       <item>
-        <widget class="QGroupBox" name="gbSnapmaticFormat">
-         <property name="title">
-          <string>Export Format</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout">
-          <item>
-           <widget class="QRadioButton" name="rbSystemPicture">
-            <property name="text">
-             <string>&amp;JPEG/PNG format</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbSnapmaticPicture">
-            <property name="text">
-             <string>GTA &amp;Snapmatic format</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbSnapmaticResolution">
-         <property name="title">
-          <string>Export Size</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_2">
-          <item>
-           <widget class="QRadioButton" name="rbSnapmaticDefaultSize">
-            <property name="text">
-             <string>Default &amp;Size</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbSnapmaticDesktopSize">
-            <property name="text">
-             <string>&amp;Desktop Size</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbSnapmaticCustomSize">
-            <property name="text">
-             <string>&amp;Custom Size</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlSnapmaticResolution">
-            <item>
-             <widget class="QLabel" name="labSnapmaticResolutionSize">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>Custom Size:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="sbSnapmaticResoulutionWidth">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="minimum">
-               <number>1</number>
-              </property>
-              <property name="maximum">
-               <number>3840</number>
-              </property>
-              <property name="value">
-               <number>960</number>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QLabel" name="labSnapmaticResolutionSizeX">
-              <property name="text">
-               <string>x</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="sbSnapmaticResoulutionHeight">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="minimum">
-               <number>1</number>
-              </property>
-              <property name="maximum">
-               <number>2160</number>
-              </property>
-              <property name="value">
-               <number>536</number>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="hsSnapmaticResolution">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>0</width>
-                <height>0</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <spacer name="vsSnapmatic">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="hlSnapmaticButtons">
-         <item>
-          <spacer name="hsSnapmaticButtons">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>0</width>
-             <height>0</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QPushButton" name="cmdSnapmaticExport">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>&amp;Export</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="cmdSnapmaticClose">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>&amp;Close</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="pageSavegame"/>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExportDialog</class>
+ <widget class="QDialog" name="ExportDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlExport">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QStackedWidget" name="swExport">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <widget class="QWidget" name="pageSnapmatic">
+      <layout class="QVBoxLayout" name="vlSnapmatic">
+       <item>
+        <widget class="QGroupBox" name="gbSnapmaticFormat">
+         <property name="title">
+          <string>Export Format</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QRadioButton" name="rbSystemPicture">
+            <property name="text">
+             <string>&amp;JPEG/PNG format</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbSnapmaticPicture">
+            <property name="text">
+             <string>GTA &amp;Snapmatic format</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gbSnapmaticResolution">
+         <property name="title">
+          <string>Export Size</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <item>
+           <widget class="QRadioButton" name="rbSnapmaticDefaultSize">
+            <property name="text">
+             <string>Default &amp;Size</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbSnapmaticDesktopSize">
+            <property name="text">
+             <string>&amp;Desktop Size</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbSnapmaticCustomSize">
+            <property name="text">
+             <string>&amp;Custom Size</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlSnapmaticResolution">
+            <item>
+             <widget class="QLabel" name="labSnapmaticResolutionSize">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>Custom Size:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="sbSnapmaticResoulutionWidth">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="minimum">
+               <number>1</number>
+              </property>
+              <property name="maximum">
+               <number>3840</number>
+              </property>
+              <property name="value">
+               <number>960</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="labSnapmaticResolutionSizeX">
+              <property name="text">
+               <string>x</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="sbSnapmaticResoulutionHeight">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="minimum">
+               <number>1</number>
+              </property>
+              <property name="maximum">
+               <number>2160</number>
+              </property>
+              <property name="value">
+               <number>536</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="hsSnapmaticResolution">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>0</width>
+                <height>0</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <spacer name="vsSnapmatic">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="hlSnapmaticButtons">
+         <item>
+          <spacer name="hsSnapmaticButtons">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>0</width>
+             <height>0</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="cmdSnapmaticExport">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>&amp;Export</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="cmdSnapmaticClose">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>&amp;Close</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="pageSavegame"/>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ExportThread.cpp b/ExportThread.cpp
index 5c39bc0..05af7db 100755
--- a/ExportThread.cpp
+++ b/ExportThread.cpp
@@ -1,184 +1,185 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SnapmaticPicture.h"
-#include "ProfileInterface.h"
-#include "PictureExport.h"
-#include "ProfileWidget.h"
-#include "ExportThread.h"
-#include "SavegameData.h"
-#include "config.h"
-#include <QDesktopWidget>
-#include <QApplication>
-#include <QFileInfo>
-#include <QDebug>
-#include <QFile>
-
-ExportThread::ExportThread(QMap<ProfileWidget*,QString> profileMap, QString exportDirectory, bool pictureCopyEnabled, bool pictureExportEnabled, int exportCount, QObject *parent) : QThread(parent),
-    profileMap(profileMap), exportDirectory(exportDirectory), pictureCopyEnabled(pictureCopyEnabled), pictureExportEnabled(pictureExportEnabled), exportCount(exportCount)
-{
-
-}
-
-void ExportThread::run()
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-
-    // Picture Settings
-    // Quality Settings
-    settings.beginGroup("Pictures");
-    int defaultQuality = 100;
-    QSize defExportSize = QSize(960, 536);
-    int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
-    if (customQuality < 1 || customQuality > 100)
-    {
-        customQuality = 100;
-    }
-    bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
-
-    // Size Settings
-    QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
-    if (cusExportSize.width() > 3840)
-    {
-        cusExportSize.setWidth(3840);
-    }
-    else if (cusExportSize.height() > 2160)
-    {
-        cusExportSize.setHeight(2160);
-    }
-    if (cusExportSize.width() < 1)
-    {
-        cusExportSize.setWidth(1);
-    }
-    else if (cusExportSize.height() < 1)
-    {
-        cusExportSize.setHeight(1);
-    }
-    QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
-    Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
-    settings.endGroup();
-    // End Picture Settings
-
-    int intExportProgress = 0;
-    foreach(ProfileWidget *widget, profileMap.keys())
-    {
-        if (widget->isSelected())
-        {
-            if (widget->getWidgetType() == "SnapmaticWidget")
-            {
-                SnapmaticWidget *picWidget = (SnapmaticWidget*)widget;
-                SnapmaticPicture *picture = picWidget->getPicture();
-
-                if (pictureExportEnabled)
-                {
-                    QString exportFileName = PictureExport::getPictureFileName(picture);
-                    if (exportFileName.right(4) != ".jpg" && exportFileName.right(4) != ".png")
-                    {
-                        exportFileName.append(".jpg");
-                    }
-
-                    intExportProgress++;
-                    emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
-                    emit exportProgressUpdate(intExportProgress);
-
-                    // Scale Picture
-                    QImage exportPicture = picture->getImage();
-                    if (sizeMode == "Desktop")
-                    {
-                        QRect desktopResolution = QApplication::desktop()->screenGeometry();
-                        exportPicture = exportPicture.scaled(desktopResolution.width(), desktopResolution.height(), aspectRatio, Qt::SmoothTransformation);
-                    }
-                    else if (sizeMode == "Custom")
-                    {
-                        exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
-                    }
-
-                    bool isSaved;
-                    if (useCustomQuality)
-                    {
-                        isSaved = exportPicture.save(exportDirectory + "/" + exportFileName, "JPEG", customQuality);
-                    }
-                    else
-                    {
-                        isSaved = exportPicture.save(exportDirectory + "/" + exportFileName, "JPEG", 100);
-                    }
-
-                    if (!isSaved)
-                    {
-                        failedExportPictures.append(exportFileName);
-                    }
-                }
-                if (pictureCopyEnabled)
-                {
-                    QString exportFileName = PictureExport::getPictureFileName(picture);
-                    if (exportFileName.right(4) != ".g5e")
-                    {
-                        exportFileName.append(".g5e");
-                    }
-
-                    intExportProgress++;
-                    emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
-                    emit exportProgressUpdate(intExportProgress);
-
-                    QString exportFilePath = exportDirectory + "/" + exportFileName;
-                    if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
-                    if (!picture->exportPicture(exportDirectory + "/" + exportFileName, "G5E"))
-                    {
-                        failedCopyPictures.append(exportFileName);
-                    }
-                }
-            }
-            else if (widget->getWidgetType() == "SavegameWidget")
-            {
-                SavegameWidget *sgdWidget = (SavegameWidget*)widget;
-                SavegameData *savegame = sgdWidget->getSavegame();
-
-                QString originalFileName = savegame->getSavegameFileName();
-                QFileInfo originalFileInfo(originalFileName);
-                QString exportFileName = originalFileInfo.fileName();
-
-                intExportProgress++;
-                emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
-                emit exportProgressUpdate(intExportProgress);
-
-                QString exportFilePath = exportDirectory + "/" + exportFileName;
-                if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
-                if (!QFile::copy(originalFileName, exportFilePath))
-                {
-                    failedSavegames.append(exportFileName);
-                }
-            }
-        }
-    }
-    emit exportFinished();
-}
-
-QStringList ExportThread::getFailedCopyPictures()
-{
-    return failedCopyPictures;
-}
-
-QStringList ExportThread::getFailedExportPictures()
-{
-    return failedExportPictures;
-}
-
-QStringList ExportThread::getFailedSavegames()
-{
-    return failedSavegames;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SnapmaticPicture.h"
+#include "ProfileInterface.h"
+#include "PictureExport.h"
+#include "ProfileWidget.h"
+#include "ExportThread.h"
+#include "SavegameData.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QFileInfo>
+#include <QDebug>
+#include <QFile>
+
+ExportThread::ExportThread(QMap<ProfileWidget*,QString> profileMap, QString exportDirectory, bool pictureCopyEnabled, bool pictureExportEnabled, int exportCount, QObject *parent) : QThread(parent),
+    profileMap(profileMap), exportDirectory(exportDirectory), pictureCopyEnabled(pictureCopyEnabled), pictureExportEnabled(pictureExportEnabled), exportCount(exportCount)
+{
+
+}
+
+void ExportThread::run()
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+
+    // Picture Settings
+    // Quality Settings
+    settings.beginGroup("Pictures");
+    int defaultQuality = 100;
+    QSize defExportSize = QSize(960, 536);
+    int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
+    if (customQuality < 1 || customQuality > 100)
+    {
+        customQuality = 100;
+    }
+    bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
+
+    // Size Settings
+    QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
+    if (cusExportSize.width() > 3840)
+    {
+        cusExportSize.setWidth(3840);
+    }
+    else if (cusExportSize.height() > 2160)
+    {
+        cusExportSize.setHeight(2160);
+    }
+    if (cusExportSize.width() < 1)
+    {
+        cusExportSize.setWidth(1);
+    }
+    else if (cusExportSize.height() < 1)
+    {
+        cusExportSize.setHeight(1);
+    }
+    QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
+    Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
+    settings.endGroup();
+    // End Picture Settings
+
+    int intExportProgress = 0;
+    foreach(ProfileWidget *widget, profileMap.keys())
+    {
+        if (widget->isSelected())
+        {
+            if (widget->getWidgetType() == "SnapmaticWidget")
+            {
+                SnapmaticWidget *picWidget = qobject_cast<SnapmaticWidget*>(widget);
+                SnapmaticPicture *picture = picWidget->getPicture();
+
+                if (pictureExportEnabled)
+                {
+                    QString exportFileName = PictureExport::getPictureFileName(picture);
+                    if (exportFileName.right(4) != ".jpg" && exportFileName.right(4) != ".png")
+                    {
+                        exportFileName += ".jpg";
+                    }
+
+                    intExportProgress++;
+                    emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
+                    emit exportProgressUpdate(intExportProgress);
+
+                    // Scale Picture
+                    QImage exportPicture = picture->getImage();
+                    if (sizeMode == "Desktop")
+                    {
+                        QRect desktopResolution = qApp->desktop()->screenGeometry();
+                        exportPicture = exportPicture.scaled(desktopResolution.width(), desktopResolution.height(), aspectRatio, Qt::SmoothTransformation);
+                    }
+                    else if (sizeMode == "Custom")
+                    {
+                        exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
+                    }
+
+                    bool isSaved;
+                    if (useCustomQuality)
+                    {
+                        isSaved = exportPicture.save(exportDirectory % "/" % exportFileName, "JPEG", customQuality);
+                    }
+                    else
+                    {
+                        isSaved = exportPicture.save(exportDirectory % "/" % exportFileName, "JPEG", 100);
+                    }
+
+                    if (!isSaved)
+                    {
+                        failedExportPictures += exportFileName;
+                    }
+                }
+                if (pictureCopyEnabled)
+                {
+                    QString exportFileName = PictureExport::getPictureFileName(picture);
+                    if (exportFileName.right(4) != ".g5e")
+                    {
+                        exportFileName += ".g5e";
+                    }
+
+                    intExportProgress++;
+                    emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
+                    emit exportProgressUpdate(intExportProgress);
+
+                    QString exportFilePath = exportDirectory % "/" % exportFileName;
+                    if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
+                    if (!picture->exportPicture(exportDirectory % "/" % exportFileName, SnapmaticFormat::G5E_Format))
+                    {
+                        failedCopyPictures += exportFileName;
+                    }
+                }
+            }
+            else if (widget->getWidgetType() == "SavegameWidget")
+            {
+                SavegameWidget *sgdWidget = qobject_cast<SavegameWidget*>(widget);
+                SavegameData *savegame = sgdWidget->getSavegame();
+
+                QString originalFileName = savegame->getSavegameFileName();
+                QFileInfo originalFileInfo(originalFileName);
+                QString exportFileName = originalFileInfo.fileName();
+
+                intExportProgress++;
+                emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
+                emit exportProgressUpdate(intExportProgress);
+
+                QString exportFilePath = exportDirectory % "/" % exportFileName;
+                if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
+                if (!QFile::copy(originalFileName, exportFilePath))
+                {
+                    failedSavegames += exportFileName;
+                }
+            }
+        }
+    }
+    emit exportFinished();
+}
+
+QStringList ExportThread::getFailedCopyPictures()
+{
+    return failedCopyPictures;
+}
+
+QStringList ExportThread::getFailedExportPictures()
+{
+    return failedExportPictures;
+}
+
+QStringList ExportThread::getFailedSavegames()
+{
+    return failedSavegames;
+}
diff --git a/ExportThread.h b/ExportThread.h
index ecd0cd7..f5837a7 100755
--- a/ExportThread.h
+++ b/ExportThread.h
@@ -1,56 +1,56 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef EXPORTTHREAD_H
-#define EXPORTTHREAD_H
-
-#include "SnapmaticWidget.h"
-#include "SavegameWidget.h"
-#include "ProfileWidget.h"
-#include <QThread>
-#include <QMap>
-
-class ExportThread : public QThread
-{
-    Q_OBJECT
-public:
-    explicit ExportThread(QMap<ProfileWidget*,QString> profileMap, QString exportDirectory, bool pictureCopyEnabled, bool pictureExportEnabled, int exportCount, QObject *parent = 0);
-    QStringList getFailedSavegames();
-    QStringList getFailedCopyPictures();
-    QStringList getFailedExportPictures();
-
-protected:
-    void run();
-
-private:
-    QMap <ProfileWidget*, QString> profileMap;
-    QString exportDirectory;
-    bool pictureCopyEnabled;
-    bool pictureExportEnabled;
-    int exportCount;
-    QStringList failedSavegames;
-    QStringList failedCopyPictures;
-    QStringList failedExportPictures;
-
-signals:
-    void exportStringUpdate(QString currentFileName);
-    void exportProgressUpdate(int currentProgressValue);
-    void exportFinished();
-};
-
-#endif // EXPORTTHREAD_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef EXPORTTHREAD_H
+#define EXPORTTHREAD_H
+
+#include "SnapmaticWidget.h"
+#include "SavegameWidget.h"
+#include "ProfileWidget.h"
+#include <QThread>
+#include <QMap>
+
+class ExportThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit ExportThread(QMap<ProfileWidget*,QString> profileMap, QString exportDirectory, bool pictureCopyEnabled, bool pictureExportEnabled, int exportCount, QObject *parent = 0);
+    QStringList getFailedSavegames();
+    QStringList getFailedCopyPictures();
+    QStringList getFailedExportPictures();
+
+protected:
+    void run();
+
+private:
+    QMap <ProfileWidget*, QString> profileMap;
+    QString exportDirectory;
+    bool pictureCopyEnabled;
+    bool pictureExportEnabled;
+    int exportCount;
+    QStringList failedSavegames;
+    QStringList failedCopyPictures;
+    QStringList failedExportPictures;
+
+signals:
+    void exportStringUpdate(QString currentFileName);
+    void exportProgressUpdate(int currentProgressValue);
+    void exportFinished();
+};
+
+#endif // EXPORTTHREAD_H
diff --git a/GlobalString.cpp b/GlobalString.cpp
index 00289c3..fb94678 100755
--- a/GlobalString.cpp
+++ b/GlobalString.cpp
@@ -1,89 +1,85 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include <QLocale>
-#include <QSettings>
-#include <QFileInfo>
-#include <QStringList>
-#include "GlobalString.h"
-#include "config.h"
-
-GlobalString::GlobalString()
-{
-
-}
-
-QMap<QString, QString> GlobalString::getGlobalMap()
-{
-    QMap<QString, QString> globalMap;
-    QSettings globalFile(getLanguageFile(), QSettings::IniFormat);
-    globalFile.setIniCodec("UTF-8");
-    globalFile.beginGroup("Global");
-    QStringList globalStrList = globalFile.childKeys();
-    foreach(const QString &globalStr, globalStrList)
-    {
-        globalMap[globalStr] = globalFile.value(globalStr, globalStr).toString();
-    }
-    globalFile.endGroup();
-    return globalMap;
-}
-
-QString GlobalString::getString(QString valueStr, bool *ok)
-{
-    QString globalString = valueStr;
-    QSettings globalFile(getLanguageFile(), QSettings::IniFormat);
-    globalFile.setIniCodec("UTF-8");
-    globalFile.beginGroup("Global");
-    QStringList globalStrList = globalFile.childKeys();
-    if (globalStrList.contains(valueStr))
-    {
-        if (ok != 0) *ok = true;
-        globalString = globalFile.value(valueStr, valueStr).toString();
-    }
-    globalFile.endGroup();
-    return globalString;
-}
-
-QString GlobalString::getLanguageFile()
-{
-    QString language = getLanguage();
-    QString languageFile = ":/global/global." + language + ".ini";
-    if (!QFileInfo(languageFile).exists())
-    {
-        languageFile = ":/global/global.en.ini";
-    }
-    return languageFile;
-}
-
-QString GlobalString::getLanguage()
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("Interface");
-    QString language = settings.value("Language","System").toString();
-    settings.endGroup();
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            language = langList.at(0);
-        }
-    }
-    return language;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "TranslationClass.h"
+#include "GlobalString.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QStringList>
+#include <QFileInfo>
+#include <QSettings>
+#include <QLocale>
+#include <QDebug>
+
+GlobalString::GlobalString()
+{
+
+}
+
+QMap<QString, QString> GlobalString::getGlobalMap()
+{
+    QMap<QString, QString> globalMap;
+    QSettings globalFile(getLanguageFile(), QSettings::IniFormat);
+    globalFile.setIniCodec("UTF-8");
+    globalFile.beginGroup("Global");
+    QStringList globalStrList = globalFile.childKeys();
+    foreach(const QString &globalStr, globalStrList)
+    {
+        globalMap[globalStr] = globalFile.value(globalStr, globalStr).toString();
+    }
+    globalFile.endGroup();
+    return globalMap;
+}
+
+QString GlobalString::getString(QString valueStr, bool *ok)
+{
+    QString globalString = valueStr;
+    QSettings globalFile(getLanguageFile(), QSettings::IniFormat);
+    globalFile.setIniCodec("UTF-8");
+    globalFile.beginGroup("Global");
+    QStringList globalStrList = globalFile.childKeys();
+    if (globalStrList.contains(valueStr))
+    {
+        if (ok != NULL) *ok = true;
+        globalString = globalFile.value(valueStr, valueStr).toString();
+    }
+    globalFile.endGroup();
+    return globalString;
+}
+
+QString GlobalString::getLanguageFile()
+{
+    QString language = getLanguage();
+    QString languageFile = ":/global/global." % language % ".ini";
+    if (!QFileInfo(languageFile).exists())
+    {
+        languageFile = ":/global/global.en.ini";
+    }
+    return languageFile;
+}
+
+QString GlobalString::getLanguage()
+{
+    QString language = TCInstance->getCurrentLanguage();
+    QStringList langList = QString(language).replace("-", "_").split("_");
+    if (langList.length() >= 1)
+    {
+        language = langList.at(0);
+    }
+    return language;
+}
diff --git a/GlobalString.h b/GlobalString.h
index c9b5bde..9c2d77c 100755
--- a/GlobalString.h
+++ b/GlobalString.h
@@ -1,35 +1,35 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef GLOBALSTRING_H
-#define GLOBALSTRING_H
-
-#include <QString>
-#include <QMap>
-
-class GlobalString
-{
-public:
-    GlobalString();
-    static QString getString(QString valueStr, bool *ok = 0);
-    static QString getLanguageFile();
-    static QString getLanguage();
-    static QMap<QString, QString> getGlobalMap();
-};
-
-#endif // GLOBALSTRING_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef GLOBALSTRING_H
+#define GLOBALSTRING_H
+
+#include <QString>
+#include <QMap>
+
+class GlobalString
+{
+public:
+    GlobalString();
+    static QString getString(QString valueStr, bool *ok = 0);
+    static QString getLanguageFile();
+    static QString getLanguage();
+    static QMap<QString, QString> getGlobalMap();
+};
+
+#endif // GLOBALSTRING_H
diff --git a/IconLoader.cpp b/IconLoader.cpp
index 13ef339..4de091d 100755
--- a/IconLoader.cpp
+++ b/IconLoader.cpp
@@ -1,40 +1,50 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "IconLoader.h"
-#include <QIcon>
-
-IconLoader::IconLoader()
-{
-
-}
-
-QIcon IconLoader::loadingAppIcon()
-{
-    QIcon appIcon;
-    appIcon.addFile(":/img/5sync-16.png", QSize(16, 16));
-    appIcon.addFile(":/img/5sync-24.png", QSize(24, 24));
-    appIcon.addFile(":/img/5sync-32.png", QSize(32, 32));
-    appIcon.addFile(":/img/5sync-40.png", QSize(40, 40));
-    appIcon.addFile(":/img/5sync-48.png", QSize(48, 48));
-    appIcon.addFile(":/img/5sync-64.png", QSize(64, 64));
-    appIcon.addFile(":/img/5sync-96.png", QSize(96, 96));
-    appIcon.addFile(":/img/5sync-128.png", QSize(128, 128));
-    appIcon.addFile(":/img/5sync-256.png", QSize(256, 256));
-    return appIcon;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "IconLoader.h"
+#include <QIcon>
+
+IconLoader::IconLoader()
+{
+
+}
+
+QIcon IconLoader::loadingAppIcon()
+{
+    QIcon appIcon;
+    appIcon.addFile(":/img/5sync-16.png", QSize(16, 16));
+    appIcon.addFile(":/img/5sync-24.png", QSize(24, 24));
+    appIcon.addFile(":/img/5sync-32.png", QSize(32, 32));
+    appIcon.addFile(":/img/5sync-40.png", QSize(40, 40));
+    appIcon.addFile(":/img/5sync-48.png", QSize(48, 48));
+    appIcon.addFile(":/img/5sync-64.png", QSize(64, 64));
+    appIcon.addFile(":/img/5sync-96.png", QSize(96, 96));
+    appIcon.addFile(":/img/5sync-128.png", QSize(128, 128));
+    appIcon.addFile(":/img/5sync-256.png", QSize(256, 256));
+    return appIcon;
+}
+
+QIcon IconLoader::loadingPointmakerIcon()
+{
+    QIcon pointmakerIcon;
+    pointmakerIcon.addFile(":/img/pointmaker-8.png", QSize(8, 8));
+    pointmakerIcon.addFile(":/img/pointmaker-16.png", QSize(16, 16));
+    pointmakerIcon.addFile(":/img/pointmaker-24.png", QSize(24, 24));
+    pointmakerIcon.addFile(":/img/pointmaker-32.png", QSize(32, 32));
+    return pointmakerIcon;
+}
diff --git a/IconLoader.h b/IconLoader.h
index c7d5107..fe8669b 100755
--- a/IconLoader.h
+++ b/IconLoader.h
@@ -1,31 +1,32 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef ICONLOADER_H
-#define ICONLOADER_H
-
-#include <QIcon>
-
-class IconLoader
-{
-public:
-    IconLoader();
-    static QIcon loadingAppIcon();
-};
-
-#endif // ICONLOADER_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef ICONLOADER_H
+#define ICONLOADER_H
+
+#include <QIcon>
+
+class IconLoader
+{
+public:
+    IconLoader();
+    static QIcon loadingAppIcon();
+    static QIcon loadingPointmakerIcon();
+};
+
+#endif // ICONLOADER_H
diff --git a/ImportDialog.cpp b/ImportDialog.cpp
index 19de296..5f485a1 100644
--- a/ImportDialog.cpp
+++ b/ImportDialog.cpp
@@ -1,190 +1,219 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "ImportDialog.h"
-#include "ui_ImportDialog.h"
-#include "AppEnv.h"
-#include <QPainter>
-#include <QPixmap>
-#include <QImage>
-#include <QDebug>
-
-// IMAGES VALUES
-#define snapmaticResolutionW 960
-#define snapmaticResolutionH 536
-#define snapmaticAvatarResolution 470
-#define snapmaticAvatarPlacementW 145
-#define snapmaticAvatarPlacementH 66
-
-ImportDialog::ImportDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::ImportDialog)
-{
-    ui->setupUi(this);
-    doImport = false;
-    avatarAreaImage = QImage(":/img/avatarareaimport.png");
-
-    if (QIcon::hasThemeIcon("dialog-ok"))
-    {
-        ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok"));
-    }
-    if (QIcon::hasThemeIcon("dialog-cancel"))
-    {
-        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
-    }
-
-    ui->rbKeep->setChecked(true);
-
-    qreal screenRatio = AppEnv::screenRatio();
-    snapmaticResolutionLW = 430 * screenRatio;
-    snapmaticResolutionLH = 240 * screenRatio;
-    setMinimumSize(430 * screenRatio, 380 * screenRatio);
-    setMaximumSize(430 * screenRatio, 380 * screenRatio);
-    setFixedSize(430 * screenRatio, 380 * screenRatio);
-    ui->vlButtom->setSpacing(6 * screenRatio);
-    ui->vlButtom->setContentsMargins(9 * screenRatio, 6 * screenRatio, 9 * screenRatio, 9 * screenRatio);
-}
-
-ImportDialog::~ImportDialog()
-{
-    delete ui;
-}
-
-void ImportDialog::processImage()
-{
-    QImage snapmaticImage = workImage;
-    QPixmap snapmaticPixmap(snapmaticResolutionW, snapmaticResolutionH);
-    snapmaticPixmap.fill(Qt::black);
-    QPainter snapmaticPainter(&snapmaticPixmap);
-    if (ui->cbAvatar->isChecked())
-    {
-        // Avatar mode
-        int diffWidth = 0;
-        int diffHeight = 0;
-        if (ui->rbKeep->isChecked())
-        {
-            snapmaticImage = snapmaticImage.scaled(snapmaticAvatarResolution, snapmaticAvatarResolution, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-            if (snapmaticImage.width() > snapmaticImage.height())
-            {
-                diffHeight = snapmaticAvatarResolution - snapmaticImage.height();
-                diffHeight = diffHeight / 2;
-            }
-            else if (snapmaticImage.width() < snapmaticImage.height())
-            {
-                diffWidth = snapmaticAvatarResolution - snapmaticImage.width();
-                diffWidth = diffWidth / 2;
-            }
-        }
-        else
-        {
-            snapmaticImage = snapmaticImage.scaled(snapmaticAvatarResolution, snapmaticAvatarResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-        }
-        snapmaticPainter.drawImage(snapmaticAvatarPlacementW + diffWidth, snapmaticAvatarPlacementH + diffHeight, snapmaticImage);
-        imageTitle = "Custom Avatar";
-    }
-    else
-    {
-        // Picture mode
-        int diffWidth = 0;
-        int diffHeight = 0;
-        if (ui->rbKeep->isChecked())
-        {
-            snapmaticImage = snapmaticImage.scaled(snapmaticResolutionW, snapmaticResolutionH, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-            if (snapmaticImage.width() != snapmaticResolutionW)
-            {
-                diffWidth = snapmaticResolutionW - snapmaticImage.width();
-                diffWidth = diffWidth / 2;
-            }
-            else if (snapmaticImage.height() != snapmaticResolutionH)
-            {
-                diffHeight = snapmaticResolutionH - snapmaticImage.height();
-                diffHeight = diffHeight / 2;
-            }
-        }
-        else
-        {
-            snapmaticImage = snapmaticImage.scaled(snapmaticResolutionW, snapmaticResolutionH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-        }
-        snapmaticPainter.drawImage(0 + diffWidth, 0 + diffHeight, snapmaticImage);
-        imageTitle = "Custom Picture";
-    }
-    snapmaticPainter.end();
-    newImage = snapmaticPixmap.toImage();
-    ui->labPicture->setPixmap(snapmaticPixmap.scaled(snapmaticResolutionLW, snapmaticResolutionLH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-}
-
-QImage ImportDialog::image()
-{
-    return newImage;
-}
-
-void ImportDialog::setImage(const QImage &image_)
-{
-    workImage = image_;
-    if (workImage.width() == workImage.height())
-    {
-        ui->cbAvatar->setChecked(true);
-    }
-    processImage();
-}
-
-bool ImportDialog::isDoImport()
-{
-    return doImport;
-}
-
-QString ImportDialog::getImageTitle()
-{
-    return imageTitle;
-}
-
-void ImportDialog::on_rbIgnore_clicked()
-{
-    processImage();
-}
-
-void ImportDialog::on_rbKeep_clicked()
-{
-    processImage();
-}
-
-void ImportDialog::on_cbAvatar_clicked()
-{
-    processImage();
-}
-
-void ImportDialog::on_cmdCancel_clicked()
-{
-    close();
-}
-
-void ImportDialog::on_cmdOK_clicked()
-{
-    doImport = true;
-    close();
-}
-
-void ImportDialog::on_labPicture_labelPainted()
-{
-    if (ui->cbAvatar->isChecked())
-    {
-        QPainter labelPainter(ui->labPicture);
-        labelPainter.drawImage(0, 0, avatarAreaImage.scaled(snapmaticResolutionLW, snapmaticResolutionLH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-        labelPainter.end();
-    }
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "ImportDialog.h"
+#include "ui_ImportDialog.h"
+#include "AppEnv.h"
+#include <QColorDialog>
+#include <QMessageBox>
+#include <QPainter>
+#include <QPixmap>
+#include <QImage>
+#include <QDebug>
+#include <QRgb>
+
+// IMAGES VALUES
+#define snapmaticResolutionW 960
+#define snapmaticResolutionH 536
+#define snapmaticAvatarResolution 470
+#define snapmaticAvatarPlacementW 145
+#define snapmaticAvatarPlacementH 66
+
+ImportDialog::ImportDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::ImportDialog)
+{
+    ui->setupUi(this);
+    importAgreed = false;
+    insideAvatarZone = false;
+    avatarAreaImage = QImage(":/img/avatarareaimport.png");
+    selectedColour = QColor::fromRgb(0, 0, 0, 255);
+
+    if (QIcon::hasThemeIcon("dialog-ok"))
+    {
+        ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok"));
+    }
+    if (QIcon::hasThemeIcon("dialog-cancel"))
+    {
+        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
+    }
+
+    ui->cbIgnore->setChecked(false);
+    ui->labColour->setText(tr("Background Colour: <span style=\"color: %1\">%1</span>").arg(selectedColour.name()));
+
+    qreal screenRatio = AppEnv::screenRatio();
+    snapmaticResolutionLW = 430 * screenRatio;
+    snapmaticResolutionLH = 240 * screenRatio;
+    setMinimumSize(430 * screenRatio, 380 * screenRatio);
+    setMaximumSize(430 * screenRatio, 380 * screenRatio);
+    setFixedSize(430 * screenRatio, 380 * screenRatio);
+    ui->vlButtom->setSpacing(6 * screenRatio);
+    ui->vlButtom->setContentsMargins(9 * screenRatio, 6 * screenRatio, 9 * screenRatio, 9 * screenRatio);
+}
+
+ImportDialog::~ImportDialog()
+{
+    delete ui;
+}
+
+void ImportDialog::processImage()
+{
+    QImage snapmaticImage = workImage;
+    QPixmap snapmaticPixmap(snapmaticResolutionW, snapmaticResolutionH);
+    snapmaticPixmap.fill(selectedColour);
+    QPainter snapmaticPainter(&snapmaticPixmap);
+    if (insideAvatarZone)
+    {
+        // Avatar mode
+        int diffWidth = 0;
+        int diffHeight = 0;
+        if (!ui->cbIgnore->isChecked())
+        {
+            snapmaticImage = snapmaticImage.scaled(snapmaticAvatarResolution, snapmaticAvatarResolution, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+            if (snapmaticImage.width() > snapmaticImage.height())
+            {
+                diffHeight = snapmaticAvatarResolution - snapmaticImage.height();
+                diffHeight = diffHeight / 2;
+            }
+            else if (snapmaticImage.width() < snapmaticImage.height())
+            {
+                diffWidth = snapmaticAvatarResolution - snapmaticImage.width();
+                diffWidth = diffWidth / 2;
+            }
+        }
+        else
+        {
+            snapmaticImage = snapmaticImage.scaled(snapmaticAvatarResolution, snapmaticAvatarResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+        }
+        snapmaticPainter.drawImage(snapmaticAvatarPlacementW + diffWidth, snapmaticAvatarPlacementH + diffHeight, snapmaticImage);
+        imageTitle = "Custom Avatar";
+    }
+    else
+    {
+        // Picture mode
+        int diffWidth = 0;
+        int diffHeight = 0;
+        if (!ui->cbIgnore->isChecked())
+        {
+            snapmaticImage = snapmaticImage.scaled(snapmaticResolutionW, snapmaticResolutionH, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+            if (snapmaticImage.width() != snapmaticResolutionW)
+            {
+                diffWidth = snapmaticResolutionW - snapmaticImage.width();
+                diffWidth = diffWidth / 2;
+            }
+            else if (snapmaticImage.height() != snapmaticResolutionH)
+            {
+                diffHeight = snapmaticResolutionH - snapmaticImage.height();
+                diffHeight = diffHeight / 2;
+            }
+        }
+        else
+        {
+            snapmaticImage = snapmaticImage.scaled(snapmaticResolutionW, snapmaticResolutionH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+        }
+        snapmaticPainter.drawImage(0 + diffWidth, 0 + diffHeight, snapmaticImage);
+        imageTitle = "Custom Picture";
+    }
+    snapmaticPainter.end();
+    newImage = snapmaticPixmap.toImage();
+    ui->labPicture->setPixmap(snapmaticPixmap.scaled(snapmaticResolutionLW, snapmaticResolutionLH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+}
+
+QImage ImportDialog::image()
+{
+    return newImage;
+}
+
+void ImportDialog::setImage(const QImage &image_)
+{
+    workImage = image_;
+    if (workImage.width() == workImage.height())
+    {
+        insideAvatarZone = true;
+        ui->cbAvatar->setChecked(true);
+    }
+    processImage();
+}
+
+bool ImportDialog::isImportAgreed()
+{
+    return importAgreed;
+}
+
+QString ImportDialog::getImageTitle()
+{
+    return imageTitle;
+}
+
+void ImportDialog::on_cbIgnore_toggled(bool checked)
+{
+    Q_UNUSED(checked)
+    processImage();
+}
+
+void ImportDialog::on_cbAvatar_toggled(bool checked)
+{
+    if (workImage.width() == workImage.height() && !checked)
+    {
+        if (QMessageBox::No == QMessageBox::warning(this, tr("Snapmatic Avatar Zone"), tr("Are you sure to use a square image outside of the Avatar Zone?\nWhen you want to use it as Avatar the image will be detached!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
+        {
+            ui->cbAvatar->setChecked(true);
+            insideAvatarZone = true;
+            return;
+        }
+    }
+    insideAvatarZone = ui->cbAvatar->isChecked();
+    processImage();
+}
+
+void ImportDialog::on_cmdCancel_clicked()
+{
+    close();
+}
+
+void ImportDialog::on_cmdOK_clicked()
+{
+    importAgreed = true;
+    close();
+}
+
+void ImportDialog::on_labPicture_labelPainted()
+{
+    if (insideAvatarZone)
+    {
+        QImage avatarAreaFinalImage(avatarAreaImage);
+        if (selectedColour.lightness() > 127)
+        {
+            avatarAreaFinalImage.setColor(1, qRgb(0, 0, 0));
+        }
+        QPainter labelPainter(ui->labPicture);
+        labelPainter.drawImage(0, 0, avatarAreaFinalImage.scaled(snapmaticResolutionLW, snapmaticResolutionLH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+        labelPainter.end();
+    }
+}
+
+void ImportDialog::on_cmdColourChange_clicked()
+{
+    QColor newSelectedColour = QColorDialog::getColor(selectedColour, this, tr("Select Colour..."));
+    if (newSelectedColour.isValid())
+    {
+        selectedColour = newSelectedColour;
+        ui->labColour->setText(tr("Background Colour: <span style=\"color: %1\">%1</span>").arg(selectedColour.name()));
+        processImage();
+    }
+}
diff --git a/ImportDialog.h b/ImportDialog.h
index 1da27fd..7953490 100644
--- a/ImportDialog.h
+++ b/ImportDialog.h
@@ -1,60 +1,62 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef IMPORTDIALOG_H
-#define IMPORTDIALOG_H
-
-#include <QDialog>
-
-namespace Ui {
-class ImportDialog;
-}
-
-class ImportDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit ImportDialog(QWidget *parent = 0);
-    ~ImportDialog();
-    QImage image();
-    QString getImageTitle();
-    void setImage(const QImage &image);
-    bool isDoImport();
-
-private slots:
-    void processImage();
-    void on_rbIgnore_clicked();
-    void on_rbKeep_clicked();
-    void on_cbAvatar_clicked();
-    void on_cmdCancel_clicked();
-    void on_cmdOK_clicked();
-    void on_labPicture_labelPainted();
-
-private:
-    Ui::ImportDialog *ui;
-    QImage avatarAreaImage;
-    QString imageTitle;
-    QImage workImage;
-    QImage newImage;
-    bool doImport;
-    int snapmaticResolutionLW;
-    int snapmaticResolutionLH;
-};
-
-#endif // IMPORTDIALOG_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef IMPORTDIALOG_H
+#define IMPORTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class ImportDialog;
+}
+
+class ImportDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit ImportDialog(QWidget *parent = 0);
+    ~ImportDialog();
+    QImage image();
+    QString getImageTitle();
+    void setImage(const QImage &image);
+    bool isImportAgreed();
+
+private slots:
+    void processImage();
+    void on_cbIgnore_toggled(bool checked);
+    void on_cbAvatar_toggled(bool checked);
+    void on_cmdCancel_clicked();
+    void on_cmdOK_clicked();
+    void on_labPicture_labelPainted();
+    void on_cmdColourChange_clicked();
+
+private:
+    Ui::ImportDialog *ui;
+    QImage avatarAreaImage;
+    QString imageTitle;
+    QImage workImage;
+    QImage newImage;
+    QColor selectedColour;
+    bool insideAvatarZone;
+    bool importAgreed;
+    int snapmaticResolutionLW;
+    int snapmaticResolutionLH;
+};
+
+#endif // IMPORTDIALOG_H
diff --git a/ImportDialog.ui b/ImportDialog.ui
index dc42083..3f95cad 100644
--- a/ImportDialog.ui
+++ b/ImportDialog.ui
@@ -1,187 +1,239 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>ImportDialog</class>
- <widget class="QDialog" name="ImportDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>430</width>
-    <height>380</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>430</width>
-    <height>380</height>
-   </size>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>430</width>
-    <height>380</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>Import...</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlImport">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="UiModLabel" name="labPicture">
-     <property name="minimumSize">
-      <size>
-       <width>430</width>
-       <height>240</height>
-      </size>
-     </property>
-     <property name="text">
-      <string/>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QFrame" name="buttomFrame">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Plain</enum>
-     </property>
-     <property name="lineWidth">
-      <number>0</number>
-     </property>
-     <layout class="QVBoxLayout" name="vlButtom">
-      <property name="leftMargin">
-       <number>9</number>
-      </property>
-      <property name="topMargin">
-       <number>6</number>
-      </property>
-      <property name="rightMargin">
-       <number>9</number>
-      </property>
-      <property name="bottomMargin">
-       <number>9</number>
-      </property>
-      <item>
-       <widget class="QGroupBox" name="gbSettings">
-        <property name="title">
-         <string>Settings</string>
-        </property>
-        <layout class="QGridLayout" name="gdSettings">
-         <item row="1" column="0">
-          <widget class="QRadioButton" name="rbKeep">
-           <property name="text">
-            <string>&amp;Keep Aspect Ratio</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="1">
-          <widget class="QRadioButton" name="rbIgnore">
-           <property name="text">
-            <string>&amp;Ignore Aspect Ratio</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="0">
-          <widget class="QCheckBox" name="cbAvatar">
-           <property name="text">
-            <string>&amp;Avatar</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <spacer name="vsDialog">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>0</width>
-          <height>0</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item>
-       <layout class="QHBoxLayout" name="hlButtons">
-        <item>
-         <spacer name="hsButtons">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>0</width>
-            <height>0</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QPushButton" name="cmdOK">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="text">
-           <string>&amp;OK</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QPushButton" name="cmdCancel">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="text">
-           <string>&amp;Cancel</string>
-          </property>
-         </widget>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>UiModLabel</class>
-   <extends>QLabel</extends>
-   <header>UiModLabel.h</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ImportDialog</class>
+ <widget class="QDialog" name="ImportDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>430</width>
+    <height>380</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>430</width>
+    <height>380</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>430</width>
+    <height>380</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Import...</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlImport">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="UiModLabel" name="labPicture">
+     <property name="minimumSize">
+      <size>
+       <width>430</width>
+       <height>240</height>
+      </size>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="buttomFrame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <layout class="QVBoxLayout" name="vlButtom">
+      <property name="leftMargin">
+       <number>9</number>
+      </property>
+      <property name="topMargin">
+       <number>6</number>
+      </property>
+      <property name="rightMargin">
+       <number>9</number>
+      </property>
+      <property name="bottomMargin">
+       <number>9</number>
+      </property>
+      <item>
+       <widget class="QGroupBox" name="gbSettings">
+        <property name="title">
+         <string>Settings</string>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <item>
+          <layout class="QHBoxLayout" name="hlColor">
+           <item>
+            <widget class="QLabel" name="labColour">
+             <property name="text">
+              <string>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QToolButton" name="cmdColourChange">
+             <property name="text">
+              <string>...</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="hsColourSpacer">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>0</width>
+               <height>0</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="hlCheckboxes">
+           <item>
+            <widget class="QCheckBox" name="cbAvatar">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="text">
+              <string>Avatar</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="cbIgnore">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="text">
+              <string>Ignore Aspect Ratio</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <spacer name="vsDialog">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="hlButtons">
+        <item>
+         <spacer name="hsButtons">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>0</width>
+            <height>0</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QPushButton" name="cmdOK">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Import picture</string>
+          </property>
+          <property name="text">
+           <string>&amp;OK</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="cmdCancel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Discard picture</string>
+          </property>
+          <property name="text">
+           <string>&amp;Cancel</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>UiModLabel</class>
+   <extends>QLabel</extends>
+   <header>uimod/UiModLabel.h</header>
+   <slots>
+    <signal>mouseMoved()</signal>
+    <signal>mouseReleased()</signal>
+    <signal>mousePressed()</signal>
+    <signal>mouseDoubleClicked()</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/MapPreviewDialog.cpp b/MapPreviewDialog.cpp
new file mode 100644
index 0000000..1efd416
--- /dev/null
+++ b/MapPreviewDialog.cpp
@@ -0,0 +1,76 @@
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "MapPreviewDialog.h"
+#include "ui_MapPreviewDialog.h"
+#include "IconLoader.h"
+#include "AppEnv.h"
+#include <QPainter>
+#include <QDebug>
+#ifdef __MINGW32__
+#include <cmath>
+#endif
+
+MapPreviewDialog::MapPreviewDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::MapPreviewDialog)
+{
+    // Set Window Flags
+    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
+
+    ui->setupUi(this);
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    setMinimumSize(500 * screenRatio, 600 * screenRatio);
+    setMaximumSize(500 * screenRatio, 600 * screenRatio);
+    setFixedSize(500 * screenRatio, 600 * screenRatio);
+}
+
+MapPreviewDialog::~MapPreviewDialog()
+{
+    delete ui;
+}
+
+void MapPreviewDialog::drawPointOnMap(double xpos_d, double ypos_d)
+{
+    qreal screenRatio = AppEnv::screenRatio();
+    int pointMakerSize = 8 * screenRatio;
+    QPixmap pointMakerPixmap = IconLoader::loadingPointmakerIcon().pixmap(QSize(pointMakerSize, pointMakerSize));
+    QSize mapPixelSize = size();
+
+    int pointMakerHalfSize = pointMakerSize / 2;
+    long xpos_ms = std::round(xpos_d);
+    long ypos_ms = std::round(ypos_d);
+    double xpos_ma = xpos_ms + 4000;
+    double ypos_ma = ypos_ms + 4000;
+    double xrat = (double)mapPixelSize.width() / 10000;
+    double yrat = (double)mapPixelSize.height() / 12000;
+    long xpos_mp = std::round(xpos_ma * xrat);
+    long ypos_mp = std::round(ypos_ma * yrat);
+    long xpos_pr = xpos_mp - pointMakerHalfSize;
+    long ypos_pr = ypos_mp + pointMakerHalfSize;
+
+    QPixmap mapPixmap(mapPixelSize);
+    QPainter mapPainter(&mapPixmap);
+    mapPainter.drawPixmap(0, 0, mapPixelSize.width(), mapPixelSize.height(), QPixmap(":/img/mappreview.jpg").scaled(mapPixelSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+    mapPainter.drawPixmap(xpos_pr, mapPixelSize.height() - ypos_pr, pointMakerSize, pointMakerSize, pointMakerPixmap);
+    mapPainter.end();
+
+    ui->labPicture->setPixmap(mapPixmap);
+}
diff --git a/MapPreviewDialog.h b/MapPreviewDialog.h
new file mode 100644
index 0000000..e69666b
--- /dev/null
+++ b/MapPreviewDialog.h
@@ -0,0 +1,41 @@
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef MAPPREVIEWDIALOG_H
+#define MAPPREVIEWDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class MapPreviewDialog;
+}
+
+class MapPreviewDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit MapPreviewDialog(QWidget *parent = 0);
+    void drawPointOnMap(double x, double y);
+    ~MapPreviewDialog();
+
+private:
+    Ui::MapPreviewDialog *ui;
+};
+
+#endif // MAPPREVIEWDIALOG_H
diff --git a/MapPreviewDialog.ui b/MapPreviewDialog.ui
new file mode 100644
index 0000000..35fed61
--- /dev/null
+++ b/MapPreviewDialog.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MapPreviewDialog</class>
+ <widget class="QDialog" name="MapPreviewDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>500</width>
+    <height>600</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>500</width>
+    <height>600</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Snapmatic Map Viewer</string>
+  </property>
+  <layout class="QVBoxLayout" name="vlMapPreview">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="UiModLabel" name="labPicture">
+     <property name="text">
+      <string/>
+     </property>
+     <property name="scaledContents">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>UiModLabel</class>
+   <extends>QLabel</extends>
+   <header>uimod/UiModLabel.h</header>
+   <slots>
+    <signal>mouseMoved()</signal>
+    <signal>mouseReleased()</signal>
+    <signal>mousePressed()</signal>
+    <signal>mouseDoubleClicked()</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp
index f42c3c3..76f1105 100755
--- a/OptionsDialog.cpp
+++ b/OptionsDialog.cpp
@@ -1,457 +1,439 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "OptionsDialog.h"
-#include "ui_OptionsDialog.h"
-#include "StandardPaths.h"
-#include "UserInterface.h"
-#include "AppEnv.h"
-#include "config.h"
-#include <QDesktopWidget>
-#include <QApplication>
-#include <QFileDialog>
-#include <QMessageBox>
-#include <QStringList>
-#include <QLocale>
-#include <QString>
-#include <QDebug>
-#include <QList>
-#include <QDir>
-
-OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
-    QDialog(parent), profileDB(profileDB),
-    ui(new Ui::OptionsDialog)
-{
-    // Set Window Flags
-    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
-
-    // Setup User Interface
-    ui->setupUi(this);
-    ui->tabWidget->setCurrentIndex(0);
-    ui->labPicCustomRes->setVisible(false);
-
-    QRect desktopResolution = QApplication::desktop()->screenGeometry(parent);
-    int desktopSizeWidth = desktopResolution.width();
-    int desktopSizeHeight = desktopResolution.height();
-    aspectRatio = Qt::KeepAspectRatio;
-    defExportSize = QSize(960, 536);
-    cusExportSize = defExportSize;
-    defaultQuality = 100;
-    customQuality = 100;
-    contentMode = 0;
-    settings = new QSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-
-    percentString = ui->labPicQuality->text();
-    ui->labPicQuality->setText(percentString.arg(QString::number(defaultQuality)));
-    ui->rbPicDesktopRes->setText(ui->rbPicDesktopRes->text().arg(QString::number(desktopSizeWidth), QString::number(desktopSizeHeight)));
-    ui->rbPicDefaultRes->setText(ui->rbPicDefaultRes->text().arg(QString::number(defExportSize.width()), QString::number(defExportSize.height())));
-
-    if (QIcon::hasThemeIcon("dialog-ok"))
-    {
-        ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok"));
-    }
-    if (QIcon::hasThemeIcon("dialog-cancel"))
-    {
-        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
-    }
-
-    // DPI calculation
-    qreal screenRatio = AppEnv::screenRatio();
-    resize(435 * screenRatio, 405 * screenRatio);
-
-    setupTreeWidget();
-    setupLanguageBox();
-    setupRadioButtons();
-    setupDefaultProfile();
-    setupPictureSettings();
-    setupCustomGTAFolder();
-    setupSnapmaticPictureViewer();
-
-#ifdef GTA5SYNC_DISABLED
-    ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabSync));
-#endif
-
-    this->setWindowTitle(windowTitle().arg(GTA5SYNC_APPSTR));
-}
-
-OptionsDialog::~OptionsDialog()
-{
-    delete settings;
-    foreach(QTreeWidgetItem *playerItem, playerItems)
-    {
-        delete playerItem;
-    }
-    delete ui;
-}
-
-void OptionsDialog::setupTreeWidget()
-{
-    foreach(const QString &playerIDStr, profileDB->getPlayers())
-    {
-        bool ok;
-        int playerID = playerIDStr.toInt(&ok);
-        if (ok)
-        {
-            QString playerName = profileDB->getPlayerName(playerID);
-
-            QStringList playerTreeViewList;
-            playerTreeViewList << playerIDStr;
-            playerTreeViewList << playerName;
-
-            QTreeWidgetItem *playerItem = new QTreeWidgetItem(playerTreeViewList);
-            ui->twPlayers->addTopLevelItem(playerItem);
-            playerItems.append(playerItem);
-        }
-    }
-    ui->twPlayers->sortItems(1, Qt::AscendingOrder);
-}
-
-void OptionsDialog::setupLanguageBox()
-{
-    settings->beginGroup("Interface");
-    currentLanguage = settings->value("Language","System").toString();
-    settings->endGroup();
-
-    QStringList langList = QLocale::system().name().split("_");
-    if (langList.length() > 0)
-    {
-        QString cbSysStr = tr("%1 (%2 if available)", "System like PC System = %1, System Language like Deutsch = %2").arg(tr("System",
-                                                                                                                              "System like PC System"), QLocale::languageToString(QLocale(langList.at(0)).language()));
-        ui->cbLanguage->addItem(cbSysStr, "System");
-    }
-
-    QString cbEngStr = "English (English) [en]";
-    ui->cbLanguage->addItem(QIcon::fromTheme("flag-us"), cbEngStr, "en");
-    if (currentLanguage == "en")
-    {
-#if QT_VERSION >= 0x050000
-        ui->cbLanguage->setCurrentText(cbEngStr);
-#else
-        int indexOfEnglish = ui->cbLanguage->findText(cbEngStr);
-        ui->cbLanguage->setCurrentIndex(indexOfEnglish);
-#endif
-    }
-
-    QDir langDir;
-    langDir.setNameFilters(QStringList("gta5sync_*.qm"));
-    langDir.setPath(AppEnv::getLangFolder());
-    QStringList langFiles;
-    langFiles << langDir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::NoSort);
-    langDir.setPath(":/tr");
-    langFiles << langDir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::NoSort);
-    langFiles.removeDuplicates();
-
-    foreach(const QString &langFile, langFiles)
-    {
-        QString lang = langFile;
-        lang.remove("gta5sync_");
-        lang.remove(".qm");
-
-        QLocale langLocale(lang);
-        QString languageNameInternational = QLocale::languageToString(langLocale.language());
-        QString languageNameNative = langLocale.nativeLanguageName();
-
-        QString cbLangStr = languageNameNative + " (" + languageNameInternational + ") [" + lang + "]";
-        QString langIconStr = "flag-" + lang;
-
-        ui->cbLanguage->addItem(QIcon::fromTheme(langIconStr), cbLangStr, lang);
-        if (currentLanguage == lang)
-        {
-#if QT_VERSION >= 0x050000
-            ui->cbLanguage->setCurrentText(cbLangStr);
-#else
-            int indexOfLang = ui->cbLanguage->findText(cbLangStr);
-            ui->cbLanguage->setCurrentIndex(indexOfLang);
-#endif
-        }
-    }
-}
-
-void OptionsDialog::setupRadioButtons()
-{
-    bool contentModeOk;
-    settings->beginGroup("Profile");
-    contentMode = settings->value("ContentMode", 0).toInt(&contentModeOk);
-    settings->endGroup();
-
-    if (contentModeOk)
-    {
-        if (contentMode == 0)
-        {
-            ui->rbOpenWithSC->setChecked(true);
-        }
-        else if (contentMode == 1)
-        {
-            ui->rbOpenWithDC->setChecked(true);
-        }
-        else if (contentMode == 2)
-        {
-            ui->rbSelectWithSC->setChecked(true);
-        }
-    }
-}
-
-void OptionsDialog::on_cmdOK_clicked()
-{
-    applySettings();
-    close();
-}
-
-void OptionsDialog::applySettings()
-{
-    settings->beginGroup("Interface");
-#if QT_VERSION >= 0x050000
-    settings->setValue("Language", ui->cbLanguage->currentData());
-#else
-    settings->setValue("Language", ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()));
-#endif
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-    settings->setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
-#endif
-#endif
-    settings->endGroup();
-
-    settings->beginGroup("Profile");
-    int newContentMode = 0;
-    if (ui->rbOpenWithSC->isChecked())
-    {
-        newContentMode = 0;
-    }
-    else if (ui->rbOpenWithDC->isChecked())
-    {
-        newContentMode = 1;
-    }
-    else if (ui->rbSelectWithSC->isChecked())
-    {
-        newContentMode = 2;
-    }
-    settings->setValue("ContentMode", newContentMode);
-#if QT_VERSION >= 0x050000
-    settings->setValue("Default", ui->cbProfiles->currentData());
-#else
-    settings->setValue("Default", ui->cbProfiles->itemData(ui->cbProfiles->currentIndex()));
-#endif
-    settings->endGroup();
-
-    settings->beginGroup("Pictures");
-    if (ui->cbPicCustomQuality->isChecked())
-    {
-        settings->setValue("CustomQuality", ui->hsPicQuality->value());
-    }
-    settings->setValue("CustomQualityEnabled", ui->cbPicCustomQuality->isChecked());
-    QString sizeMode = "Default";
-    if (ui->rbPicDesktopRes->isChecked())
-    {
-        sizeMode = "Desktop";
-    }
-    else if (ui->rbPicCustomRes->isChecked())
-    {
-        sizeMode = "Custom";
-        settings->setValue("CustomSize", QSize(ui->sbPicExportWidth->value(), ui->sbPicExportHeight->value()));
-    }
-    settings->setValue("ExportSizeMode", sizeMode);
-    settings->setValue("AspectRatio", aspectRatio);
-    settings->endGroup();
-
-    bool forceCustomFolder = ui->cbForceCustomFolder->isChecked();
-    settings->beginGroup("dir");
-    settings->setValue("dir", ui->txtFolder->text());
-    settings->setValue("force", forceCustomFolder);
-    settings->endGroup();
-
-#if QT_VERSION >= 0x050000
-    emit settingsApplied(newContentMode, ui->cbLanguage->currentData().toString());
-#else
-    emit settingsApplied(newContentMode, ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()).toString());
-#endif
-
-#if QT_VERSION >= 0x050000
-    bool languageChanged = ui->cbLanguage->currentData().toString() != currentLanguage;
-#else
-    bool languageChanged = ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()).toString() != currentLanguage;
-#endif
-
-    if ((forceCustomFolder && ui->txtFolder->text() != currentCFolder) || (forceCustomFolder != currentFFolder && forceCustomFolder))
-    {
-        QMessageBox::information(this, tr("%1", "%1").arg(GTA5SYNC_APPSTR), tr("The new Custom Folder will initialize after you restart %1.").arg(GTA5SYNC_APPSTR));
-    }
-    if (languageChanged)
-    {
-        QMessageBox::information(this, tr("%1", "%1").arg(GTA5SYNC_APPSTR), tr("The language change will take effect after you restart %1.").arg(GTA5SYNC_APPSTR));
-    }
-}
-
-void OptionsDialog::setupDefaultProfile()
-{
-    settings->beginGroup("Profile");
-    defaultProfile = settings->value("Default", "").toString();
-    settings->endGroup();
-
-    QString cbNoneStr = tr("No Profile", "No Profile, as default");
-    ui->cbProfiles->addItem(cbNoneStr, "");
-}
-
-void OptionsDialog::commitProfiles(QStringList profiles)
-{
-    foreach(const QString &profile, profiles)
-    {
-        ui->cbProfiles->addItem(tr("Profile: %1").arg(profile), profile);
-        if (defaultProfile == profile)
-        {
-#if QT_VERSION >= 0x050000
-            ui->cbProfiles->setCurrentText(tr("Profile: %1").arg(profile));
-#else
-            int indexOfProfile = ui->cbProfiles->findText(tr("Profile: %1").arg(profile));
-            ui->cbProfiles->setCurrentIndex(indexOfProfile);
-#endif
-        }
-    }
-}
-
-void OptionsDialog::on_rbPicCustomRes_toggled(bool checked)
-{
-    ui->labPicCustomRes->setEnabled(checked);
-    ui->sbPicExportWidth->setEnabled(checked);
-    ui->sbPicExportHeight->setEnabled(checked);
-    ui->labPicXDescription->setEnabled(checked);
-}
-
-void OptionsDialog::on_cbPicCustomQuality_toggled(bool checked)
-{
-    ui->hsPicQuality->setEnabled(checked);
-    ui->labPicQuality->setEnabled(checked);
-    ui->labPicQualityDescription->setEnabled(checked);
-}
-
-void OptionsDialog::on_hsPicQuality_valueChanged(int value)
-{
-    customQuality = value;
-    ui->labPicQuality->setText(percentString.arg(QString::number(value)));
-}
-
-void OptionsDialog::setupPictureSettings()
-{
-    settings->beginGroup("Pictures");
-
-    // Quality Settings
-    customQuality = settings->value("CustomQuality", defaultQuality).toInt();
-    if (customQuality < 1 || customQuality > 100)
-    {
-        customQuality = 100;
-    }
-    ui->hsPicQuality->setValue(customQuality);
-    ui->cbPicCustomQuality->setChecked(settings->value("CustomQualityEnabled", false).toBool());
-
-    // Size Settings
-    cusExportSize = settings->value("CustomSize", defExportSize).toSize();
-    if (cusExportSize.width() > 3840)
-    {
-        cusExportSize.setWidth(3840);
-    }
-    else if (cusExportSize.height() > 2160)
-    {
-        cusExportSize.setHeight(2160);
-    }
-    if (cusExportSize.width() < 1)
-    {
-        cusExportSize.setWidth(1);
-    }
-    else if (cusExportSize.height() < 1)
-    {
-        cusExportSize.setHeight(1);
-    }
-    ui->sbPicExportWidth->setValue(cusExportSize.width());
-    ui->sbPicExportHeight->setValue(cusExportSize.height());
-
-    QString sizeMode = settings->value("ExportSizeMode", "Default").toString();
-    if (sizeMode == "Desktop")
-    {
-        ui->rbPicDesktopRes->setChecked(true);
-    }
-    else if (sizeMode == "Custom")
-    {
-        ui->rbPicCustomRes->setChecked(true);
-    }
-    else
-    {
-        ui->rbPicDefaultRes->setChecked(true);
-    }
-
-    aspectRatio = (Qt::AspectRatioMode)settings->value("AspectRatio", Qt::KeepAspectRatio).toInt();
-    if (aspectRatio == Qt::IgnoreAspectRatio)
-    {
-        ui->cbIgnoreAspectRatio->setChecked(true);
-    }
-
-    settings->endGroup();
-}
-
-void OptionsDialog::on_cbIgnoreAspectRatio_toggled(bool checked)
-{
-    if (checked)
-    {
-        aspectRatio = Qt::IgnoreAspectRatio;
-    }
-    else
-    {
-        aspectRatio = Qt::KeepAspectRatio;
-    }
-}
-
-void OptionsDialog::setupCustomGTAFolder()
-{
-    bool ok;
-    QString defaultGameFolder = AppEnv::getGameFolder(&ok);
-    settings->beginGroup("dir");
-    currentCFolder = settings->value("dir", "").toString();
-    currentFFolder = settings->value("force", false).toBool();
-    if (currentCFolder == "" && ok)
-    {
-        currentCFolder = defaultGameFolder;
-    }
-    ui->txtFolder->setText(currentCFolder);
-    ui->cbForceCustomFolder->setChecked(currentFFolder);
-    settings->endGroup();
-}
-
-void OptionsDialog::setupSnapmaticPictureViewer()
-{
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-    settings->beginGroup("Interface");
-    ui->cbSnapmaticNavigationBar->setChecked(settings->value("NavigationBar", false).toBool());
-    settings->endGroup();
-#else
-    ui->cbSnapmaticNavigationBar->setVisible(false);
-    ui->gbSnapmaticPictureViewer->setVisible(false);
-#endif
-#else
-    ui->cbSnapmaticNavigationBar->setVisible(false);
-    ui->gbSnapmaticPictureViewer->setVisible(false);
-#endif
-}
-
-void OptionsDialog::on_cmdExploreFolder_clicked()
-{
-    QString GTAV_Folder = QFileDialog::getExistingDirectory(this, UserInterface::tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
-    if (QFileInfo(GTAV_Folder).exists())
-    {
-        ui->txtFolder->setText(GTAV_Folder);
-    }
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "OptionsDialog.h"
+#include "ui_OptionsDialog.h"
+#include "TranslationClass.h"
+#include "StandardPaths.h"
+#include "UserInterface.h"
+#include "AppEnv.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QStringList>
+#include <QLocale>
+#include <QString>
+#include <QDebug>
+#include <QList>
+#include <QDir>
+
+OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
+    QDialog(parent), profileDB(profileDB),
+    ui(new Ui::OptionsDialog)
+{
+    // Set Window Flags
+    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
+
+    // Setup User Interface
+    ui->setupUi(this);
+    ui->tabWidget->setCurrentIndex(0);
+    ui->labPicCustomRes->setVisible(false);
+
+    QRect desktopResolution = qApp->desktop()->screenGeometry(parent);
+    int desktopSizeWidth = desktopResolution.width();
+    int desktopSizeHeight = desktopResolution.height();
+    aspectRatio = Qt::KeepAspectRatio;
+    defExportSize = QSize(960, 536);
+    cusExportSize = defExportSize;
+    defaultQuality = 100;
+    customQuality = 100;
+    contentMode = 0;
+    settings = new QSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+
+    percentString = ui->labPicQuality->text();
+    ui->labPicQuality->setText(percentString.arg(QString::number(defaultQuality)));
+    ui->rbPicDesktopRes->setText(ui->rbPicDesktopRes->text().arg(QString::number(desktopSizeWidth), QString::number(desktopSizeHeight)));
+    ui->rbPicDefaultRes->setText(ui->rbPicDefaultRes->text().arg(QString::number(defExportSize.width()), QString::number(defExportSize.height())));
+
+    if (QIcon::hasThemeIcon("dialog-ok"))
+    {
+        ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok"));
+    }
+    if (QIcon::hasThemeIcon("dialog-cancel"))
+    {
+        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
+    }
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    resize(435 * screenRatio, 405 * screenRatio);
+
+    setupTreeWidget();
+    setupLanguageBox();
+    setupRadioButtons();
+    setupDefaultProfile();
+    setupPictureSettings();
+    setupCustomGTAFolder();
+    setupSnapmaticPictureViewer();
+
+#ifdef GTA5SYNC_DISABLED
+    ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabSync));
+#endif
+
+    this->setWindowTitle(windowTitle().arg(GTA5SYNC_APPSTR));
+}
+
+OptionsDialog::~OptionsDialog()
+{
+    delete settings;
+    foreach(QTreeWidgetItem *playerItem, playerItems)
+    {
+        delete playerItem;
+    }
+    delete ui;
+}
+
+void OptionsDialog::setupTreeWidget()
+{
+    foreach(const QString &playerIDStr, profileDB->getPlayers())
+    {
+        bool ok;
+        int playerID = playerIDStr.toInt(&ok);
+        if (ok)
+        {
+            QString playerName = profileDB->getPlayerName(playerID);
+
+            QStringList playerTreeViewList;
+            playerTreeViewList << playerIDStr;
+            playerTreeViewList << playerName;
+
+            QTreeWidgetItem *playerItem = new QTreeWidgetItem(playerTreeViewList);
+            ui->twPlayers->addTopLevelItem(playerItem);
+            playerItems += playerItem;
+        }
+    }
+    ui->twPlayers->sortItems(1, Qt::AscendingOrder);
+}
+
+void OptionsDialog::setupLanguageBox()
+{
+    settings->beginGroup("Interface");
+    currentLanguage = settings->value("Language","System").toString();
+    settings->endGroup();
+
+    QString cbSysStr = tr("%1 (Next Closest Language)", "First language a person can talk with a different person/application. \"Native\" or \"Not Native\".").arg(tr("System",
+                                                                                                                                                                      "System in context of System default"));
+    ui->cbLanguage->addItem(cbSysStr, "System");
+
+    QStringList availableLanguages;
+    availableLanguages << QString("en_GB");
+#ifndef GTA5SYNC_QCONF
+    availableLanguages << TCInstance->listTranslations(AppEnv::getExLangFolder());
+#endif
+    availableLanguages << TCInstance->listTranslations(AppEnv::getInLangFolder());
+    availableLanguages.removeDuplicates();
+    availableLanguages.sort();
+
+    foreach(const QString &lang, availableLanguages)
+    {
+        QLocale langLocale(lang);
+        QString cbLangStr = langLocale.nativeLanguageName() % " (" % langLocale.nativeCountryName() % ") [" % lang % "]";
+
+        QString langIconStr = "flag-" % TranslationClass::getCountryCode(langLocale);
+
+        ui->cbLanguage->addItem(QIcon::fromTheme(langIconStr), cbLangStr, lang);
+        if (currentLanguage == lang)
+        {
+#if QT_VERSION >= 0x050000
+            ui->cbLanguage->setCurrentText(cbLangStr);
+#else
+            int indexOfLang = ui->cbLanguage->findText(cbLangStr);
+            ui->cbLanguage->setCurrentIndex(indexOfLang);
+#endif
+        }
+    }
+}
+
+void OptionsDialog::setupRadioButtons()
+{
+    bool contentModeOk;
+    settings->beginGroup("Profile");
+    contentMode = settings->value("ContentMode", 0).toInt(&contentModeOk);
+    settings->endGroup();
+
+    if (contentModeOk)
+    {
+        if (contentMode == 0)
+        {
+            ui->rbOpenWithSC->setChecked(true);
+        }
+        else if (contentMode == 1)
+        {
+            ui->rbOpenWithDC->setChecked(true);
+        }
+        else if (contentMode == 2)
+        {
+            ui->rbSelectWithSC->setChecked(true);
+        }
+    }
+}
+
+void OptionsDialog::on_cmdOK_clicked()
+{
+    applySettings();
+    close();
+}
+
+void OptionsDialog::applySettings()
+{
+    settings->beginGroup("Interface");
+#if QT_VERSION >= 0x050000
+    settings->setValue("Language", ui->cbLanguage->currentData());
+#else
+    settings->setValue("Language", ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()));
+#endif
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+    settings->setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
+#endif
+#endif
+    settings->endGroup();
+
+    settings->beginGroup("Profile");
+    int newContentMode = 0;
+    if (ui->rbOpenWithSC->isChecked())
+    {
+        newContentMode = 0;
+    }
+    else if (ui->rbOpenWithDC->isChecked())
+    {
+        newContentMode = 1;
+    }
+    else if (ui->rbSelectWithSC->isChecked())
+    {
+        newContentMode = 2;
+    }
+    settings->setValue("ContentMode", newContentMode);
+#if QT_VERSION >= 0x050000
+    settings->setValue("Default", ui->cbProfiles->currentData());
+#else
+    settings->setValue("Default", ui->cbProfiles->itemData(ui->cbProfiles->currentIndex()));
+#endif
+    settings->endGroup();
+
+    settings->beginGroup("Pictures");
+    if (ui->cbPicCustomQuality->isChecked())
+    {
+        settings->setValue("CustomQuality", ui->hsPicQuality->value());
+    }
+    settings->setValue("CustomQualityEnabled", ui->cbPicCustomQuality->isChecked());
+    QString sizeMode = "Default";
+    if (ui->rbPicDesktopRes->isChecked())
+    {
+        sizeMode = "Desktop";
+    }
+    else if (ui->rbPicCustomRes->isChecked())
+    {
+        sizeMode = "Custom";
+        settings->setValue("CustomSize", QSize(ui->sbPicExportWidth->value(), ui->sbPicExportHeight->value()));
+    }
+    settings->setValue("ExportSizeMode", sizeMode);
+    settings->setValue("AspectRatio", aspectRatio);
+    settings->endGroup();
+
+    bool forceCustomFolder = ui->cbForceCustomFolder->isChecked();
+    settings->beginGroup("dir");
+    settings->setValue("dir", ui->txtFolder->text());
+    settings->setValue("force", forceCustomFolder);
+    settings->endGroup();
+
+#if QT_VERSION >= 0x050000
+    bool languageChanged = ui->cbLanguage->currentData().toString() != currentLanguage;
+#else
+    bool languageChanged = ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()).toString() != currentLanguage;
+#endif
+    if (languageChanged)
+    {
+        TCInstance->unloadTranslation(qApp);
+        TCInstance->initUserLanguage();
+        TCInstance->loadTranslation(qApp);
+    }
+
+#if QT_VERSION >= 0x050000
+    emit settingsApplied(newContentMode, ui->cbLanguage->currentData().toString());
+#else
+    emit settingsApplied(newContentMode, ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()).toString());
+#endif
+
+    if ((forceCustomFolder && ui->txtFolder->text() != currentCFolder) || (forceCustomFolder != currentFFolder && forceCustomFolder))
+    {
+        QMessageBox::information(this, tr("%1", "%1").arg(GTA5SYNC_APPSTR), tr("The new Custom Folder will initialise after you restart %1.").arg(GTA5SYNC_APPSTR));
+    }
+}
+
+void OptionsDialog::setupDefaultProfile()
+{
+    settings->beginGroup("Profile");
+    defaultProfile = settings->value("Default", "").toString();
+    settings->endGroup();
+
+    QString cbNoneStr = tr("No Profile", "No Profile, as default");
+    ui->cbProfiles->addItem(cbNoneStr, "");
+}
+
+void OptionsDialog::commitProfiles(QStringList profiles)
+{
+    foreach(const QString &profile, profiles)
+    {
+        ui->cbProfiles->addItem(tr("Profile: %1").arg(profile), profile);
+        if (defaultProfile == profile)
+        {
+#if QT_VERSION >= 0x050000
+            ui->cbProfiles->setCurrentText(tr("Profile: %1").arg(profile));
+#else
+            int indexOfProfile = ui->cbProfiles->findText(tr("Profile: %1").arg(profile));
+            ui->cbProfiles->setCurrentIndex(indexOfProfile);
+#endif
+        }
+    }
+}
+
+void OptionsDialog::on_rbPicCustomRes_toggled(bool checked)
+{
+    ui->labPicCustomRes->setEnabled(checked);
+    ui->sbPicExportWidth->setEnabled(checked);
+    ui->sbPicExportHeight->setEnabled(checked);
+    ui->labPicXDescription->setEnabled(checked);
+}
+
+void OptionsDialog::on_cbPicCustomQuality_toggled(bool checked)
+{
+    ui->hsPicQuality->setEnabled(checked);
+    ui->labPicQuality->setEnabled(checked);
+    ui->labPicQualityDescription->setEnabled(checked);
+}
+
+void OptionsDialog::on_hsPicQuality_valueChanged(int value)
+{
+    customQuality = value;
+    ui->labPicQuality->setText(percentString.arg(QString::number(value)));
+}
+
+void OptionsDialog::setupPictureSettings()
+{
+    settings->beginGroup("Pictures");
+
+    // Quality Settings
+    customQuality = settings->value("CustomQuality", defaultQuality).toInt();
+    if (customQuality < 1 || customQuality > 100)
+    {
+        customQuality = 100;
+    }
+    ui->hsPicQuality->setValue(customQuality);
+    ui->cbPicCustomQuality->setChecked(settings->value("CustomQualityEnabled", false).toBool());
+
+    // Size Settings
+    cusExportSize = settings->value("CustomSize", defExportSize).toSize();
+    if (cusExportSize.width() > 3840)
+    {
+        cusExportSize.setWidth(3840);
+    }
+    else if (cusExportSize.height() > 2160)
+    {
+        cusExportSize.setHeight(2160);
+    }
+    if (cusExportSize.width() < 1)
+    {
+        cusExportSize.setWidth(1);
+    }
+    else if (cusExportSize.height() < 1)
+    {
+        cusExportSize.setHeight(1);
+    }
+    ui->sbPicExportWidth->setValue(cusExportSize.width());
+    ui->sbPicExportHeight->setValue(cusExportSize.height());
+
+    QString sizeMode = settings->value("ExportSizeMode", "Default").toString();
+    if (sizeMode == "Desktop")
+    {
+        ui->rbPicDesktopRes->setChecked(true);
+    }
+    else if (sizeMode == "Custom")
+    {
+        ui->rbPicCustomRes->setChecked(true);
+    }
+    else
+    {
+        ui->rbPicDefaultRes->setChecked(true);
+    }
+
+    aspectRatio = (Qt::AspectRatioMode)settings->value("AspectRatio", Qt::KeepAspectRatio).toInt();
+    if (aspectRatio == Qt::IgnoreAspectRatio)
+    {
+        ui->cbIgnoreAspectRatio->setChecked(true);
+    }
+
+    settings->endGroup();
+}
+
+void OptionsDialog::on_cbIgnoreAspectRatio_toggled(bool checked)
+{
+    if (checked)
+    {
+        aspectRatio = Qt::IgnoreAspectRatio;
+    }
+    else
+    {
+        aspectRatio = Qt::KeepAspectRatio;
+    }
+}
+
+void OptionsDialog::setupCustomGTAFolder()
+{
+    bool ok;
+    QString defaultGameFolder = AppEnv::getGameFolder(&ok);
+    settings->beginGroup("dir");
+    currentCFolder = settings->value("dir", "").toString();
+    currentFFolder = settings->value("force", false).toBool();
+    if (currentCFolder == "" && ok)
+    {
+        currentCFolder = defaultGameFolder;
+    }
+    ui->txtFolder->setText(currentCFolder);
+    ui->cbForceCustomFolder->setChecked(currentFFolder);
+    settings->endGroup();
+}
+
+void OptionsDialog::setupSnapmaticPictureViewer()
+{
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+    settings->beginGroup("Interface");
+    ui->cbSnapmaticNavigationBar->setChecked(settings->value("NavigationBar", false).toBool());
+    settings->endGroup();
+#else
+    ui->cbSnapmaticNavigationBar->setVisible(false);
+    ui->gbSnapmaticPictureViewer->setVisible(false);
+#endif
+#else
+    ui->cbSnapmaticNavigationBar->setVisible(false);
+    ui->gbSnapmaticPictureViewer->setVisible(false);
+#endif
+}
+
+void OptionsDialog::on_cmdExploreFolder_clicked()
+{
+    QString GTAV_Folder = QFileDialog::getExistingDirectory(this, UserInterface::tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
+    if (QFileInfo(GTAV_Folder).exists())
+    {
+        ui->txtFolder->setText(GTAV_Folder);
+    }
+}
diff --git a/OptionsDialog.h b/OptionsDialog.h
index 83aa3e3..763d1df 100755
--- a/OptionsDialog.h
+++ b/OptionsDialog.h
@@ -1,79 +1,79 @@
-/******************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef OPTIONSDIALOG_H
-#define OPTIONSDIALOG_H
-
-#include <QSize>
-#include <QList>
-#include <QDialog>
-#include <QSettings>
-#include <QTreeWidgetItem>
-#include "ProfileDatabase.h"
-
-namespace Ui {
-class OptionsDialog;
-}
-
-class OptionsDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit OptionsDialog(ProfileDatabase *profileDB, QWidget *parent = 0);
-    void commitProfiles(QStringList profiles);
-    ~OptionsDialog();
-
-private slots:
-    void on_cmdOK_clicked();
-    void on_rbPicCustomRes_toggled(bool checked);
-    void on_cbPicCustomQuality_toggled(bool checked);
-    void on_hsPicQuality_valueChanged(int value);
-    void on_cbIgnoreAspectRatio_toggled(bool checked);
-    void on_cmdExploreFolder_clicked();
-
-signals:
-    void settingsApplied(int contentMode, QString language);
-
-private:
-    ProfileDatabase *profileDB;
-    Ui::OptionsDialog *ui;
-    QList<QTreeWidgetItem*> playerItems;
-    Qt::AspectRatioMode aspectRatio;
-    QString currentLanguage;
-    QString currentCFolder;
-    QString defaultProfile;
-    QString percentString;
-    QSettings *settings;
-    bool currentFFolder;
-    int contentMode;
-    int customQuality;
-    int defaultQuality;
-    QSize defExportSize;
-    QSize cusExportSize;
-    void setupTreeWidget();
-    void setupLanguageBox();
-    void setupRadioButtons();
-    void setupDefaultProfile();
-    void setupPictureSettings();
-    void setupCustomGTAFolder();
-    void setupSnapmaticPictureViewer();
-    void applySettings();
-};
-
-#endif // OPTIONSDIALOG_H
+/******************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef OPTIONSDIALOG_H
+#define OPTIONSDIALOG_H
+
+#include <QSize>
+#include <QList>
+#include <QDialog>
+#include <QSettings>
+#include <QTreeWidgetItem>
+#include "ProfileDatabase.h"
+
+namespace Ui {
+class OptionsDialog;
+}
+
+class OptionsDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit OptionsDialog(ProfileDatabase *profileDB, QWidget *parent = 0);
+    void commitProfiles(QStringList profiles);
+    ~OptionsDialog();
+
+private slots:
+    void on_cmdOK_clicked();
+    void on_rbPicCustomRes_toggled(bool checked);
+    void on_cbPicCustomQuality_toggled(bool checked);
+    void on_hsPicQuality_valueChanged(int value);
+    void on_cbIgnoreAspectRatio_toggled(bool checked);
+    void on_cmdExploreFolder_clicked();
+
+signals:
+    void settingsApplied(int contentMode, QString language);
+
+private:
+    ProfileDatabase *profileDB;
+    Ui::OptionsDialog *ui;
+    QList<QTreeWidgetItem*> playerItems;
+    Qt::AspectRatioMode aspectRatio;
+    QString currentLanguage;
+    QString currentCFolder;
+    QString defaultProfile;
+    QString percentString;
+    QSettings *settings;
+    bool currentFFolder;
+    int contentMode;
+    int customQuality;
+    int defaultQuality;
+    QSize defExportSize;
+    QSize cusExportSize;
+    void setupTreeWidget();
+    void setupLanguageBox();
+    void setupRadioButtons();
+    void setupDefaultProfile();
+    void setupPictureSettings();
+    void setupCustomGTAFolder();
+    void setupSnapmaticPictureViewer();
+    void applySettings();
+};
+
+#endif // OPTIONSDIALOG_H
diff --git a/OptionsDialog.ui b/OptionsDialog.ui
index 995ae79..7025371 100755
--- a/OptionsDialog.ui
+++ b/OptionsDialog.ui
@@ -1,503 +1,509 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>OptionsDialog</class>
- <widget class="QDialog" name="OptionsDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>435</width>
-    <height>405</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>%1 - Settings</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlOptions">
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tabProfile">
-      <attribute name="title">
-       <string>Profiles</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="vlProfile">
-       <item>
-        <widget class="QGroupBox" name="gbWidgets">
-         <property name="title">
-          <string>Content Open/Select Mode</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlProfileContentMode">
-          <item>
-           <widget class="QRadioButton" name="rbOpenWithSC">
-            <property name="text">
-             <string>Open with Singleclick</string>
-            </property>
-            <property name="checked">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbOpenWithDC">
-            <property name="text">
-             <string>Open with Doubleclick</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbSelectWithSC">
-            <property name="text">
-             <string>Select with Singleclick</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbDefaultProfile">
-         <property name="title">
-          <string>Default Profile</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlDefaultProfile">
-          <item>
-           <widget class="QComboBox" name="cbProfiles"/>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbDefaultFolder">
-         <property name="title">
-          <string>Custom GTA V Folder</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlCustomGTAVFolder">
-          <item>
-           <widget class="QCheckBox" name="cbForceCustomFolder">
-            <property name="text">
-             <string>Force using Custom Folder</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlDefaultFolder">
-            <item>
-             <widget class="QLineEdit" name="txtFolder"/>
-            </item>
-            <item>
-             <widget class="QToolButton" name="cmdExploreFolder">
-              <property name="text">
-               <string>...</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <spacer name="vsProfile">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tabPictures">
-      <attribute name="title">
-       <string>Pictures</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="vlTabPictures">
-       <item>
-        <widget class="QGroupBox" name="gbPicResolution">
-         <property name="title">
-          <string>Export Size</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlGbPicRes">
-          <item>
-           <widget class="QRadioButton" name="rbPicDefaultRes">
-            <property name="text">
-             <string>Default: %1x%2</string>
-            </property>
-            <property name="checked">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QRadioButton" name="rbPicDesktopRes">
-            <property name="text">
-             <string>Screen Resolution: %1x%2</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlCustomRes">
-            <item>
-             <widget class="QRadioButton" name="rbPicCustomRes">
-              <property name="text">
-               <string>Custom Size:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QLabel" name="labPicCustomRes">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>Custom Size:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="sbPicExportWidth">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="minimum">
-               <number>1</number>
-              </property>
-              <property name="maximum">
-               <number>3840</number>
-              </property>
-              <property name="value">
-               <number>960</number>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QLabel" name="labPicXDescription">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>x</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSpinBox" name="sbPicExportHeight">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="minimum">
-               <number>1</number>
-              </property>
-              <property name="maximum">
-               <number>2160</number>
-              </property>
-              <property name="value">
-               <number>536</number>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="hsPicCustomSize">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>0</width>
-                <height>0</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-           </layout>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlAspectRatio">
-            <item>
-             <widget class="QCheckBox" name="cbIgnoreAspectRatio">
-              <property name="text">
-               <string>Ignore Aspect Ratio</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbPicQuality">
-         <property name="title">
-          <string>Export Quality</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlHlPicQuality">
-          <item>
-           <widget class="QCheckBox" name="cbPicCustomQuality">
-            <property name="text">
-             <string>Enable Custom Quality</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlPicQuality">
-            <item>
-             <widget class="QLabel" name="labPicQualityDescription">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>Quality:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QSlider" name="hsPicQuality">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="minimum">
-               <number>1</number>
-              </property>
-              <property name="maximum">
-               <number>100</number>
-              </property>
-              <property name="value">
-               <number>100</number>
-              </property>
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QLabel" name="labPicQuality">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>%1%</string>
-              </property>
-              <property name="wordWrap">
-               <bool>true</bool>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbSnapmaticPictureViewer">
-         <property name="title">
-          <string>Picture Viewer</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlSnapmaticPictureViewer">
-          <item>
-           <widget class="QCheckBox" name="cbSnapmaticNavigationBar">
-            <property name="text">
-             <string>Enable Navigation Bar</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <spacer name="vsTabPictures">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tabPlayers">
-      <attribute name="title">
-       <string>Players</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="vlPlayers">
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QTreeWidget" name="twPlayers">
-         <property name="frameShape">
-          <enum>QFrame::NoFrame</enum>
-         </property>
-         <property name="frameShadow">
-          <enum>QFrame::Plain</enum>
-         </property>
-         <property name="lineWidth">
-          <number>0</number>
-         </property>
-         <property name="editTriggers">
-          <set>QAbstractItemView::NoEditTriggers</set>
-         </property>
-         <property name="verticalScrollMode">
-          <enum>QAbstractItemView::ScrollPerPixel</enum>
-         </property>
-         <property name="sortingEnabled">
-          <bool>true</bool>
-         </property>
-         <property name="wordWrap">
-          <bool>true</bool>
-         </property>
-         <column>
-          <property name="text">
-           <string>ID</string>
-          </property>
-         </column>
-         <column>
-          <property name="text">
-           <string>Name</string>
-          </property>
-         </column>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tabLocalization">
-      <attribute name="title">
-       <string>Language</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="vlLocalization">
-       <item>
-        <widget class="QGroupBox" name="gbLanguage">
-         <property name="title">
-          <string>Language</string>
-         </property>
-         <layout class="QVBoxLayout" name="vlLanguage">
-          <item>
-           <widget class="QComboBox" name="cbLanguage"/>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <spacer name="vsInterface">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tabSync">
-      <attribute name="title">
-       <string>Sync</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="vlSync">
-       <item>
-        <widget class="QLabel" name="labSync">
-         <property name="text">
-          <string>Sync is not implemented at current time</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-         <property name="wordWrap">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="hlButtons">
-     <item>
-      <spacer name="hsButtons">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdOK">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string extracomment="OK, Cancel, Apply">&amp;OK</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdCancel">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string extracomment="OK, Cancel, Apply">&amp;Cancel</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>cmdCancel</sender>
-   <signal>clicked()</signal>
-   <receiver>OptionsDialog</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>352</x>
-     <y>328</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>199</x>
-     <y>174</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OptionsDialog</class>
+ <widget class="QDialog" name="OptionsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>435</width>
+    <height>405</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>%1 - Settings</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlOptions">
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="tabProfile">
+      <attribute name="title">
+       <string>Profiles</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="vlProfile">
+       <item>
+        <widget class="QGroupBox" name="gbWidgets">
+         <property name="title">
+          <string>Content Open/Select Mode</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlProfileContentMode">
+          <item>
+           <widget class="QRadioButton" name="rbOpenWithSC">
+            <property name="text">
+             <string>Open with Singleclick</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbOpenWithDC">
+            <property name="text">
+             <string>Open with Doubleclick</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbSelectWithSC">
+            <property name="text">
+             <string>Select with Singleclick</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gbDefaultProfile">
+         <property name="title">
+          <string>Default Profile</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlDefaultProfile">
+          <item>
+           <widget class="QComboBox" name="cbProfiles"/>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gbDefaultFolder">
+         <property name="title">
+          <string>Custom GTA V Folder</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlCustomGTAVFolder">
+          <item>
+           <widget class="QCheckBox" name="cbForceCustomFolder">
+            <property name="text">
+             <string>Force using Custom Folder</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlDefaultFolder">
+            <item>
+             <widget class="QLineEdit" name="txtFolder"/>
+            </item>
+            <item>
+             <widget class="QToolButton" name="cmdExploreFolder">
+              <property name="text">
+               <string>...</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <spacer name="vsProfile">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabPictures">
+      <attribute name="title">
+       <string>Pictures</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="vlTabPictures">
+       <item>
+        <widget class="QGroupBox" name="gbPicResolution">
+         <property name="title">
+          <string>Export Size</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlGbPicRes">
+          <item>
+           <widget class="QRadioButton" name="rbPicDefaultRes">
+            <property name="text">
+             <string>Default: %1x%2</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="rbPicDesktopRes">
+            <property name="text">
+             <string>Screen Resolution: %1x%2</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlCustomRes">
+            <item>
+             <widget class="QRadioButton" name="rbPicCustomRes">
+              <property name="text">
+               <string>Custom Size:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="labPicCustomRes">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>Custom Size:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="sbPicExportWidth">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="minimum">
+               <number>1</number>
+              </property>
+              <property name="maximum">
+               <number>3840</number>
+              </property>
+              <property name="value">
+               <number>960</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="labPicXDescription">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>x</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="sbPicExportHeight">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="minimum">
+               <number>1</number>
+              </property>
+              <property name="maximum">
+               <number>2160</number>
+              </property>
+              <property name="value">
+               <number>536</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="hsPicCustomSize">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>0</width>
+                <height>0</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlAspectRatio">
+            <item>
+             <widget class="QCheckBox" name="cbIgnoreAspectRatio">
+              <property name="text">
+               <string>Ignore Aspect Ratio</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gbPicQuality">
+         <property name="title">
+          <string>Export Quality</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlHlPicQuality">
+          <item>
+           <widget class="QCheckBox" name="cbPicCustomQuality">
+            <property name="text">
+             <string>Enable Custom Quality</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlPicQuality">
+            <item>
+             <widget class="QLabel" name="labPicQualityDescription">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>Quality:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSlider" name="hsPicQuality">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="minimum">
+               <number>1</number>
+              </property>
+              <property name="maximum">
+               <number>100</number>
+              </property>
+              <property name="value">
+               <number>100</number>
+              </property>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="labPicQuality">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>%1%</string>
+              </property>
+              <property name="wordWrap">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="gbSnapmaticPictureViewer">
+         <property name="title">
+          <string>Picture Viewer</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlSnapmaticPictureViewer">
+          <item>
+           <widget class="QCheckBox" name="cbSnapmaticNavigationBar">
+            <property name="text">
+             <string>Enable Navigation Bar</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <spacer name="vsTabPictures">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabPlayers">
+      <attribute name="title">
+       <string>Players</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="vlPlayers">
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QTreeWidget" name="twPlayers">
+         <property name="frameShape">
+          <enum>QFrame::NoFrame</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Plain</enum>
+         </property>
+         <property name="lineWidth">
+          <number>0</number>
+         </property>
+         <property name="editTriggers">
+          <set>QAbstractItemView::NoEditTriggers</set>
+         </property>
+         <property name="verticalScrollMode">
+          <enum>QAbstractItemView::ScrollPerPixel</enum>
+         </property>
+         <property name="sortingEnabled">
+          <bool>true</bool>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <column>
+          <property name="text">
+           <string>ID</string>
+          </property>
+         </column>
+         <column>
+          <property name="text">
+           <string>Name</string>
+          </property>
+         </column>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabLocalization">
+      <attribute name="title">
+       <string>Language</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="vlLocalization">
+       <item>
+        <widget class="QGroupBox" name="gbLanguage">
+         <property name="title">
+          <string>Language</string>
+         </property>
+         <layout class="QVBoxLayout" name="vlLanguage">
+          <item>
+           <widget class="QComboBox" name="cbLanguage"/>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <spacer name="vsInterface">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabSync">
+      <attribute name="title">
+       <string>Sync</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="vlSync">
+       <item>
+        <widget class="QLabel" name="labSync">
+         <property name="text">
+          <string>Sync is not implemented at current time</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignCenter</set>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="hlButtons">
+     <item>
+      <spacer name="hsButtons">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdOK">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Apply changes</string>
+       </property>
+       <property name="text">
+        <string extracomment="OK, Cancel, Apply">&amp;OK</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdCancel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Discard changes</string>
+       </property>
+       <property name="text">
+        <string extracomment="OK, Cancel, Apply">&amp;Cancel</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>cmdCancel</sender>
+   <signal>clicked()</signal>
+   <receiver>OptionsDialog</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>352</x>
+     <y>328</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>199</x>
+     <y>174</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/PictureDialog.cpp b/PictureDialog.cpp
index edba768..dd9cc28 100755
--- a/PictureDialog.cpp
+++ b/PictureDialog.cpp
@@ -1,689 +1,744 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "PictureDialog.h"
-#include "PictureWidget.h"
-#include "ProfileDatabase.h"
-#include "ui_PictureDialog.h"
-#include "SidebarGenerator.h"
-#include "StandardPaths.h"
-#include "PictureExport.h"
-#include "StringParser.h"
-#include "GlobalString.h"
-#include "UiModLabel.h"
-#include "AppEnv.h"
-
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-#include <QtWinExtras/QtWin>
-#include <QtWinExtras/QWinEvent>
-#endif
-#endif
-
-#include <QDesktopWidget>
-#include <QJsonDocument>
-#include <QApplication>
-#include <QStaticText>
-#include <QFileDialog>
-#include <QMessageBox>
-#include <QJsonObject>
-#include <QVariantMap>
-#include <QJsonArray>
-#include <QKeyEvent>
-#include <QMimeData>
-#include <QToolBar>
-#include <QPainter>
-#include <QPicture>
-#include <QBitmap>
-#include <QBuffer>
-#include <QImage>
-#include <QDebug>
-#include <QList>
-#include <QDrag>
-#include <QIcon>
-#include <QUrl>
-#include <QDir>
-
-PictureDialog::PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent) :
-    QDialog(parent), profileDB(profileDB), crewDB(crewDB),
-    ui(new Ui::PictureDialog)
-{
-    primaryWindow = false;
-    setupPictureDialog(true);
-}
-
-PictureDialog::PictureDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::PictureDialog)
-{
-    primaryWindow = false;
-    setupPictureDialog(false);
-}
-
-PictureDialog::PictureDialog(bool primaryWindow, ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent) :
-    QDialog(parent), primaryWindow(primaryWindow), profileDB(profileDB), crewDB(crewDB),
-    ui(new Ui::PictureDialog)
-{
-    setupPictureDialog(true);
-}
-
-PictureDialog::PictureDialog(bool primaryWindow, QWidget *parent) :
-    QDialog(parent), primaryWindow(primaryWindow),
-    ui(new Ui::PictureDialog)
-{
-    setupPictureDialog(false);
-}
-
-void PictureDialog::setupPictureDialog(bool withDatabase_)
-{
-    // Set Window Flags
-    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
-
-    // Setup User Interface
-    ui->setupUi(this);
-    windowTitleStr = this->windowTitle();
-    jsonDrawString = ui->labJSON->text();
-    ui->cmdExport->setEnabled(0);
-    plyrsList = QStringList();
-    fullscreenWidget = 0;
-    rqFullscreen = 0;
-    previewMode = 0;
-    naviEnabled = 0;
-    indexed = 0;
-    picArea = "";
-    picTitl = "";
-    picPath = "";
-    created = "";
-    crewID = "";
-    locX = "";
-    locY = "";
-    locZ = "";
-    smpic = 0;
-
-    // With datebase
-    withDatabase = withDatabase_;
-
-    // Avatar area
-    qreal screenRatio = AppEnv::screenRatio();
-    if (screenRatio != 1)
-    {
-        avatarAreaPicture = QImage(":/img/avatararea.png").scaledToHeight(536 * screenRatio, Qt::FastTransformation);
-    }
-    else
-    {
-        avatarAreaPicture = QImage(":/img/avatararea.png");
-    }
-    avatarLocX = 145;
-    avatarLocY = 66;
-    avatarSize = 470;
-
-    // Overlay area
-    renderOverlayPicture();
-    overlayEnabled = 1;
-
-    // Export menu
-    exportMenu = new QMenu(this);
-    jpegExportAction = exportMenu->addAction(tr("Export as &JPG picture..."), this, SLOT(exportSnapmaticPicture()));
-    pgtaExportAction = exportMenu->addAction(tr("Export as &GTA Snapmatic..."), this, SLOT(copySnapmaticPicture()));
-    ui->cmdExport->setMenu(exportMenu);
-
-    // Global map
-    globalMap = GlobalString::getGlobalMap();
-
-    // Event connects
-    connect(ui->labJSON, SIGNAL(resized(QSize)), this, SLOT(adaptNewDialogSize(QSize)));
-
-    // Dialog buttons
-    if (QIcon::hasThemeIcon("dialog-close"))
-    {
-        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
-    }
-
-    installEventFilter(this);
-    installEventFilter(ui->labPicture);
-    ui->labPicture->setFixedSize(960 * screenRatio, 536 * screenRatio);
-    ui->labPicture->setFocusPolicy(Qt::StrongFocus);
-
-    // Pre-adapt window for DPI
-    setFixedWidth(960 * screenRatio);
-    setFixedHeight(536 * screenRatio);
-}
-
-PictureDialog::~PictureDialog()
-{
-    delete jpegExportAction;
-    delete pgtaExportAction;
-    delete exportMenu;
-    delete ui;
-}
-
-void PictureDialog::closeEvent(QCloseEvent *ev)
-{
-    Q_UNUSED(ev)
-    if (primaryWindow && withDatabase)
-    {
-        emit endDatabaseThread();
-    }
-}
-
-void PictureDialog::addPreviousNextButtons()
-{
-    // Windows Vista additions
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-    QPalette palette;
-    QToolBar *uiToolbar = new QToolBar("Picture Toolbar", this);
-    layout()->setMenuBar(uiToolbar);
-    uiToolbar->addAction(QIcon(":/img/back.png"), "", this, SLOT(previousPictureRequestedSlot()));
-    uiToolbar->addAction(QIcon(":/img/next.png"), "", this, SLOT(nextPictureRequestedSlot()));
-    ui->jsonFrame->setStyleSheet(QString("QFrame { background: %1; }").arg(palette.window().color().name()));
-    naviEnabled = true;
-#endif
-#endif
-}
-
-void PictureDialog::adaptNewDialogSize(QSize newLabelSize)
-{
-    Q_UNUSED(newLabelSize)
-    int newDialogHeight = ui->labPicture->pixmap()->height();
-    newDialogHeight = newDialogHeight + ui->jsonFrame->height();
-    if (naviEnabled) newDialogHeight = newDialogHeight + layout()->menuBar()->height();
-    setMinimumSize(width(), newDialogHeight);
-    setMaximumSize(width(), newDialogHeight);
-    setFixedHeight(newDialogHeight);
-    ui->labPicture->updateGeometry();
-    ui->jsonFrame->updateGeometry();
-    updateGeometry();
-}
-
-void PictureDialog::stylizeDialog()
-{
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-    if (QtWin::isCompositionEnabled())
-    {
-        QtWin::extendFrameIntoClientArea(this, 0, this->layout()->menuBar()->height(), 0, 0);
-        setAttribute(Qt::WA_TranslucentBackground, true);
-        setAttribute(Qt::WA_NoSystemBackground, false);
-        setStyleSheet("PictureDialog { background: transparent; }");
-    }
-    else
-    {
-        QtWin::resetExtendedFrame(this);
-        setAttribute(Qt::WA_TranslucentBackground, false);
-        setStyleSheet(QString("PictureDialog { background: %1; }").arg(QtWin::realColorizationColor().name()));
-    }
-#endif
-#endif
-}
-
-bool PictureDialog::event(QEvent *event)
-{
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050200
-    if (naviEnabled)
-    {
-        if (event->type() == QWinEvent::CompositionChange || event->type() == QWinEvent::ColorizationChange)
-        {
-            stylizeDialog();
-        }
-    }
-#endif
-#endif
-    return QDialog::event(event);
-}
-
-void PictureDialog::nextPictureRequestedSlot()
-{
-    emit nextPictureRequested();
-}
-
-void PictureDialog::previousPictureRequestedSlot()
-{
-    emit previousPictureRequested();
-}
-
-bool PictureDialog::eventFilter(QObject *obj, QEvent *ev)
-{
-    bool returnValue = false;
-    if (obj == this || obj == ui->labPicture)
-    {
-        if (ev->type() == QEvent::KeyPress)
-        {
-            QKeyEvent *keyEvent = (QKeyEvent*)ev;
-            switch (keyEvent->key()){
-            case Qt::Key_Left:
-                emit previousPictureRequested();
-                returnValue = true;
-                break;
-            case Qt::Key_Right:
-                emit nextPictureRequested();
-                returnValue = true;
-                break;
-            case Qt::Key_E: case Qt::Key_S: case Qt::Key_Save:
-                ui->cmdExport->click();
-                returnValue = true;
-                break;
-            case Qt::Key_1:
-                if (previewMode)
-                {
-                    previewMode = false;
-                    renderPicture();
-                }
-                else
-                {
-                    previewMode = true;
-                    renderPicture();
-                }
-                break;
-            case Qt::Key_2:
-                if (overlayEnabled)
-                {
-                    overlayEnabled = false;
-                    if (!previewMode) renderPicture();
-                }
-                else
-                {
-                    overlayEnabled = true;
-                    if (!previewMode) renderPicture();
-                }
-                break;
-#if QT_VERSION >= 0x050300
-            case Qt::Key_Exit:
-                ui->cmdClose->click();
-                returnValue = true;
-                break;
-#endif
-            case Qt::Key_Enter: case Qt::Key_Return:
-                on_labPicture_mouseDoubleClicked(Qt::LeftButton);
-                returnValue = true;
-                break;
-            case Qt::Key_Escape:
-                ui->cmdClose->click();
-                returnValue = true;
-                break;
-            }
-        }
-    }
-    return returnValue;
-}
-
-void PictureDialog::triggerFullscreenDoubeClick()
-{
-    on_labPicture_mouseDoubleClicked(Qt::LeftButton);
-}
-
-void PictureDialog::exportCustomContextMenuRequestedPrivate(const QPoint &pos, bool fullscreen)
-{
-    rqFullscreen = fullscreen;
-    exportMenu->popup(pos);
-}
-
-void PictureDialog::exportCustomContextMenuRequested(const QPoint &pos)
-{
-    exportCustomContextMenuRequestedPrivate(pos, true);
-}
-
-void PictureDialog::mousePressEvent(QMouseEvent *ev)
-{
-    QDialog::mousePressEvent(ev);
-}
-
-void PictureDialog::dialogNextPictureRequested()
-{
-    emit nextPictureRequested();
-}
-
-void PictureDialog::dialogPreviousPictureRequested()
-{
-    emit previousPictureRequested();
-}
-
-void PictureDialog::renderOverlayPicture()
-{
-    // Generating Overlay Preview
-    qreal screenRatio = AppEnv::screenRatio();
-    QRect preferedRect = QRect(0, 0, 200 * screenRatio, 160 * screenRatio);
-    QString overlayText = tr("Key 1 - Avatar Preview Mode\nKey 2 - Toggle Overlay\nArrow Keys - Navigate");
-    QImage overlayImage(1, 1, QImage::Format_ARGB32_Premultiplied);
-    overlayImage.fill(Qt::transparent);
-
-    QPainter overlayPainter(&overlayImage);
-    QFont overlayPainterFont;
-    overlayPainterFont.setPixelSize(12 * screenRatio);
-    overlayPainter.setFont(overlayPainterFont);
-    QRect overlaySpace = overlayPainter.boundingRect(preferedRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextDontClip | Qt::TextWordWrap, overlayText);
-    overlayPainter.end();
-
-    int hOverlay = Qt::AlignTop;
-    if (overlaySpace.height() < 74 * screenRatio)
-    {
-        hOverlay = Qt::AlignVCenter;
-        preferedRect.setHeight(71 * screenRatio);
-        overlaySpace.setHeight(80 * screenRatio);
-    }
-    else
-    {
-        overlaySpace.setHeight(overlaySpace.height() + 6 * screenRatio);
-    }
-
-    overlayImage = overlayImage.scaled(overlaySpace.size());
-    overlayPainter.begin(&overlayImage);
-    overlayPainter.setPen(QColor::fromRgb(255, 255, 255, 255));
-    overlayPainter.setFont(overlayPainterFont);
-    overlayPainter.drawText(preferedRect, Qt::AlignLeft | hOverlay | Qt::TextDontClip | Qt::TextWordWrap, overlayText);
-    overlayPainter.end();
-
-    if (overlaySpace.width() < 194 * screenRatio)
-    {
-        overlaySpace.setWidth(200 * screenRatio);
-    }
-    else
-    {
-        overlaySpace.setWidth(overlaySpace.width() + 6 * screenRatio);
-    }
-
-    QImage overlayBorderImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied);
-    overlayBorderImage.fill(QColor(15, 15, 15, 162));
-
-    overlayTempImage = QImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied);
-    overlayTempImage.fill(Qt::transparent);
-    QPainter overlayTempPainter(&overlayTempImage);
-    overlayTempPainter.drawImage(0, 0, overlayBorderImage);
-    overlayTempPainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayImage);
-    overlayTempPainter.end();
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool _indexed, int _index)
-{
-    snapmaticPicture = QImage();
-    indexed = _indexed;
-    index = _index;
-    picPath = picture->getPictureFilePath();
-    smpic = picture;
-    if (!readOk)
-    {
-        QMessageBox::warning(this, tr("Snapmatic Picture Viewer"), tr("Failed at %1").arg(picture->getLastStep()));
-        return;
-    }
-    if (picture->isPicOk())
-    {
-        snapmaticPicture = picture->getImage();
-        renderPicture();
-        ui->cmdExport->setEnabled(true);
-    }
-    if (picture->isJsonOk())
-    {
-        locX = QString::number(picture->getSnapmaticProperties().location.x);
-        locY = QString::number(picture->getSnapmaticProperties().location.y);
-        locZ = QString::number(picture->getSnapmaticProperties().location.z);
-        if (withDatabase)
-        {
-            crewID = crewDB->getCrewName(picture->getSnapmaticProperties().crewID);
-        }
-        else
-        {
-            crewID = QString::number(picture->getSnapmaticProperties().crewID);
-        }
-        created = picture->getSnapmaticProperties().createdDateTime.toString(Qt::DefaultLocaleShortDate);
-        plyrsList = picture->getSnapmaticProperties().playersList;
-        picTitl = StringParser::escapeString(picture->getPictureTitle());
-        picArea = picture->getSnapmaticProperties().location.area;
-        if (globalMap.contains(picArea))
-        {
-            picAreaStr = globalMap[picArea];
-        }
-        else
-        {
-            picAreaStr = picArea;
-        }
-
-        QString plyrsStr;
-        if (plyrsList.length() >= 1)
-        {
-            foreach (const QString &player, plyrsList)
-            {
-                QString playerName;
-                if (withDatabase)
-                {
-                    playerName = profileDB->getPlayerName(player.toInt());
-                }
-                else
-                {
-                    playerName = player;
-                }
-                plyrsStr.append(", <a href=\"https://socialclub.rockstargames.com/member/");
-                plyrsStr.append(playerName);
-                plyrsStr.append("/");
-                plyrsStr.append(player);
-                plyrsStr.append("\">");
-                plyrsStr.append(playerName);
-                plyrsStr.append("</a>");
-            }
-            plyrsStr.remove(0,2);
-        }
-        else
-        {
-            plyrsStr = tr("No player");
-        }
-
-        if (crewID == "") { crewID = tr("No crew"); }
-
-        this->setWindowTitle(windowTitleStr.arg(picture->getPictureStr()));
-        ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, plyrsStr, crewID, picTitl, picAreaStr, created));
-    }
-    else
-    {
-        ui->labJSON->setText(jsonDrawString.arg("0.0", "0.0", "0.0", tr("No player"), tr("No crew"), tr("Unknown Location")));
-        QMessageBox::warning(this,tr("Snapmatic Picture Viewer"),tr("Failed at %1").arg(picture->getLastStep()));
-    }
-    emit newPictureCommited(snapmaticPicture);
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index)
-{
-    setSnapmaticPicture(picture, readOk, true, index);
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk)
-{
-    setSnapmaticPicture(picture, readOk, false, 0);
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, int index)
-{
-    setSnapmaticPicture(picture, true, index);
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture)
-{
-    setSnapmaticPicture(picture, true);
-}
-
-void PictureDialog::renderPicture()
-{
-    qreal screenRatio = AppEnv::screenRatio();
-    if (!previewMode)
-    {
-        if (overlayEnabled)
-        {
-            QPixmap shownImagePixmap(960 * screenRatio, 536 * screenRatio);
-            shownImagePixmap.fill(Qt::transparent);
-            QPainter shownImagePainter(&shownImagePixmap);
-            if (screenRatio == 1)
-            {
-                shownImagePainter.drawImage(0, 0, snapmaticPicture);
-                shownImagePainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage);
-            }
-            else
-            {
-                shownImagePainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
-                shownImagePainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage);
-            }
-            shownImagePainter.end();
-            ui->labPicture->setPixmap(shownImagePixmap);
-        }
-        else
-        {
-            if (screenRatio != 1)
-            {
-                QPixmap shownImagePixmap(960 * screenRatio, 536 * screenRatio);
-                shownImagePixmap.fill(Qt::transparent);
-                QPainter shownImagePainter(&shownImagePixmap);
-                shownImagePainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
-                shownImagePainter.end();
-                ui->labPicture->setPixmap(shownImagePixmap);
-            }
-            else
-            {
-                ui->labPicture->setPixmap(QPixmap::fromImage(snapmaticPicture));
-            }
-        }
-    }
-    else
-    {
-        // Generating Avatar Preview
-        QPixmap avatarPixmap(960 * screenRatio, 536 * screenRatio);
-        QPainter snapPainter(&avatarPixmap);
-        QFont snapPainterFont;
-        snapPainterFont.setPixelSize(12 * screenRatio);
-        if (screenRatio == 1)
-        {
-            snapPainter.drawImage(0, 0, snapmaticPicture);
-        }
-        else
-        {
-            snapPainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
-        }
-        snapPainter.drawImage(0, 0, avatarAreaPicture);
-        snapPainter.setPen(QColor::fromRgb(255, 255, 255, 255));
-        snapPainter.setFont(snapPainterFont);
-        snapPainter.drawText(QRect(3 * screenRatio, 3 * screenRatio, 140 * screenRatio, 60 * screenRatio), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View"));
-        snapPainter.end();
-        ui->labPicture->setPixmap(avatarPixmap);
-    }
-}
-
-void PictureDialog::playerNameUpdated()
-{
-    if (plyrsList.count() >= 1)
-    {
-        QString plyrsStr;
-        foreach (const QString &player, plyrsList)
-        {
-            QString playerName;
-            if (withDatabase)
-            {
-                playerName = profileDB->getPlayerName(player.toInt());
-            }
-            else
-            {
-                playerName = player;
-            }
-            plyrsStr.append(", <a href=\"https://socialclub.rockstargames.com/member/");
-            if (playerName != player)
-            {
-                plyrsStr.append(playerName);
-            }
-            else
-            {
-                plyrsStr.append("id");
-            }
-            plyrsStr.append("/");
-            plyrsStr.append(player);
-            plyrsStr.append("\">");
-            plyrsStr.append(playerName);
-            plyrsStr.append("</a>");
-        }
-        plyrsStr.remove(0,2);
-        ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, plyrsStr, crewID, picTitl, picAreaStr, created));
-    }
-}
-
-void PictureDialog::exportSnapmaticPicture()
-{
-    if (rqFullscreen && fullscreenWidget)
-    {
-        PictureExport::exportAsPicture(fullscreenWidget, smpic);
-    }
-    else
-    {
-        PictureExport::exportAsPicture(this, smpic);
-    }
-}
-
-void PictureDialog::copySnapmaticPicture()
-{
-    if (rqFullscreen && fullscreenWidget)
-    {
-        PictureExport::exportAsSnapmatic(fullscreenWidget, smpic);
-    }
-    else
-    {
-        PictureExport::exportAsSnapmatic(this, smpic);
-    }
-}
-
-void PictureDialog::on_labPicture_mouseDoubleClicked(Qt::MouseButton button)
-{
-    if (button == Qt::LeftButton)
-    {
-        QRect desktopRect = QApplication::desktop()->screenGeometry(this);
-        PictureWidget *pictureWidget = new PictureWidget(this); // Work!
-        pictureWidget->setObjectName("PictureWidget");
-#if QT_VERSION >= 0x050600
-        pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint^Qt::MaximizeUsingFullscreenGeometryHint);
-#else
-        pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint);
-#endif
-        pictureWidget->setWindowTitle(this->windowTitle());
-        pictureWidget->setStyleSheet("QLabel#pictureLabel{background-color: black;}");
-        pictureWidget->setImage(snapmaticPicture, desktopRect);
-        pictureWidget->setModal(true);
-
-        fullscreenWidget = pictureWidget;
-        QObject::connect(this, SIGNAL(newPictureCommited(QImage)), pictureWidget, SLOT(setImage(QImage)));
-        QObject::connect(pictureWidget, SIGNAL(nextPictureRequested()), this, SLOT(dialogNextPictureRequested()));
-        QObject::connect(pictureWidget, SIGNAL(previousPictureRequested()), this, SLOT(dialogPreviousPictureRequested()));
-
-        pictureWidget->move(desktopRect.x(), desktopRect.y());
-        pictureWidget->resize(desktopRect.width(), desktopRect.height());
-        pictureWidget->showFullScreen();
-        pictureWidget->setFocus();
-        pictureWidget->raise();
-        pictureWidget->exec();
-
-        fullscreenWidget = 0; // Work!
-        delete pictureWidget; // Work!
-    }
-}
-
-void PictureDialog::on_labPicture_customContextMenuRequested(const QPoint &pos)
-{
-    exportCustomContextMenuRequestedPrivate(ui->labPicture->mapToGlobal(pos), false);
-}
-
-bool PictureDialog::isIndexed()
-{
-    return indexed;
-}
-
-int PictureDialog::getIndex()
-{
-    return index;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "PictureDialog.h"
+#include "PictureWidget.h"
+#include "ProfileDatabase.h"
+#include "ui_PictureDialog.h"
+#include "SidebarGenerator.h"
+#include "MapPreviewDialog.h"
+#include "SnapmaticEditor.h"
+#include "StandardPaths.h"
+#include "PictureExport.h"
+#include "StringParser.h"
+#include "GlobalString.h"
+#include "UiModLabel.h"
+#include "AppEnv.h"
+
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+#include <QtWinExtras/QtWin>
+#include <QtWinExtras/QWinEvent>
+#endif
+#endif
+
+#include <QStringBuilder>
+#include <QDesktopWidget>
+#include <QJsonDocument>
+#include <QApplication>
+#include <QStaticText>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QJsonObject>
+#include <QVariantMap>
+#include <QJsonArray>
+#include <QKeyEvent>
+#include <QMimeData>
+#include <QToolBar>
+#include <QPainter>
+#include <QPicture>
+#include <QBitmap>
+#include <QBuffer>
+#include <QImage>
+#include <QDebug>
+#include <QList>
+#include <QDrag>
+#include <QIcon>
+#include <QUrl>
+#include <QDir>
+
+PictureDialog::PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent) :
+    QDialog(parent), profileDB(profileDB), crewDB(crewDB),
+    ui(new Ui::PictureDialog)
+{
+    primaryWindow = false;
+    setupPictureDialog(true);
+}
+
+PictureDialog::PictureDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::PictureDialog)
+{
+    primaryWindow = false;
+    setupPictureDialog(false);
+}
+
+PictureDialog::PictureDialog(bool primaryWindow, ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent) :
+    QDialog(parent), primaryWindow(primaryWindow), profileDB(profileDB), crewDB(crewDB),
+    ui(new Ui::PictureDialog)
+{
+    setupPictureDialog(true);
+}
+
+PictureDialog::PictureDialog(bool primaryWindow, QWidget *parent) :
+    QDialog(parent), primaryWindow(primaryWindow),
+    ui(new Ui::PictureDialog)
+{
+    setupPictureDialog(false);
+}
+
+void PictureDialog::setupPictureDialog(bool withDatabase_)
+{
+    // Set Window Flags
+    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
+
+    // Setup User Interface
+    ui->setupUi(this);
+    windowTitleStr = this->windowTitle();
+    jsonDrawString = ui->labJSON->text();
+    ui->cmdManage->setEnabled(false);
+    plyrsList = QStringList();
+    fullscreenWidget = nullptr;
+    rqFullscreen = false;
+    previewMode = false;
+    naviEnabled = false;
+    indexed = false;
+    picArea = "";
+    picTitl = "";
+    picPath = "";
+    created = "";
+    crewStr = "";
+    crewID = "";
+    locX = "";
+    locY = "";
+    locZ = "";
+    smpic = nullptr;
+
+    // With datebase
+    withDatabase = withDatabase_;
+
+    // Avatar area
+    qreal screenRatio = AppEnv::screenRatio();
+    if (screenRatio != 1)
+    {
+        avatarAreaPicture = QImage(":/img/avatararea.png").scaledToHeight(536 * screenRatio, Qt::FastTransformation);
+    }
+    else
+    {
+        avatarAreaPicture = QImage(":/img/avatararea.png");
+    }
+    avatarLocX = 145;
+    avatarLocY = 66;
+    avatarSize = 470;
+
+    // Overlay area
+    renderOverlayPicture();
+    overlayEnabled = true;
+
+    // Manage menu
+    manageMenu = new QMenu(this);
+    jpegExportAction = manageMenu->addAction(tr("Export as &Picture..."), this, SLOT(exportSnapmaticPicture()));
+    pgtaExportAction = manageMenu->addAction(tr("Export as &Snapmatic..."), this, SLOT(copySnapmaticPicture()));
+    manageMenuSep1 = manageMenu->addSeparator();
+    openViewerAction = manageMenu->addAction(tr("Open &Map View..."), this, SLOT(openPreviewMap()));
+    openViewerAction->setShortcut(Qt::Key_M);
+    propEditorAction = manageMenu->addAction(tr("&Edit Properties..."), this, SLOT(editSnapmaticProperties()));
+    ui->cmdManage->setMenu(manageMenu);
+
+    // Global map
+    globalMap = GlobalString::getGlobalMap();
+
+    // Event connects
+    connect(ui->labJSON, SIGNAL(resized(QSize)), this, SLOT(adaptNewDialogSize(QSize)));
+
+    // Dialog buttons
+    if (QIcon::hasThemeIcon("dialog-close"))
+    {
+        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+    }
+
+    installEventFilter(this);
+    installEventFilter(ui->labPicture);
+    ui->labPicture->setFixedSize(960 * screenRatio, 536 * screenRatio);
+    ui->labPicture->setFocusPolicy(Qt::StrongFocus);
+
+    // Pre-adapt window for DPI
+    setFixedWidth(960 * screenRatio);
+    setFixedHeight(536 * screenRatio);
+}
+
+PictureDialog::~PictureDialog()
+{
+    delete propEditorAction;
+    delete openViewerAction;
+    delete jpegExportAction;
+    delete pgtaExportAction;
+    delete manageMenuSep1;
+    delete manageMenu;
+    delete ui;
+}
+
+void PictureDialog::closeEvent(QCloseEvent *ev)
+{
+    Q_UNUSED(ev)
+    if (primaryWindow && withDatabase)
+    {
+        emit endDatabaseThread();
+    }
+}
+
+void PictureDialog::addPreviousNextButtons()
+{
+    // Windows Vista additions
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+    QPalette palette;
+    QToolBar *uiToolbar = new QToolBar("Picture Toolbar", this);
+    layout()->setMenuBar(uiToolbar);
+    uiToolbar->addAction(QIcon(":/img/back.png"), "", this, SLOT(previousPictureRequestedSlot()));
+    uiToolbar->addAction(QIcon(":/img/next.png"), "", this, SLOT(nextPictureRequestedSlot()));
+    ui->jsonFrame->setStyleSheet(QString("QFrame { background: %1; }").arg(palette.window().color().name()));
+    naviEnabled = true;
+#endif
+#endif
+}
+
+void PictureDialog::adaptNewDialogSize(QSize newLabelSize)
+{
+    Q_UNUSED(newLabelSize)
+    int newDialogHeight = ui->labPicture->pixmap()->height();
+    newDialogHeight = newDialogHeight + ui->jsonFrame->height();
+    if (naviEnabled) newDialogHeight = newDialogHeight + layout()->menuBar()->height();
+    setMinimumSize(width(), newDialogHeight);
+    setMaximumSize(width(), newDialogHeight);
+    setFixedHeight(newDialogHeight);
+    ui->labPicture->updateGeometry();
+    ui->jsonFrame->updateGeometry();
+    updateGeometry();
+}
+
+void PictureDialog::stylizeDialog()
+{
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+    if (QtWin::isCompositionEnabled())
+    {
+        QtWin::extendFrameIntoClientArea(this, 0, this->layout()->menuBar()->height(), 0, 0);
+        setAttribute(Qt::WA_TranslucentBackground, true);
+        setAttribute(Qt::WA_NoSystemBackground, false);
+        setStyleSheet("PictureDialog { background: transparent; }");
+    }
+    else
+    {
+        QtWin::resetExtendedFrame(this);
+        setAttribute(Qt::WA_TranslucentBackground, false);
+        setStyleSheet(QString("PictureDialog { background: %1; }").arg(QtWin::realColorizationColor().name()));
+    }
+#endif
+#endif
+}
+
+bool PictureDialog::event(QEvent *event)
+{
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050200
+    if (naviEnabled)
+    {
+        if (event->type() == QWinEvent::CompositionChange || event->type() == QWinEvent::ColorizationChange)
+        {
+            stylizeDialog();
+        }
+    }
+#endif
+#endif
+    return QDialog::event(event);
+}
+
+void PictureDialog::nextPictureRequestedSlot()
+{
+    emit nextPictureRequested();
+}
+
+void PictureDialog::previousPictureRequestedSlot()
+{
+    emit previousPictureRequested();
+}
+
+bool PictureDialog::eventFilter(QObject *obj, QEvent *ev)
+{
+    bool returnValue = false;
+    if (obj == this || obj == ui->labPicture)
+    {
+        if (ev->type() == QEvent::KeyPress)
+        {
+            QKeyEvent *keyEvent = (QKeyEvent*)ev;
+            switch (keyEvent->key()){
+            case Qt::Key_Left:
+                emit previousPictureRequested();
+                returnValue = true;
+                break;
+            case Qt::Key_Right:
+                emit nextPictureRequested();
+                returnValue = true;
+                break;
+            case Qt::Key_1:
+                if (previewMode)
+                {
+                    previewMode = false;
+                    renderPicture();
+                }
+                else
+                {
+                    previewMode = true;
+                    renderPicture();
+                }
+                break;
+            case Qt::Key_2:
+                if (overlayEnabled)
+                {
+                    overlayEnabled = false;
+                    if (!previewMode) renderPicture();
+                }
+                else
+                {
+                    overlayEnabled = true;
+                    if (!previewMode) renderPicture();
+                }
+                break;
+            case Qt::Key_M:
+                openPreviewMap();
+                returnValue = true;
+                break;
+#if QT_VERSION >= 0x050300
+            case Qt::Key_Exit:
+                ui->cmdClose->click();
+                returnValue = true;
+                break;
+#endif
+            case Qt::Key_Enter: case Qt::Key_Return:
+                on_labPicture_mouseDoubleClicked(Qt::LeftButton);
+                returnValue = true;
+                break;
+            case Qt::Key_Escape:
+                ui->cmdClose->click();
+                returnValue = true;
+                break;
+            }
+        }
+    }
+    return returnValue;
+}
+
+void PictureDialog::triggerFullscreenDoubeClick()
+{
+    on_labPicture_mouseDoubleClicked(Qt::LeftButton);
+}
+
+void PictureDialog::exportCustomContextMenuRequestedPrivate(const QPoint &pos, bool fullscreen)
+{
+    rqFullscreen = fullscreen;
+    manageMenu->popup(pos);
+}
+
+void PictureDialog::exportCustomContextMenuRequested(const QPoint &pos)
+{
+    exportCustomContextMenuRequestedPrivate(pos, true);
+}
+
+void PictureDialog::mousePressEvent(QMouseEvent *ev)
+{
+    QDialog::mousePressEvent(ev);
+}
+
+void PictureDialog::dialogNextPictureRequested()
+{
+    emit nextPictureRequested();
+}
+
+void PictureDialog::dialogPreviousPictureRequested()
+{
+    emit previousPictureRequested();
+}
+
+void PictureDialog::renderOverlayPicture()
+{
+    // Generating Overlay Preview
+    qreal screenRatio = AppEnv::screenRatio();
+    QRect preferedRect = QRect(0, 0, 200 * screenRatio, 160 * screenRatio);
+    QString overlayText = tr("Key 1 - Avatar Preview Mode\nKey 2 - Toggle Overlay\nArrow Keys - Navigate");
+    QImage overlayImage(1, 1, QImage::Format_ARGB32_Premultiplied);
+    overlayImage.fill(Qt::transparent);
+
+    QPainter overlayPainter(&overlayImage);
+    QFont overlayPainterFont;
+    overlayPainterFont.setPixelSize(12 * screenRatio);
+    overlayPainter.setFont(overlayPainterFont);
+    QRect overlaySpace = overlayPainter.boundingRect(preferedRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextDontClip | Qt::TextWordWrap, overlayText);
+    overlayPainter.end();
+
+    int hOverlay = Qt::AlignTop;
+    if (overlaySpace.height() < 74 * screenRatio)
+    {
+        hOverlay = Qt::AlignVCenter;
+        preferedRect.setHeight(71 * screenRatio);
+        overlaySpace.setHeight(80 * screenRatio);
+    }
+    else
+    {
+        overlaySpace.setHeight(overlaySpace.height() + 6 * screenRatio);
+    }
+
+    overlayImage = overlayImage.scaled(overlaySpace.size());
+    overlayPainter.begin(&overlayImage);
+    overlayPainter.setPen(QColor::fromRgb(255, 255, 255, 255));
+    overlayPainter.setFont(overlayPainterFont);
+    overlayPainter.drawText(preferedRect, Qt::AlignLeft | hOverlay | Qt::TextDontClip | Qt::TextWordWrap, overlayText);
+    overlayPainter.end();
+
+    if (overlaySpace.width() < 194 * screenRatio)
+    {
+        overlaySpace.setWidth(200 * screenRatio);
+    }
+    else
+    {
+        overlaySpace.setWidth(overlaySpace.width() + 6 * screenRatio);
+    }
+
+    QImage overlayBorderImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied);
+    overlayBorderImage.fill(QColor(15, 15, 15, 162));
+
+    overlayTempImage = QImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied);
+    overlayTempImage.fill(Qt::transparent);
+    QPainter overlayTempPainter(&overlayTempImage);
+    overlayTempPainter.drawImage(0, 0, overlayBorderImage);
+    overlayTempPainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayImage);
+    overlayTempPainter.end();
+}
+
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool _indexed, int _index)
+{
+    if (smpic != nullptr) smpic->disconnect(this, SLOT(updated()));
+    snapmaticPicture = QImage();
+    indexed = _indexed;
+    index = _index;
+    picPath = picture->getPictureFilePath();
+    smpic = picture;
+    if (!readOk)
+    {
+        QMessageBox::warning(this, tr("Snapmatic Picture Viewer"), tr("Failed at %1").arg(picture->getLastStep()));
+        return;
+    }
+    if (picture->isPicOk())
+    {
+        snapmaticPicture = picture->getImage();
+        renderPicture();
+        ui->cmdManage->setEnabled(true);
+    }
+    if (picture->isJsonOk())
+    {
+        locX = QString::number(picture->getSnapmaticProperties().location.x);
+        locY = QString::number(picture->getSnapmaticProperties().location.y);
+        locZ = QString::number(picture->getSnapmaticProperties().location.z);
+        if (withDatabase)
+        {
+            crewID = QString::number(picture->getSnapmaticProperties().crewID);
+            crewStr = crewDB->getCrewName(picture->getSnapmaticProperties().crewID);
+        }
+        else
+        {
+            crewID = QString::number(picture->getSnapmaticProperties().crewID);
+            crewStr = QString::number(picture->getSnapmaticProperties().crewID);
+        }
+        created = picture->getSnapmaticProperties().createdDateTime.toString(Qt::DefaultLocaleShortDate);
+        plyrsList = picture->getSnapmaticProperties().playersList;
+        picTitl = StringParser::escapeString(picture->getPictureTitle());
+        picArea = picture->getSnapmaticProperties().location.area;
+        if (globalMap.contains(picArea))
+        {
+            picAreaStr = globalMap[picArea];
+        }
+        else
+        {
+            picAreaStr = picArea;
+        }
+
+        this->setWindowTitle(windowTitleStr.arg(picture->getPictureStr()));
+        ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
+    }
+    else
+    {
+        ui->labJSON->setText(jsonDrawString.arg("0", "0", "0", tr("No Players"), tr("No Crew"), tr("Unknown Location")));
+        QMessageBox::warning(this,tr("Snapmatic Picture Viewer"),tr("Failed at %1").arg(picture->getLastStep()));
+    }
+    QObject::connect(smpic, SIGNAL(updated()), this, SLOT(updated()));
+    emit newPictureCommited(snapmaticPicture);
+}
+
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index)
+{
+    setSnapmaticPicture(picture, readOk, true, index);
+}
+
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk)
+{
+    setSnapmaticPicture(picture, readOk, false, 0);
+}
+
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, int index)
+{
+    setSnapmaticPicture(picture, true, index);
+}
+
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture)
+{
+    setSnapmaticPicture(picture, true);
+}
+
+void PictureDialog::renderPicture()
+{
+    qreal screenRatio = AppEnv::screenRatio();
+    if (!previewMode)
+    {
+        if (overlayEnabled)
+        {
+            QPixmap shownImagePixmap(960 * screenRatio, 536 * screenRatio);
+            shownImagePixmap.fill(Qt::transparent);
+            QPainter shownImagePainter(&shownImagePixmap);
+            if (screenRatio == 1)
+            {
+                shownImagePainter.drawImage(0, 0, snapmaticPicture);
+                shownImagePainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage);
+            }
+            else
+            {
+                shownImagePainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
+                shownImagePainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage);
+            }
+            shownImagePainter.end();
+            ui->labPicture->setPixmap(shownImagePixmap);
+        }
+        else
+        {
+            if (screenRatio != 1)
+            {
+                QPixmap shownImagePixmap(960 * screenRatio, 536 * screenRatio);
+                shownImagePixmap.fill(Qt::transparent);
+                QPainter shownImagePainter(&shownImagePixmap);
+                shownImagePainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
+                shownImagePainter.end();
+                ui->labPicture->setPixmap(shownImagePixmap);
+            }
+            else
+            {
+                ui->labPicture->setPixmap(QPixmap::fromImage(snapmaticPicture));
+            }
+        }
+    }
+    else
+    {
+        // Generating Avatar Preview
+        QPixmap avatarPixmap(960 * screenRatio, 536 * screenRatio);
+        QPainter snapPainter(&avatarPixmap);
+        QFont snapPainterFont;
+        snapPainterFont.setPixelSize(12 * screenRatio);
+        if (screenRatio == 1)
+        {
+            snapPainter.drawImage(0, 0, snapmaticPicture);
+        }
+        else
+        {
+            snapPainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation));
+        }
+        snapPainter.drawImage(0, 0, avatarAreaPicture);
+        snapPainter.setPen(QColor::fromRgb(255, 255, 255, 255));
+        snapPainter.setFont(snapPainterFont);
+        snapPainter.drawText(QRect(3 * screenRatio, 3 * screenRatio, 140 * screenRatio, 536 * screenRatio), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View"));
+        snapPainter.end();
+        ui->labPicture->setPixmap(avatarPixmap);
+    }
+}
+
+void PictureDialog::crewNameUpdated()
+{
+    if (withDatabase && crewID == crewStr)
+    {
+        crewStr = crewDB->getCrewName(crewID.toInt());
+        ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
+    }
+}
+
+void PictureDialog::playerNameUpdated()
+{
+    if (plyrsList.count() >= 1)
+    {
+        ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
+    }
+}
+
+QString PictureDialog::generateCrewString()
+{
+    if (crewID != "0" && !crewID.isEmpty())
+    {
+        return QString("<a href=\"https://socialclub.rockstargames.com/crew/" % QString(crewStr).replace(" ", "_") % "/" % crewID % "\">" % crewStr % "</a>");
+    }
+    return tr("No Crew");
+}
+
+QString PictureDialog::generatePlayersString()
+{
+    QString plyrsStr;
+    if (plyrsList.length() >= 1)
+    {
+        foreach (const QString &player, plyrsList)
+        {
+            QString playerName;
+            if (withDatabase)
+            {
+                playerName = profileDB->getPlayerName(player.toInt());
+            }
+            else
+            {
+                playerName = player;
+            }
+            plyrsStr += ", <a href=\"https://socialclub.rockstargames.com/member/" % playerName % "/" % player % "\">" % playerName % "</a>";
+        }
+        plyrsStr.remove(0,2);
+    }
+    else
+    {
+        plyrsStr = tr("No Players");
+    }
+    return plyrsStr;
+}
+
+void PictureDialog::exportSnapmaticPicture()
+{
+    if (rqFullscreen && fullscreenWidget != nullptr)
+    {
+        PictureExport::exportAsPicture(fullscreenWidget, smpic);
+    }
+    else
+    {
+        PictureExport::exportAsPicture(this, smpic);
+    }
+}
+
+void PictureDialog::copySnapmaticPicture()
+{
+    if (rqFullscreen && fullscreenWidget != nullptr)
+    {
+        PictureExport::exportAsSnapmatic(fullscreenWidget, smpic);
+    }
+    else
+    {
+        PictureExport::exportAsSnapmatic(this, smpic);
+    }
+}
+
+void PictureDialog::on_labPicture_mouseDoubleClicked(Qt::MouseButton button)
+{
+    if (button == Qt::LeftButton)
+    {
+        QRect desktopRect = QApplication::desktop()->screenGeometry(this);
+        PictureWidget *pictureWidget = new PictureWidget(this); // Work!
+        pictureWidget->setObjectName("PictureWidget");
+#if QT_VERSION >= 0x050600
+        pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint^Qt::MaximizeUsingFullscreenGeometryHint);
+#else
+        pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint);
+#endif
+        pictureWidget->setWindowTitle(this->windowTitle());
+        pictureWidget->setStyleSheet("QLabel#pictureLabel{background-color: black;}");
+        pictureWidget->setImage(snapmaticPicture, desktopRect);
+        pictureWidget->setModal(true);
+
+        fullscreenWidget = pictureWidget;
+        QObject::connect(this, SIGNAL(newPictureCommited(QImage)), pictureWidget, SLOT(setImage(QImage)));
+        QObject::connect(pictureWidget, SIGNAL(nextPictureRequested()), this, SLOT(dialogNextPictureRequested()));
+        QObject::connect(pictureWidget, SIGNAL(previousPictureRequested()), this, SLOT(dialogPreviousPictureRequested()));
+
+        pictureWidget->move(desktopRect.x(), desktopRect.y());
+        pictureWidget->resize(desktopRect.width(), desktopRect.height());
+        pictureWidget->showFullScreen();
+        pictureWidget->setFocus();
+        pictureWidget->raise();
+        pictureWidget->exec();
+
+        fullscreenWidget = nullptr; // Work!
+        delete pictureWidget; // Work!
+    }
+}
+
+void PictureDialog::on_labPicture_customContextMenuRequested(const QPoint &pos)
+{
+    exportCustomContextMenuRequestedPrivate(ui->labPicture->mapToGlobal(pos), false);
+}
+
+bool PictureDialog::isIndexed()
+{
+    return indexed;
+}
+
+int PictureDialog::getIndex()
+{
+    return index;
+}
+
+void PictureDialog::openPreviewMap()
+{
+    MapPreviewDialog *mapPreviewDialog;
+    if (rqFullscreen && fullscreenWidget != nullptr)
+    {
+        mapPreviewDialog = new MapPreviewDialog(fullscreenWidget);
+    }
+    else
+    {
+        mapPreviewDialog = new MapPreviewDialog(this);
+    }
+    mapPreviewDialog->setWindowIcon(windowIcon());
+    mapPreviewDialog->setModal(true);
+    mapPreviewDialog->drawPointOnMap(smpic->getSnapmaticProperties().location.x, smpic->getSnapmaticProperties().location.y);
+    mapPreviewDialog->show();
+    mapPreviewDialog->exec();
+    delete mapPreviewDialog;
+}
+
+void PictureDialog::editSnapmaticProperties()
+{
+    SnapmaticEditor *snapmaticEditor;
+    if (rqFullscreen && fullscreenWidget != nullptr)
+    {
+        snapmaticEditor = new SnapmaticEditor(crewDB, fullscreenWidget);
+    }
+    else
+    {
+        snapmaticEditor = new SnapmaticEditor(crewDB, this);
+    }
+    snapmaticEditor->setWindowFlags(snapmaticEditor->windowFlags()^Qt::WindowContextHelpButtonHint);
+    snapmaticEditor->setWindowIcon(windowIcon());
+    snapmaticEditor->setSnapmaticPicture(smpic);
+    snapmaticEditor->setModal(true);
+    snapmaticEditor->exec();
+    delete snapmaticEditor;
+}
+
+void PictureDialog::updated()
+{
+    if (withDatabase)
+    {
+        crewID = QString::number(smpic->getSnapmaticProperties().crewID);
+        crewStr = crewDB->getCrewName(smpic->getSnapmaticProperties().crewID);
+    }
+    else
+    {
+        crewID = QString::number(smpic->getSnapmaticProperties().crewID);
+        crewStr = QString::number(smpic->getSnapmaticProperties().crewID);
+    }
+    picTitl = StringParser::escapeString(smpic->getPictureTitle());
+    ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
+}
diff --git a/PictureDialog.h b/PictureDialog.h
index 7cd6958..6a02338 100755
--- a/PictureDialog.h
+++ b/PictureDialog.h
@@ -1,123 +1,133 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PICTUREDIALOG_H
-#define PICTUREDIALOG_H
-
-#include "SnapmaticPicture.h"
-#include "ProfileDatabase.h"
-#include "CrewDatabase.h"
-#include <QMouseEvent>
-#include <QDialog>
-#include <QEvent>
-#include <QMenu>
-
-namespace Ui {
-class PictureDialog;
-}
-
-class PictureDialog : public QDialog
-{
-    Q_OBJECT
-public:
-    explicit PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent = 0);
-    explicit PictureDialog(QWidget *parent = 0);
-    explicit PictureDialog(bool primaryWindow, ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent = 0);
-    explicit PictureDialog(bool primaryWindow, QWidget *parent = 0);
-    void setupPictureDialog(bool withDatabase);
-    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool indexed, int index);
-    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index);
-    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk);
-    void setSnapmaticPicture(SnapmaticPicture *picture, int index);
-    void setSnapmaticPicture(SnapmaticPicture *picture);
-    void addPreviousNextButtons();
-    void stylizeDialog();
-    bool isIndexed();
-    int getIndex();
-    ~PictureDialog();
-
-public slots:
-    void playerNameUpdated();
-    void dialogNextPictureRequested();
-    void dialogPreviousPictureRequested();
-    void adaptNewDialogSize(QSize newLabelSize);
-    void exportCustomContextMenuRequested(const QPoint &pos);
-
-private slots:
-    void copySnapmaticPicture();
-    void exportSnapmaticPicture();
-    void triggerFullscreenDoubeClick();
-    void on_labPicture_mouseDoubleClicked(Qt::MouseButton button);
-    void on_labPicture_customContextMenuRequested(const QPoint &pos);
-    void exportCustomContextMenuRequestedPrivate(const QPoint &pos, bool fullscreen);
-    void nextPictureRequestedSlot();
-    void previousPictureRequestedSlot();
-    void renderOverlayPicture();
-    void renderPicture();
-
-signals:
-    void nextPictureRequested();
-    void previousPictureRequested();
-    void newPictureCommited(QImage picture);
-    void endDatabaseThread();
-
-protected:
-    void closeEvent(QCloseEvent *ev);
-    bool eventFilter(QObject *obj, QEvent *ev);
-    void mousePressEvent(QMouseEvent *ev);
-    bool event(QEvent *event);
-
-private:
-    bool primaryWindow;
-    ProfileDatabase *profileDB;
-    CrewDatabase *crewDB;
-    Ui::PictureDialog *ui;
-    QMap<QString, QString> globalMap;
-    SnapmaticPicture *smpic;
-    QWidget *fullscreenWidget;
-    QAction *jpegExportAction;
-    QAction *pgtaExportAction;
-    QImage avatarAreaPicture;
-    QImage snapmaticPicture;
-    QImage overlayTempImage;
-    QString jsonDrawString;
-    QString windowTitleStr;
-    QStringList plyrsList;
-    QString picAreaStr;
-    QString picArea;
-    QString picTitl;
-    QString picPath;
-    QString created;
-    QString crewID;
-    QString locX;
-    QString locY;
-    QString locZ;
-    bool overlayEnabled;
-    bool withDatabase;
-    bool rqFullscreen;
-    bool naviEnabled;
-    bool previewMode;
-    bool indexed;
-    int index;
-    int avatarLocX;
-    int avatarLocY;
-    int avatarSize;
-    QMenu *exportMenu;
-};
-
-#endif // PICTUREDIALOG_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PICTUREDIALOG_H
+#define PICTUREDIALOG_H
+
+#include "SnapmaticPicture.h"
+#include "ProfileDatabase.h"
+#include "CrewDatabase.h"
+#include <QMouseEvent>
+#include <QDialog>
+#include <QEvent>
+#include <QMenu>
+
+namespace Ui {
+class PictureDialog;
+}
+
+class PictureDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    explicit PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent = 0);
+    explicit PictureDialog(QWidget *parent = 0);
+    explicit PictureDialog(bool primaryWindow, ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent = 0);
+    explicit PictureDialog(bool primaryWindow, QWidget *parent = 0);
+    void setupPictureDialog(bool withDatabase);
+    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool indexed, int index);
+    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index);
+    void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk);
+    void setSnapmaticPicture(SnapmaticPicture *picture, int index);
+    void setSnapmaticPicture(SnapmaticPicture *picture);
+    void addPreviousNextButtons();
+    void stylizeDialog();
+    bool isIndexed();
+    int getIndex();
+    ~PictureDialog();
+
+public slots:
+    void crewNameUpdated();
+    void playerNameUpdated();
+    void dialogNextPictureRequested();
+    void dialogPreviousPictureRequested();
+    void adaptNewDialogSize(QSize newLabelSize);
+    void exportCustomContextMenuRequested(const QPoint &pos);
+
+private slots:
+    void copySnapmaticPicture();
+    void exportSnapmaticPicture();
+    void triggerFullscreenDoubeClick();
+    void on_labPicture_mouseDoubleClicked(Qt::MouseButton button);
+    void on_labPicture_customContextMenuRequested(const QPoint &pos);
+    void exportCustomContextMenuRequestedPrivate(const QPoint &pos, bool fullscreen);
+    void nextPictureRequestedSlot();
+    void previousPictureRequestedSlot();
+    void editSnapmaticProperties();
+    void renderOverlayPicture();
+    void renderPicture();
+    void openPreviewMap();
+    void updated();
+
+signals:
+    void nextPictureRequested();
+    void previousPictureRequested();
+    void newPictureCommited(QImage picture);
+    void endDatabaseThread();
+
+protected:
+    void closeEvent(QCloseEvent *ev);
+    bool eventFilter(QObject *obj, QEvent *ev);
+    void mousePressEvent(QMouseEvent *ev);
+    bool event(QEvent *event);
+
+private:
+    QString generateCrewString();
+    QString generatePlayersString();
+    bool primaryWindow;
+    ProfileDatabase *profileDB;
+    CrewDatabase *crewDB;
+    Ui::PictureDialog *ui;
+    QMap<QString, QString> globalMap;
+    SnapmaticPicture *smpic;
+    QWidget *fullscreenWidget;
+    QAction *jpegExportAction;
+    QAction *pgtaExportAction;
+    QAction *propEditorAction;
+    QAction *openViewerAction;
+    QAction *manageMenuSep1;
+    QImage avatarAreaPicture;
+    QImage snapmaticPicture;
+    QImage overlayTempImage;
+    QString jsonDrawString;
+    QString windowTitleStr;
+    QStringList plyrsList;
+    QString picAreaStr;
+    QString picArea;
+    QString picTitl;
+    QString picPath;
+    QString created;
+    QString crewStr;
+    QString crewID;
+    QString locX;
+    QString locY;
+    QString locZ;
+    bool overlayEnabled;
+    bool withDatabase;
+    bool rqFullscreen;
+    bool naviEnabled;
+    bool previewMode;
+    bool indexed;
+    int index;
+    int avatarLocX;
+    int avatarLocY;
+    int avatarSize;
+    QMenu *manageMenu;
+};
+
+#endif // PICTUREDIALOG_H
diff --git a/PictureDialog.ui b/PictureDialog.ui
index 44eb828..dc10eeb 100755
--- a/PictureDialog.ui
+++ b/PictureDialog.ui
@@ -1,254 +1,254 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>PictureDialog</class>
- <widget class="QDialog" name="PictureDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>960</width>
-    <height>602</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>%1 - Snapmatic Picture Viewer</string>
-  </property>
-  <layout class="QVBoxLayout" name="vlPictureLayout">
-   <property name="spacing">
-    <number>0</number>
-   </property>
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="UiModLabel" name="labPicture">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>1</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="contextMenuPolicy">
-      <enum>Qt::CustomContextMenu</enum>
-     </property>
-     <property name="text">
-      <string/>
-     </property>
-     <property name="pixmap">
-      <pixmap resource="res/app.qrc">:/img/960x536.png</pixmap>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignCenter</set>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer name="vsJSONUpper">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <widget class="QFrame" name="jsonFrame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Plain</enum>
-     </property>
-     <property name="lineWidth">
-      <number>0</number>
-     </property>
-     <layout class="QHBoxLayout" name="hlJson">
-      <property name="spacing">
-       <number>0</number>
-      </property>
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <layout class="QHBoxLayout" name="jsonLayout">
-        <property name="leftMargin">
-         <number>4</number>
-        </property>
-        <property name="topMargin">
-         <number>10</number>
-        </property>
-        <property name="rightMargin">
-         <number>4</number>
-        </property>
-        <property name="bottomMargin">
-         <number>4</number>
-        </property>
-        <item>
-         <widget class="UiModLabel" name="labJSON">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <property name="text">
-           <string>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
-&lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
-&lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
-&lt;span style=&quot; font-weight:600;&quot;&gt;Created: &lt;/span&gt;%8</string>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-          <property name="openExternalLinks">
-           <bool>true</bool>
-          </property>
-          <property name="textInteractionFlags">
-           <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <layout class="QVBoxLayout" name="vlButtons">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="rightMargin">
-           <number>5</number>
-          </property>
-          <property name="bottomMargin">
-           <number>5</number>
-          </property>
-          <item>
-           <spacer name="vsButtons">
-            <property name="orientation">
-             <enum>Qt::Vertical</enum>
-            </property>
-            <property name="sizeType">
-             <enum>QSizePolicy::Expanding</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>0</width>
-              <height>0</height>
-             </size>
-            </property>
-           </spacer>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="hlButtons">
-            <property name="spacing">
-             <number>6</number>
-            </property>
-            <item>
-             <widget class="QPushButton" name="cmdExport">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="focusPolicy">
-               <enum>Qt::NoFocus</enum>
-              </property>
-              <property name="toolTip">
-               <string>Export picture</string>
-              </property>
-              <property name="text">
-               <string>&amp;Export</string>
-              </property>
-              <property name="autoDefault">
-               <bool>false</bool>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="cmdClose">
-              <property name="sizePolicy">
-               <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-                <horstretch>0</horstretch>
-                <verstretch>0</verstretch>
-               </sizepolicy>
-              </property>
-              <property name="focusPolicy">
-               <enum>Qt::NoFocus</enum>
-              </property>
-              <property name="toolTip">
-               <string>Close</string>
-              </property>
-              <property name="text">
-               <string>&amp;Close</string>
-              </property>
-              <property name="autoDefault">
-               <bool>false</bool>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>UiModLabel</class>
-   <extends>QLabel</extends>
-   <header>uimod/UiModLabel.h</header>
-   <slots>
-    <signal>mouseMoved()</signal>
-    <signal>mouseReleased()</signal>
-    <signal>mousePressed()</signal>
-    <signal>mouseDoubleClicked()</signal>
-   </slots>
-  </customwidget>
- </customwidgets>
- <resources>
-  <include location="res/app.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>cmdClose</sender>
-   <signal>clicked()</signal>
-   <receiver>PictureDialog</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>912</x>
-     <y>514</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>479</x>
-     <y>267</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PictureDialog</class>
+ <widget class="QDialog" name="PictureDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>960</width>
+    <height>618</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>%1 - Snapmatic Picture Viewer</string>
+  </property>
+  <layout class="QVBoxLayout" name="vlPictureLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="UiModLabel" name="labPicture">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="contextMenuPolicy">
+      <enum>Qt::CustomContextMenu</enum>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="pixmap">
+      <pixmap resource="res/app.qrc">:/img/960x536.png</pixmap>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="vsJSONUpper">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QFrame" name="jsonFrame">
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <layout class="QHBoxLayout" name="hlJson">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <layout class="QHBoxLayout" name="jsonLayout">
+        <property name="leftMargin">
+         <number>4</number>
+        </property>
+        <property name="topMargin">
+         <number>10</number>
+        </property>
+        <property name="rightMargin">
+         <number>4</number>
+        </property>
+        <property name="bottomMargin">
+         <number>4</number>
+        </property>
+        <item>
+         <widget class="UiModLabel" name="labJSON">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Created: &lt;/span&gt;%8</string>
+          </property>
+          <property name="wordWrap">
+           <bool>true</bool>
+          </property>
+          <property name="openExternalLinks">
+           <bool>true</bool>
+          </property>
+          <property name="textInteractionFlags">
+           <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <layout class="QVBoxLayout" name="vlButtons">
+          <property name="spacing">
+           <number>6</number>
+          </property>
+          <property name="rightMargin">
+           <number>5</number>
+          </property>
+          <property name="bottomMargin">
+           <number>5</number>
+          </property>
+          <item>
+           <spacer name="vsButtons">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeType">
+             <enum>QSizePolicy::Expanding</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>0</width>
+              <height>0</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="hlButtons">
+            <property name="spacing">
+             <number>6</number>
+            </property>
+            <item>
+             <widget class="QPushButton" name="cmdManage">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
+              <property name="toolTip">
+               <string>Manage picture</string>
+              </property>
+              <property name="text">
+               <string>&amp;Manage</string>
+              </property>
+              <property name="autoDefault">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="cmdClose">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="focusPolicy">
+               <enum>Qt::NoFocus</enum>
+              </property>
+              <property name="toolTip">
+               <string>Close viewer</string>
+              </property>
+              <property name="text">
+               <string>&amp;Close</string>
+              </property>
+              <property name="autoDefault">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>UiModLabel</class>
+   <extends>QLabel</extends>
+   <header>uimod/UiModLabel.h</header>
+   <slots>
+    <signal>mouseMoved()</signal>
+    <signal>mouseReleased()</signal>
+    <signal>mousePressed()</signal>
+    <signal>mouseDoubleClicked()</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="res/app.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>cmdClose</sender>
+   <signal>clicked()</signal>
+   <receiver>PictureDialog</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>912</x>
+     <y>514</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>479</x>
+     <y>267</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/PictureExport.cpp b/PictureExport.cpp
index ad20e9a..d3fb040 100755
--- a/PictureExport.cpp
+++ b/PictureExport.cpp
@@ -1,310 +1,312 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "config.h"
-#include "PictureExport.h"
-#include "PictureDialog.h"
-#include "StandardPaths.h"
-#include "SidebarGenerator.h"
-#include <QDesktopWidget>
-#include <QApplication>
-#include <QMessageBox>
-#include <QFileDialog>
-#include <QSettings>
-#include <QDebug>
-
-PictureExport::PictureExport()
-{
-
-}
-
-void PictureExport::exportAsPicture(QWidget *parent, SnapmaticPicture *picture)
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-
-    // Picture Settings
-    // Quality Settings
-    settings.beginGroup("Pictures");
-    int defaultQuality = 100;
-    QSize defExportSize = QSize(960, 536);
-    int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
-    if (customQuality < 1 || customQuality > 100)
-    {
-        customQuality = 100;
-    }
-    bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
-
-    // Size Settings
-    QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
-    if (cusExportSize.width() > 3840)
-    {
-        cusExportSize.setWidth(3840);
-    }
-    else if (cusExportSize.height() > 2160)
-    {
-        cusExportSize.setHeight(2160);
-    }
-    if (cusExportSize.width() < 1)
-    {
-        cusExportSize.setWidth(1);
-    }
-    else if (cusExportSize.height() < 1)
-    {
-        cusExportSize.setHeight(1);
-    }
-    QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
-    Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
-    QString defaultExportFormat = settings.value("DefaultExportFormat", ".jpg").toString();
-    settings.endGroup();
-    // End Picture Settings
-
-    settings.beginGroup("FileDialogs");
-    settings.beginGroup("ExportAsPicture");
-
-fileDialogPreSave: //Work?
-    QFileDialog fileDialog(parent);
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    fileDialog.setViewMode(QFileDialog::Detail);
-    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
-    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
-    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
-    fileDialog.setDefaultSuffix("suffix");
-    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
-    fileDialog.setWindowTitle(PictureDialog::tr("Export as JPG picture..."));
-    fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
-
-    QStringList filters;
-    filters << PictureDialog::tr("JPEG picture (*.jpg)");
-    filters << PictureDialog::tr("Portable Network Graphics (*.png)");
-    fileDialog.setNameFilters(filters);
-
-    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
-
-    fileDialog.setSidebarUrls(sidebarUrls);
-    fileDialog.setDirectory(settings.value("Directory", StandardPaths::picturesLocation()).toString());
-    fileDialog.restoreGeometry(settings.value(parent->objectName() + "+Geomtery", "").toByteArray());
-
-    QString newPictureFileName = getPictureFileName(picture) + defaultExportFormat;
-    fileDialog.selectFile(newPictureFileName);
-
-    if (fileDialog.exec())
-    {
-        QStringList selectedFiles = fileDialog.selectedFiles();
-        if (selectedFiles.length() == 1)
-        {
-            QString saveFileFormat;
-            QString selectedFile = selectedFiles.at(0);
-
-            if (selectedFile.right(4) == ".jpg")
-            {
-                saveFileFormat = "JPEG";
-            }
-            else if (selectedFile.right(4) == ".jpeg")
-            {
-                saveFileFormat = "JPEG";
-            }
-            else if (selectedFile.right(4) == ".png")
-            {
-                saveFileFormat = "PNG";
-            }
-            else if (selectedFile.right(7) == ".suffix")
-            {
-                if (fileDialog.selectedNameFilter() == "JPEG picture (*.jpg)")
-                {
-                    selectedFile.replace(".suffix", ".jpg");
-                }
-                else if (fileDialog.selectedNameFilter() == "Portable Network Graphics (*.png)")
-                {
-                    selectedFile.replace(".suffix", ".png");
-                }
-                else
-                {
-                    selectedFile.replace(".suffix", ".jpg");
-                }
-            }
-
-            if (QFile::exists(selectedFile))
-            {
-                if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as JPG picture"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
-                {
-                    if (!QFile::remove(selectedFile))
-                    {
-                        QMessageBox::warning(parent, PictureDialog::tr("Export as JPG picture"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
-                        goto fileDialogPreSave; //Work?
-                    }
-                }
-                else
-                {
-                    goto fileDialogPreSave; //Work?
-                }
-            }
-
-            // Scale Picture
-            QImage exportPicture = picture->getImage();
-            if (sizeMode == "Desktop")
-            {
-                QRect desktopResolution = QApplication::desktop()->screenGeometry();
-                exportPicture = exportPicture.scaled(desktopResolution.width(), desktopResolution.height(), aspectRatio, Qt::SmoothTransformation);
-            }
-            else if (sizeMode == "Custom")
-            {
-                exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
-            }
-
-            bool isSaved;
-            if (useCustomQuality)
-            {
-                isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), customQuality);
-            }
-            else
-            {
-                isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), 100);
-            }
-
-            if (!isSaved)
-            {
-                QMessageBox::warning(parent, PictureDialog::tr("Export as JPG picture"), PictureDialog::tr("Failed to export current Snapmatic picture"));
-                goto fileDialogPreSave; //Work?
-            }
-        }
-        else
-        {
-            QMessageBox::warning(parent, PictureDialog::tr("Export as JPG picture"), PictureDialog::tr("No valid file is selected"));
-            goto fileDialogPreSave; //Work?
-        }
-    }
-
-    settings.setValue(parent->objectName() + "+Geometry", fileDialog.saveGeometry());
-    settings.setValue("Directory", fileDialog.directory().absolutePath());
-    settings.endGroup();
-    settings.endGroup();
-}
-
-void PictureExport::exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture)
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("FileDialogs");
-    settings.beginGroup("ExportAsSnapmatic");
-
-    QString adjustedPicPath = picture->getPictureFileName();
-    if (adjustedPicPath.right(7) == ".hidden") // for the hidden file system
-    {
-        adjustedPicPath.remove(adjustedPicPath.length() - 7, 7);
-    }
-
-fileDialogPreSave: //Work?
-    QFileInfo sgdFileInfo(adjustedPicPath);
-    QFileDialog fileDialog(parent);
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    fileDialog.setViewMode(QFileDialog::Detail);
-    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
-    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
-    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
-    fileDialog.setDefaultSuffix(".rem");
-    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
-    fileDialog.setWindowTitle(PictureDialog::tr("Export as GTA Snapmatic..."));
-    fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
-
-    QStringList filters;
-    filters << PictureDialog::tr("GTA V Export (*.g5e)");
-    filters << PictureDialog::tr("GTA V Raw Export (*.auto)");
-    filters << PictureDialog::tr("Snapmatic pictures (PGTA*)");
-    fileDialog.setNameFilters(filters);
-
-    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
-
-    fileDialog.setSidebarUrls(sidebarUrls);
-    fileDialog.setDirectory(settings.value("Directory", StandardPaths::documentsLocation()).toString());
-    fileDialog.selectFile(QString(picture->getExportPictureFileName() + ".g5e"));
-    fileDialog.restoreGeometry(settings.value(parent->objectName() + "+Geomtery", "").toByteArray());
-
-
-    if (fileDialog.exec())
-    {
-        QStringList selectedFiles = fileDialog.selectedFiles();
-        if (selectedFiles.length() == 1)
-        {
-            QString selectedFile = selectedFiles.at(0);
-
-            if (QFile::exists(selectedFile))
-            {
-                if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
-                {
-                    if (!QFile::remove(selectedFile))
-                    {
-                        QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
-                        goto fileDialogPreSave; //Work?
-                    }
-                }
-                else
-                {
-                    goto fileDialogPreSave; //Work?
-                }
-            }
-
-            if (selectedFile.right(4) == ".g5e")
-            {
-                bool isExported = picture->exportPicture(selectedFile, "G5E");
-                if (!isExported)
-                {
-                    QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
-                    goto fileDialogPreSave; //Work?
-                }
-            }
-            else
-            {
-                bool isAutoExt = false;
-                if (selectedFile.right(5) == ".auto")
-                {
-                    isAutoExt = true;
-                    QString dirPath = QFileInfo(selectedFile).dir().path();
-                    QString stockFileName = sgdFileInfo.fileName();
-                    selectedFile = dirPath + "/" + stockFileName;
-                }
-                else if (selectedFile.right(4) == ".rem")
-                {
-                    selectedFile.remove(".rem");
-                }
-                bool isCopied = picture->exportPicture(selectedFile, "PGTA");
-                if (!isCopied)
-                {
-                    QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
-                    goto fileDialogPreSave; //Work?
-                }
-                else
-                {
-                    if (isAutoExt) QMessageBox::information(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Exported Snapmatic to \"%1\" because of using the .auto extension.").arg(selectedFile));
-                }
-            }
-        }
-        else
-        {
-            QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("No valid file is selected"));
-            goto fileDialogPreSave; //Work?
-        }
-    }
-
-    settings.setValue(parent->objectName() + "+Geometry", fileDialog.saveGeometry());
-    settings.setValue("Directory", fileDialog.directory().absolutePath());
-    settings.endGroup();
-}
-
-QString PictureExport::getPictureFileName(SnapmaticPicture *picture)
-{
-    return picture->getExportPictureFileName();
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "config.h"
+#include "PictureExport.h"
+#include "PictureDialog.h"
+#include "StandardPaths.h"
+#include "SidebarGenerator.h"
+#include <QStringBuilder>
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QSettings>
+#include <QRegExp>
+#include <QDebug>
+
+PictureExport::PictureExport()
+{
+
+}
+
+void PictureExport::exportAsPicture(QWidget *parent, SnapmaticPicture *picture)
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+
+    // Picture Settings
+    // Quality Settings
+    settings.beginGroup("Pictures");
+    int defaultQuality = 100;
+    QSize defExportSize = QSize(960, 536);
+    int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
+    if (customQuality < 1 || customQuality > 100)
+    {
+        customQuality = 100;
+    }
+    bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
+
+    // Size Settings
+    QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
+    if (cusExportSize.width() > 3840)
+    {
+        cusExportSize.setWidth(3840);
+    }
+    else if (cusExportSize.height() > 2160)
+    {
+        cusExportSize.setHeight(2160);
+    }
+    if (cusExportSize.width() < 1)
+    {
+        cusExportSize.setWidth(1);
+    }
+    else if (cusExportSize.height() < 1)
+    {
+        cusExportSize.setHeight(1);
+    }
+    QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
+    Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
+    QString defaultExportFormat = settings.value("DefaultExportFormat", ".jpg").toString();
+    settings.endGroup();
+    // End Picture Settings
+
+    settings.beginGroup("FileDialogs");
+    settings.beginGroup("ExportAsPicture");
+
+fileDialogPreSave: //Work?
+    QFileDialog fileDialog(parent);
+    fileDialog.setFileMode(QFileDialog::AnyFile);
+    fileDialog.setViewMode(QFileDialog::Detail);
+    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
+    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
+    fileDialog.setDefaultSuffix("suffix");
+    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
+    fileDialog.setWindowTitle(PictureDialog::tr("Export as Picture..."));
+    fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
+
+    QStringList filters;
+    filters << PictureDialog::tr("JPEG Graphics (*.jpg *.jpeg)");
+    filters << PictureDialog::tr("Portable Network Graphics (*.png)");
+    fileDialog.setNameFilters(filters);
+
+    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
+
+    fileDialog.setSidebarUrls(sidebarUrls);
+    fileDialog.setDirectory(settings.value("Directory", StandardPaths::picturesLocation()).toString());
+    fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geomtery", "").toByteArray());
+
+    QString newPictureFileName = getPictureFileName(picture) % defaultExportFormat;
+    fileDialog.selectFile(newPictureFileName);
+
+    if (fileDialog.exec())
+    {
+        QStringList selectedFiles = fileDialog.selectedFiles();
+        if (selectedFiles.length() == 1)
+        {
+            QString saveFileFormat;
+            QString selectedFile = selectedFiles.at(0);
+
+            if (selectedFile.right(4) == ".jpg")
+            {
+                saveFileFormat = "JPEG";
+            }
+            else if (selectedFile.right(4) == ".jpeg")
+            {
+                saveFileFormat = "JPEG";
+            }
+            else if (selectedFile.right(4) == ".png")
+            {
+                saveFileFormat = "PNG";
+            }
+            else if (selectedFile.right(7) == ".suffix")
+            {
+                if (fileDialog.selectedNameFilter() == "JPEG picture (*.jpg)")
+                {
+                    selectedFile.replace(".suffix", ".jpg");
+                }
+                else if (fileDialog.selectedNameFilter() == "Portable Network Graphics (*.png)")
+                {
+                    selectedFile.replace(".suffix", ".png");
+                }
+                else
+                {
+                    selectedFile.replace(".suffix", ".jpg");
+                }
+            }
+
+            if (QFile::exists(selectedFile))
+            {
+                if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
+                {
+                    if (!QFile::remove(selectedFile))
+                    {
+                        QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
+                        goto fileDialogPreSave; //Work?
+                    }
+                }
+                else
+                {
+                    goto fileDialogPreSave; //Work?
+                }
+            }
+
+            // Scale Picture
+            QImage exportPicture = picture->getImage();
+            if (sizeMode == "Desktop")
+            {
+                QRect desktopResolution = QApplication::desktop()->screenGeometry();
+                exportPicture = exportPicture.scaled(desktopResolution.width(), desktopResolution.height(), aspectRatio, Qt::SmoothTransformation);
+            }
+            else if (sizeMode == "Custom")
+            {
+                exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
+            }
+
+            bool isSaved;
+            if (useCustomQuality)
+            {
+                isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), customQuality);
+            }
+            else
+            {
+                isSaved = exportPicture.save(selectedFile, saveFileFormat.toStdString().c_str(), 100);
+            }
+
+            if (!isSaved)
+            {
+                QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("Failed to export current Snapmatic picture"));
+                goto fileDialogPreSave; //Work?
+            }
+        }
+        else
+        {
+            QMessageBox::warning(parent, PictureDialog::tr("Export as Picture"), PictureDialog::tr("No valid file is selected"));
+            goto fileDialogPreSave; //Work?
+        }
+    }
+
+    settings.setValue(parent->objectName() % "+Geometry", fileDialog.saveGeometry());
+    settings.setValue("Directory", fileDialog.directory().absolutePath());
+    settings.endGroup();
+    settings.endGroup();
+}
+
+void PictureExport::exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture)
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("FileDialogs");
+    settings.beginGroup("ExportAsSnapmatic");
+
+    QString adjustedPicPath = picture->getPictureFileName();
+    if (adjustedPicPath.right(7) == ".hidden") // for the hidden file system
+    {
+        adjustedPicPath.remove(adjustedPicPath.length() - 7, 7);
+    }
+
+fileDialogPreSave: //Work?
+    QFileInfo sgdFileInfo(adjustedPicPath);
+    QFileDialog fileDialog(parent);
+    fileDialog.setFileMode(QFileDialog::AnyFile);
+    fileDialog.setViewMode(QFileDialog::Detail);
+    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
+    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
+    fileDialog.setDefaultSuffix(".rem");
+    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
+    fileDialog.setWindowTitle(PictureDialog::tr("Export as Snapmatic..."));
+    fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
+
+    QStringList filters;
+    filters << PictureDialog::tr("GTA V Export (*.g5e)");
+    filters << PictureDialog::tr("GTA V Raw Export (*.auto)");
+    filters << PictureDialog::tr("Snapmatic pictures (PGTA*)");
+    fileDialog.setNameFilters(filters);
+
+    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
+
+    fileDialog.setSidebarUrls(sidebarUrls);
+    fileDialog.setDirectory(settings.value("Directory", StandardPaths::documentsLocation()).toString());
+    fileDialog.selectFile(QString(picture->getExportPictureFileName() % ".g5e"));
+    fileDialog.restoreGeometry(settings.value(parent->objectName() % "+Geomtery", "").toByteArray());
+
+
+    if (fileDialog.exec())
+    {
+        QStringList selectedFiles = fileDialog.selectedFiles();
+        if (selectedFiles.length() == 1)
+        {
+            QString selectedFile = selectedFiles.at(0);
+            bool isAutoExt = false;
+            if (selectedFile.right(5) == ".auto")
+            {
+                isAutoExt = true;
+                QString dirPath = QFileInfo(selectedFile).dir().path();
+                QString stockFileName = sgdFileInfo.fileName();
+                selectedFile = dirPath % "/" % stockFileName;
+            }
+            else if (selectedFile.right(4) == ".rem")
+            {
+                selectedFile.remove(selectedFile.length() - 4, 4);
+            }
+
+            if (QFile::exists(selectedFile))
+            {
+                if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
+                {
+                    if (!QFile::remove(selectedFile))
+                    {
+                        QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
+                        goto fileDialogPreSave; //Work?
+                    }
+                }
+                else
+                {
+                    goto fileDialogPreSave; //Work?
+                }
+            }
+
+            if (selectedFile.right(4) == ".g5e")
+            {
+                bool isExported = picture->exportPicture(selectedFile, SnapmaticFormat::G5E_Format);
+                if (!isExported)
+                {
+                    QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
+                    goto fileDialogPreSave; //Work?
+                }
+            }
+            else
+            {
+                bool isCopied = picture->exportPicture(selectedFile, SnapmaticFormat::PGTA_Format);
+                if (!isCopied)
+                {
+                    QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
+                    goto fileDialogPreSave; //Work?
+                }
+                else
+                {
+                    if (isAutoExt) QMessageBox::information(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Exported Snapmatic to \"%1\" because of using the .auto extension.").arg(selectedFile));
+                }
+            }
+        }
+        else
+        {
+            QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("No valid file is selected"));
+            goto fileDialogPreSave; //Work?
+        }
+    }
+
+    settings.setValue(parent->objectName() % "+Geometry", fileDialog.saveGeometry());
+    settings.setValue("Directory", fileDialog.directory().absolutePath());
+    settings.endGroup();
+}
+
+QString PictureExport::getPictureFileName(SnapmaticPicture *picture)
+{
+    return picture->getExportPictureFileName();
+}
diff --git a/PictureExport.h b/PictureExport.h
index f7aeee9..6ee84a0 100755
--- a/PictureExport.h
+++ b/PictureExport.h
@@ -1,35 +1,35 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PICTUREEXPORT_H
-#define PICTUREEXPORT_H
-
-#include "SnapmaticPicture.h"
-#include <QWidget>
-#include <QString>
-
-class PictureExport
-{
-public:
-    PictureExport();
-    static void exportAsPicture(QWidget *parent, SnapmaticPicture *picture);
-    static void exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture);
-    static QString getPictureFileName(SnapmaticPicture *picture);
-};
-
-#endif // PICTUREEXPORT_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PICTUREEXPORT_H
+#define PICTUREEXPORT_H
+
+#include "SnapmaticPicture.h"
+#include <QWidget>
+#include <QString>
+
+class PictureExport
+{
+public:
+    PictureExport();
+    static void exportAsPicture(QWidget *parent, SnapmaticPicture *picture);
+    static void exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture);
+    static QString getPictureFileName(SnapmaticPicture *picture);
+};
+
+#endif // PICTUREEXPORT_H
diff --git a/ProfileDatabase.cpp b/ProfileDatabase.cpp
index b7bc1c7..9d4e814 100755
--- a/ProfileDatabase.cpp
+++ b/ProfileDatabase.cpp
@@ -1,61 +1,76 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "ProfileDatabase.h"
-#include "StandardPaths.h"
-#include "config.h"
-#include <QFile>
-#include <QDir>
-
-ProfileDatabase::ProfileDatabase(QObject *parent) : QObject(parent)
-{
-    QDir dir;
-    dir.mkpath(StandardPaths::dataLocation());
-    dir.setPath(StandardPaths::dataLocation());
-    QString dirPath = dir.absolutePath();
-    QString defaultConfPath = dirPath + QDir::separator() + "players.ini";
-
-    QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    confPathSettings.beginGroup("Database");
-    QString confPathFile = confPathSettings.value("Players", defaultConfPath).toString();
-    confPathSettings.endGroup();
-
-    profileDB = new QSettings(confPathFile, QSettings::IniFormat);
-    profileDB->beginGroup("Players");
-}
-
-ProfileDatabase::~ProfileDatabase()
-{
-    profileDB->endGroup();
-    delete profileDB;
-}
-
-QStringList ProfileDatabase::getPlayers()
-{
-    return profileDB->childKeys();
-}
-
-QString ProfileDatabase::getPlayerName(int playerID)
-{
-    return profileDB->value(QString::number(playerID), playerID).toString();
-}
-
-void ProfileDatabase::setPlayerName(int playerID, QString playerName)
-{
-    profileDB->setValue(QString::number(playerID), playerName);
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "ProfileDatabase.h"
+#include "StandardPaths.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QMutexLocker>
+#include <QDebug>
+#include <QFile>
+#include <QDir>
+
+ProfileDatabase::ProfileDatabase(QObject *parent) : QObject(parent)
+{
+    QDir dir;
+    dir.mkpath(StandardPaths::dataLocation());
+    dir.setPath(StandardPaths::dataLocation());
+    QString dirPath = dir.absolutePath();
+    QString defaultConfPath = dirPath % QDir::separator() % "players.ini";
+
+    QSettings confPathSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    confPathSettings.beginGroup("Database");
+    QString confPathFile = confPathSettings.value("Players", defaultConfPath).toString();
+    confPathSettings.endGroup();
+
+    profileDB = new QSettings(confPathFile, QSettings::IniFormat);
+    profileDB->beginGroup("Players");
+}
+
+ProfileDatabase::~ProfileDatabase()
+{
+    profileDB->endGroup();
+    delete profileDB;
+}
+
+QStringList ProfileDatabase::getPlayers()
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getPlayers";
+#endif
+    return profileDB->childKeys();
+}
+
+QString ProfileDatabase::getPlayerName(int playerID)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "getPlayerName" << playerID;
+#endif
+    return profileDB->value(QString::number(playerID), playerID).toString();
+}
+
+void ProfileDatabase::setPlayerName(int playerID, QString playerName)
+{
+    QMutexLocker locker(&mutex);
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "setPlayerName" << playerID << playerName;
+#endif
+    profileDB->setValue(QString::number(playerID), playerName);
+}
diff --git a/ProfileDatabase.h b/ProfileDatabase.h
index b92fb4f..7a1fbd8 100755
--- a/ProfileDatabase.h
+++ b/ProfileDatabase.h
@@ -1,43 +1,45 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PROFILEDATABASE_H
-#define PROFILEDATABASE_H
-
-#include <QSettings>
-#include <QObject>
-#include <QMap>
-
-class ProfileDatabase : public QObject
-{
-    Q_OBJECT
-public:
-    explicit ProfileDatabase(QObject *parent = 0);
-    QString getPlayerName(int playerID);
-    QStringList getPlayers();
-    ~ProfileDatabase();
-
-private:
-    QSettings *profileDB;
-
-public slots:
-    void setPlayerName(int playerID, QString playerName);
-
-};
-
-#endif // PROFILEDATABASE_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PROFILEDATABASE_H
+#define PROFILEDATABASE_H
+
+#include <QSettings>
+#include <QObject>
+#include <QMutex>
+#include <QMap>
+
+class ProfileDatabase : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ProfileDatabase(QObject *parent = 0);
+    QString getPlayerName(int playerID);
+    QStringList getPlayers();
+    ~ProfileDatabase();
+
+private:
+    mutable QMutex mutex;
+    QSettings *profileDB;
+
+public slots:
+    void setPlayerName(int playerID, QString playerName);
+
+};
+
+#endif // PROFILEDATABASE_H
diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp
index 51e8cc0..1507a90 100755
--- a/ProfileInterface.cpp
+++ b/ProfileInterface.cpp
@@ -38,6 +38,7 @@
 #include <QPushButton>
 #include <QSpacerItem>
 #include <QMessageBox>
+#include <QMouseEvent>
 #include <QFileDialog>
 #include <QEventLoop>
 #include <QScrollBar>
@@ -64,13 +65,14 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre
     enabledPicStr = tr("Enabled pictures: %1 of %2");
     selectedWidgts = 0;
     profileFolder = "";
-    profileLoader = 0;
-    saSpacerItem = 0;
+    contextMenuOpened = false;
+    isProfileLoaded = false;
+    previousWidget = nullptr;
+    profileLoader = nullptr;
+    saSpacerItem = nullptr;
 
-    QPalette palette;
-    QColor baseColor = palette.base().color();
-    ui->labVersion->setText(ui->labVersion->text().arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
-    ui->saProfile->setStyleSheet(QString("QWidget#saProfileContent{background-color: rgb(%1, %2, %3)}").arg(QString::number(baseColor.red()),QString::number(baseColor.green()),QString::number(baseColor.blue())));
+    updatePalette();
+    ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
     ui->saProfileContent->setFilesMode(true);
 
     if (QIcon::hasThemeIcon("dialog-close"))
@@ -87,6 +89,9 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre
     ui->hlButtons->setSpacing(6 * screenRatio);
     ui->hlButtons->setContentsMargins(9 * screenRatio, 15 * screenRatio, 15 * screenRatio, 17 * screenRatio);
 #endif
+
+    setMouseTracking(true);
+    installEventFilter(this);
 }
 
 ProfileInterface::~ProfileInterface()
@@ -94,6 +99,8 @@ ProfileInterface::~ProfileInterface()
     foreach(ProfileWidget *widget, widgets.keys())
     {
         widgets.remove(widget);
+        widget->removeEventFilter(this);
+        widget->disconnect();
         delete widget;
     }
     foreach(SavegameData *savegame, savegames)
@@ -138,6 +145,8 @@ void ProfileInterface::savegameLoaded(SavegameData *savegame, QString savegamePa
     SavegameWidget *sgdWidget = new SavegameWidget(this);
     sgdWidget->setSavegameData(savegame, savegamePath);
     sgdWidget->setContentMode(contentMode);
+    sgdWidget->setMouseTracking(true);
+    sgdWidget->installEventFilter(this);
     widgets[sgdWidget] = "SGD" % QFileInfo(savegamePath).fileName();
     savegames += savegame;
     if (selectedWidgts != 0 || contentMode == 2) { sgdWidget->setSelectionMode(true); }
@@ -160,6 +169,8 @@ void ProfileInterface::pictureLoaded(SnapmaticPicture *picture, bool inserted)
     SnapmaticWidget *picWidget = new SnapmaticWidget(profileDB, crewDB, threadDB, this);
     picWidget->setSnapmaticPicture(picture);
     picWidget->setContentMode(contentMode);
+    picWidget->setMouseTracking(true);
+    picWidget->installEventFilter(this);
     widgets[picWidget] = "PIC" % picture->getPictureSortStr();
     pictures += picture;
     if (selectedWidgts != 0 || contentMode == 2) { picWidget->setSelectionMode(true); }
@@ -183,7 +194,7 @@ void ProfileInterface::loadingProgress(int value, int maximum)
 
 void ProfileInterface::insertSnapmaticIPI(QWidget *widget)
 {
-    ProfileWidget *proWidget = (ProfileWidget*)widget;
+    ProfileWidget *proWidget = qobject_cast<ProfileWidget*>(widget);
     if (widgets.contains(proWidget))
     {
         QString widgetKey = widgets[proWidget];
@@ -204,7 +215,7 @@ void ProfileInterface::insertSnapmaticIPI(QWidget *widget)
 
 void ProfileInterface::insertSavegameIPI(QWidget *widget)
 {
-    ProfileWidget *proWidget = (ProfileWidget*)widget;
+    ProfileWidget *proWidget = qobject_cast<ProfileWidget*>(widget);
     if (widgets.contains(proWidget))
     {
         QString widgetKey = widgets[proWidget];
@@ -221,8 +232,8 @@ void ProfileInterface::insertSavegameIPI(QWidget *widget)
 
 void ProfileInterface::dialogNextPictureRequested(QWidget *dialog)
 {
-    PictureDialog *picDialog = (PictureDialog*)dialog;
-    ProfileWidget *proWidget = (ProfileWidget*)sender();
+    PictureDialog *picDialog = qobject_cast<PictureDialog*>(dialog);
+    ProfileWidget *proWidget = qobject_cast<ProfileWidget*>(sender());
     if (widgets.contains(proWidget))
     {
         QString widgetKey = widgets[proWidget];
@@ -256,8 +267,8 @@ void ProfileInterface::dialogNextPictureRequested(QWidget *dialog)
 
 void ProfileInterface::dialogPreviousPictureRequested(QWidget *dialog)
 {
-    PictureDialog *picDialog = (PictureDialog*)dialog;
-    ProfileWidget *proWidget = (ProfileWidget*)sender();
+    PictureDialog *picDialog = qobject_cast<PictureDialog*>(dialog);
+    ProfileWidget *proWidget = qobject_cast<ProfileWidget*>(sender());
     if (widgets.contains(proWidget))
     {
         QString widgetKey = widgets[proWidget];
@@ -324,12 +335,13 @@ void ProfileInterface::profileLoaded_p()
     ui->swProfile->setCurrentWidget(ui->pageProfile);
     ui->cmdCloseProfile->setEnabled(true);
     ui->cmdImport->setEnabled(true);
+    isProfileLoaded = true;
     emit profileLoaded();
 }
 
 void ProfileInterface::savegameDeleted_event()
 {
-    savegameDeleted((SavegameWidget*)sender(), true);
+    savegameDeleted(qobject_cast<SavegameWidget*>(sender()), true);
 }
 
 void ProfileInterface::savegameDeleted(SavegameWidget *sgdWidget, bool isRemoteEmited)
@@ -338,13 +350,21 @@ void ProfileInterface::savegameDeleted(SavegameWidget *sgdWidget, bool isRemoteE
     if (sgdWidget->isSelected()) { sgdWidget->setSelected(false); }
     widgets.remove(sgdWidget);
 
+    sgdWidget->removeEventFilter(this);
+    if (sgdWidget == previousWidget)
+    {
+        previousWidget = nullptr;
+    }
+
     // Deleting when the widget did send a event cause a crash
     if (isRemoteEmited)
     {
+        sgdWidget->disconnect();
         sgdWidget->deleteLater();
     }
     else
     {
+        sgdWidget->disconnect();
         delete sgdWidget;
     }
 
@@ -354,7 +374,7 @@ void ProfileInterface::savegameDeleted(SavegameWidget *sgdWidget, bool isRemoteE
 
 void ProfileInterface::pictureDeleted_event()
 {
-    pictureDeleted((SnapmaticWidget*)sender(), true);
+    pictureDeleted(qobject_cast<SnapmaticWidget*>(sender()), true);
 }
 
 void ProfileInterface::pictureDeleted(SnapmaticWidget *picWidget, bool isRemoteEmited)
@@ -363,13 +383,21 @@ void ProfileInterface::pictureDeleted(SnapmaticWidget *picWidget, bool isRemoteE
     if (picWidget->isSelected()) { picWidget->setSelected(false); }
     widgets.remove(picWidget);
 
+    picWidget->removeEventFilter(this);
+    if (picWidget == previousWidget)
+    {
+        previousWidget = nullptr;
+    }
+
     // Deleting when the widget did send a event cause a crash
     if (isRemoteEmited)
     {
+        picWidget->disconnect();
         picWidget->deleteLater();
     }
     else
     {
+        picWidget->disconnect();
         delete picWidget;
     }
 
@@ -398,12 +426,24 @@ fileDialogPreOpen: //Work?
     fileDialog.setWindowTitle(tr("Import..."));
     fileDialog.setLabelText(QFileDialog::Accept, tr("Import"));
 
+    // Getting readable Image formats
+    QString imageFormatsStr = " ";
+    foreach(const QByteArray &imageFormat, QImageReader::supportedImageFormats())
+    {
+        imageFormatsStr += QString("*.") % QString::fromUtf8(imageFormat).toLower() % " ";
+    }
+    QString importableFormatsStr = QString("*.g5e SGTA* PGTA*");
+    if (!imageFormatsStr.trimmed().isEmpty())
+    {
+        importableFormatsStr = QString("*.g5e%1SGTA* PGTA*").arg(imageFormatsStr);
+    }
+
     QStringList filters;
-    filters << tr("Importable files (*.g5e *.jpg *.png SGTA* PGTA*)");
+    filters << tr("Importable files (%1)").arg(importableFormatsStr);
     filters << tr("GTA V Export (*.g5e)");
     filters << tr("Savegames files (SGTA*)");
     filters << tr("Snapmatic pictures (PGTA*)");
-    filters << tr("All image files (*.jpg *.png)");
+    filters << tr("All image files (%1)").arg(imageFormatsStr.trimmed());
     filters << tr("All files (**)");
     fileDialog.setNameFilters(filters);
 
@@ -520,7 +560,7 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
                 return false;
             }
         }
-        else if(selectedFileName.right(4) == ".jpg" || selectedFileName.right(4) == ".png")
+        else if(isSupportedImageFile(selectedFileName))
         {
             SnapmaticPicture *picture = new SnapmaticPicture(":/template/template.g5e");
             if (picture->readingPicture(true, false, true, false))
@@ -631,6 +671,7 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
                     snapmaticImageReader.setDevice(&snapmaticFile);
                     if (!snapmaticImageReader.read(&snapmaticImage))
                     {
+                        QMessageBox::warning(this, tr("Import"), tr("Can't import %1 because file can't be parsed properly").arg("\""+selectedFileName+"\""));
                         delete picture;
                         return false;
                     }
@@ -640,7 +681,7 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
                     importDialog->setModal(true);
                     importDialog->show();
                     importDialog->exec();
-                    if (importDialog->isDoImport())
+                    if (importDialog->isImportAgreed())
                     {
                         if (picture->setImage(importDialog->image()))
                         {
@@ -705,9 +746,13 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple)
             }
             else
             {
-                delete savegame;
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "ImportError SnapmaticPicture" << picture->getLastStep();
+                qDebug() << "ImportError SavegameData" << savegame->getLastStep();
+#endif
                 delete picture;
-                if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("Can't import %1 because of not valid file format").arg("\""+selectedFileName+"\""));
+                delete savegame;
+                if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("Can't import %1 because file format can't be detected").arg("\""+selectedFileName+"\""));
                 return false;
             }
         }
@@ -738,7 +783,7 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
         if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to import the Snapmatic picture, the picture is already in the game"));
         return false;
     }
-    else if (picture->exportPicture(profileFolder % QDir::separator() % adjustedFileName, "PGTA"))
+    else if (picture->exportPicture(profileFolder % QDir::separator() % adjustedFileName, SnapmaticFormat::PGTA_Format))
     {
         picture->setPicFilePath(profileFolder % QDir::separator() % adjustedFileName);
         pictureLoaded(picture, true);
@@ -914,8 +959,10 @@ void ProfileInterface::exportSelected()
                 }
                 else
                 {
-                    pictureExportEnabled = true;
-                    pictureCopyEnabled = true;
+                    // Don't export anymore when any Cancel button got clicked
+                    settings.endGroup();
+                    settings.endGroup();
+                    return;
                 }
             }
 
@@ -934,7 +981,7 @@ void ProfileInterface::exportSelected()
             QProgressDialog pbDialog(this);
             pbDialog.setWindowFlags(pbDialog.windowFlags()^Qt::WindowContextHelpButtonHint^Qt::WindowCloseButtonHint);
             pbDialog.setWindowTitle(tr("Export selected..."));
-            pbDialog.setLabelText(tr("Initializing export..."));
+            pbDialog.setLabelText(tr("Initialising export..."));
             pbDialog.setRange(0, exportCount);
 
             QList<QPushButton*> pbBtn = pbDialog.findChildren<QPushButton*>();
@@ -1003,7 +1050,7 @@ void ProfileInterface::deleteSelected()
                 {
                     if (widget->getWidgetType() == "SnapmaticWidget")
                     {
-                        SnapmaticWidget *picWidget = (SnapmaticWidget*)widget;
+                        SnapmaticWidget *picWidget = qobject_cast<SnapmaticWidget*>(widget);
                         if (picWidget->getPicture()->deletePicFile())
                         {
                             pictureDeleted(picWidget);
@@ -1011,7 +1058,7 @@ void ProfileInterface::deleteSelected()
                     }
                     else if (widget->getWidgetType() == "SavegameWidget")
                     {
-                        SavegameWidget *sgdWidget = (SavegameWidget*)widget;
+                        SavegameWidget *sgdWidget = qobject_cast<SavegameWidget*>(widget);
                         SavegameData *savegame = sgdWidget->getSavegame();
                         QString fileName = savegame->getSavegameFileName();
                         if (!QFile::exists(fileName) || QFile::remove(fileName))
@@ -1038,9 +1085,15 @@ void ProfileInterface::importFiles()
     on_cmdImport_clicked();
 }
 
-void ProfileInterface::settingsApplied(int _contentMode, QString language)
+void ProfileInterface::settingsApplied(int _contentMode, QString _language)
 {
-    Q_UNUSED(language)
+    bool translationUpdated = false;
+    if (language != _language)
+    {
+        retranslateUi();
+        language = _language;
+        translationUpdated = true;
+    }
     contentMode = _contentMode;
 
     if (contentMode == 2)
@@ -1049,6 +1102,7 @@ void ProfileInterface::settingsApplied(int _contentMode, QString language)
         {
             widget->setSelectionMode(true);
             widget->setContentMode(contentMode);
+            if (translationUpdated) widget->retranslate();
         }
     }
     else
@@ -1060,6 +1114,7 @@ void ProfileInterface::settingsApplied(int _contentMode, QString language)
                 widget->setSelectionMode(false);
             }
             widget->setContentMode(contentMode);
+            if (translationUpdated) widget->retranslate();
         }
     }
 }
@@ -1073,7 +1128,7 @@ void ProfileInterface::enableSelected()
         {
             if (widget->getWidgetType() == "SnapmaticWidget")
             {
-                SnapmaticWidget *snapmaticWidget = (SnapmaticWidget*)widget;
+                SnapmaticWidget *snapmaticWidget = qobject_cast<SnapmaticWidget*>(widget);
                 if (!snapmaticWidget->makePictureVisible())
                 {
                     fails++;
@@ -1092,7 +1147,7 @@ void ProfileInterface::disableSelected()
         {
             if (widget->getWidgetType() == "SnapmaticWidget")
             {
-                SnapmaticWidget *snapmaticWidget = (SnapmaticWidget*)widget;
+                SnapmaticWidget *snapmaticWidget = qobject_cast<SnapmaticWidget*>(widget);
                 if (!snapmaticWidget->makePictureHidden())
                 {
                     fails++;
@@ -1109,7 +1164,16 @@ int ProfileInterface::selectedWidgets()
 
 void ProfileInterface::contextMenuTriggeredPIC(QContextMenuEvent *ev)
 {
-    SnapmaticWidget *picWidget = (SnapmaticWidget*)sender();
+    SnapmaticWidget *picWidget = qobject_cast<SnapmaticWidget*>(sender());
+    if (picWidget != previousWidget)
+    {
+        if (previousWidget != nullptr)
+        {
+            previousWidget->setStyleSheet(QLatin1String(""));
+        }
+        picWidget->setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+        previousWidget = picWidget;
+    }
     QMenu contextMenu(picWidget);
     QMenu editMenu(SnapmaticWidget::tr("Edi&t"), picWidget);
     if (picWidget->isHidden())
@@ -1122,8 +1186,8 @@ void ProfileInterface::contextMenuTriggeredPIC(QContextMenuEvent *ev)
     }
     editMenu.addAction(SnapmaticWidget::tr("&Edit Properties..."), picWidget, SLOT(editSnapmaticProperties()));
     QMenu exportMenu(SnapmaticWidget::tr("&Export"), this);
-    exportMenu.addAction(SnapmaticWidget::tr("Export as &JPG picture..."), picWidget, SLOT(on_cmdExport_clicked()));
-    exportMenu.addAction(SnapmaticWidget::tr("Export as &GTA Snapmatic..."), picWidget, SLOT(on_cmdCopy_clicked()));
+    exportMenu.addAction(SnapmaticWidget::tr("Export as &Picture..."), picWidget, SLOT(on_cmdExport_clicked()));
+    exportMenu.addAction(SnapmaticWidget::tr("Export as &Snapmatic..."), picWidget, SLOT(on_cmdCopy_clicked()));
     contextMenu.addAction(SnapmaticWidget::tr("&View"), picWidget, SLOT(on_cmdView_clicked()));
     contextMenu.addMenu(&editMenu);
     contextMenu.addMenu(&exportMenu);
@@ -1139,12 +1203,24 @@ void ProfileInterface::contextMenuTriggeredPIC(QContextMenuEvent *ev)
     {
         contextMenu.addAction(SnapmaticWidget::tr("&Deselect All"), picWidget, SLOT(deselectAllWidgets()), QKeySequence::fromString("Ctrl+D"));
     }
+    contextMenuOpened = true;
     contextMenu.exec(ev->globalPos());
+    contextMenuOpened = false;
+    hoverProfileWidgetCheck();
 }
 
 void ProfileInterface::contextMenuTriggeredSGD(QContextMenuEvent *ev)
 {
-    SavegameWidget *sgdWidget = (SavegameWidget*)sender();
+    SavegameWidget *sgdWidget = qobject_cast<SavegameWidget*>(sender());
+    if (sgdWidget != previousWidget)
+    {
+        if (previousWidget != nullptr)
+        {
+            previousWidget->setStyleSheet(QLatin1String(""));
+        }
+        sgdWidget->setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+        previousWidget = sgdWidget;
+    }
     QMenu contextMenu(sgdWidget);
     contextMenu.addAction(SavegameWidget::tr("&View"), sgdWidget, SLOT(on_cmdView_clicked()));
     contextMenu.addAction(SavegameWidget::tr("&Export"), sgdWidget, SLOT(on_cmdCopy_clicked()));
@@ -1160,7 +1236,10 @@ void ProfileInterface::contextMenuTriggeredSGD(QContextMenuEvent *ev)
     {
         contextMenu.addAction(SavegameWidget::tr("&Deselect All"), sgdWidget, SLOT(deselectAllWidgets()), QKeySequence::fromString("Ctrl+D"));
     }
+    contextMenuOpened = true;
     contextMenu.exec(ev->globalPos());
+    contextMenuOpened = false;
+    hoverProfileWidgetCheck();
 }
 
 void ProfileInterface::on_saProfileContent_dropped(const QMimeData *mimeData)
@@ -1187,3 +1266,200 @@ void ProfileInterface::on_saProfileContent_dropped(const QMimeData *mimeData)
         importFilesProgress(pathList);
     }
 }
+
+void ProfileInterface::retranslateUi()
+{
+    ui->retranslateUi(this);
+    ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
+}
+
+bool ProfileInterface::eventFilter(QObject *watched, QEvent *event)
+{
+    if (event->type() == QEvent::MouseMove)
+    {
+        if ((watched->objectName() == "SavegameWidget" || watched->objectName() == "SnapmaticWidget") && isProfileLoaded)
+        {
+            ProfileWidget *pWidget = qobject_cast<ProfileWidget*>(watched);
+            if (pWidget->underMouse())
+            {
+                bool styleSheetChanged = false;
+                if (pWidget->getWidgetType() == "SnapmaticWidget")
+                {
+                    if (pWidget != previousWidget)
+                    {
+                        pWidget->setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                        styleSheetChanged = true;
+                    }
+                }
+                else if (pWidget->getWidgetType() == "SavegameWidget")
+                {
+                    if (pWidget != previousWidget)
+                    {
+                        pWidget->setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                        styleSheetChanged = true;
+                    }
+                }
+                if (styleSheetChanged)
+                {
+                    if (previousWidget != nullptr)
+                    {
+                        previousWidget->setStyleSheet(QLatin1String(""));
+                    }
+                    previousWidget = pWidget;
+                }
+            }
+            return true;
+        }
+    }
+    else if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::WindowActivate)
+    {
+        if ((watched->objectName() == "SavegameWidget" || watched->objectName() == "SnapmaticWidget") && isProfileLoaded)
+        {
+            ProfileWidget *pWidget = nullptr;
+            foreach(ProfileWidget *widget, widgets.keys())
+            {
+                QPoint mousePos = widget->mapFromGlobal(QCursor::pos());
+                if (widget->rect().contains(mousePos))
+                {
+                    pWidget = widget;
+                    break;
+                }
+            }
+            if (pWidget != nullptr)
+            {
+                bool styleSheetChanged = false;
+                if (pWidget->getWidgetType() == "SnapmaticWidget")
+                {
+                    if (pWidget != previousWidget)
+                    {
+                        pWidget->setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                        styleSheetChanged = true;
+                    }
+                }
+                else if (pWidget->getWidgetType() == "SavegameWidget")
+                {
+                    if (pWidget != previousWidget)
+                    {
+                        pWidget->setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                        styleSheetChanged = true;
+                    }
+                }
+                if (styleSheetChanged)
+                {
+                    if (previousWidget != nullptr)
+                    {
+                        previousWidget->setStyleSheet(QLatin1String(""));
+                    }
+                    previousWidget = pWidget;
+                }
+            }
+        }
+    }
+    else if (event->type() == QEvent::WindowDeactivate && isProfileLoaded)
+    {
+        if (previousWidget != nullptr)
+        {
+            previousWidget->setStyleSheet(QLatin1String(""));
+            previousWidget = nullptr;
+        }
+    }
+    else if (event->type() == QEvent::Leave && isProfileLoaded && !contextMenuOpened)
+    {
+        if (watched->objectName() == "SavegameWidget" || watched->objectName() == "SnapmaticWidget")
+        {
+            ProfileWidget *pWidget = qobject_cast<ProfileWidget*>(watched);
+            QPoint mousePos = pWidget->mapFromGlobal(QCursor::pos());
+            if (!pWidget->geometry().contains(mousePos))
+            {
+                if (previousWidget != nullptr)
+                {
+                    previousWidget->setStyleSheet(QLatin1String(""));
+                    previousWidget = nullptr;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+void ProfileInterface::hoverProfileWidgetCheck()
+{
+    ProfileWidget *pWidget = nullptr;
+    foreach(ProfileWidget *widget, widgets.keys())
+    {
+        if (widget->underMouse())
+        {
+            pWidget = widget;
+            break;
+        }
+    }
+    if (pWidget != nullptr)
+    {
+        bool styleSheetChanged = false;
+        if (pWidget->getWidgetType() == "SnapmaticWidget")
+        {
+            if (pWidget != previousWidget)
+            {
+                pWidget->setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                styleSheetChanged = true;
+            }
+        }
+        else if (pWidget->getWidgetType() == "SavegameWidget")
+        {
+            if (pWidget != previousWidget)
+            {
+                pWidget->setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+                styleSheetChanged = true;
+            }
+        }
+        if (styleSheetChanged)
+        {
+            if (previousWidget != nullptr)
+            {
+                previousWidget->setStyleSheet(QLatin1String(""));
+            }
+            previousWidget = pWidget;
+        }
+    }
+    else
+    {
+        if (previousWidget != nullptr)
+        {
+            previousWidget->setStyleSheet(QLatin1String(""));
+            previousWidget = nullptr;
+        }
+    }
+}
+
+void ProfileInterface::updatePalette()
+{
+    QPalette palette;
+    QColor baseColor = palette.base().color();
+    highlightBackColor = palette.highlight().color();
+    highlightTextColor = palette.highlightedText().color();
+    ui->saProfile->setStyleSheet(QString("QWidget#saProfileContent{background-color: rgb(%1, %2, %3)}").arg(QString::number(baseColor.red()), QString::number(baseColor.green()), QString::number(baseColor.blue())));
+    if (previousWidget != nullptr)
+    {
+        if (previousWidget->getWidgetType() == "SnapmaticWidget")
+        {
+            previousWidget->setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+        }
+        else if (previousWidget->getWidgetType() == "SavegameWidget")
+        {
+            previousWidget->setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
+        }
+    }
+}
+
+bool ProfileInterface::isSupportedImageFile(QString selectedFileName)
+{
+    foreach(const QByteArray &imageFormat, QImageReader::supportedImageFormats())
+    {
+        QString imageFormatStr = QString(".") % QString::fromUtf8(imageFormat).toLower();
+        if (selectedFileName.length() >= imageFormatStr.length() && selectedFileName.toLower().right(imageFormatStr.length()) == imageFormatStr)
+        {
+            return true;
+        }
+    }
+    return false;
+}
diff --git a/ProfileInterface.h b/ProfileInterface.h
index 9d769e8..a45ed9e 100755
--- a/ProfileInterface.h
+++ b/ProfileInterface.h
@@ -1,114 +1,127 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PROFILEINTERFACE_H
-#define PROFILEINTERFACE_H
-
-#include "SnapmaticPicture.h"
-#include "SnapmaticWidget.h"
-#include "ProfileDatabase.h"
-#include "DatabaseThread.h"
-#include "SavegameWidget.h"
-#include "ProfileLoader.h"
-#include "ProfileWidget.h"
-#include "ExportThread.h"
-#include "SavegameData.h"
-#include "CrewDatabase.h"
-#include <QProgressDialog>
-#include <QSpacerItem>
-#include <QWidget>
-#include <QList>
-#include <QMap>
-
-namespace Ui {
-class ProfileInterface;
-}
-
-class ProfileInterface : public QWidget
-{
-    Q_OBJECT
-public:
-    explicit ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
-    void setProfileFolder(QString folder, QString profile);
-    void settingsApplied(int contentMode, QString language);
-    void setupProfileInterface();
-    void disableSelected();
-    void enableSelected();
-    int selectedWidgets();
-    ~ProfileInterface();
-
-public slots:
-    void contextMenuTriggeredPIC(QContextMenuEvent* ev);
-    void contextMenuTriggeredSGD(QContextMenuEvent* ev);
-    void selectAllWidgets();
-    void deselectAllWidgets();
-    void exportSelected();
-    void deleteSelected();
-    void importFiles();
-
-private slots:
-    void on_cmdCloseProfile_clicked();
-    void on_cmdImport_clicked();
-    void pictureLoaded_event(SnapmaticPicture *picture);
-    void savegameLoaded_event(SavegameData *savegame, QString savegamePath);
-    void loadingProgress(int value, int maximum);
-    void pictureDeleted_event();
-    void savegameDeleted_event();
-    void profileLoaded_p();
-    void profileWidgetSelected();
-    void profileWidgetDeselected();
-    void dialogNextPictureRequested(QWidget *dialog);
-    void dialogPreviousPictureRequested(QWidget *dialog);
-    void on_saProfileContent_dropped(const QMimeData *mimeData);
-
-private:
-    ProfileDatabase *profileDB;
-    CrewDatabase *crewDB;
-    DatabaseThread *threadDB;
-    Ui::ProfileInterface *ui;
-
-    ProfileLoader *profileLoader;
-    QList<SavegameData*> savegames;
-    QList<SnapmaticPicture*> pictures;
-    QMap<ProfileWidget*,QString> widgets;
-    QSpacerItem *saSpacerItem;
-    QString enabledPicStr;
-    QString profileFolder;
-    QString profileName;
-    QString loadingStr;
-    int selectedWidgts;
-    int contentMode;
-
-    bool importFile(QString selectedFile, bool notMultiple);
-    void importFilesProgress(QStringList selectedFiles);
-    bool importSnapmaticPicture(SnapmaticPicture *picture, bool warn = true);
-    bool importSavegameData(SavegameData *savegame, QString sgdPath, bool warn = true);
-    void pictureLoaded(SnapmaticPicture *picture, bool inserted);
-    void savegameLoaded(SavegameData *savegame, QString savegamePath, bool inserted);
-    void savegameDeleted(SavegameWidget *sgdWidget, bool isRemoteEmited = false);
-    void pictureDeleted(SnapmaticWidget *picWidget, bool isRemoteEmited = false);
-    void insertSnapmaticIPI(QWidget *widget);
-    void insertSavegameIPI(QWidget *widget);
-    void sortingProfileInterface();
-
-signals:
-    void profileLoaded();
-    void profileClosed();
-};
-
-#endif // PROFILEINTERFACE_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PROFILEINTERFACE_H
+#define PROFILEINTERFACE_H
+
+#include "SnapmaticPicture.h"
+#include "SnapmaticWidget.h"
+#include "ProfileDatabase.h"
+#include "DatabaseThread.h"
+#include "SavegameWidget.h"
+#include "ProfileLoader.h"
+#include "ProfileWidget.h"
+#include "ExportThread.h"
+#include "SavegameData.h"
+#include "CrewDatabase.h"
+#include <QProgressDialog>
+#include <QSpacerItem>
+#include <QWidget>
+#include <QList>
+#include <QMap>
+
+namespace Ui {
+class ProfileInterface;
+}
+
+class ProfileInterface : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
+    void setProfileFolder(QString folder, QString profile);
+    void settingsApplied(int contentMode, QString language);
+    void setupProfileInterface();
+    void disableSelected();
+    void enableSelected();
+    int selectedWidgets();
+    void retranslateUi();
+    ~ProfileInterface();
+
+public slots:
+    void contextMenuTriggeredPIC(QContextMenuEvent* ev);
+    void contextMenuTriggeredSGD(QContextMenuEvent* ev);
+    void hoverProfileWidgetCheck();
+    void selectAllWidgets();
+    void deselectAllWidgets();
+    void exportSelected();
+    void deleteSelected();
+    void updatePalette();
+    void importFiles();
+
+private slots:
+    void on_cmdCloseProfile_clicked();
+    void on_cmdImport_clicked();
+    void pictureLoaded_event(SnapmaticPicture *picture);
+    void savegameLoaded_event(SavegameData *savegame, QString savegamePath);
+    void loadingProgress(int value, int maximum);
+    void pictureDeleted_event();
+    void savegameDeleted_event();
+    void profileLoaded_p();
+    void profileWidgetSelected();
+    void profileWidgetDeselected();
+    void dialogNextPictureRequested(QWidget *dialog);
+    void dialogPreviousPictureRequested(QWidget *dialog);
+    void on_saProfileContent_dropped(const QMimeData *mimeData);
+
+protected:
+    bool eventFilter(QObject *watched, QEvent *event);
+
+private:
+    ProfileDatabase *profileDB;
+    CrewDatabase *crewDB;
+    DatabaseThread *threadDB;
+    Ui::ProfileInterface *ui;
+
+    ProfileLoader *profileLoader;
+    ProfileWidget *previousWidget;
+    QList<SavegameData*> savegames;
+    QList<SnapmaticPicture*> pictures;
+    QMap<ProfileWidget*,QString> widgets;
+    QSpacerItem *saSpacerItem;
+    QColor highlightBackColor;
+    QColor highlightTextColor;
+    QString enabledPicStr;
+    QString profileFolder;
+    QString profileName;
+    QString loadingStr;
+    QString language;
+    bool contextMenuOpened;
+    bool isProfileLoaded;
+    int selectedWidgts;
+    int contentMode;
+
+    bool isSupportedImageFile(QString selectedFileName);
+    bool importFile(QString selectedFile, bool notMultiple);
+    void importFilesProgress(QStringList selectedFiles);
+    bool importSnapmaticPicture(SnapmaticPicture *picture, bool warn = true);
+    bool importSavegameData(SavegameData *savegame, QString sgdPath, bool warn = true);
+    void pictureLoaded(SnapmaticPicture *picture, bool inserted);
+    void savegameLoaded(SavegameData *savegame, QString savegamePath, bool inserted);
+    void savegameDeleted(SavegameWidget *sgdWidget, bool isRemoteEmited = false);
+    void pictureDeleted(SnapmaticWidget *picWidget, bool isRemoteEmited = false);
+    void insertSnapmaticIPI(QWidget *widget);
+    void insertSavegameIPI(QWidget *widget);
+    void sortingProfileInterface();
+
+signals:
+    void profileLoaded();
+    void profileClosed();
+};
+
+#endif // PROFILEINTERFACE_H
diff --git a/ProfileInterface.ui b/ProfileInterface.ui
index de37b79..066e636 100755
--- a/ProfileInterface.ui
+++ b/ProfileInterface.ui
@@ -1,244 +1,244 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>ProfileInterface</class>
- <widget class="QWidget" name="ProfileInterface">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Profile Interface</string>
-  </property>
-  <layout class="QVBoxLayout" name="vlProfileInterface">
-   <property name="spacing">
-    <number>0</number>
-   </property>
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QStackedWidget" name="swProfile">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="pageLoading">
-      <layout class="QVBoxLayout" name="vlLoadingPage">
-       <item>
-        <spacer name="vsLoading1">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item>
-        <widget class="QLabel" name="labProfileLoading">
-         <property name="text">
-          <string>Loading file %1 of %2 files</string>
-         </property>
-         <property name="alignment">
-          <set>Qt::AlignCenter</set>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QProgressBar" name="pbPictureLoading">
-         <property name="value">
-          <number>0</number>
-         </property>
-         <property name="textVisible">
-          <bool>false</bool>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <spacer name="vsLoading2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>0</width>
-           <height>0</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="pageProfile">
-      <layout class="QVBoxLayout" name="vlProfilePage">
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="QScrollArea" name="saProfile">
-         <property name="widgetResizable">
-          <bool>true</bool>
-         </property>
-         <widget class="UiModWidget" name="saProfileContent">
-          <property name="geometry">
-           <rect>
-            <x>0</x>
-            <y>0</y>
-            <width>398</width>
-            <height>257</height>
-           </rect>
-          </property>
-          <property name="acceptDrops">
-           <bool>true</bool>
-          </property>
-          <layout class="QVBoxLayout" name="vlProfile">
-           <property name="leftMargin">
-            <number>0</number>
-           </property>
-           <property name="topMargin">
-            <number>0</number>
-           </property>
-           <property name="rightMargin">
-            <number>0</number>
-           </property>
-           <property name="bottomMargin">
-            <number>0</number>
-           </property>
-           <item>
-            <layout class="QVBoxLayout" name="vlContent">
-             <property name="spacing">
-              <number>0</number>
-             </property>
-             <item>
-              <layout class="QVBoxLayout" name="vlSavegame"/>
-             </item>
-             <item>
-              <layout class="QVBoxLayout" name="vlSnapmatic"/>
-             </item>
-            </layout>
-           </item>
-          </layout>
-         </widget>
-        </widget>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="hlButtons">
-     <property name="spacing">
-      <number>6</number>
-     </property>
-     <property name="leftMargin">
-      <number>9</number>
-     </property>
-     <property name="topMargin">
-      <number>9</number>
-     </property>
-     <property name="rightMargin">
-      <number>9</number>
-     </property>
-     <property name="bottomMargin">
-      <number>9</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="labVersion">
-       <property name="text">
-        <string>%1 %2</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="hsProfile">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdImport">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Import exported file</string>
-       </property>
-       <property name="text">
-        <string>&amp;Import...</string>
-       </property>
-       <property name="autoDefault">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdCloseProfile">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Close profile</string>
-       </property>
-       <property name="text">
-        <string>&amp;Close</string>
-       </property>
-       <property name="autoDefault">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>UiModWidget</class>
-   <extends>QWidget</extends>
-   <header>UiModWidget.h</header>
-   <container>1</container>
-   <slots>
-    <signal>dropped(QMimeData*)</signal>
-   </slots>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ProfileInterface</class>
+ <widget class="QWidget" name="ProfileInterface">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Profile Interface</string>
+  </property>
+  <layout class="QVBoxLayout" name="vlProfileInterface">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QStackedWidget" name="swProfile">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="pageLoading">
+      <layout class="QVBoxLayout" name="vlLoadingPage">
+       <item>
+        <spacer name="vsLoading1">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="labProfileLoading">
+         <property name="text">
+          <string>Loading file %1 of %2 files</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignCenter</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QProgressBar" name="pbPictureLoading">
+         <property name="value">
+          <number>0</number>
+         </property>
+         <property name="textVisible">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="vsLoading2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="pageProfile">
+      <layout class="QVBoxLayout" name="vlProfilePage">
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QScrollArea" name="saProfile">
+         <property name="widgetResizable">
+          <bool>true</bool>
+         </property>
+         <widget class="UiModWidget" name="saProfileContent">
+          <property name="geometry">
+           <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>398</width>
+            <height>257</height>
+           </rect>
+          </property>
+          <property name="acceptDrops">
+           <bool>true</bool>
+          </property>
+          <layout class="QVBoxLayout" name="vlProfile">
+           <property name="leftMargin">
+            <number>0</number>
+           </property>
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <property name="rightMargin">
+            <number>0</number>
+           </property>
+           <property name="bottomMargin">
+            <number>0</number>
+           </property>
+           <item>
+            <layout class="QVBoxLayout" name="vlContent">
+             <property name="spacing">
+              <number>0</number>
+             </property>
+             <item>
+              <layout class="QVBoxLayout" name="vlSavegame"/>
+             </item>
+             <item>
+              <layout class="QVBoxLayout" name="vlSnapmatic"/>
+             </item>
+            </layout>
+           </item>
+          </layout>
+         </widget>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="hlButtons">
+     <property name="spacing">
+      <number>6</number>
+     </property>
+     <property name="leftMargin">
+      <number>9</number>
+     </property>
+     <property name="topMargin">
+      <number>9</number>
+     </property>
+     <property name="rightMargin">
+      <number>9</number>
+     </property>
+     <property name="bottomMargin">
+      <number>9</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="labVersion">
+       <property name="text">
+        <string>%1 %2</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="hsProfile">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdImport">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Import file</string>
+       </property>
+       <property name="text">
+        <string>&amp;Import...</string>
+       </property>
+       <property name="autoDefault">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdCloseProfile">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Close profile</string>
+       </property>
+       <property name="text">
+        <string>&amp;Close</string>
+       </property>
+       <property name="autoDefault">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>UiModWidget</class>
+   <extends>QWidget</extends>
+   <header>UiModWidget.h</header>
+   <container>1</container>
+   <slots>
+    <signal>dropped(QMimeData*)</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ProfileLoader.cpp b/ProfileLoader.cpp
index 73e3941..243721e 100755
--- a/ProfileLoader.cpp
+++ b/ProfileLoader.cpp
@@ -1,103 +1,106 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "ProfileLoader.h"
-#include "SnapmaticPicture.h"
-#include "SavegameData.h"
-#include "CrewDatabase.h"
-#include <QStringList>
-#include <QString>
-#include <QFile>
-#include <QDir>
-
-ProfileLoader::ProfileLoader(QString profileFolder, CrewDatabase *crewDB, QObject *parent) : QThread(parent), profileFolder(profileFolder), crewDB(crewDB)
-{
-
-}
-
-void ProfileLoader::run()
-{
-    int curFile = 1;
-    QDir profileDir;
-    QList<int> crewList;
-    profileDir.setPath(profileFolder);
-
-    // Seek pictures and savegames
-    profileDir.setNameFilters(QStringList("SGTA*"));
-    QStringList SavegameFiles = profileDir.entryList(QDir::Files | QDir::NoDot, QDir::NoSort);
-    QStringList BackupFiles = SavegameFiles.filter(".bak", Qt::CaseInsensitive);
-    profileDir.setNameFilters(QStringList("PGTA*"));
-    QStringList SnapmaticPics = profileDir.entryList(QDir::Files | QDir::NoDot, QDir::NoSort);
-    BackupFiles.append(SnapmaticPics.filter(".bak", Qt::CaseInsensitive));
-
-    SavegameFiles.removeDuplicates();
-    SnapmaticPics.removeDuplicates();
-    foreach(const QString &BackupFile, BackupFiles)
-    {
-        SavegameFiles.removeAll(BackupFile);
-        SnapmaticPics.removeAll(BackupFile);
-    }
-
-    int maximumV = SavegameFiles.length() + SnapmaticPics.length();
-
-    // Loading pictures and savegames
-    emit loadingProgress(curFile, maximumV);
-    foreach(const QString &SavegameFile, SavegameFiles)
-    {
-        emit loadingProgress(curFile, maximumV);
-        QString sgdPath = profileFolder + QDir::separator() + SavegameFile;
-        SavegameData *savegame = new SavegameData(sgdPath);
-        if (savegame->readingSavegame())
-        {
-            emit savegameLoaded(savegame, sgdPath);
-        }
-        curFile++;
-    }
-    foreach(const QString &SnapmaticPic, SnapmaticPics)
-    {
-        emit loadingProgress(curFile, maximumV);
-        QString picturePath = profileFolder + QDir::separator() + SnapmaticPic;
-        SnapmaticPicture *picture = new SnapmaticPicture(picturePath);
-        if (picture->readingPicture(true, true, true))
-        {
-            emit pictureLoaded(picture);
-            int crewNumber = picture->getSnapmaticProperties().crewID;
-            if (!crewList.contains(crewNumber))
-            {
-                crewList.append(crewNumber);
-            }
-        }
-        curFile++;
-    }
-
-    // adding found crews
-    foreach(int crewID, crewList)
-    {
-        crewDB->addCrew(crewID);
-    }
-}
-
-void ProfileLoader::preloaded()
-{
-
-}
-
-void ProfileLoader::loaded()
-{
-
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "ProfileLoader.h"
+#include "SnapmaticPicture.h"
+#include "SavegameData.h"
+#include "CrewDatabase.h"
+#include <QStringBuilder>
+#include <QStringList>
+#include <QString>
+#include <QFile>
+#include <QDir>
+
+ProfileLoader::ProfileLoader(QString profileFolder, CrewDatabase *crewDB, QObject *parent) : QThread(parent), profileFolder(profileFolder), crewDB(crewDB)
+{
+
+}
+
+void ProfileLoader::run()
+{
+    int curFile = 1;
+    QDir profileDir;
+    QList<int> crewList;
+    profileDir.setPath(profileFolder);
+
+    // Seek pictures and savegames
+    profileDir.setNameFilters(QStringList("SGTA*"));
+    QStringList SavegameFiles = profileDir.entryList(QDir::Files | QDir::NoDot, QDir::NoSort);
+    QStringList BackupFiles = SavegameFiles.filter(".bak", Qt::CaseInsensitive);
+    profileDir.setNameFilters(QStringList("PGTA*"));
+    QStringList SnapmaticPics = profileDir.entryList(QDir::Files | QDir::NoDot, QDir::NoSort);
+    BackupFiles += SnapmaticPics.filter(".bak", Qt::CaseInsensitive);
+
+    SavegameFiles.removeDuplicates();
+    SnapmaticPics.removeDuplicates();
+    foreach(const QString &BackupFile, BackupFiles)
+    {
+        SavegameFiles.removeAll(BackupFile);
+        SnapmaticPics.removeAll(BackupFile);
+    }
+
+    int maximumV = SavegameFiles.length() + SnapmaticPics.length();
+
+    // Loading pictures and savegames
+    emit loadingProgress(curFile, maximumV);
+    foreach(const QString &SavegameFile, SavegameFiles)
+    {
+        emit loadingProgress(curFile, maximumV);
+        QString sgdPath = profileFolder % QDir::separator() % SavegameFile;
+        SavegameData *savegame = new SavegameData(sgdPath);
+        if (savegame->readingSavegame())
+        {
+            emit savegameLoaded(savegame, sgdPath);
+        }
+        curFile++;
+    }
+    foreach(const QString &SnapmaticPic, SnapmaticPics)
+    {
+        emit loadingProgress(curFile, maximumV);
+        QString picturePath = profileFolder % QDir::separator() % SnapmaticPic;
+        SnapmaticPicture *picture = new SnapmaticPicture(picturePath);
+        if (picture->readingPicture(true, true, true))
+        {
+            emit pictureLoaded(picture);
+            int crewNumber = picture->getSnapmaticProperties().crewID;
+            if (!crewList.contains(crewNumber))
+            {
+                crewList += crewNumber;
+            }
+        }
+        curFile++;
+    }
+
+    // adding found crews
+    crewDB->setAddingCrews(true);
+    foreach(int crewID, crewList)
+    {
+        crewDB->addCrew(crewID);
+    }
+    crewDB->setAddingCrews(false);
+}
+
+void ProfileLoader::preloaded()
+{
+
+}
+
+void ProfileLoader::loaded()
+{
+
+}
diff --git a/ProfileLoader.h b/ProfileLoader.h
index 23c4d77..4de52fe 100755
--- a/ProfileLoader.h
+++ b/ProfileLoader.h
@@ -1,52 +1,52 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PROFILELOADER_H
-#define PROFILELOADER_H
-
-#include "SnapmaticPicture.h"
-#include "SavegameData.h"
-#include "CrewDatabase.h"
-#include <QThread>
-#include <QDir>
-
-class ProfileLoader : public QThread
-{
-    Q_OBJECT
-public:
-    explicit ProfileLoader(QString profileFolder, CrewDatabase *crewDB, QObject *parent = 0);
-
-protected:
-    void run();
-
-private:
-    QString profileFolder;
-    CrewDatabase *crewDB;
-    ProfileLoader *profileLoader;
-
-private slots:
-    void preloaded();
-    void loaded();
-
-signals:
-    void pictureLoaded(SnapmaticPicture *picture);
-    void savegameLoaded(SavegameData *savegame, QString savegamePath);
-    void loadingProgress(int value, int maximum);
-};
-
-#endif // PROFILELOADER_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PROFILELOADER_H
+#define PROFILELOADER_H
+
+#include "SnapmaticPicture.h"
+#include "SavegameData.h"
+#include "CrewDatabase.h"
+#include <QThread>
+#include <QDir>
+
+class ProfileLoader : public QThread
+{
+    Q_OBJECT
+public:
+    explicit ProfileLoader(QString profileFolder, CrewDatabase *crewDB, QObject *parent = 0);
+
+protected:
+    void run();
+
+private:
+    QString profileFolder;
+    CrewDatabase *crewDB;
+    ProfileLoader *profileLoader;
+
+private slots:
+    void preloaded();
+    void loaded();
+
+signals:
+    void pictureLoaded(SnapmaticPicture *picture);
+    void savegameLoaded(SavegameData *savegame, QString savegamePath);
+    void loadingProgress(int value, int maximum);
+};
+
+#endif // PROFILELOADER_H
diff --git a/ProfileWidget.cpp b/ProfileWidget.cpp
index 58828ef..09b7a0f 100755
--- a/ProfileWidget.cpp
+++ b/ProfileWidget.cpp
@@ -1,61 +1,66 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "ProfileWidget.h"
-#include <QDebug>
-
-ProfileWidget::ProfileWidget(QWidget *parent) : QWidget(parent)
-{
-    contentMode = 0;
-}
-
-ProfileWidget::~ProfileWidget()
-{
-}
-
-bool ProfileWidget::isSelected()
-{
-    qDebug() << "ProfileWidget::isSelected got used without overwrite";
-    return false;
-}
-
-void ProfileWidget::setSelected(bool isSelected)
-{
-    qDebug() << "ProfileWidget::setSelected got used without overwrite, result" << isSelected;
-}
-
-void ProfileWidget::setSelectionMode(bool selectionMode)
-{
-    qDebug() << "ProfileWidget::setSelectionMode got used without overwrite, result:" << selectionMode;
-}
-
-QString ProfileWidget::getWidgetType()
-{
-    qDebug() << "ProfileWidget::getWidgetType got used without overwrite";
-    return "ProfileWidget";
-}
-
-int ProfileWidget::getContentMode()
-{
-    return contentMode;
-}
-
-void ProfileWidget::setContentMode(int _contentMode)
-{
-    contentMode = _contentMode;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "ProfileWidget.h"
+#include <QDebug>
+
+ProfileWidget::ProfileWidget(QWidget *parent) : QWidget(parent)
+{
+    contentMode = 0;
+}
+
+ProfileWidget::~ProfileWidget()
+{
+}
+
+void ProfileWidget::retranslate()
+{
+    qDebug() << "ProfileWidget::retranslate got used without overwrite";
+}
+
+bool ProfileWidget::isSelected()
+{
+    qDebug() << "ProfileWidget::isSelected got used without overwrite";
+    return false;
+}
+
+void ProfileWidget::setSelected(bool isSelected)
+{
+    qDebug() << "ProfileWidget::setSelected got used without overwrite, result" << isSelected;
+}
+
+void ProfileWidget::setSelectionMode(bool selectionMode)
+{
+    qDebug() << "ProfileWidget::setSelectionMode got used without overwrite, result:" << selectionMode;
+}
+
+QString ProfileWidget::getWidgetType()
+{
+    qDebug() << "ProfileWidget::getWidgetType got used without overwrite";
+    return "ProfileWidget";
+}
+
+int ProfileWidget::getContentMode()
+{
+    return contentMode;
+}
+
+void ProfileWidget::setContentMode(int _contentMode)
+{
+    contentMode = _contentMode;
+}
diff --git a/ProfileWidget.h b/ProfileWidget.h
index 6fab255..8de7cda 100755
--- a/ProfileWidget.h
+++ b/ProfileWidget.h
@@ -1,45 +1,46 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef PROFILEWIDGET_H
-#define PROFILEWIDGET_H
-
-#include <QWidget>
-
-class ProfileWidget : public QWidget
-{
-    Q_OBJECT
-public:
-    explicit ProfileWidget(QWidget *parent = 0);
-    virtual void setSelectionMode(bool selectionMode);
-    virtual void setContentMode(int contentMode);
-    virtual void setSelected(bool isSelected);
-    virtual bool isSelected();
-    virtual QString getWidgetType();
-    virtual int getContentMode();
-    ~ProfileWidget();
-
-private:
-    int contentMode;
-
-signals:
-
-public slots:
-};
-
-#endif // PROFILEWIDGET_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef PROFILEWIDGET_H
+#define PROFILEWIDGET_H
+
+#include <QWidget>
+
+class ProfileWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit ProfileWidget(QWidget *parent = 0);
+    virtual void setSelectionMode(bool selectionMode);
+    virtual void setContentMode(int contentMode);
+    virtual void setSelected(bool isSelected);
+    virtual bool isSelected();
+    virtual QString getWidgetType();
+    virtual int getContentMode();
+    virtual void retranslate();
+    ~ProfileWidget();
+
+private:
+    int contentMode;
+
+signals:
+
+public slots:
+};
+
+#endif // PROFILEWIDGET_H
diff --git a/SavegameCopy.cpp b/SavegameCopy.cpp
index fc0e3e0..2bcad1f 100755
--- a/SavegameCopy.cpp
+++ b/SavegameCopy.cpp
@@ -1,100 +1,100 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SidebarGenerator.h"
-#include "SavegameWidget.h"
-#include "SavegameCopy.h"
-#include "config.h"
-#include <QMessageBox>
-#include <QFileDialog>
-#include <QSettings>
-
-SavegameCopy::SavegameCopy()
-{
-
-}
-
-void SavegameCopy::copySavegame(QWidget *parent, QString sgdPath)
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("FileDialogs");
-
-fileDialogPreSave: //Work?
-    QFileInfo sgdFileInfo(sgdPath);
-    QFileDialog fileDialog(parent);
-    fileDialog.setFileMode(QFileDialog::AnyFile);
-    fileDialog.setViewMode(QFileDialog::Detail);
-    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
-    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
-    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
-    fileDialog.setDefaultSuffix("");
-    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
-    fileDialog.setWindowTitle(SavegameWidget::tr(("Export Savegame...")));
-    fileDialog.setLabelText(QFileDialog::Accept, SavegameWidget::tr("Export"));
-
-    QStringList filters;
-    filters << SavegameWidget::tr("Savegame files (SGTA*)");
-    filters << SavegameWidget::tr("All files (**)");
-    fileDialog.setNameFilters(filters);
-
-    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
-
-    fileDialog.setSidebarUrls(sidebarUrls);
-    fileDialog.restoreState(settings.value("CopySavegame","").toByteArray());
-    fileDialog.selectFile(sgdFileInfo.fileName());
-
-    if (fileDialog.exec())
-    {
-        QStringList selectedFiles = fileDialog.selectedFiles();
-        if (selectedFiles.length() == 1)
-        {
-            QString selectedFile = selectedFiles.at(0);
-
-            if (QFile::exists(selectedFile))
-            {
-                if (QMessageBox::Yes == QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Overwrite %1 with current Savegame?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
-                {
-                    if (!QFile::remove(selectedFile))
-                    {
-                        QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Failed to overwrite %1 with current Savegame").arg("\""+selectedFile+"\""));
-                        goto fileDialogPreSave; //Work?
-                    }
-                }
-                else
-                {
-                    goto fileDialogPreSave; //Work?
-                }
-            }
-
-            bool isCopied = QFile::copy(sgdPath, selectedFile);
-            if (!isCopied)
-            {
-                QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Failed to export current Savegame"));
-                goto fileDialogPreSave; //Work?
-            }
-        }
-        else
-        {
-            QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("No valid file is selected"));
-            goto fileDialogPreSave; //Work?
-        }
-    }
-
-    settings.setValue("CopySavegame", fileDialog.saveState());
-    settings.endGroup();
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SidebarGenerator.h"
+#include "SavegameWidget.h"
+#include "SavegameCopy.h"
+#include "config.h"
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QSettings>
+
+SavegameCopy::SavegameCopy()
+{
+
+}
+
+void SavegameCopy::copySavegame(QWidget *parent, QString sgdPath)
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("FileDialogs");
+
+fileDialogPreSave: //Work?
+    QFileInfo sgdFileInfo(sgdPath);
+    QFileDialog fileDialog(parent);
+    fileDialog.setFileMode(QFileDialog::AnyFile);
+    fileDialog.setViewMode(QFileDialog::Detail);
+    fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
+    fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
+    fileDialog.setDefaultSuffix("");
+    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
+    fileDialog.setWindowTitle(SavegameWidget::tr(("Export Savegame...")));
+    fileDialog.setLabelText(QFileDialog::Accept, SavegameWidget::tr("Export"));
+
+    QStringList filters;
+    filters << SavegameWidget::tr("Savegame files (SGTA*)");
+    filters << SavegameWidget::tr("All files (**)");
+    fileDialog.setNameFilters(filters);
+
+    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
+
+    fileDialog.setSidebarUrls(sidebarUrls);
+    fileDialog.restoreState(settings.value("CopySavegame","").toByteArray());
+    fileDialog.selectFile(sgdFileInfo.fileName());
+
+    if (fileDialog.exec())
+    {
+        QStringList selectedFiles = fileDialog.selectedFiles();
+        if (selectedFiles.length() == 1)
+        {
+            QString selectedFile = selectedFiles.at(0);
+
+            if (QFile::exists(selectedFile))
+            {
+                if (QMessageBox::Yes == QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Overwrite %1 with current Savegame?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
+                {
+                    if (!QFile::remove(selectedFile))
+                    {
+                        QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Failed to overwrite %1 with current Savegame").arg("\""+selectedFile+"\""));
+                        goto fileDialogPreSave; //Work?
+                    }
+                }
+                else
+                {
+                    goto fileDialogPreSave; //Work?
+                }
+            }
+
+            bool isCopied = QFile::copy(sgdPath, selectedFile);
+            if (!isCopied)
+            {
+                QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("Failed to export current Savegame"));
+                goto fileDialogPreSave; //Work?
+            }
+        }
+        else
+        {
+            QMessageBox::warning(parent, SavegameWidget::tr("Export Savegame"), SavegameWidget::tr("No valid file is selected"));
+            goto fileDialogPreSave; //Work?
+        }
+    }
+
+    settings.setValue("CopySavegame", fileDialog.saveState());
+    settings.endGroup();
+}
diff --git a/SavegameCopy.h b/SavegameCopy.h
index 1ea5cf6..6447497 100755
--- a/SavegameCopy.h
+++ b/SavegameCopy.h
@@ -1,32 +1,32 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SAVEGAMECOPY_H
-#define SAVEGAMECOPY_H
-
-#include <QWidget>
-#include <QString>
-
-class SavegameCopy
-{
-public:
-    SavegameCopy();
-    static void copySavegame(QWidget *parent, QString sgdPath);
-};
-
-#endif // SAVEGAMECOPY_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SAVEGAMECOPY_H
+#define SAVEGAMECOPY_H
+
+#include <QWidget>
+#include <QString>
+
+class SavegameCopy
+{
+public:
+    SavegameCopy();
+    static void copySavegame(QWidget *parent, QString sgdPath);
+};
+
+#endif // SAVEGAMECOPY_H
diff --git a/SavegameData.cpp b/SavegameData.cpp
index b679325..826746a 100755
--- a/SavegameData.cpp
+++ b/SavegameData.cpp
@@ -1,119 +1,120 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "StringParser.h"
-#include "SavegameData.h"
-#include <QTextCodec>
-#include <QByteArray>
-#include <QDebug>
-#include <QFile>
-
-#define savegameHeaderLength 260
-#define verificationValue QByteArray::fromHex("00000001")
-
-SavegameData::SavegameData(const QString &fileName, QObject *parent) : QObject(parent), savegameFileName(fileName)
-{
-    // INIT SAVEGAME
-    savegameStr = "";
-    savegameOk = 0;
-}
-
-bool SavegameData::readingSavegame()
-{
-    // Start opening file
-    // lastStep is like currentStep
-
-    QFile *saveFile = new QFile(savegameFileName);
-    if (!saveFile->open(QFile::ReadOnly))
-    {
-        lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(savegameFileName);
-        saveFile->deleteLater();
-        delete saveFile;
-        return false;
-    }
-
-    // Reading Savegame Header
-    if (!saveFile->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(savegameFileName) + ",1,NOHEADER";
-        saveFile->close();
-        saveFile->deleteLater();
-        delete saveFile;
-        return false;
-    }
-    QByteArray savegameHeaderLine = saveFile->read(savegameHeaderLength);
-    if (savegameHeaderLine.left(4) == verificationValue)
-    {
-        savegameStr = getSavegameDataString(savegameHeaderLine);
-        if (savegameStr.length() >= 1)
-        {
-            savegameOk = true;
-        }
-    }
-    saveFile->close();
-    saveFile->deleteLater();
-    delete saveFile;
-    return savegameOk;
-}
-
-QString SavegameData::getSavegameDataString(const QByteArray &savegameHeader)
-{
-    QByteArray savegameBytes = savegameHeader.left(savegameHeaderLength);
-    QList<QByteArray> savegameBytesList = savegameBytes.split(char(0x01));
-    savegameBytes = savegameBytesList.at(1);
-    savegameBytesList.clear();
-    return StringParser::parseTitleString(savegameBytes, savegameBytes.length());
-}
-
-bool SavegameData::readingSavegameFromFile(const QString &fileName)
-{
-    if (fileName != "")
-    {
-        savegameFileName = fileName;
-        return readingSavegame();
-    }
-    else
-    {
-        return false;
-    }
-}
-
-bool SavegameData::isSavegameOk()
-{
-    return savegameOk;
-}
-
-QString SavegameData::getSavegameFileName()
-{
-    return savegameFileName;
-}
-
-QString SavegameData::getSavegameStr()
-{
-    return savegameStr;
-}
-
-QString SavegameData::getLastStep()
-{
-    return lastStep;
-}
-
-void SavegameData::setSavegameFileName(QString savegameFileName_)
-{
-    savegameFileName = savegameFileName_;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "StringParser.h"
+#include "SavegameData.h"
+#include <QStringBuilder>
+#include <QTextCodec>
+#include <QByteArray>
+#include <QDebug>
+#include <QFile>
+
+#define savegameHeaderLength 260
+#define verificationValue QByteArray::fromHex("00000001")
+
+SavegameData::SavegameData(const QString &fileName, QObject *parent) : QObject(parent), savegameFileName(fileName)
+{
+    // INIT SAVEGAME
+    savegameStr = "";
+    savegameOk = 0;
+}
+
+bool SavegameData::readingSavegame()
+{
+    // Start opening file
+    // lastStep is like currentStep
+
+    QFile *saveFile = new QFile(savegameFileName);
+    if (!saveFile->open(QFile::ReadOnly))
+    {
+        lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(savegameFileName);
+        saveFile->deleteLater();
+        delete saveFile;
+        return false;
+    }
+
+    // Reading Savegame Header
+    if (!saveFile->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(savegameFileName) % ",1,NOHEADER";
+        saveFile->close();
+        saveFile->deleteLater();
+        delete saveFile;
+        return false;
+    }
+    QByteArray savegameHeaderLine = saveFile->read(savegameHeaderLength);
+    if (savegameHeaderLine.left(4) == verificationValue)
+    {
+        savegameStr = getSavegameDataString(savegameHeaderLine);
+        if (savegameStr.length() >= 1)
+        {
+            savegameOk = true;
+        }
+    }
+    saveFile->close();
+    saveFile->deleteLater();
+    delete saveFile;
+    return savegameOk;
+}
+
+QString SavegameData::getSavegameDataString(const QByteArray &savegameHeader)
+{
+    QByteArray savegameBytes = savegameHeader.left(savegameHeaderLength);
+    QList<QByteArray> savegameBytesList = savegameBytes.split(char(0x01));
+    savegameBytes = savegameBytesList.at(1);
+    savegameBytesList.clear();
+    return StringParser::parseTitleString(savegameBytes, savegameBytes.length());
+}
+
+bool SavegameData::readingSavegameFromFile(const QString &fileName)
+{
+    if (fileName != "")
+    {
+        savegameFileName = fileName;
+        return readingSavegame();
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool SavegameData::isSavegameOk()
+{
+    return savegameOk;
+}
+
+QString SavegameData::getSavegameFileName()
+{
+    return savegameFileName;
+}
+
+QString SavegameData::getSavegameStr()
+{
+    return savegameStr;
+}
+
+QString SavegameData::getLastStep()
+{
+    return lastStep;
+}
+
+void SavegameData::setSavegameFileName(QString savegameFileName_)
+{
+    savegameFileName = savegameFileName_;
+}
diff --git a/SavegameData.h b/SavegameData.h
index 20f87b3..bc5cf2f 100755
--- a/SavegameData.h
+++ b/SavegameData.h
@@ -1,45 +1,45 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SAVEGAMEDATA_H
-#define SAVEGAMEDATA_H
-
-#include <QObject>
-
-class SavegameData : public QObject
-{
-    Q_OBJECT
-public:
-    explicit SavegameData(const QString &fileName = "", QObject *parent = 0);
-    bool readingSavegameFromFile(const QString &fileName);
-    bool readingSavegame();
-    bool isSavegameOk();
-    QString getLastStep();
-    QString getSavegameStr();
-    QString getSavegameFileName();
-    void setSavegameFileName(QString savegameFileName);
-
-private:
-    QString getSavegameDataString(const QByteArray &savegameHeader);
-    QString savegameFileName;
-    QString savegameStr;
-    QString lastStep;
-    bool savegameOk;
-};
-
-#endif // SAVEGAMEDATA_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SAVEGAMEDATA_H
+#define SAVEGAMEDATA_H
+
+#include <QObject>
+
+class SavegameData : public QObject
+{
+    Q_OBJECT
+public:
+    explicit SavegameData(const QString &fileName = "", QObject *parent = 0);
+    bool readingSavegameFromFile(const QString &fileName);
+    bool readingSavegame();
+    bool isSavegameOk();
+    QString getLastStep();
+    QString getSavegameStr();
+    QString getSavegameFileName();
+    void setSavegameFileName(QString savegameFileName);
+
+private:
+    QString getSavegameDataString(const QByteArray &savegameHeader);
+    QString savegameFileName;
+    QString savegameStr;
+    QString lastStep;
+    bool savegameOk;
+};
+
+#endif // SAVEGAMEDATA_H
diff --git a/SavegameDialog.cpp b/SavegameDialog.cpp
index 99447ce..a3e52d3 100755
--- a/SavegameDialog.cpp
+++ b/SavegameDialog.cpp
@@ -1,53 +1,53 @@
-#include "SavegameDialog.h"
-#include "ui_SavegameDialog.h"
-#include "SavegameCopy.h"
-#include "AppEnv.h"
-#include <QMessageBox>
-
-SavegameDialog::SavegameDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::SavegameDialog)
-{
-    // Set Window Flags
-    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
-
-    // Setup User Interface
-    ui->setupUi(this);
-    savegameLabStr = ui->labSavegameText->text();
-
-    if (QIcon::hasThemeIcon("dialog-close"))
-    {
-        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
-    }
-
-    // DPI calculation
-    qreal screenRatio = AppEnv::screenRatio();
-    resize(400 * screenRatio, 105 * screenRatio);
-}
-
-SavegameDialog::~SavegameDialog()
-{
-    delete ui;
-}
-
-void SavegameDialog::setSavegameData(SavegameData *savegame, QString savegamePath, bool readOk)
-{
-    // Showing error if reading error
-    if (!readOk)
-    {
-        QMessageBox::warning(this,tr("Savegame Viewer"),tr("Failed at %1").arg(savegame->getLastStep()));
-        return;
-    }
-    sgdPath = savegamePath;
-    ui->labSavegameText->setText(savegameLabStr.arg(savegame->getSavegameStr()));
-}
-
-void SavegameDialog::on_cmdClose_clicked()
-{
-    this->close();
-}
-
-void SavegameDialog::on_cmdCopy_clicked()
-{
-    SavegameCopy::copySavegame(this, sgdPath);
-}
+#include "SavegameDialog.h"
+#include "ui_SavegameDialog.h"
+#include "SavegameCopy.h"
+#include "AppEnv.h"
+#include <QMessageBox>
+
+SavegameDialog::SavegameDialog(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::SavegameDialog)
+{
+    // Set Window Flags
+    setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
+
+    // Setup User Interface
+    ui->setupUi(this);
+    savegameLabStr = ui->labSavegameText->text();
+
+    if (QIcon::hasThemeIcon("dialog-close"))
+    {
+        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+    }
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    resize(400 * screenRatio, 105 * screenRatio);
+}
+
+SavegameDialog::~SavegameDialog()
+{
+    delete ui;
+}
+
+void SavegameDialog::setSavegameData(SavegameData *savegame, QString savegamePath, bool readOk)
+{
+    // Showing error if reading error
+    if (!readOk)
+    {
+        QMessageBox::warning(this,tr("Savegame Viewer"),tr("Failed at %1").arg(savegame->getLastStep()));
+        return;
+    }
+    sgdPath = savegamePath;
+    ui->labSavegameText->setText(savegameLabStr.arg(savegame->getSavegameStr()));
+}
+
+void SavegameDialog::on_cmdClose_clicked()
+{
+    this->close();
+}
+
+void SavegameDialog::on_cmdCopy_clicked()
+{
+    SavegameCopy::copySavegame(this, sgdPath);
+}
diff --git a/SavegameDialog.h b/SavegameDialog.h
index 0b3a900..9fe8f35 100755
--- a/SavegameDialog.h
+++ b/SavegameDialog.h
@@ -1,29 +1,29 @@
-#ifndef SAVEGAMEDIALOG_H
-#define SAVEGAMEDIALOG_H
-
-#include "SavegameData.h"
-#include <QDialog>
-
-namespace Ui {
-class SavegameDialog;
-}
-
-class SavegameDialog : public QDialog
-{
-    Q_OBJECT
-public:
-    explicit SavegameDialog(QWidget *parent = 0);
-    void setSavegameData(SavegameData *savegame, QString sgdPath, bool readOk);
-    ~SavegameDialog();
-
-private slots:
-    void on_cmdClose_clicked();
-    void on_cmdCopy_clicked();
-
-private:
-    Ui::SavegameDialog *ui;
-    QString savegameLabStr;
-    QString sgdPath;
-};
-
-#endif // SAVEGAMEDIALOG_H
+#ifndef SAVEGAMEDIALOG_H
+#define SAVEGAMEDIALOG_H
+
+#include "SavegameData.h"
+#include <QDialog>
+
+namespace Ui {
+class SavegameDialog;
+}
+
+class SavegameDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    explicit SavegameDialog(QWidget *parent = 0);
+    void setSavegameData(SavegameData *savegame, QString sgdPath, bool readOk);
+    ~SavegameDialog();
+
+private slots:
+    void on_cmdClose_clicked();
+    void on_cmdCopy_clicked();
+
+private:
+    Ui::SavegameDialog *ui;
+    QString savegameLabStr;
+    QString sgdPath;
+};
+
+#endif // SAVEGAMEDIALOG_H
diff --git a/SavegameDialog.ui b/SavegameDialog.ui
index a0a5e52..36b3b9b 100755
--- a/SavegameDialog.ui
+++ b/SavegameDialog.ui
@@ -1,86 +1,93 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SavegameDialog</class>
- <widget class="QDialog" name="SavegameDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>105</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Savegame Viewer</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlSavegameDialog">
-   <item>
-    <widget class="QLabel" name="labSavegameText">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="text">
-      <string>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</string>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-     </property>
-     <property name="wordWrap">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="hlButtons">
-     <item>
-      <spacer name="hsButtons">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdCopy">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>&amp;Export</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdClose">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>&amp;Close</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SavegameDialog</class>
+ <widget class="QDialog" name="SavegameDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>105</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Savegame Viewer</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlSavegameDialog">
+   <item>
+    <widget class="QLabel" name="labSavegameText">
+     <property name="text">
+      <string>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="vsSavegame">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="hlButtons">
+     <item>
+      <spacer name="hsButtons">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdCopy">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&amp;Export</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdClose">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&amp;Close</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/SavegameWidget.cpp b/SavegameWidget.cpp
index 6783bf9..ce21f46 100755
--- a/SavegameWidget.cpp
+++ b/SavegameWidget.cpp
@@ -1,261 +1,264 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SavegameWidget.h"
-#include "ui_SavegameWidget.h"
-#include "SidebarGenerator.h"
-#include "SavegameDialog.h"
-#include "StandardPaths.h"
-#include "SavegameData.h"
-#include "SavegameCopy.h"
-#include "AppEnv.h"
-#include <QFileDialog>
-#include <QMessageBox>
-#include <QSettings>
-#include <QFileInfo>
-#include <QPalette>
-#include <QColor>
-#include <QBrush>
-#include <QTimer>
-#include <QDebug>
-#include <QFile>
-#include <QMenu>
-#include <QUrl>
-
-SavegameWidget::SavegameWidget(QWidget *parent) :
-    ProfileWidget(parent),
-    ui(new Ui::SavegameWidget)
-{
-    ui->setupUi(this);
-    ui->cmdCopy->setVisible(false);
-    ui->cmdView->setVisible(false);
-    ui->cmdDelete->setVisible(false);
-    ui->cbSelected->setVisible(false);
-
-    qreal screenRatio = AppEnv::screenRatio();
-    ui->labSavegamePic->setFixedSize(48 * screenRatio, 27 * screenRatio);
-
-    QPixmap savegamePixmap(":/img/savegame.png");
-    if (screenRatio != 1) savegamePixmap = savegamePixmap.scaledToHeight(ui->labSavegamePic->height(), Qt::SmoothTransformation);
-    ui->labSavegamePic->setPixmap(savegamePixmap);
-
-    QString exportSavegameStr = tr("Export Savegame...");
-    Q_UNUSED(exportSavegameStr)
-
-    QPalette palette;
-    highlightBackColor = palette.highlight().color();
-    highlightTextColor = palette.highlightedText().color();
-
-    labelAutosaveStr = tr("AUTOSAVE - %1\n%2");
-    labelSaveStr = tr("SAVE %3 - %1\n%2");
-    snwgt = parent;
-    sgdPath = "";
-    sgdStr = "";
-    sgdata = 0;
-
-    installEventFilter(this);
-}
-
-SavegameWidget::~SavegameWidget()
-{
-    delete ui;
-}
-
-bool SavegameWidget::eventFilter(QObject *obj, QEvent *ev)
-{
-    if (obj == this)
-    {
-        if (ev->type() == QEvent::Enter)
-        {
-            setStyleSheet(QString("QFrame#SavegameFrame{background-color: rgb(%1, %2, %3)}QLabel#labSavegameStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
-            return true;
-        }
-        else if(ev->type() == QEvent::Leave)
-        {
-            setStyleSheet("");
-            return true;
-        }
-    }
-    return false;
-}
-
-void SavegameWidget::setSavegameData(SavegameData *savegame, QString savegamePath)
-{
-    // BETA CODE
-    bool validNumber;
-    QString savegameName = tr("WRONG FORMAT");
-    QString savegameDate = tr("WRONG FORMAT");
-    QString savegameString = savegame->getSavegameStr();
-    QString fileName = QFileInfo(savegame->getSavegameFileName()).fileName();
-    QStringList savegameNDL = QString(savegameString).split(" - ");
-    if (savegameNDL.length() >= 2)
-    {
-        savegameDate = savegameNDL.at(savegameNDL.length() - 1);
-        savegameName = QString(savegameString).remove(savegameString.length() - savegameDate.length() - 3, savegameDate.length() + 3);
-    }
-    int savegameNumber = QString(fileName).remove(0,5).toInt(&validNumber) + 1;
-    if (validNumber)
-    {
-        if (savegameNumber == 16)
-        {
-            ui->labSavegameStr->setText(labelAutosaveStr.arg(savegameDate, savegameName));
-        }
-        else
-        {
-            ui->labSavegameStr->setText(labelSaveStr.arg(savegameDate, savegameName, QString::number(savegameNumber)));
-        }
-    }
-    else
-    {
-        ui->labSavegameStr->setText(labelSaveStr.arg(savegameDate, savegameName, tr("UNKNOWN")));
-    }
-    sgdStr = savegameString;
-    sgdPath = savegamePath;
-    sgdata = savegame;
-}
-
-void SavegameWidget::on_cmdCopy_clicked()
-{
-    SavegameCopy::copySavegame(this, sgdPath);
-}
-
-void SavegameWidget::on_cmdDelete_clicked()
-{
-    int uchoice = QMessageBox::question(this, tr("Delete savegame"), tr("Are you sure to delete %1 from your savegames?").arg("\""+sgdStr+"\""), QMessageBox::No | QMessageBox::Yes, QMessageBox::No);
-    if (uchoice == QMessageBox::Yes)
-    {
-        if (!QFile::exists(sgdPath))
-        {
-            emit savegameDeleted();
-        }
-        else if(QFile::remove(sgdPath))
-        {
-            emit savegameDeleted();
-        }
-        else
-        {
-            QMessageBox::warning(this, tr("Delete savegame"), tr("Failed at deleting %1 from your savegames").arg("\""+sgdStr+"\""));
-        }
-    }
-}
-
-void SavegameWidget::on_cmdView_clicked()
-{
-    SavegameDialog *savegameDialog = new SavegameDialog(this);
-    savegameDialog->setSavegameData(sgdata, sgdPath, true);
-    savegameDialog->setModal(true);
-#ifdef Q_OS_ANDROID
-    // Android ...
-    savegameDialog->showMaximized();
-#else
-    savegameDialog->show();
-#endif
-    savegameDialog->exec();
-    delete savegameDialog;
-}
-
-void SavegameWidget::mousePressEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mousePressEvent(ev);
-}
-
-void SavegameWidget::mouseReleaseEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mouseReleaseEvent(ev);
-    if (ui->cbSelected->isVisible())
-    {
-        if (rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
-        {
-            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
-        }
-    }
-    else
-    {
-        if (getContentMode() == 0 && rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
-        {
-            on_cmdView_clicked();
-        }
-    }
-}
-
-void SavegameWidget::mouseDoubleClickEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mouseDoubleClickEvent(ev);
-
-    if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton)
-    {
-        on_cmdView_clicked();
-    }
-}
-
-void SavegameWidget::setSelected(bool isSelected)
-{
-    ui->cbSelected->setChecked(isSelected);
-}
-
-void SavegameWidget::savegameSelected()
-{
-    setSelected(!ui->cbSelected->isChecked());
-}
-
-void SavegameWidget::contextMenuEvent(QContextMenuEvent *ev)
-{
-    emit contextMenuTriggered(ev);
-}
-
-void SavegameWidget::on_cbSelected_stateChanged(int arg1)
-{
-    if (arg1 == Qt::Checked)
-    {
-        emit widgetSelected();
-    }
-    else if (arg1 == Qt::Unchecked)
-    {
-        emit widgetDeselected();
-    }
-}
-
-bool SavegameWidget::isSelected()
-{
-    return ui->cbSelected->isChecked();
-}
-
-void SavegameWidget::setSelectionMode(bool selectionMode)
-{
-    ui->cbSelected->setVisible(selectionMode);
-}
-
-void SavegameWidget::selectAllWidgets()
-{
-    emit allWidgetsSelected();
-}
-
-void SavegameWidget::deselectAllWidgets()
-{
-    emit allWidgetsDeselected();
-}
-
-SavegameData* SavegameWidget::getSavegame()
-{
-    return sgdata;
-}
-
-QString SavegameWidget::getWidgetType()
-{
-    return "SavegameWidget";
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SavegameWidget.h"
+#include "ui_SavegameWidget.h"
+#include "SidebarGenerator.h"
+#include "SavegameDialog.h"
+#include "StandardPaths.h"
+#include "SavegameData.h"
+#include "SavegameCopy.h"
+#include "AppEnv.h"
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QSettings>
+#include <QFileInfo>
+#include <QPalette>
+#include <QColor>
+#include <QBrush>
+#include <QTimer>
+#include <QDebug>
+#include <QFile>
+#include <QMenu>
+#include <QUrl>
+
+SavegameWidget::SavegameWidget(QWidget *parent) :
+    ProfileWidget(parent),
+    ui(new Ui::SavegameWidget)
+{
+    ui->setupUi(this);
+    ui->cmdCopy->setVisible(false);
+    ui->cmdView->setVisible(false);
+    ui->cmdDelete->setVisible(false);
+    ui->cbSelected->setVisible(false);
+
+    qreal screenRatio = AppEnv::screenRatio();
+    ui->labSavegamePic->setFixedSize(48 * screenRatio, 27 * screenRatio);
+
+    QPixmap savegamePixmap(":/img/savegame.png");
+    if (screenRatio != 1) savegamePixmap = savegamePixmap.scaledToHeight(ui->labSavegamePic->height(), Qt::SmoothTransformation);
+    ui->labSavegamePic->setPixmap(savegamePixmap);
+
+    QString exportSavegameStr = tr("Export Savegame...");
+    Q_UNUSED(exportSavegameStr)
+
+    labelAutosaveStr = tr("AUTOSAVE - %1\n%2");
+    labelSaveStr = tr("SAVE %3 - %1\n%2");
+
+    ui->SavegameFrame->setMouseTracking(true);
+    ui->labSavegamePic->setMouseTracking(true);
+    ui->labSavegameStr->setMouseTracking(true);
+    ui->cbSelected->setMouseTracking(true);
+    sgdata = nullptr;
+}
+
+SavegameWidget::~SavegameWidget()
+{
+    delete ui;
+}
+
+void SavegameWidget::setSavegameData(SavegameData *savegame, QString savegamePath)
+{
+    // BETA CODE
+    QString savegameString = savegame->getSavegameStr();
+    QString fileName = QFileInfo(savegame->getSavegameFileName()).fileName();
+    renderString(savegameString, fileName);
+    sgdStr = savegameString;
+    sgdPath = savegamePath;
+    sgdata = savegame;
+}
+
+void SavegameWidget::renderString(const QString &savegameString, const QString &fileName)
+{
+    bool validNumber;
+    QString savegameName = tr("WRONG FORMAT");
+    QString savegameDate = tr("WRONG FORMAT");
+    QStringList savegameNDL = QString(savegameString).split(" - ");
+    if (savegameNDL.length() >= 2)
+    {
+        savegameDate = savegameNDL.at(savegameNDL.length() - 1);
+        savegameName = QString(savegameString).remove(savegameString.length() - savegameDate.length() - 3, savegameDate.length() + 3);
+    }
+    int savegameNumber = QString(fileName).remove(0,5).toInt(&validNumber) + 1;
+    if (validNumber)
+    {
+        if (savegameNumber == 16)
+        {
+            ui->labSavegameStr->setText(labelAutosaveStr.arg(savegameDate, savegameName));
+        }
+        else
+        {
+            ui->labSavegameStr->setText(labelSaveStr.arg(savegameDate, savegameName, QString::number(savegameNumber)));
+        }
+    }
+    else
+    {
+        ui->labSavegameStr->setText(labelSaveStr.arg(savegameDate, savegameName, tr("UNKNOWN")));
+    }
+}
+
+void SavegameWidget::retranslate()
+{
+    labelAutosaveStr = tr("AUTOSAVE - %1\n%2");
+    labelSaveStr = tr("SAVE %3 - %1\n%2");
+
+    QString fileName = QFileInfo(sgdata->getSavegameFileName()).fileName();
+    renderString(sgdStr, fileName);
+}
+
+void SavegameWidget::on_cmdCopy_clicked()
+{
+    SavegameCopy::copySavegame(this, sgdPath);
+}
+
+void SavegameWidget::on_cmdDelete_clicked()
+{
+    int uchoice = QMessageBox::question(this, tr("Delete savegame"), tr("Are you sure to delete %1 from your savegames?").arg("\""+sgdStr+"\""), QMessageBox::No | QMessageBox::Yes, QMessageBox::No);
+    if (uchoice == QMessageBox::Yes)
+    {
+        if (!QFile::exists(sgdPath))
+        {
+            emit savegameDeleted();
+        }
+        else if(QFile::remove(sgdPath))
+        {
+            emit savegameDeleted();
+        }
+        else
+        {
+            QMessageBox::warning(this, tr("Delete savegame"), tr("Failed at deleting %1 from your savegames").arg("\""+sgdStr+"\""));
+        }
+    }
+}
+
+void SavegameWidget::on_cmdView_clicked()
+{
+    SavegameDialog *savegameDialog = new SavegameDialog(this);
+    savegameDialog->setSavegameData(sgdata, sgdPath, true);
+    savegameDialog->setModal(true);
+#ifdef Q_OS_ANDROID
+    // Android ...
+    savegameDialog->showMaximized();
+#else
+    savegameDialog->show();
+#endif
+    savegameDialog->exec();
+    delete savegameDialog;
+}
+
+void SavegameWidget::mousePressEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mousePressEvent(ev);
+}
+
+void SavegameWidget::mouseReleaseEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mouseReleaseEvent(ev);
+    if (ui->cbSelected->isVisible())
+    {
+        if (rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
+        {
+            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+        }
+    }
+    else
+    {
+        if (getContentMode() == 0 && rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
+        {
+            if (ev->modifiers().testFlag(Qt::ShiftModifier))
+            {
+                ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+            }
+            else
+            {
+                on_cmdView_clicked();
+            }
+        }
+        else if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton && ev->modifiers().testFlag(Qt::ShiftModifier))
+        {
+            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+        }
+    }
+}
+
+void SavegameWidget::mouseDoubleClickEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mouseDoubleClickEvent(ev);
+
+    if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton)
+    {
+        on_cmdView_clicked();
+    }
+}
+
+void SavegameWidget::setSelected(bool isSelected)
+{
+    ui->cbSelected->setChecked(isSelected);
+}
+
+void SavegameWidget::savegameSelected()
+{
+    setSelected(!ui->cbSelected->isChecked());
+}
+
+void SavegameWidget::contextMenuEvent(QContextMenuEvent *ev)
+{
+    emit contextMenuTriggered(ev);
+}
+
+void SavegameWidget::on_cbSelected_stateChanged(int arg1)
+{
+    if (arg1 == Qt::Checked)
+    {
+        emit widgetSelected();
+    }
+    else if (arg1 == Qt::Unchecked)
+    {
+        emit widgetDeselected();
+    }
+}
+
+bool SavegameWidget::isSelected()
+{
+    return ui->cbSelected->isChecked();
+}
+
+void SavegameWidget::setSelectionMode(bool selectionMode)
+{
+    ui->cbSelected->setVisible(selectionMode);
+}
+
+void SavegameWidget::selectAllWidgets()
+{
+    emit allWidgetsSelected();
+}
+
+void SavegameWidget::deselectAllWidgets()
+{
+    emit allWidgetsDeselected();
+}
+
+SavegameData* SavegameWidget::getSavegame()
+{
+    return sgdata;
+}
+
+QString SavegameWidget::getWidgetType()
+{
+    return "SavegameWidget";
+}
diff --git a/SavegameWidget.h b/SavegameWidget.h
index f0f62c4..0db69af 100755
--- a/SavegameWidget.h
+++ b/SavegameWidget.h
@@ -1,82 +1,80 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SAVEGAMEWIDGET_H
-#define SAVEGAMEWIDGET_H
-#include "ProfileWidget.h"
-#include "SavegameData.h"
-#include <QContextMenuEvent>
-#include <QMouseEvent>
-#include <QWidget>
-#include <QColor>
-
-namespace Ui {
-class SavegameWidget;
-}
-
-class SavegameWidget : public ProfileWidget
-{
-    Q_OBJECT
-
-public:
-    SavegameWidget(QWidget *parent = 0);
-    void setSavegameData(SavegameData *savegame, QString savegamePath);
-    void setSelectionMode(bool selectionMode);
-    void setSelected(bool isSelected);
-    SavegameData* getSavegame();
-    QString getWidgetType();
-    bool isSelected();
-    ~SavegameWidget();
-
-private slots:
-    void on_cmdView_clicked();
-    void on_cmdCopy_clicked();
-    void on_cmdDelete_clicked();
-    void on_cbSelected_stateChanged(int arg1);
-    void savegameSelected();
-    void selectAllWidgets();
-    void deselectAllWidgets();
-
-protected:
-    bool eventFilter(QObject *obj, QEvent *ev);
-    void mouseDoubleClickEvent(QMouseEvent *ev);
-    void mouseReleaseEvent(QMouseEvent *ev);
-    void mousePressEvent(QMouseEvent *ev);
-    void contextMenuEvent(QContextMenuEvent *ev);
-
-private:
-    Ui::SavegameWidget *ui;
-    SavegameData *sgdata;
-    QColor highlightBackColor;
-    QColor highlightTextColor;
-    QString labelAutosaveStr;
-    QString labelSaveStr;
-    QString sgdPath;
-    QString sgdStr;
-    QWidget *snwgt;
-
-signals:
-    void savegameDeleted();
-    void widgetSelected();
-    void widgetDeselected();
-    void allWidgetsSelected();
-    void allWidgetsDeselected();
-    void contextMenuTriggered(QContextMenuEvent *ev);
-};
-
-#endif // SAVEGAMEWIDGET_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SAVEGAMEWIDGET_H
+#define SAVEGAMEWIDGET_H
+#include "ProfileWidget.h"
+#include "SavegameData.h"
+#include <QContextMenuEvent>
+#include <QMouseEvent>
+#include <QWidget>
+#include <QColor>
+
+namespace Ui {
+class SavegameWidget;
+}
+
+class SavegameWidget : public ProfileWidget
+{
+    Q_OBJECT
+
+public:
+    SavegameWidget(QWidget *parent = 0);
+    void setSavegameData(SavegameData *savegame, QString savegamePath);
+    void setSelectionMode(bool selectionMode);
+    void setSelected(bool isSelected);
+    SavegameData* getSavegame();
+    QString getWidgetType();
+    bool isSelected();
+    void retranslate();
+    ~SavegameWidget();
+
+private slots:
+    void on_cmdView_clicked();
+    void on_cmdCopy_clicked();
+    void on_cmdDelete_clicked();
+    void on_cbSelected_stateChanged(int arg1);
+    void savegameSelected();
+    void selectAllWidgets();
+    void deselectAllWidgets();
+
+protected:
+    void mouseDoubleClickEvent(QMouseEvent *ev);
+    void mouseReleaseEvent(QMouseEvent *ev);
+    void mousePressEvent(QMouseEvent *ev);
+    void contextMenuEvent(QContextMenuEvent *ev);
+
+private:
+    Ui::SavegameWidget *ui;
+    SavegameData *sgdata;
+    QString labelAutosaveStr;
+    QString labelSaveStr;
+    QString sgdPath;
+    QString sgdStr;
+    void renderString(const QString &savegameString, const QString &fileName);
+
+signals:
+    void savegameDeleted();
+    void widgetSelected();
+    void widgetDeselected();
+    void allWidgetsSelected();
+    void allWidgetsDeselected();
+    void contextMenuTriggered(QContextMenuEvent *ev);
+};
+
+#endif // SAVEGAMEWIDGET_H
diff --git a/SavegameWidget.ui b/SavegameWidget.ui
index 2f857c7..ea5e3c6 100755
--- a/SavegameWidget.ui
+++ b/SavegameWidget.ui
@@ -1,135 +1,135 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SavegameWidget</class>
- <widget class="QWidget" name="SavegameWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>405</width>
-    <height>46</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Savegame Widget</string>
-  </property>
-  <layout class="QHBoxLayout" name="hlSavegameContent">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QFrame" name="SavegameFrame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Plain</enum>
-     </property>
-     <property name="lineWidth">
-      <number>0</number>
-     </property>
-     <layout class="QHBoxLayout" name="hlSavegame">
-      <item>
-       <widget class="QCheckBox" name="cbSelected">
-        <property name="focusPolicy">
-         <enum>Qt::NoFocus</enum>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="labSavegamePic">
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="labSavegameStr">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>SAVE %3 - %1&lt;br&gt;%2</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdView">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>View savegame</string>
-        </property>
-        <property name="text">
-         <string>View</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdCopy">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>Copy savegame</string>
-        </property>
-        <property name="text">
-         <string>Export</string>
-        </property>
-        <property name="autoDefault">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdDelete">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>Delete savegame</string>
-        </property>
-        <property name="text">
-         <string>Delete</string>
-        </property>
-        <property name="autoDefault">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SavegameWidget</class>
+ <widget class="QWidget" name="SavegameWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>405</width>
+    <height>46</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Savegame Widget</string>
+  </property>
+  <layout class="QHBoxLayout" name="hlSavegameContent">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QFrame" name="SavegameFrame">
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <layout class="QHBoxLayout" name="hlSavegame">
+      <item>
+       <widget class="QCheckBox" name="cbSelected">
+        <property name="focusPolicy">
+         <enum>Qt::NoFocus</enum>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labSavegamePic">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labSavegameStr">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>SAVE %3 - %1&lt;br&gt;%2</string>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdView">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>View savegame</string>
+        </property>
+        <property name="text">
+         <string>View</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdCopy">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>Copy savegame</string>
+        </property>
+        <property name="text">
+         <string>Export</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdDelete">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>Delete savegame</string>
+        </property>
+        <property name="text">
+         <string>Delete</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/SidebarGenerator.cpp b/SidebarGenerator.cpp
index 2675dae..1d57e5d 100755
--- a/SidebarGenerator.cpp
+++ b/SidebarGenerator.cpp
@@ -1,61 +1,61 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SidebarGenerator.h"
-#include "StandardPaths.h"
-#include "AppEnv.h"
-#include <QList>
-#include <QUrl>
-#include <QDir>
-
-SidebarGenerator::SidebarGenerator()
-{
-
-}
-
-QList<QUrl> SidebarGenerator::generateSidebarUrls(QList<QUrl> sidebarUrls)
-{
-    QDir dir;
-
-    dir.setPath(StandardPaths::picturesLocation());
-    if (dir.exists())
-    {
-        sidebarUrls << QUrl::fromLocalFile(dir.absolutePath());
-    }
-
-    dir.setPath(StandardPaths::documentsLocation());
-    if (dir.exists())
-    {
-        sidebarUrls << QUrl::fromLocalFile(dir.absolutePath());
-    }
-
-    bool gameFolderExists;
-    QString gameFolder = AppEnv::getGameFolder(&gameFolderExists);
-    if (gameFolderExists)
-    {
-        sidebarUrls << QUrl::fromLocalFile(gameFolder);
-    }
-
-    dir.setPath(StandardPaths::desktopLocation());
-    if (dir.exists())
-    {
-        sidebarUrls << QUrl::fromLocalFile(dir.absolutePath());
-    }
-
-    return sidebarUrls;
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SidebarGenerator.h"
+#include "StandardPaths.h"
+#include "AppEnv.h"
+#include <QList>
+#include <QUrl>
+#include <QDir>
+
+SidebarGenerator::SidebarGenerator()
+{
+
+}
+
+QList<QUrl> SidebarGenerator::generateSidebarUrls(QList<QUrl> sidebarUrls)
+{
+    QDir dir;
+
+    dir.setPath(StandardPaths::picturesLocation());
+    if (dir.exists())
+    {
+        sidebarUrls += QUrl::fromLocalFile(dir.absolutePath());
+    }
+
+    dir.setPath(StandardPaths::documentsLocation());
+    if (dir.exists())
+    {
+        sidebarUrls += QUrl::fromLocalFile(dir.absolutePath());
+    }
+
+    bool gameFolderExists;
+    QString gameFolder = AppEnv::getGameFolder(&gameFolderExists);
+    if (gameFolderExists)
+    {
+        sidebarUrls += QUrl::fromLocalFile(gameFolder);
+    }
+
+    dir.setPath(StandardPaths::desktopLocation());
+    if (dir.exists())
+    {
+        sidebarUrls += QUrl::fromLocalFile(dir.absolutePath());
+    }
+
+    return sidebarUrls;
+}
diff --git a/SidebarGenerator.h b/SidebarGenerator.h
index 35716c0..5e906a3 100755
--- a/SidebarGenerator.h
+++ b/SidebarGenerator.h
@@ -1,32 +1,32 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SIDEBARGENERATOR_H
-#define SIDEBARGENERATOR_H
-
-#include <QList>
-#include <QUrl>
-
-class SidebarGenerator
-{
-public:
-    SidebarGenerator();
-    static QList<QUrl> generateSidebarUrls(QList<QUrl> sidebarUrls);
-};
-
-#endif // SIDEBARGENERATOR_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SIDEBARGENERATOR_H
+#define SIDEBARGENERATOR_H
+
+#include <QList>
+#include <QUrl>
+
+class SidebarGenerator
+{
+public:
+    SidebarGenerator();
+    static QList<QUrl> generateSidebarUrls(QList<QUrl> sidebarUrls);
+};
+
+#endif // SIDEBARGENERATOR_H
diff --git a/SnapmaticEditor.cpp b/SnapmaticEditor.cpp
index c4ce38f..10239a3 100644
--- a/SnapmaticEditor.cpp
+++ b/SnapmaticEditor.cpp
@@ -1,340 +1,340 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SnapmaticEditor.h"
-#include "ui_SnapmaticEditor.h"
-#include "SnapmaticPicture.h"
-#include "StringParser.h"
-#include "AppEnv.h"
-#include <QStringBuilder>
-#include <QTextDocument>
-#include <QInputDialog>
-#include <QMessageBox>
-#include <QDebug>
-#include <QFile>
-
-SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent) :
-    QDialog(parent), crewDB(crewDB),
-    ui(new Ui::SnapmaticEditor)
-{
-    ui->setupUi(this);
-    ui->cmdApply->setDefault(true);
-
-    if (QIcon::hasThemeIcon("dialog-apply"))
-    {
-        ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply"));
-    }
-    if (QIcon::hasThemeIcon("dialog-cancel"))
-    {
-        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
-    }
-
-    snapmaticTitle = "";
-    smpic = 0;
-
-    // DPI calculation
-    qreal screenRatio = AppEnv::screenRatio();
-    resize(400 * screenRatio, 360 * screenRatio);
-}
-
-SnapmaticEditor::~SnapmaticEditor()
-{
-    delete ui;
-}
-
-void SnapmaticEditor::selfie_toggled(bool checked)
-{
-    if (checked)
-    {
-        isSelfie = true;
-    }
-    else
-    {
-        isSelfie = false;
-    }
-}
-
-
-void SnapmaticEditor::mugshot_toggled(bool checked)
-{
-    if (checked)
-    {
-        isMugshot = true;
-        ui->cbDirector->setEnabled(false);
-        ui->cbDirector->setChecked(false);
-    }
-    else
-    {
-        isMugshot = false;
-        ui->cbDirector->setEnabled(true);
-    }
-}
-
-void SnapmaticEditor::editor_toggled(bool checked)
-{
-    if (checked)
-    {
-        isEditor = true;
-        ui->cbDirector->setEnabled(false);
-        ui->cbDirector->setChecked(false);
-    }
-    else
-    {
-        isEditor = false;
-        ui->cbDirector->setEnabled(true);
-    }
-}
-
-void SnapmaticEditor::on_rbSelfie_toggled(bool checked)
-{
-    if (checked)
-    {
-        mugshot_toggled(false);
-        editor_toggled(false);
-        selfie_toggled(true);
-    }
-}
-
-void SnapmaticEditor::on_rbMugshot_toggled(bool checked)
-{
-    if (checked)
-    {
-        selfie_toggled(false);
-        editor_toggled(false);
-        mugshot_toggled(true);
-    }
-}
-
-void SnapmaticEditor::on_rbEditor_toggled(bool checked)
-{
-    if (checked)
-    {
-        selfie_toggled(false);
-        mugshot_toggled(false);
-        editor_toggled(true);
-    }
-}
-
-void SnapmaticEditor::on_rbCustom_toggled(bool checked)
-{
-    if (checked)
-    {
-        selfie_toggled(false);
-        mugshot_toggled(false);
-        editor_toggled(false);
-    }
-}
-
-void SnapmaticEditor::setSnapmaticPicture(SnapmaticPicture *picture)
-{
-    smpic = picture;
-    localSpJson = smpic->getSnapmaticProperties();
-    ui->rbCustom->setChecked(true);
-    crewID = localSpJson.crewID;
-    isSelfie = localSpJson.isSelfie;
-    isMugshot = localSpJson.isMug;
-    isEditor = localSpJson.isFromRSEditor;
-    ui->cbDirector->setChecked(localSpJson.isFromDirector);
-    ui->cbMeme->setChecked(localSpJson.isMeme);
-    if (isSelfie)
-    {
-        ui->rbSelfie->setChecked(true);
-    }
-    else if (isMugshot)
-    {
-        ui->rbMugshot->setChecked(true);
-    }
-    else if (isEditor)
-    {
-        ui->rbEditor->setChecked(true);
-    }
-    else
-    {
-        ui->rbCustom->setChecked(true);
-    }
-    setSnapmaticCrew(returnCrewName(crewID));
-    setSnapmaticTitle(picture->getPictureTitle());
-}
-
-void SnapmaticEditor::setSnapmaticTitle(const QString &title)
-{
-    if (title.length() > 39)
-    {
-        snapmaticTitle = title.left(39);
-    }
-    else
-    {
-        snapmaticTitle = title;
-    }
-    QString editStr = QString("<a href=\"g5e://edittitle\" style=\"text-decoration: none;\">%1</a>").arg(tr("Edit"));
-    QString titleStr = tr("Title: %1 (%2)").arg(StringParser::escapeString(snapmaticTitle), editStr);
-    ui->labTitle->setText(titleStr);
-    if (SnapmaticPicture::verifyTitle(snapmaticTitle))
-    {
-        ui->labAppropriate->setText(tr("Appropriate: %1").arg(QString("<span style=\"color: green\">%1</a>").arg(tr("Yes", "Yes, should work fine"))));
-    }
-    else
-    {
-        ui->labAppropriate->setText(tr("Appropriate: %1").arg(QString("<span style=\"color: red\">%1</a>").arg(tr("No", "No, could lead to issues"))));
-    }
-}
-
-void SnapmaticEditor::setSnapmaticCrew(const QString &crew)
-{
-    QString editStr = QString("<a href=\"g5e://editcrew\" style=\"text-decoration: none;\">%1</a>").arg(tr("Edit"));
-    QString crewStr = tr("Crew: %1 (%2)").arg(StringParser::escapeString(crew), editStr);
-    ui->labCrew->setText(crewStr);
-}
-
-QString SnapmaticEditor::returnCrewName(int crewID_)
-{
-    return crewDB->getCrewName(crewID_);
-}
-
-void SnapmaticEditor::on_cmdCancel_clicked()
-{
-    close();
-}
-
-void SnapmaticEditor::on_cmdApply_clicked()
-{
-    if (ui->cbQualify->isChecked())
-    {
-        qualifyAvatar();
-    }
-    localSpJson.crewID = crewID;
-    localSpJson.isSelfie = isSelfie;
-    localSpJson.isMug = isMugshot;
-    localSpJson.isFromRSEditor = isEditor;
-    localSpJson.isFromDirector = ui->cbDirector->isChecked();
-    localSpJson.isMeme = ui->cbMeme->isChecked();
-    if (smpic)
-    {
-        QString originalFileName = smpic->getPictureFilePath();
-        QString adjustedFileName = originalFileName;
-        if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
-        {
-            adjustedFileName.remove(adjustedFileName.length() - 7, 7);
-        }
-        QString backupFileName = adjustedFileName % ".bak";
-        if (!QFile::exists(backupFileName))
-        {
-            QFile::copy(adjustedFileName, backupFileName);
-        }
-        SnapmaticProperties fallbackProperties = smpic->getSnapmaticProperties();
-        QString fallbackTitle = smpic->getPictureTitle();
-        smpic->setSnapmaticProperties(localSpJson);
-        smpic->setPictureTitle(snapmaticTitle);
-        if (!smpic->exportPicture(originalFileName))
-        {
-            QMessageBox::warning(this, tr("Snapmatic Properties"), tr("Patching of Snapmatic Properties failed because of I/O Error"));
-            smpic->setSnapmaticProperties(fallbackProperties);
-            smpic->setPictureTitle(fallbackTitle);
-        }
-        else
-        {
-            smpic->emitUpdate();
-        }
-    }
-    close();
-}
-
-void SnapmaticEditor::qualifyAvatar()
-{
-    ui->rbSelfie->setChecked(true);
-    ui->cbDirector->setChecked(false);
-    ui->cbMeme->setChecked(false);
-    ui->cmdApply->setDefault(true);
-}
-
-void SnapmaticEditor::on_cbQualify_toggled(bool checked)
-{
-    if (checked)
-    {
-        ui->cbMeme->setEnabled(false);
-        ui->cbDirector->setEnabled(false);
-        ui->rbCustom->setEnabled(false);
-        ui->rbSelfie->setEnabled(false);
-        ui->rbEditor->setEnabled(false);
-        ui->rbMugshot->setEnabled(false);
-    }
-    else
-    {
-        ui->cbMeme->setEnabled(true);
-        ui->rbCustom->setEnabled(true);
-        ui->rbSelfie->setEnabled(true);
-        ui->rbEditor->setEnabled(true);
-        ui->rbMugshot->setEnabled(true);
-        if (ui->rbSelfie->isChecked() || ui->rbCustom->isChecked())
-        {
-            ui->cbDirector->setEnabled(true);
-        }
-    }
-}
-
-void SnapmaticEditor::on_labTitle_linkActivated(const QString &link)
-{
-    if (link == "g5e://edittitle")
-    {
-        bool ok;
-        QString newTitle = QInputDialog::getText(this, tr("Snapmatic Title"), tr("New Snapmatic title:"), QLineEdit::Normal, snapmaticTitle, &ok, windowFlags());
-        if (ok && !newTitle.isEmpty())
-        {
-            setSnapmaticTitle(newTitle);
-        }
-    }
-}
-
-void SnapmaticEditor::on_labCrew_linkActivated(const QString &link)
-{
-    if (link == "g5e://editcrew")
-    {
-        bool ok;
-        int indexNum = 0;
-        QStringList itemList;
-        QStringList crewList = crewDB->getCrews();
-        if (!crewList.contains(QLatin1String("0")))
-        {
-            crewList.append(QLatin1String("0"));
-        }
-        crewList.sort();
-        foreach(const QString &crew, crewList)
-        {
-            itemList.append(QString("%1 (%2)").arg(crew, returnCrewName(crew.toInt())));
-        }
-        if (crewList.contains(QString::number(crewID)))
-        {
-            indexNum = crewList.indexOf(QRegExp(QString::number(crewID)));
-        }
-        QString newCrew = QInputDialog::getItem(this, tr("Snapmatic Crew"), tr("New Snapmatic crew:"), itemList, indexNum, true, &ok, windowFlags());
-        if (ok && !newCrew.isEmpty())
-        {
-            if (newCrew.contains(" ")) newCrew = newCrew.split(" ").at(0);
-            if (newCrew.length() > 10) return;
-            foreach (const QChar &crewChar, newCrew)
-            {
-                if (!crewChar.isNumber())
-                {
-                    return;
-                }
-            }
-            crewID = newCrew.toInt();
-            setSnapmaticCrew(returnCrewName(crewID));
-        }
-    }
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SnapmaticEditor.h"
+#include "ui_SnapmaticEditor.h"
+#include "SnapmaticPicture.h"
+#include "StringParser.h"
+#include "AppEnv.h"
+#include <QStringBuilder>
+#include <QTextDocument>
+#include <QInputDialog>
+#include <QMessageBox>
+#include <QDebug>
+#include <QFile>
+
+SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent) :
+    QDialog(parent), crewDB(crewDB),
+    ui(new Ui::SnapmaticEditor)
+{
+    ui->setupUi(this);
+    ui->cmdApply->setDefault(true);
+
+    if (QIcon::hasThemeIcon("dialog-apply"))
+    {
+        ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply"));
+    }
+    if (QIcon::hasThemeIcon("dialog-cancel"))
+    {
+        ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
+    }
+
+    snapmaticTitle = "";
+    smpic = 0;
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    resize(400 * screenRatio, 360 * screenRatio);
+}
+
+SnapmaticEditor::~SnapmaticEditor()
+{
+    delete ui;
+}
+
+void SnapmaticEditor::selfie_toggled(bool checked)
+{
+    if (checked)
+    {
+        isSelfie = true;
+    }
+    else
+    {
+        isSelfie = false;
+    }
+}
+
+
+void SnapmaticEditor::mugshot_toggled(bool checked)
+{
+    if (checked)
+    {
+        isMugshot = true;
+        ui->cbDirector->setEnabled(false);
+        ui->cbDirector->setChecked(false);
+    }
+    else
+    {
+        isMugshot = false;
+        ui->cbDirector->setEnabled(true);
+    }
+}
+
+void SnapmaticEditor::editor_toggled(bool checked)
+{
+    if (checked)
+    {
+        isEditor = true;
+        ui->cbDirector->setEnabled(false);
+        ui->cbDirector->setChecked(false);
+    }
+    else
+    {
+        isEditor = false;
+        ui->cbDirector->setEnabled(true);
+    }
+}
+
+void SnapmaticEditor::on_rbSelfie_toggled(bool checked)
+{
+    if (checked)
+    {
+        mugshot_toggled(false);
+        editor_toggled(false);
+        selfie_toggled(true);
+    }
+}
+
+void SnapmaticEditor::on_rbMugshot_toggled(bool checked)
+{
+    if (checked)
+    {
+        selfie_toggled(false);
+        editor_toggled(false);
+        mugshot_toggled(true);
+    }
+}
+
+void SnapmaticEditor::on_rbEditor_toggled(bool checked)
+{
+    if (checked)
+    {
+        selfie_toggled(false);
+        mugshot_toggled(false);
+        editor_toggled(true);
+    }
+}
+
+void SnapmaticEditor::on_rbCustom_toggled(bool checked)
+{
+    if (checked)
+    {
+        selfie_toggled(false);
+        mugshot_toggled(false);
+        editor_toggled(false);
+    }
+}
+
+void SnapmaticEditor::setSnapmaticPicture(SnapmaticPicture *picture)
+{
+    smpic = picture;
+    localSpJson = smpic->getSnapmaticProperties();
+    ui->rbCustom->setChecked(true);
+    crewID = localSpJson.crewID;
+    isSelfie = localSpJson.isSelfie;
+    isMugshot = localSpJson.isMug;
+    isEditor = localSpJson.isFromRSEditor;
+    ui->cbDirector->setChecked(localSpJson.isFromDirector);
+    ui->cbMeme->setChecked(localSpJson.isMeme);
+    if (isSelfie)
+    {
+        ui->rbSelfie->setChecked(true);
+    }
+    else if (isMugshot)
+    {
+        ui->rbMugshot->setChecked(true);
+    }
+    else if (isEditor)
+    {
+        ui->rbEditor->setChecked(true);
+    }
+    else
+    {
+        ui->rbCustom->setChecked(true);
+    }
+    setSnapmaticCrew(returnCrewName(crewID));
+    setSnapmaticTitle(picture->getPictureTitle());
+}
+
+void SnapmaticEditor::setSnapmaticTitle(const QString &title)
+{
+    if (title.length() > 39)
+    {
+        snapmaticTitle = title.left(39);
+    }
+    else
+    {
+        snapmaticTitle = title;
+    }
+    QString editStr = QString("<a href=\"g5e://edittitle\" style=\"text-decoration: none;\">%1</a>").arg(tr("Edit"));
+    QString titleStr = tr("Title: %1 (%2)").arg(StringParser::escapeString(snapmaticTitle), editStr);
+    ui->labTitle->setText(titleStr);
+    if (SnapmaticPicture::verifyTitle(snapmaticTitle))
+    {
+        ui->labAppropriate->setText(tr("Appropriate: %1").arg(QString("<span style=\"color: green\">%1</a>").arg(tr("Yes", "Yes, should work fine"))));
+    }
+    else
+    {
+        ui->labAppropriate->setText(tr("Appropriate: %1").arg(QString("<span style=\"color: red\">%1</a>").arg(tr("No", "No, could lead to issues"))));
+    }
+}
+
+void SnapmaticEditor::setSnapmaticCrew(const QString &crew)
+{
+    QString editStr = QString("<a href=\"g5e://editcrew\" style=\"text-decoration: none;\">%1</a>").arg(tr("Edit"));
+    QString crewStr = tr("Crew: %1 (%2)").arg(StringParser::escapeString(crew), editStr);
+    ui->labCrew->setText(crewStr);
+}
+
+QString SnapmaticEditor::returnCrewName(int crewID_)
+{
+    return crewDB->getCrewName(crewID_);
+}
+
+void SnapmaticEditor::on_cmdCancel_clicked()
+{
+    close();
+}
+
+void SnapmaticEditor::on_cmdApply_clicked()
+{
+    if (ui->cbQualify->isChecked())
+    {
+        qualifyAvatar();
+    }
+    localSpJson.crewID = crewID;
+    localSpJson.isSelfie = isSelfie;
+    localSpJson.isMug = isMugshot;
+    localSpJson.isFromRSEditor = isEditor;
+    localSpJson.isFromDirector = ui->cbDirector->isChecked();
+    localSpJson.isMeme = ui->cbMeme->isChecked();
+    if (smpic)
+    {
+        QString originalFileName = smpic->getPictureFilePath();
+        QString adjustedFileName = originalFileName;
+        if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
+        {
+            adjustedFileName.remove(adjustedFileName.length() - 7, 7);
+        }
+        QString backupFileName = adjustedFileName % ".bak";
+        if (!QFile::exists(backupFileName))
+        {
+            QFile::copy(adjustedFileName, backupFileName);
+        }
+        SnapmaticProperties fallbackProperties = smpic->getSnapmaticProperties();
+        QString fallbackTitle = smpic->getPictureTitle();
+        smpic->setSnapmaticProperties(localSpJson);
+        smpic->setPictureTitle(snapmaticTitle);
+        if (!smpic->exportPicture(originalFileName))
+        {
+            QMessageBox::warning(this, tr("Snapmatic Properties"), tr("Patching of Snapmatic Properties failed because of I/O Error"));
+            smpic->setSnapmaticProperties(fallbackProperties);
+            smpic->setPictureTitle(fallbackTitle);
+        }
+        else
+        {
+            smpic->emitUpdate();
+        }
+    }
+    close();
+}
+
+void SnapmaticEditor::qualifyAvatar()
+{
+    ui->rbSelfie->setChecked(true);
+    ui->cbDirector->setChecked(false);
+    ui->cbMeme->setChecked(false);
+    ui->cmdApply->setDefault(true);
+}
+
+void SnapmaticEditor::on_cbQualify_toggled(bool checked)
+{
+    if (checked)
+    {
+        ui->cbMeme->setEnabled(false);
+        ui->cbDirector->setEnabled(false);
+        ui->rbCustom->setEnabled(false);
+        ui->rbSelfie->setEnabled(false);
+        ui->rbEditor->setEnabled(false);
+        ui->rbMugshot->setEnabled(false);
+    }
+    else
+    {
+        ui->cbMeme->setEnabled(true);
+        ui->rbCustom->setEnabled(true);
+        ui->rbSelfie->setEnabled(true);
+        ui->rbEditor->setEnabled(true);
+        ui->rbMugshot->setEnabled(true);
+        if (ui->rbSelfie->isChecked() || ui->rbCustom->isChecked())
+        {
+            ui->cbDirector->setEnabled(true);
+        }
+    }
+}
+
+void SnapmaticEditor::on_labTitle_linkActivated(const QString &link)
+{
+    if (link == "g5e://edittitle")
+    {
+        bool ok;
+        QString newTitle = QInputDialog::getText(this, tr("Snapmatic Title"), tr("New Snapmatic title:"), QLineEdit::Normal, snapmaticTitle, &ok, windowFlags());
+        if (ok && !newTitle.isEmpty())
+        {
+            setSnapmaticTitle(newTitle);
+        }
+    }
+}
+
+void SnapmaticEditor::on_labCrew_linkActivated(const QString &link)
+{
+    if (link == "g5e://editcrew")
+    {
+        bool ok;
+        int indexNum = 0;
+        QStringList itemList;
+        QStringList crewList = crewDB->getCrews();
+        if (!crewList.contains(QLatin1String("0")))
+        {
+            crewList += QLatin1String("0");
+        }
+        crewList.sort();
+        foreach(const QString &crew, crewList)
+        {
+            itemList += QString("%1 (%2)").arg(crew, returnCrewName(crew.toInt()));
+        }
+        if (crewList.contains(QString::number(crewID)))
+        {
+            indexNum = crewList.indexOf(QRegExp(QString::number(crewID)));
+        }
+        QString newCrew = QInputDialog::getItem(this, tr("Snapmatic Crew"), tr("New Snapmatic crew:"), itemList, indexNum, true, &ok, windowFlags());
+        if (ok && !newCrew.isEmpty())
+        {
+            if (newCrew.contains(" ")) newCrew = newCrew.split(" ").at(0);
+            if (newCrew.length() > 10) return;
+            foreach (const QChar &crewChar, newCrew)
+            {
+                if (!crewChar.isNumber())
+                {
+                    return;
+                }
+            }
+            crewID = newCrew.toInt();
+            setSnapmaticCrew(returnCrewName(crewID));
+        }
+    }
+}
diff --git a/SnapmaticEditor.h b/SnapmaticEditor.h
index d2f41ee..243d85a 100644
--- a/SnapmaticEditor.h
+++ b/SnapmaticEditor.h
@@ -1,69 +1,69 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SNAPMATICEDITOR_H
-#define SNAPMATICEDITOR_H
-
-#include <QDialog>
-#include "CrewDatabase.h"
-#include "SnapmaticPicture.h"
-
-namespace Ui {
-class SnapmaticEditor;
-}
-
-class SnapmaticEditor : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent = 0);
-    void setSnapmaticPicture(SnapmaticPicture *picture);
-    void setSnapmaticTitle(const QString &title);
-    void setSnapmaticCrew(const QString &crew = "");
-    QString returnCrewName(int crewID);
-    ~SnapmaticEditor();
-
-private slots:
-    void on_rbSelfie_toggled(bool checked);
-    void on_rbMugshot_toggled(bool checked);
-    void on_rbEditor_toggled(bool checked);
-    void on_rbCustom_toggled(bool checked);
-    void on_cmdCancel_clicked();
-    void on_cmdApply_clicked();
-    void on_cbQualify_toggled(bool checked);
-    void on_labTitle_linkActivated(const QString &link);
-    void on_labCrew_linkActivated(const QString &link);
-
-private:
-    CrewDatabase *crewDB;
-    Ui::SnapmaticEditor *ui;
-    SnapmaticProperties localSpJson;
-    SnapmaticPicture *smpic;
-    QString snapmaticTitle;
-    int crewID;
-    bool isSelfie;
-    bool isMugshot;
-    bool isEditor;
-    void selfie_toggled(bool checked);
-    void mugshot_toggled(bool checked);
-    void editor_toggled(bool checked);
-    void qualifyAvatar();
-};
-
-#endif // SNAPMATICEDITOR_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SNAPMATICEDITOR_H
+#define SNAPMATICEDITOR_H
+
+#include <QDialog>
+#include "CrewDatabase.h"
+#include "SnapmaticPicture.h"
+
+namespace Ui {
+class SnapmaticEditor;
+}
+
+class SnapmaticEditor : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent = 0);
+    void setSnapmaticPicture(SnapmaticPicture *picture);
+    void setSnapmaticTitle(const QString &title);
+    void setSnapmaticCrew(const QString &crew = "");
+    QString returnCrewName(int crewID);
+    ~SnapmaticEditor();
+
+private slots:
+    void on_rbSelfie_toggled(bool checked);
+    void on_rbMugshot_toggled(bool checked);
+    void on_rbEditor_toggled(bool checked);
+    void on_rbCustom_toggled(bool checked);
+    void on_cmdCancel_clicked();
+    void on_cmdApply_clicked();
+    void on_cbQualify_toggled(bool checked);
+    void on_labTitle_linkActivated(const QString &link);
+    void on_labCrew_linkActivated(const QString &link);
+
+private:
+    CrewDatabase *crewDB;
+    Ui::SnapmaticEditor *ui;
+    SnapmaticProperties localSpJson;
+    SnapmaticPicture *smpic;
+    QString snapmaticTitle;
+    int crewID;
+    bool isSelfie;
+    bool isMugshot;
+    bool isEditor;
+    void selfie_toggled(bool checked);
+    void mugshot_toggled(bool checked);
+    void editor_toggled(bool checked);
+    void qualifyAvatar();
+};
+
+#endif // SNAPMATICEDITOR_H
diff --git a/SnapmaticEditor.ui b/SnapmaticEditor.ui
index 46ffa60..6a8a538 100644
--- a/SnapmaticEditor.ui
+++ b/SnapmaticEditor.ui
@@ -1,248 +1,248 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SnapmaticEditor</class>
- <widget class="QDialog" name="SnapmaticEditor">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>362</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Snapmatic Properties</string>
-  </property>
-  <property name="modal">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="vlEditor">
-   <item>
-    <widget class="QWidget" name="frameWidget" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <layout class="QVBoxLayout" name="vlFrame">
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QGroupBox" name="gbMode">
-        <property name="title">
-         <string>Snapmatic Type</string>
-        </property>
-        <layout class="QGridLayout" name="gdType">
-         <item row="2" column="1">
-          <widget class="QRadioButton" name="rbEditor">
-           <property name="text">
-            <string>Editor</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1">
-          <widget class="QRadioButton" name="rbSelfie">
-           <property name="text">
-            <string>Selfie</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="0">
-          <widget class="QRadioButton" name="rbCustom">
-           <property name="text">
-            <string>Regular</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="0">
-          <widget class="QRadioButton" name="rbMugshot">
-           <property name="text">
-            <string>Mugshot</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QGroupBox" name="gbProperties">
-        <property name="title">
-         <string>Snapmatic Properties</string>
-        </property>
-        <layout class="QGridLayout" name="gdProperties">
-         <item row="0" column="1">
-          <widget class="QCheckBox" name="cbMeme">
-           <property name="text">
-            <string>Meme</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="2">
-          <widget class="QCheckBox" name="cbDirector">
-           <property name="text">
-            <string>Director</string>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QGroupBox" name="gbValues">
-        <property name="title">
-         <string>Snapmatic Values</string>
-        </property>
-        <layout class="QVBoxLayout" name="vlTitle">
-         <item>
-          <widget class="UiModLabel" name="labCrew">
-           <property name="contextMenuPolicy">
-            <enum>Qt::NoContextMenu</enum>
-           </property>
-           <property name="text">
-            <string>Crew: %1 (%2)</string>
-           </property>
-           <property name="wordWrap">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="UiModLabel" name="labTitle">
-           <property name="contextMenuPolicy">
-            <enum>Qt::NoContextMenu</enum>
-           </property>
-           <property name="text">
-            <string>Title: %1 (%2)</string>
-           </property>
-           <property name="wordWrap">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="UiModLabel" name="labAppropriate">
-           <property name="text">
-            <string>Appropriate: %1</string>
-           </property>
-           <property name="wordWrap">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QGroupBox" name="gbExtras">
-        <property name="title">
-         <string>Extras</string>
-        </property>
-        <layout class="QVBoxLayout" name="vlExtras">
-         <item>
-          <widget class="QCheckBox" name="cbQualify">
-           <property name="text">
-            <string>Qualify as Avatar automatically at apply</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="UiModLabel" name="labQualify">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>Qualify as Avatar allows you to use this Snapmatic as a Social Club profile picture</string>
-           </property>
-           <property name="wordWrap">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <spacer name="vsEditor">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="hlButtons">
-     <item>
-      <spacer name="hsButtons">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdApply">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>&amp;Apply</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="cmdCancel">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>&amp;Cancel</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>UiModLabel</class>
-   <extends>QLabel</extends>
-   <header>UiModLabel.h</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SnapmaticEditor</class>
+ <widget class="QDialog" name="SnapmaticEditor">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>362</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Snapmatic Properties</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="vlEditor">
+   <item>
+    <widget class="QWidget" name="frameWidget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <layout class="QVBoxLayout" name="vlFrame">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QGroupBox" name="gbMode">
+        <property name="title">
+         <string>Snapmatic Type</string>
+        </property>
+        <layout class="QGridLayout" name="gdType">
+         <item row="2" column="1">
+          <widget class="QRadioButton" name="rbEditor">
+           <property name="text">
+            <string>Editor</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1">
+          <widget class="QRadioButton" name="rbSelfie">
+           <property name="text">
+            <string>Selfie</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="0">
+          <widget class="QRadioButton" name="rbCustom">
+           <property name="text">
+            <string>Regular</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QRadioButton" name="rbMugshot">
+           <property name="text">
+            <string>Mugshot</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="gbProperties">
+        <property name="title">
+         <string>Snapmatic Properties</string>
+        </property>
+        <layout class="QGridLayout" name="gdProperties">
+         <item row="0" column="1">
+          <widget class="QCheckBox" name="cbMeme">
+           <property name="text">
+            <string>Meme</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="2">
+          <widget class="QCheckBox" name="cbDirector">
+           <property name="text">
+            <string>Director</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="gbValues">
+        <property name="title">
+         <string>Snapmatic Values</string>
+        </property>
+        <layout class="QVBoxLayout" name="vlTitle">
+         <item>
+          <widget class="UiModLabel" name="labCrew">
+           <property name="contextMenuPolicy">
+            <enum>Qt::NoContextMenu</enum>
+           </property>
+           <property name="text">
+            <string>Crew: %1 (%2)</string>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="UiModLabel" name="labTitle">
+           <property name="contextMenuPolicy">
+            <enum>Qt::NoContextMenu</enum>
+           </property>
+           <property name="text">
+            <string>Title: %1 (%2)</string>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="UiModLabel" name="labAppropriate">
+           <property name="text">
+            <string>Appropriate: %1</string>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QGroupBox" name="gbExtras">
+        <property name="title">
+         <string>Extras</string>
+        </property>
+        <layout class="QVBoxLayout" name="vlExtras">
+         <item>
+          <widget class="QCheckBox" name="cbQualify">
+           <property name="text">
+            <string>Qualify as Avatar automatically at apply</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="UiModLabel" name="labQualify">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Qualify as Avatar allows you to use this Snapmatic as a Social Club profile picture</string>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="vsEditor">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="hlButtons">
+     <item>
+      <spacer name="hsButtons">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdApply">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&amp;Apply</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdCancel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&amp;Cancel</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>UiModLabel</class>
+   <extends>QLabel</extends>
+   <header>UiModLabel.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp
index 1ded9ad..3a209bd 100755
--- a/SnapmaticPicture.cpp
+++ b/SnapmaticPicture.cpp
@@ -1,972 +1,1078 @@
-/*****************************************************************************
-* gta5sync-spv Grand Theft Auto Snapmatic Picture Viewer
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SnapmaticPicture.h"
-#include "StringParser.h"
-#include <QStringBuilder>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QStringList>
-#include <QVariantMap>
-#include <QJsonArray>
-#include <QFileInfo>
-#include <QPainter>
-#include <QString>
-#include <QBuffer>
-#include <QDebug>
-#include <QImage>
-#include <QSize>
-#include <QFile>
-
-// PARSER ALLOCATIONS
-#define snapmaticHeaderLength 278
-#define snapmaticUsefulLength 260
-#define snapmaticFileMaxSize 528192
-#define jpegHeaderLineDifStr 2
-#define jpegPreHeaderLength 14
-#define jpegPicStreamLength 524288
-#define jsonStreamLength 3076
-#define tideStreamLength 260
-
-// EDITOR ALLOCATIONS
-#define jpegStreamEditorBegin 292
-#define jsonStreamEditorBegin 524588
-#define jsonStreamEditorLength 3072
-#define titlStreamEditorBegin 527668
-#define titlStreamEditorLength 256
-#define titlStreamCharacterMax 39
-
-// IMAGES VALUES
-#define snapmaticResolutionW 960
-#define snapmaticResolutionH 536
-#define snapmaticResolution QSize(snapmaticResolutionW, snapmaticResolutionH)
-
-SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFilePath(fileName)
-{
-    reset();
-}
-
-SnapmaticPicture::~SnapmaticPicture()
-{
-}
-
-void SnapmaticPicture::reset()
-{
-    // INIT PIC
-    rawPicContent = "";
-    cachePicture = QImage();
-    jpegRawContentSizeE = 0;
-    jpegRawContentSize = 0;
-    picExportFileName = "";
-    isCustomFormat = 0;
-    isLoadedInRAM = 0;
-    pictureHead = "";
-    pictureStr = "";
-    lowRamMode = 0;
-    lastStep = "";
-    sortStr = "";
-    titlStr = "";
-    descStr = "";
-    picOk = 0;
-
-    // INIT JSON
-    jsonOk = 0;
-    jsonStr = "";
-
-    // SNAPMATIC PROPERTIES
-    localSpJson = {};
-}
-
-bool SnapmaticPicture::preloadFile()
-{
-    QFile *picFile = new QFile(picFilePath);
-    picFileName = QFileInfo(picFilePath).fileName();
-
-    if (!picFile->open(QFile::ReadOnly))
-    {
-        lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
-        delete picFile;
-        return false;
-    }
-    if (picFilePath.right(4) != QLatin1String(".g5e"))
-    {
-        rawPicContent = picFile->read(snapmaticFileMaxSize);
-        picFile->close();
-        delete picFile;
-
-        // Setting is values
-        isCustomFormat = false;
-        isLoadedInRAM = true;
-    }
-    else
-    {
-        QByteArray g5eContent = picFile->read(snapmaticFileMaxSize + 1024);
-        picFile->close();
-        delete picFile;
-
-        // Set Custom Format
-        isCustomFormat = true;
-
-        // Reading g5e Content
-        g5eContent.remove(0, 1);
-        if (g5eContent.left(3) == QByteArray("G5E"))
-        {
-            g5eContent.remove(0, 3);
-            if (g5eContent.left(2).toHex() == QByteArray("1000"))
-            {
-                g5eContent.remove(0, 2);
-                if (g5eContent.left(3) == QByteArray("LEN"))
-                {
-                    g5eContent.remove(0, 3);
-                    int fileNameLength = g5eContent.left(1).toHex().toInt();
-                    g5eContent.remove(0, 1);
-                    if (g5eContent.left(3) == QByteArray("FIL"))
-                    {
-                        g5eContent.remove(0, 3);
-                        picFileName = g5eContent.left(fileNameLength);
-                        g5eContent.remove(0, fileNameLength);
-                        if (g5eContent.left(3) == QByteArray("COM"))
-                        {
-                            g5eContent.remove(0, 3);
-                            rawPicContent = qUncompress(g5eContent);
-
-                            // Setting is values
-                            isLoadedInRAM = true;
-                        }
-                        else
-                        {
-                            lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,G5E_FORMATERROR";
-                            return false;
-                        }
-                    }
-                    else
-                    {
-                        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,G5E_FORMATERROR";
-                        return false;
-                    }
-                }
-                else
-                {
-                    lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,G5E_FORMATERROR";
-                    return false;
-                }
-            }
-            else
-            {
-                lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_NOTCOMPATIBLE";
-                return false;
-            }
-        }
-        else
-        {
-            lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_FORMATERROR";
-            return false;
-        }
-    }
-    emit preloaded();
-    return true;
-}
-
-bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
-{
-    // Start opening file
-    // lastStep is like currentStep
-
-    // Set boolean values
-    writeEnabled = writeEnabled_;
-    cacheEnabled = cacheEnabled_;
-    lowRamMode = lowRamMode_;
-    if (!writeEnabled) { lowRamMode = false; } // Low RAM Mode only works when writeEnabled is true
-
-    QIODevice *picStream;
-
-    if (!isLoadedInRAM) { preloadFile(); }
-
-    picStream = new QBuffer(&rawPicContent);
-    picStream->open(QIODevice::ReadWrite);
-
-    // Reading Snapmatic Header
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,NOHEADER";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray snapmaticHeaderLine = picStream->read(snapmaticHeaderLength);
-    pictureHead = getSnapmaticHeaderString(snapmaticHeaderLine);
-
-    // Reading JPEG Header Line
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOHEADER";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray jpegHeaderLine = picStream->read(jpegPreHeaderLength);
-
-    // Checking for JPEG
-    jpegHeaderLine.remove(0, jpegHeaderLineDifStr);
-    if (jpegHeaderLine.left(4) != QByteArray("JPEG"))
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOJPEG";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-
-    // Read JPEG Stream
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOPIC";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray jpegRawContent = picStream->read(jpegPicStreamLength);
-    if (jpegRawContent.contains("\xFF\xD9"))
-    {
-        int jpegRawContentSizeT = jpegRawContent.indexOf("\xFF\xD9") + 2;
-        jpegRawContentSizeE = jpegRawContentSizeT;
-        jpegRawContentSize = jpegRawContentSizeT;
-        if (jpegRawContent.contains("\xFF\x45\x4F\x49"))
-        {
-            jpegRawContentSizeT = jpegRawContent.indexOf("\xFF\x45\x4F\x49");
-        }
-        jpegRawContent = jpegRawContent.left(jpegRawContentSize);
-        jpegRawContentSize = jpegRawContentSizeT;
-    }
-    if (cacheEnabled) picOk = cachePicture.loadFromData(jpegRawContent, "JPEG");
-    if (!cacheEnabled)
-    {
-        QImage tempPicture;
-        picOk = tempPicture.loadFromData(jpegRawContent, "JPEG");
-    }
-    else if (!fastLoad)
-    {
-        QImage tempPicture = QImage(snapmaticResolution, QImage::Format_RGB888);
-        QPainter tempPainter(&tempPicture);
-        if (cachePicture.size() == snapmaticResolution)
-        {
-            tempPainter.drawImage(0, 0, cachePicture);
-        }
-        else
-        {
-            tempPainter.drawImage(0, 0, cachePicture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-        }
-        tempPainter.end();
-        cachePicture = tempPicture;
-    }
-
-    // Read JSON Stream
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,NOJSON";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    else if (picStream->read(4) != QByteArray("JSON"))
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,CTJSON";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray jsonRawContent = picStream->read(jsonStreamLength);
-    jsonStr = getSnapmaticJSONString(jsonRawContent);
-    parseJsonContent(); // JSON parsing is own function
-
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,NOTITL";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    else if (picStream->read(4) != QByteArray("TITL"))
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,CTTITL";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray titlRawContent = picStream->read(tideStreamLength);
-    titlStr = getSnapmaticTIDEString(titlRawContent);
-
-    if (!picStream->isReadable())
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,NODESC";
-        picStream->close();
-        delete picStream;
-        return picOk;
-    }
-    else if (picStream->read(4) != QByteArray("DESC"))
-    {
-        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,CTDESC";
-        picStream->close();
-        delete picStream;
-        return false;
-    }
-    QByteArray descRawContent = picStream->read(tideStreamLength);
-    descStr = getSnapmaticTIDEString(descRawContent);
-
-    updateStrings();
-
-    picStream->close();
-    delete picStream;
-
-    if (!writeEnabled) { rawPicContent.clear(); }
-    else if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-
-    emit loaded();
-    return picOk;
-}
-
-QString SnapmaticPicture::getSnapmaticHeaderString(const QByteArray &snapmaticHeader)
-{
-    QByteArray snapmaticBytes = snapmaticHeader.left(snapmaticUsefulLength);
-    QList<QByteArray> snapmaticBytesList = snapmaticBytes.split('\x01');
-    snapmaticBytes = snapmaticBytesList.at(1);
-    snapmaticBytesList.clear();
-    return StringParser::parseTitleString(snapmaticBytes, snapmaticBytes.length());
-}
-
-QString SnapmaticPicture::getSnapmaticJSONString(const QByteArray &jsonBytes)
-{
-    QByteArray jsonUsefulBytes = jsonBytes;
-    jsonUsefulBytes.replace('\x00', "");
-    jsonUsefulBytes.replace('\x0c', "");
-    return QString::fromUtf8(jsonUsefulBytes).trimmed();
-}
-
-QString SnapmaticPicture::getSnapmaticTIDEString(const QByteArray &tideBytes)
-{
-    QByteArray tideUsefulBytes = tideBytes;
-    tideUsefulBytes.remove(0,4);
-    QList<QByteArray> tideUsefulBytesList = tideUsefulBytes.split('\x00');
-    return QString::fromUtf8(tideUsefulBytesList.at(0)).trimmed();
-}
-
-void SnapmaticPicture::updateStrings()
-{
-    QString cmpPicTitl = titlStr;
-    cmpPicTitl.replace('\"', "''");
-    cmpPicTitl.replace(' ', '_');
-    cmpPicTitl.replace(':', '-');
-    cmpPicTitl.remove('\\');
-    cmpPicTitl.remove('{');
-    cmpPicTitl.remove('}');
-    cmpPicTitl.remove('/');
-    cmpPicTitl.remove('<');
-    cmpPicTitl.remove('>');
-    cmpPicTitl.remove('*');
-    cmpPicTitl.remove('?');
-    cmpPicTitl.remove('.');
-    pictureStr = tr("PHOTO - %1").arg(localSpJson.createdDateTime.toString("MM/dd/yy HH:mm:ss"));
-    sortStr = localSpJson.createdDateTime.toString("yyMMddHHmmss") % QString::number(localSpJson.uid);
-    picExportFileName = sortStr % "_" % cmpPicTitl;
-}
-
-bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
-{
-    if (!fileName.isEmpty())
-    {
-        picFilePath = fileName;
-        return readingPicture(writeEnabled_, cacheEnabled_, fastLoad, lowRamMode_);
-    }
-    else
-    {
-        return false;
-    }
-}
-
-bool SnapmaticPicture::setImage(const QImage &picture) // dirty method
-{
-    if (writeEnabled)
-    {
-        QByteArray picByteArray;
-        int comLvl = 100;
-        bool saveSuccess = false;
-        while (comLvl != 0 && !saveSuccess)
-        {
-            QByteArray picByteArrayT;
-            QBuffer picStreamT(&picByteArrayT);
-            picStreamT.open(QIODevice::WriteOnly);
-            saveSuccess = picture.save(&picStreamT, "JPEG", comLvl);
-            picStreamT.close();
-            if (saveSuccess)
-            {
-                if (picByteArrayT.length() > jpegRawContentSize)
-                {
-                    comLvl--;
-                    saveSuccess = false;
-                }
-                else
-                {
-                    picByteArray = picByteArrayT;
-                }
-            }
-        }
-        if (saveSuccess) return setPictureStream(picByteArray);
-    }
-    return false;
-}
-
-bool SnapmaticPicture::setPictureStream(const QByteArray &picByteArray_) // clean method
-{
-    if (writeEnabled)
-    {
-        bool customEOI = false;
-        QByteArray picByteArray = picByteArray_;
-        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
-        QBuffer snapmaticStream(&rawPicContent);
-        snapmaticStream.open(QIODevice::ReadWrite);
-        if (!snapmaticStream.seek(jpegStreamEditorBegin)) return false;
-        if (picByteArray.length() > jpegPicStreamLength) return false;
-        if (picByteArray.length() < jpegRawContentSize && jpegRawContentSize + 4 < jpegPicStreamLength)
-        {
-            customEOI = true;
-        }
-        while (picByteArray.length() != jpegPicStreamLength)
-        {
-            picByteArray += '\x00';
-        }
-        if (customEOI)
-        {
-            picByteArray.replace(jpegRawContentSize, 4, "\xFF\x45\x4F\x49");
-        }
-        int result = snapmaticStream.write(picByteArray);
-        snapmaticStream.close();
-        if (result != 0)
-        {
-            if (cacheEnabled)
-            {
-                QImage replacedPicture;
-                replacedPicture.loadFromData(picByteArray);
-                cachePicture = replacedPicture;
-            }
-            if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-            return true;
-        }
-        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-        return false;
-    }
-    return false;
-}
-
-bool SnapmaticPicture::setPictureTitl(const QString &newTitle_)
-{
-    if (writeEnabled)
-    {
-        QString newTitle = newTitle_;
-        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
-        QBuffer snapmaticStream(&rawPicContent);
-        snapmaticStream.open(QIODevice::ReadWrite);
-        if (!snapmaticStream.seek(titlStreamEditorBegin)) return false;
-        if (newTitle.length() > titlStreamCharacterMax)
-        {
-            newTitle = newTitle.left(titlStreamCharacterMax);
-        }
-        QByteArray newTitleArray = newTitle.toUtf8();
-        while (newTitleArray.length() != titlStreamEditorLength)
-        {
-            newTitleArray += '\x00';
-        }
-        int result = snapmaticStream.write(newTitleArray);
-        snapmaticStream.close();
-        if (result != 0)
-        {
-            titlStr = newTitle;
-            if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-            return true;
-        }
-        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-        return false;
-    }
-    return false;
-}
-
-QString SnapmaticPicture::getExportPictureFileName()
-{
-    return picExportFileName;
-}
-
-QString SnapmaticPicture::getPictureFileName()
-{
-    return picFileName;
-}
-
-QString SnapmaticPicture::getPictureFilePath()
-{
-    return picFilePath;
-}
-
-QString SnapmaticPicture::getPictureSortStr()
-{
-    return sortStr;
-}
-
-QString SnapmaticPicture::getPictureDesc()
-{
-    return descStr;
-}
-
-QString SnapmaticPicture::getPictureTitl()
-{
-    return titlStr;
-}
-
-QString SnapmaticPicture::getPictureHead()
-{
-    return pictureHead;
-}
-
-QString SnapmaticPicture::getPictureStr()
-{
-    return pictureStr;
-}
-
-QString SnapmaticPicture::getLastStep()
-{
-    return lastStep;
-}
-
-QImage SnapmaticPicture::getImage()
-{
-    if (cacheEnabled)
-    {
-        return cachePicture;
-    }
-    else if (writeEnabled)
-    {
-        bool returnOk = 0;
-        QImage tempPicture;
-        QImage returnPicture(snapmaticResolution, QImage::Format_RGB888);
-
-        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
-        QBuffer snapmaticStream(&rawPicContent);
-        snapmaticStream.open(QIODevice::ReadOnly);
-        if (snapmaticStream.seek(jpegStreamEditorBegin))
-        {
-            QByteArray jpegRawContent = snapmaticStream.read(jpegPicStreamLength);
-            returnOk = tempPicture.loadFromData(jpegRawContent, "JPEG");
-        }
-        snapmaticStream.close();
-        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-
-        if (returnOk)
-        {
-            QPainter returnPainter(&returnPicture);
-            if (tempPicture.size() == snapmaticResolution)
-            {
-                returnPainter.drawImage(0, 0, tempPicture);
-            }
-            else
-            {
-                returnPainter.drawImage(0, 0, tempPicture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
-            }
-            returnPainter.end();
-            return returnPicture;
-        }
-    }
-    else
-    {
-        bool returnOk = 0;
-        QImage returnPicture;
-        QIODevice *picStream;
-
-        QFile *picFile = new QFile(picFilePath);
-        if (!picFile->open(QFile::ReadOnly))
-        {
-            lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
-            delete picFile;
-            return QImage(0, 0, QImage::Format_RGB888);
-        }
-        rawPicContent = picFile->read(snapmaticFileMaxSize);
-        picFile->close();
-        delete picFile;
-
-        picStream = new QBuffer(&rawPicContent);
-        picStream->open(QIODevice::ReadWrite);
-        if (picStream->seek(jpegStreamEditorBegin))
-        {
-            QByteArray jpegRawContent = picStream->read(jpegPicStreamLength);
-            returnOk = returnPicture.loadFromData(jpegRawContent, "JPEG");
-        }
-        picStream->close();
-        delete picStream;
-
-        if (returnOk)
-        {
-            return returnPicture;
-        }
-    }
-    return QImage(0, 0, QImage::Format_RGB888);
-}
-
-int SnapmaticPicture::getContentMaxLength()
-{
-    return jpegRawContentSize;
-}
-
-bool SnapmaticPicture::isPicOk()
-{
-    return picOk;
-}
-
-void SnapmaticPicture::clearCache()
-{
-    cacheEnabled = false;
-    cachePicture = QImage();
-}
-
-void SnapmaticPicture::emitUpdate()
-{
-    emit updated();
-}
-
-// JSON part
-
-bool SnapmaticPicture::isJsonOk()
-{
-    return jsonOk;
-}
-
-QString SnapmaticPicture::getJsonStr()
-{
-    return jsonStr;
-}
-
-SnapmaticProperties SnapmaticPicture::getSnapmaticProperties()
-{
-    return localSpJson;
-}
-
-void SnapmaticPicture::parseJsonContent()
-{
-    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonStr.toUtf8());
-    QJsonObject jsonObject = jsonDocument.object();
-    QVariantMap jsonMap = jsonObject.toVariantMap(); // backward compatibility
-
-    if (jsonObject.contains("loc"))
-    {
-        QJsonObject locObject = jsonObject["loc"].toObject();
-        if (locObject.contains("x")) { localSpJson.location.x = locObject["x"].toDouble(); }
-        if (locObject.contains("y")) { localSpJson.location.y = locObject["y"].toDouble(); }
-        if (locObject.contains("z")) { localSpJson.location.z = locObject["z"].toDouble(); }
-    }
-    if (jsonObject.contains("uid"))
-    {
-        localSpJson.uid = jsonObject["uid"].toInt();
-    }
-    if (jsonObject.contains("area"))
-    {
-        localSpJson.location.area = jsonObject["area"].toString();
-    }
-    if (jsonObject.contains("crewid"))
-    {
-        localSpJson.crewID = jsonObject["crewid"].toInt();
-    }
-    if (jsonObject.contains("creat"))
-    {
-        QDateTime createdTimestamp;
-        localSpJson.createdTimestamp = jsonMap["creat"].toUInt();
-        createdTimestamp.setTime_t(localSpJson.createdTimestamp);
-        localSpJson.createdDateTime = createdTimestamp;
-    }
-    if (jsonObject.contains("plyrs"))
-    {
-        localSpJson.playersList = jsonMap["plyrs"].toStringList();
-    }
-    if (jsonObject.contains("meme"))
-    {
-        localSpJson.isMeme = jsonObject["meme"].toBool();
-    }
-    if (jsonObject.contains("mug"))
-    {
-        localSpJson.isMug = jsonObject["mug"].toBool();
-    }
-    if (jsonObject.contains("slf"))
-    {
-        localSpJson.isSelfie = jsonObject["slf"].toBool();
-    }
-    if (jsonObject.contains("drctr"))
-    {
-        localSpJson.isFromDirector = jsonObject["drctr"].toBool();
-    }
-    if (jsonObject.contains("rsedtr"))
-    {
-        localSpJson.isFromRSEditor = jsonObject["rsedtr"].toBool();
-    }
-
-    jsonOk = true;
-}
-
-bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson)
-{
-    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonStr.toUtf8());
-    QJsonObject jsonObject = jsonDocument.object();
-
-    QJsonObject locObject;
-    locObject["x"] = newSpJson.location.x;
-    locObject["y"] = newSpJson.location.y;
-    locObject["z"] = newSpJson.location.z;
-
-    jsonObject["loc"] = locObject;
-    jsonObject["uid"] = newSpJson.uid;
-    jsonObject["area"] = newSpJson.location.area;
-    jsonObject["crewid"] = newSpJson.crewID;
-    jsonObject["creat"] = QJsonValue::fromVariant(newSpJson.createdTimestamp);
-    jsonObject["plyrs"] = QJsonValue::fromVariant(newSpJson.playersList);
-    jsonObject["meme"] = newSpJson.isMeme;
-    jsonObject["mug"] = newSpJson.isMug;
-    jsonObject["slf"] = newSpJson.isSelfie;
-    jsonObject["drctr"] = newSpJson.isFromDirector;
-    jsonObject["rsedtr"] = newSpJson.isFromRSEditor;
-
-    jsonDocument.setObject(jsonObject);
-
-    QString newJsonStr = QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Compact));
-    if (newJsonStr.length() < jsonStreamEditorLength)
-    {
-        if (writeEnabled)
-        {
-            QByteArray jsonByteArray = newJsonStr.toUtf8();
-            while (jsonByteArray.length() != jsonStreamEditorLength)
-            {
-                jsonByteArray += '\x00';
-            }
-            if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
-            QBuffer snapmaticStream(&rawPicContent);
-            snapmaticStream.open(QIODevice::ReadWrite);
-            if (!snapmaticStream.seek(jsonStreamEditorBegin))
-            {
-                snapmaticStream.close();
-                return false;
-            }
-            int result = snapmaticStream.write(jsonByteArray);
-            snapmaticStream.close();
-            if (result != 0)
-            {
-                localSpJson = newSpJson;
-                jsonStr = newJsonStr;
-                if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-                return true;
-            }
-            else
-            {
-                if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
-                return false;
-            }
-        }
-        else
-        {
-            return false;
-        }
-    }
-    else
-    {
-        return false;
-    }
-
-    return true;
-}
-
-// FILE MANAGEMENT
-
-bool SnapmaticPicture::exportPicture(const QString &fileName, const QString format)
-{
-    QFile *picFile = new QFile(fileName);
-    if (picFile->open(QIODevice::WriteOnly))
-    {
-        if (format == QLatin1String("G5E"))
-        {
-            // Modern compressed export
-            QByteArray stockFileNameUTF8 = picFileName.toUtf8();
-            QByteArray numberLength = QByteArray::number(stockFileNameUTF8.length());
-            if (numberLength.length() == 1)
-            {
-                numberLength.insert(0, "0");
-            }
-            else if (numberLength.length() != 2)
-            {
-                numberLength = "00";
-            }
-            QByteArray g5eHeader;
-            g5eHeader.reserve(stockFileNameUTF8.length() + 16);
-            g5eHeader += '\x00'; // First Null Byte
-            g5eHeader += QByteArray("G5E"); // GTA 5 Export
-            g5eHeader += '\x10'; g5eHeader += '\x00'; // 2 byte GTA 5 Export Version
-            g5eHeader += QByteArray("LEN"); // Before Length
-            g5eHeader += QByteArray::fromHex(numberLength); // Length in HEX before Compressed
-            g5eHeader += QByteArray("FIL"); // Before File Name
-            g5eHeader += stockFileNameUTF8; // File Name
-            g5eHeader += QByteArray("COM"); // Before Compressed
-            picFile->write(g5eHeader);
-            if (!lowRamMode)
-            {
-                picFile->write(qCompress(rawPicContent, 9)); // Compressed Snapmatic
-            }
-            else
-            {
-                picFile->write(rawPicContent);
-            }
-            picFile->close();
-            delete picFile;
-        }
-        else if (format == QLatin1String("JPG"))
-        {
-            // JPEG export
-            QBuffer snapmaticStream(&rawPicContent);
-            snapmaticStream.open(QIODevice::ReadOnly);
-            if (snapmaticStream.seek(jpegStreamEditorBegin))
-            {
-                QByteArray jpegRawContent = snapmaticStream.read(jpegPicStreamLength);
-                if (jpegRawContentSizeE != 0)
-                {
-                    jpegRawContent = jpegRawContent.left(jpegRawContentSizeE);
-                }
-                picFile->write(jpegRawContent);
-            }
-            picFile->close();
-            delete picFile;
-        }
-        else
-        {
-            // Classic straight export
-            if (!lowRamMode)
-            {
-                picFile->write(rawPicContent);
-            }
-            else
-            {
-                picFile->write(qUncompress(rawPicContent));
-            }
-            picFile->close();
-            delete picFile;
-        }
-        return true;
-    }
-    else
-    {
-        delete picFile;
-        return false;
-    }
-}
-
-void SnapmaticPicture::setPicFileName(const QString &picFileName_)
-{
-    picFileName = picFileName_;
-}
-
-void SnapmaticPicture::setPicFilePath(const QString &picFilePath_)
-{
-    picFilePath = picFilePath_;
-}
-
-bool SnapmaticPicture::deletePicFile()
-{
-    if (!QFile::exists(picFilePath)) return true;
-    if (QFile::remove(picFilePath)) return true;
-    return false;
-}
-
-// VISIBILITY
-
-bool SnapmaticPicture::isHidden()
-{
-    if (picFilePath.right(7) == QLatin1String(".hidden"))
-    {
-        return true;
-    }
-    return false;
-}
-
-bool SnapmaticPicture::setPictureHidden()
-{
-    if (isCustomFormat)
-    {
-        return false;
-    }
-    if (!isHidden())
-    {
-        QString newPicFilePath = QString(picFilePath % ".hidden");
-        if (QFile::rename(picFilePath, newPicFilePath))
-        {
-            picFilePath = newPicFilePath;
-            return true;
-        }
-        return false;
-    }
-    return true;
-}
-
-bool SnapmaticPicture::setPictureVisible()
-{
-    if (isCustomFormat)
-    {
-        return false;
-    }
-    if (isHidden())
-    {
-        QString newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 7, 7);
-        if (QFile::rename(picFilePath, newPicFilePath))
-        {
-            picFilePath = newPicFilePath;
-            return true;
-        }
-        return false;
-    }
-    return true;
-}
-
-// PREDEFINED PROPERTIES
-
-QSize SnapmaticPicture::getSnapmaticResolution()
-{
-    return snapmaticResolution;
-}
-
-// VERIFY CONTENT
-
-bool SnapmaticPicture::verifyTitle(const QString &title)
-{
-    // VERIFY TITLE FOR BE A VALID SNAPMATIC TITLE
-    if (title.length() <= titlStreamCharacterMax)
-    {
-        foreach(const QChar &titleChar, title)
-        {
-            if (!verifyTitleChar(titleChar)) return false;
-        }
-        return true;
-    }
-    return false;
-}
-
-bool SnapmaticPicture::verifyTitleChar(const QChar &titleChar)
-{
-    // VERIFY CHAR FOR BE A VALID SNAPMATIC CHARACTER
-    if (titleChar.isLetterOrNumber() || titleChar.isPrint())
-    {
-        if (titleChar == '<' || titleChar == '>' || titleChar == '\\') return false;
-        return true;
-    }
-    return false;
-}
+/*****************************************************************************
+* gta5sync-spv Grand Theft Auto Snapmatic Picture Viewer
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SnapmaticPicture.h"
+#include "StringParser.h"
+#include <QStringBuilder>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QStringList>
+#include <QVariantMap>
+#include <QJsonArray>
+#include <QFileInfo>
+#include <QPainter>
+#include <QString>
+#include <QBuffer>
+#include <QDebug>
+#include <QImage>
+#include <QSize>
+#include <QFile>
+
+// PARSER ALLOCATIONS
+#define snapmaticHeaderLength 278
+#define snapmaticUsefulLength 260
+#define snapmaticFileMaxSize 528192
+#define jpegHeaderLineDifStr 2
+#define jpegPreHeaderLength 14
+#define jpegPicStreamLength 524288
+#define jsonStreamLength 3076
+#define tideStreamLength 260
+
+// EDITOR ALLOCATIONS
+#define jpegStreamEditorBegin 292
+#define jsonStreamEditorBegin 524588
+#define jsonStreamEditorLength 3072
+#define titlStreamEditorBegin 527668
+#define titlStreamEditorLength 256
+#define titlStreamCharacterMax 39
+
+// IMAGES VALUES
+#define snapmaticResolutionW 960
+#define snapmaticResolutionH 536
+#define snapmaticResolution QSize(snapmaticResolutionW, snapmaticResolutionH)
+
+SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFilePath(fileName)
+{
+    reset();
+}
+
+SnapmaticPicture::~SnapmaticPicture()
+{
+}
+
+void SnapmaticPicture::reset()
+{
+    // INIT PIC
+    rawPicContent.clear();
+    rawPicContent.squeeze();
+    cachePicture = QImage();
+    picExportFileName = QString();
+    pictureHead = QString();
+    pictureStr = QString();
+    lastStep = QString();
+    sortStr = QString();
+    titlStr = QString();
+    descStr = QString();
+
+    // INIT PIC INTS
+    jpegRawContentSizeE = 0;
+    jpegRawContentSize = 0;
+
+    // INIT PIC BOOLS
+    isCustomFormat = false;
+    isLoadedInRAM = false;
+    lowRamMode = false;
+    picOk = false;
+
+    // INIT JSON
+    jsonOk = false;
+    jsonStr = QString();
+
+    // SNAPMATIC DEFAULTS
+#ifdef GTA5SYNC_CSDF
+    careSnapDefault = false;
+#else
+    careSnapDefault = true;
+#endif
+
+    // SNAPMATIC PROPERTIES
+    localSpJson = {};
+}
+
+bool SnapmaticPicture::preloadFile()
+{
+    QFile *picFile = new QFile(picFilePath);
+    picFileName = QFileInfo(picFilePath).fileName();
+
+    if (!picFile->open(QFile::ReadOnly))
+    {
+        lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
+        delete picFile;
+        return false;
+    }
+    if (picFilePath.right(4) != QLatin1String(".g5e"))
+    {
+        rawPicContent = picFile->read(snapmaticFileMaxSize);
+        picFile->close();
+        delete picFile;
+
+        // Setting is values
+        isCustomFormat = false;
+        isLoadedInRAM = true;
+    }
+    else
+    {
+        QByteArray g5eContent = picFile->read(snapmaticFileMaxSize + 1024);
+        picFile->close();
+        delete picFile;
+
+        // Set Custom Format
+        isCustomFormat = true;
+
+        // Reading g5e Content
+        g5eContent.remove(0, 1);
+        if (g5eContent.left(3) == QByteArray("G5E"))
+        {
+            g5eContent.remove(0, 3);
+            if (g5eContent.left(2).toHex() == QByteArray("1000"))
+            {
+                g5eContent.remove(0, 2);
+                if (g5eContent.left(3) == QByteArray("LEN"))
+                {
+                    g5eContent.remove(0, 3);
+                    int fileNameLength = g5eContent.left(1).toHex().toInt();
+                    g5eContent.remove(0, 1);
+                    if (g5eContent.left(3) == QByteArray("FIL"))
+                    {
+                        g5eContent.remove(0, 3);
+                        picFileName = g5eContent.left(fileNameLength);
+                        g5eContent.remove(0, fileNameLength);
+                        if (g5eContent.left(3) == QByteArray("COM"))
+                        {
+                            g5eContent.remove(0, 3);
+                            rawPicContent = qUncompress(g5eContent);
+
+                            // Setting is values
+                            isLoadedInRAM = true;
+                        }
+                        else
+                        {
+                            lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,G5E_FORMATERROR";
+                            return false;
+                        }
+                    }
+                    else
+                    {
+                        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,G5E_FORMATERROR";
+                        return false;
+                    }
+                }
+                else
+                {
+                    lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,G5E_FORMATERROR";
+                    return false;
+                }
+            }
+            else
+            {
+                lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_NOTCOMPATIBLE";
+                return false;
+            }
+        }
+        else
+        {
+            lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_FORMATERROR";
+            return false;
+        }
+    }
+    emit preloaded();
+    return true;
+}
+
+bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
+{
+    // Start opening file
+    // lastStep is like currentStep
+
+    // Set boolean values
+    writeEnabled = writeEnabled_;
+    cacheEnabled = cacheEnabled_;
+    lowRamMode = lowRamMode_;
+    if (!writeEnabled) { lowRamMode = false; } // Low RAM Mode only works when writeEnabled is true
+
+    QIODevice *picStream;
+
+    if (!isLoadedInRAM) { preloadFile(); }
+
+    picStream = new QBuffer(&rawPicContent);
+    picStream->open(QIODevice::ReadWrite);
+
+    // Reading Snapmatic Header
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,NOHEADER";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray snapmaticHeaderLine = picStream->read(snapmaticHeaderLength);
+    pictureHead = getSnapmaticHeaderString(snapmaticHeaderLine);
+    if (pictureHead == QLatin1String("MALFORMED"))
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,MALFORMEDHEADER";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+
+    // Reading JPEG Header Line
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOHEADER";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray jpegHeaderLine = picStream->read(jpegPreHeaderLength);
+
+    // Checking for JPEG
+    jpegHeaderLine.remove(0, jpegHeaderLineDifStr);
+    if (jpegHeaderLine.left(4) != QByteArray("JPEG"))
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOJPEG";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+
+    // Read JPEG Stream
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOPIC";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray jpegRawContent = picStream->read(jpegPicStreamLength);
+    if (jpegRawContent.contains("\xFF\xD9"))
+    {
+        int jpegRawContentSizeT = jpegRawContent.indexOf("\xFF\xD9") + 2;
+        jpegRawContentSizeE = jpegRawContentSizeT;
+        jpegRawContentSize = jpegRawContentSizeT;
+        if (jpegRawContent.contains("\xFF\x45\x4F\x49"))
+        {
+            jpegRawContentSizeT = jpegRawContent.indexOf("\xFF\x45\x4F\x49");
+        }
+        jpegRawContent = jpegRawContent.left(jpegRawContentSize);
+        jpegRawContentSize = jpegRawContentSizeT;
+    }
+    if (cacheEnabled) picOk = cachePicture.loadFromData(jpegRawContent, "JPEG");
+    if (!cacheEnabled)
+    {
+        QImage tempPicture;
+        picOk = tempPicture.loadFromData(jpegRawContent, "JPEG");
+    }
+    else if (!fastLoad)
+    {
+        if (careSnapDefault)
+        {
+            QImage tempPicture = QImage(snapmaticResolution, QImage::Format_RGB888);
+            QPainter tempPainter(&tempPicture);
+            if (cachePicture.size() != snapmaticResolution)
+            {
+                tempPainter.drawImage(0, 0, cachePicture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+            }
+            else
+            {
+                tempPainter.drawImage(0, 0, cachePicture);
+            }
+            tempPainter.end();
+            cachePicture = tempPicture;
+        }
+        else
+        {
+            QImage tempPicture = QImage(cachePicture.size(), QImage::Format_RGB888);
+            QPainter tempPainter(&tempPicture);
+            tempPainter.drawImage(0, 0, cachePicture);
+            tempPainter.end();
+            cachePicture = tempPicture;
+        }
+    }
+
+    // Read JSON Stream
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,NOJSON";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    else if (picStream->read(4) != QByteArray("JSON"))
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,CTJSON";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray jsonRawContent = picStream->read(jsonStreamLength);
+    jsonStr = getSnapmaticJSONString(jsonRawContent);
+    parseJsonContent(); // JSON parsing is own function
+
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,NOTITL";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    else if (picStream->read(4) != QByteArray("TITL"))
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,CTTITL";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray titlRawContent = picStream->read(tideStreamLength);
+    titlStr = getSnapmaticTIDEString(titlRawContent);
+
+    if (!picStream->isReadable())
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,NODESC";
+        picStream->close();
+        delete picStream;
+        return picOk;
+    }
+    else if (picStream->read(4) != QByteArray("DESC"))
+    {
+        lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,CTDESC";
+        picStream->close();
+        delete picStream;
+        return false;
+    }
+    QByteArray descRawContent = picStream->read(tideStreamLength);
+    descStr = getSnapmaticTIDEString(descRawContent);
+
+    updateStrings();
+
+    picStream->close();
+    delete picStream;
+
+    if (!writeEnabled) { rawPicContent.clear(); }
+    else if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+
+    emit loaded();
+    return picOk;
+}
+
+QString SnapmaticPicture::getSnapmaticHeaderString(const QByteArray &snapmaticHeader)
+{
+    QList<QByteArray> snapmaticBytesList = snapmaticHeader.left(snapmaticUsefulLength).split('\x01');
+    if (snapmaticBytesList.length() < 2) { return QLatin1String("MALFORMED"); }
+    QByteArray snapmaticBytes = snapmaticBytesList.at(1);
+    return StringParser::parseTitleString(snapmaticBytes, snapmaticBytes.length());
+}
+
+QString SnapmaticPicture::getSnapmaticJSONString(const QByteArray &jsonBytes)
+{
+    QByteArray jsonUsefulBytes = jsonBytes;
+    jsonUsefulBytes.replace('\x00', QString());
+    jsonUsefulBytes.replace('\x0c', QString());
+    return QString::fromUtf8(jsonUsefulBytes.trimmed());
+}
+
+QString SnapmaticPicture::getSnapmaticTIDEString(const QByteArray &tideBytes)
+{
+    QByteArray tideUsefulBytes = tideBytes;
+    tideUsefulBytes.remove(0,4);
+    QList<QByteArray> tideUsefulBytesList = tideUsefulBytes.split('\x00');
+    return QString::fromUtf8(tideUsefulBytesList.at(0).trimmed());
+}
+
+void SnapmaticPicture::updateStrings()
+{
+    QString cmpPicTitl = titlStr;
+    cmpPicTitl.replace('\"', "''");
+    cmpPicTitl.replace(' ', '_');
+    cmpPicTitl.replace(':', '-');
+    cmpPicTitl.remove('\\');
+    cmpPicTitl.remove('{');
+    cmpPicTitl.remove('}');
+    cmpPicTitl.remove('/');
+    cmpPicTitl.remove('<');
+    cmpPicTitl.remove('>');
+    cmpPicTitl.remove('*');
+    cmpPicTitl.remove('?');
+    cmpPicTitl.remove('.');
+    pictureStr = tr("PHOTO - %1").arg(localSpJson.createdDateTime.toString("MM/dd/yy HH:mm:ss"));
+    sortStr = localSpJson.createdDateTime.toString("yyMMddHHmmss") % QString::number(localSpJson.uid);
+    QString exportStr = localSpJson.createdDateTime.toString("yyyyMMdd") % "-" % QString::number(localSpJson.uid);
+    picExportFileName = exportStr % "_" % cmpPicTitl;
+}
+
+bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
+{
+    if (!fileName.isEmpty())
+    {
+        picFilePath = fileName;
+        return readingPicture(writeEnabled_, cacheEnabled_, fastLoad, lowRamMode_);
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool SnapmaticPicture::setImage(const QImage &picture)
+{
+    if (writeEnabled)
+    {
+        QImage altPicture;
+        bool useAltPicture = false;
+        if (picture.size() != snapmaticResolution && careSnapDefault)
+        {
+            altPicture = picture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+            useAltPicture = true;
+        }
+        QByteArray picByteArray;
+        int comLvl = 100;
+        bool saveSuccess = false;
+        while (comLvl != 0 && !saveSuccess)
+        {
+            QByteArray picByteArrayT;
+            QBuffer picStreamT(&picByteArrayT);
+            picStreamT.open(QIODevice::WriteOnly);
+            if (useAltPicture) { saveSuccess = altPicture.save(&picStreamT, "JPEG", comLvl); }
+            else { saveSuccess = picture.save(&picStreamT, "JPEG", comLvl); }
+            picStreamT.close();
+            if (saveSuccess)
+            {
+                if (picByteArrayT.length() > jpegRawContentSize)
+                {
+                    comLvl--;
+                    saveSuccess = false;
+                }
+                else
+                {
+                    picByteArray = picByteArrayT;
+                }
+            }
+        }
+        if (saveSuccess) { return setPictureStream(picByteArray); }
+    }
+    return false;
+}
+
+bool SnapmaticPicture::setPictureStream(const QByteArray &picByteArray_) // clean method
+{
+    if (writeEnabled)
+    {
+        bool customEOI = false;
+        QByteArray picByteArray = picByteArray_;
+        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
+        QBuffer snapmaticStream(&rawPicContent);
+        snapmaticStream.open(QIODevice::ReadWrite);
+        if (!snapmaticStream.seek(jpegStreamEditorBegin)) return false;
+        if (picByteArray.length() > jpegPicStreamLength) return false;
+        if (picByteArray.length() < jpegRawContentSize && jpegRawContentSize + 4 < jpegPicStreamLength)
+        {
+            customEOI = true;
+        }
+        while (picByteArray.length() != jpegPicStreamLength)
+        {
+            picByteArray += '\x00';
+        }
+        if (customEOI)
+        {
+            picByteArray.replace(jpegRawContentSize, 4, "\xFF\x45\x4F\x49");
+        }
+        int result = snapmaticStream.write(picByteArray);
+        snapmaticStream.close();
+        if (result != 0)
+        {
+            if (cacheEnabled)
+            {
+                QImage replacedPicture;
+                replacedPicture.loadFromData(picByteArray);
+                cachePicture = replacedPicture;
+            }
+            if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+            return true;
+        }
+        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+        return false;
+    }
+    return false;
+}
+
+bool SnapmaticPicture::setPictureTitl(const QString &newTitle_)
+{
+    if (writeEnabled)
+    {
+        QString newTitle = newTitle_;
+        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
+        QBuffer snapmaticStream(&rawPicContent);
+        snapmaticStream.open(QIODevice::ReadWrite);
+        if (!snapmaticStream.seek(titlStreamEditorBegin)) return false;
+        if (newTitle.length() > titlStreamCharacterMax)
+        {
+            newTitle = newTitle.left(titlStreamCharacterMax);
+        }
+        QByteArray newTitleArray = newTitle.toUtf8();
+        while (newTitleArray.length() != titlStreamEditorLength)
+        {
+            newTitleArray += '\x00';
+        }
+        int result = snapmaticStream.write(newTitleArray);
+        snapmaticStream.close();
+        if (result != 0)
+        {
+            titlStr = newTitle;
+            if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+            return true;
+        }
+        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+        return false;
+    }
+    return false;
+}
+
+QString SnapmaticPicture::getExportPictureFileName()
+{
+    return picExportFileName;
+}
+
+QString SnapmaticPicture::getPictureFileName()
+{
+    return picFileName;
+}
+
+QString SnapmaticPicture::getPictureFilePath()
+{
+    return picFilePath;
+}
+
+QString SnapmaticPicture::getPictureSortStr()
+{
+    return sortStr;
+}
+
+QString SnapmaticPicture::getPictureDesc()
+{
+    return descStr;
+}
+
+QString SnapmaticPicture::getPictureTitl()
+{
+    return titlStr;
+}
+
+QString SnapmaticPicture::getPictureHead()
+{
+    return pictureHead;
+}
+
+QString SnapmaticPicture::getPictureStr()
+{
+    return pictureStr;
+}
+
+QString SnapmaticPicture::getLastStep()
+{
+    return lastStep;
+}
+
+QImage SnapmaticPicture::getImage(bool fastLoad)
+{
+    if (cacheEnabled)
+    {
+        return cachePicture;
+    }
+    else if (writeEnabled)
+    {
+        bool fastLoadU = fastLoad;
+        if (!careSnapDefault) { fastLoadU = true; }
+
+        bool returnOk = false;
+        QImage tempPicture;
+        QImage returnPicture;
+        if (!fastLoadU)
+        {
+            returnPicture = QImage(snapmaticResolution, QImage::Format_RGB888);
+        }
+
+        if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
+        QBuffer snapmaticStream(&rawPicContent);
+        snapmaticStream.open(QIODevice::ReadOnly);
+        if (snapmaticStream.seek(jpegStreamEditorBegin))
+        {
+            QByteArray jpegRawContent = snapmaticStream.read(jpegPicStreamLength);
+            returnOk = tempPicture.loadFromData(jpegRawContent, "JPEG");
+        }
+        snapmaticStream.close();
+        if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+
+        if (returnOk)
+        {
+            if (!fastLoadU)
+            {
+                QPainter returnPainter(&returnPicture);
+                if (tempPicture.size() != snapmaticResolution)
+                {
+                    returnPainter.drawImage(0, 0, tempPicture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+                }
+                else
+                {
+                    returnPainter.drawImage(0, 0, tempPicture);
+                }
+                returnPainter.end();
+                return returnPicture;
+            }
+            else
+            {
+                return tempPicture;
+            }
+        }
+    }
+    else
+    {
+        bool fastLoadU = fastLoad;
+        if (!careSnapDefault) { fastLoadU = true; }
+
+        bool returnOk = false;
+        QImage tempPicture;
+        QImage returnPicture;
+        if (!fastLoadU)
+        {
+            returnPicture = QImage(snapmaticResolution, QImage::Format_RGB888);
+        }
+        QIODevice *picStream;
+
+        QFile *picFile = new QFile(picFilePath);
+        if (!picFile->open(QFile::ReadOnly))
+        {
+            lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
+            delete picFile;
+            return QImage();
+        }
+        rawPicContent = picFile->read(snapmaticFileMaxSize);
+        picFile->close();
+        delete picFile;
+
+        picStream = new QBuffer(&rawPicContent);
+        picStream->open(QIODevice::ReadWrite);
+        if (picStream->seek(jpegStreamEditorBegin))
+        {
+            QByteArray jpegRawContent = picStream->read(jpegPicStreamLength);
+            returnOk = tempPicture.loadFromData(jpegRawContent, "JPEG");
+        }
+        picStream->close();
+        delete picStream;
+
+        if (returnOk)
+        {
+            if (!fastLoadU)
+            {
+                QPainter returnPainter(&returnPicture);
+                if (tempPicture.size() != snapmaticResolution)
+                {
+                    returnPainter.drawImage(0, 0, tempPicture.scaled(snapmaticResolution, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+                }
+                else
+                {
+                    returnPainter.drawImage(0, 0, tempPicture);
+                }
+                returnPainter.end();
+                return returnPicture;
+            }
+            else
+            {
+                return tempPicture;
+            }
+        }
+    }
+    return QImage();
+}
+
+int SnapmaticPicture::getContentMaxLength()
+{
+    return jpegRawContentSize;
+}
+
+bool SnapmaticPicture::isPicOk()
+{
+    return picOk;
+}
+
+void SnapmaticPicture::clearCache()
+{
+    cacheEnabled = false;
+    cachePicture = QImage();
+}
+
+void SnapmaticPicture::emitUpdate()
+{
+    emit updated();
+}
+
+// JSON part
+
+bool SnapmaticPicture::isJsonOk()
+{
+    return jsonOk;
+}
+
+QString SnapmaticPicture::getJsonStr()
+{
+    return jsonStr;
+}
+
+SnapmaticProperties SnapmaticPicture::getSnapmaticProperties()
+{
+    return localSpJson;
+}
+
+void SnapmaticPicture::parseJsonContent()
+{
+    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonStr.toUtf8());
+    QJsonObject jsonObject = jsonDocument.object();
+    QVariantMap jsonMap = jsonObject.toVariantMap(); // backward compatibility
+
+    if (jsonObject.contains("loc"))
+    {
+        QJsonObject locObject = jsonObject["loc"].toObject();
+        if (locObject.contains("x")) { localSpJson.location.x = locObject["x"].toDouble(); }
+        if (locObject.contains("y")) { localSpJson.location.y = locObject["y"].toDouble(); }
+        if (locObject.contains("z")) { localSpJson.location.z = locObject["z"].toDouble(); }
+    }
+    if (jsonObject.contains("uid"))
+    {
+        localSpJson.uid = jsonObject["uid"].toInt();
+    }
+    if (jsonObject.contains("area"))
+    {
+        localSpJson.location.area = jsonObject["area"].toString();
+    }
+    if (jsonObject.contains("crewid"))
+    {
+        localSpJson.crewID = jsonObject["crewid"].toInt();
+    }
+    if (jsonObject.contains("creat"))
+    {
+        QDateTime createdTimestamp;
+        localSpJson.createdTimestamp = jsonMap["creat"].toUInt();
+        createdTimestamp.setTime_t(localSpJson.createdTimestamp);
+        localSpJson.createdDateTime = createdTimestamp;
+    }
+    if (jsonObject.contains("plyrs"))
+    {
+        localSpJson.playersList = jsonMap["plyrs"].toStringList();
+    }
+    if (jsonObject.contains("meme"))
+    {
+        localSpJson.isMeme = jsonObject["meme"].toBool();
+    }
+    if (jsonObject.contains("mug"))
+    {
+        localSpJson.isMug = jsonObject["mug"].toBool();
+    }
+    if (jsonObject.contains("slf"))
+    {
+        localSpJson.isSelfie = jsonObject["slf"].toBool();
+    }
+    if (jsonObject.contains("drctr"))
+    {
+        localSpJson.isFromDirector = jsonObject["drctr"].toBool();
+    }
+    if (jsonObject.contains("rsedtr"))
+    {
+        localSpJson.isFromRSEditor = jsonObject["rsedtr"].toBool();
+    }
+
+    jsonOk = true;
+}
+
+bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson)
+{
+    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonStr.toUtf8());
+    QJsonObject jsonObject = jsonDocument.object();
+
+    QJsonObject locObject;
+    locObject["x"] = newSpJson.location.x;
+    locObject["y"] = newSpJson.location.y;
+    locObject["z"] = newSpJson.location.z;
+
+    jsonObject["loc"] = locObject;
+    jsonObject["uid"] = newSpJson.uid;
+    jsonObject["area"] = newSpJson.location.area;
+    jsonObject["crewid"] = newSpJson.crewID;
+    jsonObject["creat"] = QJsonValue::fromVariant(newSpJson.createdTimestamp);
+    jsonObject["plyrs"] = QJsonValue::fromVariant(newSpJson.playersList);
+    jsonObject["meme"] = newSpJson.isMeme;
+    jsonObject["mug"] = newSpJson.isMug;
+    jsonObject["slf"] = newSpJson.isSelfie;
+    jsonObject["drctr"] = newSpJson.isFromDirector;
+    jsonObject["rsedtr"] = newSpJson.isFromRSEditor;
+
+    jsonDocument.setObject(jsonObject);
+
+    if (setJsonStr(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Compact))))
+    {
+        localSpJson = newSpJson;
+        return true;
+    }
+    return false;
+}
+
+bool SnapmaticPicture::setJsonStr(const QString &newJsonStr)
+{
+    if (newJsonStr.length() < jsonStreamEditorLength)
+    {
+        if (writeEnabled)
+        {
+            QByteArray jsonByteArray = newJsonStr.toUtf8();
+            while (jsonByteArray.length() != jsonStreamEditorLength)
+            {
+                jsonByteArray += '\x00';
+            }
+            if (lowRamMode) { rawPicContent = qUncompress(rawPicContent); }
+            QBuffer snapmaticStream(&rawPicContent);
+            snapmaticStream.open(QIODevice::ReadWrite);
+            if (!snapmaticStream.seek(jsonStreamEditorBegin))
+            {
+                snapmaticStream.close();
+                return false;
+            }
+            int result = snapmaticStream.write(jsonByteArray);
+            snapmaticStream.close();
+            if (result != 0)
+            {
+                jsonStr = newJsonStr;
+                if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+                return true;
+            }
+            else
+            {
+                if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
+                return false;
+            }
+        }
+        else
+        {
+            return false;
+        }
+    }
+    return false;
+}
+
+// FILE MANAGEMENT
+
+bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat format_)
+{
+    // Keep current format when Auto_Format is used
+    SnapmaticFormat format = format_;
+    if (format_ == SnapmaticFormat::Auto_Format)
+    {
+        if (isCustomFormat)
+        {
+            format = SnapmaticFormat::G5E_Format;
+        }
+        else
+        {
+            format = SnapmaticFormat::PGTA_Format;
+        }
+    }
+
+    QFile *picFile = new QFile(fileName);
+    if (picFile->open(QIODevice::WriteOnly))
+    {
+        if (format == SnapmaticFormat::G5E_Format)
+        {
+            // Modern compressed export
+            QByteArray stockFileNameUTF8 = picFileName.toUtf8();
+            QByteArray numberLength = QByteArray::number(stockFileNameUTF8.length());
+            if (numberLength.length() == 1)
+            {
+                numberLength.insert(0, '0');
+            }
+            else if (numberLength.length() != 2)
+            {
+                numberLength = "00";
+            }
+            QByteArray g5eHeader;
+            g5eHeader.reserve(stockFileNameUTF8.length() + 16);
+            g5eHeader += '\x00'; // First Null Byte
+            g5eHeader += QByteArray("G5E"); // GTA 5 Export
+            g5eHeader += '\x10'; g5eHeader += '\x00'; // 2 byte GTA 5 Export Version
+            g5eHeader += QByteArray("LEN"); // Before Length
+            g5eHeader += QByteArray::fromHex(numberLength); // Length in HEX before Compressed
+            g5eHeader += QByteArray("FIL"); // Before File Name
+            g5eHeader += stockFileNameUTF8; // File Name
+            g5eHeader += QByteArray("COM"); // Before Compressed
+            picFile->write(g5eHeader);
+            if (!lowRamMode)
+            {
+                picFile->write(qCompress(rawPicContent, 9)); // Compressed Snapmatic
+            }
+            else
+            {
+                picFile->write(rawPicContent);
+            }
+            picFile->close();
+            delete picFile;
+        }
+        else if (format == SnapmaticFormat::JPEG_Format)
+        {
+            // JPEG export
+            QBuffer snapmaticStream(&rawPicContent);
+            snapmaticStream.open(QIODevice::ReadOnly);
+            if (snapmaticStream.seek(jpegStreamEditorBegin))
+            {
+                QByteArray jpegRawContent = snapmaticStream.read(jpegPicStreamLength);
+                if (jpegRawContentSizeE != 0)
+                {
+                    jpegRawContent = jpegRawContent.left(jpegRawContentSizeE);
+                }
+                picFile->write(jpegRawContent);
+            }
+            picFile->close();
+            delete picFile;
+        }
+        else
+        {
+            // Classic straight export
+            if (!lowRamMode)
+            {
+                picFile->write(rawPicContent);
+            }
+            else
+            {
+                picFile->write(qUncompress(rawPicContent));
+            }
+            picFile->close();
+            delete picFile;
+        }
+        return true;
+    }
+    else
+    {
+        delete picFile;
+        return false;
+    }
+}
+
+void SnapmaticPicture::setPicFileName(const QString &picFileName_)
+{
+    picFileName = picFileName_;
+}
+
+void SnapmaticPicture::setPicFilePath(const QString &picFilePath_)
+{
+    picFilePath = picFilePath_;
+}
+
+bool SnapmaticPicture::deletePicFile()
+{
+    if (!QFile::exists(picFilePath)) return true;
+    if (QFile::remove(picFilePath)) return true;
+    return false;
+}
+
+// VISIBILITY
+
+bool SnapmaticPicture::isHidden()
+{
+    if (picFilePath.right(7) == QLatin1String(".hidden"))
+    {
+        return true;
+    }
+    return false;
+}
+
+bool SnapmaticPicture::setPictureHidden()
+{
+    if (isCustomFormat)
+    {
+        return false;
+    }
+    if (!isHidden())
+    {
+        QString newPicFilePath = QString(picFilePath % ".hidden");
+        if (QFile::rename(picFilePath, newPicFilePath))
+        {
+            picFilePath = newPicFilePath;
+            return true;
+        }
+        return false;
+    }
+    return true;
+}
+
+bool SnapmaticPicture::setPictureVisible()
+{
+    if (isCustomFormat)
+    {
+        return false;
+    }
+    if (isHidden())
+    {
+        QString newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 7, 7);
+        if (QFile::rename(picFilePath, newPicFilePath))
+        {
+            picFilePath = newPicFilePath;
+            return true;
+        }
+        return false;
+    }
+    return true;
+}
+
+// PREDEFINED PROPERTIES
+
+QSize SnapmaticPicture::getSnapmaticResolution()
+{
+    return snapmaticResolution;
+}
+
+// SNAPMATIC DEFAULTS
+
+bool SnapmaticPicture::isSnapmaticDefaultsEnforced()
+{
+    return careSnapDefault;
+}
+
+void SnapmaticPicture::setSnapmaticDefaultsEnforced(bool enforced)
+{
+    careSnapDefault = enforced;
+}
+
+// VERIFY CONTENT
+
+bool SnapmaticPicture::verifyTitle(const QString &title)
+{
+    // VERIFY TITLE FOR BE A VALID SNAPMATIC TITLE
+    if (title.length() <= titlStreamCharacterMax)
+    {
+        foreach(const QChar &titleChar, title)
+        {
+            if (!verifyTitleChar(titleChar)) return false;
+        }
+        return true;
+    }
+    return false;
+}
+
+bool SnapmaticPicture::verifyTitleChar(const QChar &titleChar)
+{
+    // VERIFY CHAR FOR BE A VALID SNAPMATIC CHARACTER
+    if (titleChar.isLetterOrNumber() || titleChar.isPrint())
+    {
+        if (titleChar == '<' || titleChar == '>' || titleChar == '\\') return false;
+        return true;
+    }
+    return false;
+}
diff --git a/SnapmaticPicture.h b/SnapmaticPicture.h
index ab0ba00..706dc3b 100755
--- a/SnapmaticPicture.h
+++ b/SnapmaticPicture.h
@@ -1,150 +1,158 @@
-/*****************************************************************************
-* gta5sync-spv Grand Theft Auto Snapmatic Picture Viewer
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SNAPMATICPICTURE_H
-#define SNAPMATICPICTURE_H
-
-#include <QStringList>
-#include <QDateTime>
-#include <QObject>
-#include <QString>
-#include <QImage>
-#include <QFile>
-
-struct SnapmaticProperties {
-    struct SnapmaticLocation {
-        QString area;
-        double x;
-        double y;
-        double z;
-    };
-    int uid;
-    int crewID;
-    QStringList playersList;
-    uint createdTimestamp;
-    QDateTime createdDateTime;
-    bool isMeme;
-    bool isMug;
-    bool isSelfie;
-    bool isFromDirector;
-    bool isFromRSEditor;
-    SnapmaticLocation location;
-};
-
-class SnapmaticPicture : public QObject
-{
-    Q_OBJECT
-public:
-    explicit SnapmaticPicture(const QString &fileName = "", QObject *parent = 0);
-    ~SnapmaticPicture();
-    void reset();
-    bool preloadFile();
-    bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
-    bool readingPicture(bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
-    bool isPicOk();
-    void clearCache();
-    QImage getImage();
-    QString getLastStep();
-    QString getPictureStr();
-    QString getPictureHead();
-    QString getPictureTitl();
-    QString getPictureDesc();
-    QString getPictureSortStr();
-    QString getPictureFileName();
-    QString getPictureFilePath();
-    QString getExportPictureFileName();
-    int getContentMaxLength();
-    bool setImage(const QImage &picture);
-    bool setPictureTitl(const QString &newTitle);
-    bool setPictureStream(const QByteArray &picByteArray);
-    void updateStrings();
-    void emitUpdate();
-
-    // FILE MANAGEMENT
-    bool exportPicture(const QString &fileName, const QString format = "PGTA");
-    void setPicFileName(const QString &picFileName);
-    void setPicFilePath(const QString &picFilePath);
-    bool deletePicFile();
-
-    // ALTERNATIVES
-    QString getPictureTitle() { return getPictureTitl(); }
-    QString getPictureString() { return getPictureStr(); }
-    QString getPictureDescription() { return getPictureDesc(); }
-    bool setPictureTitle(const QString &newTitle) { return setPictureTitl(newTitle); }
-
-    // JSON
-    bool isJsonOk();
-    QString getJsonStr();
-    SnapmaticProperties getSnapmaticProperties();
-    bool setSnapmaticProperties(SnapmaticProperties newSpJson);
-
-    // VISIBILITY
-    bool isHidden();
-    bool setPictureHidden();
-    bool setPictureVisible();
-
-    // PREDEFINED PROPERTIES
-    QSize getSnapmaticResolution();
-
-    // VERIFY CONTENT
-    static bool verifyTitle(const QString &title);
-
-private:
-    QString getSnapmaticHeaderString(const QByteArray &snapmaticHeader);
-    QString getSnapmaticJSONString(const QByteArray &jsonBytes);
-    QString getSnapmaticTIDEString(const QByteArray &tideBytes);
-    QImage cachePicture;
-    QString picExportFileName;
-    QString picFileName;
-    QString picFilePath;
-    QString pictureHead;
-    QString pictureStr;
-    QString lastStep;
-    QString sortStr;
-    QString titlStr;
-    QString descStr;
-    bool picOk;
-    bool lowRamMode;
-    bool writeEnabled;
-    bool cacheEnabled;
-    bool isLoadedInRAM;
-    bool isCustomFormat;
-    int jpegRawContentSize;
-    int jpegRawContentSizeE;
-
-    // PICTURE STREAM
-    QByteArray rawPicContent;
-
-    // JSON
-    void parseJsonContent();
-    bool jsonOk;
-    QString jsonStr;
-    SnapmaticProperties localSpJson;
-
-    // VERIFY CONTENT
-    static bool verifyTitleChar(const QChar &titleChar);
-
-signals:
-    void preloaded();
-    void updated();
-    void loaded();
-
-public slots:
-};
-
-#endif // SNAPMATICPICTURE_H
+/*****************************************************************************
+* gta5sync-spv Grand Theft Auto Snapmatic Picture Viewer
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SNAPMATICPICTURE_H
+#define SNAPMATICPICTURE_H
+
+#include <QStringList>
+#include <QDateTime>
+#include <QObject>
+#include <QString>
+#include <QImage>
+#include <QFile>
+
+enum class SnapmaticFormat : int { Auto_Format = 0, PGTA_Format = 1, JPEG_Format = 2, G5E_Format = 3 };
+
+struct SnapmaticProperties {
+    struct SnapmaticLocation {
+        QString area;
+        double x;
+        double y;
+        double z;
+    };
+    int uid;
+    int crewID;
+    QStringList playersList;
+    uint createdTimestamp;
+    QDateTime createdDateTime;
+    bool isMeme;
+    bool isMug;
+    bool isSelfie;
+    bool isFromDirector;
+    bool isFromRSEditor;
+    SnapmaticLocation location;
+};
+
+class SnapmaticPicture : public QObject
+{
+    Q_OBJECT
+public:
+    explicit SnapmaticPicture(const QString &fileName = "", QObject *parent = 0);
+    ~SnapmaticPicture();
+    void reset();
+    bool preloadFile();
+    bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
+    bool readingPicture(bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
+    bool isPicOk();
+    void clearCache();
+    QImage getImage(bool fastLoad = false);
+    QString getLastStep();
+    QString getPictureStr();
+    QString getPictureHead();
+    QString getPictureTitl();
+    QString getPictureDesc();
+    QString getPictureSortStr();
+    QString getPictureFileName();
+    QString getPictureFilePath();
+    QString getExportPictureFileName();
+    int getContentMaxLength();
+    bool setImage(const QImage &picture);
+    bool setPictureTitl(const QString &newTitle);
+    bool setPictureStream(const QByteArray &picByteArray);
+    void updateStrings();
+    void emitUpdate();
+
+    // FILE MANAGEMENT
+    bool exportPicture(const QString &fileName, SnapmaticFormat format = SnapmaticFormat::Auto_Format);
+    void setPicFileName(const QString &picFileName);
+    void setPicFilePath(const QString &picFilePath);
+    bool deletePicFile();
+
+    // ALTERNATIVES
+    QString getPictureTitle() { return getPictureTitl(); }
+    QString getPictureString() { return getPictureStr(); }
+    QString getPictureDescription() { return getPictureDesc(); }
+    bool setPictureTitle(const QString &newTitle) { return setPictureTitl(newTitle); }
+
+    // JSON
+    bool isJsonOk();
+    QString getJsonStr();
+    SnapmaticProperties getSnapmaticProperties();
+    bool setSnapmaticProperties(SnapmaticProperties newSpJson);
+    bool setJsonStr(const QString &jsonStr);
+
+    // VISIBILITY
+    bool isHidden();
+    bool setPictureHidden();
+    bool setPictureVisible();
+
+    // PREDEFINED PROPERTIES
+    QSize getSnapmaticResolution();
+
+    // SNAPMATIC DEFAULTS
+    bool isSnapmaticDefaultsEnforced();
+    void setSnapmaticDefaultsEnforced(bool enforced);
+
+    // VERIFY CONTENT
+    static bool verifyTitle(const QString &title);
+
+private:
+    QString getSnapmaticHeaderString(const QByteArray &snapmaticHeader);
+    QString getSnapmaticJSONString(const QByteArray &jsonBytes);
+    QString getSnapmaticTIDEString(const QByteArray &tideBytes);
+    QImage cachePicture;
+    QString picExportFileName;
+    QString picFileName;
+    QString picFilePath;
+    QString pictureHead;
+    QString pictureStr;
+    QString lastStep;
+    QString sortStr;
+    QString titlStr;
+    QString descStr;
+    bool picOk;
+    bool lowRamMode;
+    bool writeEnabled;
+    bool cacheEnabled;
+    bool isLoadedInRAM;
+    bool isCustomFormat;
+    bool careSnapDefault;
+    int jpegRawContentSize;
+    int jpegRawContentSizeE;
+
+    // PICTURE STREAM
+    QByteArray rawPicContent;
+
+    // JSON
+    void parseJsonContent();
+    bool jsonOk;
+    QString jsonStr;
+    SnapmaticProperties localSpJson;
+
+    // VERIFY CONTENT
+    static bool verifyTitleChar(const QChar &titleChar);
+
+signals:
+    void preloaded();
+    void updated();
+    void loaded();
+
+public slots:
+};
+
+#endif // SNAPMATICPICTURE_H
diff --git a/SnapmaticWidget.cpp b/SnapmaticWidget.cpp
index ddb9b73..dd5ca98 100755
--- a/SnapmaticWidget.cpp
+++ b/SnapmaticWidget.cpp
@@ -1,345 +1,331 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SnapmaticWidget.h"
-#include "ui_SnapmaticWidget.h"
-#include "SnapmaticPicture.h"
-#include "SnapmaticEditor.h"
-#include "DatabaseThread.h"
-#include "PictureDialog.h"
-#include "PictureExport.h"
-#include "StringParser.h"
-#include "AppEnv.h"
-#include "config.h"
-#include <QMessageBox>
-#include <QPixmap>
-#include <QTimer>
-#include <QDebug>
-#include <QMenu>
-#include <QFile>
-
-SnapmaticWidget::SnapmaticWidget(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) :
-    ProfileWidget(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB),
-    ui(new Ui::SnapmaticWidget)
-{
-    ui->setupUi(this);
-    ui->cmdView->setVisible(false);
-    ui->cmdCopy->setVisible(false);
-    ui->cmdExport->setVisible(false);
-    ui->cmdDelete->setVisible(false);
-    ui->cbSelected->setVisible(false);
-
-    QPalette palette;
-    highlightBackColor = palette.highlight().color();
-    highlightTextColor = palette.highlightedText().color();
-    palette.setCurrentColorGroup(QPalette::Disabled);
-    highlightHiddenColor = palette.text().color();
-
-    picPath = "";
-    picStr = "";
-    smpic = 0;
-
-    installEventFilter(this);
-}
-
-SnapmaticWidget::~SnapmaticWidget()
-{
-    delete ui;
-}
-
-bool SnapmaticWidget::eventFilter(QObject *obj, QEvent *ev)
-{
-    if (obj == this)
-    {
-        if (ev->type() == QEvent::Enter)
-        {
-            setStyleSheet(QString("QFrame#SnapmaticFrame{background-color: rgb(%1, %2, %3)}QLabel#labPicStr{color: rgb(%4, %5, %6)}").arg(QString::number(highlightBackColor.red()), QString::number(highlightBackColor.green()), QString::number(highlightBackColor.blue()), QString::number(highlightTextColor.red()), QString::number(highlightTextColor.green()), QString::number(highlightTextColor.blue())));
-            return true;
-        }
-        else if(ev->type() == QEvent::Leave)
-        {
-            setStyleSheet("");
-            return true;
-        }
-    }
-    return false;
-}
-
-void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture)
-{
-    smpic = picture;
-    picPath = picture->getPictureFilePath();
-    picTitl = picture->getPictureTitl();
-    picStr = picture->getPictureStr();
-    QObject::connect(picture, SIGNAL(updated()), this, SLOT(snapmaticUpdated()));
-
-    qreal screenRatio = AppEnv::screenRatio();
-    ui->labPicture->setFixedSize(48 * screenRatio, 27 * screenRatio);
-
-    QPixmap SnapmaticPixmap = QPixmap::fromImage(picture->getImage().scaled(ui->labPicture->width(), ui->labPicture->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation), Qt::AutoColor);
-    ui->labPicStr->setText(picStr + "\n" + picTitl + "");
-    ui->labPicture->setPixmap(SnapmaticPixmap);
-
-    picture->clearCache();
-
-    adjustTextColor();
-}
-
-void SnapmaticWidget::snapmaticUpdated()
-{
-    // Current only strings get updated
-    picPath = smpic->getPictureFilePath();
-    picTitl = smpic->getPictureTitl();
-    picStr = smpic->getPictureStr();
-    ui->labPicStr->setText(picStr + "\n" + picTitl + "");
-}
-
-void SnapmaticWidget::on_cmdView_clicked()
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("Interface");
-    bool navigationBar = settings.value("NavigationBar", false).toBool();
-    settings.endGroup();
-
-    PictureDialog *picDialog = new PictureDialog(profileDB, crewDB, this);
-    picDialog->setSnapmaticPicture(smpic, true);
-    picDialog->setModal(true);
-
-    // be ready for playerName updated
-    QObject::connect(threadDB, SIGNAL(playerNameUpdated()), picDialog, SLOT(playerNameUpdated()));
-    QObject::connect(picDialog, SIGNAL(nextPictureRequested()), this, SLOT(dialogNextPictureRequested()));
-    QObject::connect(picDialog, SIGNAL(previousPictureRequested()), this, SLOT(dialogPreviousPictureRequested()));
-
-    // add previous next buttons
-    if (navigationBar) picDialog->addPreviousNextButtons();
-
-    // show picture dialog
-#ifdef Q_OS_ANDROID
-    // Android ...
-    picDialog->showMaximized();
-#else
-    picDialog->show();
-    if (navigationBar) picDialog->stylizeDialog();
-    //picDialog->adaptNewDialogSize();
-    picDialog->setMinimumSize(picDialog->size());
-    picDialog->setMaximumSize(picDialog->size());
-#endif
-    picDialog->exec();
-    delete picDialog;
-}
-
-void SnapmaticWidget::on_cmdCopy_clicked()
-{
-    PictureExport::exportAsSnapmatic(this, smpic);
-}
-
-void SnapmaticWidget::on_cmdExport_clicked()
-{
-    PictureExport::exportAsPicture(this, smpic);
-}
-
-void SnapmaticWidget::on_cmdDelete_clicked()
-{
-    if (deletePicture()) emit pictureDeleted();
-}
-
-bool SnapmaticWidget::deletePicture()
-{
-    int uchoice = QMessageBox::question(this, tr("Delete picture"), tr("Are you sure to delete %1 from your Snapmatic pictures?").arg("\""+picStr+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
-    if (uchoice == QMessageBox::Yes)
-    {
-        if (smpic->deletePicFile())
-        {
-            return true;
-        }
-        else
-        {
-            QMessageBox::warning(this, tr("Delete picture"), tr("Failed at deleting %1 from your Snapmatic pictures").arg("\""+picStr+"\""));
-        }
-    }
-    return false;
-}
-
-void SnapmaticWidget::mousePressEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mousePressEvent(ev);
-}
-
-void SnapmaticWidget::mouseReleaseEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mouseReleaseEvent(ev);
-    if (ui->cbSelected->isVisible())
-    {
-        if (rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
-        {
-            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
-        }
-    }
-    else
-    {
-        if (getContentMode() == 0 && rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
-        {
-            on_cmdView_clicked();
-        }
-    }
-}
-
-void SnapmaticWidget::mouseDoubleClickEvent(QMouseEvent *ev)
-{
-    ProfileWidget::mouseDoubleClickEvent(ev);
-
-    if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton)
-    {
-        on_cmdView_clicked();
-    }
-}
-
-void SnapmaticWidget::setSelected(bool isSelected)
-{
-    ui->cbSelected->setChecked(isSelected);
-}
-
-void SnapmaticWidget::pictureSelected()
-{
-    setSelected(!ui->cbSelected->isChecked());
-}
-
-void SnapmaticWidget::contextMenuEvent(QContextMenuEvent *ev)
-{
-    emit contextMenuTriggered(ev);
-}
-
-void SnapmaticWidget::dialogNextPictureRequested()
-{
-    emit nextPictureRequested((QWidget*)sender());
-}
-
-void SnapmaticWidget::dialogPreviousPictureRequested()
-{
-    emit previousPictureRequested((QWidget*)sender());
-}
-
-void SnapmaticWidget::on_cbSelected_stateChanged(int arg1)
-{
-    if (arg1 == Qt::Checked)
-    {
-        emit widgetSelected();
-    }
-    else if (arg1 == Qt::Unchecked)
-    {
-        emit widgetDeselected();
-    }
-}
-
-void SnapmaticWidget::adjustTextColor()
-{
-    if (isHidden())
-    {
-        ui->labPicStr->setStyleSheet(QString("QLabel{color: rgb(%1, %2, %3);}").arg(QString::number(highlightHiddenColor.red()), QString::number(highlightHiddenColor.green()), QString::number(highlightHiddenColor.blue())));
-    }
-    else
-    {
-        ui->labPicStr->setStyleSheet("");
-    }
-}
-
-bool SnapmaticWidget::makePictureHidden()
-{
-    if (smpic->setPictureHidden())
-    {
-        picPath = smpic->getPictureFilePath();
-        adjustTextColor();
-        return true;
-    }
-    return false;
-}
-
-bool SnapmaticWidget::makePictureVisible()
-{
-    if (smpic->setPictureVisible())
-    {
-        picPath = smpic->getPictureFilePath();
-        adjustTextColor();
-        return true;
-    }
-    return false;
-}
-
-void SnapmaticWidget::makePictureHiddenSlot()
-{
-    makePictureHidden();
-}
-
-void SnapmaticWidget::makePictureVisibleSlot()
-{
-    makePictureVisible();
-}
-
-void SnapmaticWidget::editSnapmaticProperties()
-{
-    SnapmaticEditor *snapmaticEditor = new SnapmaticEditor(crewDB, this);
-    snapmaticEditor->setWindowFlags(snapmaticEditor->windowFlags()^Qt::WindowContextHelpButtonHint);
-    snapmaticEditor->setSnapmaticPicture(smpic);
-    snapmaticEditor->setModal(true);
-    snapmaticEditor->exec();
-    delete snapmaticEditor;
-}
-
-bool SnapmaticWidget::isSelected()
-{
-    return ui->cbSelected->isChecked();
-}
-
-bool SnapmaticWidget::isHidden()
-{
-    if (picPath.right(7) == ".hidden")
-    {
-        return true;
-    }
-    return false;
-}
-
-void SnapmaticWidget::setSelectionMode(bool selectionMode)
-{
-    ui->cbSelected->setVisible(selectionMode);
-}
-
-void SnapmaticWidget::selectAllWidgets()
-{
-    emit allWidgetsSelected();
-}
-
-void SnapmaticWidget::deselectAllWidgets()
-{
-    emit allWidgetsDeselected();
-}
-
-SnapmaticPicture* SnapmaticWidget::getPicture()
-{
-    return smpic;
-}
-
-QString SnapmaticWidget::getPicturePath()
-{
-    return picPath;
-}
-
-QString SnapmaticWidget::getWidgetType()
-{
-    return "SnapmaticWidget";
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "SnapmaticWidget.h"
+#include "ui_SnapmaticWidget.h"
+#include "SnapmaticPicture.h"
+#include "SnapmaticEditor.h"
+#include "DatabaseThread.h"
+#include "PictureDialog.h"
+#include "PictureExport.h"
+#include "StringParser.h"
+#include "AppEnv.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QMessageBox>
+#include <QPixmap>
+#include <QTimer>
+#include <QDebug>
+#include <QMenu>
+#include <QFile>
+
+SnapmaticWidget::SnapmaticWidget(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) :
+    ProfileWidget(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB),
+    ui(new Ui::SnapmaticWidget)
+{
+    ui->setupUi(this);
+    ui->cmdView->setVisible(false);
+    ui->cmdCopy->setVisible(false);
+    ui->cmdExport->setVisible(false);
+    ui->cmdDelete->setVisible(false);
+    ui->cbSelected->setVisible(false);
+
+    QPalette palette;
+    palette.setCurrentColorGroup(QPalette::Disabled);
+    highlightHiddenColor = palette.text().color();
+
+    ui->SnapmaticFrame->setMouseTracking(true);
+    ui->labPicture->setMouseTracking(true);
+    ui->labPicStr->setMouseTracking(true);
+    ui->cbSelected->setMouseTracking(true);
+    smpic = nullptr;
+}
+
+SnapmaticWidget::~SnapmaticWidget()
+{
+    delete ui;
+}
+
+void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture)
+{
+    smpic = picture;
+    QObject::connect(picture, SIGNAL(updated()), this, SLOT(snapmaticUpdated()));
+
+    qreal screenRatio = AppEnv::screenRatio();
+    ui->labPicture->setFixedSize(48 * screenRatio, 27 * screenRatio);
+
+    QPixmap SnapmaticPixmap = QPixmap::fromImage(picture->getImage().scaled(ui->labPicture->width(), ui->labPicture->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation), Qt::AutoColor);
+    ui->labPicStr->setText(smpic->getPictureStr() % "\n" % smpic->getPictureTitl() % "");
+    ui->labPicture->setPixmap(SnapmaticPixmap);
+
+    picture->clearCache();
+
+    adjustTextColor();
+}
+
+void SnapmaticWidget::snapmaticUpdated()
+{
+    ui->labPicStr->setText(smpic->getPictureStr() % "\n" % smpic->getPictureTitl() % "");
+}
+
+void SnapmaticWidget::retranslate()
+{
+    smpic->updateStrings();
+    ui->labPicStr->setText(smpic->getPictureStr() % "\n" % smpic->getPictureTitl() % "");
+}
+
+void SnapmaticWidget::on_cmdView_clicked()
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("Interface");
+    bool navigationBar = settings.value("NavigationBar", false).toBool();
+    settings.endGroup();
+
+    PictureDialog *picDialog = new PictureDialog(profileDB, crewDB, this);
+    picDialog->setSnapmaticPicture(smpic, true);
+    picDialog->setModal(true);
+
+    // be ready for crewName and playerName updated
+    QObject::connect(threadDB, SIGNAL(crewNameUpdated()), picDialog, SLOT(crewNameUpdated()));
+    QObject::connect(threadDB, SIGNAL(playerNameUpdated()), picDialog, SLOT(playerNameUpdated()));
+    QObject::connect(picDialog, SIGNAL(nextPictureRequested()), this, SLOT(dialogNextPictureRequested()));
+    QObject::connect(picDialog, SIGNAL(previousPictureRequested()), this, SLOT(dialogPreviousPictureRequested()));
+
+    // add previous next buttons
+    if (navigationBar) picDialog->addPreviousNextButtons();
+
+    // show picture dialog
+#ifdef Q_OS_ANDROID
+    // Android ...
+    picDialog->showMaximized();
+#else
+    picDialog->show();
+    if (navigationBar) picDialog->stylizeDialog();
+    //picDialog->adaptNewDialogSize();
+    picDialog->setMinimumSize(picDialog->size());
+    picDialog->setMaximumSize(picDialog->size());
+#endif
+    picDialog->exec();
+    delete picDialog;
+}
+
+void SnapmaticWidget::on_cmdCopy_clicked()
+{
+    PictureExport::exportAsSnapmatic(this, smpic);
+}
+
+void SnapmaticWidget::on_cmdExport_clicked()
+{
+    PictureExport::exportAsPicture(this, smpic);
+}
+
+void SnapmaticWidget::on_cmdDelete_clicked()
+{
+    if (deletePicture()) emit pictureDeleted();
+}
+
+bool SnapmaticWidget::deletePicture()
+{
+    int uchoice = QMessageBox::question(this, tr("Delete picture"), tr("Are you sure to delete %1 from your Snapmatic pictures?").arg("\""+smpic->getPictureStr()+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+    if (uchoice == QMessageBox::Yes)
+    {
+        if (smpic->deletePicFile())
+        {
+            return true;
+        }
+        else
+        {
+            QMessageBox::warning(this, tr("Delete picture"), tr("Failed at deleting %1 from your Snapmatic pictures").arg("\""+smpic->getPictureStr()+"\""));
+        }
+    }
+    return false;
+}
+
+void SnapmaticWidget::mousePressEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mousePressEvent(ev);
+}
+
+void SnapmaticWidget::mouseReleaseEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mouseReleaseEvent(ev);
+    if (ui->cbSelected->isVisible())
+    {
+        if (rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
+        {
+            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+        }
+    }
+    else
+    {
+        if (getContentMode() == 0 && rect().contains(ev->pos()) && ev->button() == Qt::LeftButton)
+        {
+            if (ev->modifiers().testFlag(Qt::ShiftModifier))
+            {
+                ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+            }
+            else
+            {
+                on_cmdView_clicked();
+            }
+        }
+        else if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton && ev->modifiers().testFlag(Qt::ShiftModifier))
+        {
+            ui->cbSelected->setChecked(!ui->cbSelected->isChecked());
+        }
+    }
+}
+
+void SnapmaticWidget::mouseDoubleClickEvent(QMouseEvent *ev)
+{
+    ProfileWidget::mouseDoubleClickEvent(ev);
+
+    if (!ui->cbSelected->isVisible() && getContentMode() == 1 && ev->button() == Qt::LeftButton)
+    {
+        on_cmdView_clicked();
+    }
+}
+
+void SnapmaticWidget::setSelected(bool isSelected)
+{
+    ui->cbSelected->setChecked(isSelected);
+}
+
+void SnapmaticWidget::pictureSelected()
+{
+    setSelected(!ui->cbSelected->isChecked());
+}
+
+void SnapmaticWidget::contextMenuEvent(QContextMenuEvent *ev)
+{
+    emit contextMenuTriggered(ev);
+}
+
+void SnapmaticWidget::dialogNextPictureRequested()
+{
+    emit nextPictureRequested((QWidget*)sender());
+}
+
+void SnapmaticWidget::dialogPreviousPictureRequested()
+{
+    emit previousPictureRequested((QWidget*)sender());
+}
+
+void SnapmaticWidget::on_cbSelected_stateChanged(int arg1)
+{
+    if (arg1 == Qt::Checked)
+    {
+        emit widgetSelected();
+    }
+    else if (arg1 == Qt::Unchecked)
+    {
+        emit widgetDeselected();
+    }
+}
+
+void SnapmaticWidget::adjustTextColor()
+{
+    if (isHidden())
+    {
+        ui->labPicStr->setStyleSheet(QString("QLabel{color: rgb(%1, %2, %3);}").arg(QString::number(highlightHiddenColor.red()), QString::number(highlightHiddenColor.green()), QString::number(highlightHiddenColor.blue())));
+    }
+    else
+    {
+        ui->labPicStr->setStyleSheet("");
+    }
+}
+
+bool SnapmaticWidget::makePictureHidden()
+{
+    if (smpic->setPictureHidden())
+    {
+        adjustTextColor();
+        return true;
+    }
+    return false;
+}
+
+bool SnapmaticWidget::makePictureVisible()
+{
+    if (smpic->setPictureVisible())
+    {
+        adjustTextColor();
+        return true;
+    }
+    return false;
+}
+
+void SnapmaticWidget::makePictureHiddenSlot()
+{
+    makePictureHidden();
+}
+
+void SnapmaticWidget::makePictureVisibleSlot()
+{
+    makePictureVisible();
+}
+
+void SnapmaticWidget::editSnapmaticProperties()
+{
+    SnapmaticEditor *snapmaticEditor = new SnapmaticEditor(crewDB, this);
+    snapmaticEditor->setWindowFlags(snapmaticEditor->windowFlags()^Qt::WindowContextHelpButtonHint);
+    snapmaticEditor->setSnapmaticPicture(smpic);
+    snapmaticEditor->setModal(true);
+    snapmaticEditor->exec();
+    delete snapmaticEditor;
+}
+
+bool SnapmaticWidget::isSelected()
+{
+    return ui->cbSelected->isChecked();
+}
+
+bool SnapmaticWidget::isHidden()
+{
+    return smpic->isHidden();
+}
+
+void SnapmaticWidget::setSelectionMode(bool selectionMode)
+{
+    ui->cbSelected->setVisible(selectionMode);
+}
+
+void SnapmaticWidget::selectAllWidgets()
+{
+    emit allWidgetsSelected();
+}
+
+void SnapmaticWidget::deselectAllWidgets()
+{
+    emit allWidgetsDeselected();
+}
+
+SnapmaticPicture* SnapmaticWidget::getPicture()
+{
+    return smpic;
+}
+
+QString SnapmaticWidget::getPicturePath()
+{
+    return smpic->getPictureFilePath();
+}
+
+QString SnapmaticWidget::getWidgetType()
+{
+    return "SnapmaticWidget";
+}
diff --git a/SnapmaticWidget.h b/SnapmaticWidget.h
index a25b638..9a7b3f3 100755
--- a/SnapmaticWidget.h
+++ b/SnapmaticWidget.h
@@ -1,104 +1,98 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef SNAPMATICWIDGET_H
-#define SNAPMATICWIDGET_H
-
-#include "SnapmaticPicture.h"
-#include "ProfileDatabase.h"
-#include "DatabaseThread.h"
-#include "ProfileWidget.h"
-#include "CrewDatabase.h"
-#include <QContextMenuEvent>
-#include <QMouseEvent>
-#include <QWidget>
-#include <QColor>
-
-namespace Ui {
-class SnapmaticWidget;
-}
-
-class SnapmaticWidget : public ProfileWidget
-{
-    Q_OBJECT
-
-public:
-    SnapmaticWidget(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
-    void setSnapmaticPicture(SnapmaticPicture *picture);
-    void setSelectionMode(bool selectionMode);
-    void setSelected(bool isSelected);
-    bool deletePicture();
-    bool makePictureVisible();
-    bool makePictureHidden();
-    SnapmaticPicture *getPicture();
-    QString getPicturePath();
-    QString getWidgetType();
-    bool isSelected();
-    bool isHidden();
-    ~SnapmaticWidget();
-
-private slots:
-    void on_cmdView_clicked();
-    void on_cmdCopy_clicked();
-    void on_cmdExport_clicked();
-    void on_cmdDelete_clicked();
-    void on_cbSelected_stateChanged(int arg1);
-    void adjustTextColor();
-    void pictureSelected();
-    void selectAllWidgets();
-    void deselectAllWidgets();
-    void dialogNextPictureRequested();
-    void dialogPreviousPictureRequested();
-    void makePictureVisibleSlot();
-    void makePictureHiddenSlot();
-    void editSnapmaticProperties();
-    void snapmaticUpdated();
-
-protected:
-    bool eventFilter(QObject *obj, QEvent *ev);
-    void mouseDoubleClickEvent(QMouseEvent *ev);
-    void mouseReleaseEvent(QMouseEvent *ev);
-    void mousePressEvent(QMouseEvent *ev);
-    void contextMenuEvent(QContextMenuEvent *ev);
-
-private:
-    ProfileDatabase *profileDB;
-    CrewDatabase *crewDB;
-    DatabaseThread *threadDB;
-    Ui::SnapmaticWidget *ui;
-    SnapmaticPicture *smpic;
-    QColor highlightBackColor;
-    QColor highlightTextColor;
-    QColor highlightHiddenColor;
-    QString picPath;
-    QString picTitl;
-    QString picStr;
-    QWidget *snwgt;
-
-signals:
-    void pictureDeleted();
-    void widgetSelected();
-    void widgetDeselected();
-    void allWidgetsSelected();
-    void allWidgetsDeselected();
-    void nextPictureRequested(QWidget *dialog);
-    void previousPictureRequested(QWidget *dialog);
-    void contextMenuTriggered(QContextMenuEvent *ev);
-};
-
-#endif // SNAPMATICWIDGET_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef SNAPMATICWIDGET_H
+#define SNAPMATICWIDGET_H
+
+#include "SnapmaticPicture.h"
+#include "ProfileDatabase.h"
+#include "DatabaseThread.h"
+#include "ProfileWidget.h"
+#include "CrewDatabase.h"
+#include <QContextMenuEvent>
+#include <QMouseEvent>
+#include <QWidget>
+#include <QColor>
+
+namespace Ui {
+class SnapmaticWidget;
+}
+
+class SnapmaticWidget : public ProfileWidget
+{
+    Q_OBJECT
+
+public:
+    SnapmaticWidget(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
+    void setSnapmaticPicture(SnapmaticPicture *picture);
+    void setSelectionMode(bool selectionMode);
+    void setSelected(bool isSelected);
+    bool deletePicture();
+    bool makePictureVisible();
+    bool makePictureHidden();
+    SnapmaticPicture *getPicture();
+    QString getPicturePath();
+    QString getWidgetType();
+    bool isSelected();
+    bool isHidden();
+    void retranslate();
+    ~SnapmaticWidget();
+
+private slots:
+    void on_cmdView_clicked();
+    void on_cmdCopy_clicked();
+    void on_cmdExport_clicked();
+    void on_cmdDelete_clicked();
+    void on_cbSelected_stateChanged(int arg1);
+    void adjustTextColor();
+    void pictureSelected();
+    void selectAllWidgets();
+    void deselectAllWidgets();
+    void dialogNextPictureRequested();
+    void dialogPreviousPictureRequested();
+    void makePictureVisibleSlot();
+    void makePictureHiddenSlot();
+    void editSnapmaticProperties();
+    void snapmaticUpdated();
+
+protected:
+    void mouseDoubleClickEvent(QMouseEvent *ev);
+    void mouseReleaseEvent(QMouseEvent *ev);
+    void mousePressEvent(QMouseEvent *ev);
+    void contextMenuEvent(QContextMenuEvent *ev);
+
+private:
+    ProfileDatabase *profileDB;
+    CrewDatabase *crewDB;
+    DatabaseThread *threadDB;
+    Ui::SnapmaticWidget *ui;
+    SnapmaticPicture *smpic;
+    QColor highlightHiddenColor;
+
+signals:
+    void pictureDeleted();
+    void widgetSelected();
+    void widgetDeselected();
+    void allWidgetsSelected();
+    void allWidgetsDeselected();
+    void nextPictureRequested(QWidget *dialog);
+    void previousPictureRequested(QWidget *dialog);
+    void contextMenuTriggered(QContextMenuEvent *ev);
+};
+
+#endif // SNAPMATICWIDGET_H
diff --git a/SnapmaticWidget.ui b/SnapmaticWidget.ui
index 5c720c8..a3e7e89 100755
--- a/SnapmaticWidget.ui
+++ b/SnapmaticWidget.ui
@@ -1,169 +1,169 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SnapmaticWidget</class>
- <widget class="QWidget" name="SnapmaticWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>490</width>
-    <height>45</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Snapmatic Widget</string>
-  </property>
-  <layout class="QHBoxLayout" name="hlSnapmaticContent">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QFrame" name="SnapmaticFrame">
-     <property name="frameShape">
-      <enum>QFrame::NoFrame</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Plain</enum>
-     </property>
-     <property name="lineWidth">
-      <number>0</number>
-     </property>
-     <layout class="QHBoxLayout" name="hlSnapmatic">
-      <item>
-       <widget class="QCheckBox" name="cbSelected">
-        <property name="focusPolicy">
-         <enum>Qt::NoFocus</enum>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="labPicture">
-        <property name="minimumSize">
-         <size>
-          <width>48</width>
-          <height>27</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>48</width>
-          <height>27</height>
-         </size>
-        </property>
-        <property name="lineWidth">
-         <number>0</number>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-        <property name="scaledContents">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="labPicStr">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string>PHOTO - 00/00/00 00:00:00</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdView">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>View picture</string>
-        </property>
-        <property name="text">
-         <string>View</string>
-        </property>
-        <property name="autoDefault">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdCopy">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>Copy picture</string>
-        </property>
-        <property name="text">
-         <string>Copy</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdExport">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>Export picture</string>
-        </property>
-        <property name="text">
-         <string>Export</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QPushButton" name="cmdDelete">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="toolTip">
-         <string>Delete picture</string>
-        </property>
-        <property name="text">
-         <string>Delete</string>
-        </property>
-        <property name="autoDefault">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SnapmaticWidget</class>
+ <widget class="QWidget" name="SnapmaticWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>490</width>
+    <height>45</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Snapmatic Widget</string>
+  </property>
+  <layout class="QHBoxLayout" name="hlSnapmaticContent">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QFrame" name="SnapmaticFrame">
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <layout class="QHBoxLayout" name="hlSnapmatic">
+      <item>
+       <widget class="QCheckBox" name="cbSelected">
+        <property name="focusPolicy">
+         <enum>Qt::NoFocus</enum>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labPicture">
+        <property name="minimumSize">
+         <size>
+          <width>48</width>
+          <height>27</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>48</width>
+          <height>27</height>
+         </size>
+        </property>
+        <property name="lineWidth">
+         <number>0</number>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+        <property name="scaledContents">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labPicStr">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>PHOTO - 00/00/00 00:00:00</string>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdView">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>View picture</string>
+        </property>
+        <property name="text">
+         <string>View</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdCopy">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>Copy picture</string>
+        </property>
+        <property name="text">
+         <string>Copy</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdExport">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>Export picture</string>
+        </property>
+        <property name="text">
+         <string>Export</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cmdDelete">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>Delete picture</string>
+        </property>
+        <property name="text">
+         <string>Delete</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/StandardPaths.cpp b/StandardPaths.cpp
index dda73a3..fa5ed24 100755
--- a/StandardPaths.cpp
+++ b/StandardPaths.cpp
@@ -1,128 +1,128 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "StandardPaths.h"
-#if QT_VERSION >= 0x050000
-#include <QStandardPaths>
-#else
-#include <QDesktopServices>
-#endif
-
-StandardPaths::StandardPaths()
-{
-
-}
-
-QString StandardPaths::applicationsLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation);
-#endif
-}
-
-QString StandardPaths::cacheLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
-#endif
-}
-
-QString StandardPaths::dataLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::DataLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::DataLocation);
-#endif
-}
-
-QString StandardPaths::desktopLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
-#endif
-}
-
-QString StandardPaths::documentsLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
-#endif
-}
-
-QString StandardPaths::moviesLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::MoviesLocation);
-#endif
-}
-
-QString StandardPaths::picturesLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::PicturesLocation);
-#endif
-}
-
-QString StandardPaths::fontsLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::FontsLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::FontsLocation);
-#endif
-}
-
-QString StandardPaths::homeLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
-#endif
-}
-
-QString StandardPaths::musicLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::MusicLocation);
-#endif
-}
-
-QString StandardPaths::tempLocation()
-{
-#if QT_VERSION >= 0x050000
-    return QStandardPaths::writableLocation(QStandardPaths::TempLocation);
-#else
-    return QDesktopServices::storageLocation(QDesktopServices::TempLocation);
-#endif
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "StandardPaths.h"
+#if QT_VERSION >= 0x050000
+#include <QStandardPaths>
+#else
+#include <QDesktopServices>
+#endif
+
+StandardPaths::StandardPaths()
+{
+
+}
+
+QString StandardPaths::applicationsLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation);
+#endif
+}
+
+QString StandardPaths::cacheLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
+#endif
+}
+
+QString StandardPaths::dataLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::DataLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::DataLocation);
+#endif
+}
+
+QString StandardPaths::desktopLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);
+#endif
+}
+
+QString StandardPaths::documentsLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#endif
+}
+
+QString StandardPaths::moviesLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::MoviesLocation);
+#endif
+}
+
+QString StandardPaths::picturesLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::PicturesLocation);
+#endif
+}
+
+QString StandardPaths::fontsLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::FontsLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::FontsLocation);
+#endif
+}
+
+QString StandardPaths::homeLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
+#endif
+}
+
+QString StandardPaths::musicLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::MusicLocation);
+#endif
+}
+
+QString StandardPaths::tempLocation()
+{
+#if QT_VERSION >= 0x050000
+    return QStandardPaths::writableLocation(QStandardPaths::TempLocation);
+#else
+    return QDesktopServices::storageLocation(QDesktopServices::TempLocation);
+#endif
+}
diff --git a/StandardPaths.h b/StandardPaths.h
index 203953b..619bdeb 100755
--- a/StandardPaths.h
+++ b/StandardPaths.h
@@ -1,41 +1,41 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef STANDARDPATHS_H
-#define STANDARDPATHS_H
-
-#include <QString>
-
-class StandardPaths
-{
-public:
-    StandardPaths();
-    static QString applicationsLocation();
-    static QString cacheLocation();
-    static QString dataLocation();
-    static QString desktopLocation();
-    static QString documentsLocation();
-    static QString fontsLocation();
-    static QString homeLocation();
-    static QString moviesLocation();
-    static QString picturesLocation();
-    static QString musicLocation();
-    static QString tempLocation();
-};
-
-#endif // STANDARDPATHS_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef STANDARDPATHS_H
+#define STANDARDPATHS_H
+
+#include <QString>
+
+class StandardPaths
+{
+public:
+    StandardPaths();
+    static QString applicationsLocation();
+    static QString cacheLocation();
+    static QString dataLocation();
+    static QString desktopLocation();
+    static QString documentsLocation();
+    static QString fontsLocation();
+    static QString homeLocation();
+    static QString moviesLocation();
+    static QString picturesLocation();
+    static QString musicLocation();
+    static QString tempLocation();
+};
+
+#endif // STANDARDPATHS_H
diff --git a/StringParser.cpp b/StringParser.cpp
index 6addd10..1854c88 100755
--- a/StringParser.cpp
+++ b/StringParser.cpp
@@ -1,76 +1,80 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "StringParser.h"
-#include "config.h"
-#include <QTextDocument>
-#ifndef GTA5VIEW_CMD
-#include <QApplication>
-#endif
-#include <QTextCodec>
-#include <QByteArray>
-#include <QFileInfo>
-#include <QString>
-#include <QList>
-#include <QDir>
-
-StringParser::StringParser()
-{
-
-}
-
-QString StringParser::parseTitleString(const QByteArray &commitBytes, int maxLength)
-{
-    Q_UNUSED(maxLength)
-    QString retStr = QTextCodec::codecForName("UTF-16LE")->toUnicode(commitBytes).trimmed();
-    retStr.remove(QChar('\x00'));
-    return retStr;
-}
-
-QString StringParser::convertDrawStringForLog(const QString &inputStr)
-{
-    QString outputStr = inputStr;
-    return outputStr.replace("&","&u;").replace(",","&c;");
-}
-
-QString StringParser::convertLogStringForDraw(const QString &inputStr)
-{
-    QString outputStr = inputStr;
-    return outputStr.replace("&c;",",").replace("&u;","&");
-}
-
-#ifndef GTA5VIEW_CMD
-QString StringParser::convertBuildedString(const QString &buildedStr)
-{
-    QString outputStr = buildedStr;
-    QByteArray sharePath = GTA5SYNC_SHARE;
-    outputStr.replace("$SHAREDIR", QString::fromUtf8(sharePath));
-    outputStr.replace("$RUNDIR", QFileInfo(qApp->applicationFilePath()).absoluteDir().absolutePath());
-    outputStr.replace("$SEPARATOR", QDir::separator());
-    return outputStr;
-}
-#endif
-
-QString StringParser::escapeString(const QString &toEscape)
-{
-#if QT_VERSION >= 0x050000
-    return toEscape.toHtmlEscaped();
-#else
-    return Qt::escape(toEscape);
-#endif
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "StringParser.h"
+#include "config.h"
+#include <QTextDocument>
+#include <QLibraryInfo>
+#ifndef GTA5VIEW_CMD
+#include <QApplication>
+#endif
+#include <QTextCodec>
+#include <QByteArray>
+#include <QFileInfo>
+#include <QString>
+#include <QList>
+#include <QDir>
+
+StringParser::StringParser()
+{
+
+}
+
+QString StringParser::parseTitleString(const QByteArray &commitBytes, int maxLength)
+{
+    Q_UNUSED(maxLength)
+    QString retStr = QTextCodec::codecForName("UTF-16LE")->toUnicode(commitBytes).trimmed();
+    retStr.remove(QChar('\x00'));
+    return retStr;
+}
+
+QString StringParser::convertDrawStringForLog(const QString &inputStr)
+{
+    QString outputStr = inputStr;
+    return outputStr.replace("&","&u;").replace(",","&c;");
+}
+
+QString StringParser::convertLogStringForDraw(const QString &inputStr)
+{
+    QString outputStr = inputStr;
+    return outputStr.replace("&c;",",").replace("&u;","&");
+}
+
+#ifndef GTA5VIEW_CMD
+QString StringParser::convertBuildedString(const QString &buildedStr)
+{
+    QString outputStr = buildedStr;
+    QByteArray sharePath = GTA5SYNC_SHARE;
+    outputStr.replace("APPNAME:", GTA5SYNC_APPSTR);
+    outputStr.replace("SHAREDDIR:", QString::fromUtf8(sharePath));
+    outputStr.replace("RUNDIR:", QFileInfo(qApp->applicationFilePath()).absoluteDir().absolutePath());
+    outputStr.replace("QCONFLANG:", QLibraryInfo::location(QLibraryInfo::TranslationsPath));
+    outputStr.replace("QCONFPLUG:", QLibraryInfo::location(QLibraryInfo::PluginsPath));
+    outputStr.replace("SEPARATOR:", QDir::separator());
+    return outputStr;
+}
+#endif
+
+QString StringParser::escapeString(const QString &toEscape)
+{
+#if QT_VERSION >= 0x050000
+    return toEscape.toHtmlEscaped();
+#else
+    return Qt::escape(toEscape);
+#endif
+}
diff --git a/StringParser.h b/StringParser.h
index a9505f6..0b5d7e3 100755
--- a/StringParser.h
+++ b/StringParser.h
@@ -1,38 +1,38 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef STRINGPARSER_H
-#define STRINGPARSER_H
-
-#include <QByteArray>
-#include <QString>
-
-class StringParser
-{
-public:
-    StringParser();
-    static QString parseTitleString(const QByteArray &commitBytes, int maxLength);
-    static QString convertDrawStringForLog(const QString &inputStr);
-    static QString convertLogStringForDraw(const QString &inputStr);
-#ifndef GTA5VIEW_CMD
-    static QString convertBuildedString(const QString &buildedStr);
-#endif
-    static QString escapeString(const QString &toEscape);
-};
-
-#endif // STRINGPARSER_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef STRINGPARSER_H
+#define STRINGPARSER_H
+
+#include <QByteArray>
+#include <QString>
+
+class StringParser
+{
+public:
+    StringParser();
+    static QString parseTitleString(const QByteArray &commitBytes, int maxLength);
+    static QString convertDrawStringForLog(const QString &inputStr);
+    static QString convertLogStringForDraw(const QString &inputStr);
+#ifndef GTA5VIEW_CMD
+    static QString convertBuildedString(const QString &buildedStr);
+#endif
+    static QString escapeString(const QString &toEscape);
+};
+
+#endif // STRINGPARSER_H
diff --git a/TranslationClass.cpp b/TranslationClass.cpp
new file mode 100644
index 0000000..6dc4d7f
--- /dev/null
+++ b/TranslationClass.cpp
@@ -0,0 +1,543 @@
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "TranslationClass.h"
+#include "AppEnv.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QApplication>
+#include <QStringList>
+#include <QTranslator>
+#include <QSettings>
+#include <QLocale>
+#include <QDebug>
+#include <QFile>
+#include <QDir>
+
+#if QT_VERSION >= 0x050000
+#define QtBaseTranslationFormat "qtbase_"
+#else
+#define QtBaseTranslationFormat "qt_"
+#endif
+
+TranslationClass TranslationClass::translationClassInstance;
+
+void TranslationClass::initUserLanguage()
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("Interface");
+    userLanguage = settings.value("Language", "System").toString();
+    settings.endGroup();
+}
+
+void TranslationClass::loadTranslation(QApplication *app)
+{
+    if (isLangLoaded) { unloadTranslation(app); }
+    else { currentLangIndex = 0; }
+    QString exLangPath = AppEnv::getExLangFolder();
+    QString inLangPath = AppEnv::getInLangFolder();
+    if (userLanguage == "en" || userLanguage == "en_GB")
+    {
+        currentLanguage = "en_GB";
+        if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+        {
+            app->installTranslator(&exQtTranslator);
+        }
+        else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+        {
+            app->installTranslator(&inQtTranslator);
+        }
+        QLocale::setDefault(currentLanguage);
+        isLangLoaded = true;
+        return;
+    }
+#ifndef GTA5SYNC_QCONF // Classic modable loading method
+    QString externalLanguageStr;
+    bool externalLanguageReady = false;
+    bool loadInternalLang = false;
+    bool trLoadSuccess = false;
+    if (isUserLanguageSystem_p())
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadExSystemLanguage";
+#endif
+        trLoadSuccess = loadSystemTranslation_p(exLangPath, &exAppTranslator);
+    }
+    else
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadExUserLanguage";
+#endif
+        trLoadSuccess = loadUserTranslation_p(exLangPath, &exAppTranslator);
+        if (!trLoadSuccess)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "loadInUserLanguage";
+#endif
+            trLoadSuccess = loadUserTranslation_p(inLangPath, &inAppTranslator);
+            if (!trLoadSuccess)
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadUserLanguageFailed";
+#endif
+            }
+            else
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadUserLanguageSuccess";
+#endif
+                loadInternalLang = true;
+                isLangLoaded = true;
+            }
+        }
+        else
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "loadUserLanguageSuccess";
+#endif
+            isLangLoaded = true;
+        }
+    }
+    if (trLoadSuccess)
+    {
+        if (currentLangIndex != 0) // Don't install the language until we know we not have a better language for the user
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "externalLanguageReady" << currentLanguage;
+#endif
+            externalLanguageStr = currentLanguage;
+            externalLanguageReady = true;
+        }
+        else
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "installTranslation";
+#endif
+            if (loadInternalLang)
+            {
+                app->installTranslator(&inAppTranslator);
+            }
+            else
+            {
+                app->installTranslator(&exAppTranslator);
+            }
+            if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+            {
+                app->installTranslator(&exQtTranslator);
+            }
+            else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+            {
+                app->installTranslator(&inQtTranslator);
+            }
+            QLocale::setDefault(currentLanguage);
+            isLangLoaded = true;
+        }
+    }
+    if (externalLanguageReady)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadInSystemLanguage";
+#endif
+        int externalLangIndex = currentLangIndex;
+        trLoadSuccess = loadSystemTranslation_p(inLangPath, &inAppTranslator);
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "externalLangIndex" << externalLangIndex << "internalLangIndex" << currentLangIndex;
+#endif
+        if (trLoadSuccess && externalLangIndex > currentLangIndex)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "installInternalTranslation";
+#endif
+            app->installTranslator(&inAppTranslator);
+            if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+            {
+                app->installTranslator(&exQtTranslator);
+            }
+            else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+            {
+                app->installTranslator(&inQtTranslator);
+            }
+            QLocale::setDefault(currentLanguage);
+            isLangLoaded = true;
+        }
+        else
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "installExternalTranslation";
+#endif
+            currentLanguage = externalLanguageStr;
+            app->installTranslator(&exAppTranslator);
+            if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+            {
+                app->installTranslator(&exQtTranslator);
+            }
+            else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+            {
+                app->installTranslator(&inQtTranslator);
+            }
+            QLocale::setDefault(currentLanguage);
+            isLangLoaded = true;
+        }
+    }
+    else if (!isLangLoaded)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadInSystemLanguage";
+#endif
+        trLoadSuccess = loadSystemTranslation_p(inLangPath, &inAppTranslator);
+        if (trLoadSuccess)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "installInternalTranslation";
+#endif
+            app->installTranslator(&inAppTranslator);
+            if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+            {
+                app->installTranslator(&exQtTranslator);
+            }
+            else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+            {
+                app->installTranslator(&inQtTranslator);
+            }
+            QLocale::setDefault(currentLanguage);
+            isLangLoaded = true;
+        }
+        else if (!trLoadSuccess)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "fallbackToDefaultApplicationLanguage";
+#endif
+            currentLanguage = "en_GB";
+            if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+            {
+                app->installTranslator(&exQtTranslator);
+            }
+            else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+            {
+                app->installTranslator(&inQtTranslator);
+            }
+            QLocale::setDefault(currentLanguage);
+            isLangLoaded = true;
+        }
+    }
+#else // New qconf loading method
+    bool trLoadSuccess;
+    if (isUserLanguageSystem_p())
+    {
+        trLoadSuccess = loadSystemTranslation_p(inLangPath, &inAppTranslator);
+    }
+    else
+    {
+        trLoadSuccess = loadUserTranslation_p(inLangPath, &inAppTranslator);
+    }
+    if (!trLoadSuccess && !isUserLanguageSystem_p())
+    {
+        trLoadSuccess = loadSystemTranslation_p(inLangPath, &inAppTranslator);
+    }
+    if (trLoadSuccess)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "installTranslation" << currentLanguage;
+#endif
+        app->installTranslator(&inAppTranslator);
+        if (loadQtTranslation_p(exLangPath, &exQtTranslator))
+        {
+            app->installTranslator(&exQtTranslator);
+        }
+        else if (loadQtTranslation_p(inLangPath, &inQtTranslator))
+        {
+            app->installTranslator(&inQtTranslator);
+        }
+        QLocale::setDefault(currentLanguage);
+        isLangLoaded = true;
+    }
+#endif
+}
+
+QStringList TranslationClass::listTranslations(const QString &langPath)
+{
+    QDir langDir;
+    langDir.setNameFilters(QStringList("gta5sync_*.qm"));
+    langDir.setPath(langPath);
+    QStringList availableLanguages;
+    foreach(const QString &lang, langDir.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::NoSort))
+    {
+        availableLanguages << QString(lang).remove("gta5sync_").remove(".qm");
+    }
+    return availableLanguages;
+}
+
+bool TranslationClass::loadSystemTranslation_p(const QString &langPath, QTranslator *appTranslator)
+{
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "loadSystemTranslation_p";
+#endif
+    int currentLangCounter = 0;
+    foreach(const QString &languageName, QLocale::system().uiLanguages())
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguage" << languageName;
+#endif
+        QStringList langList = QString(languageName).replace("-","_").split("_");
+        if (langList.length() == 2)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+            if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
+            {
+                if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
+                {
+#ifdef GTA5SYNC_DEBUG
+                    qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+                    currentLanguage = languageName;
+                    currentLangIndex = currentLangCounter;
+                    return true;
+                }
+            }
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+            if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+            {
+                if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+                {
+#ifdef GTA5SYNC_DEBUG
+                    qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+                    currentLanguage = languageName;
+                    currentLangIndex = currentLangCounter;
+                    return true;
+                }
+            }
+            if (langList.at(0) == "en")
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "languageEnglishMode index" << currentLangCounter;
+#endif
+                currentLanguage = languageName;
+                currentLangIndex = currentLangCounter;
+                return true;
+            }
+        }
+        else if (langList.length() == 1)
+        {
+#ifdef GTA5SYNC_DEBUG
+            qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+            if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+            {
+                if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+                {
+#ifdef GTA5SYNC_DEBUG
+                    qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+                    currentLanguage = languageName;
+                    return true;
+                }
+            }
+        }
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "currentLangCounter bump";
+#endif
+        currentLangCounter++;
+    }
+    return false;
+}
+
+bool TranslationClass::loadUserTranslation_p(const QString &langPath, QTranslator *appTranslator)
+{
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "loadUserTranslation_p";
+#endif
+    QString languageName = userLanguage;
+    QStringList langList = QString(languageName).replace("-","_").split("_");
+    if (langList.length() == 2)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
+        {
+            if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+                currentLanguage = languageName;
+                return true;
+            }
+        }
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+        {
+            if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+                currentLanguage = languageName;
+                return true;
+            }
+        }
+    }
+    else if (langList.length() == 1)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+        {
+            if (appTranslator->load(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % "gta5sync_" % langList.at(0) % ".qm");
+#endif
+                currentLanguage = languageName;
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+bool TranslationClass::loadQtTranslation_p(const QString &langPath, QTranslator *qtTranslator)
+{
+#ifdef GTA5SYNC_DEBUG
+    qDebug() << "loadQtTranslation_p" << currentLanguage;
+#endif
+    QString languageName = currentLanguage;
+    QStringList langList = QString(languageName).replace("-","_").split("_");
+    if (langList.length() == 2)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % "_" % langList.at(1) % ".qm"))
+        {
+            if (qtTranslator->load(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % "_" % langList.at(1) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % "_" % langList.at(1) % ".qm");
+#endif
+                return true;
+            }
+        }
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm"))
+        {
+            if (qtTranslator->load(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm");
+#endif
+                return true;
+            }
+        }
+    }
+    else if (langList.length() == 1)
+    {
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << "loadLanguageFile" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm");
+#endif
+        if (QFile::exists(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm"))
+        {
+            if (qtTranslator->load(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm"))
+            {
+#ifdef GTA5SYNC_DEBUG
+                qDebug() << "loadLanguageFileSuccess" << QString(langPath % QDir::separator() % QtBaseTranslationFormat % langList.at(0) % ".qm");
+#endif
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+bool TranslationClass::isUserLanguageSystem_p()
+{
+    return (userLanguage == "System" || userLanguage.trimmed().isEmpty());
+}
+
+QString TranslationClass::getCurrentLanguage()
+{
+    return currentLanguage;
+}
+
+bool TranslationClass::isLanguageLoaded()
+{
+    return isLangLoaded;
+}
+
+void TranslationClass::unloadTranslation(QApplication *app)
+{
+    if (isLangLoaded)
+    {
+#ifndef GTA5SYNC_QCONF
+        app->removeTranslator(&exAppTranslator);
+        app->removeTranslator(&exQtTranslator);
+        app->removeTranslator(&inAppTranslator);
+        app->removeTranslator(&inQtTranslator);
+#else
+        app->removeTranslator(&inAppTranslator);
+        app->removeTranslator(&exQtTranslator);
+#endif
+        currentLangIndex = 0;
+        currentLanguage = QString();
+        QLocale::setDefault(QLocale::c());
+        isLangLoaded = false;
+    }
+#ifdef _MSC_VER // Fix dumb Microsoft compiler warning
+    Q_UNUSED(app)
+#endif
+}
+
+QString TranslationClass::getCountryCode(QLocale::Country country)
+{
+    QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage,
+                                                      QLocale::AnyScript,
+                                                      country);
+    if (locales.isEmpty()) return QString();
+    QStringList localeStrList = locales.at(0).name().split("_");
+    if (localeStrList.length() <= 2)
+    {
+        return localeStrList.at(1).toLower();
+    }
+    else
+    {
+        return QString();
+    }
+}
+
+QString TranslationClass::getCountryCode(QLocale locale)
+{
+    QStringList localeStrList = locale.name().split("_");
+    if (localeStrList.length() <= 2)
+    {
+        return localeStrList.at(1).toLower();
+    }
+    else
+    {
+        return QString();
+    }
+}
diff --git a/TranslationClass.h b/TranslationClass.h
new file mode 100644
index 0000000..4ad4242
--- /dev/null
+++ b/TranslationClass.h
@@ -0,0 +1,63 @@
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef TRANSLATIONCLASS_H
+#define TRANSLATIONCLASS_H
+
+#include <QApplication>
+#include <QTranslator>
+#include <QStringList>
+#include <QString>
+#include <QObject>
+#include <QLocale>
+
+class TranslationClass : public QObject
+{
+    Q_OBJECT
+public:
+    static TranslationClass* getInstance() { return &translationClassInstance; }
+    static QString getCountryCode(QLocale::Country country);
+    static QString getCountryCode(QLocale locale);
+    void initUserLanguage();
+    void loadTranslation(QApplication *app);
+    void unloadTranslation(QApplication *app);
+    QStringList listTranslations(const QString &langPath);
+    QString getCurrentLanguage();
+    bool isLanguageLoaded();
+
+private:
+    static TranslationClass translationClassInstance;
+    bool loadSystemTranslation_p(const QString &langPath, QTranslator *appTranslator);
+    bool loadUserTranslation_p(const QString &langPath, QTranslator *appTranslator);
+    bool loadQtTranslation_p(const QString &langPath, QTranslator *qtTranslator);
+    bool isUserLanguageSystem_p();
+    QTranslator exAppTranslator;
+    QTranslator exQtTranslator;
+    QTranslator inAppTranslator;
+    QTranslator inQtTranslator;
+    QString currentLanguage;
+    QString userLanguage;
+    int currentLangIndex;
+    bool isLangLoaded;
+};
+
+extern TranslationClass translationClass;
+
+#define TCInstance TranslationClass::getInstance()
+
+#endif // TRANSLATIONCLASS_H
diff --git a/UserInterface.cpp b/UserInterface.cpp
index b029c6e..e6c4cf0 100755
--- a/UserInterface.cpp
+++ b/UserInterface.cpp
@@ -1,529 +1,552 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "UserInterface.h"
-#include "ui_UserInterface.h"
-#include "ProfileInterface.h"
-#include "SnapmaticPicture.h"
-#include "SidebarGenerator.h"
-#include "SavegameDialog.h"
-#include "StandardPaths.h"
-#include "OptionsDialog.h"
-#include "PictureDialog.h"
-#include "SavegameData.h"
-#include "AboutDialog.h"
-#include "IconLoader.h"
-#include "AppEnv.h"
-#include "config.h"
-#include <QtGlobal>
-#include <QStyleFactory>
-#include <QFileDialog>
-#include <QHBoxLayout>
-#include <QSpacerItem>
-#include <QPushButton>
-#include <QMessageBox>
-#include <QSettings>
-#include <QFileInfo>
-#include <QProcess>
-#include <QDebug>
-#include <QFile>
-#include <QDir>
-#include <QMap>
-
-UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) :
-    QMainWindow(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB),
-    ui(new Ui::UserInterface)
-{
-    ui->setupUi(this);
-    contentMode = 0;
-    profileOpen = 0;
-    profileUI = 0;
-    ui->menuProfile->setEnabled(false);
-    ui->actionSelect_profile->setEnabled(false);
-    ui->actionAbout_gta5sync->setIcon(IconLoader::loadingAppIcon());
-    ui->actionAbout_gta5sync->setText(tr("&About %1").arg(GTA5SYNC_APPSTR));
-    defaultWindowTitle = tr("%2 - %1").arg("%1", GTA5SYNC_APPSTR);
-
-    this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
-    ui->labVersion->setText(ui->labVersion->text().arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
-
-    if (QIcon::hasThemeIcon("dialog-close"))
-    {
-        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
-    }
-    if (QIcon::hasThemeIcon("preferences-system"))
-    {
-#ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X
-        ui->actionOptions->setIcon(QIcon::fromTheme("preferences-system"));
-#endif
-    }
-    if (QIcon::hasThemeIcon("application-exit"))
-    {
-#ifndef Q_OS_MACOS // Setting icon for exit/quit lead to a crash in Mac OS X
-        ui->actionExit->setIcon(QIcon::fromTheme("application-exit"));
-#endif
-    }
-
-    // DPI calculation
-    qreal screenRatio = AppEnv::screenRatio();
-    resize(625 * screenRatio, 500 * screenRatio);
-    ui->vlUserInterface->setSpacing(6 * screenRatio);
-    ui->vlUserInterface->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio);
-}
-
-void UserInterface::setupDirEnv()
-{
-    // settings init
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-
-    bool folderExists;
-    GTAV_Folder = AppEnv::getGameFolder(&folderExists);
-    if (folderExists)
-    {
-        QDir::setCurrent(GTAV_Folder);
-    }
-    else
-    {
-        GTAV_Folder = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
-        if (QFileInfo(GTAV_Folder).exists())
-        {
-            folderExists = true;
-            QDir::setCurrent(GTAV_Folder);
-            AppEnv::setGameFolder(GTAV_Folder);
-
-            // First time folder selection save
-            settings.beginGroup("dir");
-            if (settings.value("dir", "").toString().isEmpty())
-            {
-                settings.setValue("dir", GTAV_Folder);
-            }
-            settings.endGroup();
-        }
-    }
-
-    // profiles init
-    settings.beginGroup("Profile");
-    QString defaultProfile = settings.value("Default", "").toString();
-
-    bool contentModeOk;
-    contentMode = settings.value("ContentMode", 0).toInt(&contentModeOk);
-    if (contentMode != 0 && contentMode != 1 && contentMode != 2)
-    {
-        contentMode = 0;
-    }
-
-    if (folderExists)
-    {
-        QDir GTAV_ProfilesDir;
-        GTAV_ProfilesFolder = GTAV_Folder + QDir::separator() + "Profiles";
-        GTAV_ProfilesDir.setPath(GTAV_ProfilesFolder);
-
-        GTAV_Profiles = GTAV_ProfilesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
-        setupProfileUi();
-
-        if (GTAV_Profiles.length() == 1)
-        {
-            openProfile(GTAV_Profiles.at(0));
-        }
-        else if(GTAV_Profiles.contains(defaultProfile))
-        {
-            openProfile(defaultProfile);
-        }
-    }
-    else
-    {
-        GTAV_Profiles = QStringList();
-        setupProfileUi();
-    }
-    settings.endGroup();
-}
-
-void UserInterface::setupProfileUi()
-{
-    qreal screenRatio = AppEnv::screenRatio();
-    if (GTAV_Profiles.length() == 0)
-    {
-        QPushButton *changeDirBtn = new QPushButton(tr("Select &GTA V Folder..."), ui->swSelection);
-        changeDirBtn->setObjectName("cmdChangeDir");
-        changeDirBtn->setMinimumSize(0, 40 * screenRatio);
-        changeDirBtn->setAutoDefault(true);
-        ui->vlButtons->addWidget(changeDirBtn);
-        profileBtns.append(changeDirBtn);
-
-        QObject::connect(changeDirBtn, SIGNAL(clicked(bool)), this, SLOT(changeFolder_clicked()));
-    }
-    else foreach(const QString &GTAV_Profile, GTAV_Profiles)
-    {
-        QPushButton *profileBtn = new QPushButton(GTAV_Profile, ui->swSelection);
-        profileBtn->setObjectName(GTAV_Profile);
-        profileBtn->setMinimumSize(0, 40 * screenRatio);
-        profileBtn->setAutoDefault(true);
-        ui->vlButtons->addWidget(profileBtn);
-        profileBtns.append(profileBtn);
-
-        QObject::connect(profileBtn, SIGNAL(clicked(bool)), this, SLOT(profileButton_clicked()));
-    }
-    profileBtns.at(0)->setFocus();
-}
-
-void UserInterface::changeFolder_clicked()
-{
-    on_actionSelect_GTA_Folder_triggered();
-}
-
-void UserInterface::on_cmdReload_clicked()
-{
-    foreach(QPushButton *profileBtn, profileBtns)
-    {
-        ui->vlButtons->removeWidget(profileBtn);
-        profileBtns.removeAll(profileBtn);
-        delete profileBtn;
-    }
-    setupDirEnv();
-}
-
-void UserInterface::profileButton_clicked()
-{
-    QPushButton *profileBtn = (QPushButton*)sender();
-    openProfile(profileBtn->objectName());
-}
-
-void UserInterface::openProfile(QString profileName)
-{
-    profileOpen = true;
-    profileUI = new ProfileInterface(profileDB, crewDB, threadDB);
-    ui->swProfile->addWidget(profileUI);
-    ui->swProfile->setCurrentWidget(profileUI);
-    profileUI->setProfileFolder(GTAV_ProfilesFolder + QDir::separator() + profileName, profileName);
-    profileUI->settingsApplied(contentMode, language);
-    profileUI->setupProfileInterface();
-    QObject::connect(profileUI, SIGNAL(profileClosed()), this, SLOT(closeProfile()));
-    QObject::connect(profileUI, SIGNAL(profileLoaded()), this, SLOT(profileLoaded()));
-    this->setWindowTitle(defaultWindowTitle.arg(profileName));
-}
-
-void UserInterface::closeProfile()
-{
-    if (profileOpen)
-    {
-        profileOpen = false;
-        ui->menuProfile->setEnabled(false);
-        ui->actionSelect_profile->setEnabled(false);
-        ui->swProfile->removeWidget(profileUI);
-        delete profileUI;
-    }
-    this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
-}
-
-void UserInterface::closeEvent(QCloseEvent *ev)
-{
-    Q_UNUSED(ev)
-    threadDB->doEndThread();
-}
-
-UserInterface::~UserInterface()
-{
-    foreach (QPushButton *profileBtn, profileBtns)
-    {
-        delete profileBtn;
-    }
-    delete ui;
-}
-
-void UserInterface::on_actionExit_triggered()
-{
-    this->close();
-}
-
-void UserInterface::on_actionSelect_profile_triggered()
-{
-    closeProfile();
-    openSelectProfile();
-}
-
-void UserInterface::openSelectProfile()
-{
-    // not needed right now
-}
-
-void UserInterface::on_actionAbout_gta5sync_triggered()
-{
-    AboutDialog *aboutDialog = new AboutDialog(this);
-    aboutDialog->setWindowIcon(windowIcon());
-    aboutDialog->setModal(true);
-#ifdef Q_OS_ANDROID
-    // Android ...
-    aboutDialog->showMaximized();
-#else
-    aboutDialog->show();
-#endif
-    aboutDialog->exec();
-    delete aboutDialog;
-}
-
-void UserInterface::profileLoaded()
-{
-    ui->menuProfile->setEnabled(true);
-    ui->actionSelect_profile->setEnabled(true);
-}
-
-void UserInterface::on_actionSelect_all_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->selectAllWidgets();
-    }
-}
-
-void UserInterface::on_actionDeselect_all_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->deselectAllWidgets();
-    }
-}
-
-void UserInterface::on_actionExport_selected_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->exportSelected();
-    }
-}
-
-void UserInterface::on_actionDelete_selected_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->deleteSelected();
-    }
-}
-
-void UserInterface::on_actionOptions_triggered()
-{
-    OptionsDialog *optionsDialog = new OptionsDialog(profileDB, this);
-    optionsDialog->setWindowIcon(windowIcon());
-    optionsDialog->commitProfiles(GTAV_Profiles);
-    QObject::connect(optionsDialog, SIGNAL(settingsApplied(int, QString)), this, SLOT(settingsApplied(int, QString)));
-
-    optionsDialog->setModal(true);
-#ifdef Q_OS_ANDROID
-    // Android ...
-    optionsDialog->showMaximized();
-#else
-    optionsDialog->show();
-#endif
-    optionsDialog->exec();
-
-    delete optionsDialog;
-}
-
-void UserInterface::on_action_Import_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->importFiles();
-    }
-}
-
-void UserInterface::on_actionOpen_File_triggered()
-{
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("FileDialogs");
-
-fileDialogPreOpen:
-    QFileDialog fileDialog(this);
-    fileDialog.setFileMode(QFileDialog::ExistingFiles);
-    fileDialog.setViewMode(QFileDialog::Detail);
-    fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
-    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
-    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
-    fileDialog.setWindowTitle(tr("Open File..."));
-
-    QStringList filters;
-    filters << ProfileInterface::tr("All profile files (*.g5e SGTA* PGTA*)");
-    filters << ProfileInterface::tr("GTA V Export (*.g5e)");
-    filters << ProfileInterface::tr("Savegames files (SGTA*)");
-    filters << ProfileInterface::tr("Snapmatic pictures (PGTA*)");
-    filters << ProfileInterface::tr("All files (**)");
-    fileDialog.setNameFilters(filters);
-
-    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
-
-    fileDialog.setSidebarUrls(sidebarUrls);
-    fileDialog.setDirectory(settings.value("OpenDialogDirectory", StandardPaths::documentsLocation()).toString());
-    fileDialog.restoreGeometry(settings.value("OpenDialogGeometry","").toByteArray());
-
-    if (fileDialog.exec())
-    {
-        QStringList selectedFiles = fileDialog.selectedFiles();
-        if (selectedFiles.length() == 1)
-        {
-            QString selectedFile = selectedFiles.at(0);
-            if (!openFile(selectedFile, true)) goto fileDialogPreOpen;
-        }
-    }
-
-    settings.setValue("OpenDialogGeometry", fileDialog.saveGeometry());
-    settings.setValue("OpenDialogDirectory", fileDialog.directory().absolutePath());
-    settings.endGroup();
-}
-
-bool UserInterface::openFile(QString selectedFile, bool warn)
-{
-    QString selectedFileName = QFileInfo(selectedFile).fileName();
-    if (QFile::exists(selectedFile))
-    {
-        if (selectedFileName.left(4) == "PGTA" || selectedFileName.right(4) == ".g5e")
-        {
-            SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
-            if (picture->readingPicture())
-            {
-                openSnapmaticFile(picture);
-                delete picture;
-                return true;
-            }
-            else
-            {
-                if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("Failed to read Snapmatic picture"));
-                delete picture;
-                return false;
-            }
-        }
-        else if (selectedFileName.left(4) == "SGTA")
-        {
-            SavegameData *savegame = new SavegameData(selectedFile);
-            if (savegame->readingSavegame())
-            {
-                openSavegameFile(savegame);
-                delete savegame;
-                return true;
-            }
-            else
-            {
-                if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("Failed to read Savegame file"));
-                delete savegame;
-                return false;
-            }
-        }
-        else
-        {
-            SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
-            SavegameData *savegame = new SavegameData(selectedFile);
-            if (picture->readingPicture())
-            {
-                delete savegame;
-                openSnapmaticFile(picture);
-                delete picture;
-                return true;
-            }
-            else if (savegame->readingSavegame())
-            {
-                delete picture;
-                openSavegameFile(savegame);
-                delete savegame;
-                return true;
-            }
-            else
-            {
-                delete savegame;
-                delete picture;
-                if (warn) QMessageBox::warning(this, tr("Open File"), tr("Can't open %1 because of not valid file format").arg("\""+selectedFileName+"\""));
-                return false;
-            }
-        }
-    }
-    if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("No valid file is selected"));
-    return false;
-}
-
-void UserInterface::openSnapmaticFile(SnapmaticPicture *picture)
-{
-    PictureDialog picDialog(profileDB, crewDB, this);
-    picDialog.setSnapmaticPicture(picture, true);
-    picDialog.setModal(true);
-
-    int crewID = picture->getSnapmaticProperties().crewID;
-    if (crewID != 0) { crewDB->addCrew(crewID); }
-
-    QObject::connect(threadDB, SIGNAL(playerNameFound(int, QString)), profileDB, SLOT(setPlayerName(int, QString)));
-    QObject::connect(threadDB, SIGNAL(playerNameUpdated()), &picDialog, SLOT(playerNameUpdated()));
-
-#ifdef Q_OS_ANDROID
-    // Android optimization should be put here
-    picDialog.showMaximized();
-#else
-    picDialog.show();
-    picDialog.setMinimumSize(picDialog.size());
-    picDialog.setMaximumSize(picDialog.size());
-#endif
-
-    picDialog.exec();
-}
-
-void UserInterface::openSavegameFile(SavegameData *savegame)
-{
-    SavegameDialog sgdDialog(this);
-    sgdDialog.setSavegameData(savegame, savegame->getSavegameFileName(), true);
-    sgdDialog.setModal(true);
-#ifdef Q_OS_ANDROID
-    // Android optimization should be put here
-    sgdDialog.showMaximized();
-#else
-    sgdDialog.show();
-#endif
-    sgdDialog.exec();
-}
-
-void UserInterface::settingsApplied(int _contentMode, QString _language)
-{
-    language = _language;
-    contentMode = _contentMode;
-    if (profileOpen)
-    {
-        profileUI->settingsApplied(contentMode, language);
-    }
-}
-
-void UserInterface::on_actionSelect_GTA_Folder_triggered()
-{
-    QString GTAV_Folder_Temp = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
-    if (QFileInfo(GTAV_Folder_Temp).exists())
-    {
-        GTAV_Folder = GTAV_Folder_Temp;
-        QDir::setCurrent(GTAV_Folder);
-        AppEnv::setGameFolder(GTAV_Folder);
-        on_cmdReload_clicked();
-    }
-}
-
-void UserInterface::on_action_Enable_In_game_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->enableSelected();
-    }
-}
-
-void UserInterface::on_action_Disable_In_game_triggered()
-{
-    if (profileOpen)
-    {
-        profileUI->disableSelected();
-    }
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "UserInterface.h"
+#include "ui_UserInterface.h"
+#include "ProfileInterface.h"
+#include "SnapmaticPicture.h"
+#include "SidebarGenerator.h"
+#include "SavegameDialog.h"
+#include "StandardPaths.h"
+#include "OptionsDialog.h"
+#include "PictureDialog.h"
+#include "SavegameData.h"
+#include "AboutDialog.h"
+#include "IconLoader.h"
+#include "AppEnv.h"
+#include "config.h"
+#include <QtGlobal>
+#include <QStringBuilder>
+#include <QStyleFactory>
+#include <QFileDialog>
+#include <QHBoxLayout>
+#include <QSpacerItem>
+#include <QPushButton>
+#include <QMessageBox>
+#include <QSettings>
+#include <QFileInfo>
+#include <QProcess>
+#include <QDebug>
+#include <QFile>
+#include <QDir>
+#include <QMap>
+
+UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) :
+    QMainWindow(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB),
+    ui(new Ui::UserInterface)
+{
+    ui->setupUi(this);
+    contentMode = 0;
+    profileOpen = 0;
+    profileUI = 0;
+    ui->menuProfile->setEnabled(false);
+    ui->actionSelect_profile->setEnabled(false);
+    ui->actionAbout_gta5sync->setIcon(IconLoader::loadingAppIcon());
+    ui->actionAbout_gta5sync->setText(tr("&About %1").arg(GTA5SYNC_APPSTR));
+    ui->cmdClose->setToolTip(ui->cmdClose->toolTip().arg(GTA5SYNC_APPSTR));
+    defaultWindowTitle = tr("%2 - %1").arg("%1", GTA5SYNC_APPSTR);
+
+    this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
+    ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
+
+    if (QIcon::hasThemeIcon("dialog-close"))
+    {
+        ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+    }
+    if (QIcon::hasThemeIcon("preferences-system"))
+    {
+#ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X
+        ui->actionOptions->setIcon(QIcon::fromTheme("preferences-system"));
+#endif
+    }
+    if (QIcon::hasThemeIcon("application-exit"))
+    {
+#ifndef Q_OS_MACOS // Setting icon for exit/quit lead to a crash in Mac OS X
+        ui->actionExit->setIcon(QIcon::fromTheme("application-exit"));
+#endif
+    }
+
+    // DPI calculation
+    qreal screenRatio = AppEnv::screenRatio();
+    resize(625 * screenRatio, 500 * screenRatio);
+    ui->vlUserInterface->setSpacing(6 * screenRatio);
+    ui->vlUserInterface->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio);
+}
+
+void UserInterface::setupDirEnv()
+{
+    // settings init
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+
+    bool folderExists;
+    GTAV_Folder = AppEnv::getGameFolder(&folderExists);
+    if (folderExists)
+    {
+        QDir::setCurrent(GTAV_Folder);
+    }
+    else
+    {
+        GTAV_Folder = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
+        if (QFileInfo(GTAV_Folder).exists())
+        {
+            folderExists = true;
+            QDir::setCurrent(GTAV_Folder);
+            AppEnv::setGameFolder(GTAV_Folder);
+
+            // First time folder selection save
+            settings.beginGroup("dir");
+            if (settings.value("dir", "").toString().isEmpty())
+            {
+                settings.setValue("dir", GTAV_Folder);
+            }
+            settings.endGroup();
+        }
+    }
+
+    // profiles init
+    settings.beginGroup("Profile");
+    QString defaultProfile = settings.value("Default", "").toString();
+
+    bool contentModeOk;
+    contentMode = settings.value("ContentMode", 0).toInt(&contentModeOk);
+    if (contentMode != 0 && contentMode != 1 && contentMode != 2)
+    {
+        contentMode = 0;
+    }
+
+    if (folderExists)
+    {
+        QDir GTAV_ProfilesDir;
+        GTAV_ProfilesFolder = GTAV_Folder % QDir::separator() % "Profiles";
+        GTAV_ProfilesDir.setPath(GTAV_ProfilesFolder);
+
+        GTAV_Profiles = GTAV_ProfilesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
+        setupProfileUi();
+
+        if (GTAV_Profiles.length() == 1)
+        {
+            openProfile(GTAV_Profiles.at(0));
+        }
+        else if(GTAV_Profiles.contains(defaultProfile))
+        {
+            openProfile(defaultProfile);
+        }
+    }
+    else
+    {
+        GTAV_Profiles = QStringList();
+        setupProfileUi();
+    }
+    settings.endGroup();
+}
+
+void UserInterface::setupProfileUi()
+{
+    qreal screenRatio = AppEnv::screenRatio();
+    if (GTAV_Profiles.length() == 0)
+    {
+        QPushButton *changeDirBtn = new QPushButton(tr("Select &GTA V Folder..."), ui->swSelection);
+        changeDirBtn->setObjectName("cmdChangeDir");
+        changeDirBtn->setMinimumSize(0, 40 * screenRatio);
+        changeDirBtn->setAutoDefault(true);
+        ui->vlButtons->addWidget(changeDirBtn);
+        profileBtns += changeDirBtn;
+
+        QObject::connect(changeDirBtn, SIGNAL(clicked(bool)), this, SLOT(changeFolder_clicked()));
+    }
+    else foreach(const QString &GTAV_Profile, GTAV_Profiles)
+    {
+        QPushButton *profileBtn = new QPushButton(GTAV_Profile, ui->swSelection);
+        profileBtn->setObjectName(GTAV_Profile);
+        profileBtn->setMinimumSize(0, 40 * screenRatio);
+        profileBtn->setAutoDefault(true);
+        ui->vlButtons->addWidget(profileBtn);
+        profileBtns += profileBtn;
+
+        QObject::connect(profileBtn, SIGNAL(clicked(bool)), this, SLOT(profileButton_clicked()));
+    }
+    profileBtns.at(0)->setFocus();
+}
+
+void UserInterface::changeFolder_clicked()
+{
+    on_actionSelect_GTA_Folder_triggered();
+}
+
+void UserInterface::on_cmdReload_clicked()
+{
+    foreach(QPushButton *profileBtn, profileBtns)
+    {
+        ui->vlButtons->removeWidget(profileBtn);
+        profileBtns.removeAll(profileBtn);
+        delete profileBtn;
+    }
+    setupDirEnv();
+}
+
+void UserInterface::profileButton_clicked()
+{
+    QPushButton *profileBtn = (QPushButton*)sender();
+    openProfile(profileBtn->objectName());
+}
+
+void UserInterface::openProfile(const QString &profileName_)
+{
+    profileOpen = true;
+    profileName = profileName_;
+    profileUI = new ProfileInterface(profileDB, crewDB, threadDB);
+    ui->swProfile->addWidget(profileUI);
+    ui->swProfile->setCurrentWidget(profileUI);
+    profileUI->setProfileFolder(GTAV_ProfilesFolder % QDir::separator() % profileName, profileName);
+    profileUI->settingsApplied(contentMode, language);
+    profileUI->setupProfileInterface();
+    QObject::connect(profileUI, SIGNAL(profileClosed()), this, SLOT(closeProfile()));
+    QObject::connect(profileUI, SIGNAL(profileLoaded()), this, SLOT(profileLoaded()));
+    this->setWindowTitle(defaultWindowTitle.arg(profileName));
+}
+
+void UserInterface::closeProfile()
+{
+    if (profileOpen)
+    {
+        profileOpen = false;
+        profileName.clear();
+        ui->menuProfile->setEnabled(false);
+        ui->actionSelect_profile->setEnabled(false);
+        ui->swProfile->removeWidget(profileUI);
+        delete profileUI;
+    }
+    this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
+}
+
+void UserInterface::closeEvent(QCloseEvent *ev)
+{
+    Q_UNUSED(ev)
+    threadDB->doEndThread();
+}
+
+UserInterface::~UserInterface()
+{
+    foreach (QPushButton *profileBtn, profileBtns)
+    {
+        delete profileBtn;
+    }
+    delete ui;
+}
+
+void UserInterface::on_actionExit_triggered()
+{
+    this->close();
+}
+
+void UserInterface::on_actionSelect_profile_triggered()
+{
+    closeProfile();
+    openSelectProfile();
+}
+
+void UserInterface::openSelectProfile()
+{
+    // not needed right now
+}
+
+void UserInterface::on_actionAbout_gta5sync_triggered()
+{
+    AboutDialog *aboutDialog = new AboutDialog(this);
+    aboutDialog->setWindowIcon(windowIcon());
+    aboutDialog->setModal(true);
+#ifdef Q_OS_ANDROID
+    // Android ...
+    aboutDialog->showMaximized();
+#else
+    aboutDialog->show();
+#endif
+    aboutDialog->exec();
+    delete aboutDialog;
+}
+
+void UserInterface::profileLoaded()
+{
+    ui->menuProfile->setEnabled(true);
+    ui->actionSelect_profile->setEnabled(true);
+}
+
+void UserInterface::on_actionSelect_all_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->selectAllWidgets();
+    }
+}
+
+void UserInterface::on_actionDeselect_all_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->deselectAllWidgets();
+    }
+}
+
+void UserInterface::on_actionExport_selected_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->exportSelected();
+    }
+}
+
+void UserInterface::on_actionDelete_selected_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->deleteSelected();
+    }
+}
+
+void UserInterface::on_actionOptions_triggered()
+{
+    OptionsDialog *optionsDialog = new OptionsDialog(profileDB, this);
+    optionsDialog->setWindowIcon(windowIcon());
+    optionsDialog->commitProfiles(GTAV_Profiles);
+    QObject::connect(optionsDialog, SIGNAL(settingsApplied(int, QString)), this, SLOT(settingsApplied(int, QString)));
+
+    optionsDialog->setModal(true);
+#ifdef Q_OS_ANDROID
+    // Android ...
+    optionsDialog->showMaximized();
+#else
+    optionsDialog->show();
+#endif
+    optionsDialog->exec();
+
+    delete optionsDialog;
+}
+
+void UserInterface::on_action_Import_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->importFiles();
+    }
+}
+
+void UserInterface::on_actionOpen_File_triggered()
+{
+    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+    settings.beginGroup("FileDialogs");
+
+fileDialogPreOpen:
+    QFileDialog fileDialog(this);
+    fileDialog.setFileMode(QFileDialog::ExistingFiles);
+    fileDialog.setViewMode(QFileDialog::Detail);
+    fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
+    fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
+    fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
+    fileDialog.setWindowTitle(tr("Open File..."));
+
+    QStringList filters;
+    filters << ProfileInterface::tr("All profile files (*.g5e SGTA* PGTA*)");
+    filters << ProfileInterface::tr("GTA V Export (*.g5e)");
+    filters << ProfileInterface::tr("Savegames files (SGTA*)");
+    filters << ProfileInterface::tr("Snapmatic pictures (PGTA*)");
+    filters << ProfileInterface::tr("All files (**)");
+    fileDialog.setNameFilters(filters);
+
+    QList<QUrl> sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
+
+    fileDialog.setSidebarUrls(sidebarUrls);
+    fileDialog.setDirectory(settings.value("OpenDialogDirectory", StandardPaths::documentsLocation()).toString());
+    fileDialog.restoreGeometry(settings.value("OpenDialogGeometry","").toByteArray());
+
+    if (fileDialog.exec())
+    {
+        QStringList selectedFiles = fileDialog.selectedFiles();
+        if (selectedFiles.length() == 1)
+        {
+            QString selectedFile = selectedFiles.at(0);
+            if (!openFile(selectedFile, true)) goto fileDialogPreOpen;
+        }
+    }
+
+    settings.setValue("OpenDialogGeometry", fileDialog.saveGeometry());
+    settings.setValue("OpenDialogDirectory", fileDialog.directory().absolutePath());
+    settings.endGroup();
+}
+
+bool UserInterface::openFile(QString selectedFile, bool warn)
+{
+    QString selectedFileName = QFileInfo(selectedFile).fileName();
+    if (QFile::exists(selectedFile))
+    {
+        if (selectedFileName.left(4) == "PGTA" || selectedFileName.right(4) == ".g5e")
+        {
+            SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
+            if (picture->readingPicture())
+            {
+                openSnapmaticFile(picture);
+                delete picture;
+                return true;
+            }
+            else
+            {
+                if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("Failed to read Snapmatic picture"));
+                delete picture;
+                return false;
+            }
+        }
+        else if (selectedFileName.left(4) == "SGTA")
+        {
+            SavegameData *savegame = new SavegameData(selectedFile);
+            if (savegame->readingSavegame())
+            {
+                openSavegameFile(savegame);
+                delete savegame;
+                return true;
+            }
+            else
+            {
+                if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("Failed to read Savegame file"));
+                delete savegame;
+                return false;
+            }
+        }
+        else
+        {
+            SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
+            SavegameData *savegame = new SavegameData(selectedFile);
+            if (picture->readingPicture())
+            {
+                delete savegame;
+                openSnapmaticFile(picture);
+                delete picture;
+                return true;
+            }
+            else if (savegame->readingSavegame())
+            {
+                delete picture;
+                openSavegameFile(savegame);
+                delete savegame;
+                return true;
+            }
+            else
+            {
+                delete savegame;
+                delete picture;
+                if (warn) QMessageBox::warning(this, tr("Open File"), tr("Can't open %1 because of not valid file format").arg("\""+selectedFileName+"\""));
+                return false;
+            }
+        }
+    }
+    if (warn) QMessageBox::warning(this, tr("Open File"), ProfileInterface::tr("No valid file is selected"));
+    return false;
+}
+
+void UserInterface::openSnapmaticFile(SnapmaticPicture *picture)
+{
+    PictureDialog picDialog(profileDB, crewDB, this);
+    picDialog.setSnapmaticPicture(picture, true);
+    picDialog.setModal(true);
+
+    int crewID = picture->getSnapmaticProperties().crewID;
+    if (crewID != 0) { crewDB->addCrew(crewID); }
+
+    QObject::connect(threadDB, SIGNAL(crewNameUpdated()), &picDialog, SLOT(crewNameUpdated()));
+    QObject::connect(threadDB, SIGNAL(playerNameUpdated()), &picDialog, SLOT(playerNameUpdated()));
+
+#ifdef Q_OS_ANDROID
+    // Android optimization should be put here
+    picDialog.showMaximized();
+#else
+    picDialog.show();
+    picDialog.setMinimumSize(picDialog.size());
+    picDialog.setMaximumSize(picDialog.size());
+#endif
+
+    picDialog.exec();
+}
+
+void UserInterface::openSavegameFile(SavegameData *savegame)
+{
+    SavegameDialog sgdDialog(this);
+    sgdDialog.setSavegameData(savegame, savegame->getSavegameFileName(), true);
+    sgdDialog.setModal(true);
+#ifdef Q_OS_ANDROID
+    // Android optimization should be put here
+    sgdDialog.showMaximized();
+#else
+    sgdDialog.show();
+#endif
+    sgdDialog.exec();
+}
+
+void UserInterface::settingsApplied(int _contentMode, QString _language)
+{
+    if (language != _language)
+    {
+        retranslateUi();
+        language = _language;
+    }
+    contentMode = _contentMode;
+    if (profileOpen)
+    {
+        profileUI->settingsApplied(contentMode, language);
+    }
+}
+
+void UserInterface::on_actionSelect_GTA_Folder_triggered()
+{
+    QString GTAV_Folder_Temp = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
+    if (QFileInfo(GTAV_Folder_Temp).exists())
+    {
+        GTAV_Folder = GTAV_Folder_Temp;
+        QDir::setCurrent(GTAV_Folder);
+        AppEnv::setGameFolder(GTAV_Folder);
+        on_cmdReload_clicked();
+    }
+}
+
+void UserInterface::on_action_Enable_In_game_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->enableSelected();
+    }
+}
+
+void UserInterface::on_action_Disable_In_game_triggered()
+{
+    if (profileOpen)
+    {
+        profileUI->disableSelected();
+    }
+}
+
+void UserInterface::retranslateUi()
+{
+    ui->retranslateUi(this);
+    ui->actionAbout_gta5sync->setText(tr("&About %1").arg(GTA5SYNC_APPSTR));
+    ui->labVersion->setText(QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
+    if (profileOpen)
+    {
+        this->setWindowTitle(defaultWindowTitle.arg(profileName));
+    }
+    else
+    {
+        this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
+    }
+}
diff --git a/UserInterface.h b/UserInterface.h
index 028cf6e..0ce9e7c 100755
--- a/UserInterface.h
+++ b/UserInterface.h
@@ -1,93 +1,96 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef USERINTERFACE_H
-#define USERINTERFACE_H
-
-#include "SnapmaticPicture.h"
-#include "ProfileInterface.h"
-#include "ProfileDatabase.h"
-#include "DatabaseThread.h"
-#include "CrewDatabase.h"
-#include "SavegameData.h"
-#include <QMainWindow>
-#include <QCloseEvent>
-#include <QString>
-#include <QMap>
-
-namespace Ui {
-class UserInterface;
-}
-
-class UserInterface : public QMainWindow
-{
-    Q_OBJECT
-public:
-    explicit UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
-    void setupDirEnv();
-    ~UserInterface();
-
-private slots:
-    void closeProfile();
-    void profileLoaded();
-    void changeFolder_clicked();
-    void profileButton_clicked();
-    void on_cmdReload_clicked();
-    void on_actionExit_triggered();
-    void on_actionSelect_profile_triggered();
-    void on_actionAbout_gta5sync_triggered();
-    void on_actionSelect_all_triggered();
-    void on_actionDeselect_all_triggered();
-    void on_actionExport_selected_triggered();
-    void on_actionDelete_selected_triggered();
-    void on_actionOptions_triggered();
-    void on_action_Import_triggered();
-    void on_actionOpen_File_triggered();
-    void on_actionSelect_GTA_Folder_triggered();
-    void on_action_Enable_In_game_triggered();
-    void on_action_Disable_In_game_triggered();
-    void settingsApplied(int contentMode, QString language);
-
-protected:
-    void closeEvent(QCloseEvent *ev);
-
-private:
-    ProfileDatabase *profileDB;
-    CrewDatabase *crewDB;
-    DatabaseThread *threadDB;
-    Ui::UserInterface *ui;
-    ProfileInterface *profileUI;
-    QList<QPushButton*> profileBtns;
-    bool profileOpen;
-    int contentMode;
-    QString language;
-    QString defaultWindowTitle;
-    QString GTAV_Folder;
-    QString GTAV_ProfilesFolder;
-    QStringList GTAV_Profiles;
-    void setupProfileUi();
-    void openProfile(QString profileName);
-    void openSelectProfile();
-
-    // Open File
-    bool openFile(QString selectedFile, bool warn = true);
-    void openSavegameFile(SavegameData *savegame);
-    void openSnapmaticFile(SnapmaticPicture *picture);
-};
-
-#endif // USERINTERFACE_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef USERINTERFACE_H
+#define USERINTERFACE_H
+
+#include "SnapmaticPicture.h"
+#include "ProfileInterface.h"
+#include "ProfileDatabase.h"
+#include "DatabaseThread.h"
+#include "CrewDatabase.h"
+#include "SavegameData.h"
+#include <QMainWindow>
+#include <QMouseEvent>
+#include <QCloseEvent>
+#include <QString>
+#include <QMap>
+
+namespace Ui {
+class UserInterface;
+}
+
+class UserInterface : public QMainWindow
+{
+    Q_OBJECT
+public:
+    explicit UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
+    void setupDirEnv();
+    ~UserInterface();
+
+private slots:
+    void closeProfile();
+    void profileLoaded();
+    void changeFolder_clicked();
+    void profileButton_clicked();
+    void on_cmdReload_clicked();
+    void on_actionExit_triggered();
+    void on_actionSelect_profile_triggered();
+    void on_actionAbout_gta5sync_triggered();
+    void on_actionSelect_all_triggered();
+    void on_actionDeselect_all_triggered();
+    void on_actionExport_selected_triggered();
+    void on_actionDelete_selected_triggered();
+    void on_actionOptions_triggered();
+    void on_action_Import_triggered();
+    void on_actionOpen_File_triggered();
+    void on_actionSelect_GTA_Folder_triggered();
+    void on_action_Enable_In_game_triggered();
+    void on_action_Disable_In_game_triggered();
+    void settingsApplied(int contentMode, QString language);
+
+protected:
+    void closeEvent(QCloseEvent *ev);
+
+private:
+    ProfileDatabase *profileDB;
+    CrewDatabase *crewDB;
+    DatabaseThread *threadDB;
+    Ui::UserInterface *ui;
+    ProfileInterface *profileUI;
+    QList<QPushButton*> profileBtns;
+    QString profileName;
+    bool profileOpen;
+    int contentMode;
+    QString language;
+    QString defaultWindowTitle;
+    QString GTAV_Folder;
+    QString GTAV_ProfilesFolder;
+    QStringList GTAV_Profiles;
+    void setupProfileUi();
+    void openProfile(const QString &profileName);
+    void openSelectProfile();
+    void retranslateUi();
+
+    // Open File
+    bool openFile(QString selectedFile, bool warn = true);
+    void openSavegameFile(SavegameData *savegame);
+    void openSnapmaticFile(SnapmaticPicture *picture);
+};
+
+#endif // USERINTERFACE_H
diff --git a/UserInterface.ui b/UserInterface.ui
index 5a34fce..9e2ab52 100755
--- a/UserInterface.ui
+++ b/UserInterface.ui
@@ -1,348 +1,354 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>UserInterface</class>
- <widget class="QMainWindow" name="UserInterface">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>625</width>
-    <height>500</height>
-   </rect>
-  </property>
-  <property name="minimumSize">
-   <size>
-    <width>625</width>
-    <height>500</height>
-   </size>
-  </property>
-  <property name="windowTitle">
-   <string>%2 - %1</string>
-  </property>
-  <widget class="QWidget" name="cwUI">
-   <layout class="QVBoxLayout" name="vlUI">
-    <property name="leftMargin">
-     <number>0</number>
-    </property>
-    <property name="topMargin">
-     <number>0</number>
-    </property>
-    <property name="rightMargin">
-     <number>0</number>
-    </property>
-    <property name="bottomMargin">
-     <number>0</number>
-    </property>
-    <item>
-     <widget class="QStackedWidget" name="swProfile">
-      <property name="lineWidth">
-       <number>0</number>
-      </property>
-      <widget class="QWidget" name="swSelection">
-       <layout class="QVBoxLayout" name="vlUserInterface">
-        <property name="spacing">
-         <number>6</number>
-        </property>
-        <property name="leftMargin">
-         <number>9</number>
-        </property>
-        <property name="topMargin">
-         <number>9</number>
-        </property>
-        <property name="rightMargin">
-         <number>9</number>
-        </property>
-        <property name="bottomMargin">
-         <number>9</number>
-        </property>
-        <item>
-         <spacer name="vsUpper">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>0</width>
-            <height>0</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QLabel" name="labSelectProfile">
-          <property name="text">
-           <string>Select profile</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignCenter</set>
-          </property>
-          <property name="wordWrap">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <layout class="QVBoxLayout" name="vlButtons"/>
-        </item>
-        <item>
-         <spacer name="vsFooter">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>0</width>
-            <height>0</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <layout class="QHBoxLayout" name="hlButtons">
-          <item>
-           <widget class="QLabel" name="labVersion">
-            <property name="text">
-             <string>%1 %2</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <spacer name="hsButtons">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>0</width>
-              <height>0</height>
-             </size>
-            </property>
-           </spacer>
-          </item>
-          <item>
-           <widget class="QPushButton" name="cmdReload">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="text">
-             <string>&amp;Reload</string>
-            </property>
-            <property name="autoDefault">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QPushButton" name="cmdClose">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="text">
-             <string>&amp;Close</string>
-            </property>
-            <property name="autoDefault">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-       </layout>
-      </widget>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menuBar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>625</width>
-     <height>21</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menuFile">
-    <property name="title">
-     <string>&amp;File</string>
-    </property>
-    <addaction name="actionSelect_GTA_Folder"/>
-    <addaction name="actionOpen_File"/>
-    <addaction name="actionSelect_profile"/>
-    <addaction name="separator"/>
-    <addaction name="actionExit"/>
-   </widget>
-   <widget class="QMenu" name="menuHelp">
-    <property name="title">
-     <string>&amp;Help</string>
-    </property>
-    <addaction name="actionAbout_gta5sync"/>
-   </widget>
-   <widget class="QMenu" name="menuEdit">
-    <property name="title">
-     <string>&amp;Edit</string>
-    </property>
-    <addaction name="actionOptions"/>
-   </widget>
-   <widget class="QMenu" name="menuProfile">
-    <property name="title">
-     <string>&amp;Profile</string>
-    </property>
-    <widget class="QMenu" name="menuSelection_visibility">
-     <property name="title">
-      <string>&amp;Selection visibility</string>
-     </property>
-     <addaction name="action_Enable_In_game"/>
-     <addaction name="action_Disable_In_game"/>
-    </widget>
-    <addaction name="action_Import"/>
-    <addaction name="actionExport_selected"/>
-    <addaction name="actionDelete_selected"/>
-    <addaction name="separator"/>
-    <addaction name="menuSelection_visibility"/>
-    <addaction name="separator"/>
-    <addaction name="actionSelect_all"/>
-    <addaction name="actionDeselect_all"/>
-   </widget>
-   <addaction name="menuFile"/>
-   <addaction name="menuEdit"/>
-   <addaction name="menuProfile"/>
-   <addaction name="menuHelp"/>
-  </widget>
-  <action name="actionAbout_gta5sync">
-   <property name="text">
-    <string>&amp;About %1</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+P</string>
-   </property>
-  </action>
-  <action name="actionExit">
-   <property name="text">
-    <string>&amp;Exit</string>
-   </property>
-   <property name="toolTip">
-    <string>Exit</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+Q</string>
-   </property>
-  </action>
-  <action name="actionSelect_profile">
-   <property name="text">
-    <string>Close &amp;Profile</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+End</string>
-   </property>
-  </action>
-  <action name="actionOptions">
-   <property name="text">
-    <string>&amp;Settings</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+S</string>
-   </property>
-  </action>
-  <action name="actionSelect_all">
-   <property name="text">
-    <string>Select &amp;All</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+A</string>
-   </property>
-  </action>
-  <action name="actionDeselect_all">
-   <property name="text">
-    <string>&amp;Deselect All</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+D</string>
-   </property>
-  </action>
-  <action name="actionExport_selected">
-   <property name="text">
-    <string>&amp;Export selected...</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+E</string>
-   </property>
-  </action>
-  <action name="actionDelete_selected">
-   <property name="text">
-    <string>&amp;Remove selected</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+Del</string>
-   </property>
-  </action>
-  <action name="action_Import">
-   <property name="text">
-    <string>&amp;Import files...</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+I</string>
-   </property>
-  </action>
-  <action name="actionOpen_File">
-   <property name="text">
-    <string>&amp;Open File...</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+O</string>
-   </property>
-  </action>
-  <action name="actionSelect_GTA_Folder">
-   <property name="text">
-    <string>Select &amp;GTA V Folder...</string>
-   </property>
-   <property name="toolTip">
-    <string>Select GTA V Folder...</string>
-   </property>
-   <property name="shortcut">
-    <string>Ctrl+G</string>
-   </property>
-  </action>
-  <action name="action_Enable_In_game">
-   <property name="text">
-    <string>Show In-gam&amp;e</string>
-   </property>
-   <property name="shortcut">
-    <string>Shift+E</string>
-   </property>
-  </action>
-  <action name="action_Disable_In_game">
-   <property name="text">
-    <string>Hi&amp;de In-game</string>
-   </property>
-   <property name="shortcut">
-    <string>Shift+D</string>
-   </property>
-  </action>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>cmdClose</sender>
-   <signal>clicked()</signal>
-   <receiver>UserInterface</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>572</x>
-     <y>476</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>312</x>
-     <y>249</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UserInterface</class>
+ <widget class="QMainWindow" name="UserInterface">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>625</width>
+    <height>500</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>625</width>
+    <height>500</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>%2 - %1</string>
+  </property>
+  <widget class="QWidget" name="cwUI">
+   <layout class="QVBoxLayout" name="vlUI">
+    <property name="leftMargin">
+     <number>0</number>
+    </property>
+    <property name="topMargin">
+     <number>0</number>
+    </property>
+    <property name="rightMargin">
+     <number>0</number>
+    </property>
+    <property name="bottomMargin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QStackedWidget" name="swProfile">
+      <property name="lineWidth">
+       <number>0</number>
+      </property>
+      <widget class="QWidget" name="swSelection">
+       <layout class="QVBoxLayout" name="vlUserInterface">
+        <property name="spacing">
+         <number>6</number>
+        </property>
+        <property name="leftMargin">
+         <number>9</number>
+        </property>
+        <property name="topMargin">
+         <number>9</number>
+        </property>
+        <property name="rightMargin">
+         <number>9</number>
+        </property>
+        <property name="bottomMargin">
+         <number>9</number>
+        </property>
+        <item>
+         <spacer name="vsUpper">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>0</width>
+            <height>0</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QLabel" name="labSelectProfile">
+          <property name="text">
+           <string>Select profile</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
+          </property>
+          <property name="wordWrap">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <layout class="QVBoxLayout" name="vlButtons"/>
+        </item>
+        <item>
+         <spacer name="vsFooter">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>0</width>
+            <height>0</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <layout class="QHBoxLayout" name="hlButtons">
+          <item>
+           <widget class="QLabel" name="labVersion">
+            <property name="text">
+             <string>%1 %2</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <spacer name="hsButtons">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>0</width>
+              <height>0</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <widget class="QPushButton" name="cmdReload">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>Reload profile overview</string>
+            </property>
+            <property name="text">
+             <string>&amp;Reload</string>
+            </property>
+            <property name="autoDefault">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QPushButton" name="cmdClose">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string extracomment="Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically">Close %1</string>
+            </property>
+            <property name="text">
+             <string>&amp;Close</string>
+            </property>
+            <property name="autoDefault">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>625</width>
+     <height>21</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuFile">
+    <property name="title">
+     <string>&amp;File</string>
+    </property>
+    <addaction name="actionSelect_GTA_Folder"/>
+    <addaction name="actionOpen_File"/>
+    <addaction name="actionSelect_profile"/>
+    <addaction name="separator"/>
+    <addaction name="actionExit"/>
+   </widget>
+   <widget class="QMenu" name="menuHelp">
+    <property name="title">
+     <string>&amp;Help</string>
+    </property>
+    <addaction name="actionAbout_gta5sync"/>
+   </widget>
+   <widget class="QMenu" name="menuEdit">
+    <property name="title">
+     <string>&amp;Edit</string>
+    </property>
+    <addaction name="actionOptions"/>
+   </widget>
+   <widget class="QMenu" name="menuProfile">
+    <property name="title">
+     <string>&amp;Profile</string>
+    </property>
+    <widget class="QMenu" name="menuSelection_visibility">
+     <property name="title">
+      <string>&amp;Selection visibility</string>
+     </property>
+     <addaction name="action_Enable_In_game"/>
+     <addaction name="action_Disable_In_game"/>
+    </widget>
+    <addaction name="action_Import"/>
+    <addaction name="actionExport_selected"/>
+    <addaction name="actionDelete_selected"/>
+    <addaction name="separator"/>
+    <addaction name="menuSelection_visibility"/>
+    <addaction name="separator"/>
+    <addaction name="actionSelect_all"/>
+    <addaction name="actionDeselect_all"/>
+   </widget>
+   <addaction name="menuFile"/>
+   <addaction name="menuEdit"/>
+   <addaction name="menuProfile"/>
+   <addaction name="menuHelp"/>
+  </widget>
+  <action name="actionAbout_gta5sync">
+   <property name="text">
+    <string>&amp;About %1</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+P</string>
+   </property>
+  </action>
+  <action name="actionExit">
+   <property name="text">
+    <string>&amp;Exit</string>
+   </property>
+   <property name="toolTip">
+    <string>Exit</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Q</string>
+   </property>
+  </action>
+  <action name="actionSelect_profile">
+   <property name="text">
+    <string>Close &amp;Profile</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+End</string>
+   </property>
+  </action>
+  <action name="actionOptions">
+   <property name="text">
+    <string>&amp;Settings</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+S</string>
+   </property>
+  </action>
+  <action name="actionSelect_all">
+   <property name="text">
+    <string>Select &amp;All</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+A</string>
+   </property>
+  </action>
+  <action name="actionDeselect_all">
+   <property name="text">
+    <string>&amp;Deselect All</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+D</string>
+   </property>
+  </action>
+  <action name="actionExport_selected">
+   <property name="text">
+    <string>&amp;Export selected...</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+E</string>
+   </property>
+  </action>
+  <action name="actionDelete_selected">
+   <property name="text">
+    <string>&amp;Remove selected</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Del</string>
+   </property>
+  </action>
+  <action name="action_Import">
+   <property name="text">
+    <string>&amp;Import files...</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+I</string>
+   </property>
+  </action>
+  <action name="actionOpen_File">
+   <property name="text">
+    <string>&amp;Open File...</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+O</string>
+   </property>
+  </action>
+  <action name="actionSelect_GTA_Folder">
+   <property name="text">
+    <string>Select &amp;GTA V Folder...</string>
+   </property>
+   <property name="toolTip">
+    <string>Select GTA V Folder...</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+G</string>
+   </property>
+  </action>
+  <action name="action_Enable_In_game">
+   <property name="text">
+    <string>Show In-gam&amp;e</string>
+   </property>
+   <property name="shortcut">
+    <string>Shift+E</string>
+   </property>
+  </action>
+  <action name="action_Disable_In_game">
+   <property name="text">
+    <string>Hi&amp;de In-game</string>
+   </property>
+   <property name="shortcut">
+    <string>Shift+D</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>cmdClose</sender>
+   <signal>clicked()</signal>
+   <receiver>UserInterface</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>572</x>
+     <y>476</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>312</x>
+     <y>249</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/config.h b/config.h
index 25c313c..5e52fdf 100755
--- a/config.h
+++ b/config.h
@@ -1,101 +1,161 @@
-/*****************************************************************************
-* gta5view Grand Theft Auto V Profile Viewer
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-#include <QString>
-
-#ifndef GTA5SYNC_APPVENDOR
-#define GTA5SYNC_APPVENDOR "Syping"
-#endif
-
-#ifndef GTA5SYNC_APPVENDORLINK
-#define GTA5SYNC_APPVENDORLINK "https://github.com/Syping/"
-#endif
-
-#ifndef GTA5SYNC_DISABLED
-#define GTA5SYNC_ENABLED
-#endif
-
-#ifndef GTA5SYNC_APPSTR
-#ifdef GTA5SYNC_ENABLED
-#define GTA5SYNC_APPSTR "gta5sync"
-#else
-#define GTA5SYNC_APPSTR "gta5view"
-#endif
-#endif
-
-#ifndef GTA5SYNC_APPDES
-#define GTA5SYNC_APPDES "INSERT YOUR APPLICATION DESCRIPTION HERE"
-#endif
-
-#ifndef GTA5SYNC_COPYRIGHT
-#define GTA5SYNC_COPYRIGHT "2016-2017"
-#endif
-
-#ifndef GTA5SYNC_APPVER
-#ifndef GTA5SYNC_DAILYB
-#define GTA5SYNC_APPVER "1.4.4"
-#else
-#define GTA5SYNC_APPVER QString("%1").arg(GTA5SYNC_DAILYB)
-#endif
-#endif
-
-#ifndef GTA5SYNC_BUILDTYPE
-#define GTA5SYNC_BUILDTYPE "Custom"
-#endif
-
-#ifndef GTA5SYNC_SHARE
-#define GTA5SYNC_SHARE "$RUNDIR"
-#endif
-
-#ifndef GTA5SYNC_LANG
-#define GTA5SYNC_LANG "$SHAREDIR$SEPARATORlang"
-#endif
-
-#ifndef GTA5SYNC_PLUG
-#define GTA5SYNC_PLUG "$RUNDIR$SEPARATORplugins"
-#endif
-
-#ifdef GTA5SYNC_WINRT
-#undef GTA5SYNC_WIN
-#endif
-
-#ifndef GTA5SYNC_COMPILER
-#ifdef __clang__
-#define GTA5SYNC_COMPILER QString("Clang %1.%2.%3").arg(QString::number(__clang_major__), QString::number(__clang_minor__), QString::number(__clang_patchlevel__))
-#elif defined(__GNUC__)
-#define GTA5SYNC_COMPILER QString("GCC %1.%2.%3").arg(QString::number(__GNUC__), QString::number(__GNUC_MINOR__), QString::number(__GNUC_PATCHLEVEL__))
-#elif defined(__GNUG__)
-#define GTA5SYNC_COMPILER QString("GCC %1.%2.%3").arg(QString::number(__GNUG__), QString::number(__GNUC_MINOR__), QString::number(__GNUC_PATCHLEVEL__))
-#elif defined(_MSC_VER)
-#define GTA5SYNC_COMPILER QString("MSVC %1").arg(QString::number(_MSC_VER).insert(2, "."))
-#else
-#define GTA5SYNC_COMPILER QString("Unknown Compiler")
-#endif
-#endif
-
-#ifndef GTA5SYNC_BUILDDATETIME
-#define GTA5SYNC_BUILDDATETIME QString("%1, %2").arg(__DATE__, __TIME__);
-#endif
-
-#ifndef GTA5SYNC_BUILDSTRING
-#define GTA5SYNC_BUILDSTRING QString("%1, %2").arg(QT_VERSION_STR, GTA5SYNC_COMPILER);
-#endif
-
-#endif // CONFIG_H
+/*****************************************************************************
+* gta5view Grand Theft Auto V Profile Viewer
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+#include <QtGlobal>
+#include <QString>
+
+#ifndef GTA5SYNC_APPVENDOR
+#define GTA5SYNC_APPVENDOR "Syping"
+#endif
+
+#ifndef GTA5SYNC_APPVENDORLINK
+#define GTA5SYNC_APPVENDORLINK "https://github.com/Syping/"
+#endif
+
+#ifndef GTA5SYNC_DISABLED
+#define GTA5SYNC_ENABLED
+#endif
+
+#ifndef GTA5SYNC_APPSTR
+#ifdef GTA5SYNC_ENABLED
+#define GTA5SYNC_APPSTR "gta5sync"
+#else
+#define GTA5SYNC_APPSTR "gta5view"
+#endif
+#endif
+
+#ifndef GTA5SYNC_APPDES
+#define GTA5SYNC_APPDES "INSERT YOUR APPLICATION DESCRIPTION HERE"
+#endif
+
+#ifndef GTA5SYNC_COPYRIGHT
+#define GTA5SYNC_COPYRIGHT "2016-2017"
+#endif
+
+#ifndef GTA5SYNC_APPVER
+#ifndef GTA5SYNC_DAILYB
+#define GTA5SYNC_APPVER "1.5.0-dev1"
+#else
+#define GTA5SYNC_APPVER GTA5SYNC_DAILYB
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_REL
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Release")
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_RC
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Release Candidate")
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_DAILY
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Daily Build")
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_DEV
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Developer")
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_BETA
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Beta")
+#endif
+#endif
+
+#ifdef GTA5SYNC_BUILDTYPE_ALPHA
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE QT_TRANSLATE_NOOP("AboutDialog", "Alpha")
+#endif
+#endif
+
+#ifdef GTA5SYNC_DAILYB
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE "Daily Build"
+#endif
+#endif
+
+#ifndef GTA5SYNC_BUILDTYPE
+#define GTA5SYNC_BUILDTYPE "Custom"
+#endif
+
+#ifdef GTA5SYNC_QCONF
+#ifndef GTA5SYNC_SHARE
+#define GTA5SYNC_SHARE "RUNDIR:SEPARATOR:..SEPARATOR:share"
+#endif
+#ifndef GTA5SYNC_LANG
+#define GTA5SYNC_LANG "QCONFLANG:"
+#endif
+#ifndef GTA5SYNC_PLUG
+#define GTA5SYNC_PLUG "QCONFPLUG:"
+#endif
+#ifdef GTA5SYNC_QCONF_IN
+#ifndef GTA5SYNC_INLANG
+#define GTA5SYNC_INLANG ":/tr"
+#endif
+#endif
+#endif
+
+#ifndef GTA5SYNC_SHARE
+#define GTA5SYNC_SHARE "RUNDIR:"
+#endif
+
+#ifndef GTA5SYNC_LANG
+#define GTA5SYNC_LANG "SHAREDDIR:SEPARATOR:lang"
+#endif
+
+#ifndef GTA5SYNC_PLUG
+#define GTA5SYNC_PLUG "RUNDIR:SEPARATOR:plugins"
+#endif
+
+#ifdef GTA5SYNC_WINRT
+#undef GTA5SYNC_WIN
+#endif
+
+#ifndef GTA5SYNC_COMPILER
+#ifdef __clang__
+#define GTA5SYNC_COMPILER QString("Clang %1.%2.%3").arg(QString::number(__clang_major__), QString::number(__clang_minor__), QString::number(__clang_patchlevel__))
+#elif defined(__GNUC__)
+#define GTA5SYNC_COMPILER QString("GCC %1.%2.%3").arg(QString::number(__GNUC__), QString::number(__GNUC_MINOR__), QString::number(__GNUC_PATCHLEVEL__))
+#elif defined(__GNUG__)
+#define GTA5SYNC_COMPILER QString("GCC %1.%2.%3").arg(QString::number(__GNUG__), QString::number(__GNUC_MINOR__), QString::number(__GNUC_PATCHLEVEL__))
+#elif defined(_MSC_VER)
+#define GTA5SYNC_COMPILER QString("MSVC %1").arg(QString::number(_MSC_VER).insert(2, "."))
+#else
+#define GTA5SYNC_COMPILER QString("Unknown Compiler")
+#endif
+#endif
+
+#ifndef GTA5SYNC_BUILDDATETIME
+#define GTA5SYNC_BUILDDATETIME QString("%1, %2").arg(__DATE__, __TIME__)
+#endif
+
+#ifndef GTA5SYNC_BUILDSTRING
+#define GTA5SYNC_BUILDSTRING QString("%1, %2").arg(QT_VERSION_STR, GTA5SYNC_COMPILER)
+#endif
+
+#endif // CONFIG_H
diff --git a/gta5view.pro b/gta5view.pro
index 58e2987..e2a3418 100755
--- a/gta5view.pro
+++ b/gta5view.pro
@@ -1,172 +1,196 @@
-#/*****************************************************************************
-#* gta5view Grand Theft Auto V Profile Viewer
-#* Copyright (C) 2015-2017 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
-#* the Free Software Foundation, either version 3 of the License, or
-#* (at your option) any later version.
-#*
-#* This program is distributed in the hope that it will be useful,
-#* but WITHOUT ANY WARRANTY; without even the implied warranty of
-#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#* GNU General Public License for more details.
-#*
-#* You should have received a copy of the GNU General Public License
-#* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#*****************************************************************************/
-
-QT       += core gui network
-
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 1): win32: QT += winextras
-
-DEFINES += GTA5SYNC_DISABLED
-
-DEPLOYMENT.display_name = gta5view
-TARGET = gta5view
-TEMPLATE = app
-
-SOURCES += main.cpp \
-    AboutDialog.cpp \
-    AppEnv.cpp \
-    CrewDatabase.cpp \
-    DatabaseThread.cpp \
-    ExportDialog.cpp \
-    ExportThread.cpp \
-    GlobalString.cpp \
-    IconLoader.cpp \
-    ImportDialog.cpp \
-    OptionsDialog.cpp \
-    PictureDialog.cpp \
-    PictureExport.cpp \
-    PictureWidget.cpp \
-    ProfileDatabase.cpp \
-    ProfileInterface.cpp \
-    ProfileLoader.cpp \
-    ProfileWidget.cpp \
-    SavegameCopy.cpp \
-    SavegameData.cpp \
-    SavegameDialog.cpp \
-    SavegameWidget.cpp \
-    SidebarGenerator.cpp \
-    SnapmaticEditor.cpp \
-    SnapmaticPicture.cpp \
-    SnapmaticWidget.cpp \
-    StandardPaths.cpp \
-    StringParser.cpp \
-    UserInterface.cpp \
-    uimod/UiModLabel.cpp \
-    uimod/UiModWidget.cpp
-
-HEADERS  += \
-    AboutDialog.h \
-    AppEnv.h \
-    CrewDatabase.h \
-    DatabaseThread.h \
-    ExportDialog.h \
-    ExportThread.h \
-    GlobalString.h \
-    IconLoader.h \
-    ImportDialog.h \
-    OptionsDialog.h \
-    PictureDialog.h \
-    PictureExport.h \
-    PictureWidget.h \
-    ProfileDatabase.h \
-    ProfileInterface.h \
-    ProfileLoader.h \
-    ProfileWidget.h \
-    SavegameCopy.h \
-    SavegameData.h \
-    SavegameDialog.h \
-    SavegameWidget.h \
-    SidebarGenerator.h \
-    SnapmaticEditor.h \
-    SnapmaticPicture.h \
-    SnapmaticWidget.h \
-    StandardPaths.h \
-    StringParser.h \
-    UserInterface.h \
-    uimod/UiModLabel.h \
-    uimod/UiModWidget.h
-
-PRECOMPILED_HEADER += config.h
-
-FORMS    += \
-    AboutDialog.ui \
-    ExportDialog.ui \
-    ImportDialog.ui \
-    OptionsDialog.ui \
-    PictureDialog.ui \
-    ProfileInterface.ui \
-    SavegameDialog.ui \
-    SavegameWidget.ui \
-    SnapmaticEditor.ui \
-    SnapmaticWidget.ui \
-    UserInterface.ui
-
-TRANSLATIONS += \
-    res/gta5sync_de.ts \
-    res/gta5sync_fr.ts \
-    res/gta5sync_ru.ts
-
-RESOURCES += \
-    res/tr_g5p.qrc \
-    res/app.qrc
-
-DISTFILES += res/app.rc \
-    res/gta5sync.desktop \
-    res/gta5sync_de.ts \
-    res/gta5sync_fr.ts \
-    res/gta5sync_ru.ts \
-    res/gta5view.exe.manifest \
-    res/gta5view.png \
-    lang/README.txt
-
-INCLUDEPATH += ./uimod
-
-# WINDOWS ONLY
-
-win32: DEFINES += GTA5SYNC_WIN
-win32: RC_FILE += res/app.rc
-win32: LIBS += -luser32
-win32: CONFIG -= embed_manifest_exe
-
-# MAC OS X ONLY
-macx: ICON = res/5sync.icns
-
-# QT4 ONLY STUFF
-
-isEqual(QT_MAJOR_VERSION, 4): INCLUDEPATH += ./qjson4
-isEqual(QT_MAJOR_VERSION, 4): HEADERS += qjson4/QJsonArray.h \
-    qjson4/QJsonDocument.h \
-    qjson4/QJsonObject.h \
-    qjson4/QJsonParseError.h \
-    qjson4/QJsonValue.h \
-    qjson4/QJsonValueRef.h \
-    qjson4/QJsonParser.h \
-    qjson4/QJsonRoot.h
-
-isEqual(QT_MAJOR_VERSION, 4): SOURCES += qjson4/QJsonArray.cpp \
-    qjson4/QJsonDocument.cpp \
-    qjson4/QJsonObject.cpp \
-    qjson4/QJsonParseError.cpp \
-    qjson4/QJsonValue.cpp \
-    qjson4/QJsonValueRef.cpp \
-    qjson4/QJsonParser.cpp
-
-isEqual(QT_MAJOR_VERSION, 4): RESOURCES += res/tr_qt4.qrc
-
-# QT5 ONLY STUFF
-
-isEqual(QT_MAJOR_VERSION, 5): RESOURCES += res/tr_qt5.qrc
-
-# UNIX SYSTEM STUFF
-
-unix: !macx: appfiles.path = $$(INSTALL_PATH)/share/applications
-unix: !macx: appfiles.files = $$PWD/res/gta5view.desktop
-unix: !macx: pixmaps.path = $$(INSTALL_PATH)/share/pixmaps
-unix: !macx: pixmaps.files = $$PWD/res/gta5view.png
-unix: !macx: target.path = $$(INSTALL_PATH)/bin
-unix: !macx: INSTALLS += target pixmaps appfiles
+#/*****************************************************************************
+#* gta5view Grand Theft Auto V Profile Viewer
+#* Copyright (C) 2015-2017 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
+#* the Free Software Foundation, either version 3 of the License, or
+#* (at your option) any later version.
+#*
+#* This program is distributed in the hope that it will be useful,
+#* but WITHOUT ANY WARRANTY; without even the implied warranty of
+#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#* GNU General Public License for more details.
+#*
+#* You should have received a copy of the GNU General Public License
+#* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#*****************************************************************************/
+
+QT       += core gui network
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 1): win32: QT += winextras
+
+DEFINES += GTA5SYNC_DISABLED
+
+DEPLOYMENT.display_name = gta5view
+TARGET = gta5view
+TEMPLATE = app
+
+DEFINES += GTA5SYNC_CSDF # Not assisting at proper usage of SnapmaticPicture class
+HEADERS += config.h
+PRECOMPILED_HEADER += config.h
+
+SOURCES += main.cpp \
+    AboutDialog.cpp \
+    AppEnv.cpp \
+    CrewDatabase.cpp \
+    DatabaseThread.cpp \
+    ExportDialog.cpp \
+    ExportThread.cpp \
+    GlobalString.cpp \
+    IconLoader.cpp \
+    ImportDialog.cpp \
+    MapPreviewDialog.cpp \
+    OptionsDialog.cpp \
+    PictureDialog.cpp \
+    PictureExport.cpp \
+    PictureWidget.cpp \
+    ProfileDatabase.cpp \
+    ProfileInterface.cpp \
+    ProfileLoader.cpp \
+    ProfileWidget.cpp \
+    SavegameCopy.cpp \
+    SavegameData.cpp \
+    SavegameDialog.cpp \
+    SavegameWidget.cpp \
+    SidebarGenerator.cpp \
+    SnapmaticEditor.cpp \
+    SnapmaticPicture.cpp \
+    SnapmaticWidget.cpp \
+    StandardPaths.cpp \
+    StringParser.cpp \
+    TranslationClass.cpp \
+    UserInterface.cpp \
+    uimod/UiModLabel.cpp \
+    uimod/UiModWidget.cpp
+
+HEADERS  += \
+    AboutDialog.h \
+    AppEnv.h \
+    CrewDatabase.h \
+    DatabaseThread.h \
+    ExportDialog.h \
+    ExportThread.h \
+    GlobalString.h \
+    IconLoader.h \
+    ImportDialog.h \
+    MapPreviewDialog.h \
+    OptionsDialog.h \
+    PictureDialog.h \
+    PictureExport.h \
+    PictureWidget.h \
+    ProfileDatabase.h \
+    ProfileInterface.h \
+    ProfileLoader.h \
+    ProfileWidget.h \
+    SavegameCopy.h \
+    SavegameData.h \
+    SavegameDialog.h \
+    SavegameWidget.h \
+    SidebarGenerator.h \
+    SnapmaticEditor.h \
+    SnapmaticPicture.h \
+    SnapmaticWidget.h \
+    StandardPaths.h \
+    StringParser.h \
+    TranslationClass.h \
+    UserInterface.h \
+    uimod/UiModLabel.h \
+    uimod/UiModWidget.h
+
+FORMS    += \
+    AboutDialog.ui \
+    ExportDialog.ui \
+    ImportDialog.ui \
+    MapPreviewDialog.ui \
+    OptionsDialog.ui \
+    PictureDialog.ui \
+    ProfileInterface.ui \
+    SavegameDialog.ui \
+    SavegameWidget.ui \
+    SnapmaticEditor.ui \
+    SnapmaticWidget.ui \
+    UserInterface.ui
+
+TRANSLATIONS += \
+    res/gta5sync_en_US.ts \
+    res/gta5sync_de.ts \
+    res/gta5sync_fr.ts \
+    res/gta5sync_ru.ts \
+    lang/gta5sync_no.ts
+
+RESOURCES += \
+    res/tr_g5p.qrc \
+    res/app.qrc
+
+DISTFILES += res/app.rc \
+    res/gta5view.desktop \
+    res/gta5sync_de.ts \
+    res/gta5sync_fr.ts \
+    res/gta5sync_ru.ts \
+    res/gta5view.exe.manifest \
+    res/gta5view.png \
+    lang/gta5sync_no.ts \
+    lang/README.txt
+
+INCLUDEPATH += ./uimod
+
+# WINDOWS ONLY
+
+win32: DEFINES += GTA5SYNC_WIN
+win32: RC_FILE += res/app.rc
+win32: LIBS += -luser32
+win32: CONFIG -= embed_manifest_exe
+
+# MAC OS X ONLY
+macx: ICON = res/5sync.icns
+
+# QT4 ONLY STUFF
+
+isEqual(QT_MAJOR_VERSION, 4): INCLUDEPATH += ./qjson4
+isEqual(QT_MAJOR_VERSION, 4): HEADERS += qjson4/QJsonArray.h \
+    qjson4/QJsonDocument.h \
+    qjson4/QJsonObject.h \
+    qjson4/QJsonParseError.h \
+    qjson4/QJsonValue.h \
+    qjson4/QJsonValueRef.h \
+    qjson4/QJsonParser.h \
+    qjson4/QJsonRoot.h
+
+isEqual(QT_MAJOR_VERSION, 4): SOURCES += qjson4/QJsonArray.cpp \
+    qjson4/QJsonDocument.cpp \
+    qjson4/QJsonObject.cpp \
+    qjson4/QJsonParseError.cpp \
+    qjson4/QJsonValue.cpp \
+    qjson4/QJsonValueRef.cpp \
+    qjson4/QJsonParser.cpp
+
+isEqual(QT_MAJOR_VERSION, 4): RESOURCES += res/tr_qt4.qrc
+
+# QT5 ONLY STUFF
+isEqual(QT_MAJOR_VERSION, 5): RESOURCES += res/tr_qt5.qrc
+
+# PROJECT INSTALLATION
+
+isEmpty(GTA5SYNC_PREFIX): GTA5SYNC_PREFIX = /usr/local
+
+appfiles.path = $$GTA5SYNC_PREFIX/share/applications
+appfiles.files = $$PWD/res/gta5view.desktop
+pixmaps.path = $$GTA5SYNC_PREFIX/share/pixmaps
+pixmaps.files = $$PWD/res/gta5view.png
+target.path = $$GTA5SYNC_PREFIX/bin
+INSTALLS += target pixmaps appfiles
+
+# QCONF BASED BUILD STUFF
+
+contains(DEFINES, GTA5SYNC_QCONF){
+    isEqual(QT_MAJOR_VERSION, 4): RESOURCES -= res/tr_qt4.qrc
+    isEqual(QT_MAJOR_VERSION, 5): RESOURCES -= res/tr_qt5.qrc
+    !contains(DEFINES, GTA5SYNC_QCONF_IN){
+        RESOURCES -= res/tr_g5p.qrc
+        langfiles.path = $$GTA5SYNC_PREFIX/share/gta5view/translations
+        langfiles.files = $$PWD/res/gta5sync_en_US.qm $$PWD/res/gta5sync_de.qm $$PWD/res/gta5sync_fr.qm $$PWD/res/gta5sync_ru.qm $$PWD/res/qtbase_en_GB.qm
+        INSTALLS += langfiles
+    }
+}
diff --git a/lang/gta5sync_no.qm b/lang/gta5sync_no.qm
new file mode 100644
index 0000000..9dad8df
Binary files /dev/null and b/lang/gta5sync_no.qm differ
diff --git a/lang/gta5sync_no.ts b/lang/gta5sync_no.ts
new file mode 100644
index 0000000..f18d088
--- /dev/null
+++ b/lang/gta5sync_no.ts
@@ -0,0 +1,1619 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nb_NO">
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../AboutDialog.ui" line="14"/>
+        <source>About %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.ui" line="29"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;%1&lt;/span&gt;&lt;br/&gt;
+&lt;br/&gt;
+%2&lt;br/&gt;
+&lt;br/&gt;
+Version %3&lt;br/&gt;
+Created on %4&lt;br/&gt;
+Built with Qt %5&lt;br/&gt;
+Running with Qt %6&lt;br/&gt;
+&lt;br/&gt;
+%7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.ui" line="75"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="41"/>
+        <source>Using %1 %2</source>
+        <extracomment>Using specific library, example Using libmyfuck</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="43"/>
+        <source>Translated by %1</source>
+        <extracomment>Translated by translator, example Translated by Syping</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="45"/>
+        <source>NAME_OF_TRANSLATOR</source>
+        <extracomment>Enter your name there</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="47"/>
+        <source>TRANSLATOR_PROFILE</source>
+        <extracomment>Enter your proilfe there, example a GitHub profile, E-Mail with &quot;mailto: afucker@sumfuck.com&quot; or a webpage</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="78"/>
+        <source>A project for viewing and sync Grand Theft Auto V Snapmatic&lt;br/&gt;
+Pictures and Savegames</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="80"/>
+        <source>A project for viewing Grand Theft Auto V Snapmatic&lt;br/&gt;
+Pictures and Savegames</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="84"/>
+        <source>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="86"/>
+        <source>%1 is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="62"/>
+        <source>Release</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="68"/>
+        <source>Release Candidate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="74"/>
+        <source>Daily Build</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="80"/>
+        <source>Developer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="86"/>
+        <source>Beta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="92"/>
+        <source>Alpha</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CrewDatabase</name>
+    <message>
+        <location filename="../CrewDatabase.cpp" line="102"/>
+        <source>No Crew</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ExportDialog</name>
+    <message>
+        <location filename="../ExportDialog.ui" line="14"/>
+        <source>Dialog</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="45"/>
+        <source>Export Format</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="51"/>
+        <source>&amp;JPEG/PNG format</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="58"/>
+        <source>GTA &amp;Snapmatic format</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="68"/>
+        <source>Export Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="74"/>
+        <source>Default &amp;Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="81"/>
+        <source>&amp;Desktop Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="88"/>
+        <source>&amp;Custom Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="100"/>
+        <source>Custom Size:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="123"/>
+        <source>x</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="198"/>
+        <source>&amp;Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="211"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ImportDialog</name>
+    <message>
+        <location filename="../ImportDialog.ui" line="26"/>
+        <source>Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="90"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="98"/>
+        <location filename="../ImportDialog.cpp" line="57"/>
+        <location filename="../ImportDialog.cpp" line="216"/>
+        <source>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="148"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="135"/>
+        <source>Avatar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="105"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="194"/>
+        <source>Import picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="197"/>
+        <source>&amp;OK</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="210"/>
+        <source>Discard picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="213"/>
+        <source>&amp;Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you want to use it as Avatar the image will be detached!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Snapmatic Avatar Zone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="212"/>
+        <source>Select Colour...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MapPreviewDialog</name>
+    <message>
+        <location filename="../MapPreviewDialog.ui" line="26"/>
+        <source>Snapmatic Map Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>OptionsDialog</name>
+    <message>
+        <location filename="../OptionsDialog.ui" line="14"/>
+        <source>%1 - Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="27"/>
+        <source>Profiles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="33"/>
+        <source>Content Open/Select Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="39"/>
+        <source>Open with Singleclick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="49"/>
+        <source>Open with Doubleclick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="56"/>
+        <source>Select with Singleclick</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="66"/>
+        <source>Default Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="78"/>
+        <source>Custom GTA V Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="84"/>
+        <source>Force using Custom Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="96"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="122"/>
+        <source>Pictures</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="128"/>
+        <source>Export Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="134"/>
+        <source>Default: %1x%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="144"/>
+        <source>Screen Resolution: %1x%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="153"/>
+        <location filename="../OptionsDialog.ui" line="163"/>
+        <source>Custom Size:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="189"/>
+        <source>x</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="229"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="241"/>
+        <source>Export Quality</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="247"/>
+        <source>Enable Custom Quality</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="259"/>
+        <source>Quality:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="288"/>
+        <source>%1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="303"/>
+        <source>Picture Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="309"/>
+        <source>Enable Navigation Bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="333"/>
+        <source>Players</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="373"/>
+        <source>ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="378"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="387"/>
+        <location filename="../OptionsDialog.ui" line="393"/>
+        <source>Language</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="419"/>
+        <source>Sync</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="425"/>
+        <source>Sync is not implemented at current time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="463"/>
+        <source>Apply changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="466"/>
+        <source>&amp;OK</source>
+        <extracomment>OK, Cancel, Apply</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="479"/>
+        <source>Discard changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="482"/>
+        <source>&amp;Cancel</source>
+        <extracomment>OK, Cancel, Apply</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>%1 (Next Closest Language)</source>
+        <comment>First language a person can talk with a different person/application. &quot;Native&quot; or &quot;Not Native&quot;.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>System</source>
+        <comment>System in context of System default</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>%1</source>
+        <comment>%1</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>The new Custom Folder will initialise after you restart %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="299"/>
+        <source>No Profile</source>
+        <comment>No Profile, as default</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="307"/>
+        <location filename="../OptionsDialog.cpp" line="311"/>
+        <location filename="../OptionsDialog.cpp" line="313"/>
+        <source>Profile: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PictureDialog</name>
+    <message>
+        <location filename="../PictureDialog.ui" line="14"/>
+        <source>%1 - Snapmatic Picture Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="117"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Created: &lt;/span&gt;%8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="177"/>
+        <source>Manage picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="180"/>
+        <source>&amp;Manage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="199"/>
+        <source>Close viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="202"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="145"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="146"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="148"/>
+        <source>Open &amp;Map View...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="150"/>
+        <source>&amp;Edit Properties...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="373"/>
+        <source>Key 1 - Avatar Preview Mode
+Key 2 - Toggle Overlay
+Arrow Keys - Navigate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
+        <source>Snapmatic Picture Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
+        <source>Failed at %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="589"/>
+        <source>No Crew</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <source>Unknown Location</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="614"/>
+        <source>No Players</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="560"/>
+        <source>Avatar Preview Mode
+Press 1 for Default View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="91"/>
+        <location filename="../PictureExport.cpp" line="223"/>
+        <source>Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="90"/>
+        <source>Export as Picture...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="94"/>
+        <source>JPEG Graphics (*.jpg *.jpeg)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="95"/>
+        <source>Portable Network Graphics (*.png)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <source>Overwrite %1 with current Snapmatic picture?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <source>Export as Picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <source>Failed to overwrite %1 with current Snapmatic picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <source>Failed to export current Snapmatic picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>No valid file is selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="222"/>
+        <source>Export as Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="226"/>
+        <source>GTA V Export (*.g5e)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="227"/>
+        <source>GTA V Raw Export (*.auto)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="228"/>
+        <source>Snapmatic pictures (PGTA*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>Export as Snapmatic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <source>Exported Snapmatic to &quot;%1&quot; because of using the .auto extension.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileInterface</name>
+    <message>
+        <location filename="../ProfileInterface.ui" line="14"/>
+        <source>Profile Interface</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="55"/>
+        <source>Loading file %1 of %2 files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="172"/>
+        <source>%1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="201"/>
+        <source>&amp;Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="217"/>
+        <source>Close profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="220"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ExportThread.cpp" line="97"/>
+        <location filename="../ExportThread.cpp" line="136"/>
+        <location filename="../ExportThread.cpp" line="157"/>
+        <source>Export file %1 of %2 files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="65"/>
+        <source>Enabled pictures: %1 of %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="129"/>
+        <source>Loading...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="426"/>
+        <location filename="../ProfileInterface.cpp" line="491"/>
+        <source>Import...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
+        <source>Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../UserInterface.cpp" line="364"/>
+        <source>GTA V Export (*.g5e)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="444"/>
+        <location filename="../UserInterface.cpp" line="365"/>
+        <source>Savegames files (SGTA*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="366"/>
+        <source>Snapmatic pictures (PGTA*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="442"/>
+        <source>Importable files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="446"/>
+        <source>All image files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="447"/>
+        <location filename="../UserInterface.cpp" line="367"/>
+        <source>All files (**)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../UserInterface.cpp" line="455"/>
+        <source>No valid file is selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="492"/>
+        <location filename="../ProfileInterface.cpp" line="507"/>
+        <source>Import file %1 of %2 files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <source>Import failed with...
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <source>Failed to read Snapmatic picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <source>Failed to read Savegame file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <source>Can&apos;t import %1 because file can&apos;t be parsed properly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <source>Can&apos;t import %1 because file format can&apos;t be detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <source>Failed to import the Snapmatic picture, the picture is already in the game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <source>Failed to import the Snapmatic picture, can&apos;t copy the file into profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <source>Failed to import the Savegame, can&apos;t copy the file into profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="837"/>
+        <source>Failed to import the Savegame, no Savegame slot is left</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="900"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <source>Export selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="923"/>
+        <location filename="../ProfileInterface.cpp" line="941"/>
+        <source>JPG pictures and GTA Snapmatic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="924"/>
+        <location filename="../ProfileInterface.cpp" line="946"/>
+        <source>JPG pictures only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="925"/>
+        <location filename="../ProfileInterface.cpp" line="950"/>
+        <source>GTA Snapmatic only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <source>%1Export Snapmatic pictures%2&lt;br&gt;&lt;br&gt;JPG pictures make it possible to open the picture with a Image Viewer&lt;br&gt;GTA Snapmatic make it possible to import the picture into the game&lt;br&gt;&lt;br&gt;Export as:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="983"/>
+        <source>Export selected...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="984"/>
+        <source>Initialising export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <source>Export failed with...
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
+        <source>No Snapmatic pictures or Savegames files are selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
+        <source>Remove selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <source>You really want remove the selected Snapmatic picutres and Savegame files?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="363"/>
+        <source>All profile files (*.g5e SGTA* PGTA*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QApplication</name>
+    <message>
+        <location filename="../main.cpp" line="66"/>
+        <source>Font</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../main.cpp" line="66"/>
+        <source>Selected Font: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SavegameDialog</name>
+    <message>
+        <location filename="../SavegameDialog.ui" line="14"/>
+        <location filename="../SavegameDialog.cpp" line="38"/>
+        <source>Savegame Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="23"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="70"/>
+        <source>&amp;Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="83"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.cpp" line="38"/>
+        <source>Failed at %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SavegameWidget</name>
+    <message>
+        <location filename="../SavegameWidget.ui" line="14"/>
+        <source>Savegame Widget</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="67"/>
+        <source>SAVE %3 - %1&lt;br&gt;%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="83"/>
+        <source>View savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="86"/>
+        <source>View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="99"/>
+        <source>Copy savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="102"/>
+        <location filename="../SavegameCopy.cpp" line="48"/>
+        <source>Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
+        <source>Delete savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="121"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1225"/>
+        <source>&amp;View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1226"/>
+        <source>&amp;Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1227"/>
+        <source>&amp;Remove</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1229"/>
+        <source>&amp;Select</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1230"/>
+        <source>&amp;Deselect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1233"/>
+        <source>Select &amp;All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1237"/>
+        <source>&amp;Deselect All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="51"/>
+        <source>Savegame files (SGTA*)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="52"/>
+        <source>All files (**)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="70"/>
+        <location filename="../SavegameCopy.cpp" line="74"/>
+        <location filename="../SavegameCopy.cpp" line="87"/>
+        <location filename="../SavegameCopy.cpp" line="93"/>
+        <source>Export Savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="70"/>
+        <source>Overwrite %1 with current Savegame?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="74"/>
+        <source>Failed to overwrite %1 with current Savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="87"/>
+        <source>Failed to export current Savegame</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="93"/>
+        <source>No valid file is selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="57"/>
+        <source>Export Savegame...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="60"/>
+        <location filename="../SavegameWidget.cpp" line="117"/>
+        <source>AUTOSAVE - %1
+%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="61"/>
+        <location filename="../SavegameWidget.cpp" line="118"/>
+        <source>SAVE %3 - %1
+%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="89"/>
+        <location filename="../SavegameWidget.cpp" line="90"/>
+        <source>WRONG FORMAT</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="111"/>
+        <source>UNKNOWN</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <source>Are you sure to delete %1 from your savegames?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="144"/>
+        <source>Failed at deleting %1 from your savegames</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticEditor</name>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="14"/>
+        <location filename="../SnapmaticEditor.ui" line="81"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
+        <source>Snapmatic Properties</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="44"/>
+        <source>Snapmatic Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="50"/>
+        <source>Editor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="57"/>
+        <source>Selfie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="64"/>
+        <source>Regular</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="71"/>
+        <source>Mugshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="87"/>
+        <source>Meme</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="94"/>
+        <source>Director</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="104"/>
+        <source>Snapmatic Values</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="113"/>
+        <location filename="../SnapmaticEditor.cpp" line="200"/>
+        <source>Crew: %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="126"/>
+        <location filename="../SnapmaticEditor.cpp" line="185"/>
+        <source>Title: %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="136"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
+        <source>Appropriate: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="149"/>
+        <source>Extras</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="155"/>
+        <source>Qualify as Avatar automatically at apply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="168"/>
+        <source>Qualify as Avatar allows you to use this Snapmatic as a Social Club profile picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="218"/>
+        <source>&amp;Apply</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="231"/>
+        <source>&amp;Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="199"/>
+        <source>Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <source>Yes</source>
+        <comment>Yes, should work fine</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
+        <source>No</source>
+        <comment>No, could lead to issues</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
+        <source>Patching of Snapmatic Properties failed because of I/O Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
+        <source>Snapmatic Title</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
+        <source>New Snapmatic title:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
+        <source>Snapmatic Crew</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
+        <source>New Snapmatic crew:</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticPicture</name>
+    <message>
+        <location filename="../SnapmaticPicture.cpp" line="411"/>
+        <source>PHOTO - %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticWidget</name>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="14"/>
+        <source>Snapmatic Widget</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="85"/>
+        <source>PHOTO - 00/00/00 00:00:00</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="101"/>
+        <source>View picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="104"/>
+        <source>View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="120"/>
+        <source>Copy picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="123"/>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="136"/>
+        <source>Export picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="139"/>
+        <source>Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
+        <source>Delete picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="155"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1178"/>
+        <source>Edi&amp;t</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1181"/>
+        <source>Show &amp;In-game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1185"/>
+        <source>Hide &amp;In-game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1187"/>
+        <source>&amp;Edit Properties...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1188"/>
+        <source>&amp;Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1189"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1190"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1191"/>
+        <source>&amp;View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1194"/>
+        <source>&amp;Remove</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1196"/>
+        <source>&amp;Select</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1197"/>
+        <source>&amp;Deselect</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1200"/>
+        <source>Select &amp;All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1204"/>
+        <source>&amp;Deselect All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <source>Are you sure to delete %1 from your Snapmatic pictures?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
+        <source>Failed at deleting %1 from your Snapmatic pictures</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>UserInterface</name>
+    <message>
+        <location filename="../UserInterface.ui" line="20"/>
+        <location filename="../UserInterface.cpp" line="62"/>
+        <source>%2 - %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="74"/>
+        <source>Select profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="105"/>
+        <source>%1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="131"/>
+        <source>Reload profile overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="134"/>
+        <source>&amp;Reload</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="150"/>
+        <source>Close %1</source>
+        <extracomment>Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="153"/>
+        <source>&amp;Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="179"/>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="189"/>
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="195"/>
+        <source>&amp;Edit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="201"/>
+        <source>&amp;Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="205"/>
+        <source>&amp;Selection visibility</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="226"/>
+        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="542"/>
+        <source>&amp;About %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="229"/>
+        <source>Ctrl+P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="234"/>
+        <source>&amp;Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="237"/>
+        <source>Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="240"/>
+        <source>Ctrl+Q</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="245"/>
+        <source>Close &amp;Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="248"/>
+        <source>Ctrl+End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="253"/>
+        <source>&amp;Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="256"/>
+        <source>Ctrl+S</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="261"/>
+        <source>Select &amp;All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="264"/>
+        <source>Ctrl+A</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="269"/>
+        <source>&amp;Deselect All</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="272"/>
+        <source>Ctrl+D</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="277"/>
+        <source>&amp;Export selected...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="280"/>
+        <source>Ctrl+E</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="285"/>
+        <source>&amp;Remove selected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="288"/>
+        <source>Ctrl+Del</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="293"/>
+        <source>&amp;Import files...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="296"/>
+        <source>Ctrl+I</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="301"/>
+        <source>&amp;Open File...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="304"/>
+        <source>Ctrl+O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.cpp" line="163"/>
+        <source>Select &amp;GTA V Folder...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="312"/>
+        <location filename="../OptionsDialog.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="104"/>
+        <location filename="../UserInterface.cpp" line="513"/>
+        <source>Select GTA V Folder...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="315"/>
+        <source>Ctrl+G</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="320"/>
+        <source>Show In-gam&amp;e</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="323"/>
+        <source>Shift+E</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="328"/>
+        <source>Hi&amp;de In-game</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="331"/>
+        <source>Shift+D</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="64"/>
+        <location filename="../UserInterface.cpp" line="234"/>
+        <location filename="../UserInterface.cpp" line="550"/>
+        <source>Select Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="360"/>
+        <source>Open File...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <location filename="../UserInterface.cpp" line="455"/>
+        <source>Open File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <source>Can&apos;t open %1 because of not valid file format</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/main.cpp b/main.cpp
index 0a6593b..8ba3e9b 100755
--- a/main.cpp
+++ b/main.cpp
@@ -1,493 +1,203 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "SnapmaticPicture.h"
-#include "ProfileDatabase.h"
-#include "DatabaseThread.h"
-#include "SavegameDialog.h"
-#include "PictureDialog.h"
-#include "UserInterface.h"
-#include "CrewDatabase.h"
-#include "SavegameData.h"
-#include "IconLoader.h"
-#include "AppEnv.h"
-#include "config.h"
-#include <QDesktopWidget>
-#include <QApplication>
-#include <QStringList>
-#include <QTranslator>
-#include <QMessageBox>
-#include <QFileInfo>
-#include <QSysInfo>
-#include <QRawFont>
-#include <QObject>
-#include <QString>
-#include <QDebug>
-#include <QFont>
-#include <QFile>
-#include <QDir>
-
-#ifdef GTA5SYNC_WIN
-#include "windows.h"
-#include <iostream>
-#endif
-
-int main(int argc, char *argv[])
-{
-    QApplication a(argc, argv);
-    a.setApplicationName(GTA5SYNC_APPSTR);
-    a.setApplicationVersion(GTA5SYNC_APPVER);
-
-#ifdef GTA5SYNC_WIN
-#if QT_VERSION >= 0x050400
-    if (QSysInfo::windowsVersion() >= 0x0080)
-    {
-        // Get Windows Font
-        NONCLIENTMETRICS ncm;
-        ncm.cbSize = sizeof(ncm);
-        SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
-        LOGFONTW uiFont = ncm.lfMessageFont;
-        QString uiFontStr(QString::fromStdWString(std::wstring(uiFont.lfFaceName)));
-
-#ifdef GTA5SYNC_DEBUG
-        QMessageBox::information(a.desktop(), QApplication::tr("Font"), QApplication::tr("Selected Font: %1").arg(uiFontStr));
-#endif
-
-        // Set Application Font
-        QFont appFont(uiFontStr, 9);
-        a.setFont(appFont);
-    }
-#endif
-#endif
-
-    QString pluginsDir = AppEnv::getPluginsFolder();
-    if (QFileInfo(pluginsDir).exists())
-    {
-        a.addLibraryPath(pluginsDir);
-    }
-
-    // Loading translation settings
-    QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
-    settings.beginGroup("Interface");
-    QString language = settings.value("Language","System").toString();
-    settings.endGroup();
-
-    // Start external translate loading
-    QString langpath = AppEnv::getLangFolder();
-    bool trsf = false;
-    bool svlp = false;
-    QTranslator EappTranslator;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "gta5sync_" + langList.at(0) + ".qm"))
-            {
-                EappTranslator.load(langpath + QDir::separator() + "/gta5sync_" + langList.at(0) + ".qm");
-                QLocale::setDefault(QLocale::system());
-            }
-        }
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "gta5sync_" + langList.at(0) + ".qm"))
-            {
-                if (!EappTranslator.load(langpath + QDir::separator() + "gta5sync_" + langList.at(0) + ".qm"))
-                {
-                    if (langList.at(0) != "en")
-                    {
-                        trsf = true;
-                    }
-                }
-                else
-                {
-                    QLocale::setDefault(QLocale(langList.at(0)));
-                    svlp = true;
-                }
-            }
-            else
-            {
-                if (langList.at(0) != "en")
-                {
-                    trsf = true;
-                }
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "gta5sync_" + langList.at(0) + ".qm"))
-            {
-                EappTranslator.load(langpath + QDir::separator() + "gta5sync_" + langList.at(0) + ".qm");
-                QLocale::setDefault(QLocale(langList.at(0)));
-            }
-        }
-    }
-    a.installTranslator(&EappTranslator);
-#if QT_VERSION >= 0x050000
-    QTranslator EqtTranslator1;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator1.load(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator1.load(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator1.load(langpath + QDir::separator() + "qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    a.installTranslator(&EqtTranslator1);
-#else
-    QTranslator EqtTranslator;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator.load(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator.load(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm"))
-            {
-                EqtTranslator.load(langpath + QDir::separator() + "qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    a.installTranslator(&EqtTranslator);
-#endif
-    // End external translate loading
-    // Start internal translate loading
-    QTranslator appTranslator;
-    trsf = false;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/gta5sync_" + langList.at(0) + ".qm"))
-            {
-                if (!appTranslator.load(":/tr/gta5sync_" + langList.at(0) + ".qm"))
-                {
-                    if (langList.at(0) != "en")
-                    {
-                        if (svlp) { trsf = true; }
-                    }
-                }
-                else
-                {
-                    QLocale::setDefault(QLocale(langList.at(0)));
-                }
-            }
-            else
-            {
-                if (langList.at(0) != "en")
-                {
-                    if (svlp) { trsf = true; }
-                }
-            }
-        }
-    }
-    else if (language == "en" || language == "English")
-    {
-        QLocale::setDefault(QLocale(QLocale::English, QLocale::AnyCountry));
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/gta5sync_" + langList.at(0) + ".qm"))
-            {
-                appTranslator.load(":/tr/gta5sync_" + langList.at(0) + ".qm");
-                QLocale::setDefault(QLocale(langList.at(0)));
-
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/gta5sync_" + langList.at(0) + ".qm"))
-            {
-                appTranslator.load(":/tr/gta5sync_" + langList.at(0) + ".qm");
-                QLocale::setDefault(QLocale(langList.at(0)));
-            }
-        }
-    }
-    a.installTranslator(&appTranslator);
-#if QT_VERSION >= 0x050000
-    QTranslator qtTranslator1;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qtbase_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qtbase_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qtbase_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qtbase_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    a.installTranslator(&qtTranslator1);
-#else
-    QTranslator qtTranslator1;
-    if (language == "System" || language.trimmed() == "")
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qt_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    else
-    {
-        QString languageName = language;
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qt_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    if (trsf)
-    {
-        QString languageName = QLocale::system().name();
-        QStringList langList = languageName.split("_");
-        if (langList.length() >= 1)
-        {
-            if (QFile::exists(":/tr/qt_" + langList.at(0) + ".qm"))
-            {
-                qtTranslator1.load(":/tr/qt_" + langList.at(0) + ".qm");
-            }
-        }
-    }
-    a.installTranslator(&qtTranslator1);
-#endif
-    // End internal translate loading
-
-    QStringList applicationArgs = a.arguments();
-    QString selectedAction;
-    QString arg1;
-    applicationArgs.removeAt(0);
-
-    foreach(QString currentArg, applicationArgs)
-    {
-        QString reworkedArg;
-        if (currentArg.left(9) == "-showpic=" && selectedAction == "")
-        {
-            reworkedArg = currentArg.remove(0,9);
-            arg1 = reworkedArg;
-            selectedAction = "showpic";
-        }
-        else if (currentArg.left(9) == "-showsgd=" && selectedAction == "")
-        {
-            reworkedArg = currentArg.remove(0,9);
-            arg1 = reworkedArg;
-            selectedAction = "showsgd";
-        }
-        else if (selectedAction == "")
-        {
-            QFile argumentFile(currentArg);
-            QFileInfo argumentFileInfo(argumentFile);
-            if (argumentFile.exists())
-            {
-                QString argumentFileName = argumentFileInfo.fileName();
-                QString argumentFileType = argumentFileName.left(4);
-                QString argumentFileExt = argumentFileName.right(4);
-
-                if (argumentFileType == "PGTA" || argumentFileExt == ".g5e")
-                {
-                    arg1 = currentArg;
-                    selectedAction = "showpic";
-                }
-                else if (argumentFileType == "SGTA")
-                {
-                    arg1 = currentArg;
-                    selectedAction = "showsgd";
-                }
-                else if (argumentFileType == "MISR")
-                {
-                    arg1 = currentArg;
-                    selectedAction = "showsgd";
-                }
-            }
-        }
-    }
-
-    if (selectedAction == "showpic")
-    {
-        CrewDatabase crewDB;
-        ProfileDatabase profileDB;
-        DatabaseThread threadDB(&crewDB);
-        PictureDialog picDialog(true, &profileDB, &crewDB);
-        SnapmaticPicture picture;
-
-        bool readOk = picture.readingPictureFromFile(arg1);
-        picDialog.setWindowIcon(IconLoader::loadingAppIcon());
-        picDialog.setSnapmaticPicture(&picture, readOk);
-
-        int crewID = picture.getSnapmaticProperties().crewID;
-        if (crewID != 0) { crewDB.addCrew(crewID); }
-        if (!readOk) { return 1; }
-
-        QEventLoop threadLoop;
-        QObject::connect(&threadDB, SIGNAL(playerNameFound(int, QString)), &profileDB, SLOT(setPlayerName(int, QString)));
-        QObject::connect(&threadDB, SIGNAL(playerNameUpdated()), &picDialog, SLOT(playerNameUpdated()));
-        QObject::connect(&threadDB, SIGNAL(finished()), &threadLoop, SLOT(quit()));
-        QObject::connect(&picDialog, SIGNAL(endDatabaseThread()), &threadDB, SLOT(doEndThread()));
-        threadDB.start();
-
-        picDialog.show();
-
-        threadLoop.exec();
-
-        return 0;
-    }
-    else if (selectedAction == "showsgd")
-    {
-        SavegameDialog savegameDialog;
-        SavegameData savegame;
-
-        bool readOk = savegame.readingSavegameFromFile(arg1);
-        savegameDialog.setWindowIcon(IconLoader::loadingAppIcon());
-        savegameDialog.setSavegameData(&savegame, arg1, readOk);
-
-        if (!readOk) { return 1; }
-
-        savegameDialog.show();
-
-        return a.exec();
-    }
-
-    CrewDatabase crewDB;
-    ProfileDatabase profileDB;
-    DatabaseThread threadDB(&crewDB);
-
-    QEventLoop threadLoop;
-    QObject::connect(&threadDB, SIGNAL(playerNameFound(int, QString)), &profileDB, SLOT(setPlayerName(int, QString)));
-    QObject::connect(&threadDB, SIGNAL(finished()), &threadLoop, SLOT(quit()));
-    threadDB.start();
-
-    UserInterface uiWindow(&profileDB, &crewDB, &threadDB);
-    uiWindow.setWindowIcon(IconLoader::loadingAppIcon());
-    uiWindow.setupDirEnv();
-#ifdef Q_OS_ANDROID
-    uiWindow.showMaximized();
-#else
-    uiWindow.show();
-#endif
-
-    threadLoop.exec();
-
-    return 0;
-}
-
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "TranslationClass.h"
+#include "SnapmaticPicture.h"
+#include "ProfileDatabase.h"
+#include "DatabaseThread.h"
+#include "SavegameDialog.h"
+#include "PictureDialog.h"
+#include "UserInterface.h"
+#include "CrewDatabase.h"
+#include "SavegameData.h"
+#include "IconLoader.h"
+#include "AppEnv.h"
+#include "config.h"
+#include <QStringBuilder>
+#include <QApplication>
+#include <QStringList>
+#include <QTranslator>
+#include <QFileInfo>
+#include <QSysInfo>
+#include <QObject>
+#include <QString>
+#include <QDebug>
+#include <QFont>
+#include <QFile>
+
+#ifdef GTA5SYNC_WIN
+#include "windows.h"
+#include <iostream>
+#endif
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    a.setApplicationName(GTA5SYNC_APPSTR);
+    a.setApplicationVersion(GTA5SYNC_APPVER);
+
+#ifdef GTA5SYNC_WIN
+#if QT_VERSION >= 0x050400
+    if (QSysInfo::windowsVersion() >= 0x0080)
+    {
+        // Get Windows Font
+        NONCLIENTMETRICS ncm;
+        ncm.cbSize = sizeof(ncm);
+        SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
+        LOGFONTW uiFont = ncm.lfMessageFont;
+        QString uiFontStr(QString::fromStdWString(std::wstring(uiFont.lfFaceName)));
+
+#ifdef GTA5SYNC_DEBUG
+        qDebug() << QApplication::tr("Font") << QApplication::tr("Selected Font: %1").arg(uiFontStr);
+#endif
+
+        // Set Application Font
+        QFont appFont(uiFontStr, 9);
+        a.setFont(appFont);
+    }
+#endif
+#endif
+
+    QString pluginsDir = AppEnv::getPluginsFolder();
+    if (QFileInfo(pluginsDir).exists())
+    {
+        a.addLibraryPath(pluginsDir);
+    }
+
+    TCInstance->initUserLanguage();
+    TCInstance->loadTranslation(&a);
+
+    QStringList applicationArgs = a.arguments();
+    QString selectedAction;
+    QString arg1;
+    applicationArgs.removeAt(0);
+
+    foreach(QString currentArg, applicationArgs)
+    {
+        QString reworkedArg;
+        if (currentArg.left(9) == "-showpic=" && selectedAction == "")
+        {
+            reworkedArg = currentArg.remove(0,9);
+            arg1 = reworkedArg;
+            selectedAction = "showpic";
+        }
+        else if (currentArg.left(9) == "-showsgd=" && selectedAction == "")
+        {
+            reworkedArg = currentArg.remove(0,9);
+            arg1 = reworkedArg;
+            selectedAction = "showsgd";
+        }
+        else if (selectedAction == "")
+        {
+            QFile argumentFile(currentArg);
+            QFileInfo argumentFileInfo(argumentFile);
+            if (argumentFile.exists())
+            {
+                QString argumentFileName = argumentFileInfo.fileName();
+                QString argumentFileType = argumentFileName.left(4);
+                QString argumentFileExt = argumentFileName.right(4);
+
+                if (argumentFileType == "PGTA" || argumentFileExt == ".g5e")
+                {
+                    arg1 = currentArg;
+                    selectedAction = "showpic";
+                }
+                else if (argumentFileType == "SGTA")
+                {
+                    arg1 = currentArg;
+                    selectedAction = "showsgd";
+                }
+                else if (argumentFileType == "MISR")
+                {
+                    arg1 = currentArg;
+                    selectedAction = "showsgd";
+                }
+            }
+        }
+    }
+
+    if (selectedAction == "showpic")
+    {
+        CrewDatabase crewDB;
+        ProfileDatabase profileDB;
+        DatabaseThread threadDB(&crewDB);
+        PictureDialog picDialog(true, &profileDB, &crewDB);
+        SnapmaticPicture picture;
+
+        bool readOk = picture.readingPictureFromFile(arg1);
+        picDialog.setWindowIcon(IconLoader::loadingAppIcon());
+        picDialog.setSnapmaticPicture(&picture, readOk);
+
+        int crewID = picture.getSnapmaticProperties().crewID;
+        if (crewID != 0) { crewDB.addCrew(crewID); }
+        if (!readOk) { return 1; }
+
+        QEventLoop threadLoop;
+        QObject::connect(&threadDB, SIGNAL(crewNameFound(int, QString)), &crewDB, SLOT(setCrewName(int, QString)));
+        QObject::connect(&threadDB, SIGNAL(crewNameUpdated()), &picDialog, SLOT(crewNameUpdated()));
+        QObject::connect(&threadDB, SIGNAL(playerNameFound(int, QString)), &profileDB, SLOT(setPlayerName(int, QString)));
+        QObject::connect(&threadDB, SIGNAL(playerNameUpdated()), &picDialog, SLOT(playerNameUpdated()));
+        QObject::connect(&threadDB, SIGNAL(finished()), &threadLoop, SLOT(quit()));
+        QObject::connect(&picDialog, SIGNAL(endDatabaseThread()), &threadDB, SLOT(doEndThread()));
+        threadDB.start();
+
+        picDialog.show();
+
+        threadLoop.exec();
+
+        return 0;
+    }
+    else if (selectedAction == "showsgd")
+    {
+        SavegameDialog savegameDialog;
+        SavegameData savegame;
+
+        bool readOk = savegame.readingSavegameFromFile(arg1);
+        savegameDialog.setWindowIcon(IconLoader::loadingAppIcon());
+        savegameDialog.setSavegameData(&savegame, arg1, readOk);
+
+        if (!readOk) { return 1; }
+
+        savegameDialog.show();
+
+        return a.exec();
+    }
+
+    CrewDatabase crewDB;
+    ProfileDatabase profileDB;
+    DatabaseThread threadDB(&crewDB);
+
+    QEventLoop threadLoop;
+    QObject::connect(&threadDB, SIGNAL(crewNameFound(int,QString)), &crewDB, SLOT(setCrewName(int, QString)));
+    QObject::connect(&threadDB, SIGNAL(playerNameFound(int, QString)), &profileDB, SLOT(setPlayerName(int, QString)));
+    QObject::connect(&threadDB, SIGNAL(finished()), &threadLoop, SLOT(quit()));
+    threadDB.start();
+
+    UserInterface uiWindow(&profileDB, &crewDB, &threadDB);
+    uiWindow.setWindowIcon(IconLoader::loadingAppIcon());
+    uiWindow.setupDirEnv();
+#ifdef Q_OS_ANDROID
+    uiWindow.showMaximized();
+#else
+    uiWindow.show();
+#endif
+
+    threadLoop.exec();
+
+    return 0;
+}
diff --git a/qjson4/QJsonArray b/qjson4/QJsonArray
index 93afb31..89dbf4e 100755
--- a/qjson4/QJsonArray
+++ b/qjson4/QJsonArray
@@ -1 +1 @@
-#include "QJsonArray.h"
+#include "QJsonArray.h"
diff --git a/qjson4/QJsonArray.cpp b/qjson4/QJsonArray.cpp
index f932825..531941f 100755
--- a/qjson4/QJsonArray.cpp
+++ b/qjson4/QJsonArray.cpp
@@ -1,410 +1,410 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonArray.h"
-#include "QJsonValueRef.h"
-#include "QJsonValue.h"
-#include <QtCore/QStringList>
-
-#if QT_VERSION < 0x050000
-
-//------------------------------------------------------------------------------
-// Name: QJsonArray
-// Desc: default constructor
-//------------------------------------------------------------------------------
-QJsonArray::QJsonArray() {
-
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonArray
-// Desc: copy constructor
-//------------------------------------------------------------------------------
-QJsonArray::QJsonArray(const QJsonArray &other) : values_(other.values_) {
-
-}
-
-#if __cplusplus >= 201103L
-//------------------------------------------------------------------------------
-// Name: QJsonArray
-// Desc: Creates an array initialized from args initialization list.
-//------------------------------------------------------------------------------
-QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args) {
-	for(const QJsonValue &arg : args) {
-		values_.append(arg);
-	}
-}
-#endif
-
-//------------------------------------------------------------------------------
-// Name: ~QJsonArray
-// Desc: destructor
-//------------------------------------------------------------------------------
-QJsonArray::~QJsonArray() {
-
-}
-
-//------------------------------------------------------------------------------
-// Name: operator=
-// Desc: assignment operator
-//------------------------------------------------------------------------------
-QJsonArray &QJsonArray::operator=(const QJsonArray &other) {
-	QJsonArray(other).swap(*this);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator+=
-// Desc:
-//------------------------------------------------------------------------------
-QJsonArray &QJsonArray::operator+=(const QJsonValue &value) {
-	values_.append(value);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator<<
-// Desc:
-//------------------------------------------------------------------------------
-QJsonArray &QJsonArray::operator<<(const QJsonValue &value) {
-	values_.append(value);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator+
-// Desc:
-//------------------------------------------------------------------------------
-QJsonArray QJsonArray::operator+(const QJsonValue &value) const {
-	QJsonArray arr(*this);
-	arr.append(value);
-	return arr;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator!=
-// Desc: returns true if the compared array IS NOT equal to this
-//------------------------------------------------------------------------------
-bool QJsonArray::operator!=(const QJsonArray &other) const {
-	return values_ != other.values_;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator==
-// Desc: returns true if the compared array IS equal to this
-//------------------------------------------------------------------------------
-bool QJsonArray::operator==(const QJsonArray &other) const {
-	return values_ == other.values_;
-}
-
-//------------------------------------------------------------------------------
-// Name: begin
-// Desc: returns an iterator to the first contained element
-//------------------------------------------------------------------------------
-QJsonArray::const_iterator QJsonArray::begin() const {
-	return values_.begin();
-}
-
-//------------------------------------------------------------------------------
-// Name: end
-// Desc: returns an iterator to one past the last contained element
-//------------------------------------------------------------------------------
-QJsonArray::const_iterator QJsonArray::end() const {
-	return values_.end();
-}
-
-//------------------------------------------------------------------------------
-// Name: begin
-// Desc: returns an iterator to the first contained element
-//------------------------------------------------------------------------------
-QJsonArray::iterator QJsonArray::begin() {
-	return values_.begin();
-}
-
-//------------------------------------------------------------------------------
-// Name: end
-// Desc: returns an iterator to one past the last contained element
-//------------------------------------------------------------------------------
-QJsonArray::iterator QJsonArray::end() {
-	return values_.end();
-}
-
-//------------------------------------------------------------------------------
-// Name: constBegin
-// Desc: returns an iterator to the first contained element
-//------------------------------------------------------------------------------
-QJsonArray::const_iterator QJsonArray::constBegin() const {
-	return begin();
-}
-
-//------------------------------------------------------------------------------
-// Name: constEnd
-// Desc: returns an iterator to one past the last contained element
-//------------------------------------------------------------------------------
-QJsonArray::const_iterator QJsonArray::constEnd() const {
-	return end();
-}
-
-//------------------------------------------------------------------------------
-// Name: first
-// Desc: returns the first element by value
-//------------------------------------------------------------------------------
-QJsonValue QJsonArray::first() const {
-	Q_ASSERT(!empty());
-	return values_.first();
-}
-
-//------------------------------------------------------------------------------
-// Name: last
-// Desc: returns the last element by value
-//------------------------------------------------------------------------------
-QJsonValue QJsonArray::last() const {
-	Q_ASSERT(!empty());
-	return values_.last();
-}
-
-//------------------------------------------------------------------------------
-// Name: operator[]
-//------------------------------------------------------------------------------
-QJsonValueRef QJsonArray::operator[](int i) {
-	return QJsonValueRef(this, i);
-}
-
-//------------------------------------------------------------------------------
-// Name: operator[]
-//------------------------------------------------------------------------------
-QJsonValue QJsonArray::operator[](int i) const {
-	return values_[i];
-}
-
-//------------------------------------------------------------------------------
-// Name: at
-//------------------------------------------------------------------------------
-QJsonValue QJsonArray::at(int i) const {
-	return values_.at(i);
-}
-
-//------------------------------------------------------------------------------
-// Name: size
-//------------------------------------------------------------------------------
-int QJsonArray::size() const {
-	return values_.size();
-}
-
-//------------------------------------------------------------------------------
-// Name: count
-//------------------------------------------------------------------------------
-int QJsonArray::count() const {
-	return size();
-}
-
-//------------------------------------------------------------------------------
-// Name: empty
-//------------------------------------------------------------------------------
-bool QJsonArray::empty() const {
-	return values_.empty();
-}
-
-//------------------------------------------------------------------------------
-// Name: isEmpty
-//------------------------------------------------------------------------------
-bool QJsonArray::isEmpty() const {
-	return empty();
-}
-
-//------------------------------------------------------------------------------
-// Name: pop_back
-//------------------------------------------------------------------------------
-void QJsonArray::pop_back() {
-	values_.pop_back();
-}
-
-//------------------------------------------------------------------------------
-// Name: pop_front
-//------------------------------------------------------------------------------
-void QJsonArray::pop_front() {
-	values_.pop_front();
-}
-
-//------------------------------------------------------------------------------
-// Name: push_back
-//------------------------------------------------------------------------------
-void QJsonArray::push_back(const QJsonValue &value) {
-	values_.push_back(value);
-}
-
-//------------------------------------------------------------------------------
-// Name: push_front
-//------------------------------------------------------------------------------
-void QJsonArray::push_front(const QJsonValue &value) {
-	values_.push_front(value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::append(const QJsonValue &value) {
-	values_.append(value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonArray::contains(const QJsonValue &value) const {
-	return values_.contains(value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray::iterator QJsonArray::erase(iterator it) {
-	return values_.erase(it);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::insert(int i, const QJsonValue &value) {
-	values_.insert(i, value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray::iterator QJsonArray::insert(iterator before, const QJsonValue &value) {
-	return values_.insert(before, value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::prepend(const QJsonValue &value) {
-	values_.prepend(value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::removeAt(int i) {
-	values_.removeAt(i);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::removeFirst() {
-	values_.removeFirst();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::removeLast() {
-	values_.removeLast();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::replace(int i, const QJsonValue &value) {
-	values_.replace(i, value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonValue QJsonArray::takeAt(int i) {
-	return values_.takeAt(i);
-}
-
-//------------------------------------------------------------------------------
-// Name: toVariantList
-//------------------------------------------------------------------------------
-QVariantList QJsonArray::toVariantList() const {
-	QVariantList a;
-	Q_FOREACH(const QJsonValue &v, *this) {
-		a.push_back(v.toVariant());
-	}
-	return a;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray QJsonArray::fromStringList(const QStringList &list) {
-	QJsonArray a;
-	Q_FOREACH(const QString &s, list) {
-		a.push_back(QJsonValue(s));
-	}
-	return a;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray QJsonArray::fromVariantList(const QVariantList &list) {
-	QJsonArray a;
-	Q_FOREACH(const QVariant &v, list) {
-		a.push_back(QJsonValue::fromVariant(v));
-	}
-	return a;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonRoot *QJsonArray::clone() const {
-	return new QJsonArray(*this);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-const QJsonObject *QJsonArray::toObject() const {
-	return 0;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject *QJsonArray::toObject() {
-	return 0;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray *QJsonArray::toArray() {
-	return this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-const QJsonArray *QJsonArray::toArray() const {
-	return this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonArray::swap(QJsonArray &other) {
-	qSwap(values_, other.values_);
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonArray.h"
+#include "QJsonValueRef.h"
+#include "QJsonValue.h"
+#include <QtCore/QStringList>
+
+#if QT_VERSION < 0x050000
+
+//------------------------------------------------------------------------------
+// Name: QJsonArray
+// Desc: default constructor
+//------------------------------------------------------------------------------
+QJsonArray::QJsonArray() {
+
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonArray
+// Desc: copy constructor
+//------------------------------------------------------------------------------
+QJsonArray::QJsonArray(const QJsonArray &other) : values_(other.values_) {
+
+}
+
+#if __cplusplus >= 201103L
+//------------------------------------------------------------------------------
+// Name: QJsonArray
+// Desc: Creates an array initialized from args initialization list.
+//------------------------------------------------------------------------------
+QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args) {
+	for(const QJsonValue &arg : args) {
+		values_.append(arg);
+	}
+}
+#endif
+
+//------------------------------------------------------------------------------
+// Name: ~QJsonArray
+// Desc: destructor
+//------------------------------------------------------------------------------
+QJsonArray::~QJsonArray() {
+
+}
+
+//------------------------------------------------------------------------------
+// Name: operator=
+// Desc: assignment operator
+//------------------------------------------------------------------------------
+QJsonArray &QJsonArray::operator=(const QJsonArray &other) {
+	QJsonArray(other).swap(*this);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator+=
+// Desc:
+//------------------------------------------------------------------------------
+QJsonArray &QJsonArray::operator+=(const QJsonValue &value) {
+	values_.append(value);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator<<
+// Desc:
+//------------------------------------------------------------------------------
+QJsonArray &QJsonArray::operator<<(const QJsonValue &value) {
+	values_.append(value);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator+
+// Desc:
+//------------------------------------------------------------------------------
+QJsonArray QJsonArray::operator+(const QJsonValue &value) const {
+	QJsonArray arr(*this);
+	arr.append(value);
+	return arr;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator!=
+// Desc: returns true if the compared array IS NOT equal to this
+//------------------------------------------------------------------------------
+bool QJsonArray::operator!=(const QJsonArray &other) const {
+	return values_ != other.values_;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator==
+// Desc: returns true if the compared array IS equal to this
+//------------------------------------------------------------------------------
+bool QJsonArray::operator==(const QJsonArray &other) const {
+	return values_ == other.values_;
+}
+
+//------------------------------------------------------------------------------
+// Name: begin
+// Desc: returns an iterator to the first contained element
+//------------------------------------------------------------------------------
+QJsonArray::const_iterator QJsonArray::begin() const {
+	return values_.begin();
+}
+
+//------------------------------------------------------------------------------
+// Name: end
+// Desc: returns an iterator to one past the last contained element
+//------------------------------------------------------------------------------
+QJsonArray::const_iterator QJsonArray::end() const {
+	return values_.end();
+}
+
+//------------------------------------------------------------------------------
+// Name: begin
+// Desc: returns an iterator to the first contained element
+//------------------------------------------------------------------------------
+QJsonArray::iterator QJsonArray::begin() {
+	return values_.begin();
+}
+
+//------------------------------------------------------------------------------
+// Name: end
+// Desc: returns an iterator to one past the last contained element
+//------------------------------------------------------------------------------
+QJsonArray::iterator QJsonArray::end() {
+	return values_.end();
+}
+
+//------------------------------------------------------------------------------
+// Name: constBegin
+// Desc: returns an iterator to the first contained element
+//------------------------------------------------------------------------------
+QJsonArray::const_iterator QJsonArray::constBegin() const {
+	return begin();
+}
+
+//------------------------------------------------------------------------------
+// Name: constEnd
+// Desc: returns an iterator to one past the last contained element
+//------------------------------------------------------------------------------
+QJsonArray::const_iterator QJsonArray::constEnd() const {
+	return end();
+}
+
+//------------------------------------------------------------------------------
+// Name: first
+// Desc: returns the first element by value
+//------------------------------------------------------------------------------
+QJsonValue QJsonArray::first() const {
+	Q_ASSERT(!empty());
+	return values_.first();
+}
+
+//------------------------------------------------------------------------------
+// Name: last
+// Desc: returns the last element by value
+//------------------------------------------------------------------------------
+QJsonValue QJsonArray::last() const {
+	Q_ASSERT(!empty());
+	return values_.last();
+}
+
+//------------------------------------------------------------------------------
+// Name: operator[]
+//------------------------------------------------------------------------------
+QJsonValueRef QJsonArray::operator[](int i) {
+	return QJsonValueRef(this, i);
+}
+
+//------------------------------------------------------------------------------
+// Name: operator[]
+//------------------------------------------------------------------------------
+QJsonValue QJsonArray::operator[](int i) const {
+	return values_[i];
+}
+
+//------------------------------------------------------------------------------
+// Name: at
+//------------------------------------------------------------------------------
+QJsonValue QJsonArray::at(int i) const {
+	return values_.at(i);
+}
+
+//------------------------------------------------------------------------------
+// Name: size
+//------------------------------------------------------------------------------
+int QJsonArray::size() const {
+	return values_.size();
+}
+
+//------------------------------------------------------------------------------
+// Name: count
+//------------------------------------------------------------------------------
+int QJsonArray::count() const {
+	return size();
+}
+
+//------------------------------------------------------------------------------
+// Name: empty
+//------------------------------------------------------------------------------
+bool QJsonArray::empty() const {
+	return values_.empty();
+}
+
+//------------------------------------------------------------------------------
+// Name: isEmpty
+//------------------------------------------------------------------------------
+bool QJsonArray::isEmpty() const {
+	return empty();
+}
+
+//------------------------------------------------------------------------------
+// Name: pop_back
+//------------------------------------------------------------------------------
+void QJsonArray::pop_back() {
+	values_.pop_back();
+}
+
+//------------------------------------------------------------------------------
+// Name: pop_front
+//------------------------------------------------------------------------------
+void QJsonArray::pop_front() {
+	values_.pop_front();
+}
+
+//------------------------------------------------------------------------------
+// Name: push_back
+//------------------------------------------------------------------------------
+void QJsonArray::push_back(const QJsonValue &value) {
+	values_.push_back(value);
+}
+
+//------------------------------------------------------------------------------
+// Name: push_front
+//------------------------------------------------------------------------------
+void QJsonArray::push_front(const QJsonValue &value) {
+	values_.push_front(value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::append(const QJsonValue &value) {
+	values_.append(value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonArray::contains(const QJsonValue &value) const {
+	return values_.contains(value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray::iterator QJsonArray::erase(iterator it) {
+	return values_.erase(it);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::insert(int i, const QJsonValue &value) {
+	values_.insert(i, value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray::iterator QJsonArray::insert(iterator before, const QJsonValue &value) {
+	return values_.insert(before, value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::prepend(const QJsonValue &value) {
+	values_.prepend(value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::removeAt(int i) {
+	values_.removeAt(i);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::removeFirst() {
+	values_.removeFirst();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::removeLast() {
+	values_.removeLast();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::replace(int i, const QJsonValue &value) {
+	values_.replace(i, value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonValue QJsonArray::takeAt(int i) {
+	return values_.takeAt(i);
+}
+
+//------------------------------------------------------------------------------
+// Name: toVariantList
+//------------------------------------------------------------------------------
+QVariantList QJsonArray::toVariantList() const {
+	QVariantList a;
+	Q_FOREACH(const QJsonValue &v, *this) {
+		a.push_back(v.toVariant());
+	}
+	return a;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray QJsonArray::fromStringList(const QStringList &list) {
+	QJsonArray a;
+	Q_FOREACH(const QString &s, list) {
+		a.push_back(QJsonValue(s));
+	}
+	return a;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray QJsonArray::fromVariantList(const QVariantList &list) {
+	QJsonArray a;
+	Q_FOREACH(const QVariant &v, list) {
+		a.push_back(QJsonValue::fromVariant(v));
+	}
+	return a;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonRoot *QJsonArray::clone() const {
+	return new QJsonArray(*this);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+const QJsonObject *QJsonArray::toObject() const {
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject *QJsonArray::toObject() {
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray *QJsonArray::toArray() {
+	return this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+const QJsonArray *QJsonArray::toArray() const {
+	return this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonArray::swap(QJsonArray &other) {
+	qSwap(values_, other.values_);
+}
+
+#endif
diff --git a/qjson4/QJsonArray.h b/qjson4/QJsonArray.h
index 2e443b4..94aab1b 100755
--- a/qjson4/QJsonArray.h
+++ b/qjson4/QJsonArray.h
@@ -1,139 +1,139 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_ARRAY_H_
-#define QJSON_ARRAY_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonArray>
-#else
-
-#include "QJsonRoot.h"
-#include <QtCore/QList>
-#include <QtCore/QVariantList>
-
-class QJsonValue;
-class QJsonValueRef;
-
-class QJsonArray : public QJsonRoot {
-	friend class QJsonDocument;
-	friend class QJsonValue;
-	friend class QJsonValueRef;
-	friend class QJsonParser;
-public:
-	// TODO(eteran): manually implement the array, for now we use QList
-	//               but the real thing has a custom implementation
-	//               I guess for the purposes of less interdependancies?
-	//               maybe so it's easier to forward declare the iterators?
-
-	typedef QList<QJsonValue>::const_iterator  const_iterator;
-	typedef QList<QJsonValue>::iterator        iterator;
-	typedef	const_iterator                       ConstIterator;
-	typedef	iterator                             Iterator;
-	typedef	QList<QJsonValue>::const_pointer   const_pointer;
-	typedef	QList<QJsonValue>::const_reference const_reference;
-	typedef	QList<QJsonValue>::difference_type difference_type;
-	typedef	QList<QJsonValue>::pointer         pointer;
-	typedef	QList<QJsonValue>::reference       reference;
-	typedef	QList<QJsonValue>::size_type       size_type;
-	typedef	QList<QJsonValue>::value_type      value_type;
-
-public:
-	QJsonArray();
-	QJsonArray(const QJsonArray &other);
-#if __cplusplus >= 201103L
-	QJsonArray(std::initializer_list<QJsonValue> args);
-#endif
-	~QJsonArray();
-
-public:
-	QJsonArray &operator=(const QJsonArray &other);
-
-public:
-	bool operator!=(const QJsonArray &other) const;
-	bool operator==(const QJsonArray &other) const;
-	QJsonArray operator+(const QJsonValue &value) const;
-	QJsonArray &operator+=(const QJsonValue &value);
-	QJsonArray &operator<<(const QJsonValue &value);
-
-public:
-	const_iterator begin() const;
-	const_iterator end() const;
-	iterator begin();
-	iterator end();
-	const_iterator constBegin() const;
-	const_iterator constEnd() const;
-
-public:
-	QJsonValueRef operator[](int i);
-	QJsonValue operator[](int i) const;
-	QJsonValue at(int i) const;
-	QJsonValue first() const;
-	QJsonValue last() const;
-
-public:
-	int size() const;
-	int count() const;
-	bool empty() const;
-	bool isEmpty() const;
-
-public:
-	void pop_back();
-	void pop_front();
-	void push_back(const QJsonValue &value);
-	void push_front(const QJsonValue &value);
-
-public:
-	void append(const QJsonValue &value);
-	bool contains(const QJsonValue &value) const;
-	iterator erase(iterator it);
-	void insert(int i, const QJsonValue &value);
-	iterator insert(iterator before, const QJsonValue &value);
-	void prepend(const QJsonValue &value);
-	void removeAt(int i);
-	void removeFirst();
-	void removeLast();
-	void replace(int i, const QJsonValue &value);
-	QJsonValue takeAt(int i);
-
-public:
-	QVariantList toVariantList() const;
-
-public:
-	static QJsonArray fromStringList(const QStringList &list);
-	static QJsonArray fromVariantList(const QVariantList &list);
-
-private:
-	virtual QJsonRoot *clone() const;
-	virtual QJsonArray *toArray();
-	virtual QJsonObject *toObject();
-	virtual const QJsonArray *toArray() const;
-	virtual const QJsonObject *toObject() const;
-
-private:
-	void swap(QJsonArray &other);
-
-private:
-	QList<QJsonValue> values_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_ARRAY_H_
+#define QJSON_ARRAY_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonArray>
+#else
+
+#include "QJsonRoot.h"
+#include <QtCore/QList>
+#include <QtCore/QVariantList>
+
+class QJsonValue;
+class QJsonValueRef;
+
+class QJsonArray : public QJsonRoot {
+	friend class QJsonDocument;
+	friend class QJsonValue;
+	friend class QJsonValueRef;
+	friend class QJsonParser;
+public:
+	// TODO(eteran): manually implement the array, for now we use QList
+	//               but the real thing has a custom implementation
+	//               I guess for the purposes of less interdependancies?
+	//               maybe so it's easier to forward declare the iterators?
+
+	typedef QList<QJsonValue>::const_iterator  const_iterator;
+	typedef QList<QJsonValue>::iterator        iterator;
+	typedef	const_iterator                       ConstIterator;
+	typedef	iterator                             Iterator;
+	typedef	QList<QJsonValue>::const_pointer   const_pointer;
+	typedef	QList<QJsonValue>::const_reference const_reference;
+	typedef	QList<QJsonValue>::difference_type difference_type;
+	typedef	QList<QJsonValue>::pointer         pointer;
+	typedef	QList<QJsonValue>::reference       reference;
+	typedef	QList<QJsonValue>::size_type       size_type;
+	typedef	QList<QJsonValue>::value_type      value_type;
+
+public:
+	QJsonArray();
+	QJsonArray(const QJsonArray &other);
+#if __cplusplus >= 201103L
+	QJsonArray(std::initializer_list<QJsonValue> args);
+#endif
+	~QJsonArray();
+
+public:
+	QJsonArray &operator=(const QJsonArray &other);
+
+public:
+	bool operator!=(const QJsonArray &other) const;
+	bool operator==(const QJsonArray &other) const;
+	QJsonArray operator+(const QJsonValue &value) const;
+	QJsonArray &operator+=(const QJsonValue &value);
+	QJsonArray &operator<<(const QJsonValue &value);
+
+public:
+	const_iterator begin() const;
+	const_iterator end() const;
+	iterator begin();
+	iterator end();
+	const_iterator constBegin() const;
+	const_iterator constEnd() const;
+
+public:
+	QJsonValueRef operator[](int i);
+	QJsonValue operator[](int i) const;
+	QJsonValue at(int i) const;
+	QJsonValue first() const;
+	QJsonValue last() const;
+
+public:
+	int size() const;
+	int count() const;
+	bool empty() const;
+	bool isEmpty() const;
+
+public:
+	void pop_back();
+	void pop_front();
+	void push_back(const QJsonValue &value);
+	void push_front(const QJsonValue &value);
+
+public:
+	void append(const QJsonValue &value);
+	bool contains(const QJsonValue &value) const;
+	iterator erase(iterator it);
+	void insert(int i, const QJsonValue &value);
+	iterator insert(iterator before, const QJsonValue &value);
+	void prepend(const QJsonValue &value);
+	void removeAt(int i);
+	void removeFirst();
+	void removeLast();
+	void replace(int i, const QJsonValue &value);
+	QJsonValue takeAt(int i);
+
+public:
+	QVariantList toVariantList() const;
+
+public:
+	static QJsonArray fromStringList(const QStringList &list);
+	static QJsonArray fromVariantList(const QVariantList &list);
+
+private:
+	virtual QJsonRoot *clone() const;
+	virtual QJsonArray *toArray();
+	virtual QJsonObject *toObject();
+	virtual const QJsonArray *toArray() const;
+	virtual const QJsonObject *toObject() const;
+
+private:
+	void swap(QJsonArray &other);
+
+private:
+	QList<QJsonValue> values_;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonDocument b/qjson4/QJsonDocument
index dabae9b..f652bf4 100755
--- a/qjson4/QJsonDocument
+++ b/qjson4/QJsonDocument
@@ -1 +1 @@
-#include "QJsonDocument.h"
+#include "QJsonDocument.h"
diff --git a/qjson4/QJsonDocument.cpp b/qjson4/QJsonDocument.cpp
index 712a96d..59adf32 100755
--- a/qjson4/QJsonDocument.cpp
+++ b/qjson4/QJsonDocument.cpp
@@ -1,417 +1,417 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonDocument.h"
-#include "QJsonObject.h"
-#include "QJsonArray.h"
-#include "QJsonParser.h"
-
-#include <QtCore/QStringList>
-#include <QtCore/QByteArray>
-#include <QtCore/QTextStream>
-#include <QtCore/QTextCodec>
-#include <QtCore/QtCore>
-
-#if QT_VERSION < 0x050000
-
-//------------------------------------------------------------------------------
-// Name: QJsonDocument
-//------------------------------------------------------------------------------
-QJsonDocument::QJsonDocument() : root_(0) {
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonDocument
-//------------------------------------------------------------------------------
-QJsonDocument::QJsonDocument(const QJsonObject &object) : root_(0) {
-	setObject(object);
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonDocument
-//------------------------------------------------------------------------------
-QJsonDocument::QJsonDocument(const QJsonArray &array) : root_(0) {
-	setArray(array);
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonDocument
-//------------------------------------------------------------------------------
-QJsonDocument::QJsonDocument(const QJsonDocument &other) : root_(0) {
-	if(other.root_) {
-		root_ = other.root_->clone();
-	}
-}
-
-//------------------------------------------------------------------------------
-// Name: ~QJsonDocument
-//------------------------------------------------------------------------------
-QJsonDocument::~QJsonDocument() {
-	delete root_;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator=
-//------------------------------------------------------------------------------
-QJsonDocument &QJsonDocument::operator=(const QJsonDocument &other) {
-	QJsonDocument(other).swap(*this);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator!=
-//------------------------------------------------------------------------------
-bool QJsonDocument::operator!=(const QJsonDocument &other) const {
-	return !(*this == other);
-}
-
-//------------------------------------------------------------------------------
-// Name: operator==
-//------------------------------------------------------------------------------
-bool QJsonDocument::operator==(const QJsonDocument &other) const {
-
-	if(isArray() && other.isArray()) {
-		return array() == other.array();
-	}
-
-	if(isObject() && other.isObject()) {
-		return object() == other.object();
-	}
-
-	if(isEmpty() && other.isEmpty()) {
-		return true;
-	}
-
-	if(isNull() && other.isNull()) {
-		return true;
-	}
-
-	return false;
-}
-
-//------------------------------------------------------------------------------
-// Name: isArray
-//------------------------------------------------------------------------------
-bool QJsonDocument::isArray() const {
-	return root_ && root_->toArray();
-}
-
-//------------------------------------------------------------------------------
-// Name: isEmpty
-//------------------------------------------------------------------------------
-bool QJsonDocument::isEmpty() const {
-
-	// TODO(eteran): figure out the rules here that Qt5 uses
-	//               it *looks* like they define empty as being NULL
-	//               which is obviously different than this
-
-	return !root_;
-}
-
-//------------------------------------------------------------------------------
-// Name: isNull
-//------------------------------------------------------------------------------
-bool QJsonDocument::isNull() const {
-	return !root_;
-}
-
-//------------------------------------------------------------------------------
-// Name: isObject
-//------------------------------------------------------------------------------
-bool QJsonDocument::isObject() const {
-	return root_ && root_->toObject();
-}
-
-//------------------------------------------------------------------------------
-// Name: setArray
-//------------------------------------------------------------------------------
-void QJsonDocument::setArray(const QJsonArray &array) {
-	setRoot(array);
-}
-
-//------------------------------------------------------------------------------
-// Name: setObject
-//------------------------------------------------------------------------------
-void QJsonDocument::setObject(const QJsonObject &object) {
-	setRoot(object);
-}
-
-//------------------------------------------------------------------------------
-// Name: setRoot
-//------------------------------------------------------------------------------
-void QJsonDocument::setRoot(const QJsonRoot &root) {
-	delete root_;
-	root_ = root.clone();
-}
-
-//------------------------------------------------------------------------------
-// Name: toBinaryData
-//------------------------------------------------------------------------------
-QByteArray QJsonDocument::toBinaryData() const {
-	QByteArray r;
-	// TODO(eteran): implement this
-	return r;
-}
-
-//------------------------------------------------------------------------------
-// Name: escapeString
-//------------------------------------------------------------------------------
-QString QJsonDocument::escapeString(const QString &s) const {
-
-	QString r;
-
-	Q_FOREACH(QChar ch, s) {
-		switch(ch.toLatin1()) {
-		case '\"': r.append("\\\""); break;
-		case '\\': r.append("\\\\"); break;
-	#if 0
-		case '/':  r.append("\\/"); break;
-	#endif
-		case '\b': r.append("\\b"); break;
-		case '\f': r.append("\\f"); break;
-		case '\n': r.append("\\n"); break;
-		case '\r': r.append("\\r"); break;
-		case '\t': r.append("\\t"); break;
-		default:
-			r += ch;
-			break;
-		}
-	}
-
-	return r;
-}
-
-//------------------------------------------------------------------------------
-// Name: toJson
-//------------------------------------------------------------------------------
-QString QJsonDocument::toJson(const QJsonValue &v, JsonFormat format) const {
-
-	QString b;
-	QTextStream ss(&b, QIODevice::WriteOnly | QIODevice::Text);
-
-	switch(v.type()) {
-	case QJsonValue::Null:
-		ss << "null";
-		break;
-	case QJsonValue::Bool:
-		ss << (v.toBool() ? "true" : "false");
-		break;
-	case QJsonValue::Double:
-		{
-			double d = v.toDouble ();
-			if (qIsFinite(d)) {
-				                                           // +2 to format to ensure the expected precision
-				ss <<  QByteArray::number(d, 'g', 15 + 2); // ::digits10 is 15
-			} else {
-				ss <<  "null"; // +INF || -INF || NaN (see RFC4627#section2.4)
-			}
-		}
-		break;
-	case QJsonValue::String:
-		ss << '"' << escapeString(v.toString()) << '"';
-		break;
-	case QJsonValue::Array:
-		{
-			const QJsonArray a = v.toArray();
-			ss << "[";
-			if(!a.empty()) {
-				QJsonArray::const_iterator it = a.begin();
-				QJsonArray::const_iterator e  = a.end();
-
-				ss << toJson(*it++, format);
-
-				for(;it != e; ++it) {
-					ss << ',';
-					ss << toJson(*it, format);
-				}
-			}
-			ss << "]";
-		}
-		break;
-	case QJsonValue::Object:
-		{
-			const QJsonObject o = v.toObject();
-			ss << "{";
-			if(!o.empty()) {
-				QJsonObject::const_iterator it = o.begin();
-				QJsonObject::const_iterator e  = o.end();
-
-				ss << '"' << escapeString(it.key()) << "\": " << toJson(it.value(), format);
-				++it;
-				for(;it != e; ++it) {
-					ss << ',';
-					ss << '"' << escapeString(it.key()) << "\": " << toJson(it.value(), format);
-				}
-			}
-			ss  << "}";
-		}
-		break;
-	case QJsonValue::Undefined:
-		Q_ASSERT(0);
-		break;
-	}
-
-	return b;
-}
-
-//------------------------------------------------------------------------------
-// Name: toJson
-//------------------------------------------------------------------------------
-QByteArray QJsonDocument::toJson(JsonFormat format) const {
-
-	Q_UNUSED(format);
-
-	if(isArray()) {
-		QString s = toJson(array(), format);
-		return s.toUtf8();
-	}
-
-	if(isObject()) {
-		QString s = toJson(object(), format);
-		return s.toUtf8();
-	}
-
-	return QByteArray();
-}
-
-//------------------------------------------------------------------------------
-// Name: toVariant
-//------------------------------------------------------------------------------
-QVariant QJsonDocument::toVariant() const {
-
-	if(!isEmpty()) {
-		if(QJsonObject *const object = root_->toObject()) {
-			return object->toVariantMap();
-		}
-
-		if(QJsonArray *const array = root_->toArray()) {
-			return array->toVariantList();
-		}
-	}
-
-	return QVariant();
-}
-
-//------------------------------------------------------------------------------
-// Name: array
-//------------------------------------------------------------------------------
-QJsonArray QJsonDocument::array() const {
-
-	if(!isEmpty()) {
-		if(QJsonArray *const array = root_->toArray()) {
-			return *array;
-		}
-	}
-
-	return QJsonArray();
-}
-
-//------------------------------------------------------------------------------
-// Name: object
-//------------------------------------------------------------------------------
-QJsonObject QJsonDocument::object() const {
-
-	if(!isEmpty()) {
-		if(QJsonObject *const object = root_->toObject()) {
-			return *object;
-		}
-	}
-
-	return QJsonObject();
-}
-
-//------------------------------------------------------------------------------
-// Name: rawData
-//------------------------------------------------------------------------------
-const char *QJsonDocument::rawData(int *size) const {
-	Q_UNUSED(size);
-	// TODO(eteran): implement this
-	return 0;
-}
-
-//------------------------------------------------------------------------------
-// Name: fromBinaryData
-//------------------------------------------------------------------------------
-QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation) {
-	Q_UNUSED(data);
-	Q_UNUSED(validation);
-
-	QJsonDocument doc;
-	// TODO(eteran): implement this
-	return doc;
-}
-
-//------------------------------------------------------------------------------
-// Name: fromJson
-//------------------------------------------------------------------------------
-QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error) {
-	QJsonDocument doc;
-
-	const char *const begin = json.constData();
-	const char *const end   = begin + json.size();
-
-	QJsonParser parser(begin, end);
-
-	doc.root_ = parser.parse();
-
-	if(error) {
-		*error = parser.state();
-	}
-
-	return doc;
-}
-
-//------------------------------------------------------------------------------
-// Name: fromRawData
-//------------------------------------------------------------------------------
-QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation) {
-
-	// data has to be aligned to a 4 byte boundary.
-	Q_ASSERT(!(reinterpret_cast<quintptr>(data) % 3));
-
-	return fromBinaryData(QByteArray::fromRawData(data, size), validation);
-}
-
-//------------------------------------------------------------------------------
-// Name: fromVariant
-//------------------------------------------------------------------------------
-QJsonDocument QJsonDocument::fromVariant(const QVariant &variant) {
-
-	QJsonDocument doc;
-
-	if (variant.type() == QVariant::Map) {
-		doc.setObject(QJsonObject::fromVariantMap(variant.toMap()));
-	} else if (variant.type() == QVariant::Hash) {
-		doc.setObject(QJsonObject::fromVariantHash(variant.toHash()));
-	} else if (variant.type() == QVariant::List) {
-		doc.setArray(QJsonArray::fromVariantList(variant.toList()));
-	} else if (variant.type() == QVariant::StringList) {
-		doc.setArray(QJsonArray::fromStringList(variant.toStringList()));
-	}
-
-	return doc;
-}
-
-//------------------------------------------------------------------------------
-// Name: swap
-//------------------------------------------------------------------------------
-void QJsonDocument::swap(QJsonDocument &other) {
-	qSwap(root_, other.root_);
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonDocument.h"
+#include "QJsonObject.h"
+#include "QJsonArray.h"
+#include "QJsonParser.h"
+
+#include <QtCore/QStringList>
+#include <QtCore/QByteArray>
+#include <QtCore/QTextStream>
+#include <QtCore/QTextCodec>
+#include <QtCore/QtCore>
+
+#if QT_VERSION < 0x050000
+
+//------------------------------------------------------------------------------
+// Name: QJsonDocument
+//------------------------------------------------------------------------------
+QJsonDocument::QJsonDocument() : root_(0) {
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonDocument
+//------------------------------------------------------------------------------
+QJsonDocument::QJsonDocument(const QJsonObject &object) : root_(0) {
+	setObject(object);
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonDocument
+//------------------------------------------------------------------------------
+QJsonDocument::QJsonDocument(const QJsonArray &array) : root_(0) {
+	setArray(array);
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonDocument
+//------------------------------------------------------------------------------
+QJsonDocument::QJsonDocument(const QJsonDocument &other) : root_(0) {
+	if(other.root_) {
+		root_ = other.root_->clone();
+	}
+}
+
+//------------------------------------------------------------------------------
+// Name: ~QJsonDocument
+//------------------------------------------------------------------------------
+QJsonDocument::~QJsonDocument() {
+	delete root_;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator=
+//------------------------------------------------------------------------------
+QJsonDocument &QJsonDocument::operator=(const QJsonDocument &other) {
+	QJsonDocument(other).swap(*this);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator!=
+//------------------------------------------------------------------------------
+bool QJsonDocument::operator!=(const QJsonDocument &other) const {
+	return !(*this == other);
+}
+
+//------------------------------------------------------------------------------
+// Name: operator==
+//------------------------------------------------------------------------------
+bool QJsonDocument::operator==(const QJsonDocument &other) const {
+
+	if(isArray() && other.isArray()) {
+		return array() == other.array();
+	}
+
+	if(isObject() && other.isObject()) {
+		return object() == other.object();
+	}
+
+	if(isEmpty() && other.isEmpty()) {
+		return true;
+	}
+
+	if(isNull() && other.isNull()) {
+		return true;
+	}
+
+	return false;
+}
+
+//------------------------------------------------------------------------------
+// Name: isArray
+//------------------------------------------------------------------------------
+bool QJsonDocument::isArray() const {
+	return root_ && root_->toArray();
+}
+
+//------------------------------------------------------------------------------
+// Name: isEmpty
+//------------------------------------------------------------------------------
+bool QJsonDocument::isEmpty() const {
+
+	// TODO(eteran): figure out the rules here that Qt5 uses
+	//               it *looks* like they define empty as being NULL
+	//               which is obviously different than this
+
+	return !root_;
+}
+
+//------------------------------------------------------------------------------
+// Name: isNull
+//------------------------------------------------------------------------------
+bool QJsonDocument::isNull() const {
+	return !root_;
+}
+
+//------------------------------------------------------------------------------
+// Name: isObject
+//------------------------------------------------------------------------------
+bool QJsonDocument::isObject() const {
+	return root_ && root_->toObject();
+}
+
+//------------------------------------------------------------------------------
+// Name: setArray
+//------------------------------------------------------------------------------
+void QJsonDocument::setArray(const QJsonArray &array) {
+	setRoot(array);
+}
+
+//------------------------------------------------------------------------------
+// Name: setObject
+//------------------------------------------------------------------------------
+void QJsonDocument::setObject(const QJsonObject &object) {
+	setRoot(object);
+}
+
+//------------------------------------------------------------------------------
+// Name: setRoot
+//------------------------------------------------------------------------------
+void QJsonDocument::setRoot(const QJsonRoot &root) {
+	delete root_;
+	root_ = root.clone();
+}
+
+//------------------------------------------------------------------------------
+// Name: toBinaryData
+//------------------------------------------------------------------------------
+QByteArray QJsonDocument::toBinaryData() const {
+	QByteArray r;
+	// TODO(eteran): implement this
+	return r;
+}
+
+//------------------------------------------------------------------------------
+// Name: escapeString
+//------------------------------------------------------------------------------
+QString QJsonDocument::escapeString(const QString &s) const {
+
+	QString r;
+
+	Q_FOREACH(QChar ch, s) {
+		switch(ch.toLatin1()) {
+		case '\"': r.append("\\\""); break;
+		case '\\': r.append("\\\\"); break;
+	#if 0
+		case '/':  r.append("\\/"); break;
+	#endif
+		case '\b': r.append("\\b"); break;
+		case '\f': r.append("\\f"); break;
+		case '\n': r.append("\\n"); break;
+		case '\r': r.append("\\r"); break;
+		case '\t': r.append("\\t"); break;
+		default:
+			r += ch;
+			break;
+		}
+	}
+
+	return r;
+}
+
+//------------------------------------------------------------------------------
+// Name: toJson
+//------------------------------------------------------------------------------
+QString QJsonDocument::toJson(const QJsonValue &v, JsonFormat format) const {
+
+	QString b;
+	QTextStream ss(&b, QIODevice::WriteOnly | QIODevice::Text);
+
+	switch(v.type()) {
+	case QJsonValue::Null:
+		ss << "null";
+		break;
+	case QJsonValue::Bool:
+		ss << (v.toBool() ? "true" : "false");
+		break;
+	case QJsonValue::Double:
+		{
+			double d = v.toDouble ();
+			if (qIsFinite(d)) {
+				                                           // +2 to format to ensure the expected precision
+				ss <<  QByteArray::number(d, 'g', 15 + 2); // ::digits10 is 15
+			} else {
+				ss <<  "null"; // +INF || -INF || NaN (see RFC4627#section2.4)
+			}
+		}
+		break;
+	case QJsonValue::String:
+		ss << '"' << escapeString(v.toString()) << '"';
+		break;
+	case QJsonValue::Array:
+		{
+			const QJsonArray a = v.toArray();
+			ss << "[";
+			if(!a.empty()) {
+				QJsonArray::const_iterator it = a.begin();
+				QJsonArray::const_iterator e  = a.end();
+
+				ss << toJson(*it++, format);
+
+				for(;it != e; ++it) {
+					ss << ',';
+					ss << toJson(*it, format);
+				}
+			}
+			ss << "]";
+		}
+		break;
+	case QJsonValue::Object:
+		{
+			const QJsonObject o = v.toObject();
+			ss << "{";
+			if(!o.empty()) {
+				QJsonObject::const_iterator it = o.begin();
+				QJsonObject::const_iterator e  = o.end();
+
+				ss << '"' << escapeString(it.key()) << "\": " << toJson(it.value(), format);
+				++it;
+				for(;it != e; ++it) {
+					ss << ',';
+					ss << '"' << escapeString(it.key()) << "\": " << toJson(it.value(), format);
+				}
+			}
+			ss  << "}";
+		}
+		break;
+	case QJsonValue::Undefined:
+		Q_ASSERT(0);
+		break;
+	}
+
+	return b;
+}
+
+//------------------------------------------------------------------------------
+// Name: toJson
+//------------------------------------------------------------------------------
+QByteArray QJsonDocument::toJson(JsonFormat format) const {
+
+	Q_UNUSED(format);
+
+	if(isArray()) {
+		QString s = toJson(array(), format);
+		return s.toUtf8();
+	}
+
+	if(isObject()) {
+		QString s = toJson(object(), format);
+		return s.toUtf8();
+	}
+
+	return QByteArray();
+}
+
+//------------------------------------------------------------------------------
+// Name: toVariant
+//------------------------------------------------------------------------------
+QVariant QJsonDocument::toVariant() const {
+
+	if(!isEmpty()) {
+		if(QJsonObject *const object = root_->toObject()) {
+			return object->toVariantMap();
+		}
+
+		if(QJsonArray *const array = root_->toArray()) {
+			return array->toVariantList();
+		}
+	}
+
+	return QVariant();
+}
+
+//------------------------------------------------------------------------------
+// Name: array
+//------------------------------------------------------------------------------
+QJsonArray QJsonDocument::array() const {
+
+	if(!isEmpty()) {
+		if(QJsonArray *const array = root_->toArray()) {
+			return *array;
+		}
+	}
+
+	return QJsonArray();
+}
+
+//------------------------------------------------------------------------------
+// Name: object
+//------------------------------------------------------------------------------
+QJsonObject QJsonDocument::object() const {
+
+	if(!isEmpty()) {
+		if(QJsonObject *const object = root_->toObject()) {
+			return *object;
+		}
+	}
+
+	return QJsonObject();
+}
+
+//------------------------------------------------------------------------------
+// Name: rawData
+//------------------------------------------------------------------------------
+const char *QJsonDocument::rawData(int *size) const {
+	Q_UNUSED(size);
+	// TODO(eteran): implement this
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name: fromBinaryData
+//------------------------------------------------------------------------------
+QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation) {
+	Q_UNUSED(data);
+	Q_UNUSED(validation);
+
+	QJsonDocument doc;
+	// TODO(eteran): implement this
+	return doc;
+}
+
+//------------------------------------------------------------------------------
+// Name: fromJson
+//------------------------------------------------------------------------------
+QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error) {
+	QJsonDocument doc;
+
+	const char *const begin = json.constData();
+	const char *const end   = begin + json.size();
+
+	QJsonParser parser(begin, end);
+
+	doc.root_ = parser.parse();
+
+	if(error) {
+		*error = parser.state();
+	}
+
+	return doc;
+}
+
+//------------------------------------------------------------------------------
+// Name: fromRawData
+//------------------------------------------------------------------------------
+QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation) {
+
+	// data has to be aligned to a 4 byte boundary.
+	Q_ASSERT(!(reinterpret_cast<quintptr>(data) % 3));
+
+	return fromBinaryData(QByteArray::fromRawData(data, size), validation);
+}
+
+//------------------------------------------------------------------------------
+// Name: fromVariant
+//------------------------------------------------------------------------------
+QJsonDocument QJsonDocument::fromVariant(const QVariant &variant) {
+
+	QJsonDocument doc;
+
+	if (variant.type() == QVariant::Map) {
+		doc.setObject(QJsonObject::fromVariantMap(variant.toMap()));
+	} else if (variant.type() == QVariant::Hash) {
+		doc.setObject(QJsonObject::fromVariantHash(variant.toHash()));
+	} else if (variant.type() == QVariant::List) {
+		doc.setArray(QJsonArray::fromVariantList(variant.toList()));
+	} else if (variant.type() == QVariant::StringList) {
+		doc.setArray(QJsonArray::fromStringList(variant.toStringList()));
+	}
+
+	return doc;
+}
+
+//------------------------------------------------------------------------------
+// Name: swap
+//------------------------------------------------------------------------------
+void QJsonDocument::swap(QJsonDocument &other) {
+	qSwap(root_, other.root_);
+}
+
+#endif
diff --git a/qjson4/QJsonDocument.h b/qjson4/QJsonDocument.h
index 32ae72f..12e8fc7 100755
--- a/qjson4/QJsonDocument.h
+++ b/qjson4/QJsonDocument.h
@@ -1,103 +1,103 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_DOCUMENT_H_
-#define QJSON_DOCUMENT_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonDocument>
-#else
-
-class QVariant;
-class QByteArray;
-class QTextStream;
-class QJsonObject;
-class QJsonValue;
-class QJsonArray;
-class QJsonParseError;
-class QJsonRoot;
-
-class QJsonDocument {
-public:
-	enum DataValidation {
-		Validate         = 0,
-		BypassValidation = 1
-	};
-
-	enum JsonFormat {
-		Indented,
-		Compact
-	};
-
-public:
-	QJsonDocument();
-	QJsonDocument(const QJsonObject &object);
-	QJsonDocument(const QJsonArray &array);
-	QJsonDocument(const QJsonDocument &other);
-	~QJsonDocument();
-
-public:
-	QJsonDocument &operator=(const QJsonDocument &other);
-
-public:
-	bool operator!=(const QJsonDocument &other) const;
-	bool operator==(const QJsonDocument &other) const;
-
-public:
-	bool isArray() const;
-	bool isEmpty() const;
-	bool isNull() const;
-	bool isObject() const;
-
-public:
-	QByteArray toBinaryData() const;
-	QByteArray toJson(JsonFormat format = Indented) const;
-	QVariant toVariant() const;
-
-public:
-	QJsonArray array() const;
-	QJsonObject object() const;
-	const char *rawData(int *size) const;
-
-public:
-	void setArray(const QJsonArray &array);
-	void setObject(const QJsonObject &object);
-
-public:
-	static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
-	static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = 0);
-	static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
-	static QJsonDocument fromVariant(const QVariant &variant);
-
-private:
-	void setRoot(const QJsonRoot &root);
-	QString toJson(const QJsonValue &v, JsonFormat format) const;
-	QString escapeString(const QString &s) const;
-
-private:
-	void swap(QJsonDocument &other);
-
-private:
-	QJsonRoot *root_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_DOCUMENT_H_
+#define QJSON_DOCUMENT_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonDocument>
+#else
+
+class QVariant;
+class QByteArray;
+class QTextStream;
+class QJsonObject;
+class QJsonValue;
+class QJsonArray;
+class QJsonParseError;
+class QJsonRoot;
+
+class QJsonDocument {
+public:
+	enum DataValidation {
+		Validate         = 0,
+		BypassValidation = 1
+	};
+
+	enum JsonFormat {
+		Indented,
+		Compact
+	};
+
+public:
+	QJsonDocument();
+	QJsonDocument(const QJsonObject &object);
+	QJsonDocument(const QJsonArray &array);
+	QJsonDocument(const QJsonDocument &other);
+	~QJsonDocument();
+
+public:
+	QJsonDocument &operator=(const QJsonDocument &other);
+
+public:
+	bool operator!=(const QJsonDocument &other) const;
+	bool operator==(const QJsonDocument &other) const;
+
+public:
+	bool isArray() const;
+	bool isEmpty() const;
+	bool isNull() const;
+	bool isObject() const;
+
+public:
+	QByteArray toBinaryData() const;
+	QByteArray toJson(JsonFormat format = Indented) const;
+	QVariant toVariant() const;
+
+public:
+	QJsonArray array() const;
+	QJsonObject object() const;
+	const char *rawData(int *size) const;
+
+public:
+	void setArray(const QJsonArray &array);
+	void setObject(const QJsonObject &object);
+
+public:
+	static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
+	static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = 0);
+	static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
+	static QJsonDocument fromVariant(const QVariant &variant);
+
+private:
+	void setRoot(const QJsonRoot &root);
+	QString toJson(const QJsonValue &v, JsonFormat format) const;
+	QString escapeString(const QString &s) const;
+
+private:
+	void swap(QJsonDocument &other);
+
+private:
+	QJsonRoot *root_;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonObject b/qjson4/QJsonObject
index 2009be3..fb2126e 100755
--- a/qjson4/QJsonObject
+++ b/qjson4/QJsonObject
@@ -1 +1 @@
-#include "QJsonObject.h"
+#include "QJsonObject.h"
diff --git a/qjson4/QJsonObject.cpp b/qjson4/QJsonObject.cpp
index 4a9e15a..55f8cf1 100755
--- a/qjson4/QJsonObject.cpp
+++ b/qjson4/QJsonObject.cpp
@@ -1,322 +1,322 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonObject.h"
-
-#if QT_VERSION < 0x050000
-
-//------------------------------------------------------------------------------
-// Name: QJsonObject
-//------------------------------------------------------------------------------
-QJsonObject::QJsonObject() {
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonObject
-//------------------------------------------------------------------------------
-QJsonObject::QJsonObject(const QJsonObject &other) : values_(other.values_) {
-}
-
-#if __cplusplus >= 201103L
-//------------------------------------------------------------------------------
-// Name: QJsonObject
-//------------------------------------------------------------------------------
-QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args) {
-	for(const QPair<QString, QJsonValue> &arg : args) {
-		values_.insert(arg.first, arg.second);
-
-	}
-}
-#endif
-
-//------------------------------------------------------------------------------
-// Name: ~QJsonObject
-//------------------------------------------------------------------------------
-QJsonObject::~QJsonObject() {
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject &QJsonObject::operator=(const QJsonObject &other) {
-	QJsonObject(other).swap(*this);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::iterator QJsonObject::begin() {
-	return values_.begin();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::begin() const {
-	return values_.begin();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::iterator QJsonObject::end() {
-	return values_.end();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::end() const {
-	return values_.end();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::constBegin() const {
-	return begin();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::constEnd() const {
-	return end();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-int QJsonObject::count() const {
-	return size();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-int QJsonObject::length() const {
-	return size();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-int QJsonObject::size() const {
-	return values_.size();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonObject::empty() const {
-	return values_.empty();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonObject::isEmpty() const {
-	return empty();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const {
-	return values_.find(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonObject::contains(const QString &key) const {
-	return values_.contains(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::iterator QJsonObject::find(const QString &key) {
-	return values_.find(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::const_iterator QJsonObject::find(const QString &key) const {
-	return values_.find(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::iterator QJsonObject::erase(iterator it) {
-	return values_.erase(it);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject::iterator QJsonObject::insert(const QString &key, const QJsonValue &value) {
-	return values_.insert(key, value);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QStringList QJsonObject::keys() const {
-	return values_.keys();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-void QJsonObject::remove(const QString &key) {
-	values_.remove(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonValue QJsonObject::take(const QString &key) {
-	return values_.take(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonValue QJsonObject::value(const QString &key) const {
-	return values_.value(key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonObject::operator!=(const QJsonObject &other) const {
-	return values_ != other.values_;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-bool QJsonObject::operator==(const QJsonObject &other) const {
-	return values_ != other.values_;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonValue QJsonObject::operator[](const QString &key) const {
-	return values_[key];
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonValueRef QJsonObject::operator[](const QString &key) {
-	return QJsonValueRef(this, key);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QVariantMap QJsonObject::toVariantMap() const {
-	QVariantMap a;
-	for(const_iterator it = begin(); it != end(); ++it) {
-		a.insert(it.key(), it.value().toVariant());
-	}
-	return a;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QVariantHash QJsonObject::toVariantHash() const {
-	QVariantHash a;
-	for(const_iterator it = begin(); it != end(); ++it) {
-		a.insert(it.key(), it.value().toVariant());
-	}
-	return a;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map) {
-	QJsonObject o;
-	for(QVariantMap::const_iterator it = map.begin(); it != map.end(); ++it) {
-		o.insert(it.key(), QJsonValue::fromVariant(it.value()));
-	}
-	return o;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash) {
-	QJsonObject o;
-	for(QVariantHash::const_iterator it = hash.begin(); it != hash.end(); ++it) {
-		o.insert(it.key(), QJsonValue::fromVariant(it.value()));
-	}
-	return o;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonRoot *QJsonObject::clone() const {
-	return new QJsonObject(*this);
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-const QJsonObject *QJsonObject::toObject() const {
-	return this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonObject *QJsonObject::toObject() {
-	return this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-QJsonArray *QJsonObject::toArray() {
-	return 0;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-//------------------------------------------------------------------------------
-const QJsonArray *QJsonObject::toArray() const {
-	return 0;
-}
-
-//------------------------------------------------------------------------------
-// Name: swap
-//------------------------------------------------------------------------------
-void QJsonObject::swap(QJsonObject &other) {
-	qSwap(values_, other.values_);
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonObject.h"
+
+#if QT_VERSION < 0x050000
+
+//------------------------------------------------------------------------------
+// Name: QJsonObject
+//------------------------------------------------------------------------------
+QJsonObject::QJsonObject() {
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonObject
+//------------------------------------------------------------------------------
+QJsonObject::QJsonObject(const QJsonObject &other) : values_(other.values_) {
+}
+
+#if __cplusplus >= 201103L
+//------------------------------------------------------------------------------
+// Name: QJsonObject
+//------------------------------------------------------------------------------
+QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args) {
+	for(const QPair<QString, QJsonValue> &arg : args) {
+		values_.insert(arg.first, arg.second);
+
+	}
+}
+#endif
+
+//------------------------------------------------------------------------------
+// Name: ~QJsonObject
+//------------------------------------------------------------------------------
+QJsonObject::~QJsonObject() {
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject &QJsonObject::operator=(const QJsonObject &other) {
+	QJsonObject(other).swap(*this);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::iterator QJsonObject::begin() {
+	return values_.begin();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::begin() const {
+	return values_.begin();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::iterator QJsonObject::end() {
+	return values_.end();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::end() const {
+	return values_.end();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::constBegin() const {
+	return begin();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::constEnd() const {
+	return end();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+int QJsonObject::count() const {
+	return size();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+int QJsonObject::length() const {
+	return size();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+int QJsonObject::size() const {
+	return values_.size();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonObject::empty() const {
+	return values_.empty();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonObject::isEmpty() const {
+	return empty();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::constFind(const QString &key) const {
+	return values_.find(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonObject::contains(const QString &key) const {
+	return values_.contains(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::iterator QJsonObject::find(const QString &key) {
+	return values_.find(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::const_iterator QJsonObject::find(const QString &key) const {
+	return values_.find(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::iterator QJsonObject::erase(iterator it) {
+	return values_.erase(it);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject::iterator QJsonObject::insert(const QString &key, const QJsonValue &value) {
+	return values_.insert(key, value);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QStringList QJsonObject::keys() const {
+	return values_.keys();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+void QJsonObject::remove(const QString &key) {
+	values_.remove(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonValue QJsonObject::take(const QString &key) {
+	return values_.take(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonValue QJsonObject::value(const QString &key) const {
+	return values_.value(key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonObject::operator!=(const QJsonObject &other) const {
+	return values_ != other.values_;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool QJsonObject::operator==(const QJsonObject &other) const {
+	return values_ != other.values_;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonValue QJsonObject::operator[](const QString &key) const {
+	return values_[key];
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonValueRef QJsonObject::operator[](const QString &key) {
+	return QJsonValueRef(this, key);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QVariantMap QJsonObject::toVariantMap() const {
+	QVariantMap a;
+	for(const_iterator it = begin(); it != end(); ++it) {
+		a.insert(it.key(), it.value().toVariant());
+	}
+	return a;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QVariantHash QJsonObject::toVariantHash() const {
+	QVariantHash a;
+	for(const_iterator it = begin(); it != end(); ++it) {
+		a.insert(it.key(), it.value().toVariant());
+	}
+	return a;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map) {
+	QJsonObject o;
+	for(QVariantMap::const_iterator it = map.begin(); it != map.end(); ++it) {
+		o.insert(it.key(), QJsonValue::fromVariant(it.value()));
+	}
+	return o;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash) {
+	QJsonObject o;
+	for(QVariantHash::const_iterator it = hash.begin(); it != hash.end(); ++it) {
+		o.insert(it.key(), QJsonValue::fromVariant(it.value()));
+	}
+	return o;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonRoot *QJsonObject::clone() const {
+	return new QJsonObject(*this);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+const QJsonObject *QJsonObject::toObject() const {
+	return this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonObject *QJsonObject::toObject() {
+	return this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+QJsonArray *QJsonObject::toArray() {
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+const QJsonArray *QJsonObject::toArray() const {
+	return 0;
+}
+
+//------------------------------------------------------------------------------
+// Name: swap
+//------------------------------------------------------------------------------
+void QJsonObject::swap(QJsonObject &other) {
+	qSwap(values_, other.values_);
+}
+
+#endif
diff --git a/qjson4/QJsonObject.h b/qjson4/QJsonObject.h
index 50a6ee5..ad657bc 100755
--- a/qjson4/QJsonObject.h
+++ b/qjson4/QJsonObject.h
@@ -1,121 +1,121 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_OBJECT_H_
-#define QJSON_OBJECT_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonObject>
-#else
-
-#include "QJsonRoot.h"
-#include "QJsonValueRef.h"
-#include "QJsonValue.h"
-#include <QtCore/QString>
-#include <QtCore/QStringList>
-#include <QtCore/QVariantMap>
-#include <QtCore/QMap>
-
-class QJsonObject : public QJsonRoot {
-	friend class QJsonDocument;
-	friend class QJsonValue;
-	friend class QJsonValueRef;
-	friend class QJsonParser;
-public:
-	// TODO(eteran): manually implement the map, for now we use QMap
-	//               but the real thing has a custom implementation
-	//               I guess for the purposes of less interdependancies?
-	//               maybe so it's easier to forward declare the iterators?
-
-	typedef QMap<QString, QJsonValue>::const_iterator const_iterator;
-	typedef QMap<QString, QJsonValue>::iterator       iterator;
-	typedef const_iterator                            ConstIterator;
-	typedef iterator                                  Iterator;
-	typedef QMap<QString, QJsonValue>::key_type       key_type;
-	typedef QMap<QString, QJsonValue>::mapped_type    mapped_type;
-	typedef QMap<QString, QJsonValue>::size_type      size_type;
-
-public:
-	QJsonObject();
-#if __cplusplus >= 201103L
-	QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args);
-#endif
-	QJsonObject(const QJsonObject &other);
-	~QJsonObject();
-	QJsonObject &operator=(const QJsonObject &other);
-
-public:
-	iterator begin();
-	const_iterator begin() const;
-	iterator end();
-	const_iterator end() const;
-	const_iterator constBegin() const;
-	const_iterator constEnd() const;
-
-public:
-	int count() const;
-	int length() const;
-	int size() const;
-	bool empty() const;
-	bool isEmpty() const;
-
-public:
-	const_iterator constFind(const QString &key) const;
-	bool contains(const QString &key) const;
-	iterator find(const QString &key);
-	const_iterator find(const QString &key) const;
-
-public:
-	iterator erase(iterator it);
-	iterator insert(const QString &key, const QJsonValue &value);
-	QStringList keys() const;
-	void remove(const QString &key);
-	QJsonValue take(const QString &key);
-	QJsonValue value(const QString &key) const;
-	bool operator!=(const QJsonObject &other) const;
-	bool operator==(const QJsonObject &other) const;
-	QJsonValue operator[](const QString &key) const;
-	QJsonValueRef operator[](const QString &key);
-
-public:
-	QVariantMap toVariantMap() const;
-	QVariantHash toVariantHash() const;
-
-public:
-	static QJsonObject fromVariantMap(const QVariantMap &map);
-	static QJsonObject fromVariantHash(const QVariantHash &hash);
-
-private:
-	virtual QJsonRoot *clone() const;
-	virtual QJsonArray *toArray();
-	virtual QJsonObject *toObject();
-	virtual const QJsonArray *toArray() const;
-	virtual const QJsonObject *toObject() const;
-
-private:
-	void swap(QJsonObject &other);
-
-private:
-	QMap<QString, QJsonValue> values_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_OBJECT_H_
+#define QJSON_OBJECT_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonObject>
+#else
+
+#include "QJsonRoot.h"
+#include "QJsonValueRef.h"
+#include "QJsonValue.h"
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariantMap>
+#include <QtCore/QMap>
+
+class QJsonObject : public QJsonRoot {
+	friend class QJsonDocument;
+	friend class QJsonValue;
+	friend class QJsonValueRef;
+	friend class QJsonParser;
+public:
+	// TODO(eteran): manually implement the map, for now we use QMap
+	//               but the real thing has a custom implementation
+	//               I guess for the purposes of less interdependancies?
+	//               maybe so it's easier to forward declare the iterators?
+
+	typedef QMap<QString, QJsonValue>::const_iterator const_iterator;
+	typedef QMap<QString, QJsonValue>::iterator       iterator;
+	typedef const_iterator                            ConstIterator;
+	typedef iterator                                  Iterator;
+	typedef QMap<QString, QJsonValue>::key_type       key_type;
+	typedef QMap<QString, QJsonValue>::mapped_type    mapped_type;
+	typedef QMap<QString, QJsonValue>::size_type      size_type;
+
+public:
+	QJsonObject();
+#if __cplusplus >= 201103L
+	QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args);
+#endif
+	QJsonObject(const QJsonObject &other);
+	~QJsonObject();
+	QJsonObject &operator=(const QJsonObject &other);
+
+public:
+	iterator begin();
+	const_iterator begin() const;
+	iterator end();
+	const_iterator end() const;
+	const_iterator constBegin() const;
+	const_iterator constEnd() const;
+
+public:
+	int count() const;
+	int length() const;
+	int size() const;
+	bool empty() const;
+	bool isEmpty() const;
+
+public:
+	const_iterator constFind(const QString &key) const;
+	bool contains(const QString &key) const;
+	iterator find(const QString &key);
+	const_iterator find(const QString &key) const;
+
+public:
+	iterator erase(iterator it);
+	iterator insert(const QString &key, const QJsonValue &value);
+	QStringList keys() const;
+	void remove(const QString &key);
+	QJsonValue take(const QString &key);
+	QJsonValue value(const QString &key) const;
+	bool operator!=(const QJsonObject &other) const;
+	bool operator==(const QJsonObject &other) const;
+	QJsonValue operator[](const QString &key) const;
+	QJsonValueRef operator[](const QString &key);
+
+public:
+	QVariantMap toVariantMap() const;
+	QVariantHash toVariantHash() const;
+
+public:
+	static QJsonObject fromVariantMap(const QVariantMap &map);
+	static QJsonObject fromVariantHash(const QVariantHash &hash);
+
+private:
+	virtual QJsonRoot *clone() const;
+	virtual QJsonArray *toArray();
+	virtual QJsonObject *toObject();
+	virtual const QJsonArray *toArray() const;
+	virtual const QJsonObject *toObject() const;
+
+private:
+	void swap(QJsonObject &other);
+
+private:
+	QMap<QString, QJsonValue> values_;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonParseError b/qjson4/QJsonParseError
index de177e3..7d30db8 100755
--- a/qjson4/QJsonParseError
+++ b/qjson4/QJsonParseError
@@ -1 +1 @@
-#include "QJsonParseError.h"
+#include "QJsonParseError.h"
diff --git a/qjson4/QJsonParseError.cpp b/qjson4/QJsonParseError.cpp
index fa19f15..6bcfd98 100755
--- a/qjson4/QJsonParseError.cpp
+++ b/qjson4/QJsonParseError.cpp
@@ -1,64 +1,64 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonParseError.h"
-
-#if QT_VERSION < 0x050000
-
-//------------------------------------------------------------------------------
-// Name: errorString
-// Desc: The QJsonParseError class is used to report errors during JSON parsing.
-//------------------------------------------------------------------------------
-QString QJsonParseError::errorString() const {
-	switch(error) {
-	case NoError:
-		return "No error occurred";
-	case UnterminatedObject:
-		return "unterminated object";
-	case MissingNameSeparator:
-		return "missing name separator";
-	case UnterminatedArray:
-		return "unterminated array";
-	case MissingValueSeparator:
-		return "missing value separator";
-	case IllegalValue:
-		return "illegal value";
-	case TerminationByNumber:
-		return "invalid termination by number";
-	case IllegalNumber:
-		return "illegal number";
-	case IllegalEscapeSequence:
-		return "illegal escape sequence";
-	case IllegalUTF8String:
-		return "invalid UTF8 string";
-	case UnterminatedString:
-		return "unterminated string";
-	case MissingObject:
-		return "object is missing after a comma";
-	case DeepNesting:
-		return "too deeply nested document";
-	case DocumentTooLarge:
-		return "too large document";
-	case GarbageAtEnd:
-		return "garbage at the end of the document";
-	}
-
-	return QString();
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonParseError.h"
+
+#if QT_VERSION < 0x050000
+
+//------------------------------------------------------------------------------
+// Name: errorString
+// Desc: The QJsonParseError class is used to report errors during JSON parsing.
+//------------------------------------------------------------------------------
+QString QJsonParseError::errorString() const {
+	switch(error) {
+	case NoError:
+		return "No error occurred";
+	case UnterminatedObject:
+		return "unterminated object";
+	case MissingNameSeparator:
+		return "missing name separator";
+	case UnterminatedArray:
+		return "unterminated array";
+	case MissingValueSeparator:
+		return "missing value separator";
+	case IllegalValue:
+		return "illegal value";
+	case TerminationByNumber:
+		return "invalid termination by number";
+	case IllegalNumber:
+		return "illegal number";
+	case IllegalEscapeSequence:
+		return "illegal escape sequence";
+	case IllegalUTF8String:
+		return "invalid UTF8 string";
+	case UnterminatedString:
+		return "unterminated string";
+	case MissingObject:
+		return "object is missing after a comma";
+	case DeepNesting:
+		return "too deeply nested document";
+	case DocumentTooLarge:
+		return "too large document";
+	case GarbageAtEnd:
+		return "garbage at the end of the document";
+	}
+
+	return QString();
+}
+
+#endif
diff --git a/qjson4/QJsonParseError.h b/qjson4/QJsonParseError.h
index d2eda8b..b87d7aa 100755
--- a/qjson4/QJsonParseError.h
+++ b/qjson4/QJsonParseError.h
@@ -1,60 +1,60 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_PARSE_ERROR_H_
-#define QJSON_PARSE_ERROR_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonParseError>
-#else
-
-#include <QtCore/QString>
-
-class QJsonParseError {
-public:
-	enum ParseError {
-		NoError 			   = 0,
-		UnterminatedObject     = 1,
-		MissingNameSeparator   = 2,
-		UnterminatedArray	   = 3,
-		MissingValueSeparator  = 4,
-		IllegalValue		   = 5,
-		TerminationByNumber    = 6,
-		IllegalNumber		   = 7,
-		IllegalEscapeSequence  = 8,
-		IllegalUTF8String	   = 9,
-		UnterminatedString     = 10,
-		MissingObject		   = 11,
-		DeepNesting 		   = 12,
-		DocumentTooLarge       = 13,
-		GarbageAtEnd           = 14
-	};
-
-public:
-	QString errorString() const;
-
-public:
-	ParseError error;
-	int        offset;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_PARSE_ERROR_H_
+#define QJSON_PARSE_ERROR_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonParseError>
+#else
+
+#include <QtCore/QString>
+
+class QJsonParseError {
+public:
+	enum ParseError {
+		NoError 			   = 0,
+		UnterminatedObject     = 1,
+		MissingNameSeparator   = 2,
+		UnterminatedArray	   = 3,
+		MissingValueSeparator  = 4,
+		IllegalValue		   = 5,
+		TerminationByNumber    = 6,
+		IllegalNumber		   = 7,
+		IllegalEscapeSequence  = 8,
+		IllegalUTF8String	   = 9,
+		UnterminatedString     = 10,
+		MissingObject		   = 11,
+		DeepNesting 		   = 12,
+		DocumentTooLarge       = 13,
+		GarbageAtEnd           = 14
+	};
+
+public:
+	QString errorString() const;
+
+public:
+	ParseError error;
+	int        offset;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonParser.cpp b/qjson4/QJsonParser.cpp
index 08c3c62..9b084f7 100755
--- a/qjson4/QJsonParser.cpp
+++ b/qjson4/QJsonParser.cpp
@@ -1,455 +1,455 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonParser.h"
-#include "QJsonArray.h"
-#include "QJsonObject.h"
-#include "QJsonValue.h"
-
-
-#if QT_VERSION < 0x050000
-
-#include <cctype>
-#include <QScopedPointer>
-#include <QVector>
-
-namespace {
-
-unsigned int to_hex(int ch) {
-
-	static const int hexval[256] = {
-		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-		0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
-	};
-
-	if(static_cast<unsigned int>(ch) < 256) {
-		return hexval[static_cast<unsigned int>(ch)];
-	} else {
-		return 0;
-	}
-}
-
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonParser
-//------------------------------------------------------------------------------
-QJsonParser::QJsonParser(const char *begin, const char *end) : begin_(begin), end_(end), p_(begin) {
-	state_.error  = QJsonParseError::NoError;
-	state_.offset = 0;
-}
-
-//------------------------------------------------------------------------------
-// Name: parse
-//------------------------------------------------------------------------------
-QJsonRoot *QJsonParser::parse() {
-	if(begin_ == end_) {
-		return 0;
-	}
-
-	QJsonRoot *ret = 0;
-
-	try {
-		const char ch = peek();
-		switch(ch) {
-		case ArrayBegin:
-			ret = getArray();
-			break;
-		case ObjectBegin:
-			ret = getObject();
-			break;
-		default:
-			state_.error  = QJsonParseError::IllegalValue;
-			state_.offset = p_ - begin_;
-			break;
-		}
-	} catch(const QJsonParseError &e) {
-		state_ = e;
-	}
-
-	if(ret) {
-		// eat up trailing white space...
-		while(p_ != end_ && std::isspace(*p_)) {
-			++p_;
-		}
-
-		//detect trailing garbage
-		if(p_ != end_) {
-			state_.error  = QJsonParseError::GarbageAtEnd;
-			state_.offset = p_ - begin_;
-		}
-	}
-
-	return ret;
-}
-
-//------------------------------------------------------------------------------
-// Name: peek
-//------------------------------------------------------------------------------
-char QJsonParser::peek() {
-	// first eat up some whitespace
-	while(p_ != end_ && std::isspace(*p_)) {
-		++p_;
-	}
-
-	return *p_;
-}
-
-//------------------------------------------------------------------------------
-// Name: getValue
-//------------------------------------------------------------------------------
-QJsonValue QJsonParser::getValue() {
-
-	switch(peek()) {
-	case ObjectBegin:
-		{
-			QScopedPointer<QJsonObject> obj(getObject());
-			return QJsonValue(*obj);
-		}
-	case ArrayBegin:
-		{
-			QScopedPointer<QJsonArray> arr(getArray());
-			return QJsonValue(*arr);
-		}
-	case Quote:
-		return QJsonValue(getString());
-	case 't':
-		return getTrue();
-	case 'f':
-		return getFalse();
-	case 'n':
-		return getNull();
-	default:
-		return getNumber();
-	}
-
-	throwError(QJsonParseError::MissingObject);
-	return QJsonValue();
-}
-
-//------------------------------------------------------------------------------
-// Name: getObject
-//------------------------------------------------------------------------------
-QJsonObject *QJsonParser::getObject() {
-
-	QScopedPointer<QJsonObject> obj(new QJsonObject);
-
-	char tok = peek();
-	if(tok != ObjectBegin) {
-		throwError(QJsonParseError::IllegalValue);
-	}
-
-	++p_;
-
-	// handle empty object
-	tok = peek();
-	if(peek() == ObjectEnd) {
-		++p_;
-	} else {
-
-		do {
-			QPair<QString, QJsonValue> p = getPair();
-			obj->values_.insert(p.first, p.second);
-
-			tok = peek();
-			++p_;
-
-		} while(tok == ValueSeparator);
-	}
-
-	if(tok != ObjectEnd) {
-		throwError(QJsonParseError::UnterminatedObject);
-	}
-
-	return obj.take();
-}
-
-//------------------------------------------------------------------------------
-// Name: getArray
-//------------------------------------------------------------------------------
-QJsonArray *QJsonParser::getArray() {
-
-	QScopedPointer<QJsonArray> arr(new QJsonArray);
-
-	char tok = peek();
-
-	if(tok != ArrayBegin) {
-		throwError(QJsonParseError::IllegalValue);
-	}
-
-	++p_;
-
-	// handle empty object
-	tok = peek();
-	if(tok == ArrayEnd) {
-		++p_;
-	} else {
-		do {
-			arr->values_.push_back(getValue());
-
-			tok = peek();
-			++p_;
-
-		} while(tok == ValueSeparator);
-	}
-
-	if(tok != ArrayEnd) {
-		throwError(QJsonParseError::MissingValueSeparator);
-	}
-
-	return arr.take();
-}
-
-//------------------------------------------------------------------------------
-// Name: getPair
-//------------------------------------------------------------------------------
-QPair<QString, QJsonValue> QJsonParser::getPair() {
-
-	QString key = getString();
-
-	if(peek() != NameSeparator) {
-		throwError(QJsonParseError::MissingNameSeparator);
-	}
-	++p_;
-
-	return qMakePair(key, getValue());
-}
-
-//------------------------------------------------------------------------------
-// Name: getString
-//------------------------------------------------------------------------------
-QString QJsonParser::getString() {
-
-	if(peek() != Quote) {
-		throwError(QJsonParseError::IllegalUTF8String);
-	}
-	++p_;
-
-	QByteArray s;
-
-	while(p_ != end_ && *p_ != Quote && *p_ != '\n') {
-		if(*p_ == '\\') {
-			++p_;
-			if(p_ != end_) {
-				switch(*p_) {
-				case '"':  s.append('"'); break;
-				case '\\': s.append('\\'); break;
-				case '/':  s.append('/'); break;
-				case 'b':  s.append('\b'); break;
-				case 'f':  s.append('\f'); break;
-				case 'n':  s.append('\n'); break;
-				case 'r':  s.append('\r'); break;
-				case 't':  s.append('\t'); break;
-				case 'u':
-					{
-
-						QString hexChar;
-
-						// convert \uXXXX escape sequences to UTF-8
-						char hex[4];
-						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[0] = *++p_;
-						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[1] = *++p_;
-						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[2] = *++p_;
-						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[3] = *++p_;
-
-						if(!std::isxdigit(hex[0])) throwError(QJsonParseError::IllegalUTF8String);
-						if(!std::isxdigit(hex[1])) throwError(QJsonParseError::IllegalUTF8String);
-						if(!std::isxdigit(hex[2])) throwError(QJsonParseError::IllegalUTF8String);
-						if(!std::isxdigit(hex[3])) throwError(QJsonParseError::IllegalUTF8String);
-
-						quint16 w1 = 0;
-						quint16 w2 = 0;
-
-						w1 |= (to_hex(hex[0]) << 12);
-						w1 |= (to_hex(hex[1]) << 8);
-						w1 |= (to_hex(hex[2]) << 4);
-						w1 |= (to_hex(hex[3]));
-
-						hexChar.append(QChar(w1));
-
-						if((w1 & 0xfc00) == 0xdc00) {
-							throwError(QJsonParseError::IllegalUTF8String);
-						}
-
-						if((w1 & 0xfc00) == 0xd800) {
-							// part of a surrogate pair
-							if(p_ == end_ || *++p_ != '\\') { throwError(QJsonParseError::IllegalEscapeSequence); }
-							if(p_ == end_ || *++p_ != 'u')  { throwError(QJsonParseError::IllegalEscapeSequence); }
-
-							// convert \uXXXX escape sequences to UTF-8
-							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[0] = *++p_;
-							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[1] = *++p_;
-							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[2] = *++p_;
-							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[3] = *++p_;
-
-							if(!std::isxdigit(hex[0])) throwError(QJsonParseError::IllegalUTF8String);
-							if(!std::isxdigit(hex[1])) throwError(QJsonParseError::IllegalUTF8String);
-							if(!std::isxdigit(hex[2])) throwError(QJsonParseError::IllegalUTF8String);
-							if(!std::isxdigit(hex[3])) throwError(QJsonParseError::IllegalUTF8String);
-
-							w2 |= (to_hex(hex[0]) << 12);
-							w2 |= (to_hex(hex[1]) << 8);
-							w2 |= (to_hex(hex[2]) << 4);
-							w2 |= (to_hex(hex[3]));
-
-							hexChar.append(QChar(w2));
-						}
-
-						s.append(hexChar.toUtf8());
-					}
-					break;
-
-				default:
-					s.append('\\');
-					break;
-				}
-			}
-		} else {
-			s.append(*p_);
-		}
-		++p_;
-	}
-
-	if(*p_ != Quote || p_ == end_) {
-		throwError(QJsonParseError::UnterminatedString);
-	}
-
-	++p_;
-
-	return QString::fromUtf8(s, s.size());
-}
-
-//------------------------------------------------------------------------------
-// Name: getNull
-//------------------------------------------------------------------------------
-QJsonValue QJsonParser::getNull() {
-	if(p_ == end_ || *p_++ != 'n') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'u') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
-
-	return QJsonValue();
-}
-
-//------------------------------------------------------------------------------
-// Name: getTrue
-//------------------------------------------------------------------------------
-QJsonValue QJsonParser::getTrue() {
-	if(p_ == end_ || *p_++ != 't') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'r') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'u') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'e') { throwError(QJsonParseError::IllegalValue); }
-
-	return QJsonValue(true);
-}
-
-//------------------------------------------------------------------------------
-// Name: getFalse
-//------------------------------------------------------------------------------
-QJsonValue QJsonParser::getFalse() {
-	if(p_ == end_ || *p_++ != 'f') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'a') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 's') { throwError(QJsonParseError::IllegalValue); }
-	if(p_ == end_ || *p_++ != 'e') { throwError(QJsonParseError::IllegalValue); }
-
-	return QJsonValue(false);
-}
-
-//------------------------------------------------------------------------------
-// Name: getNumber
-//------------------------------------------------------------------------------
-QJsonValue QJsonParser::getNumber() {
-	// JSON numbers fit the regex: -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
-
-	const char *const first = p_;
-
-	// -?
-	if(p_ != end_ && *p_ == '-') {
-		++p_;
-	}
-
-	// (0|[1-9][0-9]*)
-	if(p_ != end_) {
-		if(*p_ >= '1' && *p_ <= '9') {
-			while(p_ != end_ && std::isdigit(*p_)) {
-				++p_;
-			}
-		} else if(*p_ == '0') {
-			++p_;
-		} else {
-			throwError(QJsonParseError::IllegalNumber);
-		}
-	}
-
-	// (\.[0-9]+)?
-	if(p_ != end_ && *p_ == '.') {
-		++p_;
-		if(!std::isdigit(*p_)) {
-			throwError(QJsonParseError::IllegalNumber);
-		}
-
-		while(p_ != end_ && std::isdigit(*p_)) {
-			++p_;
-		}
-	}
-
-	// ([eE][+-]?[0-9]+)?
-	if(p_ != end_ && (*p_ == 'e' || *p_ == 'E')) {
-		++p_;
-		if(p_ != end_ && (*p_ == '+' || *p_ == '-')) {
-			++p_;
-		}
-		if(!std::isdigit(*p_)) {
-			throwError(QJsonParseError::IllegalNumber);
-		}
-		while(p_ != end_ && std::isdigit(*p_)) {
-			++p_;
-		}
-	}
-
-	if(p_ == end_) {
-		throwError(QJsonParseError::TerminationByNumber);
-	}
-
-	return QJsonValue(QByteArray::fromRawData(first, p_ - first).toDouble());
-}
-
-//------------------------------------------------------------------------------
-// Name: state
-//------------------------------------------------------------------------------
-QJsonParseError QJsonParser::state() const {
-	return state_;
-}
-
-//------------------------------------------------------------------------------
-// Name: throwError
-//------------------------------------------------------------------------------
-void QJsonParser::throwError(QJsonParseError::ParseError e) {
-	QJsonParseError err;
-	err.error  = e;
-	err.offset = p_ - begin_;
-	throw err;
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonParser.h"
+#include "QJsonArray.h"
+#include "QJsonObject.h"
+#include "QJsonValue.h"
+
+
+#if QT_VERSION < 0x050000
+
+#include <cctype>
+#include <QScopedPointer>
+#include <QVector>
+
+namespace {
+
+unsigned int to_hex(int ch) {
+
+	static const int hexval[256] = {
+		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+		0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+	};
+
+	if(static_cast<unsigned int>(ch) < 256) {
+		return hexval[static_cast<unsigned int>(ch)];
+	} else {
+		return 0;
+	}
+}
+
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonParser
+//------------------------------------------------------------------------------
+QJsonParser::QJsonParser(const char *begin, const char *end) : begin_(begin), end_(end), p_(begin) {
+	state_.error  = QJsonParseError::NoError;
+	state_.offset = 0;
+}
+
+//------------------------------------------------------------------------------
+// Name: parse
+//------------------------------------------------------------------------------
+QJsonRoot *QJsonParser::parse() {
+	if(begin_ == end_) {
+		return 0;
+	}
+
+	QJsonRoot *ret = 0;
+
+	try {
+		const char ch = peek();
+		switch(ch) {
+		case ArrayBegin:
+			ret = getArray();
+			break;
+		case ObjectBegin:
+			ret = getObject();
+			break;
+		default:
+			state_.error  = QJsonParseError::IllegalValue;
+			state_.offset = p_ - begin_;
+			break;
+		}
+	} catch(const QJsonParseError &e) {
+		state_ = e;
+	}
+
+	if(ret) {
+		// eat up trailing white space...
+		while(p_ != end_ && std::isspace(*p_)) {
+			++p_;
+		}
+
+		//detect trailing garbage
+		if(p_ != end_) {
+			state_.error  = QJsonParseError::GarbageAtEnd;
+			state_.offset = p_ - begin_;
+		}
+	}
+
+	return ret;
+}
+
+//------------------------------------------------------------------------------
+// Name: peek
+//------------------------------------------------------------------------------
+char QJsonParser::peek() {
+	// first eat up some whitespace
+	while(p_ != end_ && std::isspace(*p_)) {
+		++p_;
+	}
+
+	return *p_;
+}
+
+//------------------------------------------------------------------------------
+// Name: getValue
+//------------------------------------------------------------------------------
+QJsonValue QJsonParser::getValue() {
+
+	switch(peek()) {
+	case ObjectBegin:
+		{
+			QScopedPointer<QJsonObject> obj(getObject());
+			return QJsonValue(*obj);
+		}
+	case ArrayBegin:
+		{
+			QScopedPointer<QJsonArray> arr(getArray());
+			return QJsonValue(*arr);
+		}
+	case Quote:
+		return QJsonValue(getString());
+	case 't':
+		return getTrue();
+	case 'f':
+		return getFalse();
+	case 'n':
+		return getNull();
+	default:
+		return getNumber();
+	}
+
+	throwError(QJsonParseError::MissingObject);
+	return QJsonValue();
+}
+
+//------------------------------------------------------------------------------
+// Name: getObject
+//------------------------------------------------------------------------------
+QJsonObject *QJsonParser::getObject() {
+
+	QScopedPointer<QJsonObject> obj(new QJsonObject);
+
+	char tok = peek();
+	if(tok != ObjectBegin) {
+		throwError(QJsonParseError::IllegalValue);
+	}
+
+	++p_;
+
+	// handle empty object
+	tok = peek();
+	if(peek() == ObjectEnd) {
+		++p_;
+	} else {
+
+		do {
+			QPair<QString, QJsonValue> p = getPair();
+			obj->values_.insert(p.first, p.second);
+
+			tok = peek();
+			++p_;
+
+		} while(tok == ValueSeparator);
+	}
+
+	if(tok != ObjectEnd) {
+		throwError(QJsonParseError::UnterminatedObject);
+	}
+
+	return obj.take();
+}
+
+//------------------------------------------------------------------------------
+// Name: getArray
+//------------------------------------------------------------------------------
+QJsonArray *QJsonParser::getArray() {
+
+	QScopedPointer<QJsonArray> arr(new QJsonArray);
+
+	char tok = peek();
+
+	if(tok != ArrayBegin) {
+		throwError(QJsonParseError::IllegalValue);
+	}
+
+	++p_;
+
+	// handle empty object
+	tok = peek();
+	if(tok == ArrayEnd) {
+		++p_;
+	} else {
+		do {
+			arr->values_.push_back(getValue());
+
+			tok = peek();
+			++p_;
+
+		} while(tok == ValueSeparator);
+	}
+
+	if(tok != ArrayEnd) {
+		throwError(QJsonParseError::MissingValueSeparator);
+	}
+
+	return arr.take();
+}
+
+//------------------------------------------------------------------------------
+// Name: getPair
+//------------------------------------------------------------------------------
+QPair<QString, QJsonValue> QJsonParser::getPair() {
+
+	QString key = getString();
+
+	if(peek() != NameSeparator) {
+		throwError(QJsonParseError::MissingNameSeparator);
+	}
+	++p_;
+
+	return qMakePair(key, getValue());
+}
+
+//------------------------------------------------------------------------------
+// Name: getString
+//------------------------------------------------------------------------------
+QString QJsonParser::getString() {
+
+	if(peek() != Quote) {
+		throwError(QJsonParseError::IllegalUTF8String);
+	}
+	++p_;
+
+	QByteArray s;
+
+	while(p_ != end_ && *p_ != Quote && *p_ != '\n') {
+		if(*p_ == '\\') {
+			++p_;
+			if(p_ != end_) {
+				switch(*p_) {
+				case '"':  s.append('"'); break;
+				case '\\': s.append('\\'); break;
+				case '/':  s.append('/'); break;
+				case 'b':  s.append('\b'); break;
+				case 'f':  s.append('\f'); break;
+				case 'n':  s.append('\n'); break;
+				case 'r':  s.append('\r'); break;
+				case 't':  s.append('\t'); break;
+				case 'u':
+					{
+
+						QString hexChar;
+
+						// convert \uXXXX escape sequences to UTF-8
+						char hex[4];
+						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[0] = *++p_;
+						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[1] = *++p_;
+						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[2] = *++p_;
+						if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[3] = *++p_;
+
+						if(!std::isxdigit(hex[0])) throwError(QJsonParseError::IllegalUTF8String);
+						if(!std::isxdigit(hex[1])) throwError(QJsonParseError::IllegalUTF8String);
+						if(!std::isxdigit(hex[2])) throwError(QJsonParseError::IllegalUTF8String);
+						if(!std::isxdigit(hex[3])) throwError(QJsonParseError::IllegalUTF8String);
+
+						quint16 w1 = 0;
+						quint16 w2 = 0;
+
+						w1 |= (to_hex(hex[0]) << 12);
+						w1 |= (to_hex(hex[1]) << 8);
+						w1 |= (to_hex(hex[2]) << 4);
+						w1 |= (to_hex(hex[3]));
+
+						hexChar.append(QChar(w1));
+
+						if((w1 & 0xfc00) == 0xdc00) {
+							throwError(QJsonParseError::IllegalUTF8String);
+						}
+
+						if((w1 & 0xfc00) == 0xd800) {
+							// part of a surrogate pair
+							if(p_ == end_ || *++p_ != '\\') { throwError(QJsonParseError::IllegalEscapeSequence); }
+							if(p_ == end_ || *++p_ != 'u')  { throwError(QJsonParseError::IllegalEscapeSequence); }
+
+							// convert \uXXXX escape sequences to UTF-8
+							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[0] = *++p_;
+							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[1] = *++p_;
+							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[2] = *++p_;
+							if(p_ == end_) { throwError(QJsonParseError::IllegalEscapeSequence); } hex[3] = *++p_;
+
+							if(!std::isxdigit(hex[0])) throwError(QJsonParseError::IllegalUTF8String);
+							if(!std::isxdigit(hex[1])) throwError(QJsonParseError::IllegalUTF8String);
+							if(!std::isxdigit(hex[2])) throwError(QJsonParseError::IllegalUTF8String);
+							if(!std::isxdigit(hex[3])) throwError(QJsonParseError::IllegalUTF8String);
+
+							w2 |= (to_hex(hex[0]) << 12);
+							w2 |= (to_hex(hex[1]) << 8);
+							w2 |= (to_hex(hex[2]) << 4);
+							w2 |= (to_hex(hex[3]));
+
+							hexChar.append(QChar(w2));
+						}
+
+						s.append(hexChar.toUtf8());
+					}
+					break;
+
+				default:
+					s.append('\\');
+					break;
+				}
+			}
+		} else {
+			s.append(*p_);
+		}
+		++p_;
+	}
+
+	if(*p_ != Quote || p_ == end_) {
+		throwError(QJsonParseError::UnterminatedString);
+	}
+
+	++p_;
+
+	return QString::fromUtf8(s, s.size());
+}
+
+//------------------------------------------------------------------------------
+// Name: getNull
+//------------------------------------------------------------------------------
+QJsonValue QJsonParser::getNull() {
+	if(p_ == end_ || *p_++ != 'n') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'u') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
+
+	return QJsonValue();
+}
+
+//------------------------------------------------------------------------------
+// Name: getTrue
+//------------------------------------------------------------------------------
+QJsonValue QJsonParser::getTrue() {
+	if(p_ == end_ || *p_++ != 't') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'r') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'u') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'e') { throwError(QJsonParseError::IllegalValue); }
+
+	return QJsonValue(true);
+}
+
+//------------------------------------------------------------------------------
+// Name: getFalse
+//------------------------------------------------------------------------------
+QJsonValue QJsonParser::getFalse() {
+	if(p_ == end_ || *p_++ != 'f') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'a') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'l') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 's') { throwError(QJsonParseError::IllegalValue); }
+	if(p_ == end_ || *p_++ != 'e') { throwError(QJsonParseError::IllegalValue); }
+
+	return QJsonValue(false);
+}
+
+//------------------------------------------------------------------------------
+// Name: getNumber
+//------------------------------------------------------------------------------
+QJsonValue QJsonParser::getNumber() {
+	// JSON numbers fit the regex: -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
+
+	const char *const first = p_;
+
+	// -?
+	if(p_ != end_ && *p_ == '-') {
+		++p_;
+	}
+
+	// (0|[1-9][0-9]*)
+	if(p_ != end_) {
+		if(*p_ >= '1' && *p_ <= '9') {
+			while(p_ != end_ && std::isdigit(*p_)) {
+				++p_;
+			}
+		} else if(*p_ == '0') {
+			++p_;
+		} else {
+			throwError(QJsonParseError::IllegalNumber);
+		}
+	}
+
+	// (\.[0-9]+)?
+	if(p_ != end_ && *p_ == '.') {
+		++p_;
+		if(!std::isdigit(*p_)) {
+			throwError(QJsonParseError::IllegalNumber);
+		}
+
+		while(p_ != end_ && std::isdigit(*p_)) {
+			++p_;
+		}
+	}
+
+	// ([eE][+-]?[0-9]+)?
+	if(p_ != end_ && (*p_ == 'e' || *p_ == 'E')) {
+		++p_;
+		if(p_ != end_ && (*p_ == '+' || *p_ == '-')) {
+			++p_;
+		}
+		if(!std::isdigit(*p_)) {
+			throwError(QJsonParseError::IllegalNumber);
+		}
+		while(p_ != end_ && std::isdigit(*p_)) {
+			++p_;
+		}
+	}
+
+	if(p_ == end_) {
+		throwError(QJsonParseError::TerminationByNumber);
+	}
+
+	return QJsonValue(QByteArray::fromRawData(first, p_ - first).toDouble());
+}
+
+//------------------------------------------------------------------------------
+// Name: state
+//------------------------------------------------------------------------------
+QJsonParseError QJsonParser::state() const {
+	return state_;
+}
+
+//------------------------------------------------------------------------------
+// Name: throwError
+//------------------------------------------------------------------------------
+void QJsonParser::throwError(QJsonParseError::ParseError e) {
+	QJsonParseError err;
+	err.error  = e;
+	err.offset = p_ - begin_;
+	throw err;
+}
+
+#endif
diff --git a/qjson4/QJsonParser.h b/qjson4/QJsonParser.h
index 0686838..d54a0d9 100755
--- a/qjson4/QJsonParser.h
+++ b/qjson4/QJsonParser.h
@@ -1,81 +1,81 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-// NOTE: this is not part of the "public" Qt API, so using this class directly
-//       is not recomended
-
-#ifndef QJSON_PARSER_H_
-#define QJSON_PARSER_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION < 0x050000
-
-#include "QJsonParseError.h"
-#include <QPair>
-class QJsonRoot;
-class QJsonObject;
-class QJsonArray;
-class QJsonValue;
-
-class QJsonParser {
-	friend class QJsonDocument;
-
-public:
-	QJsonParser(const char *begin, const char *end);
-
-public:
-	QJsonRoot *parse();
-
-public:
-	QJsonParseError state() const;
-
-private:
-	static const char ArrayBegin     = '[';
-	static const char ArrayEnd       = ']';
-	static const char NameSeparator  = ':';
-	static const char ValueSeparator = ',';
-	static const char ObjectBegin    = '{';
-	static const char ObjectEnd      = '}';
-	static const char Quote          = '"';
-
-private:
-	char peek();
-	QJsonObject *getObject();
-	QJsonArray *getArray();
-	QJsonValue getValue();
-	QString getString();
-	QJsonValue getTrue();
-	QJsonValue getFalse();
-	QJsonValue getNull();
-	QJsonValue getNumber();
-	QPair<QString, QJsonValue> getPair();
-
-private:
-	void throwError(QJsonParseError::ParseError e);
-
-private:
-	QJsonParseError   state_;
-	const char *const begin_;
-	const char *const end_;
-	const char *      p_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+// NOTE: this is not part of the "public" Qt API, so using this class directly
+//       is not recomended
+
+#ifndef QJSON_PARSER_H_
+#define QJSON_PARSER_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION < 0x050000
+
+#include "QJsonParseError.h"
+#include <QPair>
+class QJsonRoot;
+class QJsonObject;
+class QJsonArray;
+class QJsonValue;
+
+class QJsonParser {
+	friend class QJsonDocument;
+
+public:
+	QJsonParser(const char *begin, const char *end);
+
+public:
+	QJsonRoot *parse();
+
+public:
+	QJsonParseError state() const;
+
+private:
+	static const char ArrayBegin     = '[';
+	static const char ArrayEnd       = ']';
+	static const char NameSeparator  = ':';
+	static const char ValueSeparator = ',';
+	static const char ObjectBegin    = '{';
+	static const char ObjectEnd      = '}';
+	static const char Quote          = '"';
+
+private:
+	char peek();
+	QJsonObject *getObject();
+	QJsonArray *getArray();
+	QJsonValue getValue();
+	QString getString();
+	QJsonValue getTrue();
+	QJsonValue getFalse();
+	QJsonValue getNull();
+	QJsonValue getNumber();
+	QPair<QString, QJsonValue> getPair();
+
+private:
+	void throwError(QJsonParseError::ParseError e);
+
+private:
+	QJsonParseError   state_;
+	const char *const begin_;
+	const char *const end_;
+	const char *      p_;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonRoot b/qjson4/QJsonRoot
index 32bf3f0..fbcaca1 100755
--- a/qjson4/QJsonRoot
+++ b/qjson4/QJsonRoot
@@ -1 +1 @@
-#include "QJsonRoot.h"
+#include "QJsonRoot.h"
diff --git a/qjson4/QJsonRoot.h b/qjson4/QJsonRoot.h
index a7e0729..77b9751 100755
--- a/qjson4/QJsonRoot.h
+++ b/qjson4/QJsonRoot.h
@@ -1,45 +1,45 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_ROOT_H_
-#define QJSON_ROOT_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION < 0x050000
-
-class QJsonObject;
-class QJsonArray;
-
-class QJsonRoot {
-public:
-	virtual ~QJsonRoot() {};
-
-public:
-	virtual QJsonRoot *clone() const = 0;
-
-public:
-	virtual QJsonArray *toArray() = 0;
-	virtual QJsonObject *toObject() = 0;
-	virtual const QJsonArray *toArray() const = 0;
-	virtual const QJsonObject *toObject() const = 0;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_ROOT_H_
+#define QJSON_ROOT_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION < 0x050000
+
+class QJsonObject;
+class QJsonArray;
+
+class QJsonRoot {
+public:
+	virtual ~QJsonRoot() {};
+
+public:
+	virtual QJsonRoot *clone() const = 0;
+
+public:
+	virtual QJsonArray *toArray() = 0;
+	virtual QJsonObject *toObject() = 0;
+	virtual const QJsonArray *toArray() const = 0;
+	virtual const QJsonObject *toObject() const = 0;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonValue b/qjson4/QJsonValue
index d4ca2b1..eb1b6fe 100755
--- a/qjson4/QJsonValue
+++ b/qjson4/QJsonValue
@@ -1 +1 @@
-#include "QJsonValue.h"
+#include "QJsonValue.h"
diff --git a/qjson4/QJsonValue.cpp b/qjson4/QJsonValue.cpp
index 8365571..68bf87f 100755
--- a/qjson4/QJsonValue.cpp
+++ b/qjson4/QJsonValue.cpp
@@ -1,391 +1,391 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonValue.h"
-#include "QJsonArray.h"
-#include "QJsonObject.h"
-
-#if QT_VERSION < 0x050000
-#include <QtCore/QtAlgorithms>
-#include <QtCore/qmath.h>
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(Type type) : type_(type) {
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(bool b) : type_(Bool) {
-	value_.b = b;
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(double n) : type_(Double) {
-	value_.n = n;
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(const QString &s) : type_(String) {
-	value_.s = new QString(s);
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(QLatin1String s) : type_(String) {
-	value_.s = new QString(s);
-}
-
-#ifndef QT_NO_CAST_FROM_ASCII
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(const char *s) : type_(String) {
-	value_.s = new QString(QString::fromUtf8(s));
-}
-#endif
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(const QJsonArray &a) : type_(Array) {
-	value_.r = a.clone();
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(const QJsonObject &o) : type_(Object) {
-	value_.r = o.clone();
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(int n) : type_(Double) {
-	value_.n = n;
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(qint64 n) : type_(Double) {
-	value_.n = n;
-}
-
-//------------------------------------------------------------------------------
-// Name: QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::QJsonValue(const QJsonValue &other) : type_(other.type_) {
-
-	switch(other.type_) {
-	case Bool:
-		value_.b = other.value_.b;
-		break;
-	case Double:
-		value_.n = other.value_.n;
-		break;
-	case String:
-		value_.s = new QString(*other.value_.s);
-		break;
-	case Array:
-	case Object:
-		value_.r = other.value_.r->clone();
-		break;
-	case Undefined:
-	case Null:
-		value_ = other.value_;
-		break;
-	}
-}
-
-//------------------------------------------------------------------------------
-// Name: ~QJsonValue
-//------------------------------------------------------------------------------
-QJsonValue::~QJsonValue() {
-	switch(type_) {
-	case Null:
-	case Bool:
-	case Double:
-	case Undefined:
-		break;
-	case String:
-		delete value_.s;
-		break;
-	case Object:
-	case Array:
-		delete value_.r;
-		break;
-	}
-}
-
-//------------------------------------------------------------------------------
-// Name: operator=
-//------------------------------------------------------------------------------
-QJsonValue &QJsonValue::operator=(const QJsonValue &other) {
-	QJsonValue(other).swap(*this);
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator!=
-//------------------------------------------------------------------------------
-bool QJsonValue::operator!=(const QJsonValue &other) const {
-	return !(*this == other);
-}
-
-//------------------------------------------------------------------------------
-// Name: operator==
-//------------------------------------------------------------------------------
-bool QJsonValue::operator==(const QJsonValue &other) const {
-	if(type_ == other.type_) {
-		switch(type_) {
-		case Null:
-			return true;
-		case Bool:
-			return value_.b == other.value_.b;
-		case Double:
-			return value_.n == other.value_.n;
-		case Undefined:
-			return true;
-		case String:
-			return *value_.s == *other.value_.s;
-		case Array:
-			return *(value_.r->toArray()) == *(other.value_.r->toArray());
-		case Object:
-			return *(value_.r->toObject()) == *(other.value_.r->toObject());
-		}
-	}
-	return false;
-}
-
-//------------------------------------------------------------------------------
-// Name: isArray
-//------------------------------------------------------------------------------
-bool QJsonValue::isArray() const {
-	return type_ == Array;
-}
-
-//------------------------------------------------------------------------------
-// Name: isBool
-//------------------------------------------------------------------------------
-bool QJsonValue::isBool() const {
-	return type_ == Bool;
-}
-
-//------------------------------------------------------------------------------
-// Name: isDouble
-//------------------------------------------------------------------------------
-bool QJsonValue::isDouble() const {
-	return type_ == Double;
-}
-
-//------------------------------------------------------------------------------
-// Name: isNull
-//------------------------------------------------------------------------------
-bool QJsonValue::isNull() const {
-	return type_ == Null;
-}
-
-//------------------------------------------------------------------------------
-// Name: isObject
-//------------------------------------------------------------------------------
-bool QJsonValue::isObject() const {
-	return type_ == Object;
-}
-
-//------------------------------------------------------------------------------
-// Name: isString
-//------------------------------------------------------------------------------
-bool QJsonValue::isString() const {
-	return type_ == String;
-}
-
-//------------------------------------------------------------------------------
-// Name: isUndefined
-//------------------------------------------------------------------------------
-bool QJsonValue::isUndefined() const {
-	return type_ == Undefined;
-}
-
-//------------------------------------------------------------------------------
-// Name: type
-//------------------------------------------------------------------------------
-QJsonValue::Type QJsonValue::type() const {
-	return type_;
-}
-
-//------------------------------------------------------------------------------
-// Name: toArray
-//------------------------------------------------------------------------------
-QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const {
-	if(isArray()) {
-		return *(value_.r->toArray());
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toArray
-//------------------------------------------------------------------------------
-QJsonArray QJsonValue::toArray() const {
-	return toArray(QJsonArray());
-}
-
-//------------------------------------------------------------------------------
-// Name: toBool
-//------------------------------------------------------------------------------
-bool QJsonValue::toBool(bool defaultValue) const {
-	if(isBool()) {
-		return value_.b;
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toDouble
-//------------------------------------------------------------------------------
-double QJsonValue::toDouble(double defaultValue) const {
-	if(isDouble()) {
-		return value_.n;
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toInt
-//------------------------------------------------------------------------------
-int QJsonValue::toInt(int defaultValue) const {
-	if(isDouble() && qFloor(value_.n) == value_.n) {
-		return value_.n;
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toObject
-//------------------------------------------------------------------------------
-QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const {
-	if(isObject()) {
-		return *(value_.r->toObject());
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toObject
-//------------------------------------------------------------------------------
-QJsonObject QJsonValue::toObject() const {
-	return toObject(QJsonObject());
-}
-
-//------------------------------------------------------------------------------
-// Name: toString
-//------------------------------------------------------------------------------
-QString QJsonValue::toString(const QString &defaultValue) const {
-
-	if(isString()) {
-		return *value_.s;
-	}
-
-	return defaultValue;
-}
-
-//------------------------------------------------------------------------------
-// Name: toVariant
-//------------------------------------------------------------------------------
-QVariant QJsonValue::toVariant() const {
-	switch(type_) {
-	case Null:
-		return QVariant();
-	case Bool:
-		return QVariant::fromValue(value_.b);
-	case Double:
-		return QVariant::fromValue(value_.n);
-	case String:
-		return QVariant::fromValue(*value_.s);
-	case Array:
-		return value_.r->toArray()->toVariantList();
-	case Object:
-		return value_.r->toObject()->toVariantMap();
-	case Undefined:
-		return QVariant();
-	}
-
-	return QVariant();
-}
-
-//------------------------------------------------------------------------------
-// Name: fromVariant
-//------------------------------------------------------------------------------
-QJsonValue QJsonValue::fromVariant(const QVariant &variant) {
-	if(variant.isNull()) {
-		return QJsonValue(Null);
-	}
-
-	switch(variant.type()) {
-	case QVariant::Bool:
-		return QJsonValue(variant.toBool());
-	case QVariant::Int:
-		return QJsonValue(variant.toInt());
-	case QVariant::Double:
-	case QVariant::LongLong:
-	case QVariant::ULongLong:
-	case QVariant::UInt:
-		return QJsonValue(variant.toDouble());
-	case QVariant::String:
-		return QJsonValue(variant.toString());
-	case QVariant::List:
-		return QJsonArray::fromVariantList(variant.toList());
-	case QVariant::StringList:
-		return QJsonArray::fromStringList(variant.toStringList());
-	case QVariant::Map:
-		return QJsonObject::fromVariantMap(variant.toMap());
-	default:
-		const QString s = variant.toString();
-		if(!s.isEmpty()) {
-			return QJsonValue(s);
-		}
-		break;
-	}
-
-	return QJsonValue(Null);
-
-}
-
-//------------------------------------------------------------------------------
-// Name: swap
-//------------------------------------------------------------------------------
-void QJsonValue::swap(QJsonValue &other) {
-	qSwap(type_, other.type_);
-	qSwap(value_, other.value_);
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonValue.h"
+#include "QJsonArray.h"
+#include "QJsonObject.h"
+
+#if QT_VERSION < 0x050000
+#include <QtCore/QtAlgorithms>
+#include <QtCore/qmath.h>
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(Type type) : type_(type) {
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(bool b) : type_(Bool) {
+	value_.b = b;
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(double n) : type_(Double) {
+	value_.n = n;
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(const QString &s) : type_(String) {
+	value_.s = new QString(s);
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(QLatin1String s) : type_(String) {
+	value_.s = new QString(s);
+}
+
+#ifndef QT_NO_CAST_FROM_ASCII
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(const char *s) : type_(String) {
+	value_.s = new QString(QString::fromUtf8(s));
+}
+#endif
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(const QJsonArray &a) : type_(Array) {
+	value_.r = a.clone();
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(const QJsonObject &o) : type_(Object) {
+	value_.r = o.clone();
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(int n) : type_(Double) {
+	value_.n = n;
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(qint64 n) : type_(Double) {
+	value_.n = n;
+}
+
+//------------------------------------------------------------------------------
+// Name: QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::QJsonValue(const QJsonValue &other) : type_(other.type_) {
+
+	switch(other.type_) {
+	case Bool:
+		value_.b = other.value_.b;
+		break;
+	case Double:
+		value_.n = other.value_.n;
+		break;
+	case String:
+		value_.s = new QString(*other.value_.s);
+		break;
+	case Array:
+	case Object:
+		value_.r = other.value_.r->clone();
+		break;
+	case Undefined:
+	case Null:
+		value_ = other.value_;
+		break;
+	}
+}
+
+//------------------------------------------------------------------------------
+// Name: ~QJsonValue
+//------------------------------------------------------------------------------
+QJsonValue::~QJsonValue() {
+	switch(type_) {
+	case Null:
+	case Bool:
+	case Double:
+	case Undefined:
+		break;
+	case String:
+		delete value_.s;
+		break;
+	case Object:
+	case Array:
+		delete value_.r;
+		break;
+	}
+}
+
+//------------------------------------------------------------------------------
+// Name: operator=
+//------------------------------------------------------------------------------
+QJsonValue &QJsonValue::operator=(const QJsonValue &other) {
+	QJsonValue(other).swap(*this);
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator!=
+//------------------------------------------------------------------------------
+bool QJsonValue::operator!=(const QJsonValue &other) const {
+	return !(*this == other);
+}
+
+//------------------------------------------------------------------------------
+// Name: operator==
+//------------------------------------------------------------------------------
+bool QJsonValue::operator==(const QJsonValue &other) const {
+	if(type_ == other.type_) {
+		switch(type_) {
+		case Null:
+			return true;
+		case Bool:
+			return value_.b == other.value_.b;
+		case Double:
+			return value_.n == other.value_.n;
+		case Undefined:
+			return true;
+		case String:
+			return *value_.s == *other.value_.s;
+		case Array:
+			return *(value_.r->toArray()) == *(other.value_.r->toArray());
+		case Object:
+			return *(value_.r->toObject()) == *(other.value_.r->toObject());
+		}
+	}
+	return false;
+}
+
+//------------------------------------------------------------------------------
+// Name: isArray
+//------------------------------------------------------------------------------
+bool QJsonValue::isArray() const {
+	return type_ == Array;
+}
+
+//------------------------------------------------------------------------------
+// Name: isBool
+//------------------------------------------------------------------------------
+bool QJsonValue::isBool() const {
+	return type_ == Bool;
+}
+
+//------------------------------------------------------------------------------
+// Name: isDouble
+//------------------------------------------------------------------------------
+bool QJsonValue::isDouble() const {
+	return type_ == Double;
+}
+
+//------------------------------------------------------------------------------
+// Name: isNull
+//------------------------------------------------------------------------------
+bool QJsonValue::isNull() const {
+	return type_ == Null;
+}
+
+//------------------------------------------------------------------------------
+// Name: isObject
+//------------------------------------------------------------------------------
+bool QJsonValue::isObject() const {
+	return type_ == Object;
+}
+
+//------------------------------------------------------------------------------
+// Name: isString
+//------------------------------------------------------------------------------
+bool QJsonValue::isString() const {
+	return type_ == String;
+}
+
+//------------------------------------------------------------------------------
+// Name: isUndefined
+//------------------------------------------------------------------------------
+bool QJsonValue::isUndefined() const {
+	return type_ == Undefined;
+}
+
+//------------------------------------------------------------------------------
+// Name: type
+//------------------------------------------------------------------------------
+QJsonValue::Type QJsonValue::type() const {
+	return type_;
+}
+
+//------------------------------------------------------------------------------
+// Name: toArray
+//------------------------------------------------------------------------------
+QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const {
+	if(isArray()) {
+		return *(value_.r->toArray());
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toArray
+//------------------------------------------------------------------------------
+QJsonArray QJsonValue::toArray() const {
+	return toArray(QJsonArray());
+}
+
+//------------------------------------------------------------------------------
+// Name: toBool
+//------------------------------------------------------------------------------
+bool QJsonValue::toBool(bool defaultValue) const {
+	if(isBool()) {
+		return value_.b;
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toDouble
+//------------------------------------------------------------------------------
+double QJsonValue::toDouble(double defaultValue) const {
+	if(isDouble()) {
+		return value_.n;
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toInt
+//------------------------------------------------------------------------------
+int QJsonValue::toInt(int defaultValue) const {
+	if(isDouble() && qFloor(value_.n) == value_.n) {
+		return value_.n;
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toObject
+//------------------------------------------------------------------------------
+QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const {
+	if(isObject()) {
+		return *(value_.r->toObject());
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toObject
+//------------------------------------------------------------------------------
+QJsonObject QJsonValue::toObject() const {
+	return toObject(QJsonObject());
+}
+
+//------------------------------------------------------------------------------
+// Name: toString
+//------------------------------------------------------------------------------
+QString QJsonValue::toString(const QString &defaultValue) const {
+
+	if(isString()) {
+		return *value_.s;
+	}
+
+	return defaultValue;
+}
+
+//------------------------------------------------------------------------------
+// Name: toVariant
+//------------------------------------------------------------------------------
+QVariant QJsonValue::toVariant() const {
+	switch(type_) {
+	case Null:
+		return QVariant();
+	case Bool:
+		return QVariant::fromValue(value_.b);
+	case Double:
+		return QVariant::fromValue(value_.n);
+	case String:
+		return QVariant::fromValue(*value_.s);
+	case Array:
+		return value_.r->toArray()->toVariantList();
+	case Object:
+		return value_.r->toObject()->toVariantMap();
+	case Undefined:
+		return QVariant();
+	}
+
+	return QVariant();
+}
+
+//------------------------------------------------------------------------------
+// Name: fromVariant
+//------------------------------------------------------------------------------
+QJsonValue QJsonValue::fromVariant(const QVariant &variant) {
+	if(variant.isNull()) {
+		return QJsonValue(Null);
+	}
+
+	switch(variant.type()) {
+	case QVariant::Bool:
+		return QJsonValue(variant.toBool());
+	case QVariant::Int:
+		return QJsonValue(variant.toInt());
+	case QVariant::Double:
+	case QVariant::LongLong:
+	case QVariant::ULongLong:
+	case QVariant::UInt:
+		return QJsonValue(variant.toDouble());
+	case QVariant::String:
+		return QJsonValue(variant.toString());
+	case QVariant::List:
+		return QJsonArray::fromVariantList(variant.toList());
+	case QVariant::StringList:
+		return QJsonArray::fromStringList(variant.toStringList());
+	case QVariant::Map:
+		return QJsonObject::fromVariantMap(variant.toMap());
+	default:
+		const QString s = variant.toString();
+		if(!s.isEmpty()) {
+			return QJsonValue(s);
+		}
+		break;
+	}
+
+	return QJsonValue(Null);
+
+}
+
+//------------------------------------------------------------------------------
+// Name: swap
+//------------------------------------------------------------------------------
+void QJsonValue::swap(QJsonValue &other) {
+	qSwap(type_, other.type_);
+	qSwap(value_, other.value_);
+}
+
+#endif
diff --git a/qjson4/QJsonValue.h b/qjson4/QJsonValue.h
index dec14aa..bf32898 100755
--- a/qjson4/QJsonValue.h
+++ b/qjson4/QJsonValue.h
@@ -1,120 +1,120 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_VALUE_H_
-#define QJSON_VALUE_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonValue>
-#else
-
-class QString;
-
-#include <QtCore/QVariant>
-
-class QJsonRoot;
-class QJsonArray;
-class QJsonObject;
-
-class QJsonValue {
-public:
-	enum Type {
-		Null      = 0x0,
-		Bool      = 0x1,
-		Double    = 0x2,
-		String    = 0x3,
-		Array     = 0x4,
-		Object    = 0x5,
-		Undefined = 0x80
-	};
-
-public:
-	QJsonValue(Type type = Null);
-	QJsonValue(bool b);
-	QJsonValue(double n);
-	QJsonValue(int n);
-	QJsonValue(qint64 n);
-	QJsonValue(const QString &s);
-	QJsonValue(QLatin1String s);
-#ifndef QT_NO_CAST_FROM_ASCII
-	QJsonValue(const char *s);
-#endif
-	QJsonValue(const QJsonArray &a);
-	QJsonValue(const QJsonObject &o);
-	QJsonValue(const QJsonValue &other);
-
-	~QJsonValue();
-
-private:
-	// to protect against incorrect usage due to passing a const char *
-	QJsonValue(const void *);
-
-public:
-	QJsonValue &operator=(const QJsonValue &other);
-
-public:
-	bool operator!=(const QJsonValue &other) const;
-	bool operator==(const QJsonValue &other) const;
-
-public:
-	bool isArray() const;
-	bool isBool() const;
-	bool isDouble() const;
-	bool isNull() const;
-	bool isObject() const;
-	bool isString() const;
-	bool isUndefined() const;
-
-public:
-	QJsonArray toArray(const QJsonArray &defaultValue) const;
-	QJsonArray toArray() const;
-	bool toBool(bool defaultValue = false) const;
-	double toDouble(double defaultValue = 0) const;
-	int toInt(int defaultValue = 0) const;
-	QJsonObject toObject(const QJsonObject &defaultValue) const;
-	QJsonObject toObject() const;
-	QString toString(const QString &defaultValue = QString()) const;
-	QVariant toVariant() const;
-
-public:
-	Type type() const;
-
-public:
-	static QJsonValue fromVariant(const QVariant &variant);
-
-private:
-	void swap(QJsonValue &other);
-
-private:
-	Type type_;
-
-	union ValueType {
-		bool       b;
-		double     n;
-		QString   *s;
-		QJsonRoot *r; // OJsonObject or QJsonArray
-	};
-
-	ValueType value_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_VALUE_H_
+#define QJSON_VALUE_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonValue>
+#else
+
+class QString;
+
+#include <QtCore/QVariant>
+
+class QJsonRoot;
+class QJsonArray;
+class QJsonObject;
+
+class QJsonValue {
+public:
+	enum Type {
+		Null      = 0x0,
+		Bool      = 0x1,
+		Double    = 0x2,
+		String    = 0x3,
+		Array     = 0x4,
+		Object    = 0x5,
+		Undefined = 0x80
+	};
+
+public:
+	QJsonValue(Type type = Null);
+	QJsonValue(bool b);
+	QJsonValue(double n);
+	QJsonValue(int n);
+	QJsonValue(qint64 n);
+	QJsonValue(const QString &s);
+	QJsonValue(QLatin1String s);
+#ifndef QT_NO_CAST_FROM_ASCII
+	QJsonValue(const char *s);
+#endif
+	QJsonValue(const QJsonArray &a);
+	QJsonValue(const QJsonObject &o);
+	QJsonValue(const QJsonValue &other);
+
+	~QJsonValue();
+
+private:
+	// to protect against incorrect usage due to passing a const char *
+	QJsonValue(const void *);
+
+public:
+	QJsonValue &operator=(const QJsonValue &other);
+
+public:
+	bool operator!=(const QJsonValue &other) const;
+	bool operator==(const QJsonValue &other) const;
+
+public:
+	bool isArray() const;
+	bool isBool() const;
+	bool isDouble() const;
+	bool isNull() const;
+	bool isObject() const;
+	bool isString() const;
+	bool isUndefined() const;
+
+public:
+	QJsonArray toArray(const QJsonArray &defaultValue) const;
+	QJsonArray toArray() const;
+	bool toBool(bool defaultValue = false) const;
+	double toDouble(double defaultValue = 0) const;
+	int toInt(int defaultValue = 0) const;
+	QJsonObject toObject(const QJsonObject &defaultValue) const;
+	QJsonObject toObject() const;
+	QString toString(const QString &defaultValue = QString()) const;
+	QVariant toVariant() const;
+
+public:
+	Type type() const;
+
+public:
+	static QJsonValue fromVariant(const QVariant &variant);
+
+private:
+	void swap(QJsonValue &other);
+
+private:
+	Type type_;
+
+	union ValueType {
+		bool       b;
+		double     n;
+		QString   *s;
+		QJsonRoot *r; // OJsonObject or QJsonArray
+	};
+
+	ValueType value_;
+};
+
+#endif
+
+#endif
diff --git a/qjson4/QJsonValueRef b/qjson4/QJsonValueRef
index f106170..f3b6811 100755
--- a/qjson4/QJsonValueRef
+++ b/qjson4/QJsonValueRef
@@ -1 +1 @@
-#include "QJsonValueRef.h"
+#include "QJsonValueRef.h"
diff --git a/qjson4/QJsonValueRef.cpp b/qjson4/QJsonValueRef.cpp
index 386d056..7d67ef4 100755
--- a/qjson4/QJsonValueRef.cpp
+++ b/qjson4/QJsonValueRef.cpp
@@ -1,228 +1,228 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "QJsonValueRef.h"
-
-#if QT_VERSION < 0x050000
-
-#include "QJsonArray.h"
-#include "QJsonObject.h"
-
-//------------------------------------------------------------------------------
-// Name:
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValueRef::QJsonValueRef(QJsonArray *array, int idx) : p_(array), index_(idx) {
-}
-
-//------------------------------------------------------------------------------
-// Name:
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValueRef::QJsonValueRef(QJsonObject *object, const QString &key) : p_(object), index_(0), key_(key) {
-}
-
-//------------------------------------------------------------------------------
-// Name:
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValueRef::operator QJsonValue() const {
-	return toValue();
-}
-
-//------------------------------------------------------------------------------
-// Name:
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValueRef &QJsonValueRef::operator=(const QJsonValue &val) {
-
-	if(QJsonObject *const o = p_->toObject()) {
-		o->values_[key_] = val;
-	} else if(QJsonArray *const a = p_->toArray()) {
-		a->values_[index_] = val;
-	}
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name:
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValueRef &QJsonValueRef::operator=(const QJsonValueRef &ref) {
-
-	if(QJsonObject *const o = p_->toObject()) {
-		o->values_[key_] = ref;
-	} else if(QJsonArray *const a = p_->toArray()) {
-		a->values_[index_] = ref;
-	}
-	return *this;
-}
-
-//------------------------------------------------------------------------------
-// Name: type
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValue::Type QJsonValueRef::type() const {
-	return toValue().type();
-}
-
-//------------------------------------------------------------------------------
-// Name: isNull
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isNull() const {
-	return toValue().isNull();
-}
-
-//------------------------------------------------------------------------------
-// Name: isBool
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isBool() const {
-	return toValue().isBool();
-}
-
-//------------------------------------------------------------------------------
-// Name: isDouble
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isDouble() const {
-	return toValue().isDouble();
-}
-
-//------------------------------------------------------------------------------
-// Name: isString
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isString() const {
-	return toValue().isString();
-}
-
-//------------------------------------------------------------------------------
-// Name: isArray
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isArray() const {
-	return toValue().isArray();
-}
-
-//------------------------------------------------------------------------------
-// Name: isObject
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isObject() const {
-	return toValue().isObject();
-}
-
-//------------------------------------------------------------------------------
-// Name: isUndefined
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::isUndefined() const {
-	return toValue().isUndefined();
-}
-
-//------------------------------------------------------------------------------
-// Name: toBool
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::toBool() const {
-	return toValue().toBool();
-}
-
-//------------------------------------------------------------------------------
-// Name: toDouble
-// Desc:
-//------------------------------------------------------------------------------
-double QJsonValueRef::toDouble() const {
-	return toValue().toDouble();
-}
-
-//------------------------------------------------------------------------------
-// Name: toInt
-// Desc:
-//------------------------------------------------------------------------------
-int QJsonValueRef::toInt(int defaultValue) const {
-	return toValue().toInt(defaultValue);
-}
-
-//------------------------------------------------------------------------------
-// Name: toString
-// Desc:
-//------------------------------------------------------------------------------
-QString QJsonValueRef::toString() const {
-	return toValue().toString();
-}
-
-//------------------------------------------------------------------------------
-// Name: toArray
-// Desc:
-//------------------------------------------------------------------------------
-QJsonArray QJsonValueRef::toArray() const {
-	return toValue().toArray();
-}
-
-//------------------------------------------------------------------------------
-// Name: toObject
-// Desc:
-//------------------------------------------------------------------------------
-QJsonObject QJsonValueRef::toObject() const {
-	return toValue().toObject();
-}
-
-//------------------------------------------------------------------------------
-// Name: operator==
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::operator==(const QJsonValue &other) const {
-	return toValue() == other;
-}
-
-//------------------------------------------------------------------------------
-// Name: operator!=
-// Desc:
-//------------------------------------------------------------------------------
-bool QJsonValueRef::operator!=(const QJsonValue &other) const {
-	return toValue() != other;
-}
-
-//------------------------------------------------------------------------------
-// Name: toValue
-// Desc:
-//------------------------------------------------------------------------------
-QJsonValue QJsonValueRef::toValue() const {
-	if(QJsonObject *const o = p_->toObject()) {
-		return o->values_[key_];
-	} else if(QJsonArray *const a = p_->toArray()) {
-		return a->values_[index_];
-	}
-
-	return QJsonValue();
-}
-
-//------------------------------------------------------------------------------
-// Name: swap
-// Desc:
-//------------------------------------------------------------------------------
-void QJsonValueRef::swap(QJsonValueRef &other) {
-	qSwap(p_, other.p_);
-	qSwap(key_, other.key_);
-	qSwap(index_, other.index_);
-}
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "QJsonValueRef.h"
+
+#if QT_VERSION < 0x050000
+
+#include "QJsonArray.h"
+#include "QJsonObject.h"
+
+//------------------------------------------------------------------------------
+// Name:
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValueRef::QJsonValueRef(QJsonArray *array, int idx) : p_(array), index_(idx) {
+}
+
+//------------------------------------------------------------------------------
+// Name:
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValueRef::QJsonValueRef(QJsonObject *object, const QString &key) : p_(object), index_(0), key_(key) {
+}
+
+//------------------------------------------------------------------------------
+// Name:
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValueRef::operator QJsonValue() const {
+	return toValue();
+}
+
+//------------------------------------------------------------------------------
+// Name:
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValueRef &QJsonValueRef::operator=(const QJsonValue &val) {
+
+	if(QJsonObject *const o = p_->toObject()) {
+		o->values_[key_] = val;
+	} else if(QJsonArray *const a = p_->toArray()) {
+		a->values_[index_] = val;
+	}
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValueRef &QJsonValueRef::operator=(const QJsonValueRef &ref) {
+
+	if(QJsonObject *const o = p_->toObject()) {
+		o->values_[key_] = ref;
+	} else if(QJsonArray *const a = p_->toArray()) {
+		a->values_[index_] = ref;
+	}
+	return *this;
+}
+
+//------------------------------------------------------------------------------
+// Name: type
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValue::Type QJsonValueRef::type() const {
+	return toValue().type();
+}
+
+//------------------------------------------------------------------------------
+// Name: isNull
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isNull() const {
+	return toValue().isNull();
+}
+
+//------------------------------------------------------------------------------
+// Name: isBool
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isBool() const {
+	return toValue().isBool();
+}
+
+//------------------------------------------------------------------------------
+// Name: isDouble
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isDouble() const {
+	return toValue().isDouble();
+}
+
+//------------------------------------------------------------------------------
+// Name: isString
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isString() const {
+	return toValue().isString();
+}
+
+//------------------------------------------------------------------------------
+// Name: isArray
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isArray() const {
+	return toValue().isArray();
+}
+
+//------------------------------------------------------------------------------
+// Name: isObject
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isObject() const {
+	return toValue().isObject();
+}
+
+//------------------------------------------------------------------------------
+// Name: isUndefined
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::isUndefined() const {
+	return toValue().isUndefined();
+}
+
+//------------------------------------------------------------------------------
+// Name: toBool
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::toBool() const {
+	return toValue().toBool();
+}
+
+//------------------------------------------------------------------------------
+// Name: toDouble
+// Desc:
+//------------------------------------------------------------------------------
+double QJsonValueRef::toDouble() const {
+	return toValue().toDouble();
+}
+
+//------------------------------------------------------------------------------
+// Name: toInt
+// Desc:
+//------------------------------------------------------------------------------
+int QJsonValueRef::toInt(int defaultValue) const {
+	return toValue().toInt(defaultValue);
+}
+
+//------------------------------------------------------------------------------
+// Name: toString
+// Desc:
+//------------------------------------------------------------------------------
+QString QJsonValueRef::toString() const {
+	return toValue().toString();
+}
+
+//------------------------------------------------------------------------------
+// Name: toArray
+// Desc:
+//------------------------------------------------------------------------------
+QJsonArray QJsonValueRef::toArray() const {
+	return toValue().toArray();
+}
+
+//------------------------------------------------------------------------------
+// Name: toObject
+// Desc:
+//------------------------------------------------------------------------------
+QJsonObject QJsonValueRef::toObject() const {
+	return toValue().toObject();
+}
+
+//------------------------------------------------------------------------------
+// Name: operator==
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::operator==(const QJsonValue &other) const {
+	return toValue() == other;
+}
+
+//------------------------------------------------------------------------------
+// Name: operator!=
+// Desc:
+//------------------------------------------------------------------------------
+bool QJsonValueRef::operator!=(const QJsonValue &other) const {
+	return toValue() != other;
+}
+
+//------------------------------------------------------------------------------
+// Name: toValue
+// Desc:
+//------------------------------------------------------------------------------
+QJsonValue QJsonValueRef::toValue() const {
+	if(QJsonObject *const o = p_->toObject()) {
+		return o->values_[key_];
+	} else if(QJsonArray *const a = p_->toArray()) {
+		return a->values_[index_];
+	}
+
+	return QJsonValue();
+}
+
+//------------------------------------------------------------------------------
+// Name: swap
+// Desc:
+//------------------------------------------------------------------------------
+void QJsonValueRef::swap(QJsonValueRef &other) {
+	qSwap(p_, other.p_);
+	qSwap(key_, other.key_);
+	qSwap(index_, other.index_);
+}
+
+#endif
diff --git a/qjson4/QJsonValueRef.h b/qjson4/QJsonValueRef.h
index 292f37b..567c68a 100755
--- a/qjson4/QJsonValueRef.h
+++ b/qjson4/QJsonValueRef.h
@@ -1,79 +1,79 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef QJSON_VALUEREF_H_
-#define QJSON_VALUEREF_H_
-
-#include <QtCore/QtGlobal>
-
-#if QT_VERSION >= 0x050000
-#include <QtCore/QJsonValueRef>
-#else
-
-#include "QJsonValue.h"
-class QJsonRoot;
-
-class QJsonValueRef {
-public:
-	QJsonValueRef(QJsonArray *array, int idx);
-
-	// slight variant from official APIs implementation
-	QJsonValueRef(QJsonObject *object, const QString &key);
-
-public:
-	operator QJsonValue() const;
-
-public:
-	QJsonValueRef &operator=(const QJsonValue &val);
-	QJsonValueRef &operator=(const QJsonValueRef &val);
-
-public:
-	QJsonValue::Type type() const;
-	bool isNull() const;
-	bool isBool() const;
-	bool isDouble() const;
-	bool isString() const;
-	bool isArray() const;
-	bool isObject() const;
-	bool isUndefined() const;
-
-public:
-	bool toBool() const;
-	double toDouble() const;
-	QString toString() const;
-	QJsonArray toArray() const;
-	QJsonObject toObject() const;
-	int toInt(int defaultValue = 0) const;
-
-public:
-	bool operator==(const QJsonValue &other) const;
-	bool operator!=(const QJsonValue &other) const;
-
-private:
-	QJsonValue toValue() const;
-	void swap(QJsonValueRef &other);
-
-private:
-	QJsonRoot *p_;
-	int        index_;
-	QString    key_;
-};
-
-#endif
-
-#endif
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef QJSON_VALUEREF_H_
+#define QJSON_VALUEREF_H_
+
+#include <QtCore/QtGlobal>
+
+#if QT_VERSION >= 0x050000
+#include <QtCore/QJsonValueRef>
+#else
+
+#include "QJsonValue.h"
+class QJsonRoot;
+
+class QJsonValueRef {
+public:
+	QJsonValueRef(QJsonArray *array, int idx);
+
+	// slight variant from official APIs implementation
+	QJsonValueRef(QJsonObject *object, const QString &key);
+
+public:
+	operator QJsonValue() const;
+
+public:
+	QJsonValueRef &operator=(const QJsonValue &val);
+	QJsonValueRef &operator=(const QJsonValueRef &val);
+
+public:
+	QJsonValue::Type type() const;
+	bool isNull() const;
+	bool isBool() const;
+	bool isDouble() const;
+	bool isString() const;
+	bool isArray() const;
+	bool isObject() const;
+	bool isUndefined() const;
+
+public:
+	bool toBool() const;
+	double toDouble() const;
+	QString toString() const;
+	QJsonArray toArray() const;
+	QJsonObject toObject() const;
+	int toInt(int defaultValue = 0) const;
+
+public:
+	bool operator==(const QJsonValue &other) const;
+	bool operator!=(const QJsonValue &other) const;
+
+private:
+	QJsonValue toValue() const;
+	void swap(QJsonValueRef &other);
+
+private:
+	QJsonRoot *p_;
+	int        index_;
+	QString    key_;
+};
+
+#endif
+
+#endif
diff --git a/res/960x536.png b/res/960x536.png
index 0feac2d..6196065 100644
Binary files a/res/960x536.png and b/res/960x536.png differ
diff --git a/res/app.qrc b/res/app.qrc
index c41d920..26fe7f2 100755
--- a/res/app.qrc
+++ b/res/app.qrc
@@ -16,6 +16,11 @@
         <file>empty1x16.png</file>
         <file>avatararea.png</file>
         <file>avatarareaimport.png</file>
+        <file>mappreview.jpg</file>
+        <file>pointmaker-8.png</file>
+        <file>pointmaker-16.png</file>
+        <file>pointmaker-24.png</file>
+        <file>pointmaker-32.png</file>
     </qresource>
     <qresource prefix="/global">
         <file>global.de.ini</file>
diff --git a/res/app.rc b/res/app.rc
index 4fbbc6e..2a09572 100755
--- a/res/app.rc
+++ b/res/app.rc
@@ -1,36 +1,36 @@
-IDI_ICON1               ICON    DISCARDABLE     "5sync.ico"
-
-#define RT_MANIFEST 24
-#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
-CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest"
-
-#include <windows.h>
-
-VS_VERSION_INFO     VERSIONINFO
-FILEVERSION         1, 4, 4, 0
-PRODUCTVERSION      1, 4, 4, 0
-FILEFLAGSMASK       0x3fL
-FILEFLAGS           0
-FILEOS              VOS_NT_WINDOWS32
-FILETYPE            VFT_APP
-FILESUBTYPE         VFT2_UNKNOWN
-BEGIN
-    BLOCK   "VarFileInfo"
-    BEGIN
-        VALUE   "Translation",  0x0409,  1200
-    END
-    BLOCK   "StringFileInfo"
-    BEGIN
-        BLOCK   "040904b0"
-        BEGIN
-            VALUE   "CompanyName",      "Syping"
-            VALUE   "FileDescription",  "gta5view\0"
-            VALUE   "FileVersion",      "1.4.4\0"
-            VALUE   "InternalName",     "gta5view\0"
-            VALUE   "LegalCopyright",   "Copyright � 2016-2017 Syping\0"
-            VALUE   "OriginalFilename", "gta5view.exe\0"
-            VALUE   "ProductName",      "gta5view\0"
-            VALUE   "ProductVersion",   "1.4.4\0"
-        END
-    END
-END
+IDI_ICON1               ICON    DISCARDABLE     "5sync.ico"
+
+#define RT_MANIFEST 24
+#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest"
+
+#include <windows.h>
+
+VS_VERSION_INFO     VERSIONINFO
+FILEVERSION         1, 5, 0, 0
+PRODUCTVERSION      1, 5, 0, 0
+FILEFLAGSMASK       0x3fL
+FILEFLAGS           0
+FILEOS              VOS_NT_WINDOWS32
+FILETYPE            VFT_APP
+FILESUBTYPE         VFT2_UNKNOWN
+BEGIN
+    BLOCK   "VarFileInfo"
+    BEGIN
+        VALUE   "Translation",  0x0409,  1200
+    END
+    BLOCK   "StringFileInfo"
+    BEGIN
+        BLOCK   "040904b0"
+        BEGIN
+            VALUE   "CompanyName",      "Syping"
+            VALUE   "FileDescription",  "gta5view\0"
+            VALUE   "FileVersion",      "1.5.0\0"
+            VALUE   "InternalName",     "gta5view\0"
+            VALUE   "LegalCopyright",   "Copyright � 2016-2017 Syping\0"
+            VALUE   "OriginalFilename", "gta5view.exe\0"
+            VALUE   "ProductName",      "gta5view\0"
+            VALUE   "ProductVersion",   "1.5.0\0"
+        END
+    END
+END
diff --git a/res/global.de.ini b/res/global.de.ini
index 5b2d94f..fea6010 100755
--- a/res/global.de.ini
+++ b/res/global.de.ini
@@ -1,102 +1,102 @@
-[Global]
-AIRP="Internationaler Flughafen von LS"
-ALAMO="Alamosee"
-ALTA="Alta"
-ARMYB="Fort Zancudo"
-BANNING="Banning"
-BAYTRE="Baytree Canyon"
-BEACH="Vespucci Beach"
-BHAMCA="Banham Canyon"
-BRADP="Braddock-Pass"
-BRADT="Braddock-Tunnel"
-BURTON="Burton"
-CALAFB="Calafia-Brücke"
-CANNY="Raton Canyon"
-CCREAK="Cassidy Creek"
-CHAMH="Chamberlain Hills"
-CHIL="Vinewood Hills"
-CHU="Chumash"
-CMSW="Chiliad-Mountain-Naturschutzgebiet"
-COSI="Vorstädte"
-CYPRE="Cypress Flats"
-DAVIS="Davis"
-DELBE="Del Perro Beach"
-DELPE="Del Perro"
-DELSOL="La Puerta"
-DESRT="Grand-Senora-Wüste"
-DOWNT="Innenstadt"
-DTVINE="Vinewood Mitte"
-EAST_V="East Vinewood"
-EBURO="El Burro Heights"
-ECLIPS="Eclipse"
-ELGORL="Leuchtturm El Gordo"
-ELSANT="East Los Santos"
-ELYSIAN="Elysian Island"
-GALFISH="Galilee"
-GALLI="Galileo-Park"
-GOLF="GWC und Golfclub"
-GRAPES="Grapeseed"
-GREATC="Great Chaparral"
-HARMO="Harmony"
-HAWICK="Hawick"
-HEART="Heart Attacks Beach"
-HORS="Vinewood-Rennbahn"
-HUD_MG_TRI_ALA="Alamosee"
-HUD_MG_TRI_VES="Vespucci"
-HUMLAB="Humane Labs and Research"
-JAIL="Bolingbroke-Strafanstalt"
-KOREAT="Little Seoul"
-LACT="Land-Act-Stausee"
-LAGO="Lago Zancudo"
-LDAM="Land-Act-Staudamm"
-LMESA="La Mesa"
-LOSPUER="La Puerta"
-LOSSF="Los Santos Freeway"
-MGCR_1="South Los Santos"
-MGSR_3="Raton Canyon"
-MIRR="Mirror Park"
-MORN="Morningwood"
-MOVIE="Richards Majestic"
-MTCHIL="Mount Chiliad"
-MTGORDO="Mount Gordo"
-MTJOSE="Mount Josiah"
-MURRI="Murrieta Heights"
-NCHU="North Chumash"
-OBSERV="Galileo-Observatorium"
-OCEANA="Pazifik"
-PALCOV="Paleto Cove"
-PALETO="Paleto Bay"
-PALFOR="Paleto Forest"
-PALHIGH="Palomino-Hochland"
-PALMPOW="Palmer-Taylor-Elektrizitätswerk"
-PBLUFF="Pacific Bluffs"
-PBOX="Pillbox Hill"
-PROCOB="Procopio Beach"
-PROL="North Yankton"
-RANCHO="Rancho"
-RGLEN="Richman Glen"
-RICHM="Richman"
-ROCKF="Rockford Hills"
-RTRAK="Redwood-Lights-Rennstrecke"
-SANAND="San Andreas"
-SANCHIA="San-Chianski-Bergkette"
-SANDY="Sandy Shores"
-SKID="Mission Row"
-SLAB="Stab City"
-SLSANT="South Los Santos"
-STAD="Maze Bank Arena"
-STRAW="Strawberry"
-TATAMO="Tataviam-Bergkette"
-TERMINA="Terminal"
-TEXTI="Textilbezirk"
-TONGVAH="Tongva Hills"
-TONGVAV="Tongva Valley"
-UTOPIAG="Utopia Gardens"
-VCANA="Vespucci-Kanäle"
-VESP="Vespucci"
-VINE="Vinewood"
-WINDF="Ron-Alternates-Windpark"
-WMIRROR="West Mirror Drive"
-WVINE="Vinewood West"
-ZANCUDO="Zancudo River"
-ZENORA="Senora Freeway"
+[Global]
+AIRP="Internationaler Flughafen von LS"
+ALAMO="Alamosee"
+ALTA="Alta"
+ARMYB="Fort Zancudo"
+BANNING="Banning"
+BAYTRE="Baytree Canyon"
+BEACH="Vespucci Beach"
+BHAMCA="Banham Canyon"
+BRADP="Braddock-Pass"
+BRADT="Braddock-Tunnel"
+BURTON="Burton"
+CALAFB="Calafia-Brücke"
+CANNY="Raton Canyon"
+CCREAK="Cassidy Creek"
+CHAMH="Chamberlain Hills"
+CHIL="Vinewood Hills"
+CHU="Chumash"
+CMSW="Chiliad-Mountain-Naturschutzgebiet"
+COSI="Vorstädte"
+CYPRE="Cypress Flats"
+DAVIS="Davis"
+DELBE="Del Perro Beach"
+DELPE="Del Perro"
+DELSOL="La Puerta"
+DESRT="Grand-Senora-Wüste"
+DOWNT="Innenstadt"
+DTVINE="Vinewood Mitte"
+EAST_V="East Vinewood"
+EBURO="El Burro Heights"
+ECLIPS="Eclipse"
+ELGORL="Leuchtturm El Gordo"
+ELSANT="East Los Santos"
+ELYSIAN="Elysian Island"
+GALFISH="Galilee"
+GALLI="Galileo-Park"
+GOLF="GWC und Golfclub"
+GRAPES="Grapeseed"
+GREATC="Great Chaparral"
+HARMO="Harmony"
+HAWICK="Hawick"
+HEART="Heart Attacks Beach"
+HORS="Vinewood-Rennbahn"
+HUD_MG_TRI_ALA="Alamosee"
+HUD_MG_TRI_VES="Vespucci"
+HUMLAB="Humane Labs and Research"
+JAIL="Bolingbroke-Strafanstalt"
+KOREAT="Little Seoul"
+LACT="Land-Act-Stausee"
+LAGO="Lago Zancudo"
+LDAM="Land-Act-Staudamm"
+LMESA="La Mesa"
+LOSPUER="La Puerta"
+LOSSF="Los Santos Freeway"
+MGCR_1="South Los Santos"
+MGSR_3="Raton Canyon"
+MIRR="Mirror Park"
+MORN="Morningwood"
+MOVIE="Richards Majestic"
+MTCHIL="Mount Chiliad"
+MTGORDO="Mount Gordo"
+MTJOSE="Mount Josiah"
+MURRI="Murrieta Heights"
+NCHU="North Chumash"
+OBSERV="Galileo-Observatorium"
+OCEANA="Pazifik"
+PALCOV="Paleto Cove"
+PALETO="Paleto Bay"
+PALFOR="Paleto Forest"
+PALHIGH="Palomino-Hochland"
+PALMPOW="Palmer-Taylor-Elektrizitätswerk"
+PBLUFF="Pacific Bluffs"
+PBOX="Pillbox Hill"
+PROCOB="Procopio Beach"
+PROL="North Yankton"
+RANCHO="Rancho"
+RGLEN="Richman Glen"
+RICHM="Richman"
+ROCKF="Rockford Hills"
+RTRAK="Redwood-Lights-Rennstrecke"
+SANAND="San Andreas"
+SANCHIA="San-Chianski-Bergkette"
+SANDY="Sandy Shores"
+SKID="Mission Row"
+SLAB="Stab City"
+SLSANT="South Los Santos"
+STAD="Maze Bank Arena"
+STRAW="Strawberry"
+TATAMO="Tataviam-Bergkette"
+TERMINA="Terminal"
+TEXTI="Textilbezirk"
+TONGVAH="Tongva Hills"
+TONGVAV="Tongva Valley"
+UTOPIAG="Utopia Gardens"
+VCANA="Vespucci-Kanäle"
+VESP="Vespucci"
+VINE="Vinewood"
+WINDF="Ron-Alternates-Windpark"
+WMIRROR="West Mirror Drive"
+WVINE="Vinewood West"
+ZANCUDO="Zancudo River"
+ZENORA="Senora Freeway"
diff --git a/res/global.en.ini b/res/global.en.ini
index 375c91c..4c31ad3 100755
--- a/res/global.en.ini
+++ b/res/global.en.ini
@@ -1,103 +1,103 @@
-[Global]
-AIRP="Los Santos International Airport"
-ALAMO="Alamo Sea"
-ALTA="Alta"
-ARMYB="Fort Zancudo"
-BANNING="Banning"
-BAYTRE="Baytree Canyon"
-BEACH="Vespucci Beach"
-BHAMCA="Banham Canyon"
-BRADP="Braddock Pass"
-BRADT="Braddock Tunnel"
-BURTON="Burton"
-CALAFB="Calafia Bridge"
-CANNY="Raton Canyon"
-CCREAK="Cassidy Creek"
-CHAMH="Chamberlain Hills"
-CHIL="Vinewood Hills"
-CHU="Chumash"
-CMSW="Chiliad Mountain State Wilderness"
-COSI="Countryside"
-CYPRE="Cypress Flats"
-DAVIS="Davis"
-DELBE="Del Perro Beach"
-DELPE="Del Perro"
-DELSOL="La Puerta"
-DESRT="Grand Senora Desert"
-DOWNT="Downtown"
-DTVINE="Downtown Vinewood"
-EAST_V="East Vinewood"
-EBURO="El Burro Heights"
-ECLIPS="Eclipse"
-ELGORL="El Gordo Lighthouse"
-ELSANT="East Los Santos"
-ELYSIAN="Elysian Island"
-GALFISH="Galilee"
-GALLI="Galileo Park"
-GOLF="GWC and Golfing Society"
-GRAPES="Grapeseed"
-GREATC="Great Chaparral"
-HARMO="Harmony"
-HAWICK="Hawick"
-HEART="Heart Attacks Beach"
-HORS="Vinewood Racetrack"
-HUD_MG_TRI_ALA="Alamo Sea"
-HUD_MG_TRI_VES="Vespucci"
-HUMLAB="Humane Labs and Research"
-JAIL="Bolingbroke Penitentiary"
-KOREAT="Little Seoul"
-LACT="Land Act Reservoir"
-LAGO="Lago Zancudo"
-LDAM="Land Act Dam"
-LMESA="La Mesa"
-LOSPUER="La Puerta"
-LOSSF="Los Santos Freeway"
-MGCR_1="South Los Santos"
-MGCR_6="Vespucci Canals"
-MGSR_3="Raton Canyon"
-MIRR="Mirror Park"
-MORN="Morningwood"
-MOVIE="Richards Majestic"
-MTCHIL="Mount Chiliad"
-MTGORDO="Mount Gordo"
-MTJOSE="Mount Josiah"
-MURRI="Murrieta Heights"
-NCHU="North Chumash"
-OBSERV="Galileo Observatory"
-OCEANA="Pacific Ocean"
-PALCOV="Paleto Cove"
-PALETO="Paleto Bay"
-PALFOR="Paleto Forest"
-PALHIGH="Palomino Highlands"
-PALMPOW="Palmer-Taylor Power Station"
-PBLUFF="Pacific Bluffs"
-PBOX="Pillbox Hill"
-PROCOB="Procopio Beach"
-PROL="North Yankton"
-RANCHO="Rancho"
-RGLEN="Richman Glen"
-RICHM="Richman"
-ROCKF="Rockford Hills"
-RTRAK="Redwood Lights Track"
-SANAND="San Andreas"
-SANCHIA="San Chianski Mountain Range"
-SANDY="Sandy Shores"
-SKID="Mission Row"
-SLAB="Stab City"
-SLSANT="South Los Santos"
-STAD="Maze Bank Arena"
-STRAW="Strawberry"
-TATAMO="Tataviam Mountains"
-TERMINA="Terminal"
-TEXTI="Textile City"
-TONGVAH="Tongva Hills"
-TONGVAV="Tongva Valley"
-UTOPIAG="Utopia Gardens"
-VCANA="Vespucci Canals"
-VESP="Vespucci"
-VINE="Vinewood"
-WINDF="Ron Alternates Wind Farm"
-WMIRROR="West Mirror Drive"
-WVINE="West Vinewood"
-ZANCUDO="Zancudo River"
-ZENORA="Senora Freeway"
+[Global]
+AIRP="Los Santos International Airport"
+ALAMO="Alamo Sea"
+ALTA="Alta"
+ARMYB="Fort Zancudo"
+BANNING="Banning"
+BAYTRE="Baytree Canyon"
+BEACH="Vespucci Beach"
+BHAMCA="Banham Canyon"
+BRADP="Braddock Pass"
+BRADT="Braddock Tunnel"
+BURTON="Burton"
+CALAFB="Calafia Bridge"
+CANNY="Raton Canyon"
+CCREAK="Cassidy Creek"
+CHAMH="Chamberlain Hills"
+CHIL="Vinewood Hills"
+CHU="Chumash"
+CMSW="Chiliad Mountain State Wilderness"
+COSI="Countryside"
+CYPRE="Cypress Flats"
+DAVIS="Davis"
+DELBE="Del Perro Beach"
+DELPE="Del Perro"
+DELSOL="La Puerta"
+DESRT="Grand Senora Desert"
+DOWNT="Downtown"
+DTVINE="Downtown Vinewood"
+EAST_V="East Vinewood"
+EBURO="El Burro Heights"
+ECLIPS="Eclipse"
+ELGORL="El Gordo Lighthouse"
+ELSANT="East Los Santos"
+ELYSIAN="Elysian Island"
+GALFISH="Galilee"
+GALLI="Galileo Park"
+GOLF="GWC and Golfing Society"
+GRAPES="Grapeseed"
+GREATC="Great Chaparral"
+HARMO="Harmony"
+HAWICK="Hawick"
+HEART="Heart Attacks Beach"
+HORS="Vinewood Racetrack"
+HUD_MG_TRI_ALA="Alamo Sea"
+HUD_MG_TRI_VES="Vespucci"
+HUMLAB="Humane Labs and Research"
+JAIL="Bolingbroke Penitentiary"
+KOREAT="Little Seoul"
+LACT="Land Act Reservoir"
+LAGO="Lago Zancudo"
+LDAM="Land Act Dam"
+LMESA="La Mesa"
+LOSPUER="La Puerta"
+LOSSF="Los Santos Freeway"
+MGCR_1="South Los Santos"
+MGCR_6="Vespucci Canals"
+MGSR_3="Raton Canyon"
+MIRR="Mirror Park"
+MORN="Morningwood"
+MOVIE="Richards Majestic"
+MTCHIL="Mount Chiliad"
+MTGORDO="Mount Gordo"
+MTJOSE="Mount Josiah"
+MURRI="Murrieta Heights"
+NCHU="North Chumash"
+OBSERV="Galileo Observatory"
+OCEANA="Pacific Ocean"
+PALCOV="Paleto Cove"
+PALETO="Paleto Bay"
+PALFOR="Paleto Forest"
+PALHIGH="Palomino Highlands"
+PALMPOW="Palmer-Taylor Power Station"
+PBLUFF="Pacific Bluffs"
+PBOX="Pillbox Hill"
+PROCOB="Procopio Beach"
+PROL="North Yankton"
+RANCHO="Rancho"
+RGLEN="Richman Glen"
+RICHM="Richman"
+ROCKF="Rockford Hills"
+RTRAK="Redwood Lights Track"
+SANAND="San Andreas"
+SANCHIA="San Chianski Mountain Range"
+SANDY="Sandy Shores"
+SKID="Mission Row"
+SLAB="Stab City"
+SLSANT="South Los Santos"
+STAD="Maze Bank Arena"
+STRAW="Strawberry"
+TATAMO="Tataviam Mountains"
+TERMINA="Terminal"
+TEXTI="Textile City"
+TONGVAH="Tongva Hills"
+TONGVAV="Tongva Valley"
+UTOPIAG="Utopia Gardens"
+VCANA="Vespucci Canals"
+VESP="Vespucci"
+VINE="Vinewood"
+WINDF="Ron Alternates Wind Farm"
+WMIRROR="West Mirror Drive"
+WVINE="West Vinewood"
+ZANCUDO="Zancudo River"
+ZENORA="Senora Freeway"
diff --git a/res/global.es.ini b/res/global.es.ini
index b2d3cb6..dda46a7 100644
--- a/res/global.es.ini
+++ b/res/global.es.ini
@@ -1,107 +1,107 @@
-[Global]
-AIRP="Aeropuerto Intl. de Los Santos"
-ALAMO="Alamo Sea"
-ALTA="Alta"
-ARMYB="Fort Zancudo"
-BANNING="Banning"
-BAYTRE="Baytree Canyon"
-BEACH="Vespucci Beach"
-BHAMCA="Banham Canyon"
-BRADP="Braddock Pass"
-BRADT="Túnel de Braddock"
-BURTON="Burton"
-CALAFB="Puente de Calafia"
-CANNY="Raton Canyon"
-CCREAK="Cassidy Creek"
-CHAMH="Chamberlain Hills"
-CHIL="Vinewood Hills"
-CHU="Chumash"
-CMSW="Parque natural del monte Chiliad"
-COSI="Zona rural"
-CYPRE="Cypress Flats"
-DAVIS="Davis"
-DELBE="Del Perro Beach"
-DELPE="Del Perro"
-DELSOL="La Puerta"
-DESRT="Desierto de Grand Señora"
-DOWNT="Centro"
-DTVINE="Centro de Vinewood"
-EAST_V="Vinewood Este"
-EBURO="El Burro Heights"
-ECLIPS="Eclipse"
-ELGORL="Faro de El Gordo"
-ELSANT="Los Santos Este"
-ELYSIAN="Elysian Island"
-GALFISH="Galilee"
-GALLI="Galileo Park"
-GOLF="Club de campo y de golf GW"
-GRAPES="Grapeseed"
-GREATC="Great Chaparral"
-HARMO="Harmony"
-HAWICK="Hawick"
-HEART="Heart Attacks Beach"
-HORS="Circuito de Vinewood"
-HUD_MG_TRI_ALA="Alamo Sea"
-HUD_MG_TRI_VES="Vespucci"
-HUMLAB="Laboratorios Humane"
-JAIL="Penitenciaría de Bolingbroke"
-KOREAT="Little Seoul"
-LACT="Embalse de Land Act"
-LAGO="Lago Zancudo"
-LDAM="Presa de Land Act"
-LMESA="La Mesa"
-LOSPFY="Autopista de La Puerta"
-LOSPUER="La Puerta"
-LOSSF="Autopista de Los Santos"
-MGCR_1="Los Santos Sur"
-MGCR_6="Canales de Vespucci"
-MGSR_3="Raton Canyon"
-MIRR="Mirror Park"
-MORN="Morningwood"
-MOVIE="Richards Majestic"
-MO_CS_HIGH="Alta"
-MO_HIGH="Alta"
-MTCHIL="Monte Chiliad"
-MTGORDO="Monte Gordo"
-MTJOSE="Monte Josiah"
-MURRI="Murrieta Heights"
-NCHU="Chumash Norte"
-OBSERV="Observatorio Galileo"
-OCEANA="Océano Pacífico"
-PALCOV="Paleto Cove"
-PALETO="Paleto Bay"
-PALFOR="Bosque de Paleto"
-PALHIGH="Palomino Highlands"
-PALMPOW="Central eléctrica Palmer-Taylor"
-PBLUFF="Pacific Bluffs"
-PBOX="Pillbox Hill"
-PROCOB="Procopio Beach"
-PROL="North Yankton"
-RANCHO="Rancho"
-RGLEN="Richman Glen"
-RICHM="Richman"
-ROCKF="Rockford Hills"
-RTRAK="Circuito Redwood Lights"
-SANAND="San Andreas"
-SANCHIA="Cordillera San Chianski"
-SANDY="Sandy Shores"
-SENORA="Autopista de Señora"
-SKID="Mission Row"
-SLAB="Stab City"
-SLSANT="Los Santos Sur"
-STAD="Maze Bank Arena"
-STRAW="Strawberry"
-TATAMO="Montañas Tataviam"
-TERMINA="Terminal"
-TEXTI="Textile City"
-TONGVAH="Colinas de Tongva"
-TONGVAV="Valle de Tongva"
-UTOPIAG="Utopia Gardens"
-VCANA="Canales de Vespucci"
-VESP="Vespucci"
-VINE="Vinewood"
-WINDF="Granja eólica de Ron Alternates"
-WMIRROR="West Mirror Drive"
-WVINE="Vinewood Oeste"
-ZANCUDO="Río Zancudo"
-ZENORA="Autopista de Señora"
+[Global]
+AIRP="Aeropuerto Intl. de Los Santos"
+ALAMO="Alamo Sea"
+ALTA="Alta"
+ARMYB="Fort Zancudo"
+BANNING="Banning"
+BAYTRE="Baytree Canyon"
+BEACH="Vespucci Beach"
+BHAMCA="Banham Canyon"
+BRADP="Braddock Pass"
+BRADT="Túnel de Braddock"
+BURTON="Burton"
+CALAFB="Puente de Calafia"
+CANNY="Raton Canyon"
+CCREAK="Cassidy Creek"
+CHAMH="Chamberlain Hills"
+CHIL="Vinewood Hills"
+CHU="Chumash"
+CMSW="Parque natural del monte Chiliad"
+COSI="Zona rural"
+CYPRE="Cypress Flats"
+DAVIS="Davis"
+DELBE="Del Perro Beach"
+DELPE="Del Perro"
+DELSOL="La Puerta"
+DESRT="Desierto de Grand Señora"
+DOWNT="Centro"
+DTVINE="Centro de Vinewood"
+EAST_V="Vinewood Este"
+EBURO="El Burro Heights"
+ECLIPS="Eclipse"
+ELGORL="Faro de El Gordo"
+ELSANT="Los Santos Este"
+ELYSIAN="Elysian Island"
+GALFISH="Galilee"
+GALLI="Galileo Park"
+GOLF="Club de campo y de golf GW"
+GRAPES="Grapeseed"
+GREATC="Great Chaparral"
+HARMO="Harmony"
+HAWICK="Hawick"
+HEART="Heart Attacks Beach"
+HORS="Circuito de Vinewood"
+HUD_MG_TRI_ALA="Alamo Sea"
+HUD_MG_TRI_VES="Vespucci"
+HUMLAB="Laboratorios Humane"
+JAIL="Penitenciaría de Bolingbroke"
+KOREAT="Little Seoul"
+LACT="Embalse de Land Act"
+LAGO="Lago Zancudo"
+LDAM="Presa de Land Act"
+LMESA="La Mesa"
+LOSPFY="Autopista de La Puerta"
+LOSPUER="La Puerta"
+LOSSF="Autopista de Los Santos"
+MGCR_1="Los Santos Sur"
+MGCR_6="Canales de Vespucci"
+MGSR_3="Raton Canyon"
+MIRR="Mirror Park"
+MORN="Morningwood"
+MOVIE="Richards Majestic"
+MO_CS_HIGH="Alta"
+MO_HIGH="Alta"
+MTCHIL="Monte Chiliad"
+MTGORDO="Monte Gordo"
+MTJOSE="Monte Josiah"
+MURRI="Murrieta Heights"
+NCHU="Chumash Norte"
+OBSERV="Observatorio Galileo"
+OCEANA="Océano Pacífico"
+PALCOV="Paleto Cove"
+PALETO="Paleto Bay"
+PALFOR="Bosque de Paleto"
+PALHIGH="Palomino Highlands"
+PALMPOW="Central eléctrica Palmer-Taylor"
+PBLUFF="Pacific Bluffs"
+PBOX="Pillbox Hill"
+PROCOB="Procopio Beach"
+PROL="North Yankton"
+RANCHO="Rancho"
+RGLEN="Richman Glen"
+RICHM="Richman"
+ROCKF="Rockford Hills"
+RTRAK="Circuito Redwood Lights"
+SANAND="San Andreas"
+SANCHIA="Cordillera San Chianski"
+SANDY="Sandy Shores"
+SENORA="Autopista de Señora"
+SKID="Mission Row"
+SLAB="Stab City"
+SLSANT="Los Santos Sur"
+STAD="Maze Bank Arena"
+STRAW="Strawberry"
+TATAMO="Montañas Tataviam"
+TERMINA="Terminal"
+TEXTI="Textile City"
+TONGVAH="Colinas de Tongva"
+TONGVAV="Valle de Tongva"
+UTOPIAG="Utopia Gardens"
+VCANA="Canales de Vespucci"
+VESP="Vespucci"
+VINE="Vinewood"
+WINDF="Granja eólica de Ron Alternates"
+WMIRROR="West Mirror Drive"
+WVINE="Vinewood Oeste"
+ZANCUDO="Río Zancudo"
+ZENORA="Autopista de Señora"
diff --git a/res/global.fr.ini b/res/global.fr.ini
index e2669d1..130709f 100644
--- a/res/global.fr.ini
+++ b/res/global.fr.ini
@@ -1,103 +1,103 @@
-[Global]
-AIRP="Aéroport international de LS"
-ALAMO="Alamo Sea"
-ALTA="Alta"
-ARMYB="Fort Zancudo"
-BANNING="Banning"
-BAYTRE="Baytree Canyon"
-BEACH="Vespucci Beach"
-BHAMCA="Banham Canyon"
-BRADP="Braddock Pass"
-BRADT="Braddock Tunnel"
-BURTON="Burton"
-CALAFB="Calafia Bridge"
-CANNY="Raton Canyon"
-CCREAK="Cassidy Creek"
-CHAMH="Chamberlain Hills"
-CHIL="Vinewood Hills"
-CHU="Chumash"
-CMSW="Parc national du Mont Chiliad"
-CYPRE="Cypress Flats"
-DAVIS="Davis"
-DELBE="Del Perro Beach"
-DELPE="Del Perro"
-DELSOL="La Puerta"
-DESRT="Grand Señora Desert"
-DOWNT="Centre-ville"
-DTVINE="Centre de Vinewood"
-EAST_V="Vinewood East"
-EBURO="El Burro Heights"
-ECLIPS="Eclipse"
-ELGORL="Phare d'El Gordo"
-ELSANT="East Los Santos"
-ELYSIAN="Elysian Island"
-GALFISH="Galilee"
-GALLI="Galileo Park"
-GOLF="Club de golf et de détente du Grand Ouest"
-GRAPES="Grapeseed"
-GREATC="Great Chaparral"
-HARMO="Harmony"
-HAWICK="Hawick"
-HEART="Heart Attacks Beach"
-HORS="Hippodrome de Vinewood"
-HUD_MG_TRI_ALA="Alamo Sea"
-HUD_MG_TRI_VES="Vespucci"
-HUMLAB="Laboratoires Humane"
-JAIL="Pénitencier de Bolingbroke"
-KOREAT="Little Seoul"
-LACT="Land Act Reservoir"
-LAGO="Lago Zancudo"
-LDAM="Land Act Dam"
-LMESA="La Mesa"
-LOSPFY="La Puerta Freeway"
-LOSPUER="La Puerta"
-LOSSF="Los Santos Freeway"
-MGCR_1="South Los Santos"
-MGCR_6="Canaux de Vespucci"
-MGSR_3="Raton Canyon"
-MIRR="Mirror Park"
-MORN="Morningwood"
-MOVIE="Richards Majestic"
-MTCHIL="Mont Chiliad"
-MTGORDO="Mont Gordo"
-MTJOSE="Mont Josiah"
-MURRI="Murrieta Heights"
-NCHU="North Chumash"
-OBSERV="Observatoire Galileo"
-OCEANA="Océan pacifique"
-PALCOV="Paleto Cove"
-PALETO="Paleto Bay"
-PALFOR="Paleto Forest"
-PALHIGH="Palomino Highlands"
-PALMPOW="Centrale Palmer-Taylor"
-PBLUFF="Pacific Bluffs"
-PBOX="Pillbox Hill"
-PROCOB="Procopio Beach"
-PROL="North Yankton"
-RANCHO="Rancho"
-RGLEN="Richman Glen"
-RICHM="Richman"
-ROCKF="Rockford Hills"
-RTRAK="Circuit Redwood Lights"
-SANAND="San Andreas"
-SANCHIA="Monts de San Chianski"
-SANDY="Sandy Shores"
-SKID="Mission Row"
-SLAB="Stab City"
-SLSANT="South Los Santos"
-STAD="Maze Bank Arena"
-STRAW="Strawberry"
-TATAMO="Monts Tataviam"
-TERMINA="Terminal"
-TEXTI="Textile City"
-TONGVAH="Tongva Hills"
-TONGVAV="Tongva Valley"
-UTOPIAG="Utopia Gardens"
-VCANA="Canaux de Vespucci"
-VESP="Vespucci"
-VINE="Vinewood"
-WINDF="Parc d'éoliennes Ron Alternates"
-WMIRROR="Mirror Drive West"
-WVINE="Vinewood West"
-ZANCUDO="Zancudo River"
-ZENORA="Señora Freeway"
+[Global]
+AIRP="Aéroport international de LS"
+ALAMO="Alamo Sea"
+ALTA="Alta"
+ARMYB="Fort Zancudo"
+BANNING="Banning"
+BAYTRE="Baytree Canyon"
+BEACH="Vespucci Beach"
+BHAMCA="Banham Canyon"
+BRADP="Braddock Pass"
+BRADT="Braddock Tunnel"
+BURTON="Burton"
+CALAFB="Calafia Bridge"
+CANNY="Raton Canyon"
+CCREAK="Cassidy Creek"
+CHAMH="Chamberlain Hills"
+CHIL="Vinewood Hills"
+CHU="Chumash"
+CMSW="Parc national du Mont Chiliad"
+CYPRE="Cypress Flats"
+DAVIS="Davis"
+DELBE="Del Perro Beach"
+DELPE="Del Perro"
+DELSOL="La Puerta"
+DESRT="Grand Señora Desert"
+DOWNT="Centre-ville"
+DTVINE="Centre de Vinewood"
+EAST_V="Vinewood East"
+EBURO="El Burro Heights"
+ECLIPS="Eclipse"
+ELGORL="Phare d'El Gordo"
+ELSANT="East Los Santos"
+ELYSIAN="Elysian Island"
+GALFISH="Galilee"
+GALLI="Galileo Park"
+GOLF="Club de golf et de détente du Grand Ouest"
+GRAPES="Grapeseed"
+GREATC="Great Chaparral"
+HARMO="Harmony"
+HAWICK="Hawick"
+HEART="Heart Attacks Beach"
+HORS="Hippodrome de Vinewood"
+HUD_MG_TRI_ALA="Alamo Sea"
+HUD_MG_TRI_VES="Vespucci"
+HUMLAB="Laboratoires Humane"
+JAIL="Pénitencier de Bolingbroke"
+KOREAT="Little Seoul"
+LACT="Land Act Reservoir"
+LAGO="Lago Zancudo"
+LDAM="Land Act Dam"
+LMESA="La Mesa"
+LOSPFY="La Puerta Freeway"
+LOSPUER="La Puerta"
+LOSSF="Los Santos Freeway"
+MGCR_1="South Los Santos"
+MGCR_6="Canaux de Vespucci"
+MGSR_3="Raton Canyon"
+MIRR="Mirror Park"
+MORN="Morningwood"
+MOVIE="Richards Majestic"
+MTCHIL="Mont Chiliad"
+MTGORDO="Mont Gordo"
+MTJOSE="Mont Josiah"
+MURRI="Murrieta Heights"
+NCHU="North Chumash"
+OBSERV="Observatoire Galileo"
+OCEANA="Océan pacifique"
+PALCOV="Paleto Cove"
+PALETO="Paleto Bay"
+PALFOR="Paleto Forest"
+PALHIGH="Palomino Highlands"
+PALMPOW="Centrale Palmer-Taylor"
+PBLUFF="Pacific Bluffs"
+PBOX="Pillbox Hill"
+PROCOB="Procopio Beach"
+PROL="North Yankton"
+RANCHO="Rancho"
+RGLEN="Richman Glen"
+RICHM="Richman"
+ROCKF="Rockford Hills"
+RTRAK="Circuit Redwood Lights"
+SANAND="San Andreas"
+SANCHIA="Monts de San Chianski"
+SANDY="Sandy Shores"
+SKID="Mission Row"
+SLAB="Stab City"
+SLSANT="South Los Santos"
+STAD="Maze Bank Arena"
+STRAW="Strawberry"
+TATAMO="Monts Tataviam"
+TERMINA="Terminal"
+TEXTI="Textile City"
+TONGVAH="Tongva Hills"
+TONGVAV="Tongva Valley"
+UTOPIAG="Utopia Gardens"
+VCANA="Canaux de Vespucci"
+VESP="Vespucci"
+VINE="Vinewood"
+WINDF="Parc d'éoliennes Ron Alternates"
+WMIRROR="Mirror Drive West"
+WVINE="Vinewood West"
+ZANCUDO="Zancudo River"
+ZENORA="Señora Freeway"
diff --git a/res/global.ja.ini b/res/global.ja.ini
index 24ad7d2..366e294 100755
--- a/res/global.ja.ini
+++ b/res/global.ja.ini
@@ -1,106 +1,106 @@
-[Global]
-AIRP="ロスサントス国際空港"
-ALAMO="アラモ海"
-ALTA="アルタ"
-ARMYB="フォート・ザンクード"
-BANNING="バニング"
-BAYTRE="ベイツリー・キャニオン"
-BEACH="ベスプッチ・ビーチ"
-BHAMCA="バンナムキャニオン"
-BRADP="ブラドック・パス"
-BRADT="ブラドック・トンネル"
-BSS_BSTR_131="リチャーズ・マジェスティック"
-BURTON="バートン"
-CALAFB="カラフィア橋"
-CANNY="ラトン・キャニオン"
-CCREAK="キャシディ・クリーク"
-CHAMH="チェンバーレイン・ヒルズ"
-CHIL="バインウッド・ヒルズ"
-CHU="チュマシュ"
-CMSW="チリアド山自然保護区"
-COSI="農園地帯"
-CYPRE="サイプレス・フラット"
-DAVIS="デイビス"
-DELBE="デル・ペロ・ビーチ"
-DELPE="デル・ペロ"
-DELSOL="ラ・プエルタ"
-DESRT="グランド・セノーラ砂漠"
-DOWNT="ダウンタウン"
-DTVINE="ダウンタウン・バインウッド"
-EAST_V="イースト・バインウッド"
-EBURO="エル・ブロ・ハイツ"
-ECLIPS="イクリプス"
-ELGORL="エル・ゴルド灯台"
-ELSANT="イースト・ロスサントス"
-ELYSIAN="エリシアン島"
-GALFISH="ガリラヤ"
-GALLI="ガリレオ・パーク"
-GOLF="GWC&ゴルフ協会"
-GRAPES="グレイプシード"
-GREATC="グレート・チャパレル"
-HARMO="ハーモニー"
-HAWICK="ハウィック"
-HEART="ハートアタック・ビーチ"
-HORS="バインウッド・レーストラック"
-HUD_MG_TRI_ALA="アラモ海"
-HUD_MG_TRI_VES="ベスプッチ"
-HUMLAB="ヒューメイン研究所"
-JAIL="ボーリングブローク刑務所"
-KOREAT="リトル・ソウル"
-LACT="ランド・アクト貯水池"
-LAGO="ラゴ・ザンクード"
-LDAM="ランド・アクト・ダム"
-LMESA="ラ・メサ"
-LOSPFY="ラ・プエルタ高速道路"
-LOSPUER="ラ・プエルタ"
-LOSSF="ロスサントス高速道路"
-MGCR_1="サウス・ロスサントス"
-MGCR_6="ベスプッチ運河"
-MGSR_3="ラトン・キャニオン"
-MIRR="ミラー・パーク"
-MORN="モーニングウッド"
-MOVIE="リチャーズ・マジェスティック"
-MTCHIL="チリアド山"
-MTGORDO="ゴルド山"
-MTJOSE="ジョサイア山"
-MURRI="ムリエタ・ハイツ"
-NCHU="北チュマシュ"
-OBSERV="ガリレオ観測所"
-OCEANA="太平洋"
-PALCOV="パレト・コーブ"
-PALETO="パレト・ベイ"
-PALFOR="パレト・フォレスト"
-PALHIGH="パロミノ高地"
-PALMPOW="パーマー・テイラー発電所"
-PBLUFF="パシフィック・ブラフス"
-PBOX="ピルボックス・ヒル"
-PROCOB="プロコピオ・ビーチ"
-PROL="ノース・ヤンクトン"
-RANCHO="ランチョ"
-RGLEN="リッチマン・グレン"
-RICHM="リッチマン"
-ROCKF="ロックフォード・ヒルズ"
-RTRAK="レッドウッド・ライト・トラック"
-SANAND="サンアンドレアス"
-SANCHIA="サン・チアンスキー山脈"
-SANDY="サンディ海岸"
-SENORA="セノーラ高速道路"
-SKID="ミッション・ロウ"
-SLAB="スタブシティ"
-SLSANT="サウス・ロスサントス"
-STAD="メイズバンク・アリーナ"
-STRAW="ストロベリー"
-TATAMO="タタヴィアム山地"
-TERMINA="ターミナル"
-TEXTI="テキスタイルシティ"
-TONGVAH="トングバ・ヒルズ"
-TONGVAV="トングバ・バレー"
-UTOPIAG="ユートピア・ガーデンズ"
-VCANA="ベスプッチ運河"
-VESP="ベスプッチ"
-VINE="バインウッド"
-WINDF="ロン・オルタネット・ウィンドファーム"
-WMIRROR="ウエスト・ミラー・ドライブ"
-WVINE="ウエスト・バインウッド"
-ZANCUDO="ザンクード川"
-ZENORA="セノーラ高速道路"
+[Global]
+AIRP="ロスサントス国際空港"
+ALAMO="アラモ海"
+ALTA="アルタ"
+ARMYB="フォート・ザンクード"
+BANNING="バニング"
+BAYTRE="ベイツリー・キャニオン"
+BEACH="ベスプッチ・ビーチ"
+BHAMCA="バンナムキャニオン"
+BRADP="ブラドック・パス"
+BRADT="ブラドック・トンネル"
+BSS_BSTR_131="リチャーズ・マジェスティック"
+BURTON="バートン"
+CALAFB="カラフィア橋"
+CANNY="ラトン・キャニオン"
+CCREAK="キャシディ・クリーク"
+CHAMH="チェンバーレイン・ヒルズ"
+CHIL="バインウッド・ヒルズ"
+CHU="チュマシュ"
+CMSW="チリアド山自然保護区"
+COSI="農園地帯"
+CYPRE="サイプレス・フラット"
+DAVIS="デイビス"
+DELBE="デル・ペロ・ビーチ"
+DELPE="デル・ペロ"
+DELSOL="ラ・プエルタ"
+DESRT="グランド・セノーラ砂漠"
+DOWNT="ダウンタウン"
+DTVINE="ダウンタウン・バインウッド"
+EAST_V="イースト・バインウッド"
+EBURO="エル・ブロ・ハイツ"
+ECLIPS="イクリプス"
+ELGORL="エル・ゴルド灯台"
+ELSANT="イースト・ロスサントス"
+ELYSIAN="エリシアン島"
+GALFISH="ガリラヤ"
+GALLI="ガリレオ・パーク"
+GOLF="GWC&ゴルフ協会"
+GRAPES="グレイプシード"
+GREATC="グレート・チャパレル"
+HARMO="ハーモニー"
+HAWICK="ハウィック"
+HEART="ハートアタック・ビーチ"
+HORS="バインウッド・レーストラック"
+HUD_MG_TRI_ALA="アラモ海"
+HUD_MG_TRI_VES="ベスプッチ"
+HUMLAB="ヒューメイン研究所"
+JAIL="ボーリングブローク刑務所"
+KOREAT="リトル・ソウル"
+LACT="ランド・アクト貯水池"
+LAGO="ラゴ・ザンクード"
+LDAM="ランド・アクト・ダム"
+LMESA="ラ・メサ"
+LOSPFY="ラ・プエルタ高速道路"
+LOSPUER="ラ・プエルタ"
+LOSSF="ロスサントス高速道路"
+MGCR_1="サウス・ロスサントス"
+MGCR_6="ベスプッチ運河"
+MGSR_3="ラトン・キャニオン"
+MIRR="ミラー・パーク"
+MORN="モーニングウッド"
+MOVIE="リチャーズ・マジェスティック"
+MTCHIL="チリアド山"
+MTGORDO="ゴルド山"
+MTJOSE="ジョサイア山"
+MURRI="ムリエタ・ハイツ"
+NCHU="北チュマシュ"
+OBSERV="ガリレオ観測所"
+OCEANA="太平洋"
+PALCOV="パレト・コーブ"
+PALETO="パレト・ベイ"
+PALFOR="パレト・フォレスト"
+PALHIGH="パロミノ高地"
+PALMPOW="パーマー・テイラー発電所"
+PBLUFF="パシフィック・ブラフス"
+PBOX="ピルボックス・ヒル"
+PROCOB="プロコピオ・ビーチ"
+PROL="ノース・ヤンクトン"
+RANCHO="ランチョ"
+RGLEN="リッチマン・グレン"
+RICHM="リッチマン"
+ROCKF="ロックフォード・ヒルズ"
+RTRAK="レッドウッド・ライト・トラック"
+SANAND="サンアンドレアス"
+SANCHIA="サン・チアンスキー山脈"
+SANDY="サンディ海岸"
+SENORA="セノーラ高速道路"
+SKID="ミッション・ロウ"
+SLAB="スタブシティ"
+SLSANT="サウス・ロスサントス"
+STAD="メイズバンク・アリーナ"
+STRAW="ストロベリー"
+TATAMO="タタヴィアム山地"
+TERMINA="ターミナル"
+TEXTI="テキスタイルシティ"
+TONGVAH="トングバ・ヒルズ"
+TONGVAV="トングバ・バレー"
+UTOPIAG="ユートピア・ガーデンズ"
+VCANA="ベスプッチ運河"
+VESP="ベスプッチ"
+VINE="バインウッド"
+WINDF="ロン・オルタネット・ウィンドファーム"
+WMIRROR="ウエスト・ミラー・ドライブ"
+WVINE="ウエスト・バインウッド"
+ZANCUDO="ザンクード川"
+ZENORA="セノーラ高速道路"
diff --git a/res/global.zh.ini b/res/global.zh.ini
index 3990a2f..35564bd 100644
--- a/res/global.zh.ini
+++ b/res/global.zh.ini
@@ -1,104 +1,104 @@
-[Global]
-AIRP="洛聖都國際機場"
-ALAMO="阿拉莫海"
-ALTA="艾爾塔"
-ARMYB="桑庫多堡壘"
-BANNING="班寧"
-BAYTRE="貝特里峽谷"
-BEACH="威斯普奇海灘"
-BHAMCA="班漢峽谷"
-BRADP="布萊杜要道"
-BRADT="布萊杜隧道"
-BURTON="巴頓"
-CALAFB="卡拉非橋"
-CANNY="雷通峽谷"
-CCREAK="加斯迪小溪"
-CHAMH="張伯倫山"
-CHIL="好麥塢山"
-CHU="丘瑪墟"
-CMSW="奇力耶德山國家生態保護區"
-CYPRE="扁柏平地"
-DAVIS="戴維斯"
-DELBE="佩羅海灘"
-DELPE="佩羅"
-DELSOL="洛波塔"
-DESRT="塞諾拉大沙漠"
-DOWNT="市中心"
-DTVINE="好麥塢市中心"
-EAST_V="東好麥塢"
-EBURO="布羅高地"
-ECLIPS="日蝕"
-ELGORL="戈多燈塔"
-ELSANT="東洛聖都"
-ELYSIAN="安樂島"
-GALFISH="加利利"
-GALLI="伽利略公園"
-GOLF="西部鄉村高爾夫俱樂部"
-GRAPES="葡萄籽"
-GREATC="大叢林"
-HARMO="和美尼"
-HAWICK="霍伊克"
-HEART="驚心海灘"
-HORS="好麥塢賽馬場"
-HUD_MG_TRI_ALA="阿拉莫海"
-HUD_MG_TRI_VES="威斯普奇"
-HUMLAB="人道研究實驗室"
-JAIL="博林布魯克監獄"
-KOREAT="小首爾"
-LACT="蘭艾水庫"
-LAGO="桑庫多沼地"
-LDAM="蘭艾水壩"
-LMESA="梅薩"
-LOSPFY="洛波塔高速公路"
-LOSPUER="洛波塔"
-LOSSF="洛聖都高速公路"
-MGCR_1="南洛聖都"
-MGCR_6="威斯普奇運河"
-MGSR_3="雷通峽谷"
-MIRR="米羅公園"
-MORN="摩寧塢"
-MOVIE="李察尊爵"
-MTCHIL="奇力耶德山"
-MTGORDO="戈多山"
-MTJOSE="尤夏山"
-MURRI="穆瑞塔高地"
-NCHU="北丘瑪墟"
-OBSERV="伽利略天文台"
-OCEANA="太平洋"
-PALCOV="佩立托小海灣"
-PALETO="佩立托灣"
-PALFOR="佩立托森林"
-PALHIGH="巴洛米諾高地"
-PALMPOW="帕莫泰勒發電站"
-PBLUFF="太平崖"
-PBOX="圓帽山"
-PROCOB="普羅科皮奧海灘"
-PROL="北揚克頓"
-RANCHO="藍丘"
-RGLEN="利金漫幽谷"
-RICHM="利金漫"
-ROCKF="羅克福德山"
-RTRAK="紅木賽道"
-SANAND="聖安地列斯"
-SANCHIA="聖強斯基山脈"
-SANDY="沙灘海岸"
-SENORA="塞諾拉高速公路"
-SKID="密申羅"
-SLAB="背刺城"
-SLSANT="南洛聖都"
-STAD="花園銀行體育場"
-STRAW="斯卓貝利"
-TATAMO="塔塔維昂山"
-TERMINA="碼頭"
-TEXTI="紡織城"
-TONGVAH="通瓦山"
-TONGVAV="通瓦谷地"
-UTOPIAG="烏托邦花園"
-VCANA="威斯普奇運河"
-VESP="威斯普奇"
-VINE="好麥塢"
-WINDF="朗恩.艾特梅茲風車農場"
-WMIRROR="米羅車道西段"
-WVINE="西好麥塢"
-ZANCUDO="桑庫多河"
-ZENORA="塞諾拉高速公路"
+[Global]
+AIRP="洛聖都國際機場"
+ALAMO="阿拉莫海"
+ALTA="艾爾塔"
+ARMYB="桑庫多堡壘"
+BANNING="班寧"
+BAYTRE="貝特里峽谷"
+BEACH="威斯普奇海灘"
+BHAMCA="班漢峽谷"
+BRADP="布萊杜要道"
+BRADT="布萊杜隧道"
+BURTON="巴頓"
+CALAFB="卡拉非橋"
+CANNY="雷通峽谷"
+CCREAK="加斯迪小溪"
+CHAMH="張伯倫山"
+CHIL="好麥塢山"
+CHU="丘瑪墟"
+CMSW="奇力耶德山國家生態保護區"
+CYPRE="扁柏平地"
+DAVIS="戴維斯"
+DELBE="佩羅海灘"
+DELPE="佩羅"
+DELSOL="洛波塔"
+DESRT="塞諾拉大沙漠"
+DOWNT="市中心"
+DTVINE="好麥塢市中心"
+EAST_V="東好麥塢"
+EBURO="布羅高地"
+ECLIPS="日蝕"
+ELGORL="戈多燈塔"
+ELSANT="東洛聖都"
+ELYSIAN="安樂島"
+GALFISH="加利利"
+GALLI="伽利略公園"
+GOLF="西部鄉村高爾夫俱樂部"
+GRAPES="葡萄籽"
+GREATC="大叢林"
+HARMO="和美尼"
+HAWICK="霍伊克"
+HEART="驚心海灘"
+HORS="好麥塢賽馬場"
+HUD_MG_TRI_ALA="阿拉莫海"
+HUD_MG_TRI_VES="威斯普奇"
+HUMLAB="人道研究實驗室"
+JAIL="博林布魯克監獄"
+KOREAT="小首爾"
+LACT="蘭艾水庫"
+LAGO="桑庫多沼地"
+LDAM="蘭艾水壩"
+LMESA="梅薩"
+LOSPFY="洛波塔高速公路"
+LOSPUER="洛波塔"
+LOSSF="洛聖都高速公路"
+MGCR_1="南洛聖都"
+MGCR_6="威斯普奇運河"
+MGSR_3="雷通峽谷"
+MIRR="米羅公園"
+MORN="摩寧塢"
+MOVIE="李察尊爵"
+MTCHIL="奇力耶德山"
+MTGORDO="戈多山"
+MTJOSE="尤夏山"
+MURRI="穆瑞塔高地"
+NCHU="北丘瑪墟"
+OBSERV="伽利略天文台"
+OCEANA="太平洋"
+PALCOV="佩立托小海灣"
+PALETO="佩立托灣"
+PALFOR="佩立托森林"
+PALHIGH="巴洛米諾高地"
+PALMPOW="帕莫泰勒發電站"
+PBLUFF="太平崖"
+PBOX="圓帽山"
+PROCOB="普羅科皮奧海灘"
+PROL="北揚克頓"
+RANCHO="藍丘"
+RGLEN="利金漫幽谷"
+RICHM="利金漫"
+ROCKF="羅克福德山"
+RTRAK="紅木賽道"
+SANAND="聖安地列斯"
+SANCHIA="聖強斯基山脈"
+SANDY="沙灘海岸"
+SENORA="塞諾拉高速公路"
+SKID="密申羅"
+SLAB="背刺城"
+SLSANT="南洛聖都"
+STAD="花園銀行體育場"
+STRAW="斯卓貝利"
+TATAMO="塔塔維昂山"
+TERMINA="碼頭"
+TEXTI="紡織城"
+TONGVAH="通瓦山"
+TONGVAV="通瓦谷地"
+UTOPIAG="烏托邦花園"
+VCANA="威斯普奇運河"
+VESP="威斯普奇"
+VINE="好麥塢"
+WINDF="朗恩.艾特梅茲風車農場"
+WMIRROR="米羅車道西段"
+WVINE="西好麥塢"
+ZANCUDO="桑庫多河"
+ZENORA="塞諾拉高速公路"
diff --git a/res/gta5sync_de.qm b/res/gta5sync_de.qm
index 0890c94..8b620e2 100755
Binary files a/res/gta5sync_de.qm and b/res/gta5sync_de.qm differ
diff --git a/res/gta5sync_de.ts b/res/gta5sync_de.ts
index ec70f48..6fcde10 100755
--- a/res/gta5sync_de.ts
+++ b/res/gta5sync_de.ts
@@ -147,51 +147,63 @@ Copyright &amp;copy; &lt;a href=&quot;%5&quot;&gt;%6&lt;/a&gt; %7&lt;br/&gt;%8 i
         <translation type="obsolete">&lt;span style=&quot; font-weight:600;&quot;&gt;gta5sync&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Ein Projekt zum ansehen und synchronisieren von Grand Theft Auto 5 Snapmatic Bilder und Spielständen&lt;br/&gt;&lt;br/&gt;Projektversion: %1&lt;br/&gt;Gebaut mit Qt %2&lt;br/&gt;Läuft auf Qt %3&lt;br/&gt;&lt;br/&gt;Copyright &amp;copy; &lt;a href=&quot;https://github.com/Syping/&quot;&gt;Syping&lt;/a&gt; 2016&lt;br/&gt;gta5sync is lizenziert unter &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
     <message>
+        <location filename="../AboutDialog.cpp" line="41"/>
         <source>Using %1 %2</source>
+        <extracomment>Using specific library, example Using libmyfuck</extracomment>
+        <translation>Verwendet %1 %2</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="43"/>
+        <source>Translated by %1</source>
+        <extracomment>Translated by translator, example Translated by Syping</extracomment>
+        <translation>Übersetzt von %1</translation>
+    </message>
+    <message>
+        <source>Using %1 %2</source>
+        <comment>Exp. Using libmyfuck</comment>
         <translation type="vanished">Verwendet %1 %2</translation>
     </message>
     <message>
         <source>Translated by %1</source>
+        <comment>Exp. Translated by Syping</comment>
         <translation type="vanished">Übersetzt von %1</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="40"/>
-        <source>Using %1 %2</source>
-        <comment>Exp. Using libmyfuck</comment>
-        <translation>Verwendet %1 %2</translation>
-    </message>
-    <message>
-        <location filename="../AboutDialog.cpp" line="41"/>
-        <source>Translated by %1</source>
-        <comment>Exp. Translated by Syping</comment>
-        <translation>Übersetzt von %1</translation>
-    </message>
-    <message>
-        <location filename="../AboutDialog.cpp" line="42"/>
         <source>NAME_OF_TRANSLATOR</source>
         <comment>Your Name (The person behind your screen looking at this text!)</comment>
+        <translation type="vanished">Syping</translation>
+    </message>
+    <message>
+        <source>TRANSLATOR_PROFILE</source>
+        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <translation type="vanished">https://github.com/Syping/</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="45"/>
+        <source>NAME_OF_TRANSLATOR</source>
+        <extracomment>Enter your name there</extracomment>
         <translation>Syping</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="43"/>
+        <location filename="../AboutDialog.cpp" line="47"/>
         <source>TRANSLATOR_PROFILE</source>
-        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <extracomment>Enter your proilfe there, example a GitHub profile, E-Mail with &quot;mailto: afucker@sumfuck.com&quot; or a webpage</extracomment>
         <translation>https://github.com/Syping/</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="64"/>
+        <location filename="../AboutDialog.cpp" line="80"/>
         <source>A project for viewing Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Ein Projekt zum ansehen von Grand Theft Auto V&lt;br/&gt;
 Snapmatic Bilder und Spielständen</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="68"/>
+        <location filename="../AboutDialog.cpp" line="84"/>
         <source>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</source>
         <translation>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="70"/>
+        <location filename="../AboutDialog.cpp" line="86"/>
         <source>%1 is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</source>
         <translation>%1 ist lizenziert unter &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
@@ -200,17 +212,47 @@ Snapmatic Bilder und Spielständen</translation>
         <translation type="vanished">Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3&lt;br/&gt;%4 ist lizenziert unter &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="62"/>
+        <location filename="../AboutDialog.cpp" line="78"/>
         <source>A project for viewing and sync Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Ein Projekt zum ansehen und synchronisieren von&lt;br/&gt;
 Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
     </message>
+    <message>
+        <location filename="../config.h" line="62"/>
+        <source>Release</source>
+        <translation>Release</translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="68"/>
+        <source>Release Candidate</source>
+        <translation>Release Candidate</translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="74"/>
+        <source>Daily Build</source>
+        <translation>Daily Build</translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="80"/>
+        <source>Developer</source>
+        <translation>Entwickler</translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="86"/>
+        <source>Beta</source>
+        <translation>Beta</translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="92"/>
+        <source>Alpha</source>
+        <translation>Alpha</translation>
+    </message>
 </context>
 <context>
     <name>CrewDatabase</name>
     <message>
-        <location filename="../CrewDatabase.cpp" line="64"/>
+        <location filename="../CrewDatabase.cpp" line="102"/>
         <source>No Crew</source>
         <translation>Keine Crew</translation>
     </message>
@@ -305,30 +347,110 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
         <translation>Einstellungen</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="96"/>
         <source>&amp;Keep Aspect Ratio</source>
-        <translation>Seitenverhältnis &amp;behalten</translation>
+        <translation type="vanished">Seitenverhältnis &amp;behalten</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="103"/>
         <source>&amp;Ignore Aspect Ratio</source>
-        <translation>Seitenverhältnis &amp;ignorieren</translation>
+        <translation type="vanished">Seitenverhältnis &amp;ignorieren</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="110"/>
         <source>&amp;Avatar</source>
-        <translation>&amp;Avatar</translation>
+        <translation type="vanished">&amp;Avatar</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="154"/>
+        <source>Keep Aspect Ratio</source>
+        <translation type="vanished">Seitenverhältnis behalten</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="148"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation>Seitenverhältnis ignorieren</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="135"/>
+        <source>Avatar</source>
+        <translation>Avatar</translation>
+    </message>
+    <message>
+        <source>Background Colour: &lt;span style=&quot;color:rgb(%1,%2,%3)&quot;&gt;%4&lt;/span&gt;</source>
+        <translation type="vanished">Hintergrundfarbe: &lt;span style=&quot;color:rgb(%1,%2,%3)&quot;&gt;%4&lt;/span&gt;</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="98"/>
+        <location filename="../ImportDialog.cpp" line="57"/>
+        <location filename="../ImportDialog.cpp" line="216"/>
+        <source>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</source>
+        <translation>Hintergrundfarbe: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="105"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="194"/>
+        <source>Import picture</source>
+        <translation>Bild importieren</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="197"/>
         <source>&amp;OK</source>
         <translation>&amp;OK</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="167"/>
+        <location filename="../ImportDialog.ui" line="210"/>
+        <source>Discard picture</source>
+        <translation>Bild verwerfen</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="213"/>
         <source>&amp;Cancel</source>
         <translation>Abbre&amp;chen</translation>
     </message>
+    <message>
+        <source>Select Colour</source>
+        <translation type="vanished">Farbe auswählen</translation>
+    </message>
+    <message>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you plan to use it as Avatar the picture will be cut!</source>
+        <translation type="vanished">Bist du sicher ein Quadrat Bild außerhalb der Avatar Zone zu verwenden?
+Wenn du planst es als Avatar zu verwenden das Bild wird abgetrennt!</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you want to use it as Avatar the image will be detached!</source>
+        <translation>Bist du sicher ein Quadrat Bild außerhalb der Avatar Zone zu verwenden?
+Wenn du es als Avatar verwenden möchtest wird es abgetrennt!</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Snapmatic Avatar Zone</source>
+        <translation>Snapmatic Avatar Zone</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="212"/>
+        <source>Select Colour...</source>
+        <translation>Farbe auswählen...</translation>
+    </message>
+</context>
+<context>
+    <name>MapPreviewDialog</name>
+    <message>
+        <source>Map Preview</source>
+        <translation type="vanished">Map Vorschau</translation>
+    </message>
+    <message>
+        <source>Snapmatic Coordinate Viewer</source>
+        <translation type="vanished">Snapmatic Koordinatenansicht</translation>
+    </message>
+    <message>
+        <location filename="../MapPreviewDialog.ui" line="26"/>
+        <source>Snapmatic Map Viewer</source>
+        <translation>Snapmatic Kartenansicht</translation>
+    </message>
 </context>
 <context>
     <name>OptionsDialog</name>
@@ -509,12 +631,22 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
     </message>
     <message>
         <location filename="../OptionsDialog.ui" line="463"/>
+        <source>Apply changes</source>
+        <translation>Änderungen übernehmen</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="466"/>
         <source>&amp;OK</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>&amp;OK</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.ui" line="476"/>
+        <location filename="../OptionsDialog.ui" line="479"/>
+        <source>Discard changes</source>
+        <translation>Änderungen verwerfen</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="482"/>
         <source>&amp;Cancel</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>Abbre&amp;chen</translation>
@@ -525,48 +657,60 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
         <translation type="obsolete">%1 (%2 wenn verfügbar) [sys]</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
         <source>System</source>
         <comment>System like PC System</comment>
-        <translation>System</translation>
+        <translation type="vanished">System</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
         <source>%1 (%2 if available)</source>
         <comment>System like PC System = %1, System Language like Deutsch = %2</comment>
-        <translation>%1 (%2 wenn verfügbar)</translation>
+        <translation type="vanished">%1 (%2 wenn verfügbar)</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
-        <location filename="../OptionsDialog.cpp" line="296"/>
+        <location filename="../OptionsDialog.cpp" line="289"/>
         <source>%1</source>
         <comment>%1</comment>
         <translation>%1</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
         <source>The new Custom Folder will initialize after you restart %1.</source>
-        <translation>Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast.</translation>
+        <translation type="vanished">Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast.</translation>
     </message>
     <message>
         <source>The new Custom Folder initialize after you restart %1.</source>
         <translation type="vanished">Der eigene Ordner initialisiert sobald du %1 neugestartet hast.</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="296"/>
-        <source>The language change will take effect after you restart %1.</source>
-        <translation>Die Änderung der Sprache nimmt Effekt sobald du %1 neugestartet hast.</translation>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>%1 (Next Closest Language)</source>
+        <comment>First language a person can talk with a different person/application. &quot;Native&quot; or &quot;Not Native&quot;.</comment>
+        <translation>%1 (Erste näheste Sprache)</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="306"/>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>System</source>
+        <comment>System in context of System default</comment>
+        <translation>System</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>The new Custom Folder will initialise after you restart %1.</source>
+        <translation>Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast.</translation>
+    </message>
+    <message>
+        <source>The language change will take effect after you restart %1.</source>
+        <translation type="vanished">Die Änderung der Sprache nimmt Effekt sobald du %1 neugestartet hast.</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="299"/>
         <source>No Profile</source>
         <comment>No Profile, as default</comment>
         <translation>Kein Profil</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="314"/>
-        <location filename="../OptionsDialog.cpp" line="318"/>
-        <location filename="../OptionsDialog.cpp" line="320"/>
+        <location filename="../OptionsDialog.cpp" line="307"/>
+        <location filename="../OptionsDialog.cpp" line="311"/>
+        <location filename="../OptionsDialog.cpp" line="313"/>
         <source>Profile: %1</source>
         <translation>Profil: %1</translation>
     </message>
@@ -603,7 +747,7 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
 &lt;span style=&quot; font-weight:600;&quot;&gt;Erstellt: &lt;/span&gt;%8</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="104"/>
+        <location filename="../PictureDialog.ui" line="117"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
@@ -614,14 +758,28 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
 &lt;span style=&quot; font-weight:600;&quot;&gt;Erstellt: &lt;/span&gt;%8</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="167"/>
         <source>&amp;Export</source>
-        <translation>&amp;Exportieren</translation>
+        <translation type="vanished">&amp;Exportieren</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="189"/>
+        <location filename="../PictureDialog.ui" line="177"/>
+        <source>Manage picture</source>
+        <translation>Bild verwalten</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="180"/>
+        <source>&amp;Manage</source>
+        <translation>&amp;Verwalten</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="199"/>
+        <source>Close viewer</source>
+        <translation>Ansicht schließen</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="202"/>
         <source>&amp;Close</source>
-        <translation>&amp;Schließen</translation>
+        <translation>S&amp;chließen</translation>
     </message>
     <message>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%1, %2, %3 &lt;br&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4&lt;br&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Crew ID: &lt;/span&gt;%5</source>
@@ -648,8 +806,8 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
 &lt;span style=&quot; font-weight:600;&quot;&gt;Crew ID: &lt;/span&gt;%5</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="89"/>
-        <location filename="../PictureExport.cpp" line="221"/>
+        <location filename="../PictureExport.cpp" line="91"/>
+        <location filename="../PictureExport.cpp" line="223"/>
         <source>Export</source>
         <translation>Exportieren</translation>
     </message>
@@ -658,22 +816,52 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen</translation>
         <translation type="obsolete">Kopieren</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="186"/>
         <source>Close</source>
-        <translation>Schließen</translation>
+        <translation type="vanished">Schließen</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="141"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Exportiere als &amp;JPG Bild...</translation>
+        <translation type="vanished">Exportiere als &amp;JPG Bild...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="145"/>
+        <source>Export as &amp;Picture...</source>
+        <translation>Exportiere als &amp;Bild...</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="142"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Exportiere als &amp;GTA Snapmatic...</translation>
+        <translation type="vanished">Exportiere als &amp;GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="358"/>
+        <location filename="../PictureDialog.cpp" line="146"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation>Exportiere als &amp;Snapmatic...</translation>
+    </message>
+    <message>
+        <source>Edi&amp;t</source>
+        <translation type="vanished">Bearbei&amp;ten</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="148"/>
+        <source>Open &amp;Map View...</source>
+        <translation>&amp;Kartenansicht öffnen...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="150"/>
+        <source>&amp;Edit Properties...</source>
+        <translation>Eigenschaften bearb&amp;eiten...</translation>
+    </message>
+    <message>
+        <source>&amp;Other</source>
+        <translation type="vanished">&amp;Andere</translation>
+    </message>
+    <message>
+        <source>&amp;Advanced</source>
+        <comment>Advanced for more options</comment>
+        <translation type="vanished">Erweitert (&amp;A)</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="373"/>
         <source>Key 1 - Avatar Preview Mode
 Key 2 - Toggle Overlay
 Arrow Keys - Navigate</source>
@@ -682,19 +870,31 @@ Taste 2 - Overlay umschalten
 Pfeiltasten - Navigieren</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Snapmatic Picture Viewer</source>
         <translation>Snapmatic Bildansicht</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Failed at %1</source>
         <translation>Fehlgeschlagen bei %1</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="572"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="589"/>
+        <source>No Crew</source>
+        <translation>Keine Crew</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="614"/>
+        <source>No Players</source>
+        <translation>Keine Spieler</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="560"/>
         <source>Avatar Preview Mode
 Press 1 for Default View</source>
         <translation>Avatar Vorschaumodus
@@ -731,19 +931,15 @@ Drücke A für Standardansicht</translation>
         <translation type="vanished">Avatar Vorschaumodus&lt;br&gt;Drücke A für Standardansicht</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="478"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No player</source>
-        <translation>Keine Spieler</translation>
+        <translation type="vanished">Keine Spieler</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="481"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No crew</source>
-        <translation>Keine Crew</translation>
+        <translation type="vanished">Keine Crew</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="488"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
         <source>Unknown Location</source>
         <translation>Unbekannter Standort</translation>
     </message>
@@ -752,59 +948,80 @@ Drücke A für Standardansicht</translation>
         <translation type="obsolete">Exportiere Bild...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="88"/>
         <source>Export as JPG picture...</source>
-        <translation>Exportiere als JPG Bild...</translation>
+        <translation type="vanished">Exportiere als JPG Bild...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="92"/>
         <source>JPEG picture (*.jpg)</source>
-        <translation>JPEG Bild (*.jpg)</translation>
+        <translation type="vanished">JPEG Bild (*.jpg)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="93"/>
+        <location filename="../PictureExport.cpp" line="95"/>
         <source>Portable Network Graphics (*.png)</source>
         <translation>Portable Network Graphics (*.png)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="187"/>
         <source>Export as JPG picture</source>
-        <translation>Exportiere als JPG Bild</translation>
+        <translation type="vanished">Exportiere als JPG Bild</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="246"/>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="260"/>
         <source>Overwrite %1 with current Snapmatic picture?</source>
         <translation>Überschreibe %1 mit aktuellen Snapmatic Bild?</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="246"/>
-        <location filename="../PictureExport.cpp" line="250"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
-        <location filename="../PictureExport.cpp" line="291"/>
-        <location filename="../PictureExport.cpp" line="297"/>
         <source>Export as GTA Snapmatic</source>
-        <translation>Exportiere als GTA Snapmatic</translation>
+        <translation type="vanished">Exportiere als GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="250"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="264"/>
         <source>Failed to overwrite %1 with current Snapmatic picture</source>
         <translation>Fehlgeschlagen beim Überschreiben von %1 mit aktuellen Snapmatic Bild</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
+        <location filename="../PictureExport.cpp" line="90"/>
+        <source>Export as Picture...</source>
+        <translation>Exportiere als Bild...</translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="94"/>
+        <source>JPEG Graphics (*.jpg *.jpeg)</source>
+        <translation>JPEG Graphics (*.jpg *.jpeg)</translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <source>Export as Picture</source>
+        <translation>Exportiere als Bild</translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
         <source>Failed to export current Snapmatic picture</source>
         <translation>Fehlgeschlagen beim Exportieren vom aktuellen Snapmatic Bild</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="291"/>
+        <location filename="../PictureExport.cpp" line="222"/>
+        <source>Export as Snapmatic...</source>
+        <translation>Exportiere als Snapmatic...</translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>Export as Snapmatic</source>
+        <translation>Export as Snapmatic</translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="293"/>
         <source>Exported Snapmatic to &quot;%1&quot; because of using the .auto extension.</source>
         <translation>Snapmatic wurde wegen Benutzung der .auto Erweiterung zu &quot;%1&quot; exportiert.</translation>
     </message>
@@ -821,22 +1038,21 @@ Drücke A für Standardansicht</translation>
         <translation type="obsolete">Exporti</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="220"/>
         <source>Export as GTA Snapmatic...</source>
-        <translation>Exportiere als GTA Snapmatic...</translation>
+        <translation type="vanished">Exportiere als GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="224"/>
+        <location filename="../PictureExport.cpp" line="226"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="225"/>
+        <location filename="../PictureExport.cpp" line="227"/>
         <source>GTA V Raw Export (*.auto)</source>
         <translation>GTA V Roher Export (*.auto)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="226"/>
+        <location filename="../PictureExport.cpp" line="228"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Snapmatic Bilder (PGTA*)</translation>
     </message>
@@ -857,9 +1073,8 @@ Drücke A für Standardansicht</translation>
         <translation type="obsolete">JPEG Bild (*.jpg);;Portable Network Graphics (*.png)</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="164"/>
         <source>Export picture</source>
-        <translation>Bild exportieren</translation>
+        <translation type="vanished">Bild exportieren</translation>
     </message>
     <message>
         <source>Snapmatic Picture Exporter</source>
@@ -870,8 +1085,8 @@ Drücke A für Standardansicht</translation>
         <translation type="obsolete">Beim Speichern des Bildes ist ein Fehler aufgetreten</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="187"/>
-        <location filename="../PictureExport.cpp" line="297"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <location filename="../PictureExport.cpp" line="299"/>
         <source>No valid file is selected</source>
         <translation>Keine gültige Datei wurde ausgewählt</translation>
     </message>
@@ -890,27 +1105,31 @@ Drücke A für Standardansicht</translation>
         <translation>Lade Datei %1 von %2 Dateien</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="169"/>
+        <location filename="../ProfileInterface.ui" line="172"/>
         <source>%1 %2</source>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="195"/>
-        <source>Import exported file</source>
-        <translation>Importiere exportierte Datei</translation>
+        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import file</source>
+        <translation>Importiere Datei</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import exported file</source>
+        <translation type="vanished">Importiere exportierte Datei</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="201"/>
         <source>&amp;Import...</source>
         <translation>&amp;Importieren...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="214"/>
+        <location filename="../ProfileInterface.ui" line="217"/>
         <source>Close profile</source>
         <translation>Profil schließen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="217"/>
+        <location filename="../ProfileInterface.ui" line="220"/>
         <source>&amp;Close</source>
         <translation>S&amp;chließen</translation>
     </message>
@@ -931,29 +1150,30 @@ Drücke A für Standardansicht</translation>
         <translation type="obsolete">Profil schließen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="114"/>
+        <location filename="../ProfileInterface.cpp" line="129"/>
         <source>Loading...</source>
         <translation>Lade...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="390"/>
-        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="426"/>
+        <location filename="../ProfileInterface.cpp" line="491"/>
         <source>Import...</source>
         <translation>Importieren...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="391"/>
-        <location filename="../ProfileInterface.cpp" line="481"/>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../ProfileInterface.cpp" line="679"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../ProfileInterface.cpp" line="702"/>
-        <location filename="../ProfileInterface.cpp" line="707"/>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
         <location filename="../ProfileInterface.cpp" line="755"/>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Import</source>
         <translation>Importieren</translation>
     </message>
@@ -962,41 +1182,49 @@ Drücke A für Standardansicht</translation>
         <translation type="vanished">Alle Profildateien (SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="394"/>
         <source>Importable files (*.g5e *.jpg *.png SGTA* PGTA*)</source>
-        <translation>Importfähige Dateien (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
+        <translation type="vanished">Importfähige Dateien (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="396"/>
-        <location filename="../UserInterface.cpp" line="351"/>
+        <location filename="../ProfileInterface.cpp" line="444"/>
+        <location filename="../UserInterface.cpp" line="365"/>
         <source>Savegames files (SGTA*)</source>
         <translation>Spielstanddateien (SGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="397"/>
-        <location filename="../UserInterface.cpp" line="352"/>
+        <location filename="../ProfileInterface.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="366"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Snapmatic Bilder (PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="398"/>
         <source>All image files (*.jpg *.png)</source>
-        <translation>Alle Bilddateien (*.jpg *.png)</translation>
+        <translation type="vanished">Alle Bilddateien (*.jpg *.png)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="399"/>
-        <location filename="../UserInterface.cpp" line="353"/>
+        <location filename="../ProfileInterface.cpp" line="442"/>
+        <source>Importable files (%1)</source>
+        <translation>Importfähige Dateien (%1)</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="446"/>
+        <source>All image files (%1)</source>
+        <translation>Alle Bilddateien (%1)</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="447"/>
+        <location filename="../UserInterface.cpp" line="367"/>
         <source>All files (**)</source>
         <translation>Alle Dateien (**)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="428"/>
-        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../ProfileInterface.cpp" line="492"/>
+        <location filename="../ProfileInterface.cpp" line="507"/>
         <source>Import file %1 of %2 files</source>
         <translation>Importiere Datei %1 von %2 Dateien</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="481"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
         <source>Import failed with...
 
 %1</source>
@@ -1005,46 +1233,60 @@ Drücke A für Standardansicht</translation>
 %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../UserInterface.cpp" line="393"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../UserInterface.cpp" line="407"/>
         <source>Failed to read Snapmatic picture</source>
         <translation>Fehler beim Lesen vom Snapmatic Bild</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../UserInterface.cpp" line="409"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../UserInterface.cpp" line="423"/>
         <source>Failed to read Savegame file</source>
         <translation>Fehler beim Lesen von Spielstanddatei</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="679"/>
-        <source>Can&apos;t import %1 because of not valid file format</source>
-        <translation>Kann %1 nicht importieren weil das Dateiformat nicht gültig ist</translation>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <source>Can&apos;t import %1 because file can&apos;t be parsed properly</source>
+        <translation>Kann %1 nicht importieren weil die Datei nicht richtig gelesen werden kann</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="702"/>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <source>Can&apos;t import %1 because file format can&apos;t be detected</source>
+        <translation>Kann %1 nicht importieren weil das Dateiformat nicht erkannt werden kann</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="984"/>
+        <source>Initialising export...</source>
+        <translation>Initialisiere Export...</translation>
+    </message>
+    <message>
+        <source>Can&apos;t import %1 because of not valid file format</source>
+        <translation type="vanished">Kann %1 nicht importieren weil das Dateiformat nicht gültig ist</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="778"/>
         <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source>
         <translation>Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA oder endet mit .g5e</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="707"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
         <source>Failed to import the Snapmatic picture, the picture is already in the game</source>
         <translation>Fehlgeschlagen beim Importieren vom Snapmatic Bild, dieses Bild ist bereits im Spiel</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="862"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
         <source>%1Export Snapmatic pictures%2&lt;br&gt;&lt;br&gt;JPG pictures make it possible to open the picture with a Image Viewer&lt;br&gt;GTA Snapmatic make it possible to import the picture into the game&lt;br&gt;&lt;br&gt;Export as:</source>
         <translation>%1Exportiere Snapmatic Bilder%2&lt;br&gt;&lt;br&gt;JPG Bilder machen es möglich sie mit ein Bildansicht Programm zu öffnen&lt;br&gt;Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren&lt;br&gt;&lt;br&gt;Exportieren als:</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>No valid file is selected</source>
         <translation>Keine gültige Datei wurde ausgewählt</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="62"/>
+        <location filename="../ProfileInterface.cpp" line="65"/>
         <source>Enabled pictures: %1 of %2</source>
         <translation>Aktivierte Bilder: %1 von %2</translation>
     </message>
@@ -1053,35 +1295,35 @@ Drücke A für Standardansicht</translation>
         <translation type="vanished">Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
         <source>Failed to import the Snapmatic picture, can&apos;t copy the file into profile</source>
-        <translation>Fehlgeschlagen beim Importieren vom Snapmatic Bild, kann Snapmatic Bild nicht ins Profil kopieren </translation>
+        <translation>Fehlgeschlagen beim Importieren vom Snapmatic Bild, kann Snapmatic Bild nicht ins Profil kopieren</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="755"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
         <source>Failed to import the Savegame, can&apos;t copy the file into profile</source>
         <translation>Fehlgeschlagen beim Importieren vom Spielstand, kann Spielstanddatei nicht ins Profil kopieren</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Failed to import the Savegame, no Savegame slot is left</source>
         <translation>Fehlgeschlagen beim Importieren vom Spielstand, kein Spielstandslot mehr frei</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="847"/>
-        <location filename="../ProfileInterface.cpp" line="865"/>
+        <location filename="../ProfileInterface.cpp" line="923"/>
+        <location filename="../ProfileInterface.cpp" line="941"/>
         <source>JPG pictures and GTA Snapmatic</source>
         <translation>JPG Bilder und GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="848"/>
-        <location filename="../ProfileInterface.cpp" line="870"/>
+        <location filename="../ProfileInterface.cpp" line="924"/>
+        <location filename="../ProfileInterface.cpp" line="946"/>
         <source>JPG pictures only</source>
         <translation>Nur JPG Bilder</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="849"/>
-        <location filename="../ProfileInterface.cpp" line="874"/>
+        <location filename="../ProfileInterface.cpp" line="925"/>
+        <location filename="../ProfileInterface.cpp" line="950"/>
         <source>GTA Snapmatic only</source>
         <translation>Nur GTA Snapmatic</translation>
     </message>
@@ -1100,25 +1342,25 @@ Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren
 Exportieren als:</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="959"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>No Snapmatic pictures or Savegames files are selected</source>
         <translation>Keine Snapmatic Bilder oder Spielstände ausgewählt</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
-        <location filename="../ProfileInterface.cpp" line="995"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>Remove selected</source>
         <translation>Auswahl löschen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
         <source>You really want remove the selected Snapmatic picutres and Savegame files?</source>
         <translation>Möchtest du wirklich die ausgewählten Snapmatic Bilder und Spielstanddateien löschen?</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="995"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
         <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source>
         <translation>Fehlgeschlagen beim kompletten entfernen der ausgewählten Snapmatic Bilder und/oder der Spielstanddateien</translation>
     </message>
@@ -1139,10 +1381,10 @@ Exportieren als:</translation>
         <translation type="obsolete">Fehlgeschlagenen beim Import vom Spielstand weil kein Spielstandslot mehr übrig ist</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="824"/>
-        <location filename="../ProfileInterface.cpp" line="862"/>
-        <location filename="../ProfileInterface.cpp" line="939"/>
-        <location filename="../ProfileInterface.cpp" line="959"/>
+        <location filename="../ProfileInterface.cpp" line="900"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
         <source>Export selected</source>
         <translation>Auswahl exportieren</translation>
     </message>
@@ -1163,21 +1405,20 @@ Exportieren als:</translation>
         <translation type="obsolete">Wie sollen wir mit den Snapmatic Bilder umgehen?</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="905"/>
+        <location filename="../ProfileInterface.cpp" line="983"/>
         <source>Export selected...</source>
         <translation>Auswahl exportieren...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="906"/>
         <source>Initializing export...</source>
-        <translation>Initialisiere Export...</translation>
+        <translation type="vanished">Initialisiere Export...</translation>
     </message>
     <message>
         <source>Initializing...</source>
         <translation type="obsolete">Initialisierung...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="939"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
         <source>Export failed with...
 
 %1</source>
@@ -1200,20 +1441,20 @@ Exportieren als:</translation>
         <translation type="obsolete">Aktueller Exportiervorgang: %1</translation>
     </message>
     <message>
-        <location filename="../ExportThread.cpp" line="96"/>
-        <location filename="../ExportThread.cpp" line="135"/>
-        <location filename="../ExportThread.cpp" line="156"/>
+        <location filename="../ExportThread.cpp" line="97"/>
+        <location filename="../ExportThread.cpp" line="136"/>
+        <location filename="../ExportThread.cpp" line="157"/>
         <source>Export file %1 of %2 files</source>
         <translation>Exportiere Datei %1 von %2 Dateien</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="349"/>
+        <location filename="../UserInterface.cpp" line="363"/>
         <source>All profile files (*.g5e SGTA* PGTA*)</source>
         <translation>Alle Profildateien (*.g5e SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="395"/>
-        <location filename="../UserInterface.cpp" line="350"/>
+        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../UserInterface.cpp" line="364"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
@@ -1221,12 +1462,12 @@ Exportieren als:</translation>
 <context>
     <name>QApplication</name>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Font</source>
         <translation>Schrift</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Selected Font: %1</source>
         <translation>Ausgewähle Schrift: %1</translation>
     </message>
@@ -1240,12 +1481,12 @@ Exportieren als:</translation>
         <translation>Spielstandanzeiger</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="29"/>
+        <location filename="../SavegameDialog.ui" line="23"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</source>
         <translation>&lt;span style=&quot; font-weight:600;&quot;&gt;Spielstand&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="63"/>
+        <location filename="../SavegameDialog.ui" line="70"/>
         <source>&amp;Export</source>
         <translation>&amp;Exportieren</translation>
     </message>
@@ -1254,7 +1495,7 @@ Exportieren als:</translation>
         <translation type="obsolete">&amp;Kopieren</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="76"/>
+        <location filename="../SavegameDialog.ui" line="83"/>
         <source>&amp;Close</source>
         <translation>S&amp;chließen</translation>
     </message>
@@ -1294,12 +1535,12 @@ Exportieren als:</translation>
         <translation type="vanished">SPIELSTAND - %1&lt;br&gt;%2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="83"/>
+        <location filename="../SavegameWidget.ui" line="86"/>
         <source>View</source>
         <translation>Ansehen</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="99"/>
+        <location filename="../SavegameWidget.ui" line="102"/>
         <location filename="../SavegameCopy.cpp" line="48"/>
         <source>Export</source>
         <translation>Exportieren</translation>
@@ -1309,14 +1550,14 @@ Exportieren als:</translation>
         <translation type="obsolete">Kopieren</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.ui" line="121"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="115"/>
-        <location filename="../SavegameWidget.cpp" line="139"/>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Delete savegame</source>
         <translation>Savegame löschen</translation>
     </message>
@@ -1326,13 +1567,13 @@ Exportieren als:</translation>
         <translation>Spielstand exportieren...</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="64"/>
+        <location filename="../SavegameWidget.ui" line="67"/>
         <source>SAVE %3 - %1&lt;br&gt;%2</source>
         <translation>SPIELSTAND %3 - %1&lt;br&gt;%2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="101"/>
-        <location filename="../SavegameWidget.cpp" line="102"/>
+        <location filename="../SavegameWidget.cpp" line="89"/>
+        <location filename="../SavegameWidget.cpp" line="90"/>
         <source>WRONG FORMAT</source>
         <translation>FALSCHES FORMAT</translation>
     </message>
@@ -1341,63 +1582,63 @@ Exportieren als:</translation>
         <translation type="vanished">AUTO</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="64"/>
+        <location filename="../SavegameWidget.cpp" line="60"/>
+        <location filename="../SavegameWidget.cpp" line="117"/>
         <source>AUTOSAVE - %1
 %2</source>
         <translation>AUTOSAVE - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="65"/>
+        <location filename="../SavegameWidget.cpp" line="61"/>
+        <location filename="../SavegameWidget.cpp" line="118"/>
         <source>SAVE %3 - %1
 %2</source>
         <translation>SPIELSTAND %3 - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="125"/>
+        <location filename="../SavegameWidget.cpp" line="111"/>
         <source>UNKNOWN</source>
         <translation>UNKNOWN</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="139"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
         <source>Are you sure to delete %1 from your savegames?</source>
         <translation>Bist du sicher %1 von deinen Spielständen zu löschen?</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Failed at deleting %1 from your savegames</source>
         <translation>Fehlgeschlagen beim Löschen %1 von deinen Spielständen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1124"/>
+        <location filename="../ProfileInterface.cpp" line="1225"/>
         <source>&amp;View</source>
         <translation>A&amp;nsehen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1126"/>
+        <location filename="../ProfileInterface.cpp" line="1227"/>
         <source>&amp;Remove</source>
         <translation>Entfe&amp;rnen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1130"/>
-        <location filename="../ProfileInterface.cpp" line="1141"/>
+        <location filename="../ProfileInterface.cpp" line="1229"/>
         <source>&amp;Select</source>
         <translation>Au&amp;swählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1131"/>
+        <location filename="../ProfileInterface.cpp" line="1230"/>
         <source>&amp;Deselect</source>
         <translation>A&amp;bwählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1132"/>
-        <location filename="../ProfileInterface.cpp" line="1142"/>
+        <location filename="../ProfileInterface.cpp" line="1233"/>
         <source>Select &amp;All</source>
         <translation>&amp;Alles auswählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1135"/>
+        <location filename="../ProfileInterface.cpp" line="1237"/>
         <source>&amp;Deselect All</source>
         <translation>Alles a&amp;bwählen</translation>
     </message>
@@ -1426,17 +1667,17 @@ Exportieren als:</translation>
         <translation type="obsolete">Umschalt+S</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="80"/>
+        <location filename="../SavegameWidget.ui" line="83"/>
         <source>View savegame</source>
         <translation>Spielstand ansehen</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="96"/>
+        <location filename="../SavegameWidget.ui" line="99"/>
         <source>Copy savegame</source>
         <translation>Spielstand kopieren</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1125"/>
+        <location filename="../ProfileInterface.cpp" line="1226"/>
         <source>&amp;Export</source>
         <translation>&amp;Exportieren</translation>
     </message>
@@ -1512,7 +1753,7 @@ Exportieren als:</translation>
     <message>
         <location filename="../SnapmaticEditor.ui" line="14"/>
         <location filename="../SnapmaticEditor.ui" line="81"/>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Snapmatic Properties</source>
         <translation>Snapmatic Eigenschaften</translation>
     </message>
@@ -1556,7 +1797,7 @@ Exportieren als:</translation>
         <translation>Meme</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>Snapmatic Title</source>
         <translation>Snapmatic Titel</translation>
     </message>
@@ -1567,20 +1808,20 @@ Exportieren als:</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="113"/>
-        <location filename="../SnapmaticEditor.cpp" line="199"/>
+        <location filename="../SnapmaticEditor.cpp" line="200"/>
         <source>Crew: %1 (%2)</source>
         <translation>Crew: %1 (%2)</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="126"/>
-        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="185"/>
         <source>Title: %1 (%2)</source>
         <translation>Titel: %1 (%2)</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="136"/>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>Appropriate: %1</source>
         <translation>Angemessen: %1</translation>
     </message>
@@ -1592,7 +1833,7 @@ Exportieren als:</translation>
     <message>
         <location filename="../SnapmaticEditor.ui" line="155"/>
         <source>Qualify as Avatar automatically at apply</source>
-        <translation>Beim Übernehmen als Avatar qualifizieren  </translation>
+        <translation>Beim Übernehmen als Avatar qualifizieren</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="168"/>
@@ -1618,40 +1859,40 @@ Exportieren als:</translation>
         <translation type="vanished">Cancel</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="183"/>
-        <location filename="../SnapmaticEditor.cpp" line="198"/>
+        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="199"/>
         <source>Edit</source>
         <translation>Bearbeiten</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
         <source>Yes</source>
         <comment>Yes, should work fine</comment>
         <translation>Ja</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>No</source>
         <comment>No, could lead to issues</comment>
         <translation>Nein</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Patching of Snapmatic Properties failed because of I/O Error</source>
         <translation>Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen I/O Fehler</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>New Snapmatic title:</source>
         <translation>Neuer Snapmatic Titel:</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>Snapmatic Crew</source>
         <translation>Snapmatic Crew</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>New Snapmatic crew:</source>
         <translation>Neue Snapmatic Crew:</translation>
     </message>
@@ -1659,7 +1900,7 @@ Exportieren als:</translation>
 <context>
     <name>SnapmaticPicture</name>
     <message>
-        <location filename="../SnapmaticPicture.cpp" line="367"/>
+        <location filename="../SnapmaticPicture.cpp" line="411"/>
         <source>PHOTO - %1</source>
         <translation>FOTO - %1</translation>
     </message>
@@ -1672,44 +1913,44 @@ Exportieren als:</translation>
         <translation>Snapmatic Widget</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="82"/>
+        <location filename="../SnapmaticWidget.ui" line="85"/>
         <source>PHOTO - 00/00/00 00:00:00</source>
         <translation>FOTO - 00/00/00 00:00:00</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="101"/>
+        <location filename="../SnapmaticWidget.ui" line="104"/>
         <source>View</source>
         <translation>Ansehen</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="120"/>
+        <location filename="../SnapmaticWidget.ui" line="123"/>
         <source>Copy</source>
         <translation>Kopieren</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="136"/>
+        <location filename="../SnapmaticWidget.ui" line="139"/>
         <source>Export</source>
         <translation>Exportieren</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.ui" line="155"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="149"/>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Delete picture</source>
         <translation>Bild löschen</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
         <source>Are you sure to delete %1 from your Snapmatic pictures?</source>
         <translation>Bist du sicher %1 von deine Snapmatic Bilder zu löschen?</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1083"/>
+        <location filename="../ProfileInterface.cpp" line="1178"/>
         <source>Edi&amp;t</source>
         <translation>Bearbei&amp;ten</translation>
     </message>
@@ -1722,7 +1963,7 @@ Exportieren als:</translation>
         <translation type="vanished">&amp;Im Spiel deaktivieren</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1093"/>
+        <location filename="../ProfileInterface.cpp" line="1188"/>
         <source>&amp;Export</source>
         <translation>&amp;Exportieren</translation>
     </message>
@@ -1735,12 +1976,12 @@ Exportieren als:</translation>
         <translation type="obsolete">Exportiere als &amp;GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1086"/>
+        <location filename="../ProfileInterface.cpp" line="1181"/>
         <source>Show &amp;In-game</source>
         <translation>&amp;Im Spiel anzeigen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1090"/>
+        <location filename="../ProfileInterface.cpp" line="1185"/>
         <source>Hide &amp;In-game</source>
         <translation>&amp;Im Spiel ausblenden</translation>
     </message>
@@ -1753,49 +1994,55 @@ Exportieren als:</translation>
         <translation type="vanished">FOTO - %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1092"/>
+        <location filename="../ProfileInterface.cpp" line="1187"/>
         <source>&amp;Edit Properties...</source>
         <translation>&amp;Eigenschaften bearbeiten...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1094"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Exportiere als &amp;JPG Bild...</translation>
+        <translation type="vanished">Exportiere als &amp;JPG Bild...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1189"/>
+        <source>Export as &amp;Picture...</source>
+        <translation>Exportiere als &amp;Bild...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1095"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Exportiere als &amp;GTA Snapmatic...</translation>
+        <translation type="vanished">Exportiere als &amp;GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1096"/>
+        <location filename="../ProfileInterface.cpp" line="1190"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation>Exportiere als &amp;Snapmatic...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1191"/>
         <source>&amp;View</source>
         <translation>A&amp;nsehen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1099"/>
+        <location filename="../ProfileInterface.cpp" line="1194"/>
         <source>&amp;Remove</source>
         <translation>Entfe&amp;rnen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1103"/>
-        <location filename="../ProfileInterface.cpp" line="1114"/>
+        <location filename="../ProfileInterface.cpp" line="1196"/>
         <source>&amp;Select</source>
         <translation>Au&amp;swählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1104"/>
+        <location filename="../ProfileInterface.cpp" line="1197"/>
         <source>&amp;Deselect</source>
         <translation>A&amp;bwählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1105"/>
-        <location filename="../ProfileInterface.cpp" line="1115"/>
+        <location filename="../ProfileInterface.cpp" line="1200"/>
         <source>Select &amp;All</source>
         <translation>Alles &amp;auswählen</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1108"/>
+        <location filename="../ProfileInterface.cpp" line="1204"/>
         <source>&amp;Deselect All</source>
         <translation>Alles a&amp;bwählen</translation>
     </message>
@@ -1824,17 +2071,17 @@ Exportieren als:</translation>
         <translation type="obsolete">Umschalt+S</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="98"/>
+        <location filename="../SnapmaticWidget.ui" line="101"/>
         <source>View picture</source>
         <translation>Bild ansehen</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="117"/>
+        <location filename="../SnapmaticWidget.ui" line="120"/>
         <source>Copy picture</source>
         <translation>Bild kopieren</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="133"/>
+        <location filename="../SnapmaticWidget.ui" line="136"/>
         <source>Export picture</source>
         <translation>Bild exportieren</translation>
     </message>
@@ -1843,7 +2090,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Bist du sicher %1 von deinen Snapmatic Bilder zu löschen?</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Failed at deleting %1 from your Snapmatic pictures</source>
         <translation>Fehlgeschlagen beim Löschen von %1 von deinen Snapmatic Bildern</translation>
     </message>
@@ -1883,7 +2130,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Über gta5sync</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="258"/>
+        <location filename="../UserInterface.ui" line="264"/>
         <source>Ctrl+A</source>
         <translation>Strg+A</translation>
     </message>
@@ -1896,7 +2143,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Optionen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="298"/>
+        <location filename="../UserInterface.ui" line="304"/>
         <source>Ctrl+O</source>
         <translation>Strg+O</translation>
     </message>
@@ -1905,7 +2152,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Alles auswählen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="250"/>
+        <location filename="../UserInterface.ui" line="256"/>
         <source>Ctrl+S</source>
         <translation>Strg+S</translation>
     </message>
@@ -1922,7 +2169,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Auswahl exportieren</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="274"/>
+        <location filename="../UserInterface.ui" line="280"/>
         <source>Ctrl+E</source>
         <translation>Strg+E</translation>
     </message>
@@ -1931,17 +2178,17 @@ Exportieren als:</translation>
         <translation type="obsolete">Auswahl löschen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="266"/>
+        <location filename="../UserInterface.ui" line="272"/>
         <source>Ctrl+D</source>
         <translation>Strg+D</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="231"/>
+        <location filename="../UserInterface.ui" line="237"/>
         <source>Exit</source>
         <translation>Beenden</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="199"/>
+        <location filename="../UserInterface.ui" line="205"/>
         <source>&amp;Selection visibility</source>
         <translation>Auswahl &amp;Sichtbarkeit</translation>
     </message>
@@ -1950,12 +2197,12 @@ Exportieren als:</translation>
         <translation type="vanished">&amp;Über Produkt</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="228"/>
+        <location filename="../UserInterface.ui" line="234"/>
         <source>&amp;Exit</source>
         <translation>B&amp;eenden</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="234"/>
+        <location filename="../UserInterface.ui" line="240"/>
         <source>Ctrl+Q</source>
         <translation>Strg+Q</translation>
     </message>
@@ -1970,22 +2217,33 @@ Exportieren als:</translation>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="173"/>
+        <location filename="../UserInterface.ui" line="131"/>
+        <source>Reload profile overview</source>
+        <translation>Übersicht der Profile neuladen</translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="150"/>
+        <source>Close %1</source>
+        <extracomment>Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically</extracomment>
+        <translation>Schließe %1</translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="179"/>
         <source>&amp;File</source>
         <translation>&amp;Datei</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="183"/>
+        <location filename="../UserInterface.ui" line="189"/>
         <source>&amp;Help</source>
         <translation>&amp;Hilfe</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="189"/>
+        <location filename="../UserInterface.ui" line="195"/>
         <source>&amp;Edit</source>
         <translation>Bearb&amp;eiten</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="195"/>
+        <location filename="../UserInterface.ui" line="201"/>
         <source>&amp;Profile</source>
         <translation>&amp;Profil</translation>
     </message>
@@ -1998,43 +2256,43 @@ Exportieren als:</translation>
         <translation type="vanished">&amp;Über gta5sync</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="239"/>
+        <location filename="../UserInterface.ui" line="245"/>
         <source>Close &amp;Profile</source>
         <translation>&amp;Profil schließen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="242"/>
+        <location filename="../UserInterface.ui" line="248"/>
         <source>Ctrl+End</source>
         <translation>Strg+Ende</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="282"/>
+        <location filename="../UserInterface.ui" line="288"/>
         <source>Ctrl+Del</source>
         <translation>Strg+Entf</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="295"/>
+        <location filename="../UserInterface.ui" line="301"/>
         <source>&amp;Open File...</source>
         <translation>Datei &amp;öffnen...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="303"/>
-        <location filename="../UserInterface.cpp" line="151"/>
+        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.cpp" line="163"/>
         <source>Select &amp;GTA V Folder...</source>
         <translation>Wähle &amp;GTA V Ordner...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.ui" line="315"/>
         <source>Ctrl+G</source>
         <translation>Strg+G</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="314"/>
+        <location filename="../UserInterface.ui" line="320"/>
         <source>Show In-gam&amp;e</source>
         <translation>Im Spiel anzeig&amp;en</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="322"/>
+        <location filename="../UserInterface.ui" line="328"/>
         <source>Hi&amp;de In-game</source>
         <translation>Im Spiel ausblen&amp;den</translation>
     </message>
@@ -2047,7 +2305,7 @@ Exportieren als:</translation>
         <translation type="vanished">Im Spiel aktivier&amp;en</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="317"/>
+        <location filename="../UserInterface.ui" line="323"/>
         <source>Shift+E</source>
         <translation>Umschalt+E</translation>
     </message>
@@ -2056,12 +2314,12 @@ Exportieren als:</translation>
         <translation type="vanished">Im Spiel &amp;deaktivieren</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="325"/>
+        <location filename="../UserInterface.ui" line="331"/>
         <source>Shift+D</source>
         <translation>Umschalt+D</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="147"/>
+        <location filename="../UserInterface.ui" line="153"/>
         <source>&amp;Close</source>
         <translation>S&amp;chließen</translation>
     </message>
@@ -2070,7 +2328,7 @@ Exportieren als:</translation>
         <translation type="obsolete">&amp;Profil auswählen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="223"/>
+        <location filename="../UserInterface.ui" line="229"/>
         <source>Ctrl+P</source>
         <translation>Strg+P</translation>
     </message>
@@ -2079,27 +2337,27 @@ Exportieren als:</translation>
         <translation type="obsolete">&amp;Optionen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="247"/>
+        <location filename="../UserInterface.ui" line="253"/>
         <source>&amp;Settings</source>
         <translation>Ein&amp;stellungen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="255"/>
+        <location filename="../UserInterface.ui" line="261"/>
         <source>Select &amp;All</source>
         <translation>&amp;Alles auswählen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="263"/>
+        <location filename="../UserInterface.ui" line="269"/>
         <source>&amp;Deselect All</source>
         <translation>Alles a&amp;bwählen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="271"/>
+        <location filename="../UserInterface.ui" line="277"/>
         <source>&amp;Export selected...</source>
         <translation>Auswahl &amp;exportieren...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="279"/>
+        <location filename="../UserInterface.ui" line="285"/>
         <source>&amp;Remove selected</source>
         <translation>Auswahl entfe&amp;rnen</translation>
     </message>
@@ -2108,12 +2366,12 @@ Exportieren als:</translation>
         <translation type="obsolete">Strg+R</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="287"/>
+        <location filename="../UserInterface.ui" line="293"/>
         <source>&amp;Import files...</source>
         <translation>Dateien &amp;importieren...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="290"/>
+        <location filename="../UserInterface.ui" line="296"/>
         <source>Ctrl+I</source>
         <translation>Strg+I</translation>
     </message>
@@ -2122,16 +2380,17 @@ Exportieren als:</translation>
         <translation type="obsolete">GTA V Ordner nicht gefunden!</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="62"/>
-        <location filename="../UserInterface.cpp" line="220"/>
+        <location filename="../UserInterface.cpp" line="64"/>
+        <location filename="../UserInterface.cpp" line="234"/>
+        <location filename="../UserInterface.cpp" line="550"/>
         <source>Select Profile</source>
         <translation>Profil auswählen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="306"/>
-        <location filename="../OptionsDialog.cpp" line="452"/>
-        <location filename="../UserInterface.cpp" line="99"/>
-        <location filename="../UserInterface.cpp" line="495"/>
+        <location filename="../UserInterface.ui" line="312"/>
+        <location filename="../OptionsDialog.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="104"/>
+        <location filename="../UserInterface.cpp" line="513"/>
         <source>Select GTA V Folder...</source>
         <translation>Wähle GTA V Ordner...</translation>
     </message>
@@ -2140,7 +2399,7 @@ Exportieren als:</translation>
         <translation type="vanished">Wähle GTA V &amp;Ordner...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="346"/>
+        <location filename="../UserInterface.cpp" line="360"/>
         <source>Open File...</source>
         <translation>Datei öffnen...</translation>
     </message>
@@ -2150,26 +2409,27 @@ Exportieren als:</translation>
     </message>
     <message>
         <location filename="../UserInterface.ui" line="20"/>
-        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="62"/>
         <source>%2 - %1</source>
         <translation>%2 - %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="220"/>
-        <location filename="../UserInterface.cpp" line="59"/>
+        <location filename="../UserInterface.ui" line="226"/>
+        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="542"/>
         <source>&amp;About %1</source>
         <translation>&amp;Über %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="393"/>
-        <location filename="../UserInterface.cpp" line="409"/>
-        <location filename="../UserInterface.cpp" line="436"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>Open File</source>
         <translation>Datei öffnen</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="436"/>
+        <location filename="../UserInterface.cpp" line="450"/>
         <source>Can&apos;t open %1 because of not valid file format</source>
         <translation>Kann nicht %1 öffnen weil Dateiformat nicht gültig ist</translation>
     </message>
@@ -2186,7 +2446,7 @@ Exportieren als:</translation>
         <translation type="obsolete">Grand Theft Auto V Ordner wurde nicht gefunden!</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="131"/>
+        <location filename="../UserInterface.ui" line="134"/>
         <source>&amp;Reload</source>
         <translation>&amp;Neuladen</translation>
     </message>
diff --git a/res/gta5sync_en_US.qm b/res/gta5sync_en_US.qm
new file mode 100644
index 0000000..a7fe036
Binary files /dev/null and b/res/gta5sync_en_US.qm differ
diff --git a/res/gta5sync_en_US.ts b/res/gta5sync_en_US.ts
new file mode 100644
index 0000000..7720a27
--- /dev/null
+++ b/res/gta5sync_en_US.ts
@@ -0,0 +1,1619 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_US">
+<context>
+    <name>AboutDialog</name>
+    <message>
+        <location filename="../AboutDialog.ui" line="14"/>
+        <source>About %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.ui" line="29"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;%1&lt;/span&gt;&lt;br/&gt;
+&lt;br/&gt;
+%2&lt;br/&gt;
+&lt;br/&gt;
+Version %3&lt;br/&gt;
+Created on %4&lt;br/&gt;
+Built with Qt %5&lt;br/&gt;
+Running with Qt %6&lt;br/&gt;
+&lt;br/&gt;
+%7</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.ui" line="75"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="41"/>
+        <source>Using %1 %2</source>
+        <extracomment>Using specific library, example Using libmyfuck</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="43"/>
+        <source>Translated by %1</source>
+        <extracomment>Translated by translator, example Translated by Syping</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="45"/>
+        <source>NAME_OF_TRANSLATOR</source>
+        <extracomment>Enter your name there</extracomment>
+        <translation>Syping</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="47"/>
+        <source>TRANSLATOR_PROFILE</source>
+        <extracomment>Enter your proilfe there, example a GitHub profile, E-Mail with &quot;mailto: afucker@sumfuck.com&quot; or a webpage</extracomment>
+        <translation>https://github.com/Syping/</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="78"/>
+        <source>A project for viewing and sync Grand Theft Auto V Snapmatic&lt;br/&gt;
+Pictures and Savegames</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="80"/>
+        <source>A project for viewing Grand Theft Auto V Snapmatic&lt;br/&gt;
+Pictures and Savegames</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="84"/>
+        <source>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="86"/>
+        <source>%1 is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="62"/>
+        <source>Release</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="68"/>
+        <source>Release Candidate</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="74"/>
+        <source>Daily Build</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="80"/>
+        <source>Developer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="86"/>
+        <source>Beta</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="92"/>
+        <source>Alpha</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>CrewDatabase</name>
+    <message>
+        <location filename="../CrewDatabase.cpp" line="102"/>
+        <source>No Crew</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>ExportDialog</name>
+    <message>
+        <location filename="../ExportDialog.ui" line="14"/>
+        <source>Dialog</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="45"/>
+        <source>Export Format</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="51"/>
+        <source>&amp;JPEG/PNG format</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="58"/>
+        <source>GTA &amp;Snapmatic format</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="68"/>
+        <source>Export Size</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="74"/>
+        <source>Default &amp;Size</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="81"/>
+        <source>&amp;Desktop Size</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="88"/>
+        <source>&amp;Custom Size</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="100"/>
+        <source>Custom Size:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="123"/>
+        <source>x</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="198"/>
+        <source>&amp;Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportDialog.ui" line="211"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>ImportDialog</name>
+    <message>
+        <location filename="../ImportDialog.ui" line="26"/>
+        <source>Import...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="90"/>
+        <source>Settings</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="98"/>
+        <location filename="../ImportDialog.cpp" line="57"/>
+        <location filename="../ImportDialog.cpp" line="216"/>
+        <source>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</source>
+        <translation>Background Color: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="105"/>
+        <source>...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="135"/>
+        <source>Avatar</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="148"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="194"/>
+        <source>Import picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="197"/>
+        <source>&amp;OK</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="210"/>
+        <source>Discard picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="213"/>
+        <source>&amp;Cancel</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Snapmatic Avatar Zone</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you want to use it as Avatar the image will be detached!</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="212"/>
+        <source>Select Colour...</source>
+        <translation>Select Color...</translation>
+    </message>
+</context>
+<context>
+    <name>MapPreviewDialog</name>
+    <message>
+        <location filename="../MapPreviewDialog.ui" line="26"/>
+        <source>Snapmatic Map Viewer</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>OptionsDialog</name>
+    <message>
+        <location filename="../OptionsDialog.ui" line="14"/>
+        <source>%1 - Settings</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="27"/>
+        <source>Profiles</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="33"/>
+        <source>Content Open/Select Mode</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="39"/>
+        <source>Open with Singleclick</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="49"/>
+        <source>Open with Doubleclick</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="56"/>
+        <source>Select with Singleclick</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="66"/>
+        <source>Default Profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="78"/>
+        <source>Custom GTA V Folder</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="84"/>
+        <source>Force using Custom Folder</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="96"/>
+        <source>...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="122"/>
+        <source>Pictures</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="128"/>
+        <source>Export Size</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="134"/>
+        <source>Default: %1x%2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="144"/>
+        <source>Screen Resolution: %1x%2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="153"/>
+        <location filename="../OptionsDialog.ui" line="163"/>
+        <source>Custom Size:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="189"/>
+        <source>x</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="229"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="241"/>
+        <source>Export Quality</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="247"/>
+        <source>Enable Custom Quality</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="259"/>
+        <source>Quality:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="288"/>
+        <source>%1%</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="303"/>
+        <source>Picture Viewer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="309"/>
+        <source>Enable Navigation Bar</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="333"/>
+        <source>Players</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="373"/>
+        <source>ID</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="378"/>
+        <source>Name</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="387"/>
+        <location filename="../OptionsDialog.ui" line="393"/>
+        <source>Language</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="419"/>
+        <source>Sync</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="425"/>
+        <source>Sync is not implemented at current time</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="463"/>
+        <source>Apply changes</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="466"/>
+        <source>&amp;OK</source>
+        <extracomment>OK, Cancel, Apply</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="479"/>
+        <source>Discard changes</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="482"/>
+        <source>&amp;Cancel</source>
+        <extracomment>OK, Cancel, Apply</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>%1 (Next Closest Language)</source>
+        <comment>First language a person can talk with a different person/application. &quot;Native&quot; or &quot;Not Native&quot;.</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>System</source>
+        <comment>System in context of System default</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>%1</source>
+        <comment>%1</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>The new Custom Folder will initialise after you restart %1.</source>
+        <translation>The new Custom Folder will initialize after you restart %1.</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="299"/>
+        <source>No Profile</source>
+        <comment>No Profile, as default</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="307"/>
+        <location filename="../OptionsDialog.cpp" line="311"/>
+        <location filename="../OptionsDialog.cpp" line="313"/>
+        <source>Profile: %1</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>PictureDialog</name>
+    <message>
+        <location filename="../PictureDialog.ui" line="14"/>
+        <source>%1 - Snapmatic Picture Viewer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="117"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
+&lt;span style=&quot; font-weight:600;&quot;&gt;Created: &lt;/span&gt;%8</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="177"/>
+        <source>Manage picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="180"/>
+        <source>&amp;Manage</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="199"/>
+        <source>Close viewer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="202"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="145"/>
+        <source>Export as &amp;Picture...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="146"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="148"/>
+        <source>Open &amp;Map View...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="150"/>
+        <source>&amp;Edit Properties...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="373"/>
+        <source>Key 1 - Avatar Preview Mode
+Key 2 - Toggle Overlay
+Arrow Keys - Navigate</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
+        <source>Snapmatic Picture Viewer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
+        <source>Failed at %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="614"/>
+        <source>No Players</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="589"/>
+        <source>No Crew</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <source>Unknown Location</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="560"/>
+        <source>Avatar Preview Mode
+Press 1 for Default View</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="90"/>
+        <source>Export as Picture...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="91"/>
+        <location filename="../PictureExport.cpp" line="223"/>
+        <source>Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="94"/>
+        <source>JPEG Graphics (*.jpg *.jpeg)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="95"/>
+        <source>Portable Network Graphics (*.png)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <source>Export as Picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <source>Overwrite %1 with current Snapmatic picture?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <source>Failed to overwrite %1 with current Snapmatic picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <source>Failed to export current Snapmatic picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>No valid file is selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="222"/>
+        <source>Export as Snapmatic...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="226"/>
+        <source>GTA V Export (*.g5e)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="227"/>
+        <source>GTA V Raw Export (*.auto)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="228"/>
+        <source>Snapmatic pictures (PGTA*)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>Export as Snapmatic</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <source>Exported Snapmatic to &quot;%1&quot; because of using the .auto extension.</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileInterface</name>
+    <message>
+        <location filename="../ProfileInterface.ui" line="14"/>
+        <source>Profile Interface</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="55"/>
+        <source>Loading file %1 of %2 files</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="172"/>
+        <source>%1 %2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import file</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="201"/>
+        <source>&amp;Import...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="217"/>
+        <source>Close profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="220"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ExportThread.cpp" line="97"/>
+        <location filename="../ExportThread.cpp" line="136"/>
+        <location filename="../ExportThread.cpp" line="157"/>
+        <source>Export file %1 of %2 files</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="65"/>
+        <source>Enabled pictures: %1 of %2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="129"/>
+        <source>Loading...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="426"/>
+        <location filename="../ProfileInterface.cpp" line="491"/>
+        <source>Import...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
+        <source>Import</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="442"/>
+        <source>Importable files (%1)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../UserInterface.cpp" line="364"/>
+        <source>GTA V Export (*.g5e)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="444"/>
+        <location filename="../UserInterface.cpp" line="365"/>
+        <source>Savegames files (SGTA*)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="366"/>
+        <source>Snapmatic pictures (PGTA*)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="446"/>
+        <source>All image files (%1)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="447"/>
+        <location filename="../UserInterface.cpp" line="367"/>
+        <source>All files (**)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../UserInterface.cpp" line="455"/>
+        <source>No valid file is selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="492"/>
+        <location filename="../ProfileInterface.cpp" line="507"/>
+        <source>Import file %1 of %2 files</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <source>Import failed with...
+
+%1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <source>Failed to read Snapmatic picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <source>Failed to read Savegame file</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <source>Can&apos;t import %1 because file can&apos;t be parsed properly</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <source>Can&apos;t import %1 because file format can&apos;t be detected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <source>Failed to import the Snapmatic picture, the picture is already in the game</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <source>Failed to import the Snapmatic picture, can&apos;t copy the file into profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <source>Failed to import the Savegame, can&apos;t copy the file into profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="837"/>
+        <source>Failed to import the Savegame, no Savegame slot is left</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="900"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <source>Export selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="923"/>
+        <location filename="../ProfileInterface.cpp" line="941"/>
+        <source>JPG pictures and GTA Snapmatic</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="924"/>
+        <location filename="../ProfileInterface.cpp" line="946"/>
+        <source>JPG pictures only</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="925"/>
+        <location filename="../ProfileInterface.cpp" line="950"/>
+        <source>GTA Snapmatic only</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <source>%1Export Snapmatic pictures%2&lt;br&gt;&lt;br&gt;JPG pictures make it possible to open the picture with a Image Viewer&lt;br&gt;GTA Snapmatic make it possible to import the picture into the game&lt;br&gt;&lt;br&gt;Export as:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="983"/>
+        <source>Export selected...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="984"/>
+        <source>Initialising export...</source>
+        <translation>Initializing export...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <source>Export failed with...
+
+%1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
+        <source>No Snapmatic pictures or Savegames files are selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
+        <source>Remove selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <source>You really want remove the selected Snapmatic picutres and Savegame files?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="363"/>
+        <source>All profile files (*.g5e SGTA* PGTA*)</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>QApplication</name>
+    <message>
+        <location filename="../main.cpp" line="66"/>
+        <source>Font</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../main.cpp" line="66"/>
+        <source>Selected Font: %1</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>SavegameDialog</name>
+    <message>
+        <location filename="../SavegameDialog.ui" line="14"/>
+        <location filename="../SavegameDialog.cpp" line="38"/>
+        <source>Savegame Viewer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="23"/>
+        <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="70"/>
+        <source>&amp;Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.ui" line="83"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameDialog.cpp" line="38"/>
+        <source>Failed at %1</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>SavegameWidget</name>
+    <message>
+        <location filename="../SavegameWidget.ui" line="14"/>
+        <source>Savegame Widget</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="67"/>
+        <source>SAVE %3 - %1&lt;br&gt;%2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="83"/>
+        <source>View savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="86"/>
+        <source>View</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="99"/>
+        <source>Copy savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="102"/>
+        <location filename="../SavegameCopy.cpp" line="48"/>
+        <source>Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
+        <source>Delete savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.ui" line="121"/>
+        <source>Delete</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1225"/>
+        <source>&amp;View</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1226"/>
+        <source>&amp;Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1227"/>
+        <source>&amp;Remove</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1229"/>
+        <source>&amp;Select</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1230"/>
+        <source>&amp;Deselect</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1233"/>
+        <source>Select &amp;All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1237"/>
+        <source>&amp;Deselect All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="51"/>
+        <source>Savegame files (SGTA*)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="52"/>
+        <source>All files (**)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="70"/>
+        <location filename="../SavegameCopy.cpp" line="74"/>
+        <location filename="../SavegameCopy.cpp" line="87"/>
+        <location filename="../SavegameCopy.cpp" line="93"/>
+        <source>Export Savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="70"/>
+        <source>Overwrite %1 with current Savegame?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="74"/>
+        <source>Failed to overwrite %1 with current Savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="87"/>
+        <source>Failed to export current Savegame</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameCopy.cpp" line="93"/>
+        <source>No valid file is selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="57"/>
+        <source>Export Savegame...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="60"/>
+        <location filename="../SavegameWidget.cpp" line="117"/>
+        <source>AUTOSAVE - %1
+%2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="61"/>
+        <location filename="../SavegameWidget.cpp" line="118"/>
+        <source>SAVE %3 - %1
+%2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="89"/>
+        <location filename="../SavegameWidget.cpp" line="90"/>
+        <source>WRONG FORMAT</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="111"/>
+        <source>UNKNOWN</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <source>Are you sure to delete %1 from your savegames?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SavegameWidget.cpp" line="144"/>
+        <source>Failed at deleting %1 from your savegames</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticEditor</name>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="14"/>
+        <location filename="../SnapmaticEditor.ui" line="81"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
+        <source>Snapmatic Properties</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="44"/>
+        <source>Snapmatic Type</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="50"/>
+        <source>Editor</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="57"/>
+        <source>Selfie</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="64"/>
+        <source>Regular</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="71"/>
+        <source>Mugshot</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="87"/>
+        <source>Meme</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="94"/>
+        <source>Director</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="104"/>
+        <source>Snapmatic Values</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="113"/>
+        <location filename="../SnapmaticEditor.cpp" line="200"/>
+        <source>Crew: %1 (%2)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="126"/>
+        <location filename="../SnapmaticEditor.cpp" line="185"/>
+        <source>Title: %1 (%2)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="136"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
+        <source>Appropriate: %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="149"/>
+        <source>Extras</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="155"/>
+        <source>Qualify as Avatar automatically at apply</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="168"/>
+        <source>Qualify as Avatar allows you to use this Snapmatic as a Social Club profile picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="218"/>
+        <source>&amp;Apply</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.ui" line="231"/>
+        <source>&amp;Cancel</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="199"/>
+        <source>Edit</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <source>Yes</source>
+        <comment>Yes, should work fine</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
+        <source>No</source>
+        <comment>No, could lead to issues</comment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
+        <source>Patching of Snapmatic Properties failed because of I/O Error</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
+        <source>Snapmatic Title</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
+        <source>New Snapmatic title:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
+        <source>Snapmatic Crew</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
+        <source>New Snapmatic crew:</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticPicture</name>
+    <message>
+        <location filename="../SnapmaticPicture.cpp" line="411"/>
+        <source>PHOTO - %1</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>SnapmaticWidget</name>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="14"/>
+        <source>Snapmatic Widget</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="85"/>
+        <source>PHOTO - 00/00/00 00:00:00</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="101"/>
+        <source>View picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="104"/>
+        <source>View</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="120"/>
+        <source>Copy picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="123"/>
+        <source>Copy</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="136"/>
+        <source>Export picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="139"/>
+        <source>Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
+        <source>Delete picture</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.ui" line="155"/>
+        <source>Delete</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1178"/>
+        <source>Edi&amp;t</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1181"/>
+        <source>Show &amp;In-game</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1185"/>
+        <source>Hide &amp;In-game</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1187"/>
+        <source>&amp;Edit Properties...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1188"/>
+        <source>&amp;Export</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1189"/>
+        <source>Export as &amp;Picture...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1190"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1191"/>
+        <source>&amp;View</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1194"/>
+        <source>&amp;Remove</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1196"/>
+        <source>&amp;Select</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1197"/>
+        <source>&amp;Deselect</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1200"/>
+        <source>Select &amp;All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1204"/>
+        <source>&amp;Deselect All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <source>Are you sure to delete %1 from your Snapmatic pictures?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
+        <source>Failed at deleting %1 from your Snapmatic pictures</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>UserInterface</name>
+    <message>
+        <location filename="../UserInterface.ui" line="20"/>
+        <location filename="../UserInterface.cpp" line="62"/>
+        <source>%2 - %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="74"/>
+        <source>Select profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="105"/>
+        <source>%1 %2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="131"/>
+        <source>Reload profile overview</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="134"/>
+        <source>&amp;Reload</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="150"/>
+        <source>Close %1</source>
+        <extracomment>Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically</extracomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="153"/>
+        <source>&amp;Close</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="179"/>
+        <source>&amp;File</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="189"/>
+        <source>&amp;Help</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="195"/>
+        <source>&amp;Edit</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="201"/>
+        <source>&amp;Profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="205"/>
+        <source>&amp;Selection visibility</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="226"/>
+        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="542"/>
+        <source>&amp;About %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="229"/>
+        <source>Ctrl+P</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="234"/>
+        <source>&amp;Exit</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="237"/>
+        <source>Exit</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="240"/>
+        <source>Ctrl+Q</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="245"/>
+        <source>Close &amp;Profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="248"/>
+        <source>Ctrl+End</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="253"/>
+        <source>&amp;Settings</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="256"/>
+        <source>Ctrl+S</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="261"/>
+        <source>Select &amp;All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="264"/>
+        <source>Ctrl+A</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="269"/>
+        <source>&amp;Deselect All</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="272"/>
+        <source>Ctrl+D</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="277"/>
+        <source>&amp;Export selected...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="280"/>
+        <source>Ctrl+E</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="285"/>
+        <source>&amp;Remove selected</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="288"/>
+        <source>Ctrl+Del</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="293"/>
+        <source>&amp;Import files...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="296"/>
+        <source>Ctrl+I</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="301"/>
+        <source>&amp;Open File...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="304"/>
+        <source>Ctrl+O</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.cpp" line="163"/>
+        <source>Select &amp;GTA V Folder...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="312"/>
+        <location filename="../OptionsDialog.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="104"/>
+        <location filename="../UserInterface.cpp" line="513"/>
+        <source>Select GTA V Folder...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="315"/>
+        <source>Ctrl+G</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="320"/>
+        <source>Show In-gam&amp;e</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="323"/>
+        <source>Shift+E</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="328"/>
+        <source>Hi&amp;de In-game</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="331"/>
+        <source>Shift+D</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="64"/>
+        <location filename="../UserInterface.cpp" line="234"/>
+        <location filename="../UserInterface.cpp" line="550"/>
+        <source>Select Profile</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="360"/>
+        <source>Open File...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <location filename="../UserInterface.cpp" line="455"/>
+        <source>Open File</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <source>Can&apos;t open %1 because of not valid file format</source>
+        <translation></translation>
+    </message>
+</context>
+</TS>
diff --git a/res/gta5sync_fr.qm b/res/gta5sync_fr.qm
index 2b5dd18..affe051 100644
Binary files a/res/gta5sync_fr.qm and b/res/gta5sync_fr.qm differ
diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts
index 42e78d2..78dc45b 100644
--- a/res/gta5sync_fr.ts
+++ b/res/gta5sync_fr.ts
@@ -111,43 +111,63 @@ Copyright &amp;copy; &lt;a href=&quot;%5&quot;&gt;%6&lt;/a&gt; %7&lt;br/&gt;
         <translation>&amp;Fermer</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="40"/>
         <source>Using %1 %2</source>
         <comment>Exp. Using libmyfuck</comment>
-        <translation>Utilise %1 %2</translation>
+        <translation type="vanished">Utilise %1 %2</translation>
+    </message>
+    <message>
+        <source>Translated by %1</source>
+        <comment>Exp. Translated by Syping</comment>
+        <translation type="vanished">Traduit par %1</translation>
+    </message>
+    <message>
+        <source>NAME_OF_TRANSLATOR</source>
+        <comment>Your Name (The person behind your screen looking at this text!)</comment>
+        <translation type="vanished">Ganjalo</translation>
+    </message>
+    <message>
+        <source>TRANSLATOR_PROFILE</source>
+        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <translation type="vanished">https://github.com/Ganjalo/</translation>
     </message>
     <message>
         <location filename="../AboutDialog.cpp" line="41"/>
-        <source>Translated by %1</source>
-        <comment>Exp. Translated by Syping</comment>
-        <translation>Traduit par %1</translation>
-    </message>
-    <message>
-        <location filename="../AboutDialog.cpp" line="42"/>
-        <source>NAME_OF_TRANSLATOR</source>
-        <comment>Your Name (The person behind your screen looking at this text!)</comment>
-        <translation>Ganjalo</translation>
+        <source>Using %1 %2</source>
+        <extracomment>Using specific library, example Using libmyfuck</extracomment>
+        <translation>Utilise %1 %2</translation>
     </message>
     <message>
         <location filename="../AboutDialog.cpp" line="43"/>
+        <source>Translated by %1</source>
+        <extracomment>Translated by translator, example Translated by Syping</extracomment>
+        <translation>Traduit par %1</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="45"/>
+        <source>NAME_OF_TRANSLATOR</source>
+        <extracomment>Enter your name there</extracomment>
+        <translation>Ganjalo</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="47"/>
         <source>TRANSLATOR_PROFILE</source>
-        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <extracomment>Enter your proilfe there, example a GitHub profile, E-Mail with &quot;mailto: afucker@sumfuck.com&quot; or a webpage</extracomment>
         <translation>https://github.com/Ganjalo/</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="64"/>
+        <location filename="../AboutDialog.cpp" line="80"/>
         <source>A project for viewing Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Un outil pour gérer les photos Snapmatic&lt;br/&gt;
 et les fichiers de sauvegarde de Grand Theft Auto V</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="68"/>
+        <location filename="../AboutDialog.cpp" line="84"/>
         <source>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</source>
         <translation>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="70"/>
+        <location filename="../AboutDialog.cpp" line="86"/>
         <source>%1 is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</source>
         <translation>%1 est distribué sous license &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
@@ -156,17 +176,47 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
         <translation type="vanished">Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3&lt;br/&gt;%4 est distribué sous license &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="62"/>
+        <location filename="../AboutDialog.cpp" line="78"/>
         <source>A project for viewing and sync Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Un outil pour gérer et synchroniser les photos Snapmatic&lt;br/&gt;
 et les fichiers de sauvegarde de Grand Theft Auto V</translation>
     </message>
+    <message>
+        <location filename="../config.h" line="62"/>
+        <source>Release</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="68"/>
+        <source>Release Candidate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="74"/>
+        <source>Daily Build</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="80"/>
+        <source>Developer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="86"/>
+        <source>Beta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="92"/>
+        <source>Alpha</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CrewDatabase</name>
     <message>
-        <location filename="../CrewDatabase.cpp" line="64"/>
+        <location filename="../CrewDatabase.cpp" line="102"/>
         <source>No Crew</source>
         <translation>Aucun crew</translation>
     </message>
@@ -247,30 +297,87 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
         <translation>Paramètres</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="96"/>
         <source>&amp;Keep Aspect Ratio</source>
-        <translation>&amp;Conserver le rapport d&apos;aspect</translation>
+        <translation type="vanished">&amp;Conserver le rapport d&apos;aspect</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="103"/>
         <source>&amp;Ignore Aspect Ratio</source>
-        <translation>&amp;Ignorer le rapport d&apos;aspect</translation>
+        <translation type="vanished">&amp;Ignorer le rapport d&apos;aspect</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="110"/>
         <source>&amp;Avatar</source>
-        <translation>&amp;Avatar</translation>
+        <translation type="vanished">&amp;Avatar</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="154"/>
+        <source>Keep Aspect Ratio</source>
+        <translation type="vanished">Conserver le rapport d&apos;aspect</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="148"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation>Déverrouiller le ratio d&apos;aspect</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="135"/>
+        <source>Avatar</source>
+        <translation>Avatar</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="98"/>
+        <location filename="../ImportDialog.cpp" line="57"/>
+        <location filename="../ImportDialog.cpp" line="216"/>
+        <source>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="105"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="194"/>
+        <source>Import picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="197"/>
         <source>&amp;OK</source>
         <translation>&amp;OK</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="167"/>
+        <location filename="../ImportDialog.ui" line="210"/>
+        <source>Discard picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="213"/>
         <source>&amp;Cancel</source>
         <translation>A&amp;nnuler</translation>
     </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you want to use it as Avatar the image will be detached!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Snapmatic Avatar Zone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="212"/>
+        <source>Select Colour...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MapPreviewDialog</name>
+    <message>
+        <location filename="../MapPreviewDialog.ui" line="26"/>
+        <source>Snapmatic Map Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>OptionsDialog</name>
@@ -423,55 +530,77 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
     </message>
     <message>
         <location filename="../OptionsDialog.ui" line="463"/>
+        <source>Apply changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="466"/>
         <source>&amp;OK</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>&amp;OK</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.ui" line="476"/>
+        <location filename="../OptionsDialog.ui" line="479"/>
+        <source>Discard changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="482"/>
         <source>&amp;Cancel</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>&amp;Annuler</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
         <source>%1 (%2 if available)</source>
         <comment>System like PC System = %1, System Language like Deutsch = %2</comment>
-        <translation>%1 (%2 si disponible)</translation>
+        <translation type="vanished">%1 (%2 si disponible)</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
         <source>System</source>
         <comment>System like PC System</comment>
+        <translation type="vanished">Système</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>%1 (Next Closest Language)</source>
+        <comment>First language a person can talk with a different person/application. &quot;Native&quot; or &quot;Not Native&quot;.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>System</source>
+        <comment>System in context of System default</comment>
         <translation>Système</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
-        <location filename="../OptionsDialog.cpp" line="296"/>
+        <location filename="../OptionsDialog.cpp" line="289"/>
         <source>%1</source>
         <comment>%1</comment>
         <translation>%1</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>The new Custom Folder will initialise after you restart %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>The new Custom Folder will initialize after you restart %1.</source>
-        <translation>Le répertoire personnalisé sera actif au prochain lancement de %1.</translation>
+        <translation type="vanished">Le répertoire personnalisé sera actif au prochain lancement de %1.</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="296"/>
         <source>The language change will take effect after you restart %1.</source>
-        <translation>Le changement de langue sera actif au prochain lancement de %1.</translation>
+        <translation type="vanished">Le changement de langue sera actif au prochain lancement de %1.</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="306"/>
+        <location filename="../OptionsDialog.cpp" line="299"/>
         <source>No Profile</source>
         <comment>No Profile, as default</comment>
         <translation>Aucun profil</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="314"/>
-        <location filename="../OptionsDialog.cpp" line="318"/>
-        <location filename="../OptionsDialog.cpp" line="320"/>
+        <location filename="../OptionsDialog.cpp" line="307"/>
+        <location filename="../OptionsDialog.cpp" line="311"/>
+        <location filename="../OptionsDialog.cpp" line="313"/>
         <source>Profile: %1</source>
         <translation>Profil : %1</translation>
     </message>
@@ -484,7 +613,7 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
         <translation>%1 - Visionneuse de photo Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="104"/>
+        <location filename="../PictureDialog.ui" line="117"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
@@ -495,47 +624,73 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
 &lt;span style=&quot; font-weight:600;&quot;&gt;Créé le : &lt;/span&gt;%8</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="164"/>
+        <location filename="../PictureDialog.ui" line="177"/>
+        <source>Manage picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>Export picture</source>
-        <translation>Exporter la photo</translation>
+        <translation type="vanished">Exporter la photo</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="180"/>
+        <source>&amp;Manage</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="167"/>
         <source>&amp;Export</source>
-        <translation>&amp;Exporter</translation>
+        <translation type="vanished">&amp;Exporter</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="199"/>
+        <source>Close viewer</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="186"/>
         <source>Close</source>
-        <translation>Fermer la visionneuse</translation>
+        <translation type="vanished">Fermer la visionneuse</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="189"/>
+        <location filename="../PictureDialog.ui" line="202"/>
         <source>&amp;Close</source>
         <translation>&amp;Fermer</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="220"/>
         <source>Export as GTA Snapmatic...</source>
-        <translation>Exporter comme Snapmatic...</translation>
+        <translation type="vanished">Exporter comme Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="224"/>
+        <location filename="../PictureExport.cpp" line="222"/>
+        <source>Export as Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="226"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="225"/>
+        <location filename="../PictureExport.cpp" line="227"/>
         <source>GTA V Raw Export (*.auto)</source>
         <translation>GTA V Export Brut (*.g5e)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="226"/>
+        <location filename="../PictureExport.cpp" line="228"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Fichiers GTA Snapmatic (PGTA*)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="291"/>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>Export as Snapmatic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="293"/>
         <source>Exported Snapmatic to &quot;%1&quot; because of using the .auto extension.</source>
         <translation>Exporté comme &quot;%1&quot; avec l&apos;utilisation de l&apos;extension .auto.</translation>
     </message>
@@ -544,24 +699,36 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
         <translation type="vanished">Tous les fichiers (**)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="246"/>
-        <location filename="../PictureExport.cpp" line="250"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
-        <location filename="../PictureExport.cpp" line="291"/>
-        <location filename="../PictureExport.cpp" line="297"/>
         <source>Export as GTA Snapmatic</source>
-        <translation>Exporter comme GTA Snapmatic</translation>
+        <translation type="vanished">Exporter comme GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="246"/>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="260"/>
         <source>Overwrite %1 with current Snapmatic picture?</source>
         <translation>%1 existe déjà. Vous-vous le remplacer ?</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="250"/>
+        <location filename="../PictureExport.cpp" line="90"/>
+        <source>Export as Picture...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="94"/>
+        <source>JPEG Graphics (*.jpg *.jpeg)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <source>Export as Picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="264"/>
         <source>Failed to overwrite %1 with current Snapmatic picture</source>
         <translation>Echec du remplacement de %1</translation>
     </message>
@@ -570,23 +737,45 @@ et les fichiers de sauvegarde de Grand Theft Auto V</translation>
         <translation type="vanished">Echec de la copie</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="187"/>
-        <location filename="../PictureExport.cpp" line="297"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <location filename="../PictureExport.cpp" line="299"/>
         <source>No valid file is selected</source>
         <translation>Fichier invalide</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="141"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Exporter comme image &amp;JPG...</translation>
+        <translation type="vanished">Exporter comme image &amp;JPG...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="145"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="142"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Exporter comme &amp;GTA Snapmatic...</translation>
+        <translation type="vanished">Exporter comme &amp;GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="358"/>
+        <location filename="../PictureDialog.cpp" line="146"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edi&amp;t</source>
+        <translation type="obsolete">Édi&amp;ter</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="148"/>
+        <source>Open &amp;Map View...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="150"/>
+        <source>&amp;Edit Properties...</source>
+        <translation>Modifier les &amp;propriétés...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="373"/>
         <source>Key 1 - Avatar Preview Mode
 Key 2 - Toggle Overlay
 Arrow Keys - Navigate</source>
@@ -595,19 +784,31 @@ Touche 2 - Activer/désactiver l&apos;overlay
 Touches fléchées - Naviguer</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Snapmatic Picture Viewer</source>
         <translation>Visionneuse de photo Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Failed at %1</source>
         <translation>Echec de %1</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="572"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="589"/>
+        <source>No Crew</source>
+        <translation>Aucun crew</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="614"/>
+        <source>No Players</source>
+        <translation>Aucun joueurs</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="560"/>
         <source>Avatar Preview Mode
 Press 1 for Default View</source>
         <translation>Mode Aperçu Avatar
@@ -618,55 +819,45 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation type="vanished">Aperçu avatar&lt;br&gt;Appuyer sur A pour la vue par défaut</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="478"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No player</source>
-        <translation>Aucun joueur</translation>
+        <translation type="vanished">Aucun joueur</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="481"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No crew</source>
-        <translation>Aucun crew</translation>
+        <translation type="vanished">Aucun crew</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="488"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
         <source>Unknown Location</source>
         <translation>Emplacement inconnu</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="88"/>
         <source>Export as JPG picture...</source>
-        <translation>Exporter comme image JPG...</translation>
+        <translation type="vanished">Exporter comme image JPG...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="89"/>
-        <location filename="../PictureExport.cpp" line="221"/>
+        <location filename="../PictureExport.cpp" line="91"/>
+        <location filename="../PictureExport.cpp" line="223"/>
         <source>Export</source>
         <translation>Exporter</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="92"/>
         <source>JPEG picture (*.jpg)</source>
-        <translation>Image JPEG (*.jpg)</translation>
+        <translation type="vanished">Image JPEG (*.jpg)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="93"/>
+        <location filename="../PictureExport.cpp" line="95"/>
         <source>Portable Network Graphics (*.png)</source>
         <translation>Portable Network Graphics (*.png)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="187"/>
         <source>Export as JPG picture</source>
-        <translation>Exporter comme image JPG</translation>
+        <translation type="vanished">Exporter comme image JPG</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
         <source>Failed to export current Snapmatic picture</source>
         <translation>Échec de l&apos;export de la photo Snapmatic</translation>
     </message>
@@ -684,66 +875,71 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Chargement du fichier %1 sur %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="169"/>
+        <location filename="../ProfileInterface.ui" line="172"/>
         <source>%1 %2</source>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="195"/>
-        <source>Import exported file</source>
-        <translation>Importer un profil</translation>
+        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import file</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import exported file</source>
+        <translation type="vanished">Importer un profil</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="201"/>
         <source>&amp;Import...</source>
         <translation>&amp;Importer...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="214"/>
+        <location filename="../ProfileInterface.ui" line="217"/>
         <source>Close profile</source>
         <translation>Fermer</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="217"/>
+        <location filename="../ProfileInterface.ui" line="220"/>
         <source>&amp;Close</source>
         <translation>&amp;Fermer</translation>
     </message>
     <message>
-        <location filename="../ExportThread.cpp" line="96"/>
-        <location filename="../ExportThread.cpp" line="135"/>
-        <location filename="../ExportThread.cpp" line="156"/>
+        <location filename="../ExportThread.cpp" line="97"/>
+        <location filename="../ExportThread.cpp" line="136"/>
+        <location filename="../ExportThread.cpp" line="157"/>
         <source>Export file %1 of %2 files</source>
         <translation>Copie du fichier %1 sur %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="62"/>
+        <location filename="../ProfileInterface.cpp" line="65"/>
         <source>Enabled pictures: %1 of %2</source>
         <translation>Photos activées : %1 sur %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="114"/>
+        <location filename="../ProfileInterface.cpp" line="129"/>
         <source>Loading...</source>
         <translation>Chargement...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="390"/>
-        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="426"/>
+        <location filename="../ProfileInterface.cpp" line="491"/>
         <source>Import...</source>
         <translation>Importer...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="391"/>
-        <location filename="../ProfileInterface.cpp" line="481"/>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../ProfileInterface.cpp" line="679"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../ProfileInterface.cpp" line="702"/>
-        <location filename="../ProfileInterface.cpp" line="707"/>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
         <location filename="../ProfileInterface.cpp" line="755"/>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Import</source>
         <translation>Importer</translation>
     </message>
@@ -752,31 +948,36 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation type="vanished">Fichiers de profil GTA (SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="396"/>
-        <location filename="../UserInterface.cpp" line="351"/>
+        <location filename="../ProfileInterface.cpp" line="444"/>
+        <location filename="../UserInterface.cpp" line="365"/>
         <source>Savegames files (SGTA*)</source>
         <translation>Fichiers de sauvegarde GTA (SGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="397"/>
-        <location filename="../UserInterface.cpp" line="352"/>
+        <location filename="../ProfileInterface.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="366"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Photos Snapmatic (PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="399"/>
-        <location filename="../UserInterface.cpp" line="353"/>
+        <location filename="../ProfileInterface.cpp" line="446"/>
+        <source>All image files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="447"/>
+        <location filename="../UserInterface.cpp" line="367"/>
         <source>All files (**)</source>
         <translation>Tous les fichiers (**)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="428"/>
-        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../ProfileInterface.cpp" line="492"/>
+        <location filename="../ProfileInterface.cpp" line="507"/>
         <source>Import file %1 of %2 files</source>
         <translation>Importation du fichier %1 sur %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="481"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
         <source>Import failed with...
 
 %1</source>
@@ -785,111 +986,127 @@ Appuyer sur 1 pour le mode par défaut</translation>
 %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>No valid file is selected</source>
         <translation>Fichier invalide</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../UserInterface.cpp" line="393"/>
+        <location filename="../ProfileInterface.cpp" line="442"/>
+        <source>Importable files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../UserInterface.cpp" line="407"/>
         <source>Failed to read Snapmatic picture</source>
         <translation>Impossible d&apos;ouvrir la photo Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../UserInterface.cpp" line="409"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../UserInterface.cpp" line="423"/>
         <source>Failed to read Savegame file</source>
         <translation>Impossible de lire le fichier de sauvegarde</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="679"/>
         <source>Can&apos;t import %1 because of not valid file format</source>
-        <translation>Impossible d&apos;importer %1, format invalide</translation>
+        <translation type="vanished">Impossible d&apos;importer %1, format invalide</translation>
     </message>
     <message>
         <source>Failed to import the Snapmatic picture, file not begin with PGTA</source>
         <translation type="vanished">Impossible d&apos;importer la photo Snapmatic,nom de fichier incorrect (PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="394"/>
         <source>Importable files (*.g5e *.jpg *.png SGTA* PGTA*)</source>
-        <translation>Fichiers importables (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
+        <translation type="vanished">Fichiers importables (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="398"/>
         <source>All image files (*.jpg *.png)</source>
-        <translation>Tous les fichiers image (*.jpg *.png)</translation>
+        <translation type="vanished">Tous les fichiers image (*.jpg *.png)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="702"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <source>Can&apos;t import %1 because file can&apos;t be parsed properly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <source>Can&apos;t import %1 because file format can&apos;t be detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="778"/>
         <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source>
         <translation>Impossible d&apos;importer la photo Snapmatic,nom de fichier incorrect (PGTA*, *.g5e)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="707"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
         <source>Failed to import the Snapmatic picture, the picture is already in the game</source>
         <translation>Impossible d&apos;importer la photo Snapmatic, un fichier du même nom existe déjà</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
         <source>Failed to import the Snapmatic picture, can&apos;t copy the file into profile</source>
         <translation>Impossible d&apos;importer la photo Snapmatic, impossible de copier le fichier dans le profil</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="755"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
         <source>Failed to import the Savegame, can&apos;t copy the file into profile</source>
         <translation>Impossible d&apos;importer la sauvegarde, impossible de copier le fichier dans le profil</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Failed to import the Savegame, no Savegame slot is left</source>
         <translation>Impossible d&apos;importer la sauvegarde, aucun emplacement libre</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="824"/>
-        <location filename="../ProfileInterface.cpp" line="862"/>
-        <location filename="../ProfileInterface.cpp" line="939"/>
-        <location filename="../ProfileInterface.cpp" line="959"/>
+        <location filename="../ProfileInterface.cpp" line="900"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
         <source>Export selected</source>
         <translation>Exporter la sélection</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="847"/>
-        <location filename="../ProfileInterface.cpp" line="865"/>
+        <location filename="../ProfileInterface.cpp" line="923"/>
+        <location filename="../ProfileInterface.cpp" line="941"/>
         <source>JPG pictures and GTA Snapmatic</source>
         <translation>Images JPG et GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="848"/>
-        <location filename="../ProfileInterface.cpp" line="870"/>
+        <location filename="../ProfileInterface.cpp" line="924"/>
+        <location filename="../ProfileInterface.cpp" line="946"/>
         <source>JPG pictures only</source>
         <translation>Images JPG seulement</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="849"/>
-        <location filename="../ProfileInterface.cpp" line="874"/>
+        <location filename="../ProfileInterface.cpp" line="925"/>
+        <location filename="../ProfileInterface.cpp" line="950"/>
         <source>GTA Snapmatic only</source>
         <translation>GTA Snapmatic seulement</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="862"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
         <source>%1Export Snapmatic pictures%2&lt;br&gt;&lt;br&gt;JPG pictures make it possible to open the picture with a Image Viewer&lt;br&gt;GTA Snapmatic make it possible to import the picture into the game&lt;br&gt;&lt;br&gt;Export as:</source>
         <translation>%1Exporter les photos Snapmatic%2&lt;br&gt;&lt;br&gt;Les fichiers JPG permettent d&apos;ouvrir les photos avec une visionneuse d&apos;images&lt;br&gt;Les GTA Snapmatic permettent d&apos;importer les photos dans le jeu&lt;br&gt;&lt;br&gt;Exporter comme :</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="905"/>
+        <location filename="../ProfileInterface.cpp" line="983"/>
         <source>Export selected...</source>
         <translation>Exporter la sélection...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="906"/>
-        <source>Initializing export...</source>
-        <translation>Initialisation de l&apos;export...</translation>
+        <location filename="../ProfileInterface.cpp" line="984"/>
+        <source>Initialising export...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="939"/>
+        <source>Initializing export...</source>
+        <translation type="vanished">Initialisation de l&apos;export...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
         <source>Export failed with...
 
 %1</source>
@@ -898,36 +1115,36 @@ Appuyer sur 1 pour le mode par défaut</translation>
 %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="959"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>No Snapmatic pictures or Savegames files are selected</source>
         <translation>Aucun fichier de sauvegarde ou photo Snapmatic sélectionné</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
-        <location filename="../ProfileInterface.cpp" line="995"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>Remove selected</source>
         <translation>Supprimer la sélection</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
         <source>You really want remove the selected Snapmatic picutres and Savegame files?</source>
         <translation>Supprimer la sélection ?</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="995"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
         <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source>
         <translation>Impossible de supprimer la sélection</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="349"/>
+        <location filename="../UserInterface.cpp" line="363"/>
         <source>All profile files (*.g5e SGTA* PGTA*)</source>
         <translation>Tous les fichiers de profil (*.g5e SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="395"/>
-        <location filename="../UserInterface.cpp" line="350"/>
+        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../UserInterface.cpp" line="364"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
@@ -935,12 +1152,12 @@ Appuyer sur 1 pour le mode par défaut</translation>
 <context>
     <name>QApplication</name>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Font</source>
         <translation>Police</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Selected Font: %1</source>
         <translation>Police sélectionnée : %1</translation>
     </message>
@@ -954,17 +1171,17 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Gestionnaire de sauvegardes</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="29"/>
+        <location filename="../SavegameDialog.ui" line="23"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</source>
         <translation>&lt;span style=&quot; font-weight:600;&quot;&gt;Sauvegarde&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="63"/>
+        <location filename="../SavegameDialog.ui" line="70"/>
         <source>&amp;Export</source>
         <translation>&amp;Exporter</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="76"/>
+        <location filename="../SavegameDialog.ui" line="83"/>
         <source>&amp;Close</source>
         <translation>&amp;Fermer</translation>
     </message>
@@ -982,45 +1199,45 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Sauvegarde</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="64"/>
+        <location filename="../SavegameWidget.ui" line="67"/>
         <source>SAVE %3 - %1&lt;br&gt;%2</source>
         <translation>SAUVEGARDE %3 - %1&lt;br&gt;%2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="80"/>
+        <location filename="../SavegameWidget.ui" line="83"/>
         <source>View savegame</source>
         <translation>Voir la sauvegarde</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="83"/>
+        <location filename="../SavegameWidget.ui" line="86"/>
         <source>View</source>
         <translation>Voir</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="96"/>
+        <location filename="../SavegameWidget.ui" line="99"/>
         <source>Copy savegame</source>
         <translation>Copier la sauvegarde</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="99"/>
+        <location filename="../SavegameWidget.ui" line="102"/>
         <location filename="../SavegameCopy.cpp" line="48"/>
         <source>Export</source>
         <translation>Exporter</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="115"/>
-        <location filename="../SavegameWidget.cpp" line="139"/>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Delete savegame</source>
         <translation>Supprimer la sauvegarde</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.ui" line="121"/>
         <source>Delete</source>
         <translation>Supprimer</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1125"/>
+        <location filename="../ProfileInterface.cpp" line="1226"/>
         <source>&amp;Export</source>
         <translation>&amp;Exporter</translation>
     </message>
@@ -1068,69 +1285,69 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Exporter la sauvegarde...</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="64"/>
+        <location filename="../SavegameWidget.cpp" line="60"/>
+        <location filename="../SavegameWidget.cpp" line="117"/>
         <source>AUTOSAVE - %1
 %2</source>
         <translation>SAUVEGARDE AUTO - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="65"/>
+        <location filename="../SavegameWidget.cpp" line="61"/>
+        <location filename="../SavegameWidget.cpp" line="118"/>
         <source>SAVE %3 - %1
 %2</source>
         <translation>SAUVEGARDE %3 - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="101"/>
-        <location filename="../SavegameWidget.cpp" line="102"/>
+        <location filename="../SavegameWidget.cpp" line="89"/>
+        <location filename="../SavegameWidget.cpp" line="90"/>
         <source>WRONG FORMAT</source>
         <translation>Format invalide</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="125"/>
+        <location filename="../SavegameWidget.cpp" line="111"/>
         <source>UNKNOWN</source>
         <translation>Inconnu</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="139"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
         <source>Are you sure to delete %1 from your savegames?</source>
         <translation>Supprimer %1 ?</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Failed at deleting %1 from your savegames</source>
         <translation>Impossible de supprimer %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1124"/>
+        <location filename="../ProfileInterface.cpp" line="1225"/>
         <source>&amp;View</source>
         <translation>&amp;Voir</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1126"/>
+        <location filename="../ProfileInterface.cpp" line="1227"/>
         <source>&amp;Remove</source>
         <translation>&amp;Supprimer</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1130"/>
-        <location filename="../ProfileInterface.cpp" line="1141"/>
+        <location filename="../ProfileInterface.cpp" line="1229"/>
         <source>&amp;Select</source>
         <translation>&amp;Sélectionner</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1131"/>
+        <location filename="../ProfileInterface.cpp" line="1230"/>
         <source>&amp;Deselect</source>
         <translation>&amp;Déselectionner</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1132"/>
-        <location filename="../ProfileInterface.cpp" line="1142"/>
+        <location filename="../ProfileInterface.cpp" line="1233"/>
         <source>Select &amp;All</source>
         <translation>Sélectionner to&amp;ut</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1135"/>
+        <location filename="../ProfileInterface.cpp" line="1237"/>
         <source>&amp;Deselect All</source>
         <translation>&amp;Déselectionner tout</translation>
     </message>
@@ -1140,7 +1357,7 @@ Appuyer sur 1 pour le mode par défaut</translation>
     <message>
         <location filename="../SnapmaticEditor.ui" line="14"/>
         <location filename="../SnapmaticEditor.ui" line="81"/>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Snapmatic Properties</source>
         <translation>Propriétés Snapmatic</translation>
     </message>
@@ -1184,7 +1401,7 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Meme</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>Snapmatic Title</source>
         <translation>Titre Snapmatic</translation>
     </message>
@@ -1195,20 +1412,20 @@ Appuyer sur 1 pour le mode par défaut</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="113"/>
-        <location filename="../SnapmaticEditor.cpp" line="199"/>
+        <location filename="../SnapmaticEditor.cpp" line="200"/>
         <source>Crew: %1 (%2)</source>
         <translation>Crew : %1 (%2)</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="126"/>
-        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="185"/>
         <source>Title: %1 (%2)</source>
         <translation>Titre : %1 (%2)</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="136"/>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>Appropriate: %1</source>
         <translation>Valide : %1</translation>
     </message>
@@ -1238,42 +1455,42 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>A&amp;nnuler</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="183"/>
-        <location filename="../SnapmaticEditor.cpp" line="198"/>
+        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="199"/>
         <source>Edit</source>
         <translation>Éditer</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
         <source>Yes</source>
         <comment>Yes, should work fine</comment>
         <translatorcomment>Oui, devrait fonctionner</translatorcomment>
         <translation>Oui</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>No</source>
         <comment>No, could lead to issues</comment>
         <translatorcomment>Non, pourrait causer des erreurs</translatorcomment>
         <translation>Non</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Patching of Snapmatic Properties failed because of I/O Error</source>
         <translation>La modification des propriétés Snapmatic a échoué : erreur d&apos;entrée/sortie</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>New Snapmatic title:</source>
         <translation>Nouveau titre Snapmatic :</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>Snapmatic Crew</source>
         <translation>Crew Snapmatic</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>New Snapmatic crew:</source>
         <translation>Nouveau crew Snapmatic :</translation>
     </message>
@@ -1281,7 +1498,7 @@ Appuyer sur 1 pour le mode par défaut</translation>
 <context>
     <name>SnapmaticPicture</name>
     <message>
-        <location filename="../SnapmaticPicture.cpp" line="367"/>
+        <location filename="../SnapmaticPicture.cpp" line="411"/>
         <source>PHOTO - %1</source>
         <translation>PHOTO - %1</translation>
     </message>
@@ -1294,126 +1511,132 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation>Snapmatic</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="82"/>
+        <location filename="../SnapmaticWidget.ui" line="85"/>
         <source>PHOTO - 00/00/00 00:00:00</source>
         <translation>Photo - 00/00/00 00:00:00</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="98"/>
+        <location filename="../SnapmaticWidget.ui" line="101"/>
         <source>View picture</source>
         <translation>Voir la photo</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="101"/>
+        <location filename="../SnapmaticWidget.ui" line="104"/>
         <source>View</source>
         <translation>Voir</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="117"/>
+        <location filename="../SnapmaticWidget.ui" line="120"/>
         <source>Copy picture</source>
         <translation>Copier la photo</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="120"/>
+        <location filename="../SnapmaticWidget.ui" line="123"/>
         <source>Copy</source>
         <translation>Copier</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="133"/>
+        <location filename="../SnapmaticWidget.ui" line="136"/>
         <source>Export picture</source>
         <translation>Exporter la photo</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="136"/>
+        <location filename="../SnapmaticWidget.ui" line="139"/>
         <source>Export</source>
         <translation>Exporter</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="149"/>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Delete picture</source>
         <translation>Supprimer la photo</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.ui" line="155"/>
         <source>Delete</source>
         <translation>Supprimer</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
         <source>Are you sure to delete %1 from your Snapmatic pictures?</source>
         <translation>Supprimer %1 ?</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Failed at deleting %1 from your Snapmatic pictures</source>
         <translation>Impossible de supprimer %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1083"/>
+        <location filename="../ProfileInterface.cpp" line="1178"/>
         <source>Edi&amp;t</source>
         <translation>Édi&amp;ter</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1086"/>
+        <location filename="../ProfileInterface.cpp" line="1181"/>
         <source>Show &amp;In-game</source>
         <translation>&amp;Visible en jeu</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1090"/>
+        <location filename="../ProfileInterface.cpp" line="1185"/>
         <source>Hide &amp;In-game</source>
         <translation>&amp;Invisible en jeu</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1092"/>
+        <location filename="../ProfileInterface.cpp" line="1187"/>
         <source>&amp;Edit Properties...</source>
         <translation>Modifier les &amp;propriétés...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1093"/>
+        <location filename="../ProfileInterface.cpp" line="1188"/>
         <source>&amp;Export</source>
         <translation>&amp;Exporter</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1094"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Exporter comme image &amp;JPG...</translation>
+        <translation type="vanished">Exporter comme image &amp;JPG...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1189"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1095"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Exporter comme &amp;GTA Snapmatic...</translation>
+        <translation type="vanished">Exporter comme &amp;GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1096"/>
+        <location filename="../ProfileInterface.cpp" line="1190"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1191"/>
         <source>&amp;View</source>
         <translation>&amp;Voir</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1099"/>
+        <location filename="../ProfileInterface.cpp" line="1194"/>
         <source>&amp;Remove</source>
         <translation>S&amp;upprimer</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1103"/>
-        <location filename="../ProfileInterface.cpp" line="1114"/>
+        <location filename="../ProfileInterface.cpp" line="1196"/>
         <source>&amp;Select</source>
         <translation>&amp;Sélectionner</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1104"/>
+        <location filename="../ProfileInterface.cpp" line="1197"/>
         <source>&amp;Deselect</source>
         <translation>&amp;Déselectionner</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1105"/>
-        <location filename="../ProfileInterface.cpp" line="1115"/>
+        <location filename="../ProfileInterface.cpp" line="1200"/>
         <source>Select &amp;All</source>
         <translation>Sélectionner &amp;tout</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1108"/>
+        <location filename="../ProfileInterface.cpp" line="1204"/>
         <source>&amp;Deselect All</source>
         <translation>&amp;Déselectionner tout</translation>
     </message>
@@ -1436,31 +1659,42 @@ Appuyer sur 1 pour le mode par défaut</translation>
     </message>
     <message>
         <location filename="../UserInterface.ui" line="131"/>
+        <source>Reload profile overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="134"/>
         <source>&amp;Reload</source>
         <translation>&amp;Rafraîchir</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="147"/>
+        <location filename="../UserInterface.ui" line="150"/>
+        <source>Close %1</source>
+        <extracomment>Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="153"/>
         <source>&amp;Close</source>
         <translation>Fer&amp;mer</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="173"/>
+        <location filename="../UserInterface.ui" line="179"/>
         <source>&amp;File</source>
         <translation>&amp;Fichier</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="183"/>
+        <location filename="../UserInterface.ui" line="189"/>
         <source>&amp;Help</source>
         <translation>Ai&amp;de</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="189"/>
+        <location filename="../UserInterface.ui" line="195"/>
         <source>&amp;Edit</source>
         <translation>&amp;Éditer</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="195"/>
+        <location filename="../UserInterface.ui" line="201"/>
         <source>&amp;Profile</source>
         <translation>&amp;Profil</translation>
     </message>
@@ -1469,182 +1703,184 @@ Appuyer sur 1 pour le mode par défaut</translation>
         <translation type="vanished">&amp;À propos de gta5sync</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="223"/>
+        <location filename="../UserInterface.ui" line="229"/>
         <source>Ctrl+P</source>
         <translation>Ctrl+P</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="228"/>
+        <location filename="../UserInterface.ui" line="234"/>
         <source>&amp;Exit</source>
         <translation>&amp;Quitter</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="231"/>
+        <location filename="../UserInterface.ui" line="237"/>
         <source>Exit</source>
         <translation>Quitter</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="234"/>
+        <location filename="../UserInterface.ui" line="240"/>
         <source>Ctrl+Q</source>
         <translation>Ctrl+Q</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="239"/>
+        <location filename="../UserInterface.ui" line="245"/>
         <source>Close &amp;Profile</source>
         <translation>Fermer le &amp;profil</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="242"/>
+        <location filename="../UserInterface.ui" line="248"/>
         <source>Ctrl+End</source>
         <translation>Ctrl + Fin</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="247"/>
+        <location filename="../UserInterface.ui" line="253"/>
         <source>&amp;Settings</source>
         <translation>Paramètre&amp;s</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="250"/>
+        <location filename="../UserInterface.ui" line="256"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="255"/>
+        <location filename="../UserInterface.ui" line="261"/>
         <source>Select &amp;All</source>
         <translation>Sélectionner &amp;tout</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="258"/>
+        <location filename="../UserInterface.ui" line="264"/>
         <source>Ctrl+A</source>
         <translation>Ctrl+A</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="263"/>
+        <location filename="../UserInterface.ui" line="269"/>
         <source>&amp;Deselect All</source>
         <translation>&amp;Désélectionner tout</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="266"/>
+        <location filename="../UserInterface.ui" line="272"/>
         <source>Ctrl+D</source>
         <translation>Ctrl+D</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="271"/>
+        <location filename="../UserInterface.ui" line="277"/>
         <source>&amp;Export selected...</source>
         <translation>&amp;Exporter la sélection...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="274"/>
+        <location filename="../UserInterface.ui" line="280"/>
         <source>Ctrl+E</source>
         <translation>Ctrl+E</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="279"/>
+        <location filename="../UserInterface.ui" line="285"/>
         <source>&amp;Remove selected</source>
         <translation>&amp;Supprimer la sélection</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="282"/>
+        <location filename="../UserInterface.ui" line="288"/>
         <source>Ctrl+Del</source>
         <translation>Ctrl+Del</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="287"/>
+        <location filename="../UserInterface.ui" line="293"/>
         <source>&amp;Import files...</source>
         <translation>&amp;Importer...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="290"/>
+        <location filename="../UserInterface.ui" line="296"/>
         <source>Ctrl+I</source>
         <translation>Ctrl+I</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="295"/>
+        <location filename="../UserInterface.ui" line="301"/>
         <source>&amp;Open File...</source>
         <translation>&amp;Ouvrir...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="298"/>
+        <location filename="../UserInterface.ui" line="304"/>
         <source>Ctrl+O</source>
         <translation>Ctrl+O</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="303"/>
-        <location filename="../UserInterface.cpp" line="151"/>
+        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.cpp" line="163"/>
         <source>Select &amp;GTA V Folder...</source>
         <translation>Modifier l&apos;emplacement de &amp;GTA V...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="306"/>
-        <location filename="../OptionsDialog.cpp" line="452"/>
-        <location filename="../UserInterface.cpp" line="99"/>
-        <location filename="../UserInterface.cpp" line="495"/>
+        <location filename="../UserInterface.ui" line="312"/>
+        <location filename="../OptionsDialog.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="104"/>
+        <location filename="../UserInterface.cpp" line="513"/>
         <source>Select GTA V Folder...</source>
         <translation>Modifier l&apos;emplacement de GTA V...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.ui" line="315"/>
         <source>Ctrl+G</source>
         <translation>Ctrl+G</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="314"/>
+        <location filename="../UserInterface.ui" line="320"/>
         <source>Show In-gam&amp;e</source>
         <translation>Rendre visible &amp;en jeu</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="317"/>
+        <location filename="../UserInterface.ui" line="323"/>
         <source>Shift+E</source>
         <translation>Shift+E</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="199"/>
+        <location filename="../UserInterface.ui" line="205"/>
         <source>&amp;Selection visibility</source>
         <translation>&amp;Visibilité de la sélection</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="322"/>
+        <location filename="../UserInterface.ui" line="328"/>
         <source>Hi&amp;de In-game</source>
         <translation>Ren&amp;dre invisible en jeu</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="325"/>
+        <location filename="../UserInterface.ui" line="331"/>
         <source>Shift+D</source>
         <translation>Shift+D</translation>
     </message>
     <message>
         <location filename="../UserInterface.ui" line="20"/>
-        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="62"/>
         <source>%2 - %1</source>
         <translation>%2 - %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="220"/>
-        <location filename="../UserInterface.cpp" line="59"/>
+        <location filename="../UserInterface.ui" line="226"/>
+        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="542"/>
         <source>&amp;About %1</source>
         <translation>&amp;À propos de %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="62"/>
-        <location filename="../UserInterface.cpp" line="220"/>
+        <location filename="../UserInterface.cpp" line="64"/>
+        <location filename="../UserInterface.cpp" line="234"/>
+        <location filename="../UserInterface.cpp" line="550"/>
         <source>Select Profile</source>
         <translation>Sélectionner un profil</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="346"/>
+        <location filename="../UserInterface.cpp" line="360"/>
         <source>Open File...</source>
         <translation>Ouvrir...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="393"/>
-        <location filename="../UserInterface.cpp" line="409"/>
-        <location filename="../UserInterface.cpp" line="436"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>Open File</source>
         <translation>Ouvrir</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="436"/>
+        <location filename="../UserInterface.cpp" line="450"/>
         <source>Can&apos;t open %1 because of not valid file format</source>
         <translation>Impossible d&apos;ouvrir %1, format invalide</translation>
     </message>
diff --git a/res/gta5sync_ru.qm b/res/gta5sync_ru.qm
index 6a271c0..ebb1842 100644
Binary files a/res/gta5sync_ru.qm and b/res/gta5sync_ru.qm differ
diff --git a/res/gta5sync_ru.ts b/res/gta5sync_ru.ts
index 3a3e584..1518d41 100644
--- a/res/gta5sync_ru.ts
+++ b/res/gta5sync_ru.ts
@@ -71,43 +71,63 @@ Running with Qt %6&lt;br/&gt;
         <translation type="obsolete">Закрыть</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="40"/>
         <source>Using %1 %2</source>
         <comment>Exp. Using libmyfuck</comment>
-        <translation>Использует %1 %2</translation>
+        <translation type="vanished">Использует %1 %2</translation>
+    </message>
+    <message>
+        <source>Translated by %1</source>
+        <comment>Exp. Translated by Syping</comment>
+        <translation type="vanished">Перевёл %1</translation>
+    </message>
+    <message>
+        <source>NAME_OF_TRANSLATOR</source>
+        <comment>Your Name (The person behind your screen looking at this text!)</comment>
+        <translation type="vanished">VADemon</translation>
+    </message>
+    <message>
+        <source>TRANSLATOR_PROFILE</source>
+        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <translation type="vanished">https://github.com/VADemon/</translation>
     </message>
     <message>
         <location filename="../AboutDialog.cpp" line="41"/>
-        <source>Translated by %1</source>
-        <comment>Exp. Translated by Syping</comment>
-        <translation>Перевёл %1</translation>
-    </message>
-    <message>
-        <location filename="../AboutDialog.cpp" line="42"/>
-        <source>NAME_OF_TRANSLATOR</source>
-        <comment>Your Name (The person behind your screen looking at this text!)</comment>
-        <translation>VADemon</translation>
+        <source>Using %1 %2</source>
+        <extracomment>Using specific library, example Using libmyfuck</extracomment>
+        <translation>Использует %1 %2</translation>
     </message>
     <message>
         <location filename="../AboutDialog.cpp" line="43"/>
+        <source>Translated by %1</source>
+        <extracomment>Translated by translator, example Translated by Syping</extracomment>
+        <translation>Перевёл %1</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="45"/>
+        <source>NAME_OF_TRANSLATOR</source>
+        <extracomment>Enter your name there</extracomment>
+        <translation>VADemon</translation>
+    </message>
+    <message>
+        <location filename="../AboutDialog.cpp" line="47"/>
         <source>TRANSLATOR_PROFILE</source>
-        <comment>mailto: http:// https:// Exp. https://github.com/Syping/</comment>
+        <extracomment>Enter your proilfe there, example a GitHub profile, E-Mail with &quot;mailto: afucker@sumfuck.com&quot; or a webpage</extracomment>
         <translation>https://github.com/VADemon/</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="64"/>
+        <location filename="../AboutDialog.cpp" line="80"/>
         <source>A project for viewing Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Проект для просмотра Grand Theft Auto V Snapmatic&lt;br/&gt;
 картинок и сохранений</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="68"/>
+        <location filename="../AboutDialog.cpp" line="84"/>
         <source>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</source>
         <translation>Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="70"/>
+        <location filename="../AboutDialog.cpp" line="86"/>
         <source>%1 is licensed under &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</source>
         <translation>%1 под лицензией &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
@@ -116,17 +136,47 @@ Pictures and Savegames</source>
         <translation type="vanished">Copyright &amp;copy; &lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt; %3&lt;br/&gt;%4 под лицензией &lt;a href=&quot;https://www.gnu.org/licenses/gpl-3.0.html#content&quot;&gt;GNU GPLv3&lt;/a&gt;</translation>
     </message>
     <message>
-        <location filename="../AboutDialog.cpp" line="62"/>
+        <location filename="../AboutDialog.cpp" line="78"/>
         <source>A project for viewing and sync Grand Theft Auto V Snapmatic&lt;br/&gt;
 Pictures and Savegames</source>
         <translation>Проект для просмотра и синхронизирования &lt;br/&gt;
 Grand Theft Auto V Snapmatic картинок и сохранений</translation>
     </message>
+    <message>
+        <location filename="../config.h" line="62"/>
+        <source>Release</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="68"/>
+        <source>Release Candidate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="74"/>
+        <source>Daily Build</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="80"/>
+        <source>Developer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="86"/>
+        <source>Beta</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../config.h" line="92"/>
+        <source>Alpha</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CrewDatabase</name>
     <message>
-        <location filename="../CrewDatabase.cpp" line="64"/>
+        <location filename="../CrewDatabase.cpp" line="102"/>
         <source>No Crew</source>
         <translation>Вне банды</translation>
     </message>
@@ -208,31 +258,88 @@ Grand Theft Auto V Snapmatic картинок и сохранений</translati
         <translation>Настройки</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="96"/>
         <source>&amp;Keep Aspect Ratio</source>
-        <translation>О&amp;ставить соотношение сторон</translation>
+        <translation type="vanished">О&amp;ставить соотношение сторон</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="103"/>
         <source>&amp;Ignore Aspect Ratio</source>
-        <translation>&amp;Игнорировать соотношение сторон</translation>
+        <translation type="vanished">&amp;Игнорировать соотношение сторон</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="110"/>
         <source>&amp;Avatar</source>
-        <translation>&amp;Аватар</translation>
+        <translation type="vanished">&amp;Аватар</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="154"/>
+        <source>Keep Aspect Ratio</source>
+        <translation type="vanished">Оставить соотношение сторон</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="148"/>
+        <source>Ignore Aspect Ratio</source>
+        <translation>Игнорировать соотношение сторон</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="135"/>
+        <source>Avatar</source>
+        <translation>Аватар</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="98"/>
+        <location filename="../ImportDialog.cpp" line="57"/>
+        <location filename="../ImportDialog.cpp" line="216"/>
+        <source>Background Colour: &lt;span style=&quot;color: %1&quot;&gt;%1&lt;/span&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="105"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="194"/>
+        <source>Import picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="197"/>
         <source>&amp;OK</source>
         <translation>&amp;ОК</translation>
     </message>
     <message>
-        <location filename="../ImportDialog.ui" line="167"/>
+        <location filename="../ImportDialog.ui" line="210"/>
+        <source>Discard picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.ui" line="213"/>
         <source>&amp;Cancel</source>
         <translatorcomment>Я не уверен насчет горячих клавиш...</translatorcomment>
         <translation>От&amp;мена</translation>
     </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Are you sure to use a square image outside of the Avatar Zone?
+When you want to use it as Avatar the image will be detached!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="173"/>
+        <source>Snapmatic Avatar Zone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ImportDialog.cpp" line="212"/>
+        <source>Select Colour...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MapPreviewDialog</name>
+    <message>
+        <location filename="../MapPreviewDialog.ui" line="26"/>
+        <source>Snapmatic Map Viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>OptionsDialog</name>
@@ -385,56 +492,78 @@ Grand Theft Auto V Snapmatic картинок и сохранений</translati
     </message>
     <message>
         <location filename="../OptionsDialog.ui" line="463"/>
+        <source>Apply changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="466"/>
         <source>&amp;OK</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>&amp;ОК</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.ui" line="476"/>
+        <location filename="../OptionsDialog.ui" line="479"/>
+        <source>Discard changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.ui" line="482"/>
         <source>&amp;Cancel</source>
         <extracomment>OK, Cancel, Apply</extracomment>
         <translation>От&amp;мена</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
         <source>System</source>
         <comment>System like PC System</comment>
         <translatorcomment>может быть надо прилагательное</translatorcomment>
+        <translation type="vanished">Система</translation>
+    </message>
+    <message>
+        <source>%1 (%2 if available)</source>
+        <comment>System like PC System = %1, System Language like Deutsch = %2</comment>
+        <translation type="vanished">%1 (%2 если имеется)</translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>%1 (Next Closest Language)</source>
+        <comment>First language a person can talk with a different person/application. &quot;Native&quot; or &quot;Not Native&quot;.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../OptionsDialog.cpp" line="132"/>
+        <source>System</source>
+        <comment>System in context of System default</comment>
         <translation>Система</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="133"/>
-        <source>%1 (%2 if available)</source>
-        <comment>System like PC System = %1, System Language like Deutsch = %2</comment>
-        <translation>%1 (%2 если имеется)</translation>
-    </message>
-    <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
-        <location filename="../OptionsDialog.cpp" line="296"/>
+        <location filename="../OptionsDialog.cpp" line="289"/>
         <source>%1</source>
         <comment>%1</comment>
         <translation>%1</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="292"/>
+        <location filename="../OptionsDialog.cpp" line="289"/>
+        <source>The new Custom Folder will initialise after you restart %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>The new Custom Folder will initialize after you restart %1.</source>
-        <translation>Другая папка будет загружена после перезапуска %1.</translation>
+        <translation type="vanished">Другая папка будет загружена после перезапуска %1.</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="296"/>
         <source>The language change will take effect after you restart %1.</source>
-        <translation>Язык изменится после перезапуска %1.</translation>
+        <translation type="vanished">Язык изменится после перезапуска %1.</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="306"/>
+        <location filename="../OptionsDialog.cpp" line="299"/>
         <source>No Profile</source>
         <comment>No Profile, as default</comment>
         <translation>Нет профиля</translation>
     </message>
     <message>
-        <location filename="../OptionsDialog.cpp" line="314"/>
-        <location filename="../OptionsDialog.cpp" line="318"/>
-        <location filename="../OptionsDialog.cpp" line="320"/>
+        <location filename="../OptionsDialog.cpp" line="307"/>
+        <location filename="../OptionsDialog.cpp" line="311"/>
+        <location filename="../OptionsDialog.cpp" line="313"/>
         <source>Profile: %1</source>
         <translation>Профиль: %1</translation>
     </message>
@@ -457,7 +586,7 @@ Grand Theft Auto V Snapmatic картинок и сохранений</translati
 &lt;span style=&quot; font-weight:600;&quot;&gt;ID группы: &lt;/span&gt;%5</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="104"/>
+        <location filename="../PictureDialog.ui" line="117"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Title: &lt;/span&gt;%6&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Location: &lt;/span&gt;%7 (%1, %2, %3)&lt;br/&gt;
 &lt;span style=&quot; font-weight:600;&quot;&gt;Players: &lt;/span&gt;%4 (Crew %5)&lt;br/&gt;
@@ -468,23 +597,36 @@ Grand Theft Auto V Snapmatic картинок и сохранений</translati
 &lt;span style=&quot; font-weight:600;&quot;&gt;Сделано: &lt;/span&gt;%8</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="164"/>
         <source>Export picture</source>
-        <translation>Экспорт картинки</translation>
+        <translation type="vanished">Экспорт картинки</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="180"/>
+        <source>&amp;Manage</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="167"/>
         <source>&amp;Export</source>
-        <translation>&amp;Экспорт</translation>
+        <translation type="vanished">&amp;Экспорт</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="189"/>
+        <location filename="../PictureDialog.ui" line="177"/>
+        <source>Manage picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="199"/>
+        <source>Close viewer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.ui" line="202"/>
         <source>&amp;Close</source>
         <translation>&amp;Закрыть</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="89"/>
-        <location filename="../PictureExport.cpp" line="221"/>
+        <location filename="../PictureExport.cpp" line="91"/>
+        <location filename="../PictureExport.cpp" line="223"/>
         <source>Export</source>
         <translation>Экспортировать</translation>
     </message>
@@ -493,22 +635,43 @@ Grand Theft Auto V Snapmatic картинок и сохранений</translati
         <translation type="obsolete">Копировать</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.ui" line="186"/>
         <source>Close</source>
-        <translation>Закрыть</translation>
+        <translation type="vanished">Закрыть</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="141"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Эксп&amp;ортировать как картинку JPG...</translation>
+        <translation type="vanished">Эксп&amp;ортировать как картинку JPG...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="145"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="142"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Экс&amp;портировать как GTA Snapmatic...</translation>
+        <translation type="vanished">Экс&amp;портировать как GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="358"/>
+        <location filename="../PictureDialog.cpp" line="146"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edi&amp;t</source>
+        <translation type="obsolete">&amp;Правка</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="148"/>
+        <source>Open &amp;Map View...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="150"/>
+        <source>&amp;Edit Properties...</source>
+        <translation type="unfinished">&amp;Изменить свойства...</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="373"/>
         <source>Key 1 - Avatar Preview Mode
 Key 2 - Toggle Overlay
 Arrow Keys - Navigate</source>
@@ -517,101 +680,130 @@ Arrow Keys - Navigate</source>
 Стрелки - Навигация</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Snapmatic Picture Viewer</source>
         <translation>Просмотрщик фотографий Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="417"/>
-        <location filename="../PictureDialog.cpp" line="489"/>
+        <location filename="../PictureDialog.cpp" line="433"/>
+        <location filename="../PictureDialog.cpp" line="476"/>
         <source>Failed at %1</source>
         <translation>Ошибка при %1</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="572"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="589"/>
+        <source>No Crew</source>
+        <translation>Вне банды</translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="475"/>
+        <location filename="../PictureDialog.cpp" line="614"/>
+        <source>No Players</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureDialog.cpp" line="560"/>
         <source>Avatar Preview Mode
 Press 1 for Default View</source>
         <translation>Режим просмотра аватарок
 Нажмите 1 для стандартного просмотра</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="478"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No player</source>
-        <translation>Игроков нет</translation>
+        <translation type="vanished">Игроков нет</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="481"/>
-        <location filename="../PictureDialog.cpp" line="488"/>
         <source>No crew</source>
-        <translation>Без группы</translation>
+        <translation type="vanished">Без группы</translation>
     </message>
     <message>
-        <location filename="../PictureDialog.cpp" line="488"/>
+        <location filename="../PictureDialog.cpp" line="475"/>
         <source>Unknown Location</source>
         <translation>Неизвестное место</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="88"/>
         <source>Export as JPG picture...</source>
-        <translation>Экспортировать картинкой JPG...</translation>
+        <translation type="vanished">Экспортировать картинкой JPG...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="92"/>
         <source>JPEG picture (*.jpg)</source>
-        <translation>Картинка JPEG (*.jpg)</translation>
+        <translation type="vanished">Картинка JPEG (*.jpg)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="93"/>
+        <location filename="../PictureExport.cpp" line="95"/>
         <source>Portable Network Graphics (*.png)</source>
         <translation>Картинка Portable Network Graphics (*.png)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="187"/>
         <source>Export as JPG picture</source>
-        <translation>Экспортировать как картинку JPG</translation>
+        <translation type="vanished">Экспортировать как картинку JPG</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="143"/>
-        <location filename="../PictureExport.cpp" line="246"/>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="260"/>
         <source>Overwrite %1 with current Snapmatic picture?</source>
         <translation>Перезаписать %1 текущей картинкой Snapmatic?</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="246"/>
-        <location filename="../PictureExport.cpp" line="250"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
-        <location filename="../PictureExport.cpp" line="291"/>
-        <location filename="../PictureExport.cpp" line="297"/>
         <source>Export as GTA Snapmatic</source>
-        <translation>Экспортировать как GTA Snapmatic</translation>
+        <translation type="vanished">Экспортировать как GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="147"/>
-        <location filename="../PictureExport.cpp" line="250"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="264"/>
         <source>Failed to overwrite %1 with current Snapmatic picture</source>
         <translation>Не удалось перезаписать %1 картинкой Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="181"/>
-        <location filename="../PictureExport.cpp" line="265"/>
-        <location filename="../PictureExport.cpp" line="286"/>
+        <location filename="../PictureExport.cpp" line="90"/>
+        <source>Export as Picture...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="94"/>
+        <source>JPEG Graphics (*.jpg *.jpeg)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="145"/>
+        <location filename="../PictureExport.cpp" line="149"/>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <source>Export as Picture</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="183"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
         <source>Failed to export current Snapmatic picture</source>
         <translation>Не удалось экспортировать текущую картинку Snapmatic</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="291"/>
+        <location filename="../PictureExport.cpp" line="222"/>
+        <source>Export as Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="260"/>
+        <location filename="../PictureExport.cpp" line="264"/>
+        <location filename="../PictureExport.cpp" line="279"/>
+        <location filename="../PictureExport.cpp" line="288"/>
+        <location filename="../PictureExport.cpp" line="293"/>
+        <location filename="../PictureExport.cpp" line="299"/>
+        <source>Export as Snapmatic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../PictureExport.cpp" line="293"/>
         <source>Exported Snapmatic to &quot;%1&quot; because of using the .auto extension.</source>
         <translation>Snapmatic был экспортирован как &quot;%1&quot; из-за расширеня файла.</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="187"/>
-        <location filename="../PictureExport.cpp" line="297"/>
+        <location filename="../PictureExport.cpp" line="189"/>
+        <location filename="../PictureExport.cpp" line="299"/>
         <source>No valid file is selected</source>
         <translation>Выбранный файл неверен</translation>
     </message>
@@ -620,22 +812,21 @@ Press 1 for Default View</source>
         <translation type="obsolete">Скопировать картинку</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="220"/>
         <source>Export as GTA Snapmatic...</source>
-        <translation>Экспортировать как GTA Snapmatic...</translation>
+        <translation type="vanished">Экспортировать как GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="224"/>
+        <location filename="../PictureExport.cpp" line="226"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="225"/>
+        <location filename="../PictureExport.cpp" line="227"/>
         <source>GTA V Raw Export (*.auto)</source>
         <translation>GTA V Экспорт Исходника (*.auto)</translation>
     </message>
     <message>
-        <location filename="../PictureExport.cpp" line="226"/>
+        <location filename="../PictureExport.cpp" line="228"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Картинки Snapmatic (PGTA*)</translation>
     </message>
@@ -661,27 +852,31 @@ Press 1 for Default View</source>
         <translation>Загружается файл %1 из %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="169"/>
+        <location filename="../ProfileInterface.ui" line="172"/>
         <source>%1 %2</source>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="195"/>
-        <source>Import exported file</source>
-        <translation>Импортировать экспортированный файл</translation>
+        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import file</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="198"/>
+        <source>Import exported file</source>
+        <translation type="vanished">Импортировать экспортированный файл</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.ui" line="201"/>
         <source>&amp;Import...</source>
         <translation>&amp;Импортировать...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="214"/>
+        <location filename="../ProfileInterface.ui" line="217"/>
         <source>Close profile</source>
         <translation>Закрыть профиль</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.ui" line="217"/>
+        <location filename="../ProfileInterface.ui" line="220"/>
         <source>&amp;Close</source>
         <translation>&amp;Закрыть</translation>
     </message>
@@ -694,29 +889,30 @@ Press 1 for Default View</source>
         <translation type="obsolete">Закрыть профиль</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="114"/>
+        <location filename="../ProfileInterface.cpp" line="129"/>
         <source>Loading...</source>
         <translation>Загрузка...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="390"/>
-        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="426"/>
+        <location filename="../ProfileInterface.cpp" line="491"/>
         <source>Import...</source>
         <translation>Импортировать...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="391"/>
-        <location filename="../ProfileInterface.cpp" line="481"/>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../ProfileInterface.cpp" line="679"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../ProfileInterface.cpp" line="702"/>
-        <location filename="../ProfileInterface.cpp" line="707"/>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="427"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../ProfileInterface.cpp" line="674"/>
         <location filename="../ProfileInterface.cpp" line="755"/>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../ProfileInterface.cpp" line="778"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Import</source>
         <translation>Импортировать</translation>
     </message>
@@ -725,31 +921,31 @@ Press 1 for Default View</source>
         <translation type="vanished">Все файлы профиля (SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="396"/>
-        <location filename="../UserInterface.cpp" line="351"/>
+        <location filename="../ProfileInterface.cpp" line="444"/>
+        <location filename="../UserInterface.cpp" line="365"/>
         <source>Savegames files (SGTA*)</source>
         <translation>Файлы сохранения (SGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="397"/>
-        <location filename="../UserInterface.cpp" line="352"/>
+        <location filename="../ProfileInterface.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="366"/>
         <source>Snapmatic pictures (PGTA*)</source>
         <translation>Картинка Snapmatic (PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="399"/>
-        <location filename="../UserInterface.cpp" line="353"/>
+        <location filename="../ProfileInterface.cpp" line="447"/>
+        <location filename="../UserInterface.cpp" line="367"/>
         <source>All files (**)</source>
         <translation>Все файлы (**)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="428"/>
-        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../ProfileInterface.cpp" line="492"/>
+        <location filename="../ProfileInterface.cpp" line="507"/>
         <source>Import file %1 of %2 files</source>
         <translation>Импортируются файлы %1 из %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="481"/>
+        <location filename="../ProfileInterface.cpp" line="522"/>
         <source>Import failed with...
 
 %1</source>
@@ -758,107 +954,129 @@ Press 1 for Default View</source>
 %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="513"/>
-        <location filename="../UserInterface.cpp" line="393"/>
+        <location filename="../ProfileInterface.cpp" line="542"/>
+        <location filename="../UserInterface.cpp" line="407"/>
         <source>Failed to read Snapmatic picture</source>
         <translation>Не удалось загрузить картинку Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="529"/>
-        <location filename="../UserInterface.cpp" line="409"/>
+        <location filename="../ProfileInterface.cpp" line="558"/>
+        <location filename="../UserInterface.cpp" line="423"/>
         <source>Failed to read Savegame file</source>
         <translation>Не удалось загрузить файл сохранения</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="679"/>
         <source>Can&apos;t import %1 because of not valid file format</source>
-        <translation>Не получилось импортировать %1 из-за неправильного формата файла</translation>
+        <translation type="vanished">Не получилось импортировать %1 из-за неправильного формата файла</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="486"/>
-        <location filename="../ProfileInterface.cpp" line="684"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../ProfileInterface.cpp" line="470"/>
+        <location filename="../ProfileInterface.cpp" line="760"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>No valid file is selected</source>
         <translation>Выбранный файл неверен</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="62"/>
+        <location filename="../ProfileInterface.cpp" line="65"/>
         <source>Enabled pictures: %1 of %2</source>
         <translation>Включенные картинки: %1 из %2</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="394"/>
         <source>Importable files (*.g5e *.jpg *.png SGTA* PGTA*)</source>
-        <translation>Подходящие для импорта файлы (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
+        <translation type="vanished">Подходящие для импорта файлы (*.g5e *.jpg *.png SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="398"/>
         <source>All image files (*.jpg *.png)</source>
-        <translation>Все изображения (*.jpg *.png)</translation>
+        <translation type="vanished">Все изображения (*.jpg *.png)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="702"/>
+        <location filename="../ProfileInterface.cpp" line="442"/>
+        <source>Importable files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="446"/>
+        <source>All image files (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="674"/>
+        <source>Can&apos;t import %1 because file can&apos;t be parsed properly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="755"/>
+        <source>Can&apos;t import %1 because file format can&apos;t be detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="778"/>
         <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source>
         <translation>Не удалось импортировать картинку Snapmatic, название не начинается с PGTA или не заканчивается с .g5e</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="707"/>
+        <location filename="../ProfileInterface.cpp" line="783"/>
         <source>Failed to import the Snapmatic picture, the picture is already in the game</source>
         <translation>Не удалось импортировать картинку Snapmatic, картинка уже в игре</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="718"/>
+        <location filename="../ProfileInterface.cpp" line="794"/>
         <source>Failed to import the Snapmatic picture, can&apos;t copy the file into profile</source>
         <translation>Не удалось импортировать картинку Snapmatic, не получилось скопировать файл в профиль</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="755"/>
+        <location filename="../ProfileInterface.cpp" line="831"/>
         <source>Failed to import the Savegame, can&apos;t copy the file into profile</source>
         <translation>Не удалось импортировать сохранение, не получилось скопировать файл в профиль</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="761"/>
+        <location filename="../ProfileInterface.cpp" line="837"/>
         <source>Failed to import the Savegame, no Savegame slot is left</source>
         <translation>Не удалось импортировать сохранение, нет пустых ячеек под сохранения</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="847"/>
-        <location filename="../ProfileInterface.cpp" line="865"/>
+        <location filename="../ProfileInterface.cpp" line="923"/>
+        <location filename="../ProfileInterface.cpp" line="941"/>
         <source>JPG pictures and GTA Snapmatic</source>
         <translation>Картинки JPG и GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="848"/>
-        <location filename="../ProfileInterface.cpp" line="870"/>
+        <location filename="../ProfileInterface.cpp" line="924"/>
+        <location filename="../ProfileInterface.cpp" line="946"/>
         <source>JPG pictures only</source>
         <translation>Только картинки JPG</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="849"/>
-        <location filename="../ProfileInterface.cpp" line="874"/>
+        <location filename="../ProfileInterface.cpp" line="925"/>
+        <location filename="../ProfileInterface.cpp" line="950"/>
         <source>GTA Snapmatic only</source>
         <translation>Только GTA Snapmatic</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="959"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="984"/>
+        <source>Initialising export...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>No Snapmatic pictures or Savegames files are selected</source>
         <translation>Не выделены ни один Snapmatic или сохранение</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
-        <location filename="../ProfileInterface.cpp" line="995"/>
-        <location filename="../ProfileInterface.cpp" line="1001"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
+        <location filename="../ProfileInterface.cpp" line="1079"/>
         <source>Remove selected</source>
         <translation>Снять выделение</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="967"/>
+        <location filename="../ProfileInterface.cpp" line="1045"/>
         <source>You really want remove the selected Snapmatic picutres and Savegame files?</source>
         <translation>Точно ли хочешь удалить выбранные картинки Snapmatic и файлы сохранений?</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="995"/>
+        <location filename="../ProfileInterface.cpp" line="1073"/>
         <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source>
         <translation>Не удалось удалить полностью выбранные картинки Snapmatic и/или файлы сохранений</translation>
     </message>
@@ -879,30 +1097,29 @@ Press 1 for Default View</source>
         <translation type="obsolete">Не получилось имортировать копию сохранения, потому что не осталось свободных под них слотов</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="824"/>
-        <location filename="../ProfileInterface.cpp" line="862"/>
-        <location filename="../ProfileInterface.cpp" line="939"/>
-        <location filename="../ProfileInterface.cpp" line="959"/>
+        <location filename="../ProfileInterface.cpp" line="900"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
+        <location filename="../ProfileInterface.cpp" line="1037"/>
         <source>Export selected</source>
         <translation>Экспортировать выделенное</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="862"/>
+        <location filename="../ProfileInterface.cpp" line="938"/>
         <source>%1Export Snapmatic pictures%2&lt;br&gt;&lt;br&gt;JPG pictures make it possible to open the picture with a Image Viewer&lt;br&gt;GTA Snapmatic make it possible to import the picture into the game&lt;br&gt;&lt;br&gt;Export as:</source>
         <translation>%1Эскпортировать картинки Snapmatic%2&lt;br&gt;&lt;br&gt;Картинки JPG можно открыть любым просмотрщиком&lt;br&gt;Картинки формата GTA Snapmatic можно снова импортировать в игру&lt;br&gt;&lt;br&gt;Экспортировать как:</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="905"/>
+        <location filename="../ProfileInterface.cpp" line="983"/>
         <source>Export selected...</source>
         <translation>Экпортировать выделенное...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="906"/>
         <source>Initializing export...</source>
-        <translation>Подготавливаю эскпорт...</translation>
+        <translation type="vanished">Подготавливаю эскпорт...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="939"/>
+        <location filename="../ProfileInterface.cpp" line="1017"/>
         <source>Export failed with...
 
 %1</source>
@@ -911,20 +1128,20 @@ Press 1 for Default View</source>
 %1</translation>
     </message>
     <message>
-        <location filename="../ExportThread.cpp" line="96"/>
-        <location filename="../ExportThread.cpp" line="135"/>
-        <location filename="../ExportThread.cpp" line="156"/>
+        <location filename="../ExportThread.cpp" line="97"/>
+        <location filename="../ExportThread.cpp" line="136"/>
+        <location filename="../ExportThread.cpp" line="157"/>
         <source>Export file %1 of %2 files</source>
         <translation>Экспортируется файл %1 из %2</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="349"/>
+        <location filename="../UserInterface.cpp" line="363"/>
         <source>All profile files (*.g5e SGTA* PGTA*)</source>
         <translation>Все файлы профиля (*.g5e SGTA* PGTA*)</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="395"/>
-        <location filename="../UserInterface.cpp" line="350"/>
+        <location filename="../ProfileInterface.cpp" line="443"/>
+        <location filename="../UserInterface.cpp" line="364"/>
         <source>GTA V Export (*.g5e)</source>
         <translation>GTA V Export (*.g5e)</translation>
     </message>
@@ -932,12 +1149,12 @@ Press 1 for Default View</source>
 <context>
     <name>QApplication</name>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Font</source>
         <translation>Шрифт</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="68"/>
+        <location filename="../main.cpp" line="66"/>
         <source>Selected Font: %1</source>
         <translation>Выбранный шрифт: %1</translation>
     </message>
@@ -951,17 +1168,17 @@ Press 1 for Default View</source>
         <translation>Просмотрщик сохранений</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="29"/>
+        <location filename="../SavegameDialog.ui" line="23"/>
         <source>&lt;span style=&quot; font-weight:600;&quot;&gt;Savegame&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</source>
         <translation>&lt;span style=&quot; font-weight:600;&quot;&gt;Сохранение&lt;/span&gt;&lt;br&gt;&lt;br&gt;%1</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="63"/>
+        <location filename="../SavegameDialog.ui" line="70"/>
         <source>&amp;Export</source>
         <translation>&amp;Экспорт</translation>
     </message>
     <message>
-        <location filename="../SavegameDialog.ui" line="76"/>
+        <location filename="../SavegameDialog.ui" line="83"/>
         <source>&amp;Close</source>
         <translation>&amp;Закрыть</translation>
     </message>
@@ -991,17 +1208,17 @@ Press 1 for Default View</source>
         <translation type="vanished">Третий путь (100%) - 00/00/00 00:00:00</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="80"/>
+        <location filename="../SavegameWidget.ui" line="83"/>
         <source>View savegame</source>
         <translation>Просмотреть сохранение</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="83"/>
+        <location filename="../SavegameWidget.ui" line="86"/>
         <source>View</source>
         <translation>Просмотр</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="99"/>
+        <location filename="../SavegameWidget.ui" line="102"/>
         <location filename="../SavegameCopy.cpp" line="48"/>
         <source>Export</source>
         <translation>Экспорт</translation>
@@ -1011,14 +1228,14 @@ Press 1 for Default View</source>
         <translation type="obsolete">Копировать</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.ui" line="121"/>
         <source>Delete</source>
         <translation>Удалить</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="115"/>
-        <location filename="../SavegameWidget.cpp" line="139"/>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.ui" line="118"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Delete savegame</source>
         <translation>Удалить сохранение</translation>
     </message>
@@ -1028,84 +1245,84 @@ Press 1 for Default View</source>
         <translation>Экспортировать сохранение...</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="64"/>
+        <location filename="../SavegameWidget.ui" line="67"/>
         <source>SAVE %3 - %1&lt;br&gt;%2</source>
         <translation>СОХРАНЕНИЕ %3 - %1&lt;br&gt;%2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="101"/>
-        <location filename="../SavegameWidget.cpp" line="102"/>
+        <location filename="../SavegameWidget.cpp" line="89"/>
+        <location filename="../SavegameWidget.cpp" line="90"/>
         <source>WRONG FORMAT</source>
         <translation>НЕВЕРНЫЙ ФОРМАТ</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="64"/>
+        <location filename="../SavegameWidget.cpp" line="60"/>
+        <location filename="../SavegameWidget.cpp" line="117"/>
         <source>AUTOSAVE - %1
 %2</source>
         <translation>АВТОСОХРАНЕНИЕ - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="65"/>
+        <location filename="../SavegameWidget.cpp" line="61"/>
+        <location filename="../SavegameWidget.cpp" line="118"/>
         <source>SAVE %3 - %1
 %2</source>
         <translation>СОХРАНЕНИЕ %3 - %1
 %2</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="125"/>
+        <location filename="../SavegameWidget.cpp" line="111"/>
         <source>UNKNOWN</source>
         <translation>НЕИЗВЕСТНО</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="139"/>
+        <location filename="../SavegameWidget.cpp" line="131"/>
         <source>Are you sure to delete %1 from your savegames?</source>
         <translation>Вы уверены, что хотите удалить сохранение %1?</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.cpp" line="152"/>
+        <location filename="../SavegameWidget.cpp" line="144"/>
         <source>Failed at deleting %1 from your savegames</source>
         <translation>Не удалось удалить сохранение %1</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1124"/>
+        <location filename="../ProfileInterface.cpp" line="1225"/>
         <source>&amp;View</source>
         <translation>&amp;Просмотр</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1126"/>
+        <location filename="../ProfileInterface.cpp" line="1227"/>
         <source>&amp;Remove</source>
         <translation>&amp;Удалить</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1130"/>
-        <location filename="../ProfileInterface.cpp" line="1141"/>
+        <location filename="../ProfileInterface.cpp" line="1229"/>
         <source>&amp;Select</source>
         <translation>&amp;Выбрать</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1131"/>
+        <location filename="../ProfileInterface.cpp" line="1230"/>
         <source>&amp;Deselect</source>
         <translation>Сн&amp;ять выбор</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1132"/>
-        <location filename="../ProfileInterface.cpp" line="1142"/>
+        <location filename="../ProfileInterface.cpp" line="1233"/>
         <source>Select &amp;All</source>
         <translation>В&amp;ыбрать все</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1135"/>
+        <location filename="../ProfileInterface.cpp" line="1237"/>
         <source>&amp;Deselect All</source>
         <translation>Снять выбо&amp;р со всех</translation>
     </message>
     <message>
-        <location filename="../SavegameWidget.ui" line="96"/>
+        <location filename="../SavegameWidget.ui" line="99"/>
         <source>Copy savegame</source>
         <translation>Копировать сохранение</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1125"/>
+        <location filename="../ProfileInterface.cpp" line="1226"/>
         <source>&amp;Export</source>
         <translation>&amp;Экспортировать</translation>
     </message>
@@ -1165,7 +1382,7 @@ Press 1 for Default View</source>
     <message>
         <location filename="../SnapmaticEditor.ui" line="14"/>
         <location filename="../SnapmaticEditor.ui" line="81"/>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Snapmatic Properties</source>
         <translation>Свойства Snapmatic</translation>
     </message>
@@ -1206,7 +1423,7 @@ Press 1 for Default View</source>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="113"/>
-        <location filename="../SnapmaticEditor.cpp" line="199"/>
+        <location filename="../SnapmaticEditor.cpp" line="200"/>
         <source>Crew: %1 (%2)</source>
         <translation>Банда: %1 (%2)</translation>
     </message>
@@ -1216,20 +1433,20 @@ Press 1 for Default View</source>
         <translation>Meme</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>Snapmatic Title</source>
         <translation>Заголовок Snapmatic</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="126"/>
-        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="185"/>
         <source>Title: %1 (%2)</source>
         <translation>Заголовок: %1 (%2)</translation>
     </message>
     <message>
         <location filename="../SnapmaticEditor.ui" line="136"/>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>Appropriate: %1</source>
         <translation>Разумные: %1</translation>
     </message>
@@ -1259,40 +1476,40 @@ Press 1 for Default View</source>
         <translation>&amp;Отмена</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="183"/>
-        <location filename="../SnapmaticEditor.cpp" line="198"/>
+        <location filename="../SnapmaticEditor.cpp" line="184"/>
+        <location filename="../SnapmaticEditor.cpp" line="199"/>
         <source>Edit</source>
         <translation>Правка</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="188"/>
+        <location filename="../SnapmaticEditor.cpp" line="189"/>
         <source>Yes</source>
         <comment>Yes, should work fine</comment>
         <translation>Да</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="192"/>
+        <location filename="../SnapmaticEditor.cpp" line="193"/>
         <source>No</source>
         <comment>No, could lead to issues</comment>
         <translation>Нет</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="244"/>
+        <location filename="../SnapmaticEditor.cpp" line="245"/>
         <source>Patching of Snapmatic Properties failed because of I/O Error</source>
         <translation>Не удалось измененить свойства Snapmatic из-за проблемы ввода/вывода</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="294"/>
+        <location filename="../SnapmaticEditor.cpp" line="295"/>
         <source>New Snapmatic title:</source>
         <translation>Новый заголовок Snapmatic:</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>Snapmatic Crew</source>
         <translation>Банда на Snapmatic</translation>
     </message>
     <message>
-        <location filename="../SnapmaticEditor.cpp" line="319"/>
+        <location filename="../SnapmaticEditor.cpp" line="324"/>
         <source>New Snapmatic crew:</source>
         <translation>Новая банда на Snapmatic:</translation>
     </message>
@@ -1300,7 +1517,7 @@ Press 1 for Default View</source>
 <context>
     <name>SnapmaticPicture</name>
     <message>
-        <location filename="../SnapmaticPicture.cpp" line="367"/>
+        <location filename="../SnapmaticPicture.cpp" line="411"/>
         <source>PHOTO - %1</source>
         <translation>ФОТО - %1</translation>
     </message>
@@ -1313,126 +1530,132 @@ Press 1 for Default View</source>
         <translation>Виджет Snapmatic</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="82"/>
+        <location filename="../SnapmaticWidget.ui" line="85"/>
         <source>PHOTO - 00/00/00 00:00:00</source>
         <translation>ФОТО - 00/00/00 00:00:00</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="98"/>
+        <location filename="../SnapmaticWidget.ui" line="101"/>
         <source>View picture</source>
         <translation>Просмотр картинки</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="101"/>
+        <location filename="../SnapmaticWidget.ui" line="104"/>
         <source>View</source>
         <translation>Просмотр</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="120"/>
+        <location filename="../SnapmaticWidget.ui" line="123"/>
         <source>Copy</source>
         <translation>Копировать</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="136"/>
+        <location filename="../SnapmaticWidget.ui" line="139"/>
         <source>Export</source>
         <translation>Экспорт</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.ui" line="155"/>
         <source>Delete</source>
         <translation>Удалить</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="149"/>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.ui" line="152"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Delete picture</source>
         <translation>Удалить картинку</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="163"/>
+        <location filename="../SnapmaticWidget.cpp" line="144"/>
         <source>Are you sure to delete %1 from your Snapmatic pictures?</source>
         <translation>Уверены, что хотите удалить %1 из коллекции картинок Snapmatic?</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.cpp" line="172"/>
+        <location filename="../SnapmaticWidget.cpp" line="153"/>
         <source>Failed at deleting %1 from your Snapmatic pictures</source>
         <translation>Не удалось удалить %1 из колелкции картинок Snapmatic </translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1083"/>
+        <location filename="../ProfileInterface.cpp" line="1178"/>
         <source>Edi&amp;t</source>
         <translation>&amp;Правка</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1086"/>
+        <location filename="../ProfileInterface.cpp" line="1181"/>
         <source>Show &amp;In-game</source>
         <translation>Показывать в &amp;игре</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1090"/>
+        <location filename="../ProfileInterface.cpp" line="1185"/>
         <source>Hide &amp;In-game</source>
         <translation>Ск&amp;рыть в игре</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1092"/>
+        <location filename="../ProfileInterface.cpp" line="1187"/>
         <source>&amp;Edit Properties...</source>
         <translation>&amp;Изменить свойства...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1093"/>
+        <location filename="../ProfileInterface.cpp" line="1188"/>
         <source>&amp;Export</source>
         <translation>&amp;Экспорт</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1094"/>
         <source>Export as &amp;JPG picture...</source>
-        <translation>Эксп&amp;ортировать как картинку JPG...</translation>
+        <translation type="vanished">Эксп&amp;ортировать как картинку JPG...</translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1189"/>
+        <source>Export as &amp;Picture...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1095"/>
         <source>Export as &amp;GTA Snapmatic...</source>
-        <translation>Экс&amp;портировать как GTA Snapmatic...</translation>
+        <translation type="vanished">Экс&amp;портировать как GTA Snapmatic...</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1096"/>
+        <location filename="../ProfileInterface.cpp" line="1190"/>
+        <source>Export as &amp;Snapmatic...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ProfileInterface.cpp" line="1191"/>
         <source>&amp;View</source>
         <translation>По&amp;казать</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1099"/>
+        <location filename="../ProfileInterface.cpp" line="1194"/>
         <source>&amp;Remove</source>
         <translation>У&amp;далить</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1103"/>
-        <location filename="../ProfileInterface.cpp" line="1114"/>
+        <location filename="../ProfileInterface.cpp" line="1196"/>
         <source>&amp;Select</source>
         <translation>&amp;Выделить</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1104"/>
+        <location filename="../ProfileInterface.cpp" line="1197"/>
         <source>&amp;Deselect</source>
         <translation>Сн&amp;ять выделение</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1105"/>
-        <location filename="../ProfileInterface.cpp" line="1115"/>
+        <location filename="../ProfileInterface.cpp" line="1200"/>
         <source>Select &amp;All</source>
         <translation>В&amp;ыбрать все</translation>
     </message>
     <message>
-        <location filename="../ProfileInterface.cpp" line="1108"/>
+        <location filename="../ProfileInterface.cpp" line="1204"/>
         <source>&amp;Deselect All</source>
         <translation>Снять выбо&amp;р со всех</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="117"/>
+        <location filename="../SnapmaticWidget.ui" line="120"/>
         <source>Copy picture</source>
         <translation>Скопировать картинку</translation>
     </message>
     <message>
-        <location filename="../SnapmaticWidget.ui" line="133"/>
+        <location filename="../SnapmaticWidget.ui" line="136"/>
         <source>Export picture</source>
         <translation>Экспорт картинки</translation>
     </message>
@@ -1454,123 +1677,134 @@ Press 1 for Default View</source>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="173"/>
+        <location filename="../UserInterface.ui" line="131"/>
+        <source>Reload profile overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="150"/>
+        <source>Close %1</source>
+        <extracomment>Close %1 &lt;- (gta5view/gta5sync) - %1 will be replaced automatically</extracomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../UserInterface.ui" line="179"/>
         <source>&amp;File</source>
         <translation>&amp;Файл</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="183"/>
+        <location filename="../UserInterface.ui" line="189"/>
         <source>&amp;Help</source>
         <translation>&amp;Справка</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="189"/>
+        <location filename="../UserInterface.ui" line="195"/>
         <source>&amp;Edit</source>
         <translation>&amp;Правка</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="195"/>
+        <location filename="../UserInterface.ui" line="201"/>
         <source>&amp;Profile</source>
         <translation>П&amp;рофиль</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="228"/>
+        <location filename="../UserInterface.ui" line="234"/>
         <source>&amp;Exit</source>
         <translation>В&amp;ыход</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="231"/>
+        <location filename="../UserInterface.ui" line="237"/>
         <source>Exit</source>
         <translation>Выход</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="239"/>
+        <location filename="../UserInterface.ui" line="245"/>
         <source>Close &amp;Profile</source>
         <translation>Закрыть п&amp;рофиль</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="242"/>
+        <location filename="../UserInterface.ui" line="248"/>
         <source>Ctrl+End</source>
         <translation>Ctrl+End</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="247"/>
+        <location filename="../UserInterface.ui" line="253"/>
         <source>&amp;Settings</source>
         <translation>&amp;Настройки</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="282"/>
+        <location filename="../UserInterface.ui" line="288"/>
         <source>Ctrl+Del</source>
         <translation>Ctrl+Del</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="287"/>
+        <location filename="../UserInterface.ui" line="293"/>
         <source>&amp;Import files...</source>
         <translation>&amp;Импортировать файлы...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="290"/>
+        <location filename="../UserInterface.ui" line="296"/>
         <source>Ctrl+I</source>
         <translation>Ctrl+I</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="303"/>
-        <location filename="../UserInterface.cpp" line="151"/>
+        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.cpp" line="163"/>
         <source>Select &amp;GTA V Folder...</source>
         <translation>Выбрать &amp;папку GTA V...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="309"/>
+        <location filename="../UserInterface.ui" line="315"/>
         <source>Ctrl+G</source>
         <translation>Ctrl+G</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="314"/>
+        <location filename="../UserInterface.ui" line="320"/>
         <source>Show In-gam&amp;e</source>
         <translation>Показывать в и&amp;гре</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="317"/>
+        <location filename="../UserInterface.ui" line="323"/>
         <source>Shift+E</source>
         <translation>Shift+E</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="322"/>
+        <location filename="../UserInterface.ui" line="328"/>
         <source>Hi&amp;de In-game</source>
         <translation>Скры&amp;ть в игре</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="325"/>
+        <location filename="../UserInterface.ui" line="331"/>
         <source>Shift+D</source>
         <translation>Shift+D</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="147"/>
+        <location filename="../UserInterface.ui" line="153"/>
         <source>&amp;Close</source>
         <translation>&amp;Закрыть</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="199"/>
+        <location filename="../UserInterface.ui" line="205"/>
         <source>&amp;Selection visibility</source>
         <translation>В&amp;идимость выделение</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="255"/>
+        <location filename="../UserInterface.ui" line="261"/>
         <source>Select &amp;All</source>
         <translation>В&amp;ыбрать все</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="263"/>
+        <location filename="../UserInterface.ui" line="269"/>
         <source>&amp;Deselect All</source>
         <translation>Снять выбо&amp;р со всех</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="271"/>
+        <location filename="../UserInterface.ui" line="277"/>
         <source>&amp;Export selected...</source>
         <translation>&amp;Экпортировать выделенное...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="279"/>
+        <location filename="../UserInterface.ui" line="285"/>
         <source>&amp;Remove selected</source>
         <translation>&amp;Удалить выделенное</translation>
     </message>
@@ -1587,7 +1821,7 @@ Press 1 for Default View</source>
         <translation type="obsolete">О программе gta5sync</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="258"/>
+        <location filename="../UserInterface.ui" line="264"/>
         <source>Ctrl+A</source>
         <translation>Ctrl+A</translation>
     </message>
@@ -1596,81 +1830,83 @@ Press 1 for Default View</source>
         <translation type="obsolete">Закрыть</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="234"/>
+        <location filename="../UserInterface.ui" line="240"/>
         <source>Ctrl+Q</source>
         <translation>Ctrl+Q</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="223"/>
+        <location filename="../UserInterface.ui" line="229"/>
         <source>Ctrl+P</source>
         <translation>Ctrl+P</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="295"/>
+        <location filename="../UserInterface.ui" line="301"/>
         <source>&amp;Open File...</source>
         <translation>&amp;Открыть файл...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="298"/>
+        <location filename="../UserInterface.ui" line="304"/>
         <source>Ctrl+O</source>
         <translation>Ctrl+O</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="250"/>
+        <location filename="../UserInterface.ui" line="256"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="274"/>
+        <location filename="../UserInterface.ui" line="280"/>
         <source>Ctrl+E</source>
         <translation>Ctrl+E</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="266"/>
+        <location filename="../UserInterface.ui" line="272"/>
         <source>Ctrl+D</source>
         <translation>Ctrl+D</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="62"/>
-        <location filename="../UserInterface.cpp" line="220"/>
+        <location filename="../UserInterface.cpp" line="64"/>
+        <location filename="../UserInterface.cpp" line="234"/>
+        <location filename="../UserInterface.cpp" line="550"/>
         <source>Select Profile</source>
         <translation>Выбор профиля</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="306"/>
-        <location filename="../OptionsDialog.cpp" line="452"/>
-        <location filename="../UserInterface.cpp" line="99"/>
-        <location filename="../UserInterface.cpp" line="495"/>
+        <location filename="../UserInterface.ui" line="312"/>
+        <location filename="../OptionsDialog.cpp" line="445"/>
+        <location filename="../UserInterface.cpp" line="104"/>
+        <location filename="../UserInterface.cpp" line="513"/>
         <source>Select GTA V Folder...</source>
         <translation>Выбрать папку GTA V...</translation>
     </message>
     <message>
         <location filename="../UserInterface.ui" line="20"/>
-        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="62"/>
         <source>%2 - %1</source>
         <translation>%2 - %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="220"/>
-        <location filename="../UserInterface.cpp" line="59"/>
+        <location filename="../UserInterface.ui" line="226"/>
+        <location filename="../UserInterface.cpp" line="60"/>
+        <location filename="../UserInterface.cpp" line="542"/>
         <source>&amp;About %1</source>
         <translation>&amp;О %1</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="346"/>
+        <location filename="../UserInterface.cpp" line="360"/>
         <source>Open File...</source>
         <translation>Открыть файл...</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="393"/>
-        <location filename="../UserInterface.cpp" line="409"/>
-        <location filename="../UserInterface.cpp" line="436"/>
-        <location filename="../UserInterface.cpp" line="441"/>
+        <location filename="../UserInterface.cpp" line="407"/>
+        <location filename="../UserInterface.cpp" line="423"/>
+        <location filename="../UserInterface.cpp" line="450"/>
+        <location filename="../UserInterface.cpp" line="455"/>
         <source>Open File</source>
         <translation>Открыть файл</translation>
     </message>
     <message>
-        <location filename="../UserInterface.cpp" line="436"/>
+        <location filename="../UserInterface.cpp" line="450"/>
         <source>Can&apos;t open %1 because of not valid file format</source>
         <translation>Не удалось открыть %1 из-за неверного формата файла</translation>
     </message>
@@ -1679,7 +1915,7 @@ Press 1 for Default View</source>
         <translation type="obsolete">gta5sync</translation>
     </message>
     <message>
-        <location filename="../UserInterface.ui" line="131"/>
+        <location filename="../UserInterface.ui" line="134"/>
         <source>&amp;Reload</source>
         <translation>Пере&amp;загрузить</translation>
     </message>
diff --git a/res/mappreview.jpg b/res/mappreview.jpg
new file mode 100644
index 0000000..0049692
Binary files /dev/null and b/res/mappreview.jpg differ
diff --git a/res/pointmaker-16.png b/res/pointmaker-16.png
new file mode 100644
index 0000000..3244d6e
Binary files /dev/null and b/res/pointmaker-16.png differ
diff --git a/res/pointmaker-24.png b/res/pointmaker-24.png
new file mode 100644
index 0000000..d337357
Binary files /dev/null and b/res/pointmaker-24.png differ
diff --git a/res/pointmaker-32.png b/res/pointmaker-32.png
new file mode 100644
index 0000000..610efd4
Binary files /dev/null and b/res/pointmaker-32.png differ
diff --git a/res/pointmaker-8.png b/res/pointmaker-8.png
new file mode 100644
index 0000000..a116c72
Binary files /dev/null and b/res/pointmaker-8.png differ
diff --git a/res/qtbase_en_GB.qm b/res/qtbase_en_GB.qm
new file mode 100644
index 0000000..f88ef88
Binary files /dev/null and b/res/qtbase_en_GB.qm differ
diff --git a/res/tr_g5p.qrc b/res/tr_g5p.qrc
index 393f585..1ff8d2e 100644
--- a/res/tr_g5p.qrc
+++ b/res/tr_g5p.qrc
@@ -1,5 +1,6 @@
 <RCC>
     <qresource prefix="/tr">
+        <file>gta5sync_en_US.qm</file>
         <file>gta5sync_de.qm</file>
         <file>gta5sync_fr.qm</file>
         <file>gta5sync_ru.qm</file>
diff --git a/res/tr_qt5.qrc b/res/tr_qt5.qrc
index f34728d..4adfa51 100644
--- a/res/tr_qt5.qrc
+++ b/res/tr_qt5.qrc
@@ -1,5 +1,6 @@
 <RCC>
     <qresource prefix="/tr">
+        <file>qtbase_en_GB.qm</file>
         <file>qtbase_de.qm</file>
         <file>qtbase_fr.qm</file>
         <file>qtbase_ru.qm</file>
diff --git a/uimod/UiModLabel.cpp b/uimod/UiModLabel.cpp
index 0051a7a..27c6a7d 100755
--- a/uimod/UiModLabel.cpp
+++ b/uimod/UiModLabel.cpp
@@ -1,75 +1,75 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "UiModLabel.h"
-#include <QPaintEvent>
-#include <QMouseEvent>
-
-UiModLabel::UiModLabel(const QString &text, QWidget *parent) : QLabel(parent)
-{
-    setText(text);
-}
-
-UiModLabel::UiModLabel(QWidget *parent, const QString &text) : QLabel(parent)
-{
-    setText(text);
-}
-
-UiModLabel::UiModLabel(QWidget *parent) : QLabel(parent)
-{
-}
-
-UiModLabel::~UiModLabel()
-{
-}
-
-void UiModLabel::paintEvent(QPaintEvent *ev)
-{
-    QLabel::paintEvent(ev);
-    emit labelPainted();
-}
-
-void UiModLabel::mouseMoveEvent(QMouseEvent *ev)
-{
-    QLabel::mouseMoveEvent(ev);
-    emit mouseMoved();
-}
-
-void UiModLabel::mousePressEvent(QMouseEvent *ev)
-{
-    QLabel::mousePressEvent(ev);
-    emit mousePressed(ev->button());
-}
-
-void UiModLabel::mouseReleaseEvent(QMouseEvent *ev)
-{
-    QLabel::mouseReleaseEvent(ev);
-    emit mouseReleased(ev->button());
-}
-
-void UiModLabel::mouseDoubleClickEvent(QMouseEvent *ev)
-{
-    QLabel::mouseDoubleClickEvent(ev);
-    emit mouseDoubleClicked(ev->button());
-}
-
-void UiModLabel::resizeEvent(QResizeEvent *ev)
-{
-    QLabel::resizeEvent(ev);
-    emit resized(ev->size());
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "UiModLabel.h"
+#include <QPaintEvent>
+#include <QMouseEvent>
+
+UiModLabel::UiModLabel(const QString &text, QWidget *parent) : QLabel(parent)
+{
+    setText(text);
+}
+
+UiModLabel::UiModLabel(QWidget *parent, const QString &text) : QLabel(parent)
+{
+    setText(text);
+}
+
+UiModLabel::UiModLabel(QWidget *parent) : QLabel(parent)
+{
+}
+
+UiModLabel::~UiModLabel()
+{
+}
+
+void UiModLabel::paintEvent(QPaintEvent *ev)
+{
+    QLabel::paintEvent(ev);
+    emit labelPainted();
+}
+
+void UiModLabel::mouseMoveEvent(QMouseEvent *ev)
+{
+    QLabel::mouseMoveEvent(ev);
+    emit mouseMoved();
+}
+
+void UiModLabel::mousePressEvent(QMouseEvent *ev)
+{
+    QLabel::mousePressEvent(ev);
+    emit mousePressed(ev->button());
+}
+
+void UiModLabel::mouseReleaseEvent(QMouseEvent *ev)
+{
+    QLabel::mouseReleaseEvent(ev);
+    emit mouseReleased(ev->button());
+}
+
+void UiModLabel::mouseDoubleClickEvent(QMouseEvent *ev)
+{
+    QLabel::mouseDoubleClickEvent(ev);
+    emit mouseDoubleClicked(ev->button());
+}
+
+void UiModLabel::resizeEvent(QResizeEvent *ev)
+{
+    QLabel::resizeEvent(ev);
+    emit resized(ev->size());
+}
diff --git a/uimod/UiModLabel.h b/uimod/UiModLabel.h
index 545ee27..7d35e87 100755
--- a/uimod/UiModLabel.h
+++ b/uimod/UiModLabel.h
@@ -1,53 +1,53 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016-2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef UIMODLABEL_H
-#define UIMODLABEL_H
-
-#include <QWidget>
-#include <QString>
-#include <QLabel>
-#include <QSize>
-
-class UiModLabel : public QLabel
-{
-    Q_OBJECT
-public:
-    UiModLabel(const QString &text, QWidget *parent = 0);
-    UiModLabel(QWidget *parent, const QString &text);
-    UiModLabel(QWidget *parent = 0);
-    ~UiModLabel();
-
-protected:
-    void mouseMoveEvent(QMouseEvent *ev);
-    void mousePressEvent(QMouseEvent *ev);
-    void mouseReleaseEvent(QMouseEvent *ev);
-    void mouseDoubleClickEvent(QMouseEvent *ev);
-    void paintEvent(QPaintEvent *ev);
-    void resizeEvent(QResizeEvent *ev);
-
-signals:
-    void mouseMoved();
-    void mousePressed(Qt::MouseButton button);
-    void mouseReleased(Qt::MouseButton button);
-    void mouseDoubleClicked(Qt::MouseButton button);
-    void labelPainted();
-    void resized(QSize newSize);
-};
-
-#endif // UIMODLABEL_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2016-2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef UIMODLABEL_H
+#define UIMODLABEL_H
+
+#include <QWidget>
+#include <QString>
+#include <QLabel>
+#include <QSize>
+
+class UiModLabel : public QLabel
+{
+    Q_OBJECT
+public:
+    UiModLabel(const QString &text, QWidget *parent = 0);
+    UiModLabel(QWidget *parent, const QString &text);
+    UiModLabel(QWidget *parent = 0);
+    ~UiModLabel();
+
+protected:
+    void mouseMoveEvent(QMouseEvent *ev);
+    void mousePressEvent(QMouseEvent *ev);
+    void mouseReleaseEvent(QMouseEvent *ev);
+    void mouseDoubleClickEvent(QMouseEvent *ev);
+    void paintEvent(QPaintEvent *ev);
+    void resizeEvent(QResizeEvent *ev);
+
+signals:
+    void mouseMoved();
+    void mousePressed(Qt::MouseButton button);
+    void mouseReleased(Qt::MouseButton button);
+    void mouseDoubleClicked(Qt::MouseButton button);
+    void labelPainted();
+    void resized(QSize newSize);
+};
+
+#endif // UIMODLABEL_H
diff --git a/uimod/UiModWidget.cpp b/uimod/UiModWidget.cpp
index f9dd61f..b517463 100644
--- a/uimod/UiModWidget.cpp
+++ b/uimod/UiModWidget.cpp
@@ -1,76 +1,76 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#include "UiModWidget.h"
-#include <QStyleOption>
-#include <QDropEvent>
-#include <QMimeData>
-#include <QPainter>
-#include <QDebug>
-#include <QUrl>
-
-UiModWidget::UiModWidget(QWidget *parent) : QWidget(parent)
-{
-    filesMode = false;
-}
-
-UiModWidget::~UiModWidget()
-{
-}
-
-void UiModWidget::setFilesMode(bool filesModeEnabled)
-{
-    filesMode = filesModeEnabled;
-}
-
-void UiModWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
-{
-    if (filesMode && dragEnterEvent->mimeData()->hasUrls())
-    {
-        QStringList pathList;
-        QList<QUrl> urlList = dragEnterEvent->mimeData()->urls();
-
-        foreach(const QUrl &currentUrl, urlList)
-        {
-            if (currentUrl.isLocalFile())
-            {
-                pathList.append(currentUrl.toLocalFile());
-            }
-        }
-
-        if (!pathList.isEmpty())
-        {
-            dragEnterEvent->acceptProposedAction();
-        }
-    }
-}
-
-void UiModWidget::dropEvent(QDropEvent *dropEvent)
-{
-    dropEvent->acceptProposedAction();
-    emit dropped(dropEvent->mimeData());
-}
-
-void UiModWidget::paintEvent(QPaintEvent *paintEvent)
-{
-    Q_UNUSED(paintEvent)
-    QStyleOption opt;
-    opt.init(this);
-    QPainter p(this);
-    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
-}
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#include "UiModWidget.h"
+#include <QStyleOption>
+#include <QDropEvent>
+#include <QMimeData>
+#include <QPainter>
+#include <QDebug>
+#include <QUrl>
+
+UiModWidget::UiModWidget(QWidget *parent) : QWidget(parent)
+{
+    filesMode = false;
+}
+
+UiModWidget::~UiModWidget()
+{
+}
+
+void UiModWidget::setFilesMode(bool filesModeEnabled)
+{
+    filesMode = filesModeEnabled;
+}
+
+void UiModWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent)
+{
+    if (filesMode && dragEnterEvent->mimeData()->hasUrls())
+    {
+        QStringList pathList;
+        QList<QUrl> urlList = dragEnterEvent->mimeData()->urls();
+
+        foreach(const QUrl &currentUrl, urlList)
+        {
+            if (currentUrl.isLocalFile())
+            {
+                pathList.append(currentUrl.toLocalFile());
+            }
+        }
+
+        if (!pathList.isEmpty())
+        {
+            dragEnterEvent->acceptProposedAction();
+        }
+    }
+}
+
+void UiModWidget::dropEvent(QDropEvent *dropEvent)
+{
+    dropEvent->acceptProposedAction();
+    emit dropped(dropEvent->mimeData());
+}
+
+void UiModWidget::paintEvent(QPaintEvent *paintEvent)
+{
+    Q_UNUSED(paintEvent)
+    QStyleOption opt;
+    opt.init(this);
+    QPainter p(this);
+    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+}
diff --git a/uimod/UiModWidget.h b/uimod/UiModWidget.h
index 3858425..d30637d 100644
--- a/uimod/UiModWidget.h
+++ b/uimod/UiModWidget.h
@@ -1,47 +1,47 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2017 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
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*****************************************************************************/
-
-#ifndef UIMODWIDGET_H
-#define UIMODWIDGET_H
-
-#include <QMimeData>
-#include <QWidget>
-#include <QString>
-#include <QSize>
-
-class UiModWidget : public QWidget
-{
-    Q_OBJECT
-public:
-    UiModWidget(QWidget *parent = 0);
-    void setFilesMode(bool enabled);
-    ~UiModWidget();
-
-protected:
-    void dragEnterEvent(QDragEnterEvent *dragEnterEvent);
-    void dropEvent(QDropEvent *dropEvent);
-    void paintEvent(QPaintEvent *paintEvent);
-
-private:
-    bool filesMode;
-
-signals:
-    void dropped(const QMimeData *mimeData);
-};
-
-#endif // UIMODWIDGET_H
+/*****************************************************************************
+* gta5sync GRAND THEFT AUTO V SYNC
+* Copyright (C) 2017 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
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*****************************************************************************/
+
+#ifndef UIMODWIDGET_H
+#define UIMODWIDGET_H
+
+#include <QMimeData>
+#include <QWidget>
+#include <QString>
+#include <QSize>
+
+class UiModWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    UiModWidget(QWidget *parent = 0);
+    void setFilesMode(bool enabled);
+    ~UiModWidget();
+
+protected:
+    void dragEnterEvent(QDragEnterEvent *dragEnterEvent);
+    void dropEvent(QDropEvent *dropEvent);
+    void paintEvent(QPaintEvent *paintEvent);
+
+private:
+    bool filesMode;
+
+signals:
+    void dropped(const QMimeData *mimeData);
+};
+
+#endif // UIMODWIDGET_H