diff --git a/.gitignore b/.gitignore
index 6baed8f..af38087 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 download
 output
 python3-env
+token
diff --git a/bin/arm64/lspinit b/bin/arm64/lspinit
new file mode 100644
index 0000000..1045151
Binary files /dev/null and b/bin/arm64/lspinit differ
diff --git a/bin/x64/lspinit b/bin/x64/lspinit
new file mode 100644
index 0000000..e4d2f53
Binary files /dev/null and b/bin/x64/lspinit differ
diff --git a/scripts/build.sh b/scripts/build.sh
index 3c83171..2d72d6a 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -67,7 +67,8 @@ clean_download() {
             rm -f "${MAGISK_PATH:?}"
         fi
         if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then
-            rm -f "${GAPPS_PATH:?}"
+            rm -f "${GAPPS_IMAGE_PATH:?}"
+            rm -f "${GAPPS_RC_PATH:?}"
         fi
         if [ "$CLEAN_DOWNLOAD_KERNELSU" ]; then
             rm -f "${KERNELSU_PATH:?}"
@@ -300,6 +301,7 @@ fi
 }
 declare -A RELEASE_NAME_MAP=(["retail"]="Retail" ["RP"]="Release Preview" ["WIS"]="Insider Slow" ["WIF"]="Insider Fast")
 declare -A ANDROID_API_MAP=(["30"]="11.0" ["32"]="12.1" ["33"]="13.0")
+declare -A ARCH_NAME_MAP=(["x64"]="x86_64" ["arm64"]="arm64")
 RELEASE_NAME=${RELEASE_NAME_MAP[$RELEASE_TYPE]} || abort
 echo -e "INFO: Release Name: $RELEASE_NAME\n"
 WSA_ZIP_PATH=$DOWNLOAD_DIR/wsa-$RELEASE_TYPE.zip
@@ -308,6 +310,7 @@ UWPVCLibs_PATH="$DOWNLOAD_DIR/Microsoft.VCLibs.140.00.UWPDesktop_$ARCH.appx"
 xaml_PATH="$DOWNLOAD_DIR/Microsoft.UI.Xaml.2.8_$ARCH.appx"
 MAGISK_ZIP=magisk-$MAGISK_VER.zip
 MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP
+CUST_PATH="$DOWNLOAD_DIR/cust.img"
 if [ "$CUSTOM_MAGISK" ]; then
     if [ ! -f "$MAGISK_PATH" ]; then
         echo "Custom Magisk $MAGISK_ZIP not found"
@@ -320,9 +323,11 @@ if [ "$CUSTOM_MAGISK" ]; then
     fi
 fi
 ANDROID_API=33
