diff --git a/nx/include/switch.h b/nx/include/switch.h
index 36b0b2ce..7b59b881 100644
--- a/nx/include/switch.h
+++ b/nx/include/switch.h
@@ -11,6 +11,7 @@ extern "C" {
 #include <switch/types.h>
 #include <switch/result.h>
 #include <switch/svc.h>
+#include <switch/ipc.h>
 
 #ifdef __cplusplus
 }
diff --git a/nx/include/switch/ipc.h b/nx/include/switch/ipc.h
index 5fbafd3d..febec807 100644
--- a/nx/include/switch/ipc.h
+++ b/nx/include/switch/ipc.h
@@ -22,7 +22,8 @@ static inline void ipcInitialize(IpcCommand* cmd) {
     cmd->NumStaticRecv = 0;
 
     cmd->SendPid = false;
-    cmd->NumHandles = 0;
+    cmd->NumHandlesCopy = 0;
+    cmd->NumHandlesMove = 0;
 }
 
 typedef struct { // todo: Make sure sizeof isn't 16 bytes!
@@ -36,7 +37,7 @@ typedef struct {
     u32 Addr;
 } IpcStaticSendDescriptor;
 
-static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 Flags) {
+static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 flags) {
     size_t off = cmd->NumSend;
     cmd->Buffers[off] = buffer;
     cmd->Sizes[off] = size;
@@ -44,7 +45,7 @@ static inline void ipcAddSendBuffer(IpcCommand* cmd, void* buffer, size_t size,
     cmd->NumSend++;
 }
 
-static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 Flags) {
+static inline void ipcAddRecvBuffer(IpcCommand* cmd, void* buffer, size_t size, u8 flags) {
     size_t off = cmd->NumSend + cmd->NumRecv;
     cmd->Buffers[off] = buffer;
     cmd->Sizes[off] = size;
@@ -65,10 +66,9 @@ static inline void ipcSendHandleMove(IpcCommand* cmd, Handle h) {
 }
 
 static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) {
-    u32* buf = armGetTlsPtr();
+    u32* buf = armGetTls();
     *buf++ = 4 | (cmd->NumSend << 20) | (cmd->NumRecv << 24);
 
-    u32 flag = 0;
     if (cmd->SendPid || cmd->NumHandlesCopy > 0 || cmd->NumHandlesMove > 0) {
         *buf++ = (sizeof_raw/4) | 0x80000000;
         *buf++ = (!!cmd->SendPid) | (cmd->NumHandlesCopy << 1) | (cmd->NumHandlesMove << 1);
@@ -81,16 +81,15 @@ static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) {
     for (i=0; i<(cmd->NumSend + cmd->NumRecv); i++, buf+=3) {
         IpcBufferDescriptor* desc = (IpcBufferDescriptor*) buf;
         desc->Size = cmd->Sizes[i];
-        desc->Addr = cmd->Buffers[i];
-        uintptr_t ptr = (uintptr_t) cmd->Buffers[i]
+
+        uintptr_t ptr = (uintptr_t) cmd->Buffers[i];
+        desc->Addr = ptr;
         desc->Packed =
-            (((ptr) >> 36) << 28) |
-            (((ptr >> 32) & 15) << 28) |
-            cmd->Flags[i];
+            (((ptr) >> 36) << 28) | (((ptr >> 32) & 15) << 28) | cmd->Flags[i];
     }
 
     // todo: More
-    return (void*) ((uintptr_t)buf + 15) &~ 15;
+    return (void*) ((((uintptr_t)buf) + 15) &~ 15);
 }
 
 static inline Result ipcDispatch(Handle session) {
diff --git a/nx/include/switch/svc.h b/nx/include/switch/svc.h
index 40883af7..609655ea 100644
--- a/nx/include/switch/svc.h
+++ b/nx/include/switch/svc.h
@@ -19,7 +19,7 @@ static inline void* armGetTls(void) {
 }
 
 Result svcConnectToNamedPort(Handle* session, const char* name);
+Result svcSendSyncRequest(Handle session);
 Result svcBreak(u32 BreakReason, u64 inval1, u64 inval2);
 Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout);
 Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions);
-
diff --git a/nx/source/srv/sm.c b/nx/source/srv/sm.c
new file mode 100644
index 00000000..d58d8b97
--- /dev/null
+++ b/nx/source/srv/sm.c
@@ -0,0 +1,27 @@
+#include <switch.h>
+
+static Handle g_smHandle;
+
+Result smInitialize() {
+    Result rc = svcConnectToNamedPort(&g_smHandle, "sm:");
+
+    if (R_SUCCEEDED(rc)) {
+        IpcCommand c;
+        ipcInitialize(&c);
+        ipcSendPid(&c);
+
+        struct {
+            u64 magic;
+            u64 cmd_id;
+        } *raw;
+
+        raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+        raw->magic = SFCI_MAGIC;
+        raw->cmd_id = 0;
+
+        rc = ipcDispatch(g_smHandle);
+    }
+
+    return rc;
+}
diff --git a/nx/source/svc.s b/nx/source/svc.s
index 510e277e..69bdcbd5 100644
--- a/nx/source/svc.s
+++ b/nx/source/svc.s
@@ -19,6 +19,11 @@ SVC_BEGIN svcConnectToNamedPort
 	ret
 SVC_END
 
+SVC_BEGIN svcSendSyncRequest
+	svc 0x21
+	ret
+SVC_END
+
 SVC_BEGIN svcBreak
 	svc 0x26
 	ret