diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 42733b95e975812f266c7ff3f6790587ae6a57e4..fa6b4215a93fc4e732615affcaa37d0db1165294 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SRCS
             arm/skyeye_common/vfp/vfpdouble.cpp
             arm/skyeye_common/vfp/vfpinstr.cpp
             arm/skyeye_common/vfp/vfpsingle.cpp
+            file_sys/archive_backend.cpp
             file_sys/archive_extsavedata.cpp
             file_sys/archive_romfs.cpp
             file_sys/archive_savedata.cpp
diff --git a/src/core/file_sys/archive_backend.cpp b/src/core/file_sys/archive_backend.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0439868ab8db17b9d0c1c53fda622ccaa6ea90d2
--- /dev/null
+++ b/src/core/file_sys/archive_backend.cpp
@@ -0,0 +1,127 @@
+// Copyright 2015 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include <sstream>
+
+#include "common/logging/log.h"
+#include "common/string_util.h"
+
+#include "core/file_sys/archive_backend.h"
+#include "core/mem_map.h"
+
+
+namespace FileSys {
+
+Path::Path(LowPathType type, u32 size, u32 pointer) : type(type) {
+    switch (type) {
+    case Binary:
+    {
+        u8* data = Memory::GetPointer(pointer);
+        binary = std::vector<u8>(data, data + size);
+        break;
+    }
+
+    case Char:
+    {
+        const char* data = reinterpret_cast<const char*>(Memory::GetPointer(pointer));
+        string = std::string(data, size - 1); // Data is always null-terminated.
+        break;
+    }
+
+    case Wchar:
+    {
+        const char16_t* data = reinterpret_cast<const char16_t*>(Memory::GetPointer(pointer));
+        u16str = std::u16string(data, size/2 - 1); // Data is always null-terminated.
+        break;
+    }
+
+    default:
+        break;
+    }
+}
+
+const std::string Path::DebugStr() const {
+    switch (GetType()) {
+    case Invalid:
+    default:
+        return "[Invalid]";
+    case Empty:
+        return "[Empty]";
+    case Binary:
+    {
+        std::stringstream res;
+        res << "[Binary: ";
+        for (unsigned byte : binary)
+            res << std::hex << std::setw(2) << std::setfill('0') << byte;
+        res << ']';
+        return res.str();
+    }
+    case Char:
+        return "[Char: " + AsString() + ']';
+    case Wchar:
+        return "[Wchar: " + AsString() + ']';
+    }
+}
+
+const std::string Path::AsString() const {
+    switch (GetType()) {
+    case Char:
+        return string;
+    case Wchar:
+        return Common::UTF16ToUTF8(u16str);
+    case Empty:
+        return{};
+    case Invalid:
+    case Binary:
+    default:
+        // TODO(yuriks): Add assert
+        LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
+        return{};
+    }
+}
+
+const std::u16string Path::AsU16Str() const {
+    switch (GetType()) {
+    case Char:
+        return Common::UTF8ToUTF16(string);
+    case Wchar:
+        return u16str;
+    case Empty:
+        return{};
+    case Invalid:
+    case Binary:
+        // TODO(yuriks): Add assert
+        LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
+        return{};
+    }
+}
+
+const std::vector<u8> Path::AsBinary() const {
+    switch (GetType()) {
+    case Binary:
+        return binary;
+    case Char:
+        return std::vector<u8>(string.begin(), string.end());
+    case Wchar:
+    {
+        // use two u8 for each character of u16str
+        std::vector<u8> to_return(u16str.size() * 2);
+        for (size_t i = 0; i < u16str.size(); ++i) {
+            u16 tmp_char = u16str.at(i);
+            to_return[i*2] = (tmp_char & 0xFF00) >> 8;
+            to_return[i*2 + 1] = (tmp_char & 0x00FF);
+        }
+        return to_return;
+    }
+    case Empty:
+        return{};
+    case Invalid:
+    default:
+        // TODO(yuriks): Add assert
+        LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!");
+        return{};
+    }
+}
+
+}
diff --git a/src/core/file_sys/archive_backend.h b/src/core/file_sys/archive_backend.h
index 1956d76cb9797fe8ef758c3e4e2364f7d98970bd..c6a1be79db8567955659e407889ba5aff5e2efca 100644
--- a/src/core/file_sys/archive_backend.h
+++ b/src/core/file_sys/archive_backend.h
@@ -5,18 +5,14 @@
 #pragma once
 
 #include <memory>
-#include <sstream>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include "common/bit_field.h"
 #include "common/common_types.h"
