diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 0b34d580506..da624d5df5f 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -1,7 +1,10 @@
 name: Build
 
-# Trigger the workflow on any pull request, push or manual dispatch
-on: [pull_request, push, workflow_dispatch]
+on:
+  push:
+    branches:
+      - release/1.6.0
+  workflow_dispatch:
 
 jobs:
   windows:
@@ -73,7 +76,7 @@ jobs:
     name: linux-${{ matrix.architecture }}
     runs-on: ubuntu-latest
     container:
-      image: docker://ghcr.io/multitheftauto/mtasa-blue-build:latest
+      image: docker://ghcr.io/multitheftauto/mtasa-blue-build:1.6.0
     steps:
       - uses: actions/checkout@v4
 
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
deleted file mode 100644
index d5bd1675f57..00000000000
--- a/.github/workflows/codeql.yml
+++ /dev/null
@@ -1,104 +0,0 @@
-# For most projects, this workflow file will not need changing; you simply need
-# to commit it to your repository.
-#
-# You may wish to alter this file to override the set of languages analyzed,
-# or to provide custom queries or build logic.
-#
-# ******** NOTE ********
-# We have attempted to detect the languages in your repository. Please check
-# the `language` matrix defined below to confirm you have the correct set of
-# supported CodeQL languages.
-#
-name: "CodeQL Advanced"
-
-on:
-  push:
-    branches: [ "master" ]
-  pull_request:
-    branches: [ "master" ]
-  schedule:
-    - cron: '19 17 * * 3'
-
-jobs:
-  analyze:
-    name: Analyze (${{ matrix.language }})
-    # Runner size impacts CodeQL analysis time. To learn more, please see:
-    #   - https://gh.io/recommended-hardware-resources-for-running-codeql
-    #   - https://gh.io/supported-runners-and-hardware-resources
-    #   - https://gh.io/using-larger-runners (GitHub.com only)
-    # Consider using larger runners or machines with greater resources for possible analysis time improvements.
-    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
-    permissions:
-      # required for all workflows
-      security-events: write
-
-      # required to fetch internal or private CodeQL packs
-      packages: read
-
-      # only required for workflows in private repositories
-      actions: read
-      contents: read
-
-    strategy:
-      fail-fast: false
-      matrix:
-        include:
-        - language: actions
-          build-mode: none
-        - language: c-cpp
-          build-mode: autobuild
-        - language: javascript-typescript
-          build-mode: none
-        - language: python
-          build-mode: none
-        # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
-        # Use `c-cpp` to analyze code written in C, C++ or both
-        # Use 'java-kotlin' to analyze code written in Java, Kotlin or both
-        # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
-        # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
-        # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
-        # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
-        # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-
-    # Add any setup steps before running the `github/codeql-action/init` action.
-    # This includes steps like installing compilers or runtimes (`actions/setup-node`
-    # or others). This is typically only required for manual builds.
-    # - name: Setup runtime (example)
-    #   uses: actions/setup-example@v1
-
-    # Initializes the CodeQL tools for scanning.
-    - name: Initialize CodeQL
-      uses: github/codeql-action/init@v3
-      with:
-        languages: ${{ matrix.language }}
-        build-mode: ${{ matrix.build-mode }}
-        # If you wish to specify custom queries, you can do so here or in a config file.
-        # By default, queries listed here will override any specified in a config file.
-        # Prefix the list here with "+" to use these queries and those in the config file.
-
-        # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
-        # queries: security-extended,security-and-quality
-
-    # If the analyze step fails for one of the languages you are analyzing with
-    # "We were unable to automatically build your code", modify the matrix above
-    # to set the build mode to "manual" for that language. Then modify this step
-    # to build your code.
-    # ℹ️ Command-line programs to run using the OS shell.
-    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
-    - if: matrix.build-mode == 'manual'
-      shell: bash
-      run: |
-        echo 'If you are using a "manual" build mode for one or more of the' \
-          'languages you are analyzing, replace this with the commands to build' \
-          'your code, for example:'
-        echo '  make bootstrap'
-        echo '  make release'
-        exit 1
-
-    - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v3
-      with:
-        category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/crowdin-auto-merge.yml b/.github/workflows/crowdin-auto-merge.yml
deleted file mode 100644
index 487ec81eafd..00000000000
--- a/.github/workflows/crowdin-auto-merge.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: Crowdin Auto-Merge
-
-on:
-  schedule:
-    - cron: '0 0 * * 5'  # This cron expression runs the workflow every Friday at midnight (UTC)
-  workflow_dispatch:
-
-jobs:
-  crowdin-auto-merge:
-    if: github.event.repository.fork == false
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout code
-        uses: actions/checkout@v4
-        with:
-          token: ${{ secrets.POT_CI_PAT }}
-
-      - name: Setup Git
-        run: |
-          git config --global user.name 'github-actions[bot]'
-          git config --global user.email 'github-actions[bot]@users.noreply.github.com'
-
-      - name: Auto-merge pull request
-        run: |
-          PR_NUMBER=$(gh pr list --repo ${{ github.repository }} --author 'MTABot' --base 'master' --head 'l10n/master' --state open --json number --jq '.[0].number')
-          if [ -n "$PR_NUMBER" ]; then
-            gh pr merge $PR_NUMBER --squash --repo ${{ github.repository }} --admin --subject "New Crowdin updates (PR #$PR_NUMBER)" --body ""
-            git push origin --delete l10n/master
-          fi
-        env:
-          GITHUB_TOKEN: ${{ secrets.POT_CI_PAT }}
diff --git a/.github/workflows/dockerimage.yaml b/.github/workflows/dockerimage.yaml
index 9d4d844aeac..e978de5d6ef 100644
--- a/.github/workflows/dockerimage.yaml
+++ b/.github/workflows/dockerimage.yaml
@@ -4,7 +4,7 @@ on:
   workflow_dispatch:
   push:
     branches:
