diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp
index c23b2f19e..8b99d1d6e 100644
--- a/src/android/app/src/main/jni/native.cpp
+++ b/src/android/app/src/main/jni/native.cpp
@@ -30,6 +30,7 @@
 #include "core/cpu_manager.h"
 #include "core/crypto/key_manager.h"
 #include "core/file_sys/card_image.h"
+#include "core/file_sys/content_archive.h"
 #include "core/file_sys/registered_cache.h"
 #include "core/file_sys/submission_package.h"
 #include "core/file_sys/vfs.h"
@@ -224,6 +225,42 @@ public:
         m_system.Renderer().NotifySurfaceChanged();
     }
 
+    void ConfigureFilesystemProvider(const std::string& filepath) {
+        const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::Mode::Read);
+        if (!file) {
+            return;
+        }
+
+        auto loader = Loader::GetLoader(m_system, file);
+        if (!loader) {
+            return;
+        }
+
+        const auto file_type = loader->GetFileType();
+        if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error) {
+            return;
+        }
+
+        u64 program_id = 0;
+        const auto res2 = loader->ReadProgramId(program_id);
+        if (res2 == Loader::ResultStatus::Success && file_type == Loader::FileType::NCA) {
+            m_manual_provider->AddEntry(FileSys::TitleType::Application,
+                                        FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()),
+                                        program_id, file);
+        } else if (res2 == Loader::ResultStatus::Success &&
+                   (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) {
+            const auto nsp = file_type == Loader::FileType::NSP
+                                 ? std::make_shared<FileSys::NSP>(file)
+                                 : FileSys::XCI{file}.GetSecurePartitionNSP();
+            for (const auto& title : nsp->GetNCAs()) {
+                for (const auto& entry : title.second) {
+                    m_manual_provider->AddEntry(entry.first.first, entry.first.second, title.first,
+                                                entry.second->GetBaseFile());
+                }
+            }
+        }
+    }
+
     Core::SystemResultStatus InitializeEmulation(const std::string& filepath) {
         std::scoped_lock lock(m_mutex);
 
@@ -254,8 +291,14 @@ public:
             std::move(android_keyboard), // Software Keyboard
             nullptr,                     // Web Browser
         });
+
+        // Initialize filesystem.
+        m_manual_provider = std::make_unique<FileSys::ManualContentProvider>();
         m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>());
+        m_system.RegisterContentProvider(FileSys::ContentProviderUnionSlot::FrontendManual,
+                                         m_manual_provider.get());
         m_system.GetFileSystemController().CreateFactories(*m_vfs);
+        ConfigureFilesystemProvider(filepath);
 
         // Initialize account manager
         m_profile_manager = std::make_unique<Service::Account::ProfileManager>();
@@ -489,6 +532,7 @@ private:
     bool m_is_paused{};
     SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{};
     std::unique_ptr<Service::Account::ProfileManager> m_profile_manager;
+    std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider;
 
     // GPU driver parameters
     std::shared_ptr<Common::DynamicLibrary> m_vulkan_library;