diff --git a/nx/include/switch.h b/nx/include/switch.h
index 704b2118..377c7a12 100644
--- a/nx/include/switch.h
+++ b/nx/include/switch.h
@@ -34,6 +34,7 @@ extern "C" {
 #include <switch/services/hid.h>
 #include <switch/services/vi.h>
 #include <switch/services/nv.h>
+#include <switch/services/pm.h>
 
 #include <switch/gfx/gfx.h>
 #include <switch/gfx/parcel.h>
diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c
index f0904404..d58f57a8 100644
--- a/nx/source/services/fs.c
+++ b/nx/source/services/fs.c
@@ -4,7 +4,9 @@
 static Handle g_fsHandle = INVALID_HANDLE;
 
 Result fsInitialize() {
-    if(g_fsHandle != INVALID_HANDLE)return 0;
+    if (g_fsHandle != INVALID_HANDLE)
+        return 0;
+
     Result rc = smGetService(&g_fsHandle, "fsp-srv");
 
     if (R_SUCCEEDED(rc)) {
diff --git a/nx/source/services/pm.c b/nx/source/services/pm.c
new file mode 100644
index 00000000..b888d558
--- /dev/null
+++ b/nx/source/services/pm.c
@@ -0,0 +1,155 @@
+// Copyright 2017 plutoo
+#include <switch.h>
+
+static Handle g_pmdmntHandle = INVALID_HANDLE;
+
+Result pmdmntInitialize() {
+    Result rc = smGetService(&g_pmdmntHandle, "pm:dmnt");
+
+    if (R_FAILED(rc)) {
+        g_pmdmntHandle = INVALID_HANDLE;
+    }
+
+    return rc;
+}
+
+Result pmdmntStartProcess(u64 pid) {
+    IpcCommand c;
+    ipcInitialize(&c);
+
+    struct {
+        u64 magic;
+        u64 cmd_id;
+        u64 pid;
+    } *raw;
+
+    raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+    raw->magic = SFCI_MAGIC;
+    raw->cmd_id = 2;
+    raw->pid = pid;
+
+    Result rc = ipcDispatch(g_pmdmntHandle);
+
+    if (R_SUCCEEDED(rc)) {
+        IpcCommandResponse r;
+        ipcParseResponse(&r);
+
+        struct {
+            u64 magic;
+            u64 result;
+        } *resp = r.Raw;
+
+        rc = resp->result;
+    }
+
+    return rc;
+}
+
+Result pmdmntEnableDebugForTitleId(Handle* handle_out, u64 title_id) {
+    IpcCommand c;
+    ipcInitialize(&c);
+
+    struct {
+        u64 magic;
+        u64 cmd_id;
+        u64 title_id;
+    } *raw;
+
+    raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+    raw->magic = SFCI_MAGIC;
+    raw->cmd_id = 4;
+    raw->title_id = title_id;
+
+    Result rc = ipcDispatch(g_pmdmntHandle);
+
+    if (R_SUCCEEDED(rc)) {
+        IpcCommandResponse r;
+        ipcParseResponse(&r);
+
+        struct {
+            u64 magic;
+            u64 result;
+        } *resp = r.Raw;
+
+        rc = resp->result;
+
+        if (R_SUCCEEDED(rc)) {
+            *handle_out = r.Handles[0];
+        }
+    }
+
+    return rc;
+}
+
+Result pmdmntGetApplicationPid(u64* pid_out) {
+    IpcCommand c;
+    ipcInitialize(&c);
+
+    struct {
+        u64 magic;
+        u64 cmd_id;
+    } *raw;
+
+    raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+    raw->magic = SFCI_MAGIC;
+    raw->cmd_id = 5;
+
+    Result rc = ipcDispatch(g_pmdmntHandle);
+
+    if (R_SUCCEEDED(rc)) {
+        IpcCommandResponse r;
+        ipcParseResponse(&r);
+
+        struct {
+            u64 magic;
+            u64 result;
+            u64 pid;
+        } *resp = r.Raw;
+
+        rc = resp->result;
+
+        if (R_SUCCEEDED(rc)) {
+            *pid_out = resp->pid;
+        }
+    }
+
+    return rc;
+}
+
+Result pmdmntEnableDebugForApplication(Handle* handle_out) {
+    IpcCommand c;
+    ipcInitialize(&c);
+
+    struct {
+        u64 magic;
+        u64 cmd_id;
+    } *raw;
+
+    raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+    raw->magic = SFCI_MAGIC;
+    raw->cmd_id = 6;
+
+    Result rc = ipcDispatch(g_pmdmntHandle);
+
+    if (R_SUCCEEDED(rc)) {
+        IpcCommandResponse r;
+        ipcParseResponse(&r);
+
+        struct {
+            u64 magic;
+            u64 result;
+        } *resp = r.Raw;
+
+        rc = resp->result;
+
+        if (R_SUCCEEDED(rc)) {
+            *handle_out = r.Handles[0];
+        }
+    }
+
+    return rc;
+}