diff --git a/src/core/hle/service/audio/audctl.cpp b/src/core/hle/service/audio/audctl.cpp
index 66dd64fd1a..3101cf447c 100644
--- a/src/core/hle/service/audio/audctl.cpp
+++ b/src/core/hle/service/audio/audctl.cpp
@@ -4,6 +4,8 @@
 #include "common/logging/log.h"
 #include "core/hle/service/audio/audctl.h"
 #include "core/hle/service/ipc_helpers.h"
+#include "core/hle/service/set/system_settings_server.h"
+#include "core/hle/service/sm/sm.h"
 
 namespace Service::Audio {
 
@@ -19,15 +21,15 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
         {6, nullptr, "IsTargetConnected"},
         {7, nullptr, "SetDefaultTarget"},
         {8, nullptr, "GetDefaultTarget"},
-        {9, nullptr, "GetAudioOutputMode"},
-        {10, nullptr, "SetAudioOutputMode"},
+        {9, &AudCtl::GetAudioOutputMode, "GetAudioOutputMode"},
+        {10, &AudCtl::SetAudioOutputMode, "SetAudioOutputMode"},
         {11, nullptr, "SetForceMutePolicy"},
         {12, &AudCtl::GetForceMutePolicy, "GetForceMutePolicy"},
         {13, &AudCtl::GetOutputModeSetting, "GetOutputModeSetting"},
-        {14, nullptr, "SetOutputModeSetting"},
+        {14, &AudCtl::SetOutputModeSetting, "SetOutputModeSetting"},
         {15, nullptr, "SetOutputTarget"},
         {16, nullptr, "SetInputTargetForceEnabled"},
-        {17, nullptr, "SetHeadphoneOutputLevelMode"},
+        {17, &AudCtl::SetHeadphoneOutputLevelMode, "SetHeadphoneOutputLevelMode"},
         {18, &AudCtl::GetHeadphoneOutputLevelMode, "GetHeadphoneOutputLevelMode"},
         {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
         {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
@@ -40,7 +42,7 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
         {27, nullptr, "SetVolumeMappingTableForDev"},
         {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
         {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
-        {30, nullptr, "SetSpeakerAutoMuteEnabled"},
+        {30, &AudCtl::SetSpeakerAutoMuteEnabled, "SetSpeakerAutoMuteEnabled"},
         {31, &AudCtl::IsSpeakerAutoMuteEnabled, "IsSpeakerAutoMuteEnabled"},
         {32, nullptr, "GetActiveOutputTarget"},
         {33, nullptr, "GetTargetDeviceInfo"},
@@ -68,6 +70,9 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
     // clang-format on
 
     RegisterHandlers(functions);
+
+    m_set_sys =
+        system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
 }
 
 AudCtl::~AudCtl() = default;
@@ -96,6 +101,33 @@ void AudCtl::GetTargetVolumeMax(HLERequestContext& ctx) {
     rb.Push(target_max_volume);
 }
 
+void AudCtl::GetAudioOutputMode(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
+
+    Set::AudioOutputMode output_mode{};
+    const auto result = m_set_sys->GetAudioOutputMode(output_mode, target);
+
+    LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
+
+    IPC::ResponseBuilder rb{ctx, 3};
+    rb.Push(result);
+    rb.PushEnum(output_mode);
+}
+
+void AudCtl::SetAudioOutputMode(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
+    const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()};
+
+    const auto result = m_set_sys->SetAudioOutputMode(target, output_mode);
+
+    LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(result);
+}
+
 void AudCtl::GetForceMutePolicy(HLERequestContext& ctx) {
     LOG_WARNING(Audio, "(STUBBED) called");
 
@@ -106,13 +138,31 @@ void AudCtl::GetForceMutePolicy(HLERequestContext& ctx) {
 
 void AudCtl::GetOutputModeSetting(HLERequestContext& ctx) {
     IPC::RequestParser rp{ctx};
-    const auto value = rp.Pop<u32>();
+    const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
 
-    LOG_WARNING(Audio, "(STUBBED) called, value={}", value);
+    LOG_WARNING(Audio, "(STUBBED) called, target={}", target);
 
     IPC::ResponseBuilder rb{ctx, 3};
     rb.Push(ResultSuccess);
-    rb.PushEnum(AudioOutputMode::PcmAuto);
+    rb.PushEnum(Set::AudioOutputMode::ch_7_1);
+}
+
+void AudCtl::SetOutputModeSetting(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()};
+    const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()};
+
+    LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
+void AudCtl::SetHeadphoneOutputLevelMode(HLERequestContext& ctx) {
+    LOG_WARNING(Audio, "(STUBBED) called");
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
 }
 
 void AudCtl::GetHeadphoneOutputLevelMode(HLERequestContext& ctx) {
@@ -123,14 +173,28 @@ void AudCtl::GetHeadphoneOutputLevelMode(HLERequestContext& ctx) {
     rb.PushEnum(HeadphoneOutputLevelMode::Normal);
 }
 
+void AudCtl::SetSpeakerAutoMuteEnabled(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto is_speaker_auto_mute_enabled{rp.Pop<bool>()};
+
+    LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}",
+                is_speaker_auto_mute_enabled);
+
+    const auto result = m_set_sys->SetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(result);
+}
+
 void AudCtl::IsSpeakerAutoMuteEnabled(HLERequestContext& ctx) {
-    const bool is_speaker_auto_mute_enabled = false;
+    bool is_speaker_auto_mute_enabled{};
+    const auto result = m_set_sys->GetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled);
 
     LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}",
                 is_speaker_auto_mute_enabled);
 
     IPC::ResponseBuilder rb{ctx, 3};
-    rb.Push(ResultSuccess);
+    rb.Push(result);
     rb.Push<u8>(is_speaker_auto_mute_enabled);
 }
 