-    - master
+    - release/1.6.0
     paths: 
     - '.github/workflows/build.yaml'
     - '.github/workflows/dockerimage.yaml'
@@ -26,4 +26,4 @@ jobs:
       with:
         push: true
         context: utils/docker
-        tags: ghcr.io/multitheftauto/mtasa-blue-build:latest
+        tags: ghcr.io/multitheftauto/mtasa-blue-build:1.6.0
diff --git a/.github/workflows/rebuild-pots.yaml b/.github/workflows/rebuild-pots.yaml
deleted file mode 100644
index 5f46aa984c3..00000000000
--- a/.github/workflows/rebuild-pots.yaml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: "Rebuild en_US pot files"
-
-on: [push, workflow_dispatch]
-
-jobs:
-  test:
-    if: github.event.repository.fork == false
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          ref: ${{ github.head_ref }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          activate-environment: mtasa
-          environment-file: utils/localization/environment.yml
-          python-version: 3
-          auto-activate-base: false
-      - name: Install gettext
-        run: |
-          sudo apt-get update
-          sudo apt-get install --yes --no-install-recommends gettext
-      - name: Run tests
-        run: pytest "utils/localization/tests"
-        shell: bash -l {0}
-  rebuild-pots:
-    if: github.event.repository.fork == false
-    runs-on: ubuntu-latest
-    needs: test
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          ref: ${{ github.head_ref }}
-          token: ${{ secrets.POT_CI_PAT }}
-      - uses: conda-incubator/setup-miniconda@v2
-        with:
-          activate-environment: mtasa
-          environment-file: utils/localization/environment.yml
-          python-version: 3
-          auto-activate-base: false
-      - name: Install gettext
-        run: |
-          sudo apt-get update
-          sudo apt-get install --yes --no-install-recommends gettext
-      - run: python "utils/localization/build_gettext_catalog.py"
-        shell: bash -l {0}
-      - run: python "utils/localization/build_gettext_catalog_nsi.py"
-        shell: bash -l {0}
-      - id: stage_changes
-        name: Commit changes
-        run: |
-          # GitHub Actions bot user
-          git config --global user.name "Pot Bot"
-          git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
-
-          # Check that diff contains something and it's not only POT-Creation-Date
-          if [[ $(git diff --unified=0 "Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot" | grep -v POT-Creation-Date | grep '^[+|-][^+|-]') ]]
-          then
-            git add "Shared/data/MTA San Andreas/MTA/locale/en_US/client.pot"
-            git commit -m "Update client en_US pot" -m "[ci skip]"
-          fi
-
-          # Check that diff contains something and it's not only POT-Creation-Date
-          if [[ $(git diff --unified=0 "Shared/installer/locale/en_US.pot" | grep -v POT-Creation-Date | grep '^[+|-][^+|-]') ]]
-          then
-            git add "Shared/installer/locale/en_US.pot"
-            git commit -m "Update installer en_US pot" -m "[ci skip]"
-          fi
-
-          # Check for local commits
-          if [[ $(git diff --name-only "@{upstream}..") ]]
-          then
-            echo "has_changes=true" >> $GITHUB_ENV
-          else
-            echo "has_changes=false" >> $GITHUB_ENV
-          fi
-
-          # Get rid of all other changes
-          git checkout -- .
-          git clean -fd
-      - if: ${{ env.has_changes == 'true' }}
-        name: Push changes
-        run: git push
diff --git a/.github/workflows/run-generate-translators.yaml b/.github/workflows/run-generate-translators.yaml
deleted file mode 100644
index 590ae885779..00000000000
--- a/.github/workflows/run-generate-translators.yaml
+++ /dev/null
@@ -1,52 +0,0 @@
-name: "Update crowdin-translators.json"
-
-on:
-  workflow_dispatch:
-  delete:
-    branches:
-      - l10n/master
-
-jobs:
-  generate_translators:
-    if: github.event.repository.fork == false
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout code
-        uses: actions/checkout@v4
-        with:
-          ref: master
-          token: ${{ secrets.POT_CI_PAT }}
-      
-      - name: Setup Node.js
-        uses: actions/setup-node@v4
-        with:
-          node-version: latest
-          cache: 'npm'
-          cache-dependency-path: ./utils/localization/generate-translators/package-lock.json
-      
-      - name: Install dependencies
-        working-directory: ./utils/localization/generate-translators
-        run: npm clean-install
-      
-      - name: Generate translators
-        working-directory: ./utils/localization/generate-translators
-        env:
-          CROWDIN_TOKEN: "${{ secrets.CROWDIN_TOKEN }}"
-          CROWDIN_ORGANIZATION: "multitheftauto"
-          CROWDIN_PROJECT_ID: "13"  # Multi Theft Auto
-          CROWDIN_IGNORE_USER_ID: "2"  # multitheftautoqa
-        run: npm run ci
-      
-      - name: Commit changes
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          git config --global user.name 'github-actions[bot]'
-          git config --global user.email 'github-actions[bot]@users.noreply.github.com'
-
-          git add ./utils/localization/generate-translators/crowdin-translators.json
-
-          if ! git diff-index --quiet HEAD; then
-            git commit -m "Update crowdin-translators.json" -m "[ci skip]"
-            git push
-          fi
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
deleted file mode 100644
index 3674d690d1c..00000000000
--- a/.github/workflows/stale.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-name: 'Stale draft PR handler'
-on:
-  workflow_dispatch:
-  schedule:
-    - cron: '0 0 * * *'
-
-jobs:
-  stale:
-    if: github.event.repository.fork == false
-    runs-on: ubuntu-latest
-    steps:
-      - uses: multitheftauto/stale-action@v3.0.0
-        id: stale
-        with:
-          close-pr-message: "This draft pull request was closed because it has been marked stale for 30 days with no activity."
-          days-before-pr-close: 30
-          days-before-pr-stale: 90
-          ignored-label: "keep"
-          stale-pr-label-description: "Inactive for over 90 days, to be closed"
-          stale-pr-message: "This draft pull request is stale because it has been open for at least 90 days with no activity. Please continue on your draft pull request or it will be closed in 30 days automatically."
-      - name: Print outputs
-        run: echo ${{ join(steps.stale.outputs.*, ',') }}
diff --git a/.github/workflows/sync-master-to-maetro.yaml b/.github/workflows/sync-master-to-maetro.yaml
index 97569cfdc53..32f52a70c74 100644
--- a/.github/workflows/sync-master-to-maetro.yaml
+++ b/.github/workflows/sync-master-to-maetro.yaml
@@ -2,7 +2,8 @@ name: 'Sync master to maetro'
 
 on:
   push:
-    branches: [ master ]
+    branches:
+      - release/1.6.0
   workflow_dispatch:
 
 jobs:
@@ -22,8 +23,8 @@ jobs:
           git config --global user.name "Maetro Bot"
           git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
 
-          git checkout release/maetro
-          git merge master --no-ff --no-edit --no-commit || true
+          git checkout release/1.6.0m
+          git merge release/1.6.0 --no-ff --no-edit --no-commit || true
           
           # Discard locale conflicts
           git checkout --ours -- Shared/installer/locale "Shared/data/MTA San Andreas/MTA/locale"
@@ -45,8 +46,8 @@ jobs:
           git add --verbose "Client/loader/MainFunctions.cpp"
           
           # We should be done with the merge now
-          printf "Synchronize changes from 1.6 master branch [ci skip]\n\n" > commit.txt
-          git log --expand-tabs=4 --pretty=format:'%h %s' release/maetro..master >> commit.txt
+          printf "Synchronize changes from 1.6 branch [ci skip]\n\n" > commit.txt
+          git log --expand-tabs=4 --pretty=format:'%h %s' release/1.6.0m..release/1.6.0 >> commit.txt
           git commit --no-edit --allow-empty -F commit.txt
 
-          git push origin release/maetro
+          git push origin release/1.6.0m
diff --git a/Client/core/CSteamClient.cpp b/Client/core/CSteamClient.cpp
index 50729f7e8c9..d02cf8c2bcf 100644
--- a/Client/core/CSteamClient.cpp
+++ b/Client/core/CSteamClient.cpp
@@ -377,9 +377,24 @@ bool CSteamClient::Load()
         return false;
     }
 
