diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index df47033e3..c2bdc0b1a 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -739,15 +739,48 @@ add_library(core STATIC
     hle/service/nim/nim.h
     hle/service/npns/npns.cpp
     hle/service/npns/npns.h
-    hle/service/ns/errors.h
-    hle/service/ns/iplatform_service_manager.cpp
-    hle/service/ns/iplatform_service_manager.h
+    hle/service/ns/account_proxy_interface.cpp
+    hle/service/ns/account_proxy_interface.h
+    hle/service/ns/application_manager_interface.cpp
+    hle/service/ns/application_manager_interface.h
+    hle/service/ns/application_version_interface.cpp
+    hle/service/ns/application_version_interface.h
+    hle/service/ns/content_management_interface.cpp
+    hle/service/ns/content_management_interface.h
+    hle/service/ns/develop_interface.cpp
+    hle/service/ns/develop_interface.h
+    hle/service/ns/document_interface.cpp
+    hle/service/ns/document_interface.h
+    hle/service/ns/download_task_interface.cpp
+    hle/service/ns/download_task_interface.h
+    hle/service/ns/dynamic_rights_interface.cpp
+    hle/service/ns/dynamic_rights_interface.h
+    hle/service/ns/ecommerce_interface.cpp
+    hle/service/ns/ecommerce_interface.h
+    hle/service/ns/factory_reset_interface.cpp
+    hle/service/ns/factory_reset_interface.h
     hle/service/ns/language.cpp
     hle/service/ns/language.h
+    hle/service/ns/ns_results.h
+    hle/service/ns/ns_types.h
     hle/service/ns/ns.cpp
     hle/service/ns/ns.h
-    hle/service/ns/pdm_qry.cpp
-    hle/service/ns/pdm_qry.h
+    hle/service/ns/platform_service_manager.cpp
+    hle/service/ns/platform_service_manager.h
+    hle/service/ns/query_service.cpp
+    hle/service/ns/query_service.h
+    hle/service/ns/read_only_application_control_data_interface.cpp
+    hle/service/ns/read_only_application_control_data_interface.h
+    hle/service/ns/read_only_application_record_interface.cpp
+    hle/service/ns/read_only_application_record_interface.h
+    hle/service/ns/service_getter_interface.cpp
+    hle/service/ns/service_getter_interface.h
+    hle/service/ns/system_update_control.cpp
+    hle/service/ns/system_update_control.h
+    hle/service/ns/system_update_interface.cpp
+    hle/service/ns/system_update_interface.h
+    hle/service/ns/vulnerability_manager_interface.cpp
+    hle/service/ns/vulnerability_manager_interface.h
     hle/service/nvdrv/core/container.cpp
     hle/service/nvdrv/core/container.h
     hle/service/nvdrv/core/heap_mapper.cpp
diff --git a/src/core/file_sys/system_archive/shared_font.cpp b/src/core/file_sys/system_archive/shared_font.cpp
index deb52069d..9ea16aa59 100644
--- a/src/core/file_sys/system_archive/shared_font.cpp
+++ b/src/core/file_sys/system_archive/shared_font.cpp
@@ -9,7 +9,7 @@
 #include "core/file_sys/system_archive/data/font_standard.h"
 #include "core/file_sys/system_archive/shared_font.h"
 #include "core/file_sys/vfs/vfs_vector.h"
-#include "core/hle/service/ns/iplatform_service_manager.h"
+#include "core/hle/service/ns/platform_service_manager.h"
 
 namespace FileSys::SystemArchive {
 
diff --git a/src/core/hle/service/am/frontend/applet_web_browser.cpp b/src/core/hle/service/am/frontend/applet_web_browser.cpp
index bb60260b4..835c20c4e 100644
--- a/src/core/hle/service/am/frontend/applet_web_browser.cpp
+++ b/src/core/hle/service/am/frontend/applet_web_browser.cpp
@@ -22,7 +22,7 @@
 #include "core/hle/service/am/frontend/applet_web_browser.h"
 #include "core/hle/service/am/service/storage.h"
 #include "core/hle/service/filesystem/filesystem.h"
-#include "core/hle/service/ns/iplatform_service_manager.h"
+#include "core/hle/service/ns/platform_service_manager.h"
 #include "core/loader/loader.h"
 
 namespace Service::AM::Frontend {
diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp
index 63dd12a47..cb53b07e0 100644
--- a/src/core/hle/service/am/service/application_functions.cpp
+++ b/src/core/hle/service/am/service/application_functions.cpp
@@ -16,7 +16,8 @@
 #include "core/hle/service/filesystem/filesystem.h"
 #include "core/hle/service/filesystem/save_data_controller.h"
 #include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/ns/ns.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/service_getter_interface.h"
 #include "core/hle/service/sm/sm.h"
 
 namespace Service::AM {
@@ -163,11 +164,13 @@ Result IApplicationFunctions::GetDesiredLanguage(Out<u64> out_language_code) {
 
     // Call IApplicationManagerInterface implementation.
     auto& service_manager = system.ServiceManager();
-    auto ns_am2 = service_manager.GetService<NS::NS>("ns:am2");
-    auto app_man = ns_am2->GetApplicationManagerInterface();
+    auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
+
+    std::shared_ptr<NS::IApplicationManagerInterface> app_man;
+    R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
 
     // Get desired application language
-    u8 desired_language{};
+    NS::ApplicationLanguage desired_language{};
     R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
 
     // Convert to settings language code.
diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp
index 94bd4dae6..330eb26f0 100644
--- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp
+++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp
@@ -14,7 +14,8 @@
 #include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/filesystem/filesystem.h"
 #include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/ns/ns.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/service_getter_interface.h"
 #include "core/hle/service/sm/sm.h"
 
 namespace Service::AM {
@@ -256,11 +257,13 @@ Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage(
 
     // Call IApplicationManagerInterface implementation.
     auto& service_manager = system.ServiceManager();
-    auto ns_am2 = service_manager.GetService<NS::NS>("ns:am2");
-    auto app_man = ns_am2->GetApplicationManagerInterface();
+    auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
+
+    std::shared_ptr<NS::IApplicationManagerInterface> app_man;
+    R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
 
     // Get desired application language
-    u8 desired_language{};
+    NS::ApplicationLanguage desired_language{};
     R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
 
     // Convert to settings language code.
diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp
new file mode 100644
index 000000000..e5041af66
--- /dev/null
+++ b/src/core/hle/service/ns/account_proxy_interface.cpp
@@ -0,0 +1,21 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/ns/account_proxy_interface.h"
+
+namespace Service::NS {
+
+IAccountProxyInterface::IAccountProxyInterface(Core::System& system_)
+    : ServiceFramework{system_, "IAccountProxyInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "CreateUserAccount"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IAccountProxyInterface::~IAccountProxyInterface() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/account_proxy_interface.h b/src/core/hle/service/ns/account_proxy_interface.h
new file mode 100644
index 000000000..e944d2a75
--- /dev/null
+++ b/src/core/hle/service/ns/account_proxy_interface.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterface> {
+public:
+    explicit IAccountProxyInterface(Core::System& system_);
+    ~IAccountProxyInterface() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp
new file mode 100644
index 000000000..2e3a44c0d
--- /dev/null
+++ b/src/core/hle/service/ns/application_manager_interface.cpp
@@ -0,0 +1,519 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/file_sys/nca_metadata.h"
+#include "core/file_sys/registered_cache.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/filesystem/filesystem.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/content_management_interface.h"
+#include "core/hle/service/ns/read_only_application_control_data_interface.h"
+
+namespace Service::NS {
+
+IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
+    : ServiceFramework{system_, "IApplicationManagerInterface"},
+      service_context{system, "IApplicationManagerInterface"},
+      record_update_system_event{service_context}, sd_card_mount_status_event{service_context},
+      gamecard_update_detection_event{service_context},
+      gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
+        {1, nullptr, "GenerateApplicationRecordCount"},
+        {2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
+        {3, nullptr, "GetApplicationViewDeprecated"},
+        {4, nullptr, "DeleteApplicationEntity"},
+        {5, nullptr, "DeleteApplicationCompletely"},
+        {6, nullptr, "IsAnyApplicationEntityRedundant"},
+        {7, nullptr, "DeleteRedundantApplicationEntity"},
+        {8, nullptr, "IsApplicationEntityMovable"},
+        {9, nullptr, "MoveApplicationEntity"},
+        {11, nullptr, "CalculateApplicationOccupiedSize"},
+        {16, nullptr, "PushApplicationRecord"},
+        {17, nullptr, "ListApplicationRecordContentMeta"},
+        {19, nullptr, "LaunchApplicationOld"},
+        {21, nullptr, "GetApplicationContentPath"},
+        {22, nullptr, "TerminateApplication"},
+        {23, nullptr, "ResolveApplicationContentPath"},
+        {26, nullptr, "BeginInstallApplication"},
+        {27, nullptr, "DeleteApplicationRecord"},
+        {30, nullptr, "RequestApplicationUpdateInfo"},
+        {31, nullptr, "Unknown31"},
+        {32, nullptr, "CancelApplicationDownload"},
+        {33, nullptr, "ResumeApplicationDownload"},
+        {35, nullptr, "UpdateVersionList"},
+        {36, nullptr, "PushLaunchVersion"},
+        {37, nullptr, "ListRequiredVersion"},
+        {38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
+        {39, nullptr, "CheckApplicationLaunchRights"},
+        {40, nullptr, "GetApplicationLogoData"},
+        {41, nullptr, "CalculateApplicationDownloadRequiredSize"},
+        {42, nullptr, "CleanupSdCard"},
+        {43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+        {44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
+        {45, nullptr, "GetGameCardAttachmentEvent"},
+        {46, nullptr, "GetGameCardAttachmentInfo"},
+        {47, nullptr, "GetTotalSpaceSize"},
+        {48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+        {49, nullptr, "GetSdCardRemovedEvent"},
+        {52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
+        {53, nullptr, "DisableApplicationAutoDelete"},
+        {54, nullptr, "EnableApplicationAutoDelete"},
+        {55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+        {56, nullptr, "SetApplicationTerminateResult"},
+        {57, nullptr, "ClearApplicationTerminateResult"},
+        {58, nullptr, "GetLastSdCardMountUnexpectedResult"},
+        {59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+        {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+        {61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
+        {62, nullptr, "GetGameCardStopper"},
+        {63, nullptr, "IsSystemProgramInstalled"},
+        {64, nullptr, "StartApplyDeltaTask"},
+        {65, nullptr, "GetRequestServerStopper"},
+        {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
+        {67, nullptr, "CancelApplicationApplyDelta"},
+        {68, nullptr, "ResumeApplicationApplyDelta"},
+        {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
+        {70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
+        {71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
+        {80, nullptr, "RequestDownloadApplication"},
+        {81, nullptr, "RequestDownloadAddOnContent"},
+        {82, nullptr, "DownloadApplication"},
+        {83, nullptr, "CheckApplicationResumeRights"},
+        {84, nullptr, "GetDynamicCommitEvent"},
+        {85, nullptr, "RequestUpdateApplication2"},
+        {86, nullptr, "EnableApplicationCrashReport"},
+        {87, nullptr, "IsApplicationCrashReportEnabled"},
+        {90, nullptr, "BoostSystemMemoryResourceLimit"},
+        {91, nullptr, "DeprecatedLaunchApplication"},
+        {92, nullptr, "GetRunningApplicationProgramId"},
+        {93, nullptr, "GetMainApplicationProgramIndex"},
+        {94, nullptr, "LaunchApplication"},
+        {95, nullptr, "GetApplicationLaunchInfo"},
+        {96, nullptr, "AcquireApplicationLaunchInfo"},
+        {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
+        {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
+        {99, nullptr, "LaunchDevMenu"},
+        {100, nullptr, "ResetToFactorySettings"},
+        {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+        {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+        {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+        {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+        {105, nullptr, "RequestResetToFactorySettingsSecurely"},
+        {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
+        {200, nullptr, "CalculateUserSaveDataStatistics"},
+        {201, nullptr, "DeleteUserSaveDataAll"},
+        {210, nullptr, "DeleteUserSystemSaveData"},
+        {211, nullptr, "DeleteSaveData"},
+        {220, nullptr, "UnregisterNetworkServiceAccount"},
+        {221, nullptr, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
+        {300, nullptr, "GetApplicationShellEvent"},
+        {301, nullptr, "PopApplicationShellEventInfo"},
+        {302, nullptr, "LaunchLibraryApplet"},
+        {303, nullptr, "TerminateLibraryApplet"},
+        {304, nullptr, "LaunchSystemApplet"},
+        {305, nullptr, "TerminateSystemApplet"},
+        {306, nullptr, "LaunchOverlayApplet"},
+        {307, nullptr, "TerminateOverlayApplet"},
+        {400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
+        {401, nullptr, "InvalidateAllApplicationControlCache"},
+        {402, nullptr, "RequestDownloadApplicationControlData"},
+        {403, nullptr, "GetMaxApplicationControlCacheCount"},
+        {404, nullptr, "InvalidateApplicationControlCache"},
+        {405, nullptr, "ListApplicationControlCacheEntryInfo"},
+        {406, nullptr, "GetApplicationControlProperty"},
+        {407, nullptr, "ListApplicationTitle"},
+        {408, nullptr, "ListApplicationIcon"},
+        {502, nullptr, "RequestCheckGameCardRegistration"},
+        {503, nullptr, "RequestGameCardRegistrationGoldPoint"},
+        {504, nullptr, "RequestRegisterGameCard"},
+        {505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
+        {506, nullptr, "IsGameCardInserted"},
+        {507, nullptr, "EnsureGameCardAccess"},
+        {508, nullptr, "GetLastGameCardMountFailureResult"},
+        {509, nullptr, "ListApplicationIdOnGameCard"},
+        {510, nullptr, "GetGameCardPlatformRegion"},
+        {600, nullptr, "CountApplicationContentMeta"},
+        {601, nullptr, "ListApplicationContentMetaStatus"},
+        {602, nullptr, "ListAvailableAddOnContent"},
+        {603, nullptr, "GetOwnedApplicationContentMetaStatus"},
+        {604, nullptr, "RegisterContentsExternalKey"},
+        {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+        {606, nullptr, "GetContentMetaStorage"},
+        {607, nullptr, "ListAvailableAddOnContent"},
+        {609, nullptr, "ListAvailabilityAssuredAddOnContent"},
+        {610, nullptr, "GetInstalledContentMetaStorage"},
+        {611, nullptr, "PrepareAddOnContent"},
+        {700, nullptr, "PushDownloadTaskList"},
+        {701, nullptr, "ClearTaskStatusList"},
+        {702, nullptr, "RequestDownloadTaskList"},
+        {703, nullptr, "RequestEnsureDownloadTask"},
+        {704, nullptr, "ListDownloadTaskStatus"},
+        {705, nullptr, "RequestDownloadTaskListData"},
+        {800, nullptr, "RequestVersionList"},
+        {801, nullptr, "ListVersionList"},
+        {802, nullptr, "RequestVersionListData"},
+        {900, nullptr, "GetApplicationRecord"},
+        {901, nullptr, "GetApplicationRecordProperty"},
+        {902, nullptr, "EnableApplicationAutoUpdate"},
+        {903, nullptr, "DisableApplicationAutoUpdate"},
+        {904, nullptr, "TouchApplication"},
+        {905, nullptr, "RequestApplicationUpdate"},
+        {906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
+        {907, nullptr, "WithdrawApplicationUpdateRequest"},
+        {908, nullptr, "ListApplicationRecordInstalledContentMeta"},
+        {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
+        {910, nullptr, "HasApplicationRecord"},
+        {911, nullptr, "SetPreInstalledApplication"},
+        {912, nullptr, "ClearPreInstalledApplicationFlag"},
+        {913, nullptr, "ListAllApplicationRecord"},
+        {914, nullptr, "HideApplicationRecord"},
+        {915, nullptr, "ShowApplicationRecord"},
+        {916, nullptr, "IsApplicationAutoDeleteDisabled"},
+        {1000, nullptr, "RequestVerifyApplicationDeprecated"},
+        {1001, nullptr, "CorruptApplicationForDebug"},
+        {1002, nullptr, "RequestVerifyAddOnContentsRights"},
+        {1003, nullptr, "RequestVerifyApplication"},
+        {1004, nullptr, "CorruptContentForDebug"},
+        {1200, nullptr, "NeedsUpdateVulnerability"},
+        {1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
+        {1301, nullptr, "DeleteApplicationContentEntities"},
+        {1302, nullptr, "CleanupUnrecordedApplicationEntity"},
+        {1303, nullptr, "CleanupAddOnContentsWithNoRights"},
+        {1304, nullptr, "DeleteApplicationContentEntity"},
+        {1305, nullptr, "TryDeleteRunningApplicationEntity"},
+        {1306, nullptr, "TryDeleteRunningApplicationCompletely"},
+        {1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
+        {1308, nullptr, "DeleteApplicationCompletelyForDebug"},
+        {1309, nullptr, "CleanupUnavailableAddOnContents"},
+        {1310, nullptr, "RequestMoveApplicationEntity"},
+        {1311, nullptr, "EstimateSizeToMove"},
+        {1312, nullptr, "HasMovableEntity"},
+        {1313, nullptr, "CleanupOrphanContents"},
+        {1314, nullptr, "CheckPreconditionSatisfiedToMove"},
+        {1400, nullptr, "PrepareShutdown"},
+        {1500, nullptr, "FormatSdCard"},
+        {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
+        {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
+        {1504, nullptr, "InsertSdCard"},
+        {1505, nullptr, "RemoveSdCard"},
+        {1506, nullptr, "GetSdCardStartupStatus"},
+        {1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
+        {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
+        {1700, nullptr, "ListApplicationDownloadingContentMeta"},
+        {1701, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
+        {1702, nullptr, "GetApplicationDownloadTaskStatus"},
+        {1703, nullptr, "GetApplicationViewDownloadErrorContext"},
+        {1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
+        {1705, nullptr, "IsPatchAutoDeletableApplication"},
+        {1800, nullptr, "IsNotificationSetupCompleted"},
+        {1801, nullptr, "GetLastNotificationInfoCount"},
+        {1802, nullptr, "ListLastNotificationInfo"},
+        {1803, nullptr, "ListNotificationTask"},
+        {1900, nullptr, "IsActiveAccount"},
+        {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
+        {1902, nullptr, "GetApplicationTicketInfo"},
+        {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
+        {2000, nullptr, "GetSystemDeliveryInfo"},
+        {2001, nullptr, "SelectLatestSystemDeliveryInfo"},
+        {2002, nullptr, "VerifyDeliveryProtocolVersion"},
+        {2003, nullptr, "GetApplicationDeliveryInfo"},
+        {2004, nullptr, "HasAllContentsToDeliver"},
+        {2005, nullptr, "CompareApplicationDeliveryInfo"},
+        {2006, nullptr, "CanDeliverApplication"},
+        {2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
+        {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
+        {2009, nullptr, "EstimateRequiredSize"},
+        {2010, nullptr, "RequestReceiveApplication"},
+        {2011, nullptr, "CommitReceiveApplication"},
+        {2012, nullptr, "GetReceiveApplicationProgress"},
+        {2013, nullptr, "RequestSendApplication"},
+        {2014, nullptr, "GetSendApplicationProgress"},
+        {2015, nullptr, "CompareSystemDeliveryInfo"},
+        {2016, nullptr, "ListNotCommittedContentMeta"},
+        {2017, nullptr, "CreateDownloadTask"},
+        {2018, nullptr, "GetApplicationDeliveryInfoHash"},
+        {2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
+        {2051, nullptr, "InvalidateRightsIdCache"},
+        {2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
+        {2101, nullptr, "GetRawApplicationTerminateResult"},
+        {2150, nullptr, "CreateRightsEnvironment"},
+        {2151, nullptr, "DestroyRightsEnvironment"},
+        {2152, nullptr, "ActivateRightsEnvironment"},
+        {2153, nullptr, "DeactivateRightsEnvironment"},
+        {2154, nullptr, "ForceActivateRightsContextForExit"},
+        {2155, nullptr, "UpdateRightsEnvironmentStatus"},
+        {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
+        {2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
+        {2161, nullptr, "SetUsersToRightsEnvironment"},
+        {2170, nullptr, "GetRightsEnvironmentStatus"},
+        {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
+        {2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
+        {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
+        {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
+        {2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
+        {2199, nullptr, "GetRightsEnvironmentCountForDebug"},
+        {2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
+        {2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
+        {2250, nullptr, "RequestReportActiveELicence"},
+        {2300, nullptr, "ListEventLog"},
+        {2350, nullptr, "PerformAutoUpdateByApplicationId"},
+        {2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
+        {2352, nullptr, "RequestResolveNoDownloadRightsError"},
+        {2353, nullptr, "GetApplicationDownloadTaskInfo"},
+        {2354, nullptr, "PrioritizeApplicationBackgroundTask"},
+        {2355, nullptr, "PreferStorageEfficientUpdate"},
+        {2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
+        {2357, nullptr, "EnableMultiCoreDownload"},
+        {2358, nullptr, "DisableMultiCoreDownload"},
+        {2359, nullptr, "IsMultiCoreDownloadEnabled"},
+        {2400, nullptr, "GetPromotionInfo"},
+        {2401, nullptr, "CountPromotionInfo"},
+        {2402, nullptr, "ListPromotionInfo"},
+        {2403, nullptr, "ImportPromotionJsonForDebug"},
+        {2404, nullptr, "ClearPromotionInfoForDebug"},
+        {2500, nullptr, "ConfirmAvailableTime"},
+        {2510, nullptr, "CreateApplicationResource"},
+        {2511, nullptr, "GetApplicationResource"},
+        {2513, nullptr, "LaunchMicroApplication"},
+        {2514, nullptr, "ClearTaskOfAsyncTaskManager"},
+        {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
+        {2516, nullptr, "EnsureApplicationCertificate"},
+        {2517, nullptr, "CreateApplicationInstance"},
+        {2518, nullptr, "UpdateQualificationForDebug"},
+        {2519, nullptr, "IsQualificationTransitionSupported"},
+        {2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
+        {2521, nullptr, "GetRightsUserChangedEvent"},
+        {2522, nullptr, "IsRomRedirectionAvailable"},
+        {2800, nullptr, "GetApplicationIdOfPreomia"},
+        {3000, nullptr, "RegisterDeviceLockKey"},
+        {3001, nullptr, "UnregisterDeviceLockKey"},
+        {3002, nullptr, "VerifyDeviceLockKey"},
+        {3003, nullptr, "HideApplicationIcon"},
+        {3004, nullptr, "ShowApplicationIcon"},
+        {3005, nullptr, "HideApplicationTitle"},
+        {3006, nullptr, "ShowApplicationTitle"},
+        {3007, nullptr, "EnableGameCard"},
+        {3008, nullptr, "DisableGameCard"},
+        {3009, nullptr, "EnableLocalContentShare"},
+        {3010, nullptr, "DisableLocalContentShare"},
+        {3011, nullptr, "IsApplicationIconHidden"},
+        {3012, nullptr, "IsApplicationTitleHidden"},
+        {3013, nullptr, "IsGameCardEnabled"},
+        {3014, nullptr, "IsLocalContentShareEnabled"},
+        {3050, nullptr, "ListAssignELicenseTaskResult"},
+        {9999, nullptr, "GetApplicationCertificate"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IApplicationManagerInterface::~IApplicationManagerInterface() = default;
+
+Result IApplicationManagerInterface::GetApplicationControlData(
+    OutBuffer<BufferAttr_HipcMapAlias> out_buffer, Out<u32> out_actual_size,
+    ApplicationControlSource application_control_source, u64 application_id) {
+    LOG_DEBUG(Service_NS, "called");
+    R_RETURN(IReadOnlyApplicationControlDataInterface(system).GetApplicationControlData(
+        out_buffer, out_actual_size, application_control_source, application_id));
+}
+
+Result IApplicationManagerInterface::GetApplicationDesiredLanguage(
+    Out<ApplicationLanguage> out_desired_language, u32 supported_languages) {
+    LOG_DEBUG(Service_NS, "called");
+    R_RETURN(IReadOnlyApplicationControlDataInterface(system).GetApplicationDesiredLanguage(
+        out_desired_language, supported_languages));
+}
+
+Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
+    Out<u64> out_language_code, ApplicationLanguage application_language) {
+    LOG_DEBUG(Service_NS, "called");
+    R_RETURN(
+        IReadOnlyApplicationControlDataInterface(system).ConvertApplicationLanguageToLanguageCode(
+            out_language_code, application_language));
+}
+
+Result IApplicationManagerInterface::ListApplicationRecord(
+    OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records, Out<s32> out_count,
+    s32 offset) {
+    const auto limit = out_records.size();
+
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    const auto& cache = system.GetContentProviderUnion();
+    const auto installed_games = cache.ListEntriesFilterOrigin(
+        std::nullopt, FileSys::TitleType::Application, FileSys::ContentRecordType::Program);
+
+    size_t i = 0;
+    u8 ii = 24;
+
+    for (const auto& [slot, game] : installed_games) {
+        if (i >= limit) {
+            break;
+        }
+        if (game.title_id == 0 || game.title_id < 0x0100000000001FFFull) {
+            continue;
+        }
+        if (offset > 0) {
+            offset--;
+            continue;
+        }
+
+        ApplicationRecord record{};
+        record.application_id = game.title_id;
+        record.type = ApplicationRecordType::Installed;
+        record.unknown = 0; // 2 = needs update
+        record.unknown2 = ii++;
+
+        out_records[i++] = record;
+    }
+
+    *out_count = static_cast<s32>(i);
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent(
+    OutCopyHandle<Kernel::KReadableEvent> out_event) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+
+    record_update_system_event.Signal();
+    *out_event = record_update_system_event.GetHandle();
+
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetGameCardMountFailureEvent(
+    OutCopyHandle<Kernel::KReadableEvent> out_event) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_event = gamecard_mount_failure_event.GetHandle();
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::IsAnyApplicationEntityInstalled(
+    Out<bool> out_is_any_application_entity_installed) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_is_any_application_entity_installed = true;
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetApplicationView(
+    OutArray<ApplicationView, BufferAttr_HipcMapAlias> out_application_views,
+    InArray<u64, BufferAttr_HipcMapAlias> application_ids) {
+    const auto size = std::min(out_application_views.size(), application_ids.size());
+    LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size());
+
+    for (size_t i = 0; i < size; i++) {
+        ApplicationView view{};
+        view.application_id = application_ids[i];
+        view.unk = 0x70000;
+        view.flags = 0x401f17;
+
+        out_application_views[i] = view;
+    }
+
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetApplicationViewWithPromotionInfo(
+    OutArray<ApplicationViewWithPromotionInfo, BufferAttr_HipcMapAlias> out_application_views,
+    InArray<u64, BufferAttr_HipcMapAlias> application_ids) {
+    const auto size = std::min(out_application_views.size(), application_ids.size());
+    LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size());
+
+    for (size_t i = 0; i < size; i++) {
+        ApplicationViewWithPromotionInfo view{};
+        view.view.application_id = application_ids[i];
+        view.view.unk = 0x70000;
+        view.view.flags = 0x401f17;
+        view.promotion = {};
+
+        out_application_views[i] = view;
+    }
+
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetApplicationRightsOnClient(
+    OutArray<ApplicationRightsOnClient, BufferAttr_HipcMapAlias> out_rights, Out<u32> out_count,
+    Common::UUID account_id, u32 flags, u64 application_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, flags={}, application_id={:016X}, account_id={}",
+                flags, application_id, account_id.FormattedString());
+
+    if (!out_rights.empty()) {
+        ApplicationRightsOnClient rights{};
+        rights.application_id = application_id;
+        rights.uid = account_id;
+        rights.flags = 0;
+        rights.flags2 = 0;
+
+        out_rights[0] = rights;
+        *out_count = 1;
+    } else {
+        *out_count = 0;
+    }
+
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::CheckSdCardMountStatus() {
+    LOG_DEBUG(Service_NS, "called");
+    R_RETURN(IContentManagementInterface(system).CheckSdCardMountStatus());
+}
+
+Result IApplicationManagerInterface::GetSdCardMountStatusChangedEvent(
+    OutCopyHandle<Kernel::KReadableEvent> out_event) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_event = sd_card_mount_status_event.GetHandle();
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetFreeSpaceSize(Out<s64> out_free_space_size,
+                                                      FileSys::StorageId storage_id) {
+    LOG_DEBUG(Service_NS, "called");
+    R_RETURN(IContentManagementInterface(system).GetFreeSpaceSize(out_free_space_size, storage_id));
+}
+
+Result IApplicationManagerInterface::GetGameCardUpdateDetectionEvent(
+    OutCopyHandle<Kernel::KReadableEvent> out_event) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_event = gamecard_update_detection_event.GetHandle();
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::ResumeAll() {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetStorageSize(Out<s64> out_total_space_size,
+                                                    Out<s64> out_free_space_size,
+                                                    FileSys::StorageId storage_id) {
+    LOG_INFO(Service_NS, "called, storage_id={}", storage_id);
+    *out_total_space_size = system.GetFileSystemController().GetTotalSpaceSize(storage_id);
+    *out_free_space_size = system.GetFileSystemController().GetFreeSpaceSize(storage_id);
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::IsApplicationUpdateRequested(Out<bool> out_update_required,
+                                                                  Out<u32> out_update_version,
+                                                                  u64 application_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
+    *out_update_required = false;
+    *out_update_version = 0;
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::CheckApplicationLaunchVersion(u64 application_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
+    R_SUCCEED();
+}
+
+Result IApplicationManagerInterface::GetApplicationTerminateResult(Out<Result> out_result,
+                                                                   u64 application_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
+    *out_result = ResultSuccess;
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h
new file mode 100644
index 000000000..350ec37ce
--- /dev/null
+++ b/src/core/hle/service/ns/application_manager_interface.h
@@ -0,0 +1,62 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/ns/language.h"
+#include "core/hle/service/ns/ns_types.h"
+#include "core/hle/service/os/event.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IApplicationManagerInterface final : public ServiceFramework<IApplicationManagerInterface> {
+public:
+    explicit IApplicationManagerInterface(Core::System& system_);
+    ~IApplicationManagerInterface() override;
+
+    Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
+                                     Out<u32> out_actual_size,
+                                     ApplicationControlSource application_control_source,
+                                     u64 application_id);
+    Result GetApplicationDesiredLanguage(Out<ApplicationLanguage> out_desired_language,
+                                         u32 supported_languages);
+    Result ConvertApplicationLanguageToLanguageCode(Out<u64> out_language_code,
+                                                    ApplicationLanguage application_language);
+    Result ListApplicationRecord(OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records,
+                                 Out<s32> out_count, s32 offset);
+    Result GetApplicationRecordUpdateSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+    Result GetGameCardMountFailureEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+    Result IsAnyApplicationEntityInstalled(Out<bool> out_is_any_application_entity_installed);
+    Result GetApplicationView(
+        OutArray<ApplicationView, BufferAttr_HipcMapAlias> out_application_views,
+        InArray<u64, BufferAttr_HipcMapAlias> application_ids);
+    Result GetApplicationViewWithPromotionInfo(
+        OutArray<ApplicationViewWithPromotionInfo, BufferAttr_HipcMapAlias> out_application_views,
+        InArray<u64, BufferAttr_HipcMapAlias> application_ids);
+    Result GetApplicationRightsOnClient(
+        OutArray<ApplicationRightsOnClient, BufferAttr_HipcMapAlias> out_rights, Out<u32> out_count,
+        Common::UUID account_id, u32 flags, u64 application_id);
+    Result CheckSdCardMountStatus();
+    Result GetSdCardMountStatusChangedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+    Result GetFreeSpaceSize(Out<s64> out_free_space_size, FileSys::StorageId storage_id);
+    Result GetGameCardUpdateDetectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
+    Result ResumeAll();
+    Result GetStorageSize(Out<s64> out_total_space_size, Out<s64> out_free_space_size,
+                          FileSys::StorageId storage_id);
+    Result IsApplicationUpdateRequested(Out<bool> out_update_required, Out<u32> out_update_version,
+                                        u64 application_id);
+    Result CheckApplicationLaunchVersion(u64 application_id);
+    Result GetApplicationTerminateResult(Out<Result> out_result, u64 application_id);
+
+private:
+    KernelHelpers::ServiceContext service_context;
+    Event record_update_system_event;
+    Event sd_card_mount_status_event;
+    Event gamecard_update_detection_event;
+    Event gamecard_mount_status_event;
+    Event gamecard_mount_failure_event;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_version_interface.cpp b/src/core/hle/service/ns/application_version_interface.cpp
new file mode 100644
index 000000000..b89e127db
--- /dev/null
+++ b/src/core/hle/service/ns/application_version_interface.cpp
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/ns/application_version_interface.h"
+
+namespace Service::NS {
+
+IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_)
+    : ServiceFramework{system_, "IApplicationVersionInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "GetLaunchRequiredVersion"},
+        {1, nullptr, "UpgradeLaunchRequiredVersion"},
+        {35, nullptr, "UpdateVersionList"},
+        {36, nullptr, "PushLaunchVersion"},
+        {37, nullptr, "ListRequiredVersion"},
+        {800, nullptr, "RequestVersionList"},
+        {801, nullptr, "ListVersionList"},
+        {802, nullptr, "RequestVersionListData"},
+        {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
+        {901, nullptr, "ListDefaultAutoUpdatePolicy"},
+        {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
+        {1000, nullptr, "PerformAutoUpdate"},
+        {1001, nullptr, "ListAutoUpdateSchedule"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IApplicationVersionInterface::~IApplicationVersionInterface() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_version_interface.h b/src/core/hle/service/ns/application_version_interface.h
new file mode 100644
index 000000000..b288cff1b
--- /dev/null
+++ b/src/core/hle/service/ns/application_version_interface.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IApplicationVersionInterface final : public ServiceFramework<IApplicationVersionInterface> {
+public:
+    explicit IApplicationVersionInterface(Core::System& system_);
+    ~IApplicationVersionInterface() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/content_management_interface.cpp b/src/core/hle/service/ns/content_management_interface.cpp
new file mode 100644
index 000000000..69bb3f6e4
--- /dev/null
+++ b/src/core/hle/service/ns/content_management_interface.cpp
@@ -0,0 +1,72 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/common_funcs.h"
+#include "core/core.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/filesystem/filesystem.h"
+#include "core/hle/service/ns/content_management_interface.h"
+#include "core/hle/service/ns/ns_types.h"
+
+namespace Service::NS {
+
+IContentManagementInterface::IContentManagementInterface(Core::System& system_)
+    : ServiceFramework{system_, "IContentManagementInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"},
+        {43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+        {47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+        {48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+        {600, nullptr, "CountApplicationContentMeta"},
+        {601, nullptr, "ListApplicationContentMetaStatus"},
+        {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+        {607, nullptr, "IsAnyApplicationRunning"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IContentManagementInterface::~IContentManagementInterface() = default;
+
+Result IContentManagementInterface::CalculateApplicationOccupiedSize(
+    Out<ApplicationOccupiedSize> out_size, u64 application_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, application_id={:016X}", application_id);
+
+    using namespace Common::Literals;
+
+    constexpr ApplicationOccupiedSizeEntity stub_entity{
+        .storage_id = FileSys::StorageId::SdCard,
+        .app_size = 8_GiB,
+        .patch_size = 2_GiB,
+        .aoc_size = 12_MiB,
+    };
+
+    for (auto& entity : out_size->entities) {
+        entity = stub_entity;
+    }
+
+    R_SUCCEED();
+}
+
+Result IContentManagementInterface::CheckSdCardMountStatus() {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    R_SUCCEED();
+}
+
+Result IContentManagementInterface::GetTotalSpaceSize(Out<s64> out_total_space_size,
+                                                      FileSys::StorageId storage_id) {
+    LOG_INFO(Service_NS, "(STUBBED) called, storage_id={}", storage_id);
+    *out_total_space_size = system.GetFileSystemController().GetTotalSpaceSize(storage_id);
+    R_SUCCEED();
+}
+
+Result IContentManagementInterface::GetFreeSpaceSize(Out<s64> out_free_space_size,
+                                                     FileSys::StorageId storage_id) {
+    LOG_INFO(Service_NS, "(STUBBED) called, storage_id={}", storage_id);
+    *out_free_space_size = system.GetFileSystemController().GetFreeSpaceSize(storage_id);
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/content_management_interface.h b/src/core/hle/service/ns/content_management_interface.h
new file mode 100644
index 000000000..2894628e5
--- /dev/null
+++ b/src/core/hle/service/ns/content_management_interface.h
@@ -0,0 +1,25 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/ns/ns_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IContentManagementInterface final : public ServiceFramework<IContentManagementInterface> {
+public:
+    explicit IContentManagementInterface(Core::System& system_);
+    ~IContentManagementInterface() override;
+
+public:
+    Result CalculateApplicationOccupiedSize(Out<ApplicationOccupiedSize> out_size,
+                                            u64 application_id);
+    Result CheckSdCardMountStatus();
+    Result GetTotalSpaceSize(Out<s64> out_total_space_size, FileSys::StorageId storage_id);
+    Result GetFreeSpaceSize(Out<s64> out_free_space_size, FileSys::StorageId storage_id);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/develop_interface.cpp b/src/core/hle/service/ns/develop_interface.cpp
new file mode 100644
index 000000000..880bdbebb
--- /dev/null
+++ b/src/core/hle/service/ns/develop_interface.cpp
@@ -0,0 +1,38 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/ns/develop_interface.h"
+
+namespace Service::NS {
+
+IDevelopInterface::IDevelopInterface(Core::System& system_) : ServiceFramework{system_, "ns:dev"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "LaunchProgram"},
+        {1, nullptr, "TerminateProcess"},
+        {2, nullptr, "TerminateProgram"},
+        {4, nullptr, "GetShellEvent"},
+        {5, nullptr, "GetShellEventInfo"},
+        {6, nullptr, "TerminateApplication"},
+        {7, nullptr, "PrepareLaunchProgramFromHost"},
+        {8, nullptr, "LaunchApplicationFromHost"},
+        {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
+        {10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
+        {11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
+        {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
+        {13, nullptr, "CreateApplicationResourceForDevelop"},
+        {14, nullptr, "IsPreomiaForDevelop"},
+        {15, nullptr, "GetApplicationProgramIdFromHost"},
+        {16, nullptr, "RefreshCachedDebugValues"},
+        {17, nullptr, "PrepareLaunchApplicationFromHost"},
+        {18, nullptr, "GetLaunchEvent"},
+        {19, nullptr, "GetLaunchResult"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IDevelopInterface::~IDevelopInterface() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/develop_interface.h b/src/core/hle/service/ns/develop_interface.h
new file mode 100644
index 000000000..a9f81ccd6
--- /dev/null
+++ b/src/core/hle/service/ns/develop_interface.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IDevelopInterface final : public ServiceFramework<IDevelopInterface> {
+public:
+    explicit IDevelopInterface(Core::System& system_);
+    ~IDevelopInterface() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/document_interface.cpp b/src/core/hle/service/ns/document_interface.cpp
new file mode 100644
index 000000000..51a1e46c0
--- /dev/null
+++ b/src/core/hle/service/ns/document_interface.cpp
@@ -0,0 +1,38 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/core.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/document_interface.h"
+
+namespace Service::NS {
+
+IDocumentInterface::IDocumentInterface(Core::System& system_)
+    : ServiceFramework{system_, "IDocumentInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {21, nullptr, "GetApplicationContentPath"},
+        {23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"},
+        {92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IDocumentInterface::~IDocumentInterface() = default;
+
+Result IDocumentInterface::ResolveApplicationContentPath(ContentPath content_path) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, file_system_proxy_type={}, program_id={:016X}",
+                content_path.file_system_proxy_type, content_path.program_id);
+    R_SUCCEED();
+}
+
+Result IDocumentInterface::GetRunningApplicationProgramId(Out<u64> out_program_id,
+                                                          u64 caller_program_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, caller_program_id={:016X}", caller_program_id);
+    *out_program_id = system.GetApplicationProcessProgramID();
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/document_interface.h b/src/core/hle/service/ns/document_interface.h
new file mode 100644
index 000000000..cd461652c
--- /dev/null
+++ b/src/core/hle/service/ns/document_interface.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/ns/ns_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IDocumentInterface final : public ServiceFramework<IDocumentInterface> {
+public:
+    explicit IDocumentInterface(Core::System& system_);
+    ~IDocumentInterface() override;
+
+private:
+    Result ResolveApplicationContentPath(ContentPath content_path);
+    Result GetRunningApplicationProgramId(Out<u64> out_program_id, u64 caller_program_id);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/download_task_interface.cpp b/src/core/hle/service/ns/download_task_interface.cpp
new file mode 100644
index 000000000..62dc7f187
--- /dev/null
+++ b/src/core/hle/service/ns/download_task_interface.cpp
@@ -0,0 +1,39 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/download_task_interface.h"
+
+namespace Service::NS {
+
+IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_)
+    : ServiceFramework{system_, "IDownloadTaskInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {701, nullptr, "ClearTaskStatusList"},
+        {702, nullptr, "RequestDownloadTaskList"},
+        {703, nullptr, "RequestEnsureDownloadTask"},
+        {704, nullptr, "ListDownloadTaskStatus"},
+        {705, nullptr, "RequestDownloadTaskListData"},
+        {706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
+        {707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"},
+        {708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"},
+        {709, nullptr, "TriggerDynamicCommitEvent"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IDownloadTaskInterface::~IDownloadTaskInterface() = default;
+
+Result IDownloadTaskInterface::EnableAutoCommit() {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    R_SUCCEED();
+}
+Result IDownloadTaskInterface::DisableAutoCommit() {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/download_task_interface.h b/src/core/hle/service/ns/download_task_interface.h
new file mode 100644
index 000000000..b1cb69cb8
--- /dev/null
+++ b/src/core/hle/service/ns/download_task_interface.h
@@ -0,0 +1,20 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IDownloadTaskInterface final : public ServiceFramework<IDownloadTaskInterface> {
+public:
+    explicit IDownloadTaskInterface(Core::System& system_);
+    ~IDownloadTaskInterface() override;
+
+private:
+    Result EnableAutoCommit();
+    Result DisableAutoCommit();
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.cpp b/src/core/hle/service/ns/dynamic_rights_interface.cpp
new file mode 100644
index 000000000..ce81e203f
--- /dev/null
+++ b/src/core/hle/service/ns/dynamic_rights_interface.cpp
@@ -0,0 +1,62 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/dynamic_rights_interface.h"
+
+namespace Service::NS {
+
+IDynamicRightsInterface::IDynamicRightsInterface(Core::System& system_)
+    : ServiceFramework{system_, "DynamicRightsInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "RequestApplicationRightsOnServer"},
+        {1, nullptr, "RequestAssignRights"},
+        {4, nullptr, "DeprecatedRequestAssignRightsToResume"},
+        {5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"},
+        {6, nullptr, "DeprecatedGetApplicationRightsStatus"},
+        {7, nullptr, "RequestPrefetchForDynamicRights"},
+        {8, nullptr, "GetDynamicRightsState"},
+        {9, nullptr, "RequestApplicationRightsOnServerToResume"},
+        {10, nullptr, "RequestAssignRightsToResume"},
+        {11, nullptr, "GetActivatedRightsUsers"},
+        {12, nullptr, "GetApplicationRightsStatus"},
+        {13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"},
+        {14, nullptr, "SelectApplicationLicense"},
+        {15, nullptr, "RequestContentsAuthorizationToken"},
+        {16, nullptr, "QualifyUser"},
+        {17, nullptr, "QualifyUserWithProcessId"},
+        {18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"},
+        {19, nullptr, "UpdateUserList"},
+        {20, nullptr, "IsRightsLostUser"},
+        {21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
+        {22, nullptr, "GetLimitedApplicationLicense"},
+        {23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
+        {24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
+        {25, nullptr, "RequestProceedDynamicRightsState"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IDynamicRightsInterface::~IDynamicRightsInterface() = default;
+
+Result IDynamicRightsInterface::NotifyApplicationRightsCheckStart() {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    R_SUCCEED();
+}
+
+Result IDynamicRightsInterface::GetRunningApplicationStatus(Out<u32> out_status,
+                                                            u64 rights_handle) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, rights_handle={:#x}", rights_handle);
+    *out_status = 0;
+    R_SUCCEED();
+}
+
+Result IDynamicRightsInterface::VerifyActivatedRightsOwners(u64 rights_handle) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, rights_handle={:#x}", rights_handle);
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.h b/src/core/hle/service/ns/dynamic_rights_interface.h
new file mode 100644
index 000000000..877e009b0
--- /dev/null
+++ b/src/core/hle/service/ns/dynamic_rights_interface.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IDynamicRightsInterface final : public ServiceFramework<IDynamicRightsInterface> {
+public:
+    explicit IDynamicRightsInterface(Core::System& system_);
+    ~IDynamicRightsInterface() override;
+
+private:
+    Result NotifyApplicationRightsCheckStart();
+    Result GetRunningApplicationStatus(Out<u32> out_status, u64 rights_handle);
+    Result VerifyActivatedRightsOwners(u64 rights_handle);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ecommerce_interface.cpp b/src/core/hle/service/ns/ecommerce_interface.cpp
new file mode 100644
index 000000000..76fc425f0
--- /dev/null
+++ b/src/core/hle/service/ns/ecommerce_interface.cpp
@@ -0,0 +1,27 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/ns/ecommerce_interface.h"
+
+namespace Service::NS {
+
+IECommerceInterface::IECommerceInterface(Core::System& system_)
+    : ServiceFramework{system_, "IECommerceInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "RequestLinkDevice"},
+        {1, nullptr, "RequestCleanupAllPreInstalledApplications"},
+        {2, nullptr, "RequestCleanupPreInstalledApplication"},
+        {3, nullptr, "RequestSyncRights"},
+        {4, nullptr, "RequestUnlinkDevice"},
+        {5, nullptr, "RequestRevokeAllELicense"},
+        {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IECommerceInterface::~IECommerceInterface() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ecommerce_interface.h b/src/core/hle/service/ns/ecommerce_interface.h
new file mode 100644
index 000000000..4352101f4
--- /dev/null
+++ b/src/core/hle/service/ns/ecommerce_interface.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IECommerceInterface final : public ServiceFramework<IECommerceInterface> {
+public:
+    explicit IECommerceInterface(Core::System& system_);
+    ~IECommerceInterface() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/factory_reset_interface.cpp b/src/core/hle/service/ns/factory_reset_interface.cpp
new file mode 100644
index 000000000..fd5cf7e1f
--- /dev/null
+++ b/src/core/hle/service/ns/factory_reset_interface.cpp
@@ -0,0 +1,27 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/ns/factory_reset_interface.h"
+
+namespace Service::NS {
+
+IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
+    : ServiceFramework{system_, "IFactoryResetInterface"} {
+    // clang-format off
+        static const FunctionInfo functions[] = {
+            {100, nullptr, "ResetToFactorySettings"},
+            {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+            {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+            {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+            {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+            {105, nullptr, "RequestResetToFactorySettingsSecurely"},
+            {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
+        };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IFactoryResetInterface::~IFactoryResetInterface() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/factory_reset_interface.h b/src/core/hle/service/ns/factory_reset_interface.h
new file mode 100644
index 000000000..50d125123
--- /dev/null
+++ b/src/core/hle/service/ns/factory_reset_interface.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IFactoryResetInterface final : public ServiceFramework<IFactoryResetInterface> {
+public:
+    explicit IFactoryResetInterface(Core::System& system_);
+    ~IFactoryResetInterface() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index 19c3ff01b..8402e83cb 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -1,893 +1,38 @@
 // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
-#include "common/logging/log.h"
-#include "common/settings.h"
-#include "core/arm/debug.h"
-#include "core/core.h"
-#include "core/file_sys/control_metadata.h"
-#include "core/file_sys/patch_manager.h"
-#include "core/file_sys/vfs/vfs.h"
-#include "core/hle/service/filesystem/filesystem.h"
-#include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "core/hle/service/ns/errors.h"
-#include "core/hle/service/ns/iplatform_service_manager.h"
-#include "core/hle/service/ns/language.h"
+#include "core/hle/service/ns/develop_interface.h"
 #include "core/hle/service/ns/ns.h"
-#include "core/hle/service/ns/pdm_qry.h"
+#include "core/hle/service/ns/platform_service_manager.h"
+#include "core/hle/service/ns/query_service.h"
+#include "core/hle/service/ns/service_getter_interface.h"
+#include "core/hle/service/ns/system_update_interface.h"
+#include "core/hle/service/ns/vulnerability_manager_interface.h"
 #include "core/hle/service/server_manager.h"
-#include "core/hle/service/set/settings_server.h"
 
 namespace Service::NS {
 
-IAccountProxyInterface::IAccountProxyInterface(Core::System& system_)
-    : ServiceFramework{system_, "IAccountProxyInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {0, nullptr, "CreateUserAccount"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IAccountProxyInterface::~IAccountProxyInterface() = default;
-
-IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
-    : ServiceFramework{system_, "IApplicationManagerInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {0, nullptr, "ListApplicationRecord"},
-        {1, nullptr, "GenerateApplicationRecordCount"},
-        {2, nullptr, "GetApplicationRecordUpdateSystemEvent"},
-        {3, nullptr, "GetApplicationViewDeprecated"},
-        {4, nullptr, "DeleteApplicationEntity"},
-        {5, nullptr, "DeleteApplicationCompletely"},
-        {6, nullptr, "IsAnyApplicationEntityRedundant"},
-        {7, nullptr, "DeleteRedundantApplicationEntity"},
-        {8, nullptr, "IsApplicationEntityMovable"},
-        {9, nullptr, "MoveApplicationEntity"},
-        {11, nullptr, "CalculateApplicationOccupiedSize"},
-        {16, nullptr, "PushApplicationRecord"},
-        {17, nullptr, "ListApplicationRecordContentMeta"},
-        {19, nullptr, "LaunchApplicationOld"},
-        {21, nullptr, "GetApplicationContentPath"},
-        {22, nullptr, "TerminateApplication"},
-        {23, nullptr, "ResolveApplicationContentPath"},
-        {26, nullptr, "BeginInstallApplication"},
-        {27, nullptr, "DeleteApplicationRecord"},
-        {30, nullptr, "RequestApplicationUpdateInfo"},
-        {31, nullptr, "Unknown31"},
-        {32, nullptr, "CancelApplicationDownload"},
-        {33, nullptr, "ResumeApplicationDownload"},
-        {35, nullptr, "UpdateVersionList"},
-        {36, nullptr, "PushLaunchVersion"},
-        {37, nullptr, "ListRequiredVersion"},
-        {38, nullptr, "CheckApplicationLaunchVersion"},
-        {39, nullptr, "CheckApplicationLaunchRights"},
-        {40, nullptr, "GetApplicationLogoData"},
-        {41, nullptr, "CalculateApplicationDownloadRequiredSize"},
-        {42, nullptr, "CleanupSdCard"},
-        {43, nullptr, "CheckSdCardMountStatus"},
-        {44, nullptr, "GetSdCardMountStatusChangedEvent"},
-        {45, nullptr, "GetGameCardAttachmentEvent"},
-        {46, nullptr, "GetGameCardAttachmentInfo"},
-        {47, nullptr, "GetTotalSpaceSize"},
-        {48, nullptr, "GetFreeSpaceSize"},
-        {49, nullptr, "GetSdCardRemovedEvent"},
-        {52, nullptr, "GetGameCardUpdateDetectionEvent"},
-        {53, nullptr, "DisableApplicationAutoDelete"},
-        {54, nullptr, "EnableApplicationAutoDelete"},
-        {55, &IApplicationManagerInterface::GetApplicationDesiredLanguage, "GetApplicationDesiredLanguage"},
-        {56, nullptr, "SetApplicationTerminateResult"},
-        {57, nullptr, "ClearApplicationTerminateResult"},
-        {58, nullptr, "GetLastSdCardMountUnexpectedResult"},
-        {59, &IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode, "ConvertApplicationLanguageToLanguageCode"},
-        {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
-        {61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
-        {62, nullptr, "GetGameCardStopper"},
-        {63, nullptr, "IsSystemProgramInstalled"},
-        {64, nullptr, "StartApplyDeltaTask"},
-        {65, nullptr, "GetRequestServerStopper"},
-        {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
-        {67, nullptr, "CancelApplicationApplyDelta"},
-        {68, nullptr, "ResumeApplicationApplyDelta"},
-        {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
-        {70, nullptr, "ResumeAll"},
-        {71, nullptr, "GetStorageSize"},
-        {80, nullptr, "RequestDownloadApplication"},
-        {81, nullptr, "RequestDownloadAddOnContent"},
-        {82, nullptr, "DownloadApplication"},
-        {83, nullptr, "CheckApplicationResumeRights"},
-        {84, nullptr, "GetDynamicCommitEvent"},
-        {85, nullptr, "RequestUpdateApplication2"},
-        {86, nullptr, "EnableApplicationCrashReport"},
-        {87, nullptr, "IsApplicationCrashReportEnabled"},
-        {90, nullptr, "BoostSystemMemoryResourceLimit"},
-        {91, nullptr, "DeprecatedLaunchApplication"},
-        {92, nullptr, "GetRunningApplicationProgramId"},
-        {93, nullptr, "GetMainApplicationProgramIndex"},
-        {94, nullptr, "LaunchApplication"},
-        {95, nullptr, "GetApplicationLaunchInfo"},
-        {96, nullptr, "AcquireApplicationLaunchInfo"},
-        {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
-        {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
-        {99, nullptr, "LaunchDevMenu"},
-        {100, nullptr, "ResetToFactorySettings"},
-        {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
-        {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
-        {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
-        {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
-        {105, nullptr, "RequestResetToFactorySettingsSecurely"},
-        {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
-        {200, nullptr, "CalculateUserSaveDataStatistics"},
-        {201, nullptr, "DeleteUserSaveDataAll"},
-        {210, nullptr, "DeleteUserSystemSaveData"},
-        {211, nullptr, "DeleteSaveData"},
-        {220, nullptr, "UnregisterNetworkServiceAccount"},
-        {221, nullptr, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
-        {300, nullptr, "GetApplicationShellEvent"},
-        {301, nullptr, "PopApplicationShellEventInfo"},
-        {302, nullptr, "LaunchLibraryApplet"},
-        {303, nullptr, "TerminateLibraryApplet"},
-        {304, nullptr, "LaunchSystemApplet"},
-        {305, nullptr, "TerminateSystemApplet"},
-        {306, nullptr, "LaunchOverlayApplet"},
-        {307, nullptr, "TerminateOverlayApplet"},
-        {400, &IApplicationManagerInterface::GetApplicationControlData, "GetApplicationControlData"},
-        {401, nullptr, "InvalidateAllApplicationControlCache"},
-        {402, nullptr, "RequestDownloadApplicationControlData"},
-        {403, nullptr, "GetMaxApplicationControlCacheCount"},
-        {404, nullptr, "InvalidateApplicationControlCache"},
-        {405, nullptr, "ListApplicationControlCacheEntryInfo"},
-        {406, nullptr, "GetApplicationControlProperty"},
-        {407, nullptr, "ListApplicationTitle"},
-        {408, nullptr, "ListApplicationIcon"},
-        {502, nullptr, "RequestCheckGameCardRegistration"},
-        {503, nullptr, "RequestGameCardRegistrationGoldPoint"},
-        {504, nullptr, "RequestRegisterGameCard"},
-        {505, nullptr, "GetGameCardMountFailureEvent"},
-        {506, nullptr, "IsGameCardInserted"},
-        {507, nullptr, "EnsureGameCardAccess"},
-        {508, nullptr, "GetLastGameCardMountFailureResult"},
-        {509, nullptr, "ListApplicationIdOnGameCard"},
-        {510, nullptr, "GetGameCardPlatformRegion"},
-        {600, nullptr, "CountApplicationContentMeta"},
-        {601, nullptr, "ListApplicationContentMetaStatus"},
-        {602, nullptr, "ListAvailableAddOnContent"},
-        {603, nullptr, "GetOwnedApplicationContentMetaStatus"},
-        {604, nullptr, "RegisterContentsExternalKey"},
-        {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
-        {606, nullptr, "GetContentMetaStorage"},
-        {607, nullptr, "ListAvailableAddOnContent"},
-        {609, nullptr, "ListAvailabilityAssuredAddOnContent"},
-        {610, nullptr, "GetInstalledContentMetaStorage"},
-        {611, nullptr, "PrepareAddOnContent"},
-        {700, nullptr, "PushDownloadTaskList"},
-        {701, nullptr, "ClearTaskStatusList"},
-        {702, nullptr, "RequestDownloadTaskList"},
-        {703, nullptr, "RequestEnsureDownloadTask"},
-        {704, nullptr, "ListDownloadTaskStatus"},
-        {705, nullptr, "RequestDownloadTaskListData"},
-        {800, nullptr, "RequestVersionList"},
-        {801, nullptr, "ListVersionList"},
-        {802, nullptr, "RequestVersionListData"},
-        {900, nullptr, "GetApplicationRecord"},
-        {901, nullptr, "GetApplicationRecordProperty"},
-        {902, nullptr, "EnableApplicationAutoUpdate"},
-        {903, nullptr, "DisableApplicationAutoUpdate"},
-        {904, nullptr, "TouchApplication"},
-        {905, nullptr, "RequestApplicationUpdate"},
-        {906, nullptr, "IsApplicationUpdateRequested"},
-        {907, nullptr, "WithdrawApplicationUpdateRequest"},
-        {908, nullptr, "ListApplicationRecordInstalledContentMeta"},
-        {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
-        {910, nullptr, "HasApplicationRecord"},
-        {911, nullptr, "SetPreInstalledApplication"},
-        {912, nullptr, "ClearPreInstalledApplicationFlag"},
-        {913, nullptr, "ListAllApplicationRecord"},
-        {914, nullptr, "HideApplicationRecord"},
-        {915, nullptr, "ShowApplicationRecord"},
-        {916, nullptr, "IsApplicationAutoDeleteDisabled"},
-        {1000, nullptr, "RequestVerifyApplicationDeprecated"},
-        {1001, nullptr, "CorruptApplicationForDebug"},
-        {1002, nullptr, "RequestVerifyAddOnContentsRights"},
-        {1003, nullptr, "RequestVerifyApplication"},
-        {1004, nullptr, "CorruptContentForDebug"},
-        {1200, nullptr, "NeedsUpdateVulnerability"},
-        {1300, nullptr, "IsAnyApplicationEntityInstalled"},
-        {1301, nullptr, "DeleteApplicationContentEntities"},
-        {1302, nullptr, "CleanupUnrecordedApplicationEntity"},
-        {1303, nullptr, "CleanupAddOnContentsWithNoRights"},
-        {1304, nullptr, "DeleteApplicationContentEntity"},
-        {1305, nullptr, "TryDeleteRunningApplicationEntity"},
-        {1306, nullptr, "TryDeleteRunningApplicationCompletely"},
-        {1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
-        {1308, nullptr, "DeleteApplicationCompletelyForDebug"},
-        {1309, nullptr, "CleanupUnavailableAddOnContents"},
-        {1310, nullptr, "RequestMoveApplicationEntity"},
-        {1311, nullptr, "EstimateSizeToMove"},
-        {1312, nullptr, "HasMovableEntity"},
-        {1313, nullptr, "CleanupOrphanContents"},
-        {1314, nullptr, "CheckPreconditionSatisfiedToMove"},
-        {1400, nullptr, "PrepareShutdown"},
-        {1500, nullptr, "FormatSdCard"},
-        {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
-        {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
-        {1504, nullptr, "InsertSdCard"},
-        {1505, nullptr, "RemoveSdCard"},
-        {1506, nullptr, "GetSdCardStartupStatus"},
-        {1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
-        {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
-        {1700, nullptr, "ListApplicationDownloadingContentMeta"},
-        {1701, nullptr, "GetApplicationView"},
-        {1702, nullptr, "GetApplicationDownloadTaskStatus"},
-        {1703, nullptr, "GetApplicationViewDownloadErrorContext"},
-        {1704, nullptr, "GetApplicationViewWithPromotionInfo"},
-        {1705, nullptr, "IsPatchAutoDeletableApplication"},
-        {1800, nullptr, "IsNotificationSetupCompleted"},
-        {1801, nullptr, "GetLastNotificationInfoCount"},
-        {1802, nullptr, "ListLastNotificationInfo"},
-        {1803, nullptr, "ListNotificationTask"},
-        {1900, nullptr, "IsActiveAccount"},
-        {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
-        {1902, nullptr, "GetApplicationTicketInfo"},
-        {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
-        {2000, nullptr, "GetSystemDeliveryInfo"},
-        {2001, nullptr, "SelectLatestSystemDeliveryInfo"},
-        {2002, nullptr, "VerifyDeliveryProtocolVersion"},
-        {2003, nullptr, "GetApplicationDeliveryInfo"},
-        {2004, nullptr, "HasAllContentsToDeliver"},
-        {2005, nullptr, "CompareApplicationDeliveryInfo"},
-        {2006, nullptr, "CanDeliverApplication"},
-        {2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
-        {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
-        {2009, nullptr, "EstimateRequiredSize"},
-        {2010, nullptr, "RequestReceiveApplication"},
-        {2011, nullptr, "CommitReceiveApplication"},
-        {2012, nullptr, "GetReceiveApplicationProgress"},
-        {2013, nullptr, "RequestSendApplication"},
-        {2014, nullptr, "GetSendApplicationProgress"},
-        {2015, nullptr, "CompareSystemDeliveryInfo"},
-        {2016, nullptr, "ListNotCommittedContentMeta"},
-        {2017, nullptr, "CreateDownloadTask"},
-        {2018, nullptr, "GetApplicationDeliveryInfoHash"},
-        {2050, nullptr, "GetApplicationRightsOnClient"},
-        {2051, nullptr, "InvalidateRightsIdCache"},
-        {2100, nullptr, "GetApplicationTerminateResult"},
-        {2101, nullptr, "GetRawApplicationTerminateResult"},
-        {2150, nullptr, "CreateRightsEnvironment"},
-        {2151, nullptr, "DestroyRightsEnvironment"},
-        {2152, nullptr, "ActivateRightsEnvironment"},
-        {2153, nullptr, "DeactivateRightsEnvironment"},
-        {2154, nullptr, "ForceActivateRightsContextForExit"},
-        {2155, nullptr, "UpdateRightsEnvironmentStatus"},
-        {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
-        {2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
-        {2161, nullptr, "SetUsersToRightsEnvironment"},
-        {2170, nullptr, "GetRightsEnvironmentStatus"},
-        {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
-        {2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
-        {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
-        {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
-        {2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
-        {2199, nullptr, "GetRightsEnvironmentCountForDebug"},
-        {2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
-        {2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
-        {2250, nullptr, "RequestReportActiveELicence"},
-        {2300, nullptr, "ListEventLog"},
-        {2350, nullptr, "PerformAutoUpdateByApplicationId"},
-        {2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
-        {2352, nullptr, "RequestResolveNoDownloadRightsError"},
-        {2353, nullptr, "GetApplicationDownloadTaskInfo"},
-        {2354, nullptr, "PrioritizeApplicationBackgroundTask"},
-        {2355, nullptr, "PreferStorageEfficientUpdate"},
-        {2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
-        {2357, nullptr, "EnableMultiCoreDownload"},
-        {2358, nullptr, "DisableMultiCoreDownload"},
-        {2359, nullptr, "IsMultiCoreDownloadEnabled"},
-        {2400, nullptr, "GetPromotionInfo"},
-        {2401, nullptr, "CountPromotionInfo"},
-        {2402, nullptr, "ListPromotionInfo"},
-        {2403, nullptr, "ImportPromotionJsonForDebug"},
-        {2404, nullptr, "ClearPromotionInfoForDebug"},
-        {2500, nullptr, "ConfirmAvailableTime"},
-        {2510, nullptr, "CreateApplicationResource"},
-        {2511, nullptr, "GetApplicationResource"},
-        {2513, nullptr, "LaunchMicroApplication"},
-        {2514, nullptr, "ClearTaskOfAsyncTaskManager"},
-        {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
-        {2516, nullptr, "EnsureApplicationCertificate"},
-        {2517, nullptr, "CreateApplicationInstance"},
-        {2518, nullptr, "UpdateQualificationForDebug"},
-        {2519, nullptr, "IsQualificationTransitionSupported"},
-        {2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
-        {2521, nullptr, "GetRightsUserChangedEvent"},
-        {2522, nullptr, "IsRomRedirectionAvailable"},
-        {2800, nullptr, "GetApplicationIdOfPreomia"},
-        {3000, nullptr, "RegisterDeviceLockKey"},
-        {3001, nullptr, "UnregisterDeviceLockKey"},
-        {3002, nullptr, "VerifyDeviceLockKey"},
-        {3003, nullptr, "HideApplicationIcon"},
-        {3004, nullptr, "ShowApplicationIcon"},
-        {3005, nullptr, "HideApplicationTitle"},
-        {3006, nullptr, "ShowApplicationTitle"},
-        {3007, nullptr, "EnableGameCard"},
-        {3008, nullptr, "DisableGameCard"},
-        {3009, nullptr, "EnableLocalContentShare"},
-        {3010, nullptr, "DisableLocalContentShare"},
-        {3011, nullptr, "IsApplicationIconHidden"},
-        {3012, nullptr, "IsApplicationTitleHidden"},
-        {3013, nullptr, "IsGameCardEnabled"},
-        {3014, nullptr, "IsLocalContentShareEnabled"},
-        {3050, nullptr, "ListAssignELicenseTaskResult"},
-        {9999, nullptr, "GetApplicationCertificate"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IApplicationManagerInterface::~IApplicationManagerInterface() = default;
-
-void IApplicationManagerInterface::GetApplicationControlData(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto flag = rp.PopRaw<u64>();
-    LOG_DEBUG(Service_NS, "called with flag={:016X}", flag);
-
-    const auto title_id = rp.PopRaw<u64>();
-
-    const auto size = ctx.GetWriteBufferSize();
-
-    const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
-                                   system.GetContentProvider()};
-    const auto control = pm.GetControlMetadata();
-
-    std::vector<u8> out;
-
-    if (control.first != nullptr) {
-        if (size < 0x4000) {
-            LOG_ERROR(Service_NS,
-                      "output buffer is too small! (actual={:016X}, expected_min=0x4000)", size);
-            IPC::ResponseBuilder rb{ctx, 2};
-            // TODO(DarkLordZach): Find a better error code for this.
-            rb.Push(ResultUnknown);
-            return;
-        }
-
-        out.resize(0x4000);
-        const auto bytes = control.first->GetRawBytes();
-        std::memcpy(out.data(), bytes.data(), bytes.size());
-    } else {
-        LOG_WARNING(Service_NS, "missing NACP data for title_id={:016X}, defaulting to zeros.",
-                    title_id);
-        out.resize(std::min<u64>(0x4000, size));
-    }
-
-    if (control.second != nullptr) {
-        if (size < 0x4000 + control.second->GetSize()) {
-            LOG_ERROR(Service_NS,
-                      "output buffer is too small! (actual={:016X}, expected_min={:016X})", size,
-                      0x4000 + control.second->GetSize());
-            IPC::ResponseBuilder rb{ctx, 2};
-            // TODO(DarkLordZach): Find a better error code for this.
-            rb.Push(ResultUnknown);
-            return;
-        }
-
-        out.resize(0x4000 + control.second->GetSize());
-        control.second->Read(out.data() + 0x4000, control.second->GetSize());
-    } else {
-        LOG_WARNING(Service_NS, "missing icon data for title_id={:016X}, defaulting to zeros.",
-                    title_id);
-    }
-
-    ctx.WriteBuffer(out);
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u32>(static_cast<u32>(out.size()));
-}
-
-void IApplicationManagerInterface::GetApplicationDesiredLanguage(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto supported_languages = rp.Pop<u32>();
-
-    u8 desired_language{};
-    const auto res = GetApplicationDesiredLanguage(&desired_language, supported_languages);
-    if (res == ResultSuccess) {
-        IPC::ResponseBuilder rb{ctx, 3};
-        rb.Push(ResultSuccess);
-        rb.Push<u32>(desired_language);
-    } else {
-        IPC::ResponseBuilder rb{ctx, 2};
-        rb.Push(res);
-    }
-}
-
-Result IApplicationManagerInterface::GetApplicationDesiredLanguage(u8* out_desired_language,
-                                                                   const u32 supported_languages) {
-    LOG_DEBUG(Service_NS, "called with supported_languages={:08X}", supported_languages);
-
-    // Get language code from settings
-    const auto language_code =
-        Set::GetLanguageCodeFromIndex(static_cast<s32>(Settings::values.language_index.GetValue()));
-
-    // Convert to application language, get priority list
-    const auto application_language = ConvertToApplicationLanguage(language_code);
-    if (application_language == std::nullopt) {
-        LOG_ERROR(Service_NS, "Could not convert application language! language_code={}",
-                  language_code);
-        return Service::NS::ResultApplicationLanguageNotFound;
-    }
-    const auto priority_list = GetApplicationLanguagePriorityList(*application_language);
-    if (!priority_list) {
-        LOG_ERROR(Service_NS,
-                  "Could not find application language priorities! application_language={}",
-                  *application_language);
-        return Service::NS::ResultApplicationLanguageNotFound;
-    }
-
-    // Try to find a valid language.
-    for (const auto lang : *priority_list) {
-        const auto supported_flag = GetSupportedLanguageFlag(lang);
-        if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
-            *out_desired_language = static_cast<u8>(lang);
-            return ResultSuccess;
-        }
-    }
-
-    LOG_ERROR(Service_NS, "Could not find a valid language! supported_languages={:08X}",
-              supported_languages);
-    return Service::NS::ResultApplicationLanguageNotFound;
-}
-
-void IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
-    HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto application_language = rp.Pop<u8>();
-
-    u64 language_code{};
-    const auto res = ConvertApplicationLanguageToLanguageCode(&language_code, application_language);
-    if (res == ResultSuccess) {
-        IPC::ResponseBuilder rb{ctx, 4};
-        rb.Push(ResultSuccess);
-        rb.Push(language_code);
-    } else {
-        IPC::ResponseBuilder rb{ctx, 2};
-        rb.Push(res);
-    }
-}
-
-Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
-    u64* out_language_code, u8 application_language) {
-    const auto language_code =
-        ConvertToLanguageCode(static_cast<ApplicationLanguage>(application_language));
-    if (language_code == std::nullopt) {
-        LOG_ERROR(Service_NS, "Language not found! application_language={}", application_language);
-        return Service::NS::ResultApplicationLanguageNotFound;
-    }
-
-    *out_language_code = static_cast<u64>(*language_code);
-    return ResultSuccess;
-}
-
-IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_)
-    : ServiceFramework{system_, "IApplicationVersionInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {0, nullptr, "GetLaunchRequiredVersion"},
-        {1, nullptr, "UpgradeLaunchRequiredVersion"},
-        {35, nullptr, "UpdateVersionList"},
-        {36, nullptr, "PushLaunchVersion"},
-        {37, nullptr, "ListRequiredVersion"},
-        {800, nullptr, "RequestVersionList"},
-        {801, nullptr, "ListVersionList"},
-        {802, nullptr, "RequestVersionListData"},
-        {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
-        {901, nullptr, "ListDefaultAutoUpdatePolicy"},
-        {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
-        {1000, nullptr, "PerformAutoUpdate"},
-        {1001, nullptr, "ListAutoUpdateSchedule"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IApplicationVersionInterface::~IApplicationVersionInterface() = default;
-
-IContentManagementInterface::IContentManagementInterface(Core::System& system_)
-    : ServiceFramework{system_, "IContentManagementInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {11, nullptr, "CalculateApplicationOccupiedSize"},
-        {43, nullptr, "CheckSdCardMountStatus"},
-        {47, &IContentManagementInterface::GetTotalSpaceSize, "GetTotalSpaceSize"},
-        {48, &IContentManagementInterface::GetFreeSpaceSize, "GetFreeSpaceSize"},
-        {600, nullptr, "CountApplicationContentMeta"},
-        {601, nullptr, "ListApplicationContentMetaStatus"},
-        {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
-        {607, nullptr, "IsAnyApplicationRunning"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IContentManagementInterface::~IContentManagementInterface() = default;
-
-void IContentManagementInterface::GetTotalSpaceSize(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto storage{rp.PopEnum<FileSys::StorageId>()};
-
-    LOG_INFO(Service_Capture, "called, storage={}", storage);
-
-    IPC::ResponseBuilder rb{ctx, 4};
-    rb.Push(ResultSuccess);
-    rb.Push<u64>(system.GetFileSystemController().GetTotalSpaceSize(storage));
-}
-
-void IContentManagementInterface::GetFreeSpaceSize(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto storage{rp.PopEnum<FileSys::StorageId>()};
-
-    LOG_INFO(Service_Capture, "called, storage={}", storage);
-
-    IPC::ResponseBuilder rb{ctx, 4};
-    rb.Push(ResultSuccess);
-    rb.Push<u64>(system.GetFileSystemController().GetFreeSpaceSize(storage));
-}
-
-IDocumentInterface::IDocumentInterface(Core::System& system_)
-    : ServiceFramework{system_, "IDocumentInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {21, nullptr, "GetApplicationContentPath"},
-        {23, &IDocumentInterface::ResolveApplicationContentPath, "ResolveApplicationContentPath"},
-        {92, &IDocumentInterface::GetRunningApplicationProgramId, "GetRunningApplicationProgramId"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IDocumentInterface::~IDocumentInterface() = default;
-
-void IDocumentInterface::ResolveApplicationContentPath(HLERequestContext& ctx) {
-    struct ContentPath {
-        u8 file_system_proxy_type;
-        u64 program_id;
-    };
-    static_assert(sizeof(ContentPath) == 0x10, "ContentPath has wrong size");
-
-    IPC::RequestParser rp{ctx};
-    auto content_path = rp.PopRaw<ContentPath>();
-    LOG_WARNING(Service_NS, "(STUBBED) called, file_system_proxy_type={}, program_id={:016X}",
-                content_path.file_system_proxy_type, content_path.program_id);
-
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(ResultSuccess);
-}
-
-void IDocumentInterface::GetRunningApplicationProgramId(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto caller_program_id = rp.PopRaw<u64>();
-    LOG_WARNING(Service_NS, "(STUBBED) called, caller_program_id={:016X}", caller_program_id);
-
-    IPC::ResponseBuilder rb{ctx, 4};
-    rb.Push(ResultSuccess);
-    rb.Push<u64>(system.GetApplicationProcessProgramID());
-}
-
-IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_)
-    : ServiceFramework{system_, "IDownloadTaskInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {701, nullptr, "ClearTaskStatusList"},
-        {702, nullptr, "RequestDownloadTaskList"},
-        {703, nullptr, "RequestEnsureDownloadTask"},
-        {704, nullptr, "ListDownloadTaskStatus"},
-        {705, nullptr, "RequestDownloadTaskListData"},
-        {706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
-        {707, nullptr, "EnableAutoCommit"},
-        {708, nullptr, "DisableAutoCommit"},
-        {709, nullptr, "TriggerDynamicCommitEvent"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IDownloadTaskInterface::~IDownloadTaskInterface() = default;
-
-IECommerceInterface::IECommerceInterface(Core::System& system_)
-    : ServiceFramework{system_, "IECommerceInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {0, nullptr, "RequestLinkDevice"},
-        {1, nullptr, "RequestCleanupAllPreInstalledApplications"},
-        {2, nullptr, "RequestCleanupPreInstalledApplication"},
-        {3, nullptr, "RequestSyncRights"},
-        {4, nullptr, "RequestUnlinkDevice"},
-        {5, nullptr, "RequestRevokeAllELicense"},
-        {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IECommerceInterface::~IECommerceInterface() = default;
-
-IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
-    : ServiceFramework{system_, "IFactoryResetInterface"} {
-    // clang-format off
-        static const FunctionInfo functions[] = {
-            {100, nullptr, "ResetToFactorySettings"},
-            {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
-            {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
-            {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
-            {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
-            {105, nullptr, "RequestResetToFactorySettingsSecurely"},
-            {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
-        };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IFactoryResetInterface::~IFactoryResetInterface() = default;
-
-IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_)
-    : ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} {
-    static const FunctionInfo functions[] = {
-        {0, &IReadOnlyApplicationRecordInterface::HasApplicationRecord, "HasApplicationRecord"},
-        {1, nullptr, "NotifyApplicationFailure"},
-        {2, &IReadOnlyApplicationRecordInterface::IsDataCorruptedResult, "IsDataCorruptedResult"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default;
-
-void IReadOnlyApplicationRecordInterface::HasApplicationRecord(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const u64 program_id = rp.PopRaw<u64>();
-    LOG_WARNING(Service_NS, "(STUBBED) called, program_id={:X}", program_id);
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u8>(1);
-}
-
-void IReadOnlyApplicationRecordInterface::IsDataCorruptedResult(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto result = rp.PopRaw<Result>();
-    LOG_WARNING(Service_NS, "(STUBBED) called, result={:#x}", result.GetInnerValue());
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u8>(0);
-}
-
-IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface(
-    Core::System& system_)
-    : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {0, &IReadOnlyApplicationControlDataInterface::GetApplicationControlData, "GetApplicationControlData"},
-        {1, nullptr, "GetApplicationDesiredLanguage"},
-        {2, nullptr, "ConvertApplicationLanguageToLanguageCode"},
-        {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
-        {4, nullptr, "SelectApplicationDesiredLanguage"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default;
-
-void IReadOnlyApplicationControlDataInterface::GetApplicationControlData(HLERequestContext& ctx) {
-    enum class ApplicationControlSource : u8 {
-        CacheOnly,
-        Storage,
-        StorageOnly,
-    };
-
-    struct RequestParameters {
-        ApplicationControlSource source;
-        u64 application_id;
-    };
-    static_assert(sizeof(RequestParameters) == 0x10, "RequestParameters has incorrect size.");
-
-    IPC::RequestParser rp{ctx};
-    std::vector<u8> nacp_data{};
-    const auto parameters{rp.PopRaw<RequestParameters>()};
-    const auto result =
-        system.GetARPManager().GetControlProperty(&nacp_data, parameters.application_id);
-
-    if (result == ResultSuccess) {
-        ctx.WriteBuffer(nacp_data.data(), nacp_data.size());
-    }
-
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(result);
-}
-
-NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
-    // clang-format off
-    static const FunctionInfo functions[] = {
-        {7988, nullptr, "GetDynamicRightsInterface"},
-        {7989, &NS::PushInterface<IReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
-        {7991, &NS::PushInterface<IReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
-        {7992, &NS::PushInterface<IECommerceInterface>, "GetECommerceInterface"},
-        {7993, &NS::PushInterface<IApplicationVersionInterface>, "GetApplicationVersionInterface"},
-        {7994, &NS::PushInterface<IFactoryResetInterface>, "GetFactoryResetInterface"},
-        {7995, &NS::PushInterface<IAccountProxyInterface>, "GetAccountProxyInterface"},
-        {7996, &NS::PushIApplicationManagerInterface, "GetApplicationManagerInterface"},
-        {7997, &NS::PushInterface<IDownloadTaskInterface>, "GetDownloadTaskInterface"},
-        {7998, &NS::PushInterface<IContentManagementInterface>, "GetContentManagementInterface"},
-        {7999, &NS::PushInterface<IDocumentInterface>, "GetDocumentInterface"},
-    };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-NS::~NS() = default;
-
-std::shared_ptr<IApplicationManagerInterface> NS::GetApplicationManagerInterface() const {
-    return GetInterface<IApplicationManagerInterface>(system);
-}
-
-class NS_DEV final : public ServiceFramework<NS_DEV> {
-public:
-    explicit NS_DEV(Core::System& system_) : ServiceFramework{system_, "ns:dev"} {
-        // clang-format off
-        static const FunctionInfo functions[] = {
-            {0, nullptr, "LaunchProgram"},
-            {1, nullptr, "TerminateProcess"},
-            {2, nullptr, "TerminateProgram"},
-            {4, nullptr, "GetShellEvent"},
-            {5, nullptr, "GetShellEventInfo"},
-            {6, nullptr, "TerminateApplication"},
-            {7, nullptr, "PrepareLaunchProgramFromHost"},
-            {8, nullptr, "LaunchApplicationFromHost"},
-            {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
-            {10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
-            {11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
-            {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
-            {13, nullptr, "CreateApplicationResourceForDevelop"},
-            {14, nullptr, "IsPreomiaForDevelop"},
-            {15, nullptr, "GetApplicationProgramIdFromHost"},
-            {16, nullptr, "RefreshCachedDebugValues"},
-            {17, nullptr, "PrepareLaunchApplicationFromHost"},
-            {18, nullptr, "GetLaunchEvent"},
-            {19, nullptr, "GetLaunchResult"},
-        };
-        // clang-format on
-
-        RegisterHandlers(functions);
-    }
-};
-
-class ISystemUpdateControl final : public ServiceFramework<ISystemUpdateControl> {
-public:
-    explicit ISystemUpdateControl(Core::System& system_)
-        : ServiceFramework{system_, "ISystemUpdateControl"} {
-        // clang-format off
-        static const FunctionInfo functions[] = {
-            {0, nullptr, "HasDownloaded"},
-            {1, nullptr, "RequestCheckLatestUpdate"},
-            {2, nullptr, "RequestDownloadLatestUpdate"},
-            {3, nullptr, "GetDownloadProgress"},
-            {4, nullptr, "ApplyDownloadedUpdate"},
-            {5, nullptr, "RequestPrepareCardUpdate"},
-            {6, nullptr, "GetPrepareCardUpdateProgress"},
-            {7, nullptr, "HasPreparedCardUpdate"},
-            {8, nullptr, "ApplyCardUpdate"},
-            {9, nullptr, "GetDownloadedEulaDataSize"},
-            {10, nullptr, "GetDownloadedEulaData"},
-            {11, nullptr, "SetupCardUpdate"},
-            {12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
-            {13, nullptr, "GetPreparedCardUpdateEulaData"},
-            {14, nullptr, "SetupCardUpdateViaSystemUpdater"},
-            {15, nullptr, "HasReceived"},
-            {16, nullptr, "RequestReceiveSystemUpdate"},
-            {17, nullptr, "GetReceiveProgress"},
-            {18, nullptr, "ApplyReceivedUpdate"},
-            {19, nullptr, "GetReceivedEulaDataSize"},
-            {20, nullptr, "GetReceivedEulaData"},
-            {21, nullptr, "SetupToReceiveSystemUpdate"},
-            {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
-        };
-        // clang-format on
-
-        RegisterHandlers(functions);
-    }
-};
-
-class NS_SU final : public ServiceFramework<NS_SU> {
-public:
-    explicit NS_SU(Core::System& system_) : ServiceFramework{system_, "ns:su"} {
-        // clang-format off
-        static const FunctionInfo functions[] = {
-            {0, nullptr, "GetBackgroundNetworkUpdateState"},
-            {1, &NS_SU::OpenSystemUpdateControl, "OpenSystemUpdateControl"},
-            {2, nullptr, "NotifyExFatDriverRequired"},
-            {3, nullptr, "ClearExFatDriverStatusForDebug"},
-            {4, nullptr, "RequestBackgroundNetworkUpdate"},
-            {5, nullptr, "NotifyBackgroundNetworkUpdate"},
-            {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
-            {9, nullptr, "GetSystemUpdateNotificationEventForContentDelivery"},
-            {10, nullptr, "NotifySystemUpdateForContentDelivery"},
-            {11, nullptr, "PrepareShutdown"},
-            {12, nullptr, "Unknown12"},
-            {13, nullptr, "Unknown13"},
-            {14, nullptr, "Unknown14"},
-            {15, nullptr, "Unknown15"},
-            {16, nullptr, "DestroySystemUpdateTask"},
-            {17, nullptr, "RequestSendSystemUpdate"},
-            {18, nullptr, "GetSendSystemUpdateProgress"},
-        };
-        // clang-format on
-
-        RegisterHandlers(functions);
-    }
-
-private:
-    void OpenSystemUpdateControl(HLERequestContext& ctx) {
-        LOG_DEBUG(Service_NS, "called");
-
-        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-        rb.Push(ResultSuccess);
-        rb.PushIpcInterface<ISystemUpdateControl>(system);
-    }
-};
-
-class NS_VM final : public ServiceFramework<NS_VM> {
-public:
-    explicit NS_VM(Core::System& system_) : ServiceFramework{system_, "ns:vm"} {
-        // clang-format off
-        static const FunctionInfo functions[] = {
-            {1200, &NS_VM::NeedsUpdateVulnerability, "NeedsUpdateVulnerability"},
-            {1201, nullptr, "UpdateSafeSystemVersionForDebug"},
-            {1202, nullptr, "GetSafeSystemVersion"},
-        };
-        // clang-format on
-
-        RegisterHandlers(functions);
-    }
-
-private:
-    void NeedsUpdateVulnerability(HLERequestContext& ctx) {
-        LOG_WARNING(Service_NS, "(STUBBED) called");
-
-        IPC::ResponseBuilder rb{ctx, 3};
-        rb.Push(ResultSuccess);
-        rb.Push(false);
-    }
-};
-
 void LoopProcess(Core::System& system) {
     auto server_manager = std::make_unique<ServerManager>(system);
 
-    server_manager->RegisterNamedService("ns:am2", std::make_shared<NS>("ns:am2", system));
-    server_manager->RegisterNamedService("ns:ec", std::make_shared<NS>("ns:ec", system));
-    server_manager->RegisterNamedService("ns:rid", std::make_shared<NS>("ns:rid", system));
-    server_manager->RegisterNamedService("ns:rt", std::make_shared<NS>("ns:rt", system));
-    server_manager->RegisterNamedService("ns:web", std::make_shared<NS>("ns:web", system));
-    server_manager->RegisterNamedService("ns:ro", std::make_shared<NS>("ns:ro", system));
+    server_manager->RegisterNamedService(
+        "ns:am2", std::make_shared<IServiceGetterInterface>(system, "ns:am2"));
+    server_manager->RegisterNamedService(
+        "ns:ec", std::make_shared<IServiceGetterInterface>(system, "ns:ec"));
+    server_manager->RegisterNamedService(
+        "ns:rid", std::make_shared<IServiceGetterInterface>(system, "ns:rid"));
+    server_manager->RegisterNamedService(
+        "ns:rt", std::make_shared<IServiceGetterInterface>(system, "ns:rt"));
+    server_manager->RegisterNamedService(
+        "ns:web", std::make_shared<IServiceGetterInterface>(system, "ns:web"));
+    server_manager->RegisterNamedService(
+        "ns:ro", std::make_shared<IServiceGetterInterface>(system, "ns:ro"));
 
-    server_manager->RegisterNamedService("ns:dev", std::make_shared<NS_DEV>(system));
-    server_manager->RegisterNamedService("ns:su", std::make_shared<NS_SU>(system));
-    server_manager->RegisterNamedService("ns:vm", std::make_shared<NS_VM>(system));
-    server_manager->RegisterNamedService("pdm:qry", std::make_shared<PDM_QRY>(system));
+    server_manager->RegisterNamedService("ns:dev", std::make_shared<IDevelopInterface>(system));
+    server_manager->RegisterNamedService("ns:su", std::make_shared<ISystemUpdateInterface>(system));
+    server_manager->RegisterNamedService("ns:vm",
+                                         std::make_shared<IVulnerabilityManagerInterface>(system));
+    server_manager->RegisterNamedService("pdm:qry", std::make_shared<IQueryService>(system));
 
     server_manager->RegisterNamedService("pl:s",
                                          std::make_shared<IPlatformServiceManager>(system, "pl:s"));
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h
index 9ee306ef9..f79b4ae3d 100644
--- a/src/core/hle/service/ns/ns.h
+++ b/src/core/hle/service/ns/ns.h
@@ -3,141 +3,12 @@
 
 #pragma once
 
-#include "core/hle/service/service.h"
-
 namespace Core {
 class System;
 }
 
-namespace Service {
-
-namespace FileSystem {
-class FileSystemController;
-} // namespace FileSystem
-
-namespace NS {
-
-class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterface> {
-public:
-    explicit IAccountProxyInterface(Core::System& system_);
-    ~IAccountProxyInterface() override;
-};
-
-class IApplicationManagerInterface final : public ServiceFramework<IApplicationManagerInterface> {
-public:
-    explicit IApplicationManagerInterface(Core::System& system_);
-    ~IApplicationManagerInterface() override;
-
-    Result GetApplicationDesiredLanguage(u8* out_desired_language, u32 supported_languages);
-    Result ConvertApplicationLanguageToLanguageCode(u64* out_language_code,
-                                                    u8 application_language);
-
-private:
-    void GetApplicationControlData(HLERequestContext& ctx);
-    void GetApplicationDesiredLanguage(HLERequestContext& ctx);
-    void ConvertApplicationLanguageToLanguageCode(HLERequestContext& ctx);
-};
-
-class IApplicationVersionInterface final : public ServiceFramework<IApplicationVersionInterface> {
-public:
-    explicit IApplicationVersionInterface(Core::System& system_);
-    ~IApplicationVersionInterface() override;
-};
-
-class IContentManagementInterface final : public ServiceFramework<IContentManagementInterface> {
-public:
-    explicit IContentManagementInterface(Core::System& system_);
-    ~IContentManagementInterface() override;
-
-private:
-    void GetTotalSpaceSize(HLERequestContext& ctx);
-    void GetFreeSpaceSize(HLERequestContext& ctx);
-};
-
-class IDocumentInterface final : public ServiceFramework<IDocumentInterface> {
-public:
-    explicit IDocumentInterface(Core::System& system_);
-    ~IDocumentInterface() override;
-
-private:
-    void ResolveApplicationContentPath(HLERequestContext& ctx);
-    void GetRunningApplicationProgramId(HLERequestContext& ctx);
-};
-
-class IDownloadTaskInterface final : public ServiceFramework<IDownloadTaskInterface> {
-public:
-    explicit IDownloadTaskInterface(Core::System& system_);
-    ~IDownloadTaskInterface() override;
-};
-
-class IECommerceInterface final : public ServiceFramework<IECommerceInterface> {
-public:
-    explicit IECommerceInterface(Core::System& system_);
-    ~IECommerceInterface() override;
-};
-
-class IFactoryResetInterface final : public ServiceFramework<IFactoryResetInterface> {
-public:
-    explicit IFactoryResetInterface(Core::System& system_);
-    ~IFactoryResetInterface() override;
-};
-
-class IReadOnlyApplicationRecordInterface final
-    : public ServiceFramework<IReadOnlyApplicationRecordInterface> {
-public:
-    explicit IReadOnlyApplicationRecordInterface(Core::System& system_);
-    ~IReadOnlyApplicationRecordInterface() override;
-
-private:
-    void HasApplicationRecord(HLERequestContext& ctx);
-    void IsDataCorruptedResult(HLERequestContext& ctx);
-};
-
-class IReadOnlyApplicationControlDataInterface final
-    : public ServiceFramework<IReadOnlyApplicationControlDataInterface> {
-public:
-    explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
-    ~IReadOnlyApplicationControlDataInterface() override;
-
-private:
-    void GetApplicationControlData(HLERequestContext& ctx);
-};
-
-class NS final : public ServiceFramework<NS> {
-public:
-    explicit NS(const char* name, Core::System& system_);
-    ~NS() override;
-
-    std::shared_ptr<IApplicationManagerInterface> GetApplicationManagerInterface() const;
-
-private:
-    template <typename T, typename... Args>
-    void PushInterface(HLERequestContext& ctx) {
-        LOG_DEBUG(Service_NS, "called");
-
-        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-        rb.Push(ResultSuccess);
-        rb.PushIpcInterface<T>(system);
-    }
-
-    void PushIApplicationManagerInterface(HLERequestContext& ctx) {
-        LOG_DEBUG(Service_NS, "called");
-
-        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-        rb.Push(ResultSuccess);
-        rb.PushIpcInterface<IApplicationManagerInterface>(system);
-    }
-
-    template <typename T, typename... Args>
-    std::shared_ptr<T> GetInterface(Args&&... args) const {
-        static_assert(std::is_base_of_v<SessionRequestHandler, T>,
-                      "Not a base of ServiceFrameworkBase");
-
-        return std::make_shared<T>(std::forward<Args>(args)...);
-    }
-};
+namespace Service::NS {
 
 void LoopProcess(Core::System& system);
 
-} // namespace NS
-} // namespace Service
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/errors.h b/src/core/hle/service/ns/ns_results.h
similarity index 100%
rename from src/core/hle/service/ns/errors.h
rename to src/core/hle/service/ns/ns_results.h
diff --git a/src/core/hle/service/ns/ns_types.h b/src/core/hle/service/ns/ns_types.h
new file mode 100644
index 000000000..38421b0f4
--- /dev/null
+++ b/src/core/hle/service/ns/ns_types.h
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "common/common_funcs.h"
+#include "common/uuid.h"
+#include "core/file_sys/romfs_factory.h"
+
+namespace Service::NS {
+
+enum class ApplicationRecordType : u8 {
+    Installing = 2,
+    Installed = 3,
+    GameCardNotInserted = 5,
+    Archived = 11,
+    GameCard = 16,
+};
+
+enum class ApplicationControlSource : u8 {
+    CacheOnly = 0,
+    Storage = 1,
+    StorageOnly = 2,
+};
+
+enum class BackgroundNetworkUpdateState : u8 {
+    None,
+    InProgress,
+    Ready,
+};
+
+struct ApplicationRecord {
+    u64 application_id;
+    ApplicationRecordType type;
+    u8 unknown;
+    INSERT_PADDING_BYTES_NOINIT(0x6);
+    u8 unknown2;
+    INSERT_PADDING_BYTES_NOINIT(0x7);
+};
+static_assert(sizeof(ApplicationRecord) == 0x18, "ApplicationRecord has incorrect size.");
+
+/// ApplicationView
+struct ApplicationView {
+    u64 application_id;           ///< ApplicationId.
+    u32 unk;                      ///< Unknown.
+    u32 flags;                    ///< Flags.
+    std::array<u8, 0x10> unk_x10; ///< Unknown.
+    u32 unk_x20;                  ///< Unknown.
+    u16 unk_x24;                  ///< Unknown.
+    std::array<u8, 0x2> unk_x26;  ///< Unknown.
+    std::array<u8, 0x8> unk_x28;  ///< Unknown.
+    std::array<u8, 0x10> unk_x30; ///< Unknown.
+    u32 unk_x40;                  ///< Unknown.
+    u8 unk_x44;                   ///< Unknown.
+    std::array<u8, 0xb> unk_x45;  ///< Unknown.
+};
+static_assert(sizeof(ApplicationView) == 0x50, "ApplicationView has incorrect size.");
+
+struct ApplicationRightsOnClient {
+    u64 application_id;
+    Common::UUID uid;
+    u8 flags;
+    u8 flags2;
+    INSERT_PADDING_BYTES_NOINIT(0x6);
+};
+static_assert(sizeof(ApplicationRightsOnClient) == 0x20,
+              "ApplicationRightsOnClient has incorrect size.");
+
+/// NsPromotionInfo
+struct PromotionInfo {
+    u64 start_timestamp; ///< POSIX timestamp for the promotion start.
+    u64 end_timestamp;   ///< POSIX timestamp for the promotion end.
+    s64 remaining_time;  ///< Remaining time until the promotion ends, in nanoseconds
+                         ///< ({end_timestamp - current_time} converted to nanoseconds).
+    INSERT_PADDING_BYTES_NOINIT(0x4);
+    u8 flags; ///< Flags. Bit0: whether the PromotionInfo is valid (including bit1). Bit1 clear:
+              ///< remaining_time is set.
+    INSERT_PADDING_BYTES_NOINIT(0x3);
+};
+static_assert(sizeof(PromotionInfo) == 0x20, "PromotionInfo has incorrect size.");
+
+/// NsApplicationViewWithPromotionInfo
+struct ApplicationViewWithPromotionInfo {
+    ApplicationView view;    ///< \ref NsApplicationView
+    PromotionInfo promotion; ///< \ref NsPromotionInfo
+};
+static_assert(sizeof(ApplicationViewWithPromotionInfo) == 0x70,
+              "ApplicationViewWithPromotionInfo has incorrect size.");
+
+struct ApplicationOccupiedSizeEntity {
+    FileSys::StorageId storage_id;
+    u64 app_size;
+    u64 patch_size;
+    u64 aoc_size;
+};
+static_assert(sizeof(ApplicationOccupiedSizeEntity) == 0x20,
+              "ApplicationOccupiedSizeEntity has incorrect size.");
+
+struct ApplicationOccupiedSize {
+    std::array<ApplicationOccupiedSizeEntity, 4> entities;
+};
+static_assert(sizeof(ApplicationOccupiedSize) == 0x80,
+              "ApplicationOccupiedSize has incorrect size.");
+
+struct ContentPath {
+    u8 file_system_proxy_type;
+    u64 program_id;
+};
+static_assert(sizeof(ContentPath) == 0x10, "ContentPath has incorrect size.");
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/pdm_qry.cpp b/src/core/hle/service/ns/pdm_qry.cpp
deleted file mode 100644
index ce0ee30e0..000000000
--- a/src/core/hle/service/ns/pdm_qry.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include <memory>
-
-#include "common/logging/log.h"
-#include "common/uuid.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "core/hle/service/ns/pdm_qry.h"
-#include "core/hle/service/service.h"
-
-namespace Service::NS {
-
-PDM_QRY::PDM_QRY(Core::System& system_) : ServiceFramework{system_, "pdm:qry"} {
-    // clang-format off
-        static const FunctionInfo functions[] = {
-            {0, nullptr, "QueryAppletEvent"},
-            {1, nullptr, "QueryPlayStatistics"},
-            {2, nullptr, "QueryPlayStatisticsByUserAccountId"},
-            {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
-            {4, nullptr, "QueryPlayStatisticsByApplicationId"},
-            {5, &PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
-            {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
-            {7, nullptr, "QueryLastPlayTimeV0"},
-            {8, nullptr, "QueryPlayEvent"},
-            {9, nullptr, "GetAvailablePlayEventRange"},
-            {10, nullptr, "QueryAccountEvent"},
-            {11, nullptr, "QueryAccountPlayEvent"},
-            {12, nullptr, "GetAvailableAccountPlayEventRange"},
-            {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
-            {14, nullptr, "QueryRecentlyPlayedApplication"},
-            {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
-            {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
-            {17, nullptr, "QueryLastPlayTime"},
-            {18, nullptr, "QueryApplicationPlayStatisticsForSystem"},
-            {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
-        };
-    // clang-format on
-
-    RegisterHandlers(functions);
-}
-
-PDM_QRY::~PDM_QRY() = default;
-
-void PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const auto unknown = rp.Pop<bool>();
-    rp.Pop<u8>(); // Padding
-    const auto application_id = rp.Pop<u64>();
-    const auto user_account_uid = rp.PopRaw<Common::UUID>();
-
-    // TODO(German77): Read statistics of the game
-    PlayStatistics statistics{
-        .application_id = application_id,
-        .total_launches = 1,
-    };
-
-    LOG_WARNING(Service_NS,
-                "(STUBBED) called. unknown={}. application_id=0x{:016X}, user_account_uid=0x{}",
-                unknown, application_id, user_account_uid.RawString());
-
-    IPC::ResponseBuilder rb{ctx, 12};
-    rb.Push(ResultSuccess);
-    rb.PushRaw(statistics);
-}
-
-} // namespace Service::NS
diff --git a/src/core/hle/service/ns/iplatform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp
similarity index 70%
rename from src/core/hle/service/ns/iplatform_service_manager.cpp
rename to src/core/hle/service/ns/platform_service_manager.cpp
index 46268be95..23cf05005 100644
--- a/src/core/hle/service/ns/iplatform_service_manager.cpp
+++ b/src/core/hle/service/ns/platform_service_manager.cpp
@@ -18,9 +18,9 @@
 #include "core/hle/kernel/k_shared_memory.h"
 #include "core/hle/kernel/kernel.h"
 #include "core/hle/kernel/physical_memory.h"
+#include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/filesystem/filesystem.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "core/hle/service/ns/iplatform_service_manager.h"
+#include "core/hle/service/ns/platform_service_manager.h"
 
 namespace Service::NS {
 
@@ -37,11 +37,6 @@ constexpr u32 EXPECTED_MAGIC{0x36f81a1e};  // What we expect the encrypted bfttf
 constexpr u64 SHARED_FONT_MEM_SIZE{0x1100000};
 constexpr FontRegion EMPTY_REGION{0, 0};
 
-enum class LoadState : u32 {
-    Loading = 0,
-    Done = 1,
-};
-
 static void DecryptSharedFont(const std::vector<u32>& input, Kernel::PhysicalMemory& output,
                               std::size_t& offset) {
     ASSERT_MSG(offset + (input.size() * sizeof(u32)) < SHARED_FONT_MEM_SIZE,
@@ -138,13 +133,13 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch
     : ServiceFramework{system_, service_name_}, impl{std::make_unique<Impl>()} {
     // clang-format off
     static const FunctionInfo functions[] = {
-        {0, &IPlatformServiceManager::RequestLoad, "RequestLoad"},
-        {1, &IPlatformServiceManager::GetLoadState, "GetLoadState"},
-        {2, &IPlatformServiceManager::GetSize, "GetSize"},
-        {3, &IPlatformServiceManager::GetSharedMemoryAddressOffset, "GetSharedMemoryAddressOffset"},
-        {4, &IPlatformServiceManager::GetSharedMemoryNativeHandle, "GetSharedMemoryNativeHandle"},
-        {5, &IPlatformServiceManager::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"},
-        {6, &IPlatformServiceManager::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriorityForSystem"},
+        {0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"},
+        {1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"},
+        {2, D<&IPlatformServiceManager::GetSize>, "GetSize"},
+        {3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"},
+        {4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+        {5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"},
+        {6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"},
         {100, nullptr, "RequestApplicationFunctionAuthorization"},
         {101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"},
         {102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"},
@@ -208,47 +203,33 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch
 
 IPlatformServiceManager::~IPlatformServiceManager() = default;
 
-void IPlatformServiceManager::RequestLoad(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const u32 shared_font_type{rp.Pop<u32>()};
+Result IPlatformServiceManager::RequestLoad(SharedFontType type) {
     // Games don't call this so all fonts should be loaded
-    LOG_DEBUG(Service_NS, "called, shared_font_type={}", shared_font_type);
-
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(ResultSuccess);
+    LOG_DEBUG(Service_NS, "called, shared_font_type={}", type);
+    R_SUCCEED();
 }
 
-void IPlatformServiceManager::GetLoadState(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const u32 font_id{rp.Pop<u32>()};
-    LOG_DEBUG(Service_NS, "called, font_id={}", font_id);
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u32>(static_cast<u32>(LoadState::Done));
+Result IPlatformServiceManager::GetLoadState(Out<LoadState> out_load_state, SharedFontType type) {
+    LOG_DEBUG(Service_NS, "called, shared_font_type={}", type);
+    *out_load_state = LoadState::Loaded;
+    R_SUCCEED();
 }
 
-void IPlatformServiceManager::GetSize(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const u32 font_id{rp.Pop<u32>()};
-    LOG_DEBUG(Service_NS, "called, font_id={}", font_id);
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u32>(impl->GetSharedFontRegion(font_id).size);
+Result IPlatformServiceManager::GetSize(Out<u32> out_size, SharedFontType type) {
+    LOG_DEBUG(Service_NS, "called, shared_font_type={}", type);
+    *out_size = impl->GetSharedFontRegion(static_cast<size_t>(type)).size;
+    R_SUCCEED();
 }
 
-void IPlatformServiceManager::GetSharedMemoryAddressOffset(HLERequestContext& ctx) {
-    IPC::RequestParser rp{ctx};
-    const u32 font_id{rp.Pop<u32>()};
-    LOG_DEBUG(Service_NS, "called, font_id={}", font_id);
-
-    IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
-    rb.Push<u32>(impl->GetSharedFontRegion(font_id).offset);
+Result IPlatformServiceManager::GetSharedMemoryAddressOffset(Out<u32> out_shared_memory_offset,
+                                                             SharedFontType type) {
+    LOG_DEBUG(Service_NS, "called, shared_font_type={}", type);
+    *out_shared_memory_offset = impl->GetSharedFontRegion(static_cast<size_t>(type)).offset;
+    R_SUCCEED();
 }
 
-void IPlatformServiceManager::GetSharedMemoryNativeHandle(HLERequestContext& ctx) {
+Result IPlatformServiceManager::GetSharedMemoryNativeHandle(
+    OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_native_handle) {
     // Map backing memory for the font data
     LOG_DEBUG(Service_NS, "called");
 
@@ -256,50 +237,37 @@ void IPlatformServiceManager::GetSharedMemoryNativeHandle(HLERequestContext& ctx
     std::memcpy(kernel.GetFontSharedMem().GetPointer(), impl->shared_font->data(),
                 impl->shared_font->size());
 
-    IPC::ResponseBuilder rb{ctx, 2, 1};
-    rb.Push(ResultSuccess);
-    rb.PushCopyObjects(&kernel.GetFontSharedMem());
+    // FIXME: this shouldn't belong to the kernel
+    *out_shared_memory_native_handle = &kernel.GetFontSharedMem();
+    R_SUCCEED();
 }
 
-void IPlatformServiceManager::GetSharedFontInOrderOfPriority(HLERequestContext& ctx) {
+Result IPlatformServiceManager::GetSharedFontInOrderOfPriority(
+    OutArray<u32, BufferAttr_HipcMapAlias> out_font_codes,
+    OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
+    OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes, Out<bool> out_fonts_are_loaded,
+    Out<u32> out_font_count, Set::LanguageCode language_code) {
+    LOG_DEBUG(Service_NS, "called, language_code={:#x}", language_code);
+
     // The maximum number of elements that can be returned is 6. Regardless of the available fonts
     // or buffer size.
-    constexpr std::size_t MaxElementCount = 6;
-    IPC::RequestParser rp{ctx};
-    const u64 language_code{rp.Pop<u64>()}; // TODO(ogniK): Find out what this is used for
-    const std::size_t font_codes_count =
-        std::min(MaxElementCount, ctx.GetWriteBufferNumElements<u32>(0));
-    const std::size_t font_offsets_count =
-        std::min(MaxElementCount, ctx.GetWriteBufferNumElements<u32>(1));
-    const std::size_t font_sizes_count =
-        std::min(MaxElementCount, ctx.GetWriteBufferNumElements<u32>(2));
-    LOG_DEBUG(Service_NS, "called, language_code={:X}", language_code);
-
-    IPC::ResponseBuilder rb{ctx, 4};
-    std::vector<u32> font_codes;
-    std::vector<u32> font_offsets;
-    std::vector<u32> font_sizes;
+    constexpr size_t MaxElementCount = 6;
 
     // TODO(ogniK): Have actual priority order
-    for (std::size_t i = 0; i < impl->shared_font_regions.size(); i++) {
-        font_codes.push_back(static_cast<u32>(i));
+    const auto max_size = std::min({MaxElementCount, out_font_codes.size(), out_font_offsets.size(),
+                                    out_font_sizes.size(), impl->shared_font_regions.size()});
+
+    for (size_t i = 0; i < max_size; i++) {
         auto region = impl->GetSharedFontRegion(i);
-        font_offsets.push_back(region.offset);
-        font_sizes.push_back(region.size);
+
+        out_font_codes[i] = static_cast<u32>(i);
+        out_font_offsets[i] = region.offset;
+        out_font_sizes[i] = region.size;
     }
 
-    // Resize buffers if game requests smaller size output
-    font_codes.resize(std::min(font_codes.size(), font_codes_count));
-    font_offsets.resize(std::min(font_offsets.size(), font_offsets_count));
-    font_sizes.resize(std::min(font_sizes.size(), font_sizes_count));
-
-    ctx.WriteBuffer(font_codes, 0);
-    ctx.WriteBuffer(font_offsets, 1);
-    ctx.WriteBuffer(font_sizes, 2);
-
-    rb.Push(ResultSuccess);
-    rb.Push<u8>(static_cast<u8>(LoadState::Done)); // Fonts Loaded
-    rb.Push<u32>(static_cast<u32>(font_codes.size()));
+    *out_fonts_are_loaded = true;
+    *out_font_count = static_cast<u32>(max_size);
+    R_SUCCEED();
 }
 
 } // namespace Service::NS
diff --git a/src/core/hle/service/ns/iplatform_service_manager.h b/src/core/hle/service/ns/platform_service_manager.h
similarity index 58%
rename from src/core/hle/service/ns/iplatform_service_manager.h
rename to src/core/hle/service/ns/platform_service_manager.h
index 03071e02b..b82c385a6 100644
--- a/src/core/hle/service/ns/iplatform_service_manager.h
+++ b/src/core/hle/service/ns/platform_service_manager.h
@@ -5,7 +5,9 @@
 
 #include <memory>
 #include <vector>
+#include "core/hle/service/cmif_types.h"
 #include "core/hle/service/service.h"
+#include "core/hle/service/set/settings_types.h"
 
 namespace Service {
 
@@ -23,6 +25,20 @@ enum class FontArchives : u64 {
     ChineseSimple = 0x0100000000000814,
 };
 
+enum class SharedFontType : u32 {
+    JapanUSEuropeStandard = 0,
+    ChineseSimplified = 1,
+    ExtendedChineseSimplified = 2,
+    ChineseTraditional = 3,
+    KoreanHangul = 4,
+    NintendoExtended = 5,
+};
+
+enum class LoadState : u32 {
+    Loading = 0,
+    Loaded = 1,
+};
+
 constexpr std::array<std::pair<FontArchives, const char*>, 7> SHARED_FONTS{
     std::make_pair(FontArchives::Standard, "nintendo_udsg-r_std_003.bfttf"),
     std::make_pair(FontArchives::ChineseSimple, "nintendo_udsg-r_org_zh-cn_003.bfttf"),
@@ -42,12 +58,17 @@ public:
     ~IPlatformServiceManager() override;
 
 private:
-    void RequestLoad(HLERequestContext& ctx);
-    void GetLoadState(HLERequestContext& ctx);
-    void GetSize(HLERequestContext& ctx);
-    void GetSharedMemoryAddressOffset(HLERequestContext& ctx);
-    void GetSharedMemoryNativeHandle(HLERequestContext& ctx);
-    void GetSharedFontInOrderOfPriority(HLERequestContext& ctx);
+    Result RequestLoad(SharedFontType type);
+    Result GetLoadState(Out<LoadState> out_load_state, SharedFontType type);
+    Result GetSize(Out<u32> out_size, SharedFontType type);
+    Result GetSharedMemoryAddressOffset(Out<u32> out_shared_memory_offset, SharedFontType type);
+    Result GetSharedMemoryNativeHandle(
+        OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_native_handle);
+    Result GetSharedFontInOrderOfPriority(OutArray<u32, BufferAttr_HipcMapAlias> out_font_codes,
+                                          OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
+                                          OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes,
+                                          Out<bool> out_fonts_are_loaded, Out<u32> out_font_count,
+                                          Set::LanguageCode language_code);
 
     struct Impl;
     std::unique_ptr<Impl> impl;
diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp
new file mode 100644
index 000000000..946b7fa23
--- /dev/null
+++ b/src/core/hle/service/ns/query_service.cpp
@@ -0,0 +1,57 @@
+// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/logging/log.h"
+#include "common/uuid.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/query_service.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "QueryAppletEvent"},
+        {1, nullptr, "QueryPlayStatistics"},
+        {2, nullptr, "QueryPlayStatisticsByUserAccountId"},
+        {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
+        {4, nullptr, "QueryPlayStatisticsByApplicationId"},
+        {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
+        {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
+        {7, nullptr, "QueryLastPlayTimeV0"},
+        {8, nullptr, "QueryPlayEvent"},
+        {9, nullptr, "GetAvailablePlayEventRange"},
+        {10, nullptr, "QueryAccountEvent"},
+        {11, nullptr, "QueryAccountPlayEvent"},
+        {12, nullptr, "GetAvailableAccountPlayEventRange"},
+        {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
+        {14, nullptr, "QueryRecentlyPlayedApplication"},
+        {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
+        {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
+        {17, nullptr, "QueryLastPlayTime"},
+        {18, nullptr, "QueryApplicationPlayStatisticsForSystem"},
+        {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IQueryService::~IQueryService() = default;
+
+Result IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId(
+    Out<PlayStatistics> out_play_statistics, bool unknown, Common::UUID account_id,
+    u64 application_id) {
+    // TODO(German77): Read statistics of the game
+    *out_play_statistics = {
+        .application_id = application_id,
+        .total_launches = 1,
+    };
+
+    LOG_WARNING(Service_NS, "(STUBBED) called. unknown={}. application_id={:016X}, account_id={}",
+                unknown, application_id, account_id.FormattedString());
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/pdm_qry.h b/src/core/hle/service/ns/query_service.h
similarity index 61%
rename from src/core/hle/service/ns/pdm_qry.h
rename to src/core/hle/service/ns/query_service.h
index c98e01660..6cdbfa277 100644
--- a/src/core/hle/service/ns/pdm_qry.h
+++ b/src/core/hle/service/ns/query_service.h
@@ -3,6 +3,8 @@
 
 #pragma once
 
+#include "common/uuid.h"
+#include "core/hle/service/cmif_types.h"
 #include "core/hle/service/service.h"
 
 namespace Service::NS {
@@ -20,13 +22,15 @@ struct PlayStatistics {
 };
 static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size");
 
-class PDM_QRY final : public ServiceFramework<PDM_QRY> {
+class IQueryService final : public ServiceFramework<IQueryService> {
 public:
-    explicit PDM_QRY(Core::System& system_);
-    ~PDM_QRY() override;
+    explicit IQueryService(Core::System& system_);
+    ~IQueryService() override;
 
 private:
-    void QueryPlayStatisticsByApplicationIdAndUserAccountId(HLERequestContext& ctx);
+    Result QueryPlayStatisticsByApplicationIdAndUserAccountId(
+        Out<PlayStatistics> out_play_statistics, bool unknown, Common::UUID account_id,
+        u64 application_id);
 };
 
 } // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
new file mode 100644
index 000000000..9b2ca94a4
--- /dev/null
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
@@ -0,0 +1,122 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "common/settings.h"
+#include "core/file_sys/control_metadata.h"
+#include "core/file_sys/patch_manager.h"
+#include "core/file_sys/vfs/vfs.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/language.h"
+#include "core/hle/service/ns/ns_results.h"
+#include "core/hle/service/ns/read_only_application_control_data_interface.h"
+#include "core/hle/service/set/settings_server.h"
+
+namespace Service::NS {
+
+IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface(
+    Core::System& system_)
+    : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"},
+        {1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+        {2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+        {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+        {4, nullptr, "SelectApplicationDesiredLanguage"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default;
+
+Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
+    OutBuffer<BufferAttr_HipcMapAlias> out_buffer, Out<u32> out_actual_size,
+    ApplicationControlSource application_control_source, u64 application_id) {
+    LOG_INFO(Service_NS, "called with control_source={}, application_id={:016X}",
+             application_control_source, application_id);
+
+    const FileSys::PatchManager pm{application_id, system.GetFileSystemController(),
+                                   system.GetContentProvider()};
+    const auto control = pm.GetControlMetadata();
+    const auto size = out_buffer.size();
+
+    const auto icon_size = control.second ? control.second->GetSize() : 0;
+    const auto total_size = sizeof(FileSys::RawNACP) + icon_size;
+
+    if (size < total_size) {
+        LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min=0x4000)",
+                  size);
+        R_THROW(ResultUnknown);
+    }
+
+    if (control.first != nullptr) {
+        const auto bytes = control.first->GetRawBytes();
+        std::memcpy(out_buffer.data(), bytes.data(), bytes.size());
+    } else {
+        LOG_WARNING(Service_NS, "missing NACP data for application_id={:016X}, defaulting to zero",
+                    application_id);
+        std::memset(out_buffer.data(), 0, sizeof(FileSys::RawNACP));
+    }
+
+    if (control.second != nullptr) {
+        control.second->Read(out_buffer.data() + sizeof(FileSys::RawNACP), icon_size);
+    } else {
+        LOG_WARNING(Service_NS, "missing icon data for application_id={:016X}", application_id);
+    }
+
+    *out_actual_size = static_cast<u32>(total_size);
+    R_SUCCEED();
+}
+
+Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
+    Out<ApplicationLanguage> out_desired_language, u32 supported_languages) {
+    LOG_INFO(Service_NS, "called with supported_languages={:08X}", supported_languages);
+
+    // Get language code from settings
+    const auto language_code =
+        Set::GetLanguageCodeFromIndex(static_cast<s32>(Settings::values.language_index.GetValue()));
+
+    // Convert to application language, get priority list
+    const auto application_language = ConvertToApplicationLanguage(language_code);
+    if (application_language == std::nullopt) {
+        LOG_ERROR(Service_NS, "Could not convert application language! language_code={}",
+                  language_code);
+        R_THROW(Service::NS::ResultApplicationLanguageNotFound);
+    }
+    const auto priority_list = GetApplicationLanguagePriorityList(*application_language);
+    if (!priority_list) {
+        LOG_ERROR(Service_NS,
+                  "Could not find application language priorities! application_language={}",
+                  *application_language);
+        R_THROW(Service::NS::ResultApplicationLanguageNotFound);
+    }
+
+    // Try to find a valid language.
+    for (const auto lang : *priority_list) {
+        const auto supported_flag = GetSupportedLanguageFlag(lang);
+        if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
+            *out_desired_language = lang;
+            R_SUCCEED();
+        }
+    }
+
+    LOG_ERROR(Service_NS, "Could not find a valid language! supported_languages={:08X}",
+              supported_languages);
+    R_THROW(Service::NS::ResultApplicationLanguageNotFound);
+}
+
+Result IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode(
+    Out<u64> out_language_code, ApplicationLanguage application_language) {
+    const auto language_code = ConvertToLanguageCode(application_language);
+    if (language_code == std::nullopt) {
+        LOG_ERROR(Service_NS, "Language not found! application_language={}", application_language);
+        R_THROW(Service::NS::ResultApplicationLanguageNotFound);
+    }
+
+    *out_language_code = static_cast<u64>(*language_code);
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h
new file mode 100644
index 000000000..ac099435a
--- /dev/null
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/ns/language.h"
+#include "core/hle/service/ns/ns_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IReadOnlyApplicationControlDataInterface final
+    : public ServiceFramework<IReadOnlyApplicationControlDataInterface> {
+public:
+    explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
+    ~IReadOnlyApplicationControlDataInterface() override;
+
+public:
+    Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
+                                     Out<u32> out_actual_size,
+                                     ApplicationControlSource application_control_source,
+                                     u64 application_id);
+    Result GetApplicationDesiredLanguage(Out<ApplicationLanguage> out_desired_language,
+                                         u32 supported_languages);
+    Result ConvertApplicationLanguageToLanguageCode(Out<u64> out_language_code,
+                                                    ApplicationLanguage application_language);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp
new file mode 100644
index 000000000..816a1e1dc
--- /dev/null
+++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp
@@ -0,0 +1,38 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/read_only_application_record_interface.h"
+
+namespace Service::NS {
+
+IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_)
+    : ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} {
+    static const FunctionInfo functions[] = {
+        {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
+        {1, nullptr, "NotifyApplicationFailure"},
+        {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>,
+         "IsDataCorruptedResult"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default;
+
+Result IReadOnlyApplicationRecordInterface::HasApplicationRecord(
+    Out<bool> out_has_application_record, u64 program_id) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, program_id={:016X}", program_id);
+    *out_has_application_record = true;
+    R_SUCCEED();
+}
+
+Result IReadOnlyApplicationRecordInterface::IsDataCorruptedResult(
+    Out<bool> out_is_data_corrupted_result, Result result) {
+    LOG_WARNING(Service_NS, "(STUBBED) called, result={:#x}", result.GetInnerValue());
+    *out_is_data_corrupted_result = false;
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.h b/src/core/hle/service/ns/read_only_application_record_interface.h
new file mode 100644
index 000000000..d06e8f5e6
--- /dev/null
+++ b/src/core/hle/service/ns/read_only_application_record_interface.h
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IReadOnlyApplicationRecordInterface final
+    : public ServiceFramework<IReadOnlyApplicationRecordInterface> {
+public:
+    explicit IReadOnlyApplicationRecordInterface(Core::System& system_);
+    ~IReadOnlyApplicationRecordInterface() override;
+
+private:
+    Result HasApplicationRecord(Out<bool> out_has_application_record, u64 program_id);
+    Result IsDataCorruptedResult(Out<bool> out_is_data_corrupted_result, Result result);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/service_getter_interface.cpp b/src/core/hle/service/ns/service_getter_interface.cpp
new file mode 100644
index 000000000..1a3dd7166
--- /dev/null
+++ b/src/core/hle/service/ns/service_getter_interface.cpp
@@ -0,0 +1,120 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/account_proxy_interface.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/application_version_interface.h"
+#include "core/hle/service/ns/content_management_interface.h"
+#include "core/hle/service/ns/document_interface.h"
+#include "core/hle/service/ns/download_task_interface.h"
+#include "core/hle/service/ns/dynamic_rights_interface.h"
+#include "core/hle/service/ns/ecommerce_interface.h"
+#include "core/hle/service/ns/factory_reset_interface.h"
+#include "core/hle/service/ns/read_only_application_control_data_interface.h"
+#include "core/hle/service/ns/read_only_application_record_interface.h"
+#include "core/hle/service/ns/service_getter_interface.h"
+
+namespace Service::NS {
+
+IServiceGetterInterface::IServiceGetterInterface(Core::System& system_, const char* name)
+    : ServiceFramework{system_, name} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"},
+        {7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
+        {7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
+        {7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"},
+        {7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"},
+        {7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"},
+        {7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"},
+        {7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"},
+        {7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"},
+        {7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"},
+        {7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IServiceGetterInterface::~IServiceGetterInterface() = default;
+
+Result IServiceGetterInterface::GetDynamicRightsInterface(
+    Out<SharedPointer<IDynamicRightsInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IDynamicRightsInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface(
+    Out<SharedPointer<IReadOnlyApplicationControlDataInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IReadOnlyApplicationControlDataInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetReadOnlyApplicationRecordInterface(
+    Out<SharedPointer<IReadOnlyApplicationRecordInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IReadOnlyApplicationRecordInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetECommerceInterface(
+    Out<SharedPointer<IECommerceInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IECommerceInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetApplicationVersionInterface(
+    Out<SharedPointer<IApplicationVersionInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IApplicationVersionInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetFactoryResetInterface(
+    Out<SharedPointer<IFactoryResetInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IFactoryResetInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetAccountProxyInterface(
+    Out<SharedPointer<IAccountProxyInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IAccountProxyInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetApplicationManagerInterface(
+    Out<SharedPointer<IApplicationManagerInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IApplicationManagerInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetDownloadTaskInterface(
+    Out<SharedPointer<IDownloadTaskInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IDownloadTaskInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetContentManagementInterface(
+    Out<SharedPointer<IContentManagementInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IContentManagementInterface>(system);
+    R_SUCCEED();
+}
+
+Result IServiceGetterInterface::GetDocumentInterface(
+    Out<SharedPointer<IDocumentInterface>> out_interface) {
+    LOG_DEBUG(Service_NS, "called");
+    *out_interface = std::make_shared<IDocumentInterface>(system);
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/service_getter_interface.h b/src/core/hle/service/ns/service_getter_interface.h
new file mode 100644
index 000000000..bbc18d444
--- /dev/null
+++ b/src/core/hle/service/ns/service_getter_interface.h
@@ -0,0 +1,47 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IDynamicRightsInterface;
+class IReadOnlyApplicationControlDataInterface;
+class IReadOnlyApplicationRecordInterface;
+class IECommerceInterface;
+class IApplicationVersionInterface;
+class IFactoryResetInterface;
+class IAccountProxyInterface;
+class IApplicationManagerInterface;
+class IDownloadTaskInterface;
+class IContentManagementInterface;
+class IDocumentInterface;
+
+class IServiceGetterInterface : public ServiceFramework<IServiceGetterInterface> {
+public:
+    explicit IServiceGetterInterface(Core::System& system_, const char* name);
+    ~IServiceGetterInterface() override;
+
+public:
+    Result GetDynamicRightsInterface(Out<SharedPointer<IDynamicRightsInterface>> out_interface);
+    Result GetReadOnlyApplicationControlDataInterface(
+        Out<SharedPointer<IReadOnlyApplicationControlDataInterface>> out_interface);
+    Result GetReadOnlyApplicationRecordInterface(
+        Out<SharedPointer<IReadOnlyApplicationRecordInterface>> out_interface);
+    Result GetECommerceInterface(Out<SharedPointer<IECommerceInterface>> out_interface);
+    Result GetApplicationVersionInterface(
+        Out<SharedPointer<IApplicationVersionInterface>> out_interface);
+    Result GetFactoryResetInterface(Out<SharedPointer<IFactoryResetInterface>> out_interface);
+    Result GetAccountProxyInterface(Out<SharedPointer<IAccountProxyInterface>> out_interface);
+    Result GetApplicationManagerInterface(
+        Out<SharedPointer<IApplicationManagerInterface>> out_interface);
+    Result GetDownloadTaskInterface(Out<SharedPointer<IDownloadTaskInterface>> out_interface);
+    Result GetContentManagementInterface(
+        Out<SharedPointer<IContentManagementInterface>> out_interface);
+    Result GetDocumentInterface(Out<SharedPointer<IDocumentInterface>> out_interface);
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp
new file mode 100644
index 000000000..f5f5cfd90
--- /dev/null
+++ b/src/core/hle/service/ns/system_update_control.cpp
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/system_update_control.h"
+
+namespace Service::NS {
+
+ISystemUpdateControl::ISystemUpdateControl(Core::System& system_)
+    : ServiceFramework{system_, "ISystemUpdateControl"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, nullptr, "HasDownloaded"},
+        {1, nullptr, "RequestCheckLatestUpdate"},
+        {2, nullptr, "RequestDownloadLatestUpdate"},
+        {3, nullptr, "GetDownloadProgress"},
+        {4, nullptr, "ApplyDownloadedUpdate"},
+        {5, nullptr, "RequestPrepareCardUpdate"},
+        {6, nullptr, "GetPrepareCardUpdateProgress"},
+        {7, nullptr, "HasPreparedCardUpdate"},
+        {8, nullptr, "ApplyCardUpdate"},
+        {9, nullptr, "GetDownloadedEulaDataSize"},
+        {10, nullptr, "GetDownloadedEulaData"},
+        {11, nullptr, "SetupCardUpdate"},
+        {12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
+        {13, nullptr, "GetPreparedCardUpdateEulaData"},
+        {14, nullptr, "SetupCardUpdateViaSystemUpdater"},
+        {15, nullptr, "HasReceived"},
+        {16, nullptr, "RequestReceiveSystemUpdate"},
+        {17, nullptr, "GetReceiveProgress"},
+        {18, nullptr, "ApplyReceivedUpdate"},
+        {19, nullptr, "GetReceivedEulaDataSize"},
+        {20, nullptr, "GetReceivedEulaData"},
+        {21, nullptr, "SetupToReceiveSystemUpdate"},
+        {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+ISystemUpdateControl::~ISystemUpdateControl() = default;
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h
new file mode 100644
index 000000000..a30a09000
--- /dev/null
+++ b/src/core/hle/service/ns/system_update_control.h
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class ISystemUpdateControl final : public ServiceFramework<ISystemUpdateControl> {
+public:
+    explicit ISystemUpdateControl(Core::System& system_);
+    ~ISystemUpdateControl() override;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_interface.cpp b/src/core/hle/service/ns/system_update_interface.cpp
new file mode 100644
index 000000000..7e22ca3db
--- /dev/null
+++ b/src/core/hle/service/ns/system_update_interface.cpp
@@ -0,0 +1,61 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/system_update_control.h"
+#include "core/hle/service/ns/system_update_interface.h"
+
+namespace Service::NS {
+
+ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_)
+    : ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"},
+      update_notification_event{service_context} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
+        {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
+        {2, nullptr, "NotifyExFatDriverRequired"},
+        {3, nullptr, "ClearExFatDriverStatusForDebug"},
+        {4, nullptr, "RequestBackgroundNetworkUpdate"},
+        {5, nullptr, "NotifyBackgroundNetworkUpdate"},
+        {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
+        {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
+        {10, nullptr, "NotifySystemUpdateForContentDelivery"},
+        {11, nullptr, "PrepareShutdown"},
+        {12, nullptr, "Unknown12"},
+        {13, nullptr, "Unknown13"},
+        {14, nullptr, "Unknown14"},
+        {15, nullptr, "Unknown15"},
+        {16, nullptr, "DestroySystemUpdateTask"},
+        {17, nullptr, "RequestSendSystemUpdate"},
+        {18, nullptr, "GetSendSystemUpdateProgress"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+ISystemUpdateInterface::~ISystemUpdateInterface() = default;
+
+Result ISystemUpdateInterface::GetBackgroundNetworkUpdateState(
+    Out<BackgroundNetworkUpdateState> out_background_network_update_state) {
+    LOG_WARNING(Service_AM, "(STUBBED) called");
+    *out_background_network_update_state = BackgroundNetworkUpdateState::None;
+    R_SUCCEED();
+}
+
+Result ISystemUpdateInterface::OpenSystemUpdateControl(
+    Out<SharedPointer<ISystemUpdateControl>> out_system_update_control) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_system_update_control = std::make_shared<ISystemUpdateControl>(system);
+    R_SUCCEED();
+}
+
+Result ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery(
+    OutCopyHandle<Kernel::KReadableEvent> out_event) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_event = update_notification_event.GetHandle();
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_interface.h b/src/core/hle/service/ns/system_update_interface.h
new file mode 100644
index 000000000..36a2880ec
--- /dev/null
+++ b/src/core/hle/service/ns/system_update_interface.h
@@ -0,0 +1,38 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/ns/ns_types.h"
+#include "core/hle/service/os/event.h"
+#include "core/hle/service/service.h"
+
+namespace Kernel {
+class KReadableEvent;
+}
+
+namespace Service::NS {
+
+class ISystemUpdateControl;
+
+class ISystemUpdateInterface final : public ServiceFramework<ISystemUpdateInterface> {
+public:
+    explicit ISystemUpdateInterface(Core::System& system_);
+    ~ISystemUpdateInterface() override;
+
+private:
+    Result GetBackgroundNetworkUpdateState(
+        Out<BackgroundNetworkUpdateState> out_background_network_update_state);
+    Result OpenSystemUpdateControl(
+        Out<SharedPointer<ISystemUpdateControl>> out_system_update_control);
+    Result GetSystemUpdateNotificationEventForContentDelivery(
+        OutCopyHandle<Kernel::KReadableEvent> out_event);
+
+private:
+    KernelHelpers::ServiceContext service_context;
+    Event update_notification_event;
+};
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/vulnerability_manager_interface.cpp b/src/core/hle/service/ns/vulnerability_manager_interface.cpp
new file mode 100644
index 000000000..69c21fb89
--- /dev/null
+++ b/src/core/hle/service/ns/vulnerability_manager_interface.cpp
@@ -0,0 +1,31 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ns/vulnerability_manager_interface.h"
+
+namespace Service::NS {
+
+IVulnerabilityManagerInterface::IVulnerabilityManagerInterface(Core::System& system_)
+    : ServiceFramework{system_, "ns:vm"} {
+    // clang-format off
+    static const FunctionInfo functions[] = {
+        {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
+        {1201, nullptr, "UpdateSafeSystemVersionForDebug"},
+        {1202, nullptr, "GetSafeSystemVersion"},
+    };
+    // clang-format on
+
+    RegisterHandlers(functions);
+}
+
+IVulnerabilityManagerInterface::~IVulnerabilityManagerInterface() = default;
+
+Result IVulnerabilityManagerInterface::NeedsUpdateVulnerability(
+    Out<bool> out_needs_update_vulnerability) {
+    LOG_WARNING(Service_NS, "(STUBBED) called");
+    *out_needs_update_vulnerability = false;
+    R_SUCCEED();
+}
+
+} // namespace Service::NS
diff --git a/src/core/hle/service/ns/vulnerability_manager_interface.h b/src/core/hle/service/ns/vulnerability_manager_interface.h
new file mode 100644
index 000000000..c689cf7ec
--- /dev/null
+++ b/src/core/hle/service/ns/vulnerability_manager_interface.h
@@ -0,0 +1,21 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/service.h"
+
+namespace Service::NS {
+
+class IVulnerabilityManagerInterface final
+    : public ServiceFramework<IVulnerabilityManagerInterface> {
+public:
+    explicit IVulnerabilityManagerInterface(Core::System& system_);
+    ~IVulnerabilityManagerInterface() override;
+
+private:
+    Result NeedsUpdateVulnerability(Out<bool> out_needs_update_vulnerability);
+};
+
+} // namespace Service::NS