diff --git a/nx/include/switch/runtime/env.h b/nx/include/switch/runtime/env.h
index ac311e17..6f207ef6 100644
--- a/nx/include/switch/runtime/env.h
+++ b/nx/include/switch/runtime/env.h
@@ -34,6 +34,8 @@ enum {
     EntryType_ProcessHandle=10,       ///< Provides the process handle.
     EntryType_LastLoadResult=11,      ///< Provides the last load result.
     EntryType_RandomSeed=14,          ///< Provides random data used to seed the pseudo-random number generator.
+    EntryType_UserIdStorage=15,       ///< Provides persistent storage for the preselected user id.
+    EntryType_HosVersion=16,          ///< Provides the currently running Horizon OS version.
 };
 
 enum {
@@ -51,6 +53,11 @@ typedef void NORETURN (*LoaderReturnFn)(int result_code);
  */
 void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr);
 
+/// Returns information text about the loader, if present.
+const char* envGetLoaderInfo(void);
+/// Returns the size of the loader information text.
+u64 envGetLoaderInfoSize(void);
+
 /// Retrieves the handle to the main thread.
 Handle envGetMainThreadHandle(void);
 /// Returns true if the application is running as NSO, otherwise NRO.
@@ -105,3 +112,6 @@ bool envHasRandomSeed(void);
  * @param out Pointer to a u64[2] buffer which will contain the random seed on return.
  */
 void envGetRandomSeed(u64 out[2]);
+
+/// Returns a pointer to the user id storage area (if present).
+u128* envGetUserIdStorage(void);
diff --git a/nx/source/runtime/env.c b/nx/source/runtime/env.c
index 7fe4fdfa..36d5209e 100644
--- a/nx/source/runtime/env.c
+++ b/nx/source/runtime/env.c
@@ -1,6 +1,7 @@
 // Copyright 2018 plutoo
 #include <string.h>
 #include "runtime/env.h"
+#include "runtime/hosversion.h"
 #include "services/sm.h"
 #include "services/fatal.h"
 #include "services/applet.h"
@@ -8,6 +9,8 @@
 void NORETURN __nx_exit(Result rc, LoaderReturnFn retaddr);
 
 static bool   g_isNso = false;
+static const char* g_loaderInfo = NULL;
+static u64    g_loaderInfoSize = 0;
 static Handle g_mainThreadHandle = INVALID_HANDLE;
 static LoaderReturnFn g_loaderRetAddr = NULL;
 static void*  g_overrideHeapAddr = NULL;
@@ -20,6 +23,7 @@ static char*  g_nextLoadArgv = NULL;
 static Result g_lastLoadResult = 0;
 static bool   g_hasRandomSeed = false;
 static u64    g_randomSeed[2] = { 0, 0 };
+static u128*  g_userIdStorage = NULL;
 
 extern __attribute__((weak)) u32 __nx_applet_type;
 
@@ -99,6 +103,14 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
             g_randomSeed[1] = ent->Value[1];
             break;
 
+        case EntryType_UserIdStorage:
+            g_userIdStorage = (u128*)(uintptr_t)ent->Value[0];
+            break;
+
+        case EntryType_HosVersion:
+            hosversionSet(ent->Value[0]);
+            break;
+
         default:
             if (ent->Flags & EntryFlag_IsMandatory)
             {
@@ -112,6 +124,19 @@ void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr)
         ent++;
     }
 
+    g_loaderInfoSize = ent->Value[1];
+    if (g_loaderInfoSize) {
+        g_loaderInfo = (const char*)(uintptr_t)ent->Value[0];
+    }
+
+}
+
+const char* envGetLoaderInfo(void) {
+    return g_loaderInfo;
+}
+
+u64 envGetLoaderInfoSize(void) {
+    return g_loaderInfoSize;
 }
 
 Handle envGetMainThreadHandle(void) {
@@ -196,3 +221,7 @@ void envGetRandomSeed(u64 out[2]) {
     out[0] = g_randomSeed[0];
     out[1] = g_randomSeed[1];
 }
+
+u128* envGetUserIdStorage(void) {
+    return g_userIdStorage;
+}
diff --git a/nx/source/runtime/init.c b/nx/source/runtime/init.c
index 65fea402..5fda94bb 100644
--- a/nx/source/runtime/init.c
+++ b/nx/source/runtime/init.c
@@ -109,13 +109,15 @@ void __attribute__((weak)) __appInit(void)
     if (R_FAILED(rc))
         fatalSimple(MAKERESULT(Module_Libnx, LibnxError_InitFail_SM));
 
-    rc = setsysInitialize();
-    if (R_SUCCEEDED(rc)) {
-        SetSysFirmwareVersion fw;
-        rc = setsysGetFirmwareVersion(&fw);
-        if (R_SUCCEEDED(rc))
-            hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro));
-        setsysExit();
+    if (hosversionGet() == 0) {
+        rc = setsysInitialize();
+        if (R_SUCCEEDED(rc)) {
+            SetSysFirmwareVersion fw;
+            rc = setsysGetFirmwareVersion(&fw);
+            if (R_SUCCEEDED(rc))
+                hosversionSet(MAKEHOSVERSION(fw.major, fw.minor, fw.micro));
+            setsysExit();
+        }
     }
 
     rc = appletInitialize();