diff --git a/vrclient_x64/Makefile.in b/vrclient_x64/Makefile.in
index a7dbe80f..708cc5f2 100644
--- a/vrclient_x64/Makefile.in
+++ b/vrclient_x64/Makefile.in
@@ -144,6 +144,7 @@ SOURCES = \
 	vrclient_x64/cppIVRTrackedCamera_IVRTrackedCamera_006.cpp \
 	vrclient_x64/json_converter.cpp \
 	vrclient_x64/jsoncpp.cpp \
+	vrclient_x64/unix_vrclientcore_manual.cpp \
 	vrclient_x64/unix_vrcompositor_manual.cpp \
 	vrclient_x64/unix_vroverlay_manual.cpp \
 	vrclient_x64/unix_vrrendermodels_manual.cpp \
diff --git a/vrclient_x64/gen_wrapper.py b/vrclient_x64/gen_wrapper.py
index 1bdf969a..4da79598 100755
--- a/vrclient_x64/gen_wrapper.py
+++ b/vrclient_x64/gen_wrapper.py
@@ -216,7 +216,7 @@ unique_structs = []
 
 MANUAL_METHODS = {
     "IVRClientCore_BIsHmdPresent": lambda ver, abi: abi == 'w',
-    "IVRClientCore_Init": lambda ver, abi: abi == 'w',
+    "IVRClientCore_Init": lambda ver, abi: True,
     "IVRClientCore_GetGenericInterface": lambda ver, abi: abi == 'w',
     "IVRClientCore_Cleanup": lambda ver, abi: abi == 'w',
     "IVRSystem_GetDXGIOutputInfo": lambda ver, abi: abi == 'w',
@@ -235,7 +235,7 @@ MANUAL_METHODS = {
     "IVRRenderModels_LoadRenderModel": lambda ver, abi: ver > 1,
     "IVRRenderModels_LoadRenderModel_Async": True,
     "IVRRenderModels_FreeRenderModel": lambda ver, abi: ver > 1,
-    "IVRMailbox_undoc3": lambda ver, abi: abi == 'w',
+    "IVRMailbox_undoc3": lambda ver, abi: abi == 'u',
     "IVROverlay_SetOverlayTexture": True,
     "IVRInput_GetDigitalActionData": lambda ver, abi: abi == 'w' and ver > 3,
 }
diff --git a/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_002.cpp b/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_002.cpp
index 03869c68..1734abf9 100644
--- a/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_002.cpp
+++ b/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_002.cpp
@@ -1,14 +1,6 @@
 /* This file is auto-generated, do not edit. */
 #include "unix_private.h"
 
-NTSTATUS IVRClientCore_IVRClientCore_002_Init( void *args )
-{
-    struct IVRClientCore_IVRClientCore_002_Init_params *params = (struct IVRClientCore_IVRClientCore_002_Init_params *)args;
-    struct u_IVRClientCore_IVRClientCore_002 *iface = (struct u_IVRClientCore_IVRClientCore_002 *)params->linux_side;
-    params->_ret = (uint32_t)iface->Init( params->eApplicationType );
-    return 0;
-}
-
 NTSTATUS IVRClientCore_IVRClientCore_002_Cleanup( void *args )
 {
     struct IVRClientCore_IVRClientCore_002_Cleanup_params *params = (struct IVRClientCore_IVRClientCore_002_Cleanup_params *)args;
diff --git a/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_003.cpp b/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_003.cpp
index 22f6cf1f..4cd7cbe2 100644
--- a/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_003.cpp
+++ b/vrclient_x64/vrclient_x64/cppIVRClientCore_IVRClientCore_003.cpp
@@ -1,14 +1,6 @@
 /* This file is auto-generated, do not edit. */
 #include "unix_private.h"
 
-NTSTATUS IVRClientCore_IVRClientCore_003_Init( void *args )
-{
-    struct IVRClientCore_IVRClientCore_003_Init_params *params = (struct IVRClientCore_IVRClientCore_003_Init_params *)args;
-    struct u_IVRClientCore_IVRClientCore_003 *iface = (struct u_IVRClientCore_IVRClientCore_003 *)params->linux_side;
-    params->_ret = (uint32_t)iface->Init( params->eApplicationType, params->pStartupInfo );
-    return 0;
-}
-
 NTSTATUS IVRClientCore_IVRClientCore_003_Cleanup( void *args )
 {
     struct IVRClientCore_IVRClientCore_003_Cleanup_params *params = (struct IVRClientCore_IVRClientCore_003_Cleanup_params *)args;
diff --git a/vrclient_x64/vrclient_x64/cppIVRMailbox_IVRMailbox_001.cpp b/vrclient_x64/vrclient_x64/cppIVRMailbox_IVRMailbox_001.cpp
index 0d434467..5ddcfbf5 100644
--- a/vrclient_x64/vrclient_x64/cppIVRMailbox_IVRMailbox_001.cpp
+++ b/vrclient_x64/vrclient_x64/cppIVRMailbox_IVRMailbox_001.cpp
@@ -17,14 +17,6 @@ NTSTATUS IVRMailbox_IVRMailbox_001_undoc2( void *args )
     return 0;
 }
 
-NTSTATUS IVRMailbox_IVRMailbox_001_undoc3( void *args )
-{
-    struct IVRMailbox_IVRMailbox_001_undoc3_params *params = (struct IVRMailbox_IVRMailbox_001_undoc3_params *)args;
-    struct u_IVRMailbox_IVRMailbox_001 *iface = (struct u_IVRMailbox_IVRMailbox_001 *)params->linux_side;
-    params->_ret = (uint32_t)iface->undoc3( params->a, params->b, params->c );
-    return 0;
-}
-
 NTSTATUS IVRMailbox_IVRMailbox_001_undoc4( void *args )
 {
     struct IVRMailbox_IVRMailbox_001_undoc4_params *params = (struct IVRMailbox_IVRMailbox_001_undoc4_params *)args;
diff --git a/vrclient_x64/vrclient_x64/unix_private.h b/vrclient_x64/vrclient_x64/unix_private.h
index e76ce935..37e7998d 100644
--- a/vrclient_x64/vrclient_x64/unix_private.h
+++ b/vrclient_x64/vrclient_x64/unix_private.h
@@ -22,6 +22,9 @@ extern VkPhysicalDevice_T *(WINAPI *p_get_native_VkPhysicalDevice)( VkPhysicalDe
 extern VkPhysicalDevice_T *(WINAPI *p_get_wrapped_VkPhysicalDevice)( VkInstance_T *, VkPhysicalDevice_T * );
 extern VkQueue_T *(WINAPI *p_get_native_VkQueue)( VkQueue_T * );
 
+extern char *json_convert_startup_info(const char *startup_info);
+extern char *json_convert_paths(const char *input);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* __cplusplus */
diff --git a/vrclient_x64/vrclient_x64/unix_vrclientcore_manual.cpp b/vrclient_x64/vrclient_x64/unix_vrclientcore_manual.cpp
new file mode 100644
index 00000000..b6910065
--- /dev/null
+++ b/vrclient_x64/vrclient_x64/unix_vrclientcore_manual.cpp
@@ -0,0 +1,34 @@
+#include "unix_private.h"
+
+#include <stdlib.h>
+
+NTSTATUS IVRClientCore_IVRClientCore_002_Init( void *args )
+{
+    struct IVRClientCore_IVRClientCore_002_Init_params *params = (struct IVRClientCore_IVRClientCore_002_Init_params *)args;
+    struct u_IVRClientCore_IVRClientCore_002 *iface = (struct u_IVRClientCore_IVRClientCore_002 *)params->linux_side;
+    params->_ret = (uint32_t)iface->Init( params->eApplicationType );
+    return 0;
+}
+
+NTSTATUS IVRClientCore_IVRClientCore_003_Init( void *args )
+{
+    struct IVRClientCore_IVRClientCore_003_Init_params *params = (struct IVRClientCore_IVRClientCore_003_Init_params *)args;
+    struct u_IVRClientCore_IVRClientCore_003 *iface = (struct u_IVRClientCore_IVRClientCore_003 *)params->linux_side;
+    const char *startup_info = json_convert_startup_info( params->pStartupInfo );
+    if (!startup_info) startup_info = params->pStartupInfo;
+
+    params->_ret = (uint32_t)iface->Init( params->eApplicationType, startup_info );
+
+    if (startup_info != params->pStartupInfo) free( (char *)startup_info );
+    return 0;
+}
+
+NTSTATUS IVRMailbox_IVRMailbox_001_undoc3( void *args )
+{
+    struct IVRMailbox_IVRMailbox_001_undoc3_params *params = (struct IVRMailbox_IVRMailbox_001_undoc3_params *)args;
+    struct u_IVRMailbox_IVRMailbox_001 *iface = (struct u_IVRMailbox_IVRMailbox_001 *)params->linux_side;
+    char *c = json_convert_paths( params->c );
+    params->_ret = (uint32_t)iface->undoc3( params->a, params->b, c );
+    free( c );
+    return 0;
+}
diff --git a/vrclient_x64/vrclient_x64/vrclient_main.c b/vrclient_x64/vrclient_x64/vrclient_main.c
index dd09678e..40061b7f 100644
--- a/vrclient_x64/vrclient_x64/vrclient_main.c
+++ b/vrclient_x64/vrclient_x64/vrclient_main.c
@@ -533,18 +533,13 @@ uint32_t __thiscall winIVRClientCore_IVRClientCore_003_Init( struct w_steam_ifac
         .eApplicationType = eApplicationType,
         .pStartupInfo = pStartupInfo,
     };
-    char *startup_info_converted;
 
     TRACE( "%p\n", _this );
 
-    startup_info_converted = json_convert_startup_info( pStartupInfo );
-    if (startup_info_converted) params.pStartupInfo = startup_info_converted;
     InitializeCriticalSection( &_this->user_data.critical_section );
 
     VRCLIENT_CALL( IVRClientCore_IVRClientCore_003_Init, &params );
 
-    free( startup_info_converted );
-
     if (params._ret) WARN( "error %#x\n", params._ret );
     else compositor_data.client_core_linux_side = params.linux_side;
 
@@ -608,22 +603,3 @@ bool __thiscall winIVRClientCore_IVRClientCore_003_BIsHmdPresent( struct w_steam
 
     return TRUE;
 }
-
-uint32_t __thiscall winIVRMailbox_IVRMailbox_001_undoc3( struct w_steam_iface *_this, uint64_t a,
-                                                         const char *b, const char *c )
-{
-    struct IVRMailbox_IVRMailbox_001_undoc3_params params =
-    {
-        .linux_side = _this->u_iface,
-        .a = a,
-        .b = b,
-        .c = json_convert_paths(c),
-    };
-
-    TRACE( "%p\n", _this );
-
-    VRCLIENT_CALL( IVRMailbox_IVRMailbox_001_undoc3, &params );
-    free( (char *)params.c );
-
-    return params._ret;
-}
diff --git a/vrclient_x64/vrclient_x64/vrclient_private.h b/vrclient_x64/vrclient_x64/vrclient_private.h
index 344451f6..077c5d8b 100644
--- a/vrclient_x64/vrclient_x64/vrclient_private.h
+++ b/vrclient_x64/vrclient_x64/vrclient_private.h
@@ -16,9 +16,6 @@ typedef void (*vtable_ptr)(void);
 extern "C" {
 #endif
 
-char *json_convert_paths(const char *input);
-char *json_convert_startup_info(const char *startup_info);
-
 char *vrclient_dos_to_unix_path( const char *src );
 void vrclient_free_path( const char *path );
 
diff --git a/vrclient_x64/vrclient_x64/winIVRMailbox.c b/vrclient_x64/vrclient_x64/winIVRMailbox.c
index d6488584..b4745f36 100644
--- a/vrclient_x64/vrclient_x64/winIVRMailbox.c
+++ b/vrclient_x64/vrclient_x64/winIVRMailbox.c
@@ -38,7 +38,19 @@ uint32_t __thiscall winIVRMailbox_IVRMailbox_001_undoc2(struct w_steam_iface *_t
     return params._ret;
 }
 
-extern uint32_t __thiscall winIVRMailbox_IVRMailbox_001_undoc3(struct w_steam_iface *_this, uint64_t a, const char *b, const char *c);
+uint32_t __thiscall winIVRMailbox_IVRMailbox_001_undoc3(struct w_steam_iface *_this, uint64_t a, const char *b, const char *c)
+{
+    struct IVRMailbox_IVRMailbox_001_undoc3_params params =
+    {
+        .linux_side = _this->u_iface,
+        .a = a,
+        .b = b,
+        .c = c,
+    };
+    TRACE("%p\n", _this);
+    VRCLIENT_CALL( IVRMailbox_IVRMailbox_001_undoc3, &params );
+    return params._ret;
+}
 
 uint32_t __thiscall winIVRMailbox_IVRMailbox_001_undoc4(struct w_steam_iface *_this, uint64_t a, char *b, uint32_t c, uint32_t *d)
 {