diff --git a/sparserestore/__init__.py b/sparserestore/__init__.py
index d1c033c..8e82b2d 100644
--- a/sparserestore/__init__.py
+++ b/sparserestore/__init__.py
@@ -8,15 +8,14 @@ from pymobiledevice3.exceptions import PyMobileDevice3Exception
 from . import backup
 from .backup import _FileMode as FileMode
 
-def perform_restore(backup: backup.Backup, reboot: bool = False):
+async def perform_restore(backup: backup.Backup, reboot: bool = False):
     with TemporaryDirectory() as backup_dir:
         backup.write_to_directory(Path(backup_dir))
             
-        lockdown = create_using_usbmux()
-        with Mobilebackup2Service(lockdown) as mb:
-            mb.restore(backup_dir, system=True, reboot=False, copy=False, source=".")
+        async with await create_using_usbmux() as lockdown, Mobilebackup2Service(lockdown) as mb:
+            await mb.restore(backup_dir, system=True, reboot=False, copy=False, source=".")
 
-def exploit_write_file(file: backup.BackupFile):
+async def exploit_write_file(file: backup.BackupFile):
     # Exploits in use:
     # - Path after SysContainerDomain- or SysSharedContainerDomain- is not sanitized
     # - SysContainerDomain will follow symlinks
@@ -34,7 +33,7 @@ def exploit_write_file(file: backup.BackupFile):
     ])
 
     try:
-        perform_restore(back)
+        await perform_restore(back)
     except PyMobileDevice3Exception as e:
         if "crash_on_purpose" not in str(e):
             raise e
diff --git a/trollstore.py b/trollstore.py
index d45ec60..eb9acc0 100644
--- a/trollstore.py
+++ b/trollstore.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python3
+import asyncio
 import platform
 import sys
 import traceback
@@ -6,9 +8,8 @@ from pathlib import Path
 import click
 import requests
 from packaging.version import parse as parse_version
-from pymobiledevice3.cli.cli_common import Command
 from pymobiledevice3.exceptions import NoDeviceConnectedError, PyMobileDevice3Exception
-from pymobiledevice3.lockdown import LockdownClient
+from pymobiledevice3.lockdown import LockdownClient, create_using_usbmux
 from pymobiledevice3.services.diagnostics import DiagnosticsService
 from pymobiledevice3.services.installation_proxy import InstallationProxyService
 
@@ -22,9 +23,17 @@ def exit(code=0):
     sys.exit(code)
 
 
-@click.command(cls=Command)
-@click.pass_context
-def cli(ctx, service_provider: LockdownClient) -> None:
+@click.command()
+def cli() -> None:
+    asyncio.run(_cli())
+
+
+async def _cli() -> None:
+    async with await create_using_usbmux() as service_provider:
+        await run(service_provider)
+
+
+async def run(service_provider: LockdownClient) -> None:
     os_names = {
         "iPhone": "iOS",
         "iPad": "iPadOS",
@@ -35,8 +44,8 @@ def cli(ctx, service_provider: LockdownClient) -> None:
         "RealityDevice": "visionOS",
     }
 
-    device_class = service_provider.get_value(key="DeviceClass")
-    device_build = service_provider.get_value(key="BuildVersion")
+    device_class = await service_provider.get_value(key="DeviceClass")
+    device_build = await service_provider.get_value(key="BuildVersion")
     device_version = parse_version(service_provider.product_version)
 
     if not all([device_class, device_build, device_version]):
@@ -67,7 +76,7 @@ Enter the app name"""
     if not app.endswith(".app"):
         app += ".app"
 
-    apps_json = InstallationProxyService(service_provider).get_apps(application_type="System", calculate_sizes=False)
+    apps_json = await InstallationProxyService(service_provider).get_apps(application_type="System", calculate_sizes=False)
 
     app_path = None
     for key, value in apps_json.items():
@@ -129,7 +138,7 @@ Enter the app name"""
     )
 
     try:
-        perform_restore(back, reboot=False)
+        await perform_restore(back, reboot=False)
     except PyMobileDevice3Exception as e:
         if "Find My" in str(e):
             click.secho("Find My must be disabled in order to use this tool.", fg="red")
@@ -140,8 +149,8 @@ Enter the app name"""
 
     click.secho("Rebooting device", fg="green")
 
-    with DiagnosticsService(service_provider) as diagnostics_service:
-        diagnostics_service.restart()
+    async with DiagnosticsService(service_provider) as diagnostics_service:
+        await diagnostics_service.restart()
 
     click.secho("Make sure you turn Find My iPhone back on if you use it after rebooting.", fg="green")
     click.secho("Make sure to install a proper persistence helper into the app you chose after installing TrollStore!\n", fg="green")