-#include "common/logging/log.h"
-#include "common/string_util.h"
 
 #include "core/hle/result.h"
-#include "core/mem_map.h"
 
 
 namespace FileSys {
@@ -42,134 +38,22 @@ union Mode {
 
 class Path {
 public:
+    Path() : type(Invalid) {}
+    Path(const char* path) : type(Char), string(path) {}
+    Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) {}
+    Path(LowPathType type, u32 size, u32 pointer);
 
-    Path() : type(Invalid) {
-    }
-
-    Path(const char* path) : type(Char), string(path) {
-    }
-
-    Path(std::vector<u8> binary_data) : type(Binary), binary(std::move(binary_data)) {
-    }
-
-    Path(LowPathType type, u32 size, u32 pointer) : type(type) {
-        switch (type) {
-        case Binary:
-        {
-            u8* data = Memory::GetPointer(pointer);
-            binary = std::vector<u8>(data, data + size);
-            break;
-        }
-
-        case Char:
-        {
-            const char* data = reinterpret_cast<const char*>(Memory::GetPointer(pointer));
-            string = std::string(data, size - 1); // Data is always null-terminated.
-            break;
-        }
-
-        case Wchar:
-        {
-            const char16_t* data = reinterpret_cast<const char16_t*>(Memory::GetPointer(pointer));
-            u16str = std::u16string(data, size/2 - 1); // Data is always null-terminated.
-            break;
-        }
-
-        default:
-            break;
-        }
-    }
-
-    LowPathType GetType() const {
-        return type;
-    }
+    LowPathType GetType() const { return type; }
 
     /**
      * Gets the string representation of the path for debugging
      * @return String representation of the path for debugging
      */
-    const std::string DebugStr() const {
-        switch (GetType()) {
-        case Invalid:
-        default:
-            return "[Invalid]";
-        case Empty:
-            return "[Empty]";
-        case Binary:
-        {
-            std::stringstream res;
-            res << "[Binary: ";
-            for (unsigned byte : binary)
-                res << std::hex << std::setw(2) << std::setfill('0') << byte;
-            res << ']';
-            return res.str();
-        }
-        case Char:
-            return "[Char: " + AsString() + ']';
-        case Wchar:
-            return "[Wchar: " + AsString() + ']';
-        }
-    }
+    const std::string DebugStr() const;
 
-    const std::string AsString() const {
-        switch (GetType()) {
-        case Char:
-            return string;
-        case Wchar:
-            return Common::UTF16ToUTF8(u16str);
-        case Empty:
-            return {};
-        case Invalid:
-        case Binary:
-        default:
-            // TODO(yuriks): Add assert
-            LOG_ERROR(Service_FS, "LowPathType cannot be converted to string!");
-            return {};
-        }
-    }
-
-    const std::u16string AsU16Str() const {
-        switch (GetType()) {
-        case Char:
-            return Common::UTF8ToUTF16(string);
-        case Wchar:
-            return u16str;
-        case Empty:
-            return {};
-        case Invalid:
-        case Binary:
-            // TODO(yuriks): Add assert
-            LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!");
-            return {};
-        }
-    }
-
-    const std::vector<u8> AsBinary() const {
-        switch (GetType()) {
-        case Binary:
-            return binary;
-        case Char:
-            return std::vector<u8>(string.begin(), string.end());
-        case Wchar:
-        {
-            // use two u8 for each character of u16str
-            std::vector<u8> to_return(u16str.size() * 2);
-            for (size_t i = 0; i < u16str.size(); ++i) {
-                u16 tmp_char = u16str.at(i);
-                to_return[i*2] = (tmp_char & 0xFF00) >> 8;
-                to_return[i*2 + 1] = (tmp_char & 0x00FF);
-            }
-            return to_return;
-        }
-        case Empty:
-            return {};
-        case Invalid:
-        default:
-            // TODO(yuriks): Add assert
-            LOG_ERROR(Service_FS, "LowPathType cannot be converted to binary!");
-            return {};
-        }
-    }
+    const std::string AsString() const;
+    const std::u16string AsU16Str() const;
+    const std::vector<u8> AsBinary() const;
 
 private:
     LowPathType type;
diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 94bac5498c3c32fa3404fc120a3e30c634a01514..207f660e69ad54984c704ba182fc2779c9f5e961 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -4,6 +4,8 @@
 
 #include <algorithm>
 
+#include "common/string_util.h"
+
 #include "core/file_sys/file_backend.h"
 #include "core/hle/service/cfg/cfg.h"
 #include "core/hle/service/cfg/cfg_i.h"