diff --git a/src/core/file_sys/archive_backend.h b/src/core/file_sys/archive_backend.h
index c6a1be79db..e7a59a1ede 100644
--- a/src/core/file_sys/archive_backend.h
+++ b/src/core/file_sys/archive_backend.h
@@ -131,6 +131,12 @@ public:
      * @return Opened directory, or nullptr
      */
     virtual std::unique_ptr<DirectoryBackend> OpenDirectory(const Path& path) const = 0;
+
+    /**
+     * Get the free space
+     * @return The number of free bytes in the archive
+     */
+    virtual u64 GetFreeBytes() const = 0;
 };
 
 class ArchiveFactory : NonCopyable {
diff --git a/src/core/file_sys/disk_archive.cpp b/src/core/file_sys/disk_archive.cpp
index e9ecd2b1cc..0ba5022003 100644
--- a/src/core/file_sys/disk_archive.cpp
+++ b/src/core/file_sys/disk_archive.cpp
@@ -74,6 +74,11 @@ std::unique_ptr<DirectoryBackend> DiskArchive::OpenDirectory(const Path& path) c
     return std::move(directory);
 }
 
+u64 DiskArchive::GetFreeBytes() const {
+    // TODO: Stubbed to return 1GiB
+    return 1024 * 1024 * 1024;
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 DiskFile::DiskFile(const DiskArchive& archive, const Path& path, const Mode mode) {
diff --git a/src/core/file_sys/disk_archive.h b/src/core/file_sys/disk_archive.h
index aaac65b172..ef9a98057d 100644
--- a/src/core/file_sys/disk_archive.h
+++ b/src/core/file_sys/disk_archive.h
@@ -41,6 +41,7 @@ public:
     bool CreateDirectory(const Path& path) const override;
     bool RenameDirectory(const Path& src_path, const Path& dest_path) const override;
     std::unique_ptr<DirectoryBackend> OpenDirectory(const Path& path) const override;
+    u64 GetFreeBytes() const override;
 
 protected:
     friend class DiskFile;
diff --git a/src/core/file_sys/ivfc_archive.cpp b/src/core/file_sys/ivfc_archive.cpp
index 441ca9b530..2efc31a8c5 100644
--- a/src/core/file_sys/ivfc_archive.cpp
+++ b/src/core/file_sys/ivfc_archive.cpp
@@ -59,6 +59,11 @@ std::unique_ptr<DirectoryBackend> IVFCArchive::OpenDirectory(const Path& path) c
     return Common::make_unique<IVFCDirectory>();
 }
 
+u64 IVFCArchive::GetFreeBytes() const {
+    LOG_WARNING(Service_FS, "Attempted to get the free space in an IVFC archive");
+    return 0;
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 size_t IVFCFile::Read(const u64 offset, const size_t length, u8* buffer) const {
diff --git a/src/core/file_sys/ivfc_archive.h b/src/core/file_sys/ivfc_archive.h
index c15a6c4ae2..f3fd82de46 100644
--- a/src/core/file_sys/ivfc_archive.h
+++ b/src/core/file_sys/ivfc_archive.h
@@ -42,6 +42,7 @@ public:
     bool CreateDirectory(const Path& path) const override;
     bool RenameDirectory(const Path& src_path, const Path& dest_path) const override;
     std::unique_ptr<DirectoryBackend> OpenDirectory(const Path& path) const override;
+    u64 GetFreeBytes() const override;
 
 protected:
     std::shared_ptr<FileUtil::IOFile> romfs_file;
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index 6c0df67c32..d64b3656a4 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -403,6 +403,13 @@ ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle a
     return MakeResult<Kernel::SharedPtr<Directory>>(std::move(directory));
 }
 
+ResultVal<u64> GetFreeBytesInArchive(ArchiveHandle archive_handle) {
+    ArchiveBackend* archive = GetArchive(archive_handle);
+    if (archive == nullptr)
+        return ERR_INVALID_HANDLE;
+    return MakeResult<u64>(archive->GetFreeBytes());
+}
+
 ResultCode FormatArchive(ArchiveIdCode id_code, const FileSys::Path& path) {
     auto archive_itr = id_code_map.find(id_code);
     if (archive_itr == id_code_map.end()) {
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index 6f70487101..952deb4d4a 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -166,6 +166,13 @@ ResultCode RenameDirectoryBetweenArchives(ArchiveHandle src_archive_handle, cons
 ResultVal<Kernel::SharedPtr<Directory>> OpenDirectoryFromArchive(ArchiveHandle archive_handle,
         const FileSys::Path& path);
 
+/**
+ * Get the free space in an Archive
+ * @param archive_handle Handle to an open Archive object
+ * @return The number of free bytes in the archive
+ */
+ResultVal<u64> GetFreeBytesInArchive(ArchiveHandle archive_handle);
+
 /**
  * Erases the contents of the physical folder that contains the archive
  * identified by the specified id code and path
diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp
index ae52083f92..b3fa893024 100644
--- a/src/core/hle/service/fs/fs_user.cpp
+++ b/src/core/hle/service/fs/fs_user.cpp
@@ -496,6 +496,33 @@ static void FormatThisUserSaveData(Service::Interface* self) {
     cmd_buff[1] = FormatArchive(ArchiveIdCode::SaveData).raw;
 }
 
+/**
+ * FS_User::GetFreeBytes service function
+ *  Inputs:
+ *      0: 0x08120080
+ *      1: Archive handle low word
+ *      2: Archive handle high word
+ *  Outputs:
+ *      1: Result of function, 0 on success, otherwise error code
+ *      2: Free byte count low word
+ *      3: Free byte count high word
+ */
+static void GetFreeBytes(Service::Interface* self) {
+    u32* cmd_buff = Kernel::GetCommandBuffer();
+
+    ArchiveHandle archive_handle = MakeArchiveHandle(cmd_buff[1], cmd_buff[2]);
+    ResultVal<u64> bytes_res = GetFreeBytesInArchive(archive_handle);
+
+    cmd_buff[1] = bytes_res.Code().raw;
+    if (bytes_res.Succeeded()) {
+        cmd_buff[2] = (u32)*bytes_res;
+        cmd_buff[3] = *bytes_res >> 32;
+    } else {
+        cmd_buff[2] = 0;
+        cmd_buff[3] = 0;
+    }
+}
+
 /**
  * FS_User::CreateExtSaveData service function
  *  Inputs:
@@ -700,7 +727,7 @@ const Interface::FunctionInfo FunctionTable[] = {
     {0x080F0180, FormatThisUserSaveData,"FormatThisUserSaveData"},
     {0x08100200, nullptr,               "CreateSystemSaveData"},
     {0x08110040, nullptr,               "DeleteSystemSaveData"},
-    {0x08120080, nullptr,               "GetFreeBytes"},
+    {0x08120080, GetFreeBytes,          "GetFreeBytes"},
     {0x08130000, nullptr,               "GetCardType"},
     {0x08140000, nullptr,               "GetSdmcArchiveResource"},
     {0x08150000, nullptr,               "GetNandArchiveResource"},