diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 1c8dae632..62e2a8ac9 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -13,14 +13,17 @@ jobs:
             toolchain:
               download-url: https://download.swift.org/swift-6.0.2-release/ubuntu2204/swift-6.0.2-RELEASE/swift-6.0.2-RELEASE-ubuntu22.04.tar.gz
             wasi-backend: Node
+            target: "wasm32-unknown-wasi"
           - os: ubuntu-22.04
             toolchain:
               download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a-ubuntu22.04.tar.gz
             wasi-backend: Node
+            target: "wasm32-unknown-wasi"
           - os: ubuntu-22.04
             toolchain:
               download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a/swift-DEVELOPMENT-SNAPSHOT-2025-02-26-a-ubuntu22.04.tar.gz
             wasi-backend: Node
+            target: "wasm32-unknown-wasip1-threads"
 
     runs-on: ${{ matrix.entry.os }}
     env:
@@ -33,6 +36,8 @@ jobs:
           download-url: ${{ matrix.entry.toolchain.download-url }}
       - uses: swiftwasm/setup-swiftwasm@v2
         id: setup-swiftwasm
+        with:
+          target: ${{ matrix.entry.target }}
       - name: Configure Swift SDK
         run: echo "SWIFT_SDK_ID=${{ steps.setup-swiftwasm.outputs.swift-sdk-id }}" >> $GITHUB_ENV
       - run: make bootstrap
diff --git a/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h b/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h
index 08efcb948..0fa08c9e7 100644
--- a/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h
+++ b/Sources/_CJavaScriptEventLoop/include/_CJavaScriptEventLoop.h
@@ -66,7 +66,7 @@ extern void *_Nullable swift_task_asyncMainDrainQueue_hook SWIFT_NONISOLATED_UNS
 
 /// MARK: - thread local storage
 
-extern _Thread_local void * _Nullable swjs_thread_local_event_loop;
+extern _Thread_local void * _Nullable swjs_thread_local_event_loop SWIFT_NONISOLATED_UNSAFE;
 
 extern _Thread_local void * _Nullable swjs_thread_local_task_executor_worker SWIFT_NONISOLATED_UNSAFE;
 
diff --git a/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift b/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift
index 726f4da75..3848ba4cc 100644
--- a/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift
+++ b/Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift
@@ -8,8 +8,8 @@ import _CJavaScriptKit // For swjs_get_worker_thread_id
 func isMainThread() -> Bool
 
 final class WebWorkerTaskExecutorTests: XCTestCase {
-    override func setUp() {
-        WebWorkerTaskExecutor.installGlobalExecutor()
+    override func setUp() async {
+        await WebWorkerTaskExecutor.installGlobalExecutor()
     }
 
     func testTaskRunOnMainThread() async throws {
@@ -152,48 +152,46 @@ final class WebWorkerTaskExecutorTests: XCTestCase {
 
     func testThreadLocalPerThreadValues() async throws {
         struct Check {
-            @ThreadLocal(boxing: ())
-            static var value: Int?
+            static let value = ThreadLocal<Int>(boxing: ())
         }
         let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)
-        XCTAssertNil(Check.value)
-        Check.value = 42
-        XCTAssertEqual(Check.value, 42)
+        XCTAssertNil(Check.value.wrappedValue)
+        Check.value.wrappedValue = 42
+        XCTAssertEqual(Check.value.wrappedValue, 42)
 
         let task = Task(executorPreference: executor) {
-            XCTAssertEqual(Check.value, nil)
-            Check.value = 100
-            XCTAssertEqual(Check.value, 100)
-            return Check.value
+            XCTAssertNil(Check.value.wrappedValue)
+            Check.value.wrappedValue = 100
+            XCTAssertEqual(Check.value.wrappedValue, 100)
+            return Check.value.wrappedValue
         }
         let result = await task.value
         XCTAssertEqual(result, 100)
-        XCTAssertEqual(Check.value, 42)
+        XCTAssertEqual(Check.value.wrappedValue, 42)
         executor.terminate()
     }
 
     func testLazyThreadLocalPerThreadInitialization() async throws {
         struct Check {
-            static var valueToInitialize = 42
-            static var countOfInitialization = 0
-            @LazyThreadLocal(initialize: {
+            nonisolated(unsafe) static var valueToInitialize = 42
+            nonisolated(unsafe) static var countOfInitialization = 0
+            static let value = LazyThreadLocal<Int>(initialize: {
                 countOfInitialization += 1
                 return valueToInitialize
             })
-            static var value: Int
         }
         let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)
         XCTAssertEqual(Check.countOfInitialization, 0)
-        XCTAssertEqual(Check.value, 42)
+        XCTAssertEqual(Check.value.wrappedValue, 42)
         XCTAssertEqual(Check.countOfInitialization, 1)
 
         Check.valueToInitialize = 100
 
         let task = Task(executorPreference: executor) {
             XCTAssertEqual(Check.countOfInitialization, 1)
-            XCTAssertEqual(Check.value, 100)
+            XCTAssertEqual(Check.value.wrappedValue, 100)
             XCTAssertEqual(Check.countOfInitialization, 2)
-            return Check.value
+            return Check.value.wrappedValue
         }
         let result = await task.value
         XCTAssertEqual(result, 100)