+    static auto pAddDllDirectory = ([]() -> decltype(&AddDllDirectory) {
+        if (const HMODULE kernel32 = GetModuleHandleW(L"kernel32.dll"); kernel32 != nullptr)
+        {
+            return reinterpret_cast<decltype(&AddDllDirectory)>(static_cast<void*>(GetProcAddress(kernel32, "AddDllDirectory")));
+        }
+
+        return nullptr;
+    })();
+
+    if (pAddDllDirectory == nullptr)
+    {
+        WriteErrorEvent("Your operating system is outdated and is missing the KB2533623 update package for AddDllDirectory");
+        return false;
+    }
+
     WriteDebugEvent(SString("Using steamclient.dll: %s", *ToUTF8(steamClientPath.value())));
     SetEnvironmentVariableW(L"SteamAppId", L"" STEAM_GTASA_APP_ID);
-    AddDllDirectory(steamDirPath.c_str());
+    pAddDllDirectory(steamDirPath.c_str());
     {
         static wchar_t pathBuffer[65536];
         GetEnvironmentVariableW(L"PATH", pathBuffer, sizeof(pathBuffer) / sizeof(wchar_t));
@@ -425,7 +440,7 @@ bool CSteamClient::Load()
 
     releaseLibraryLock.reset();
     
-    Native::CreateInterface = reinterpret_cast<decltype(Native::CreateInterface)>(GetProcAddress(dll, "CreateInterface"));
+    Native::CreateInterface = reinterpret_cast<decltype(Native::CreateInterface)>(static_cast<void*>(GetProcAddress(dll, "CreateInterface")));
 
     if (!Native::CreateInterface)
     {
diff --git a/Client/loader/CInstallManager.cpp b/Client/loader/CInstallManager.cpp
index 61226afdc6d..02f4aa4e6de 100644
--- a/Client/loader/CInstallManager.cpp
+++ b/Client/loader/CInstallManager.cpp
@@ -432,10 +432,10 @@ SString CInstallManager::_ShowCrashFailDialog()
         strMessage += strReason;
     }
 
-    const SString moduleName = GetApplicationSetting("diagnostics", "last-crash-module");
-    const int     exceptionCode = GetApplicationSettingInt("diagnostics", "last-crash-code");
+    // const SString moduleName = GetApplicationSetting("diagnostics", "last-crash-module");
+    const int exceptionCode = GetApplicationSettingInt("diagnostics", "last-crash-code");
 
-    if (exceptionCode == CUSTOM_EXCEPTION_CODE_OOM && moduleName.EndsWithI("\\kernelbase.dll"))
+    if (exceptionCode == CUSTOM_EXCEPTION_CODE_OOM)
     {
         strMessage += '\n';
         strMessage += _("** Out of memory - this crash was caused by insufficient free or fragmented memory. **");
diff --git a/Client/mods/deathmatch/logic/CClientPed.cpp b/Client/mods/deathmatch/logic/CClientPed.cpp
index a9ef955e6e3..59ce2f4cde7 100644
--- a/Client/mods/deathmatch/logic/CClientPed.cpp
+++ b/Client/mods/deathmatch/logic/CClientPed.cpp
@@ -4970,10 +4970,7 @@ void CClientPed::DestroySatchelCharges(bool bBlow, bool bDestroy)
                 bool bCancelExplosion = !CallEvent("onClientExplosion", Arguments, true);
 
                 if (!bCancelExplosion)
-                {
                     m_pManager->GetExplosionManager()->Create(EXP_TYPE_GRENADE, vecPosition, this, true, -1.0f, false, WEAPONTYPE_REMOTE_SATCHEL_CHARGE);
-                    g_pClientGame->SendExplosionSync(vecPosition, EXP_TYPE_GRENADE, this);
-                }
             }
             if (bDestroy)
             {
diff --git a/Client/mods/deathmatch/logic/CResource.cpp b/Client/mods/deathmatch/logic/CResource.cpp
index 663b6208a77..28ed709e914 100644
--- a/Client/mods/deathmatch/logic/CResource.cpp
+++ b/Client/mods/deathmatch/logic/CResource.cpp
@@ -258,7 +258,7 @@ void CResource::Load()
         m_pResourceTXDRoot->SetParent(m_pResourceEntity);
     }
 
-    CLogger::LogPrintf("> Starting resource '%s'", *m_strResourceName);
+    CLogger::LogPrintf("> Starting resource '%s'\n", *m_strResourceName);
 
     // Flag resource files as readable
     for (std::list<CResourceConfigItem*>::iterator iter = m_ConfigFiles.begin(); iter != m_ConfigFiles.end(); ++iter)
diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionDefs.Util.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionDefs.Util.cpp
index 978fb139e8d..2df7db7cea2 100644
--- a/Client/mods/deathmatch/logic/lua/CLuaFunctionDefs.Util.cpp
+++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionDefs.Util.cpp
@@ -238,7 +238,7 @@ int CLuaFunctionDefs::GetKeyboardLayout(lua_State* luaVM)
             case 0:            // Left to right (English)
                 readingLayout = "ltr";
                 break;
-            case 1:            // Right to left (Arabic, Hebrew)
+            case 1:            // Right to left (Arabic, Hebrew, and Persian)
                 readingLayout = "rtl";
                 break;
             case 2:            // Vertical top to bottom with columns to the left and also left to right (Japanese)
diff --git a/Server/mods/deathmatch/logic/CResource.cpp b/Server/mods/deathmatch/logic/CResource.cpp
index 276610e98d3..1c9857fccc2 100644
--- a/Server/mods/deathmatch/logic/CResource.cpp
+++ b/Server/mods/deathmatch/logic/CResource.cpp
@@ -2248,7 +2248,7 @@ bool CResource::RemoveFile(const char* szName)
                 m_ResourceFiles.remove(pFileFound);
             }
             else
