diff --git a/include/rive/scene.hpp b/include/rive/scene.hpp
index 90de466..a30da58 100644
--- a/include/rive/scene.hpp
+++ b/include/rive/scene.hpp
@@ -51,6 +51,8 @@
         virtual SMIBool* getBool(const std::string&) const;
         virtual SMINumber* getNumber(const std::string&) const;
         virtual SMITrigger* getTrigger(const std::string&) const;
+
+        static std::unique_ptr<Scene> importDefault(Span<uint8_t>, Factory*);
     };
 
 } // namespace rive
diff --git a/src/scene_default.cpp b/src/scene_default.cpp
new file mode 100644
index 0000000..e85a7b4
--- /dev/null
+++ b/src/scene_default.cpp
@@ -0,0 +1,58 @@
+#include "rive/artboard.hpp"
+#include "rive/file.hpp"
+#include "rive/scene.hpp"
+
+using namespace rive;
+
+class SelfContainedScene : public Scene {
+    std::unique_ptr<File> m_File;
+    std::unique_ptr<ArtboardInstance> m_ABI;
+    std::unique_ptr<Scene> m_Scene;
+
+public:
+    SelfContainedScene(std::unique_ptr<File> file,
+                       std::unique_ptr<ArtboardInstance> abi,
+                       std::unique_ptr<Scene> scene)
+        : Scene(abi.get())
+        , m_File(std::move(file))
+        , m_ABI(std::move(abi))
+        , m_Scene(std::move(scene)) {}
+
+    ~SelfContainedScene() = default;
+
+    // Forward to our m_Scene
+
+    std::string name() const { return m_Scene->name(); }
+    Loop loop() const { return m_Scene->loop(); }
+    bool isTranslucent() const { return m_Scene->isTranslucent(); }
+    float durationSeconds() const { return m_Scene->durationSeconds(); }
+
+    bool advanceAndApply(float seconds) { return m_Scene->advanceAndApply(seconds); }
+    void draw(Renderer* renderer) { return m_Scene->draw(renderer); }
+
+    void pointerDown(Vec2D pos) { return m_Scene->pointerDown(pos); }
+    void pointerMove(Vec2D pos) { return m_Scene->pointerMove(pos); }
+    void pointerUp(Vec2D pos) { return m_Scene->pointerUp(pos); }
+
+    size_t inputCount() const { return m_Scene->inputCount(); }
+    SMIInput* input(size_t index) const { return m_Scene->input(index); }
+    SMIBool* getBool(const std::string& name) const { return m_Scene->getBool(name); }
+    SMINumber* getNumber(const std::string& name) const { return m_Scene->getNumber(name); }
+    SMITrigger* getTrigger(const std::string& name) const { return m_Scene->getTrigger(name); }
+};
+
+std::unique_ptr<Scene> Scene::importDefault(Span<uint8_t> span, Factory* factory) {
+    auto file = File::import(span, factory);
+    if (file) {
+        auto abi = file->artboardDefault();
+        if (abi) {
+            auto scene = abi->defaultScene();
+            if (scene) {
+                return std::make_unique<SelfContainedScene>(std::move(file),
+                                                            std::move(abi),
+                                                            std::move(scene));
+            }
+        }
+    }
+    return nullptr;
+}
\ No newline at end of file
diff --git a/test/default_state_machine_test.cpp b/test/default_state_machine_test.cpp
index bfe7d1a..54bae7d 100644
--- a/test/default_state_machine_test.cpp
+++ b/test/default_state_machine_test.cpp
@@ -29,3 +29,9 @@
     REQUIRE(scene != nullptr);
     REQUIRE(scene->name() == smi->name());
 }
+
+TEST_CASE("load default scene", "[file]") {
+    auto bytes = ReadFile("../../test/assets/entry.riv");
+    auto scene = rive::Scene::importDefault(rive::toSpan(bytes), &rive::gNoOpFactory);
+    REQUIRE(scene.get());
+}
\ No newline at end of file
diff --git a/test/rive_file_reader.hpp b/test/rive_file_reader.hpp
index 1076359..f06dd6e 100644
--- a/test/rive_file_reader.hpp
+++ b/test/rive_file_reader.hpp
@@ -6,16 +6,9 @@
 #include "no_op_factory.hpp"
 #include "../src/render_counter.hpp"
 
-static inline std::unique_ptr<rive::File>
-ReadRiveFile(const char path[],
-             rive::Factory* factory = nullptr,
-             rive::FileAssetResolver* resolver = nullptr) {
-    if (!factory) {
-        factory = &rive::gNoOpFactory;
-    }
-
+static inline std::vector<uint8_t> ReadFile(const char path[]) {
     FILE* fp = fopen(path, "rb");
-    REQUIRE(fp != nullptr);
+    REQUIRE(fp);
 
     fseek(fp, 0, SEEK_END);
     const size_t length = ftell(fp);
@@ -24,6 +17,19 @@
     REQUIRE(fread(bytes.data(), 1, length, fp) == length);
     fclose(fp);
 
+    return bytes;
+}
+
+static inline std::unique_ptr<rive::File>
+ReadRiveFile(const char path[],
+             rive::Factory* factory = nullptr,
+             rive::FileAssetResolver* resolver = nullptr) {
+    if (!factory) {
+        factory = &rive::gNoOpFactory;
+    }
+    
+    auto bytes = ReadFile(path);
+
     rive::ImportResult result;
     auto file = rive::File::import(rive::toSpan(bytes), factory, &result, resolver);
     REQUIRE(result == rive::ImportResult::success);
