Use new ArtboardInstance type
diff --git a/include/rive/animation/animation_state.hpp b/include/rive/animation/animation_state.hpp
index f1a71b8..aff5c3d 100644
--- a/include/rive/animation/animation_state.hpp
+++ b/include/rive/animation/animation_state.hpp
@@ -4,7 +4,7 @@
 #include <stdio.h>
 namespace rive {
     class LinearAnimation;
-    class Artboard;
+    class ArtboardInstance;
     class StateMachineLayerImporter;
 
     class AnimationState : public AnimationStateBase {
@@ -15,7 +15,7 @@
 
     public:
         const LinearAnimation* animation() const { return m_Animation; }
-        StateInstance* makeInstance(Artboard*) const override;
+        StateInstance* makeInstance(ArtboardInstance*) const override;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/animation_state_instance.hpp b/include/rive/animation/animation_state_instance.hpp
index 64d25bf..1f03f3f 100644
--- a/include/rive/animation/animation_state_instance.hpp
+++ b/include/rive/animation/animation_state_instance.hpp
@@ -15,7 +15,7 @@
         bool m_KeepGoing;
 
     public:
-        AnimationStateInstance(const AnimationState* animationState, Artboard* instance);
+        AnimationStateInstance(const AnimationState* animationState, ArtboardInstance* instance);
 
         void advance(float seconds, SMIInput** inputs) override;
         void apply(float mix) override;
diff --git a/include/rive/animation/blend_state_1d.hpp b/include/rive/animation/blend_state_1d.hpp
index 8ffa1e4..83d0695 100644
--- a/include/rive/animation/blend_state_1d.hpp
+++ b/include/rive/animation/blend_state_1d.hpp
@@ -12,7 +12,7 @@
 
         StatusCode import(ImportStack& importStack) override;
 
-        StateInstance* makeInstance(Artboard*) const override;
+        StateInstance* makeInstance(ArtboardInstance*) const override;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/blend_state_1d_instance.hpp b/include/rive/animation/blend_state_1d_instance.hpp
index db7e7a6..a386074 100644
--- a/include/rive/animation/blend_state_1d_instance.hpp
+++ b/include/rive/animation/blend_state_1d_instance.hpp
@@ -13,7 +13,7 @@
         int animationIndex(float value);
 
     public:
-        BlendState1DInstance(const BlendState1D* blendState, Artboard* instance);
+        BlendState1DInstance(const BlendState1D* blendState, ArtboardInstance* instance);
         void advance(float seconds, SMIInput** inputs) override;
     };
 } // namespace rive