-                CLogger::LogPrintf("WARNING: Problems removing resource file from memory");
+                CLogger::LogPrintf("WARNING: Problems removing resource file from memory\n");
         }
 
         // Delete the file
@@ -2256,7 +2256,7 @@ bool CResource::RemoveFile(const char* szName)
         snprintf(szFullFilepath, MAX_PATH, "%s%s", m_strResourceDirectoryPath.c_str(), szName);
 
         if (File::Delete(szFullFilepath) != 0)
-            CLogger::LogPrintf("WARNING: Problems deleting the actual file, but was removed from resource");
+            CLogger::LogPrintf("WARNING: Problems deleting the actual file, but was removed from resource\n");
 
         // Delete the metafile
         pMetaFile->Write();
diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaResourceDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaResourceDefs.cpp
index a09e1888a8d..58660c21ba0 100644
--- a/Server/mods/deathmatch/logic/luadefs/CLuaResourceDefs.cpp
+++ b/Server/mods/deathmatch/logic/luadefs/CLuaResourceDefs.cpp
@@ -339,7 +339,7 @@ int CLuaResourceDefs::addResourceConfig(lua_State* luaVM)
         iType = CResourceFile::RESOURCE_FILE_TYPE_CONFIG;
         if (strType != "server")
         {
-            CLogger::LogPrintf("WARNING: Unknown config file type specified for %s. Defaulting to 'server'", lua_tostring(luaVM, lua_upvalueindex(1)));
+            CLogger::LogPrintf("WARNING: Unknown config file type specified for %s. Defaulting to 'server'\n", lua_tostring(luaVM, lua_upvalueindex(1)));
         }
     }
 