-update_gapps_file_name() {
-    GAPPS_FILE_NAME=GApps-$ARCH-${ANDROID_API_MAP[$ANDROID_API]}.img
-    GAPPS_PATH=$DOWNLOAD_DIR/$GAPPS_FILE_NAME
+update_gapps_files_name() {
+    GAPPS_IMAGE_NAME=gapps-${ANDROID_API_MAP[$ANDROID_API]}-${ARCH_NAME_MAP[$ARCH]}.img
+    GAPPS_RC_NAME=gapps-${ANDROID_API_MAP[$ANDROID_API]}.rc
+    GAPPS_IMAGE_PATH=$DOWNLOAD_DIR/$GAPPS_IMAGE_NAME
+    GAPPS_RC_PATH=$DOWNLOAD_DIR/$GAPPS_RC_NAME
 }
 WSA_MAJOR_VER=0
 getKernelVersion() {
@@ -402,8 +407,8 @@ if [ -z ${OFFLINE+x} ]; then
         echo "KERNELSU_VER=$KERNELSU_VER" >"$KERNELSU_INFO"
     fi
     if [ "$HAS_GAPPS" ]; then
-        update_gapps_file_name
-        python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_FILE_NAME" || abort
+        update_gapps_files_name
+        python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_IMAGE_NAME" || abort
     fi
     if [ -f "$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME" ]; then
         echo "Downloading Artifacts"
@@ -416,15 +421,15 @@ if [ -z ${OFFLINE+x} ]; then
 fi
 declare -A FILES_CHECK_LIST=([xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [UWPVCLibs_PATH]="$UWPVCLibs_PATH")
 if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then
-    FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH")
+    FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH" ["CUST_PATH"]="$CUST_PATH")
 fi
 if [ "$ROOT_SOL" = "kernelsu" ]; then
     update_ksu_zip_name
     FILES_CHECK_LIST+=(["KERNELSU_PATH"]="$KERNELSU_PATH")
 fi
 if [ "$HAS_GAPPS" ]; then
-    update_gapps_file_name
-    FILES_CHECK_LIST+=(["GAPPS_PATH"]="$GAPPS_PATH")
+    update_gapps_files_name
+    FILES_CHECK_LIST+=(["GAPPS_IMAGE_PATH"]="$GAPPS_IMAGE_PATH" ["GAPPS_RC_PATH"]="$GAPPS_RC_PATH")
 fi
 for i in "${FILES_CHECK_LIST[@]}"; do
     if [ ! -f "$i" ]; then
@@ -476,6 +481,7 @@ if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then
         "mkdir 000 .backup" \
         "add 000 overlay.d/init.lsp.magisk.rc init.lsp.magisk.rc" \
         "add 000 overlay.d/sbin/post-fs-data.sh post-fs-data.sh" \
+        "add 000 overlay.d/sbin/lsp_cust.img $CUST_PATH" \
         || abort "Unable to patch initrd"
 elif [ "$ROOT_SOL" = "kernelsu" ]; then
     echo "Extracting KernelSU"
@@ -498,13 +504,13 @@ elif [ "$ROOT_SOL" = "kernelsu" ]; then
 fi
 echo -e "done\n"
 if [ "$HAS_GAPPS" ]; then
-    update_gapps_file_name
-    if [ -f "$GAPPS_PATH" ]; then
+    update_gapps_files_name
+    if [ -f "$GAPPS_IMAGE_PATH" ] && [ -f "$GAPPS_RC_PATH" ]; then
         echo "Integrating GApps"
         "$WORK_DIR/magisk/magiskboot" cpio "$WORK_DIR/wsa/$ARCH/Tools/initrd.img" \
-            "add 000 overlay.d/init.lsp.cust.rc init.lsp.cust.rc" \
             "add 000 /lspolicy.rule sepolicy.rule" \
-            "add 000 overlay.d/sbin/cust.img $GAPPS_PATH" \
+            "add 000 overlay.d/gapps.rc $GAPPS_RC_PATH" \
+            "add 000 overlay.d/sbin/lsp_gapps.img $GAPPS_IMAGE_PATH" \
             || abort "Unable to patch initrd"
         echo -e "done\n"
     else
diff --git a/scripts/extractWSA.py b/scripts/extractWSA.py
index e933383..e564042 100644
--- a/scripts/extractWSA.py
+++ b/scripts/extractWSA.py
@@ -79,6 +79,10 @@ with zipfile.ZipFile(wsa_zip_path) as zip:
             if not Path(workdir / zip_name).is_file():
                 print(f"unzipping {zip_name} to {workdir}", flush=True)
                 zip_path = zip.extract(f, workdir)
+                with zipfile.ZipFile(zip_path) as zip:
+                    stat = Path(zip_path).stat()
+                    print(f"unzipping from {zip_path}", flush=True)
+                    zip.extractall(archdir)
                 ver_no = zip_name.split("_")
                 long_ver = ver_no[1]
                 ver = long_ver.split(".")
@@ -106,7 +110,3 @@ with zipfile.ZipFile(wsa_zip_path) as zip:
                         l.extract(g, xmldir)
                     elif re.search(u'Images/.+\.png', g.filename):
                         l.extract(g, archdir)
-with zipfile.ZipFile(zip_path) as zip:
-    stat = Path(zip_path).stat()
-    print(f"unzipping from {zip_path}", flush=True)
-    zip.extractall(archdir)
diff --git a/scripts/generateGappsLink.py b/scripts/generateGappsLink.py
index 97239e2..459ceb7 100644
--- a/scripts/generateGappsLink.py
+++ b/scripts/generateGappsLink.py
@@ -19,6 +19,7 @@
 #
 
 from datetime import datetime
+import os
 import sys
 
 import requests
@@ -26,6 +27,21 @@ import json
 import re
 from pathlib import Path
 
+
+class BearerAuth(requests.auth.AuthBase):
+    def __init__(self, token):
+        self.token = token
+
+    def __call__(self, r):
+        r.headers["authorization"] = "Bearer " + self.token
+        return r
+
+
+github_auth = None
+if Path.cwd().joinpath('token').exists():
+    with open(Path.cwd().joinpath('token'), 'r') as token_file:
+        github_auth = BearerAuth(token_file.read())
+        print("Using token file for authentication", flush=True)
 arch = sys.argv[1]
 arg2 = sys.argv[2]
 download_dir = Path.cwd().parent / "download" if arg2 == "" else Path(arg2)
@@ -36,27 +52,31 @@ print(f"Generating GApps download link: arch={arch}", flush=True)
 abi_map = {"x64": "x86_64", "arm64": "arm64"}
 android_api_map = {"30": "11.0", "32": "12.1", "33": "13.0"}
 release = android_api_map[android_api]
-res = requests.get(f"https://api.github.com/repos/LSPosed/WSA-Addon/releases/latest")
+res = requests.get(f"https://api.github.com/repos/LSPosed/WSA-Addon/releases/latest", auth=github_auth)
 json_data = json.loads(res.content)
 headers = res.headers
 x_ratelimit_remaining = headers["x-ratelimit-remaining"]
 if res.status_code == 200:
+    download_files = {}
     assets = json_data["assets"]
     for asset in assets:
-        if re.match(f'gapps.*{release}.*{abi_map[arch]}.*\.apex$', asset["name"]):
-            link = asset["browser_download_url"]
+        if re.match(f'GApps.*{release}.*\.rc$', asset["name"]):
+            download_files[asset["name"]] = asset["browser_download_url"]
+            continue
+        elif re.match(f'GApps.*{release}.*{abi_map[arch]}.*\.img$', asset["name"]):
+            download_files[asset["name"]] = asset["browser_download_url"]
             break
+    with open(download_dir/tempScript, 'a') as f:
+        for key, value in download_files.items():
+            print(f"download link: {value}\npath: {download_dir / key}\n", flush=True)
+            f.writelines(value + '\n')
+            f.writelines(f'  dir={download_dir}\n')
+            f.writelines(f'  out={key}\n')
 elif res.status_code == 403 and x_ratelimit_remaining == '0':
     message = json_data["message"]
     print(f"Github API Error: {message}", flush=True)
     ratelimit_reset = headers["x-ratelimit-reset"]
     ratelimit_reset = datetime.fromtimestamp(int(ratelimit_reset))
-    print(f"The current rate limit window resets in {ratelimit_reset}", flush=True)
+    print(
+        f"The current rate limit window resets in {ratelimit_reset}", flush=True)
     exit(1)
-
-print(f"download link: {link}", flush=True)
-
-with open(download_dir/tempScript, 'a') as f:
-    f.writelines(f'{link}\n')
-    f.writelines(f'  dir={download_dir}\n')
-    f.writelines(f'  out={file_name}\n')
diff --git a/scripts/init.lsp.cust.rc b/scripts/init.lsp.cust.rc
deleted file mode 100644
index f02db70..0000000
--- a/scripts/init.lsp.cust.rc
+++ /dev/null
@@ -1,12 +0,0 @@
-on post-fs
-    mkdir /mnt/cust 0775 system system
-    mount erofs loop@${MAGISKTMP}/cust.img /mnt/cust noatime,ro cache_strategy=readaround
-    wait /system_ext
-    mount overlay system_ext_etc_permissions_overlay /system_ext/etc/permissions noatime lowerdir=/system_ext/etc/permissions:/mnt/cust/system_ext/etc/permissions,redirect_dir=on,xino=on
-    mount overlay system_ext_priv-app_overlay /system_ext/priv-app noatime lowerdir=/system_ext/priv-app:/mnt/cust/system_ext/priv-app,redirect_dir=on,xino=on
-    wait /product
-    mount overlay product_overlay /product noatime lowerdir=/product:/mnt/cust/product,redirect_dir=on,xino=on
-    wait /vendor
-    mount overlay vendor_overlay /vendor noatime lowerdir=/vendor:/mnt/cust/vendor,redirect_dir=on,xino=on
-    wait /system
-    mount overlay system_priv-app_overlay /system/priv-app noatime lowerdir=/mnt/cust/system/priv-app:/system/priv-app,redirect_dir=on,xino=on
diff --git a/scripts/post-fs-data.sh b/scripts/post-fs-data.sh
index 8de2af5..506c0ed 100644
--- a/scripts/post-fs-data.sh
+++ b/scripts/post-fs-data.sh
@@ -1,4 +1,4 @@
-#!/system/bin/sh
+#!/bin/sh
 MAGISKTMP=/sbin
 [ -d /sbin ] || MAGISKTMP=/debug_ramdisk
 MAGISKBIN=/data/adb/magisk
@@ -11,17 +11,32 @@ if [ ! -d $MAGISKBIN ]; then
     mkdir -p -m 755 $MAGISKBIN
     chcon u:object_r:system_file:s0 $MAGISKBIN
 fi
-ABI=$(/system/bin/getprop ro.product.cpu.abi)
+ABI=$(getprop ro.product.cpu.abi)
 for file in busybox magiskpolicy magiskboot magiskinit; do
     [ -x "$MAGISKBIN/$file" ] || {
-        /system/bin/unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "lib/$ABI/lib$file.so"
+        unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "lib/$ABI/lib$file.so"
         mv $MAGISKBIN/lib$file.so $MAGISKBIN/$file
         chmod 755 "$MAGISKBIN/$file"
     }
 done
 for file in util_functions.sh boot_patch.sh; do
     [ -x "$MAGISKBIN/$file" ] || {
-        /system/bin/unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "assets/$file"
+        unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "assets/$file"
         chmod 755 "$MAGISKBIN/$file"
     }
 done
+for file in "$MAGISKTMP"/*; do
+    if echo "$file" | grep -Eq "lsp_.+\.img"; then
+        foldername=$(basename "$file" .img)
+        mkdir -p "$MAGISKTMP/$foldername"
+        mount -t auto -o ro,loop "$file" "$MAGISKTMP/$foldername"
+        "$MAGISKTMP/$foldername/post-fs-data.sh" &
+    fi
+done
+wait
+for file in "$MAGISKTMP"/*; do
+    if echo "$file" | grep -Eq "lsp_.+\.img"; then
+        foldername=$(basename "$file" .img)
+        umount "$MAGISKTMP/$foldername"
+    fi
+done