diff --git a/include/rive/animation/blend_state_direct.hpp b/include/rive/animation/blend_state_direct.hpp
index 5562221..fd8f120 100644
--- a/include/rive/animation/blend_state_direct.hpp
+++ b/include/rive/animation/blend_state_direct.hpp
@@ -5,7 +5,7 @@
 namespace rive {
     class BlendStateDirect : public BlendStateDirectBase {
     public:
-        StateInstance* makeInstance(Artboard*) const override;
+        StateInstance* makeInstance(ArtboardInstance*) const override;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/blend_state_direct_instance.hpp b/include/rive/animation/blend_state_direct_instance.hpp
index fd90681..03b6a54 100644
--- a/include/rive/animation/blend_state_direct_instance.hpp
+++ b/include/rive/animation/blend_state_direct_instance.hpp
@@ -9,7 +9,7 @@
     class BlendStateDirectInstance
         : public BlendStateInstance<BlendStateDirect, BlendAnimationDirect> {
     public:
-        BlendStateDirectInstance(const BlendStateDirect* blendState, Artboard* instance);
+        BlendStateDirectInstance(const BlendStateDirect* blendState, ArtboardInstance* instance);
         void advance(float seconds, SMIInput** inputs) override;
     };
 } // namespace rive
diff --git a/include/rive/animation/blend_state_instance.hpp b/include/rive/animation/blend_state_instance.hpp
index fe43e18..6847d0a 100644
--- a/include/rive/animation/blend_state_instance.hpp
+++ b/include/rive/animation/blend_state_instance.hpp
@@ -37,7 +37,7 @@
         bool m_KeepGoing = true;
 
     public:
-        BlendStateInstance(const K* blendState, Artboard* instance) : StateInstance(blendState) {
+        BlendStateInstance(const K* blendState, ArtboardInstance* instance) : StateInstance(blendState) {
             for (auto blendAnimation : blendState->animations()) {
                 m_AnimationInstances.emplace_back(
                     BlendStateAnimationInstance<T>(static_cast<T*>(blendAnimation), instance));
diff --git a/include/rive/animation/layer_state.hpp b/include/rive/animation/layer_state.hpp
index 793947a..e957f9e 100644
--- a/include/rive/animation/layer_state.hpp
+++ b/include/rive/animation/layer_state.hpp
@@ -5,7 +5,7 @@
 #include <vector>
 
 namespace rive {
-    class Artboard;
+    class ArtboardInstance;
     class StateTransition;
     class LayerStateImporter;
     class StateMachineLayerImporter;
@@ -36,7 +36,7 @@
 
         /// Make an instance of this state that can be advanced and applied by
         /// the state machine when it is active or being transitioned from.
-        virtual StateInstance* makeInstance(Artboard* instance) const;
+        virtual StateInstance* makeInstance(ArtboardInstance* instance) const;
     };
 } // namespace rive
 
diff --git a/include/rive/animation/state_instance.hpp b/include/rive/animation/state_instance.hpp
index df9f1e8..f2d1dca 100644
--- a/include/rive/animation/state_instance.hpp
+++ b/include/rive/animation/state_instance.hpp
@@ -7,7 +7,7 @@
 namespace rive {
     class LayerState;
     class SMIInput;
-    class Artboard;
+    class ArtboardInstance;
 
     /// Represents an instance of a state tracked by the State Machine.
     class StateInstance {
diff --git a/include/rive/animation/state_machine_instance.hpp b/include/rive/animation/state_machine_instance.hpp
index 7e48cbb..e9c8c33 100644
--- a/include/rive/animation/state_machine_instance.hpp
+++ b/include/rive/animation/state_machine_instance.hpp
@@ -9,7 +9,7 @@
     class StateMachine;
     class LayerState;
     class SMIInput;
-    class Artboard;
+    class ArtboardInstance;
     class SMIBool;
     class SMINumber;
     class SMITrigger;
@@ -21,7 +21,7 @@
 
     private:
         const StateMachine* m_Machine;
-        Artboard* m_ArtboardInstance;
+        ArtboardInstance* m_ArtboardInstance;
         bool m_NeedsAdvance = false;
 
         size_t m_InputCount;
@@ -32,7 +32,7 @@
         void markNeedsAdvance();
 
     public:
-        StateMachineInstance(const StateMachine* machine, Artboard* instance);
+        StateMachineInstance(const StateMachine* machine, ArtboardInstance* instance);
         ~StateMachineInstance();
 
         // Advance the state machine by the specified time. Returns true if the
diff --git a/include/rive/animation/system_state_instance.hpp b/include/rive/animation/system_state_instance.hpp
index 2cc70ef..c0f76a3 100644
--- a/include/rive/animation/system_state_instance.hpp
+++ b/include/rive/animation/system_state_instance.hpp
@@ -10,7 +10,7 @@
     /// just a no-op state (perhaps an unknown to this runtime state-type).
     class SystemStateInstance : public StateInstance {
     public:
-        SystemStateInstance(const LayerState* layerState, Artboard* instance);
+        SystemStateInstance(const LayerState* layerState, ArtboardInstance* instance);
 
         void advance(float seconds, SMIInput** inputs) override;
         void apply(float mix) override;
diff --git a/src/animation/animation_state.cpp b/src/animation/animation_state.cpp
index ceb701d..c279289 100644
--- a/src/animation/animation_state.cpp
+++ b/src/animation/animation_state.cpp
@@ -7,7 +7,7 @@
 
 using namespace rive;
 
-StateInstance* AnimationState::makeInstance(Artboard* instance) const {
+StateInstance* AnimationState::makeInstance(ArtboardInstance* instance) const {
     if (animation() == nullptr) {
         // Failed to load at runtime/some new type we don't understand.
         return new SystemStateInstance(this, instance);
diff --git a/src/animation/animation_state_instance.cpp b/src/animation/animation_state_instance.cpp
index 3303d4f..d3a7c25 100644
--- a/src/animation/animation_state_instance.cpp
+++ b/src/animation/animation_state_instance.cpp
@@ -4,7 +4,7 @@
 using namespace rive;
 
 AnimationStateInstance::AnimationStateInstance(const AnimationState* state,
-                                               Artboard* instance) :
+                                               ArtboardInstance* instance) :
     StateInstance(state),
     m_AnimationInstance(state->animation(), instance),
     m_KeepGoing(true)
diff --git a/src/animation/blend_state_1d.cpp b/src/animation/blend_state_1d.cpp
index 778fe9b..3399c6e 100644
--- a/src/animation/blend_state_1d.cpp
+++ b/src/animation/blend_state_1d.cpp
@@ -6,7 +6,7 @@
 
 using namespace rive;
 
-StateInstance* BlendState1D::makeInstance(Artboard* instance) const {
+StateInstance* BlendState1D::makeInstance(ArtboardInstance* instance) const {
     return new BlendState1DInstance(this, instance);
 }
 
diff --git a/src/animation/blend_state_1d_instance.cpp b/src/animation/blend_state_1d_instance.cpp
index 4bb4408..2f6227b 100644
--- a/src/animation/blend_state_1d_instance.cpp
+++ b/src/animation/blend_state_1d_instance.cpp
@@ -3,7 +3,7 @@
 
 using namespace rive;
 
-BlendState1DInstance::BlendState1DInstance(const BlendState1D* blendState, Artboard* instance) :
+BlendState1DInstance::BlendState1DInstance(const BlendState1D* blendState, ArtboardInstance* instance) :
     BlendStateInstance<BlendState1D, BlendAnimation1D>(blendState, instance) {}
 
 int BlendState1DInstance::animationIndex(float value) {
diff --git a/src/animation/blend_state_direct.cpp b/src/animation/blend_state_direct.cpp
index 2879b4c..cc421ac 100644
--- a/src/animation/blend_state_direct.cpp
+++ b/src/animation/blend_state_direct.cpp
@@ -6,6 +6,6 @@
 
 using namespace rive;
 
-StateInstance* BlendStateDirect::makeInstance(Artboard* instance) const {
+StateInstance* BlendStateDirect::makeInstance(ArtboardInstance* instance) const {
     return new BlendStateDirectInstance(this, instance);
 }
\ No newline at end of file
diff --git a/src/animation/blend_state_direct_instance.cpp b/src/animation/blend_state_direct_instance.cpp
index 77c1c2f..04dd036 100644
--- a/src/animation/blend_state_direct_instance.cpp
+++ b/src/animation/blend_state_direct_instance.cpp
@@ -3,7 +3,7 @@
 
 using namespace rive;
 
-BlendStateDirectInstance::BlendStateDirectInstance(const BlendStateDirect* blendState, Artboard* instance) :
+BlendStateDirectInstance::BlendStateDirectInstance(const BlendStateDirect* blendState, ArtboardInstance* instance) :
     BlendStateInstance<BlendStateDirect, BlendAnimationDirect>(blendState, instance) {}
 
 void BlendStateDirectInstance::advance(float seconds, SMIInput** inputs) {
diff --git a/src/animation/layer_state.cpp b/src/animation/layer_state.cpp
index 7fce2d8..42327ac 100644
--- a/src/animation/layer_state.cpp
+++ b/src/animation/layer_state.cpp
@@ -46,6 +46,6 @@
 
 void LayerState::addTransition(StateTransition* transition) { m_Transitions.push_back(transition); }
 
-StateInstance* LayerState::makeInstance(Artboard* instance) const {
+StateInstance* LayerState::makeInstance(ArtboardInstance* instance) const {
     return new SystemStateInstance(this, instance);
 }
\ No newline at end of file
diff --git a/src/animation/state_machine_instance.cpp b/src/animation/state_machine_instance.cpp
index 6ece00f..928ad49 100644
--- a/src/animation/state_machine_instance.cpp
+++ b/src/animation/state_machine_instance.cpp
@@ -20,7 +20,7 @@
     private:
         static const int maxIterations = 100;
         const StateMachineLayer* m_Layer = nullptr;
-        Artboard* m_ArtboardInstance = nullptr;
+        ArtboardInstance* m_ArtboardInstance = nullptr;
 
         StateInstance* m_AnyStateInstance = nullptr;
         StateInstance* m_CurrentState = nullptr;
@@ -49,7 +49,7 @@
             delete m_StateFrom;
         }
 
-        void init(const StateMachineLayer* layer, Artboard* instance) {
+        void init(const StateMachineLayer* layer, ArtboardInstance* instance) {
             m_ArtboardInstance = instance;
             assert(m_Layer == nullptr);
             m_AnyStateInstance = layer->anyState()->makeInstance(instance);
@@ -215,7 +215,7 @@
     };
 } // namespace rive
 
-StateMachineInstance::StateMachineInstance(const StateMachine* machine, Artboard* instance)
+StateMachineInstance::StateMachineInstance(const StateMachine* machine, ArtboardInstance* instance)
         : m_Machine(machine)
         , m_ArtboardInstance(instance)
 {
diff --git a/src/animation/system_state_instance.cpp b/src/animation/system_state_instance.cpp
index 957ac18..50906a5 100644
--- a/src/animation/system_state_instance.cpp
+++ b/src/animation/system_state_instance.cpp
@@ -1,7 +1,7 @@
 #include "rive/animation/system_state_instance.hpp"
 using namespace rive;
 
-SystemStateInstance::SystemStateInstance(const LayerState* layerState, Artboard* instance) :
+SystemStateInstance::SystemStateInstance(const LayerState* layerState, ArtboardInstance* instance) :
     StateInstance(layerState) {}
 
 void SystemStateInstance::advance(float seconds, SMIInput** inputs) {}
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 7402623..940b835 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -537,6 +537,7 @@
         artboardClone->m_IsInstance = true;
     }
 
+    assert(artboardClone->isInstance());
     return artboardClone;
 }