diff --git a/FAQ.md b/FAQ.md
index 64d21c5..804fec4 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -160,6 +160,185 @@ If you wind up in the installer again after you've installed macOS it means you
Congratulations, you got a macOS VM up and running! Now what?
+# Fixing Apple ID Login Issues in macOS Virtual Machines
+
+## Problem Overview
+
+When running macOS in a virtual machine, you may encounter problems logging into Apple services including:
+- Apple ID
+- iMessage
+- iCloud
+- App Store
+
+This happens because Apple's services can detect that macOS is running in a virtual environment and block access. The solution is to apply a kernel patch that hides the VM presence from Apple's detection mechanism.
+
+NOTE as per forum post: Unfortunately, this would very possibly break qemu-guest-agent, which is necessary for the host getting VM status or taking hot snapshot while the VM is running. This is because qemu-guest-agent also checks the hv_vmm_present flag, but only works if it is true (=1).
+
+Use at your own risk. Hope it would help.
+
+## Solution: Kernel Patching
+
+This guide provides three methods to apply the necessary kernel patch. All methods implement the same fix originally described in [this forum post](https://forum.proxmox.com/threads/anyone-can-make-bluetooth-work-on-sonoma.153301/#post-697832).
+
+### Prerequisites
+
+Before proceeding with any method:
+- Make sure you can access your EFI partition
+- Locate your OpenCore `config.plist` file (typically in the `EFI/OC` folder)
+- Back up your current `config.plist` before making changes
+
+## Method 1: Using the Utility Script (Simplest Approach)
+
+This is the fastest and easiest way to apply the patch.
+
+1. Mount your EFI partition using Clover Configurator or another EFI mounting tool
+2. Download the patch script:
+ ```bash
+ curl -o apply_appleid_kernelpatch.py https://raw.githubusercontent.com/sickcodes/Docker-OSX/scripts/apply_appleid_kernelpatch.py
+ ```
+3. Run the script with your `config.plist` file path:
+ ```bash
+ python3 apply_appleid_kernelpatch.py /path/to/config.plist
+ ```
+
+**Pro Tip**: You can drag and drop the `config.plist` file into your terminal after typing `python3 apply_appleid_kernelpatch.py` for an easy path insertion.
+
+**Note**: If you encounter a "permission denied" error, run the command with `sudo`:
+```bash
+sudo python3 apply_appleid_kernelpatch.py /path/to/config.plist
+```
+
+## Method 2: Using OCAT (OpenCore Auxiliary Tools) GUI
+
+If you prefer a graphical approach:
+
+1. Open OCAT and load your `config.plist`
+2. Navigate to the **Kernel** section
+3. Go to the **Patch** subsection
+4. Add two new patch entries with the following details:
+
+### Patch 1
+| Setting | Value |
+|---------|-------|
+| **Identifier** | `kernel` |
+| **Base** | *(leave empty)* |
+| **Count** | `1` |
+| **Find (Hex)** | `68696265726E61746568696472656164790068696265726E617465636F756E7400` |
+| **Limit** | `0` |
+| **Mask** | *(leave empty)* |
+| **Replace (Hex)** | `68696265726E61746568696472656164790068765F766D6D5F70726573656E7400` |
+| **Skip** | `0` |
+| **Arch** | `x86_64` |
+| **MinKernel** | `20.4.0` |
+| **MaxKernel** | *(leave empty)* |
+| **Enabled** | `True` |
+| **Comment** | `Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0` |
+
+### Patch 2
+| Setting | Value |
+|---------|-------|
+| **Identifier** | `kernel` |
+| **Base** | *(leave empty)* |
+| **Count** | `1` |
+| **Find (Hex)** | `626F6F742073657373696F6E20555549440068765F766D6D5F70726573656E7400` |
+| **Limit** | `0` |
+| **Mask** | *(leave empty)* |
+| **Replace (Hex)** | `626F6F742073657373696F6E20555549440068696265726E617465636F756E7400` |
+| **Skip** | `0` |
+| **Arch** | `x86_64` |
+| **MinKernel** | `22.0.0` |
+| **MaxKernel** | *(leave empty)* |
+| **Enabled** | `True` |
+| **Comment** | `Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0` |
+
+5. Save the configuration
+6. Reboot your VM
+
+## Method 3: Direct `config.plist` Editing
+
+For users who prefer to manually edit the configuration file:
+
+1. Mount your EFI partition
+2. Locate and open your `config.plist` file in a text editor
+3. Find the `Kernel` → `` → `Patch` → `` section
+4. Add these two `` entries within the ``:
+
+```xml
+
+ Arch
+ x86_64
+ Base
+
+ Comment
+ Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0
+ Count
+ 1
+ Enabled
+
+ Find
+ aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA
+ Identifier
+ kernel
+ Limit
+ 0
+ Mask
+
+ MaxKernel
+
+ MinKernel
+ 20.4.0
+ Replace
+ aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA
+ ReplaceMask
+
+ Skip
+ 0
+
+
+ Arch
+ x86_64
+ Base
+
+ Comment
+ Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0
+ Count
+ 1
+ Enabled
+
+ Find
+ Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA
+ Identifier
+ kernel
+ Limit
+ 0
+ Mask
+
+ MaxKernel
+
+ MinKernel
+ 22.0.0
+ Replace
+ Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA
+ ReplaceMask
+
+ Skip
+ 0
+
+```
+
+5. Save the file
+6. Reboot your VM
+
+## Important Notes
+
+- The `MinKernel` values (`20.4.0` and `22.0.0`) may need adjustment depending on your specific macOS version (Monterey, Ventura, Sonoma, etc.)
+- If you encounter issues, consult the [OpenCore documentation](https://dortania.github.io/docs/) for appropriate values for your setup
+- Always back up your configuration before making changes
+- After applying the patch and rebooting, try signing into Apple services again
+
+## What This Patch Does
+
+This patch tricks macOS into believing it's running on physical hardware by redirecting the `hv_vmm_present` kernel variable, which normally indicates VM presence. After applying the patch, Apple services should function normally within your virtual environment.
### Slow UI
The macOS UI expects and relies on GPU acceleration, and there is (currently) no way to provide GPU acceleration in the virtual hardware. See [osx-optimizer](https://github.com/sickcodes/osx-optimizer) for macOS configuration to speed things up.
diff --git a/scripts/apply_appleid_kernelpatch.py b/scripts/apply_appleid_kernelpatch.py
new file mode 100644
index 0000000..58feb7e
--- /dev/null
+++ b/scripts/apply_appleid_kernelpatch.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python3
+import plistlib
+import base64
+import os
+import sys
+
+def add_kernel_patches(config_path):
+ # Make a backup of the original file
+ backup_path = config_path + '.backup'
+ os.system(f'cp "{config_path}" "{backup_path}"')
+ print(f"Backup created at {backup_path}")
+
+ # Read the plist file
+ with open(config_path, 'rb') as f:
+ config = plistlib.load(f)
+
+ # Prepare the patch entries
+ patch1 = {
+ 'Arch': 'x86_64',
+ 'Base': '',
+ 'Comment': 'Sonoma VM BT Enabler - PART 1 of 2 - Patch kern.hv_vmm_present=0',
+ 'Count': 1,
+ 'Enabled': True,
+ 'Find': base64.b64decode('aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA'),
+ 'Identifier': 'kernel',
+ 'Limit': 0,
+ 'Mask': b'',
+ 'MaxKernel': '',
+ 'MinKernel': '20.4.0',
+ 'Replace': base64.b64decode('aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA'),
+ 'ReplaceMask': b'',
+ 'Skip': 0,
+ }
+
+ patch2 = {
+ 'Arch': 'x86_64',
+ 'Base': '',
+ 'Comment': 'Sonoma VM BT Enabler - PART 2 of 2 - Patch kern.hv_vmm_present=0',
+ 'Count': 1,
+ 'Enabled': True,
+ 'Find': base64.b64decode('Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA'),
+ 'Identifier': 'kernel',
+ 'Limit': 0,
+ 'Mask': b'',
+ 'MaxKernel': '',
+ 'MinKernel': '22.0.0',
+ 'Replace': base64.b64decode('Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA'),
+ 'ReplaceMask': b'',
+ 'Skip': 0,
+ }
+
+ # Add patches to the kernel patch section
+ if 'Kernel' in config and 'Patch' in config['Kernel']:
+ # Check if patches already exist
+ patch_exists = False
+ for patch in config['Kernel']['Patch']:
+ if isinstance(patch, dict) and 'Comment' in patch:
+ if 'Sonoma VM BT Enabler' in patch['Comment']:
+ patch_exists = True
+ print(f"Patch already exists: {patch['Comment']}")
+
+ if not patch_exists:
+ config['Kernel']['Patch'].append(patch1)
+ config['Kernel']['Patch'].append(patch2)
+ print("Added both Sonoma VM BT Enabler patches to config.plist")
+
+ else:
+ print("Error: Could not find Kernel -> Patch section in config.plist")
+ return False
+
+ # Write the updated plist file
+ with open(config_path, 'wb') as f:
+ plistlib.dump(config, f)
+
+ print(f"Successfully updated {config_path}")
+ return True
+
+if __name__ == "__main__":
+ if len(sys.argv) != 2:
+ print("Usage: python apply_appleid_kernelpatch.py /path/to/config.plist")
+ sys.exit(1)
+
+ config_path = sys.argv[1]
+ if not os.path.exists(config_path):
+ print(f"Error: File {config_path} does not exist")
+ sys.exit(1)
+
+ success = add_kernel_patches(config_path)
+ if success:
+ print("Patches applied successfully. Please reboot to apply changes.")
+ else:
+ print("Failed to apply patches.")
\ No newline at end of file