try
diff --git a/kotlin-native/runtime/src/main/cpp/Runtime.cpp b/kotlin-native/runtime/src/main/cpp/Runtime.cpp
index 1ffd248..1fd41f2 100644
--- a/kotlin-native/runtime/src/main/cpp/Runtime.cpp
+++ b/kotlin-native/runtime/src/main/cpp/Runtime.cpp
@@ -68,10 +68,10 @@
 constexpr RuntimeState* kInvalidRuntime = nullptr;
 
 THREAD_LOCAL_VARIABLE RuntimeState* runtimeState = kInvalidRuntime;
-
-PERFORMANCE_INLINE inline bool isValidRuntime() {
-  return ::runtimeState != kInvalidRuntime;
-}
+//
+//PERFORMANCE_INLINE inline bool isValidRuntime() {
+//  return ::runtimeState != kInvalidRuntime;
+//}
 
 std::atomic<int> aliveRuntimesCount = 0;
 
@@ -83,15 +83,16 @@
 
 std::atomic<GlobalRuntimeStatus> globalRuntimeStatus = kGlobalRuntimeUninitialized;
 
-void Kotlin_deinitRuntimeCallback(void* argument);
+//void Kotlin_deinitRuntimeCallback(void* argument);
 
-NO_INLINE RuntimeState* initRuntime() {
+NO_INLINE RuntimeState* initRuntime(RuntimeState* state) {
   SetKonanTerminateHandler();
   initObjectPool();
-  RuntimeState* result = new RuntimeState();
-  if (!result) return kInvalidRuntime;
-  RuntimeCheck(!isValidRuntime(), "No active runtimes allowed");
-  ::runtimeState = result;
+//  RuntimeState* result = new RuntimeState();
+//  if (!result) return kInvalidRuntime;
+//  RuntimeCheck(!isValidRuntime(), "No active runtimes allowed");
+//  ::runtimeState = result;
+    RuntimeState* result = state;
 
   // First update `aliveRuntimesCount` and then update `globalRuntimeStatus`, for synchronization with
   // runtime shutdown, which does it the other way around.
@@ -115,18 +116,19 @@
   result->status = RuntimeStatus::kRunning;
 
   // Register runtime deinit function at thread cleanup.
-  konan::onThreadExit(Kotlin_deinitRuntimeCallback, runtimeState);
+  //konan::onThreadExit(Kotlin_deinitRuntimeCallback, runtimeState);
 
   return result;
 }
 
 void deinitRuntime(RuntimeState* state, bool destroyRuntime) {
+  RuntimeAssert(mm::IsCurrentThreadRegistered(), "");
   AssertThreadState(state->memoryState, kotlin::ThreadState::kRunnable);
   RuntimeAssert(state->status == RuntimeStatus::kRunning, "Runtime must be in the running state");
   state->status = RuntimeStatus::kDestroying;
   // This may be called after TLS is zeroed out, so ::runtimeState and ::memoryState in Memory cannot be trusted.
   // TODO: This may in fact reallocate TLS without guarantees that it'll be deallocated again.
-  ::runtimeState = state;
+  //::runtimeState = state;
   --aliveRuntimesCount;
   ClearTLS(state->memoryState);
   if (destroyRuntime)
@@ -140,17 +142,34 @@
   // Do not use ThreadStateGuard because memoryState will be destroyed during DeinitMemory.
   kotlin::SwitchThreadState(state->memoryState, kotlin::ThreadState::kNative);
   DeinitMemory(state->memoryState, destroyRuntime);
+  // TODO maybe clear currentThreadDataNode_?
   delete state;
   WorkerDestroyThreadDataIfNeeded(workerId);
-  ::runtimeState = kInvalidRuntime;
+  //::runtimeState = kInvalidRuntime;
 }
 
-void Kotlin_deinitRuntimeCallback(void* argument) {
-  auto* state = reinterpret_cast<RuntimeState*>(argument);
-  // This callback may be called from any state, make sure it runs in the runnable state.
-  kotlin::SwitchThreadState(state->memoryState, kotlin::ThreadState::kRunnable, /* reentrant = */ true);
-  deinitRuntime(state, false);
-}
+class RuntimeInitializer {
+public:
+    RuntimeInitializer() {
+        ::runtimeState = &state_;
+        initRuntime(&state_);
+    }
+
+    ~RuntimeInitializer() {
+        deinitRuntime(&state_, false);
+        ::runtimeState = kInvalidRuntime;
+    }
+
+private:
+    RuntimeState state_;
+};
+
+//void Kotlin_deinitRuntimeCallback(void* argument) {
+//  auto* state = reinterpret_cast<RuntimeState*>(argument);
+//  // This callback may be called from any state, make sure it runs in the runnable state.
+//  kotlin::SwitchThreadState(state->memoryState, kotlin::ThreadState::kRunnable, /* reentrant = */ true);
+//  deinitRuntime(state, false);
+//}
 
 }  // namespace
 
@@ -184,15 +203,17 @@
 }
 
 PERFORMANCE_INLINE RUNTIME_NOTHROW void Kotlin_initRuntimeIfNeeded() {
-  if (!isValidRuntime()) {
-    initRuntime();
-  }
+    static thread_local RuntimeInitializer initializer{};
+//  if (!isValidRuntime()) {
+//    initRuntime();
+//  }
 }
 
 void deinitRuntimeIfNeeded() {
-  if (isValidRuntime()) {
-    deinitRuntime(::runtimeState, false);
-  }
+    // TODO
+//  if (isValidRuntime()) {
+//    deinitRuntime(::runtimeState, false);
+//  }
 }
 
 // TODO: Consider exporting it to interop API.