diff --git a/src/core/hle/service/audio/audctl.h b/src/core/hle/service/audio/audctl.h
index d57abb3836..4c90ead70e 100644
--- a/src/core/hle/service/audio/audctl.h
+++ b/src/core/hle/service/audio/audctl.h
@@ -9,6 +9,10 @@ namespace Core {
 class System;
 }
 
+namespace Service::Set {
+class ISystemSettingsServer;
+}
+
 namespace Service::Audio {
 
 class AudCtl final : public ServiceFramework<AudCtl> {
@@ -17,14 +21,6 @@ public:
     ~AudCtl() override;
 
 private:
-    enum class AudioOutputMode {
-        Invalid,
-        Pcm1ch,
-        Pcm2ch,
-        Pcm6ch,
-        PcmAuto,
-    };
-
     enum class ForceMutePolicy {
         Disable,
         SpeakerMuteOnHeadphoneUnplugged,
@@ -37,10 +33,18 @@ private:
 
     void GetTargetVolumeMin(HLERequestContext& ctx);
     void GetTargetVolumeMax(HLERequestContext& ctx);
+    void GetAudioOutputMode(HLERequestContext& ctx);
+    void SetAudioOutputMode(HLERequestContext& ctx);
     void GetForceMutePolicy(HLERequestContext& ctx);
     void GetOutputModeSetting(HLERequestContext& ctx);
+    void SetOutputModeSetting(HLERequestContext& ctx);
+    void SetHeadphoneOutputLevelMode(HLERequestContext& ctx);
     void GetHeadphoneOutputLevelMode(HLERequestContext& ctx);
+    void SetSpeakerAutoMuteEnabled(HLERequestContext& ctx);
     void IsSpeakerAutoMuteEnabled(HLERequestContext& ctx);
+    void AcquireTargetNotification(HLERequestContext& ctx);
+
+    std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
 };
 
 } // namespace Service::Audio
diff --git a/src/core/hle/service/set/setting_formats/system_settings.cpp b/src/core/hle/service/set/setting_formats/system_settings.cpp
index 88a305f03d..16ded43bfa 100644
--- a/src/core/hle/service/set/setting_formats/system_settings.cpp
+++ b/src/core/hle/service/set/setting_formats/system_settings.cpp
@@ -1,6 +1,7 @@
 // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
+#include "common/settings.h"
 #include "core/hle/service/set/setting_formats/system_settings.h"
 
 namespace Service::Set {
@@ -52,6 +53,17 @@ SystemSettings DefaultSystemSettings() {
     settings.chinese_traditional_input_method = ChineseTraditionalInputMethod::Unknown0;
     settings.vibration_master_volume = 1.0f;
 
+    const auto language_code =
+        available_language_codes[static_cast<s32>(::Settings::values.language_index.GetValue())];
+    const auto key_code =
+        std::find_if(language_to_layout.cbegin(), language_to_layout.cend(),
+                     [=](const auto& element) { return element.first == language_code; });
+
+    settings.keyboard_layout = KeyboardLayout::EnglishUs;
+    if (key_code != language_to_layout.end()) {
+        settings.keyboard_layout = key_code->second;
+    }
+
     return settings;
 }
 
diff --git a/src/core/hle/service/set/setting_formats/system_settings.h b/src/core/hle/service/set/setting_formats/system_settings.h
index af5929fa9b..ebc373da51 100644
--- a/src/core/hle/service/set/setting_formats/system_settings.h
+++ b/src/core/hle/service/set/setting_formats/system_settings.h
@@ -213,10 +213,9 @@ struct SystemSettings {
     // nn::settings::system::AudioVolume
     std::array<u8, 0x8> audio_volume_type0;
     std::array<u8, 0x8> audio_volume_type1;
-    // nn::settings::system::AudioOutputMode
-    s32 audio_output_mode_type0;
-    s32 audio_output_mode_type1;
-    s32 audio_output_mode_type2;
+    AudioOutputMode audio_output_mode_hdmi;
+    AudioOutputMode audio_output_mode_speaker;
+    AudioOutputMode audio_output_mode_headphone;
     bool force_mute_on_headphone_removed;
     INSERT_PADDING_BYTES(0x3);
     s32 headphone_volume_warning_count;
@@ -224,9 +223,8 @@ struct SystemSettings {
     INSERT_PADDING_BYTES(0x3);
     // nn::settings::system::AudioVolume
     std::array<u8, 0x8> audio_volume_type2;
-    // nn::settings::system::AudioOutputMode
-    s32 audio_output_mode_type3;
-    s32 audio_output_mode_type4;
+    AudioOutputMode audio_output_mode_type3;
+    AudioOutputMode audio_output_mode_type4;
     bool hearing_protection_safeguard_flag;
     INSERT_PADDING_BYTES(0x3);
     INSERT_PADDING_BYTES(0x4); // Reserved
diff --git a/src/core/hle/service/set/settings_types.h b/src/core/hle/service/set/settings_types.h
index 968425319c..ceb85b82ad 100644
--- a/src/core/hle/service/set/settings_types.h
+++ b/src/core/hle/service/set/settings_types.h
@@ -23,9 +23,12 @@ enum class AudioOutputMode : u32 {
 
 /// This is nn::settings::system::AudioOutputModeTarget
 enum class AudioOutputModeTarget : u32 {
+    None,
     Hdmi,
     Speaker,
     Headphone,
+    Type3,
+    Type4,
 };
 
 /// This is nn::settings::system::AudioVolumeTarget
@@ -367,6 +370,12 @@ struct AccountNotificationSettings {
 static_assert(sizeof(AccountNotificationSettings) == 0x18,
               "AccountNotificationSettings is an invalid size");
 
+/// This is nn::settings::factory::BatteryLot
+struct BatteryLot {
+    std::array<char, 0x18> lot_number;
+};
+static_assert(sizeof(BatteryLot) == 0x18, "BatteryLot is an invalid size");
+
 /// This is nn::settings::system::EulaVersion
 struct EulaVersion {
     u32 version;
@@ -436,6 +445,12 @@ struct NotificationSettings {
 };
 static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size");
 
+/// This is nn::settings::factory::SerialNumber
+struct SerialNumber {
+    std::array<char, 0x18> serial_number;
+};
+static_assert(sizeof(SerialNumber) == 0x18, "SerialNumber is an invalid size");
+
 /// This is nn::settings::system::SleepSettings
 struct SleepSettings {
     SleepFlag flags;
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index b80655d2fb..100cb2db45 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -25,7 +25,7 @@
 namespace Service::Set {
 
 namespace {
-constexpr u32 SETTINGS_VERSION{1u};
+constexpr u32 SETTINGS_VERSION{2u};
 constexpr auto SETTINGS_MAGIC = Common::MakeMagic('y', 'u', 'z', 'u', '_', 's', 'e', 't');
 struct SettingsHeader {
     u64 magic;
@@ -131,10 +131,10 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {40, &ISystemSettingsServer::SetTvSettings, "SetTvSettings"},
         {41, nullptr, "GetEdid"},
         {42, nullptr, "SetEdid"},
-        {43, nullptr, "GetAudioOutputMode"},
-        {44, nullptr, "SetAudioOutputMode"},
-        {45, &ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved, "IsForceMuteOnHeadphoneRemoved"},
-        {46, &ISystemSettingsServer::SetForceMuteOnHeadphoneRemoved, "SetForceMuteOnHeadphoneRemoved"},
+        {43, &ISystemSettingsServer::GetAudioOutputMode, "GetAudioOutputMode"},
+        {44, &ISystemSettingsServer::SetAudioOutputMode, "SetAudioOutputMode"},
+        {45, &ISystemSettingsServer::GetSpeakerAutoMuteFlag , "GetSpeakerAutoMuteFlag"},
+        {46, &ISystemSettingsServer::SetSpeakerAutoMuteFlag , "SetSpeakerAutoMuteFlag"},
         {47, &ISystemSettingsServer::GetQuestFlag, "GetQuestFlag"},
         {48, &ISystemSettingsServer::SetQuestFlag, "SetQuestFlag"},
         {49, nullptr, "GetDataDeletionSettings"},
@@ -155,8 +155,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {64, &ISystemSettingsServer::SetPrimaryAlbumStorage, "SetPrimaryAlbumStorage"},
         {65, nullptr, "GetUsb30EnableFlag"},
         {66, nullptr, "SetUsb30EnableFlag"},
-        {67, nullptr, "GetBatteryLot"},
-        {68, nullptr, "GetSerialNumber"},
+        {67, &ISystemSettingsServer::GetBatteryLot, "GetBatteryLot"},
+        {68, &ISystemSettingsServer::GetSerialNumber, "GetSerialNumber"},
         {69, &ISystemSettingsServer::GetNfcEnableFlag, "GetNfcEnableFlag"},
         {70, &ISystemSettingsServer::SetNfcEnableFlag, "SetNfcEnableFlag"},
         {71, &ISystemSettingsServer::GetSleepSettings, "GetSleepSettings"},
@@ -184,11 +184,11 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
         {94, nullptr, "GetFatalDirtyFlags"},
         {95, &ISystemSettingsServer::GetAutoUpdateEnableFlag, "GetAutoUpdateEnableFlag"},
-        {96, nullptr, "SetAutoUpdateEnableFlag"},
+        {96,  &ISystemSettingsServer::SetAutoUpdateEnableFlag, "SetAutoUpdateEnableFlag"},
         {97, nullptr, "GetNxControllerSettings"},
         {98, nullptr, "SetNxControllerSettings"},
         {99, &ISystemSettingsServer::GetBatteryPercentageFlag, "GetBatteryPercentageFlag"},
-        {100, nullptr, "SetBatteryPercentageFlag"},
+        {100, &ISystemSettingsServer::SetBatteryPercentageFlag, "SetBatteryPercentageFlag"},
         {101, nullptr, "GetExternalRtcResetFlag"},
         {102, nullptr, "SetExternalRtcResetFlag"},
         {103, nullptr, "GetUsbFullKeyEnableFlag"},
@@ -208,12 +208,12 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {117, nullptr, "GetHeadphoneVolumeUpdateFlag"},
         {118, nullptr, "SetHeadphoneVolumeUpdateFlag"},
         {119, nullptr, "NeedsToUpdateHeadphoneVolume"},
-        {120, nullptr, "GetPushNotificationActivityModeOnSleep"},
-        {121, nullptr, "SetPushNotificationActivityModeOnSleep"},
+        {120, &ISystemSettingsServer::GetPushNotificationActivityModeOnSleep, "GetPushNotificationActivityModeOnSleep"},
+        {121, &ISystemSettingsServer::SetPushNotificationActivityModeOnSleep, "SetPushNotificationActivityModeOnSleep"},
         {122, nullptr, "GetServiceDiscoveryControlSettings"},
         {123, nullptr, "SetServiceDiscoveryControlSettings"},
         {124, &ISystemSettingsServer::GetErrorReportSharePermission, "GetErrorReportSharePermission"},
-        {125, nullptr, "SetErrorReportSharePermission"},
+        {125, &ISystemSettingsServer::SetErrorReportSharePermission, "SetErrorReportSharePermission"},
         {126, &ISystemSettingsServer::GetAppletLaunchFlags, "GetAppletLaunchFlags"},
         {127, &ISystemSettingsServer::SetAppletLaunchFlags, "SetAppletLaunchFlags"},
         {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
@@ -225,7 +225,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
         {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
         {136, &ISystemSettingsServer::GetKeyboardLayout, "GetKeyboardLayout"},
-        {137, nullptr, "SetKeyboardLayout"},
+        {137, &ISystemSettingsServer::SetKeyboardLayout, "SetKeyboardLayout"},
         {138, nullptr, "GetWebInspectorFlag"},
         {139, nullptr, "GetAllowedSslHosts"},
         {140, nullptr, "GetHostFsMountPoint"},
@@ -291,8 +291,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
         {200, nullptr, "SetButtonConfigRegisteredSettings"},
         {201, &ISystemSettingsServer::GetFieldTestingFlag, "GetFieldTestingFlag"},
         {202, nullptr, "SetFieldTestingFlag"},
-        {203, nullptr, "GetPanelCrcMode"},
-        {204, nullptr, "SetPanelCrcMode"},
+        {203, &ISystemSettingsServer::GetPanelCrcMode, "GetPanelCrcMode"},
+        {204, &ISystemSettingsServer::SetPanelCrcMode, "SetPanelCrcMode"},
         {205, nullptr, "GetNxControllerSettingsEx"},
         {206, nullptr, "SetNxControllerSettingsEx"},
         {207, nullptr, "GetHearingProtectionSafeguardFlag"},
@@ -349,7 +349,7 @@ bool ISystemSettingsServer::LoadSettingsFile(std::filesystem::path& path, auto&&
         }
         SettingsHeader hdr{};
         file.read(reinterpret_cast<char*>(&hdr), sizeof(hdr));
-        return hdr.magic == SETTINGS_MAGIC && hdr.version == SETTINGS_VERSION;
+        return hdr.magic == SETTINGS_MAGIC && hdr.version >= SETTINGS_VERSION;
     };
 
     if (!exists || !file_size_ok) {
@@ -390,7 +390,7 @@ bool ISystemSettingsServer::StoreSettingsFile(std::filesystem::path& path, auto&
     }
 
     auto settings_base = path / "settings";
-    auto settings_tmp_file = settings_base;
+    std::filesystem::path settings_tmp_file = settings_base;
     settings_tmp_file = settings_tmp_file.replace_extension("tmp");
     std::ofstream file(settings_tmp_file, std::ios::binary | std::ios::out);
     if (!file.is_open()) {
@@ -817,7 +817,34 @@ void ISystemSettingsServer::SetTvSettings(HLERequestContext& ctx) {
     rb.Push(ResultSuccess);
 }
 
-void ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx) {
+void ISystemSettingsServer::GetAudioOutputMode(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto target{rp.PopEnum<AudioOutputModeTarget>()};
+
+    AudioOutputMode output_mode{};
+    const auto result = GetAudioOutputMode(output_mode, target);
+
+    LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
+
+    IPC::ResponseBuilder rb{ctx, 3};
+    rb.Push(result);
+    rb.PushEnum(output_mode);
+}
+
+void ISystemSettingsServer::SetAudioOutputMode(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    const auto target{rp.PopEnum<AudioOutputModeTarget>()};
+    const auto output_mode{rp.PopEnum<AudioOutputMode>()};
+
+    const auto result = SetAudioOutputMode(target, output_mode);
+
+    LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(result);
+}
+
+void ISystemSettingsServer::GetSpeakerAutoMuteFlag(HLERequestContext& ctx) {
     LOG_INFO(Service_SET, "called, force_mute_on_headphone_removed={}",
              m_system_settings.force_mute_on_headphone_removed);
 
@@ -826,7 +853,7 @@ void ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx
     rb.PushRaw(m_system_settings.force_mute_on_headphone_removed);
 }
 
-void ISystemSettingsServer::SetForceMuteOnHeadphoneRemoved(HLERequestContext& ctx) {
+void ISystemSettingsServer::SetSpeakerAutoMuteFlag(HLERequestContext& ctx) {
     IPC::RequestParser rp{ctx};
     m_system_settings.force_mute_on_headphone_removed = rp.PopRaw<bool>();
     SetSaveNeeded();
@@ -969,6 +996,26 @@ void ISystemSettingsServer::SetPrimaryAlbumStorage(HLERequestContext& ctx) {
     rb.Push(ResultSuccess);
 }
 
+void ISystemSettingsServer::GetBatteryLot(HLERequestContext& ctx) {
+    BatteryLot battery_lot = {"YUZUEMULATOR123456789"};
+
+    LOG_INFO(Service_SET, "called");
+
+    IPC::ResponseBuilder rb{ctx, 8};
+    rb.Push(ResultSuccess);
+    rb.PushRaw(battery_lot);
+}
+
+void ISystemSettingsServer::GetSerialNumber(HLERequestContext& ctx) {
+    SerialNumber console_serial = {"YUZ10012345678"};
+
+    LOG_INFO(Service_SET, "called");
+
+    IPC::ResponseBuilder rb{ctx, 8};
+    rb.Push(ResultSuccess);
+    rb.PushRaw(console_serial);
+}
+
 void ISystemSettingsServer::GetNfcEnableFlag(HLERequestContext& ctx) {
     LOG_INFO(Service_SET, "called, nfc_enable_flag={}", m_system_settings.nfc_enable_flag);
 
@@ -1132,6 +1179,17 @@ void ISystemSettingsServer::GetAutoUpdateEnableFlag(HLERequestContext& ctx) {
     rb.Push(m_system_settings.auto_update_enable_flag);
 }
 
+void ISystemSettingsServer::SetAutoUpdateEnableFlag(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.auto_update_enable_flag = rp.Pop<bool>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, auto_update_flag={}", m_system_settings.auto_update_enable_flag);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
 void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) {
     LOG_DEBUG(Service_SET, "called, battery_percentage_flag={}",
               m_system_settings.battery_percentage_flag);
@@ -1141,6 +1199,18 @@ void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) {
     rb.Push(m_system_settings.battery_percentage_flag);
 }
 
+void ISystemSettingsServer::SetBatteryPercentageFlag(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.battery_percentage_flag = rp.Pop<bool>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, battery_percentage_flag={}",
+             m_system_settings.battery_percentage_flag);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
 void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) {
     LOG_DEBUG(Service_SET, "called.");
 
@@ -1164,6 +1234,27 @@ void ISystemSettingsServer::GetExternalSteadyClockInternalOffset(HLERequestConte
     rb.Push(offset);
 }
 
+void ISystemSettingsServer::GetPushNotificationActivityModeOnSleep(HLERequestContext& ctx) {
+    LOG_INFO(Service_SET, "called, push_notification_activity_mode_on_sleep={}",
+             m_system_settings.push_notification_activity_mode_on_sleep);
+
+    IPC::ResponseBuilder rb{ctx, 3};
+    rb.Push(ResultSuccess);
+    rb.Push(m_system_settings.push_notification_activity_mode_on_sleep);
+}
+
+void ISystemSettingsServer::SetPushNotificationActivityModeOnSleep(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.push_notification_activity_mode_on_sleep = rp.Pop<s32>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, push_notification_activity_mode_on_sleep={}",
+             m_system_settings.push_notification_activity_mode_on_sleep);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
 void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx) {
     LOG_INFO(Service_SET, "called, error_report_share_permission={}",
              m_system_settings.error_report_share_permission);
@@ -1173,6 +1264,18 @@ void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx
     rb.PushEnum(m_system_settings.error_report_share_permission);
 }
 
+void ISystemSettingsServer::SetErrorReportSharePermission(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.error_report_share_permission = rp.PopEnum<ErrorReportSharePermission>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, error_report_share_permission={}",
+             m_system_settings.error_report_share_permission);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
 void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) {
     LOG_INFO(Service_SET, "called, applet_launch_flag={}", m_system_settings.applet_launch_flag);
 
@@ -1193,22 +1296,22 @@ void ISystemSettingsServer::SetAppletLaunchFlags(HLERequestContext& ctx) {
 }
 
 void ISystemSettingsServer::GetKeyboardLayout(HLERequestContext& ctx) {
-    const auto language_code =
-        available_language_codes[static_cast<s32>(::Settings::values.language_index.GetValue())];
-    const auto key_code =
-        std::find_if(language_to_layout.cbegin(), language_to_layout.cend(),
-                     [=](const auto& element) { return element.first == language_code; });
-
-    KeyboardLayout selected_keyboard_layout = KeyboardLayout::EnglishUs;
-    if (key_code != language_to_layout.end()) {
-        selected_keyboard_layout = key_code->second;
-    }
-
-    LOG_INFO(Service_SET, "called, selected_keyboard_layout={}", selected_keyboard_layout);
+    LOG_INFO(Service_SET, "called, keyboard_layout={}", m_system_settings.keyboard_layout);
 
     IPC::ResponseBuilder rb{ctx, 3};
     rb.Push(ResultSuccess);
-    rb.Push(static_cast<u32>(selected_keyboard_layout));
+    rb.Push(static_cast<u32>(m_system_settings.keyboard_layout));
+}
+
+void ISystemSettingsServer::SetKeyboardLayout(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.keyboard_layout = rp.PopRaw<KeyboardLayout>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, keyboard_layout={}", m_system_settings.keyboard_layout);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
 }
 
 void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) {
@@ -1300,6 +1403,25 @@ void ISystemSettingsServer::GetFieldTestingFlag(HLERequestContext& ctx) {
     rb.Push(m_system_settings.field_testing_flag);
 }
 
+void ISystemSettingsServer::GetPanelCrcMode(HLERequestContext& ctx) {
+    LOG_INFO(Service_SET, "called, panel_crc_mode={}", m_system_settings.panel_crc_mode);
+
+    IPC::ResponseBuilder rb{ctx, 3};
+    rb.Push(ResultSuccess);
+    rb.Push(m_system_settings.panel_crc_mode);
+}
+
+void ISystemSettingsServer::SetPanelCrcMode(HLERequestContext& ctx) {
+    IPC::RequestParser rp{ctx};
+    m_system_settings.panel_crc_mode = rp.PopRaw<s32>();
+    SetSaveNeeded();
+
+    LOG_INFO(Service_SET, "called, panel_crc_mode={}", m_system_settings.panel_crc_mode);
+
+    IPC::ResponseBuilder rb{ctx, 2};
+    rb.Push(ResultSuccess);
+}
+
 void ISystemSettingsServer::SetupSettings() {
     auto system_dir =
         Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir) / "system/save/8000000000000050";
@@ -1390,6 +1512,66 @@ Result ISystemSettingsServer::SetVibrationMasterVolume(f32 volume) {
     R_SUCCEED();
 }
 
+Result ISystemSettingsServer::GetAudioOutputMode(AudioOutputMode& out_output_mode,
+                                                 AudioOutputModeTarget target) const {
+    switch (target) {
+    case AudioOutputModeTarget::Hdmi:
+        out_output_mode = m_system_settings.audio_output_mode_hdmi;
+        break;
+    case AudioOutputModeTarget::Speaker:
+        out_output_mode = m_system_settings.audio_output_mode_speaker;
+        break;
+    case AudioOutputModeTarget::Headphone:
+        out_output_mode = m_system_settings.audio_output_mode_headphone;
+        break;
+    case AudioOutputModeTarget::Type3:
+        out_output_mode = m_system_settings.audio_output_mode_type3;
+        break;
+    case AudioOutputModeTarget::Type4:
+        out_output_mode = m_system_settings.audio_output_mode_type4;
+        break;
+    default:
+        LOG_ERROR(Service_SET, "Invalid audio output mode target {}", target);
+    }
+    R_SUCCEED();
+}
+
+Result ISystemSettingsServer::SetAudioOutputMode(AudioOutputModeTarget target,
+                                                 AudioOutputMode output_mode) {
+    switch (target) {
+    case AudioOutputModeTarget::Hdmi:
+        m_system_settings.audio_output_mode_hdmi = output_mode;
+        break;
+    case AudioOutputModeTarget::Speaker:
+        m_system_settings.audio_output_mode_speaker = output_mode;
+        break;
+    case AudioOutputModeTarget::Headphone:
+        m_system_settings.audio_output_mode_headphone = output_mode;
+        break;
+    case AudioOutputModeTarget::Type3:
+        m_system_settings.audio_output_mode_type3 = output_mode;
+        break;
+    case AudioOutputModeTarget::Type4:
+        m_system_settings.audio_output_mode_type4 = output_mode;
+        break;
+    default:
+        LOG_ERROR(Service_SET, "Invalid audio output mode target {}", target);
+    }
+    SetSaveNeeded();
+    R_SUCCEED();
+}
+
+Result ISystemSettingsServer::GetSpeakerAutoMuteFlag(bool& is_auto_mute) const {
+    is_auto_mute = m_system_settings.force_mute_on_headphone_removed;
+    R_SUCCEED();
+}
+
+Result ISystemSettingsServer::SetSpeakerAutoMuteFlag(bool is_auto_mute) {
+    m_system_settings.force_mute_on_headphone_removed = is_auto_mute;
+    SetSaveNeeded();
+    R_SUCCEED();
+}
+
 Result ISystemSettingsServer::GetExternalSteadyClockSourceId(Common::UUID& out_id) const {
     out_id = m_private_settings.external_clock_source_id;
     R_SUCCEED();
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h
index acbda8b8cb..1982b97232 100644
--- a/src/core/hle/service/set/system_settings_server.h
+++ b/src/core/hle/service/set/system_settings_server.h
@@ -50,6 +50,10 @@ public:
 
     Result GetVibrationMasterVolume(f32& out_volume) const;
     Result SetVibrationMasterVolume(f32 volume);
+    Result GetAudioOutputMode(AudioOutputMode& out_output_mode, AudioOutputModeTarget target) const;
+    Result SetAudioOutputMode(AudioOutputModeTarget target, AudioOutputMode output_mode);
+    Result GetSpeakerAutoMuteFlag(bool& is_auto_mute) const;
+    Result SetSpeakerAutoMuteFlag(bool auto_mute);
     Result GetExternalSteadyClockSourceId(Common::UUID& out_id) const;
     Result SetExternalSteadyClockSourceId(const Common::UUID& id);
     Result GetUserSystemClockContext(Service::PSC::Time::SystemClockContext& out_context) const;
@@ -97,8 +101,10 @@ private:
     void GetSettingsItemValue(HLERequestContext& ctx);
     void GetTvSettings(HLERequestContext& ctx);
     void SetTvSettings(HLERequestContext& ctx);
-    void IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx);
-    void SetForceMuteOnHeadphoneRemoved(HLERequestContext& ctx);
+    void GetAudioOutputMode(HLERequestContext& ctx);
+    void SetAudioOutputMode(HLERequestContext& ctx);
+    void GetSpeakerAutoMuteFlag(HLERequestContext& ctx);
+    void SetSpeakerAutoMuteFlag(HLERequestContext& ctx);
     void GetDebugModeFlag(HLERequestContext& ctx);
     void GetQuestFlag(HLERequestContext& ctx);
     void SetQuestFlag(HLERequestContext& ctx);
@@ -111,6 +117,8 @@ private:
     void SetUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx);
     void GetPrimaryAlbumStorage(HLERequestContext& ctx);
     void SetPrimaryAlbumStorage(HLERequestContext& ctx);
+    void GetBatteryLot(HLERequestContext& ctx);
+    void GetSerialNumber(HLERequestContext& ctx);
     void GetNfcEnableFlag(HLERequestContext& ctx);
     void SetNfcEnableFlag(HLERequestContext& ctx);
     void GetSleepSettings(HLERequestContext& ctx);
@@ -126,13 +134,19 @@ private:
     void SetBluetoothEnableFlag(HLERequestContext& ctx);
     void GetMiiAuthorId(HLERequestContext& ctx);
     void GetAutoUpdateEnableFlag(HLERequestContext& ctx);
+    void SetAutoUpdateEnableFlag(HLERequestContext& ctx);
     void GetBatteryPercentageFlag(HLERequestContext& ctx);
+    void SetBatteryPercentageFlag(HLERequestContext& ctx);
     void SetExternalSteadyClockInternalOffset(HLERequestContext& ctx);
     void GetExternalSteadyClockInternalOffset(HLERequestContext& ctx);
+    void GetPushNotificationActivityModeOnSleep(HLERequestContext& ctx);
+    void SetPushNotificationActivityModeOnSleep(HLERequestContext& ctx);
     void GetErrorReportSharePermission(HLERequestContext& ctx);
+    void SetErrorReportSharePermission(HLERequestContext& ctx);
     void GetAppletLaunchFlags(HLERequestContext& ctx);
     void SetAppletLaunchFlags(HLERequestContext& ctx);
     void GetKeyboardLayout(HLERequestContext& ctx);
+    void SetKeyboardLayout(HLERequestContext& ctx);
     void GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx);
     void SetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx);
     void GetUserSystemClockAutomaticCorrectionUpdatedTime(HLERequestContext& ctx);
@@ -141,6 +155,8 @@ private:
     void GetHomeMenuScheme(HLERequestContext& ctx);
     void GetHomeMenuSchemeModel(HLERequestContext& ctx);
     void GetFieldTestingFlag(HLERequestContext& ctx);
+    void GetPanelCrcMode(HLERequestContext& ctx);
+    void SetPanelCrcMode(HLERequestContext& ctx);
 
     bool LoadSettingsFile(std::filesystem::path& path, auto&& default_func);
     bool StoreSettingsFile(std::filesystem::path& path, auto& settings);
diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp
index a2295219a8..e78665d316 100644
--- a/src/hid_core/resource_manager.cpp
+++ b/src/hid_core/resource_manager.cpp
@@ -184,7 +184,7 @@ void ResourceManager::InitializeHidCommonSampler() {
     keyboard->SetAppletResource(applet_resource, &shared_mutex);
 
     const auto settings =
-        system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys");
+        system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
     npad->SetNpadExternals(applet_resource, &shared_mutex, handheld_config, settings);
 
     six_axis->SetAppletResource(applet_resource, &shared_mutex);
diff --git a/src/hid_core/resources/hid_firmware_settings.cpp b/src/hid_core/resources/hid_firmware_settings.cpp
index 9c9019e8f4..b32c0660a1 100644
--- a/src/hid_core/resources/hid_firmware_settings.cpp
+++ b/src/hid_core/resources/hid_firmware_settings.cpp
@@ -8,7 +8,8 @@
 namespace Service::HID {
 
 HidFirmwareSettings::HidFirmwareSettings(Core::System& system) {
-    m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys");
+    m_set_sys =
+        system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
     LoadSettings(true);
 }