diff --git a/Server/mods/deathmatch/logic/packets/CUnoccupiedVehicleSyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CUnoccupiedVehicleSyncPacket.cpp
index 3f9369f56e9..7a51d7cb192 100644
--- a/Server/mods/deathmatch/logic/packets/CUnoccupiedVehicleSyncPacket.cpp
+++ b/Server/mods/deathmatch/logic/packets/CUnoccupiedVehicleSyncPacket.cpp
@@ -27,7 +27,7 @@ bool CUnoccupiedVehicleSyncPacket::Read(NetBitStreamInterface& BitStream)
     {
         if (i > uiMaxCount)
         {
-            CLogger::LogPrintf("WARN: Received excess unoccupied vehicle sync data (%d bytes)", BitStream.GetNumberOfUnreadBits() / 8);
+            CLogger::LogPrintf("WARN: Received excess unoccupied vehicle sync data (%d bytes)\n", BitStream.GetNumberOfUnreadBits() / 8);
             break;
         }
 
diff --git a/utils/buildactions/install_data.lua b/utils/buildactions/install_data.lua
index 930ecf35197..3de69e7b887 100644
--- a/utils/buildactions/install_data.lua
+++ b/utils/buildactions/install_data.lua
@@ -5,18 +5,19 @@ premake.modules.install_data = {}
 -- Config variables
 local BIN_DIR = "Bin"
 local DATA_DIR = "Shared/data/MTA San Andreas"
+local BASE_URL = "https://mirror-cdn.multitheftauto.com/bdata/1.6/"
 
-local NET_PATH_X86_WIN = "https://mirror-cdn.multitheftauto.com/bdata/net.dll"
-local NET_PATH_X64_WIN = "https://mirror-cdn.multitheftauto.com/bdata/net_64.dll"
-local NET_PATH_ARM64_WIN = "https://mirror-cdn.multitheftauto.com/bdata/net_arm64.dll"
-local NETC_PATH_WIN = "https://mirror-cdn.multitheftauto.com/bdata/netc.dll"
+local NET_PATH_X86_WIN   = BASE_URL .. "net.dll"
+local NET_PATH_X64_WIN   = BASE_URL .. "net_64.dll"
+local NET_PATH_ARM64_WIN = BASE_URL .. "net_arm64.dll"
+local NETC_PATH_WIN      = BASE_URL .. "netc.dll"
 
-local NET_PATH_X86_LINUX = "https://mirror-cdn.multitheftauto.com/bdata/net.so"
-local NET_PATH_X64_LINUX = "https://mirror-cdn.multitheftauto.com/bdata/net_64.so"
-local NET_PATH_ARM_LINUX = "https://mirror-cdn.multitheftauto.com/bdata/net_arm.so"
-local NET_PATH_ARM64_LINUX = "https://mirror-cdn.multitheftauto.com/bdata/net_arm64.so"
+local NET_PATH_X86_LINUX   = BASE_URL .. "net.so"
+local NET_PATH_X64_LINUX   = BASE_URL .. "net_64.so"
+local NET_PATH_ARM_LINUX   = BASE_URL .. "net_arm.so"
+local NET_PATH_ARM64_LINUX = BASE_URL .. "net_arm64.so"
 
-local NET_PATH_X64_MACOS = "https://mirror-cdn.multitheftauto.com/bdata/net.dylib"
+local NET_PATH_X64_MACOS = BASE_URL .. "net.dylib"
 
 newaction {
 	trigger = "install_data",
diff --git a/utils/localization/build_locale_nsi.py b/utils/localization/build_locale_nsi.py
index d00a4310413..84a386bce38 100644
--- a/utils/localization/build_locale_nsi.py
+++ b/utils/localization/build_locale_nsi.py
@@ -95,7 +95,7 @@
     "yo" : "Yoruba",
 }
 
-rtl_locales = [ "ar", "he" ]
+rtl_locales = [ "ar", "he", "fa"]
 
 
 def escape_nsis(msgstr: str) -> str:
diff --git a/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h b/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h
index 2fb478ed647..df8aeb57aa4 100644
--- a/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h
+++ b/vendor/cegui-0.4.0-custom/include/CEGUIStringBidi.h
@@ -161,7 +161,7 @@ typedef struct{
 
 /* Kept near the actual table, for verification. */
 #define SHAPE_FIRST 0x621
-#define SHAPE_LAST 0x64A
+#define SHAPE_LAST 0x6CC
 /* very bad Memory alignment for 32-bit machines
  * could split it to 2 arrays or promote type to 2 bytes type
  */
@@ -208,7 +208,137 @@ const shape_node shapetypes[] = {
 /* 647 */ {SD, 0xFEE9},
 /* 648 */ {SR, 0xFEED},
 /* 649 */ {SR, 0xFEEF}, /* SD */
-/* 64A */ {SD, 0xFEF1}
+/* 64A */ {SD, 0xFEF1},
+/* 64B */ {SU, 0x0},
+/* 64C */ {SU, 0x0},
+/* 64D */ {SU, 0x0},
+/* 64E */ {SU, 0x0},
+/* 64F */ {SU, 0x0},
+/* 650 */ {SU, 0x0},
+/* 651 */ {SU, 0x0},
+/* 652 */ {SU, 0x0},
+/* 653 */ {SU, 0x0},
+/* 654 */ {SU, 0x0},
+/* 655 */ {SU, 0x0},
+/* 656 */ {SU, 0x0},
+/* 657 */ {SU, 0x0},
+/* 658 */ {SU, 0x0},
+/* 659 */ {SU, 0x0},
+/* 65A */ {SU, 0x0},
+/* 65B */ {SU, 0x0},
+/* 65C */ {SU, 0x0},
+/* 65D */ {SU, 0x0},
+/* 65E */ {SU, 0x0},
+/* 65F */ {SU, 0x0},
+/* 660 */ {SU, 0x0},
+/* 661 */ {SU, 0x0},
+/* 662 */ {SU, 0x0},
+/* 663 */ {SU, 0x0},
+/* 664 */ {SU, 0x0},
+/* 665 */ {SU, 0x0},
+/* 666 */ {SU, 0x0},
+/* 667 */ {SU, 0x0},
+/* 668 */ {SU, 0x0},
+/* 669 */ {SU, 0x0},
+/* 66A */ {SU, 0x0},
+/* 66B */ {SU, 0x0},
+/* 66C */ {SU, 0x0},
+/* 66D */ {SU, 0x0},
+/* 66E */ {SU, 0x0},
+/* 66F */ {SU, 0x0},
+/* 670 */ {SU, 0x0},
+/* 671 */ {SU, 0x0},
+/* 672 */ {SU, 0x0},
+/* 673 */ {SU, 0x0},
+/* 674 */ {SU, 0x0},
+/* 675 */ {SU, 0x0},
+/* 676 */ {SU, 0x0},
+/* 677 */ {SU, 0x0},
+/* 678 */ {SU, 0x0},
+/* 679 */ {SU, 0x0},
+/* 67A */ {SU, 0x0},
+/* 67B */ {SU, 0x0},
+/* 67C */ {SU, 0x0},
+/* 67D */ {SU, 0x0},
+/* 67E */ {SD, 0xFB56},
+/* 67F */ {SU, 0x0},
+/* 680 */ {SU, 0x0},
+/* 681 */ {SU, 0x0},
+/* 682 */ {SU, 0x0},
+/* 683 */ {SU, 0x0},
+/* 684 */ {SU, 0x0},
+/* 685 */ {SU, 0x0},
+/* 686 */ {SD, 0xFB7A},
+/* 687 */ {SU, 0x0},
+/* 688 */ {SU, 0x0},
+/* 689 */ {SU, 0x0},
+/* 68A */ {SU, 0x0},
+/* 68B */ {SU, 0x0},
+/* 68C */ {SU, 0x0},
+/* 68D */ {SU, 0x0},
+/* 68E */ {SU, 0x0},
+/* 68F */ {SU, 0x0},
+/* 690 */ {SU, 0x0},
+/* 691 */ {SU, 0x0},
+/* 692 */ {SU, 0x0},
+/* 693 */ {SU, 0x0},
+/* 694 */ {SU, 0x0},
+/* 695 */ {SU, 0x0},
+/* 696 */ {SU, 0x0},
+/* 697 */ {SU, 0x0},
+/* 698 */ {SR, 0xFB8A},
+/* 699 */ {SU, 0x0},
+/* 69A */ {SU, 0x0},
+/* 69B */ {SU, 0x0},
+/* 69C */ {SU, 0x0},
+/* 69D */ {SU, 0x0},
+/* 69E */ {SU, 0x0},
+/* 69F */ {SU, 0x0},
+/* 6A0 */ {SU, 0x0},
+/* 6A1 */ {SU, 0x0},
+/* 6A2 */ {SU, 0x0},
+/* 6A3 */ {SU, 0x0},
+/* 6A4 */ {SU, 0x0},
+/* 6A5 */ {SU, 0x0},
+/* 6A6 */ {SU, 0x0},
+/* 6A7 */ {SU, 0x0},
+/* 6A8 */ {SU, 0x0},
+/* 6A9 */ {SD, 0xFB8E},
+/* 6AA */ {SU, 0x0},
+/* 6AB */ {SU, 0x0},
+/* 6AC */ {SU, 0x0},
+/* 6AD */ {SU, 0x0},
+/* 6AE */ {SU, 0x0},
+/* 6AF */ {SD, 0xFB92},
+/* 6B0 */ {SU, 0x0},
+/* 6B1 */ {SU, 0x0},
+/* 6B2 */ {SU, 0x0},
+/* 6B3 */ {SU, 0x0},
+/* 6B4 */ {SU, 0x0},
+/* 6B5 */ {SU, 0x0},
+/* 6B6 */ {SU, 0x0},
+/* 6B7 */ {SU, 0x0},
+/* 6B8 */ {SU, 0x0},
+/* 6B9 */ {SU, 0x0},
+/* 6BA */ {SU, 0x0},
+/* 6BB */ {SU, 0x0},
+/* 6BC */ {SU, 0x0},
+/* 6BD */ {SU, 0x0},
+/* 6BE */ {SU, 0x0},
+/* 6BF */ {SU, 0x0},
+/* 6C0 */ {SD, 0xFBA4},
+/* 6C1 */ {SU, 0x0},
+/* 6C2 */ {SU, 0x0},
+/* 6C3 */ {SU, 0x0},
+/* 6C4 */ {SU, 0x0},
+/* 6C5 */ {SU, 0x0},
+/* 6C6 */ {SU, 0x0},
+/* 6C7 */ {SU, 0x0},
+/* 6C8 */ {SU, 0x0},
+/* 6C9 */ {SU, 0x0},
+/* 6CA */ {SU, 0x0},
+/* 6CB */ {SU, 0x0},
+/* 6CC */ {SD, 0xFBFC}
 };
 
 /*
