Merging low level rendering with master.

# Conflicts:
#	build/premake5.lua
#	src/animation/blend_state.cpp
#	src/math/mat2d.cpp
#	src/shapes/metrics_path.cpp
diff --git a/README.md b/README.md
index 4c75389..12fa22a 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,9 @@
 We use [premake5](https://premake.github.io/). The Rive dev team primarily works on MacOS. There is some work done by the community to also support Windows and Linux. PRs welcomed for specific platforms you with to support! We encourage you to use premake as it's highly extensible and configurable for a variety of platforms.
 
 ## Build
-In the ```rive``` directory, run ```build.sh``` to debug build and ```build.sh release``` for a release build.
+In the ```rive-cpp``` directory, run ```build.sh``` to debug build and ```build.sh release``` for a release build.
+
+If you've put the `premake5` executable in the `rive-cpp/build` folder, you can run it with `PATH=.:$PATH ./build.sh`
 
 ## Testing
 Uses the [Catch2](https://github.com/catchorg/Catch2) testing framework.
@@ -27,6 +29,8 @@
 
 In the ```dev``` directory, run ```test.sh``` to compile and execute the tests.
 
+(if you've installed `premake5` in `rive-cpp/build`, you can run it with `PATH=../../build:$PATH ./test.sh`)
+
 The tests live in ```rive/test```. To add new tests, create a new ```xxx_test.cpp``` file here. The test harness will automatically pick up the new file.
 
 There's a VSCode command provided to ```run tests``` from the Tasks: Run Task command palette. 
diff --git a/build/premake5.lua b/build/premake5.lua
index 9091a9f..116435c 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -11,7 +11,7 @@
 
 files {"../src/**.cpp"}
 
-buildoptions {"-Wall", "-fno-exceptions", "-fno-rtti"}
+buildoptions {"-Wall", "-fno-exceptions", "-fno-rtti", "-Werror=format"}
 
 newoption {
     trigger = "with-low-level-rendering",
diff --git a/dev/core_generator/lib/src/configuration.dart b/dev/core_generator/lib/src/configuration.dart
index 93450f4..56785e9 100644
--- a/dev/core_generator/lib/src/configuration.dart
+++ b/dev/core_generator/lib/src/configuration.dart
@@ -1,4 +1,4 @@
 String defsPath = "./defs/";
-String generatedHppPath = "../include/generated/";
+String generatedHppPath = "../include/rive/generated/";
 String concreteHppPath = "../include/";
 String generatedCppPath = "../src/generated/";
diff --git a/dev/core_generator/lib/src/definition.dart b/dev/core_generator/lib/src/definition.dart
index 7c712b1..88483c6 100644
--- a/dev/core_generator/lib/src/definition.dart
+++ b/dev/core_generator/lib/src/definition.dart
@@ -93,7 +93,7 @@
   String get name => _name;
 
   String get localCodeFilename => '${stripExtension(_filename)}_base.hpp';
-  String get concreteCodeFilename => '${stripExtension(_filename)}.hpp';
+  String get concreteCodeFilename => 'rive/${stripExtension(_filename)}.hpp';
   String get localCppCodeFilename => '${stripExtension(_filename)}_base.cpp';
 
   /// Generates cpp header code based on the Definition
@@ -102,14 +102,17 @@
     StringBuffer code = StringBuffer();
 
     var includes = <String>{
-      defineContextExtension ? 'core.hpp' : _extensionOf.concreteCodeFilename
+      defineContextExtension
+          ? 'rive/core.hpp'
+          : _extensionOf.concreteCodeFilename
     };
     for (final property in properties) {
       if (property.type.include != null) {
         includes.add(property.type.include);
       }
-      includes.add(
-          'core/field_types/' + property.type.snakeRuntimeCoreName + '.hpp');
+      includes.add('rive/core/field_types/' +
+          property.type.snakeRuntimeCoreName +
+          '.hpp');
     }
 
     var sortedIncludes = includes.toList()..sort();
@@ -172,10 +175,10 @@
       // Write getter/setters.
       code.writeln('public:');
       for (final property in properties) {
-        code.writeln(
-            'inline ${property.type.cppGetterName} ${property.name}() const ' +
-                (property.isGetOverride ? 'override' : '') +
-                '{ return m_${property.capitalizedName}; }');
+        code.writeln((property.isVirtual ? 'virtual' : 'inline') +
+            ' ${property.type.cppGetterName} ${property.name}() const ' +
+            (property.isGetOverride ? 'override' : '') +
+            '{ return m_${property.capitalizedName}; }');
 
         code.writeln('void ${property.name}(${property.type.cppName} value) ' +
             (property.isSetOverride ? 'override' : '') +
@@ -247,7 +250,7 @@
     if (!concreteFile.existsSync()) {
       StringBuffer concreteCode = StringBuffer();
       concreteFile.createSync(recursive: true);
-      concreteCode.writeln('#include "generated/$localCodeFilename"');
+      concreteCode.writeln('#include "rive/generated/$localCodeFilename"');
       concreteCode.writeln('#include <stdio.h>');
       concreteCode.writeln('namespace rive {');
       concreteCode.writeln('''class $_name : public ${_name}Base {
@@ -261,7 +264,7 @@
     }
     if (!_isAbstract) {
       StringBuffer cppCode = StringBuffer();
-      cppCode.writeln('#include "generated/$localCodeFilename"');
+      cppCode.writeln('#include "rive/generated/$localCodeFilename"');
       cppCode.writeln('#include "$concreteCodeFilename"');
       cppCode.writeln();
       cppCode.writeln('using namespace rive;');
diff --git a/dev/core_generator/lib/src/property.dart b/dev/core_generator/lib/src/property.dart
index e12cd67..be707a4 100644
--- a/dev/core_generator/lib/src/property.dart
+++ b/dev/core_generator/lib/src/property.dart
@@ -10,6 +10,7 @@
   final Definition definition;
   String initialValue;
   String initialValueRuntime;
+  bool isVirtual = false;
   bool animates = false;
   String group;
   Key key;
@@ -66,6 +67,8 @@
     if (a is bool) {
       animates = a;
     }
+    dynamic virtualValue = data['virtual'];
+    isVirtual = virtualValue is bool && virtualValue;
     dynamic g = data['group'];
     if (g is String) {
       group = g;
@@ -227,6 +230,9 @@
     if (!isCoop) {
       data['coop'] = false;
     }
+    if (isVirtual) {
+      data['virtual'] = true;
+    }
     return data;
   }
 
diff --git a/dev/defs/constraints/constraint.json b/dev/defs/constraints/constraint.json
new file mode 100644
index 0000000..baf6931
--- /dev/null
+++ b/dev/defs/constraints/constraint.json
@@ -0,0 +1,21 @@
+{
+  "name": "Constraint",
+  "key": {
+    "int": 79,
+    "string": "constraint"
+  },
+  "abstract": true,
+  "extends": "component.json",
+  "properties": {
+    "strength": {
+      "type": "double",
+      "initialValue": "1.0",
+      "animates": true,
+      "key": {
+        "int": 172,
+        "string": "strength"
+      },
+      "description": "Strength of the constraint. 0 means off. 1 means fully constraining."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/constraints/distance_constraint.json b/dev/defs/constraints/distance_constraint.json
new file mode 100644
index 0000000..6ba3093
--- /dev/null
+++ b/dev/defs/constraints/distance_constraint.json
@@ -0,0 +1,29 @@
+{
+  "name": "DistanceConstraint",
+  "key": {
+    "int": 82,
+    "string": "distanceconstraint"
+  },
+  "extends": "constraints/targeted_constraint.json",
+  "properties": {
+    "distance": {
+      "type": "double",
+      "initialValue": "100.0",
+      "animates": true,
+      "key": {
+        "int": 177,
+        "string": "distance"
+      },
+      "description": "The unit distance the constraint will move the constrained object relative to the target."
+    },
+    "modeValue": {
+      "type": "uint",
+      "initialValue": "0",
+      "key": {
+        "int": 178,
+        "string": "modevalue"
+      },
+      "description": "Backing value for the mode enum."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/constraints/ik_constraint.json b/dev/defs/constraints/ik_constraint.json
new file mode 100644
index 0000000..ed1395c
--- /dev/null
+++ b/dev/defs/constraints/ik_constraint.json
@@ -0,0 +1,28 @@
+{
+  "name": "IKConstraint",
+  "key": {
+    "int": 81,
+    "string": "ikconstraint"
+  },
+  "extends": "constraints/targeted_constraint.json",
+  "properties": {
+    "invertDirection": {
+      "type": "bool",
+      "initialValue": "false",
+      "key": {
+        "int": 174,
+        "string": "invertdirection"
+      },
+      "description": "True when the direction taken towards the target should be inverted from the default."
+    },
+    "parentBoneCount": {
+      "type": "uint",
+      "initialValue": "0",
+      "key": {
+        "int": 175,
+        "string": "parentbonecount"
+      },
+      "description": "The number of bones above this one that are influenced by this IK constraint."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/constraints/targeted_constraint.json b/dev/defs/constraints/targeted_constraint.json
new file mode 100644
index 0000000..29b616d
--- /dev/null
+++ b/dev/defs/constraints/targeted_constraint.json
@@ -0,0 +1,22 @@
+{
+  "name": "TargetedConstraint",
+  "key": {
+    "int": 80,
+    "string": "targetedconstraint"
+  },
+  "abstract": true,
+  "extends": "constraints/constraint.json",
+  "properties": {
+    "targetId": {
+      "type": "Id",
+      "typeRuntime": "uint",
+      "initialValue": "Core.missingId",
+      "initialValueRuntime": "-1",
+      "key": {
+        "int": 173,
+        "string": "targetid"
+      },
+      "description": "Identifier used to track the TransformComponent used as the target for the constraint."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/constraints/transform_constraint.json b/dev/defs/constraints/transform_constraint.json
new file mode 100644
index 0000000..add65a0
--- /dev/null
+++ b/dev/defs/constraints/transform_constraint.json
@@ -0,0 +1,28 @@
+{
+  "name": "TransformConstraint",
+  "key": {
+    "int": 83,
+    "string": "transformconstraint"
+  },
+  "extends": "constraints/targeted_constraint.json",
+  "properties": {
+    "sourceSpaceValue": {
+      "type": "uint",
+      "initialValue": "0",
+      "key": {
+        "int": 179,
+        "string": "sourcespacevalue"
+      },
+      "description": "The source transform space."
+    },
+    "destSpaceValue": {
+      "type": "uint",
+      "initialValue": "0",
+      "key": {
+        "int": 180,
+        "string": "destspacevalue"
+      },
+      "description": "The destination transform space."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/node.json b/dev/defs/node.json
index 342a66b..f604980 100644
--- a/dev/defs/node.json
+++ b/dev/defs/node.json
@@ -27,6 +27,16 @@
         "int": 14,
         "string": "y"
       }
+    },
+    "styleValue": {
+      "type": "uint",
+      "initialValue": "0",
+      "key": {
+        "int": 176,
+        "string": "style"
+      },
+      "description": "Display style of the node in the editor. 0 for group and 1 for target.",
+      "runtime": false
     }
   }
 }
\ No newline at end of file
diff --git a/dev/defs/shapes/paint/shape_paint.json b/dev/defs/shapes/paint/shape_paint.json
index 1a806a0..979ffc2 100644
--- a/dev/defs/shapes/paint/shape_paint.json
+++ b/dev/defs/shapes/paint/shape_paint.json
@@ -13,7 +13,8 @@
       "key": {
         "int": 41,
         "string": "isVisible"
-      }
+      },
+      "virtual": true
     }
   }
 }
\ No newline at end of file
diff --git a/include/animation/animation.hpp b/include/rive/animation/animation.hpp
similarity index 73%
rename from include/animation/animation.hpp
rename to include/rive/animation/animation.hpp
index b08a8d1..1cf6c4a 100644
--- a/include/animation/animation.hpp
+++ b/include/rive/animation/animation.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ANIMATION_HPP_
 #define _RIVE_ANIMATION_HPP_
-#include "generated/animation/animation_base.hpp"
+#include "rive/generated/animation/animation_base.hpp"
 namespace rive
 {
 	class Animation : public AnimationBase
diff --git a/include/animation/animation_state.hpp b/include/rive/animation/animation_state.hpp
similarity index 88%
rename from include/animation/animation_state.hpp
rename to include/rive/animation/animation_state.hpp
index a6328e3..648549e 100644
--- a/include/animation/animation_state.hpp
+++ b/include/rive/animation/animation_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ANIMATION_STATE_HPP_
 #define _RIVE_ANIMATION_STATE_HPP_
-#include "generated/animation/animation_state_base.hpp"
+#include "rive/generated/animation/animation_state_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/animation_state_instance.hpp b/include/rive/animation/animation_state_instance.hpp
similarity index 88%
rename from include/animation/animation_state_instance.hpp
rename to include/rive/animation/animation_state_instance.hpp
index ddcba1d..8e63590 100644
--- a/include/animation/animation_state_instance.hpp
+++ b/include/rive/animation/animation_state_instance.hpp
@@ -2,8 +2,8 @@
 #define _RIVE_ANIMATION_STATE_INSTANCE_HPP_
 
 #include <string>
-#include "animation/state_instance.hpp"
-#include "animation/linear_animation_instance.hpp"
+#include "rive/animation/state_instance.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
 
 namespace rive
 {
diff --git a/include/animation/any_state.hpp b/include/rive/animation/any_state.hpp
similarity index 76%
rename from include/animation/any_state.hpp
rename to include/rive/animation/any_state.hpp
index 5218629..bb1405a 100644
--- a/include/animation/any_state.hpp
+++ b/include/rive/animation/any_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ANY_STATE_HPP_
 #define _RIVE_ANY_STATE_HPP_
-#include "generated/animation/any_state_base.hpp"
+#include "rive/generated/animation/any_state_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/blend_animation.hpp b/include/rive/animation/blend_animation.hpp
similarity index 86%
rename from include/animation/blend_animation.hpp
rename to include/rive/animation/blend_animation.hpp
index 576c67b..90ee617 100644
--- a/include/animation/blend_animation.hpp
+++ b/include/rive/animation/blend_animation.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_ANIMATION_HPP_
 #define _RIVE_BLEND_ANIMATION_HPP_
-#include "generated/animation/blend_animation_base.hpp"
+#include "rive/generated/animation/blend_animation_base.hpp"
 namespace rive
 {
 	class LinearAnimation;
diff --git a/include/animation/blend_animation_1d.hpp b/include/rive/animation/blend_animation_1d.hpp
similarity index 83%
rename from include/animation/blend_animation_1d.hpp
rename to include/rive/animation/blend_animation_1d.hpp
index 62d3121..65b9e12 100644
--- a/include/animation/blend_animation_1d.hpp
+++ b/include/rive/animation/blend_animation_1d.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_ANIMATION1_D_HPP_
 #define _RIVE_BLEND_ANIMATION1_D_HPP_
-#include "generated/animation/blend_animation_1d_base.hpp"
+#include "rive/generated/animation/blend_animation_1d_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/blend_animation_direct.hpp b/include/rive/animation/blend_animation_direct.hpp
similarity index 85%
rename from include/animation/blend_animation_direct.hpp
rename to include/rive/animation/blend_animation_direct.hpp
index 910a45f..bf11233 100644
--- a/include/animation/blend_animation_direct.hpp
+++ b/include/rive/animation/blend_animation_direct.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_ANIMATION_DIRECT_HPP_
 #define _RIVE_BLEND_ANIMATION_DIRECT_HPP_
-#include "generated/animation/blend_animation_direct_base.hpp"
+#include "rive/generated/animation/blend_animation_direct_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/blend_state.hpp b/include/rive/animation/blend_state.hpp
similarity index 92%
rename from include/animation/blend_state.hpp
rename to include/rive/animation/blend_state.hpp
index 3da98cd..4d1c6bf 100644
--- a/include/animation/blend_state.hpp
+++ b/include/rive/animation/blend_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE_HPP_
 #define _RIVE_BLEND_STATE_HPP_
-#include "generated/animation/blend_state_base.hpp"
+#include "rive/generated/animation/blend_state_base.hpp"
 #include <stdio.h>
 #include <vector>
 #include <algorithm>
diff --git a/include/animation/blend_state_1d.hpp b/include/rive/animation/blend_state_1d.hpp
similarity index 82%
rename from include/animation/blend_state_1d.hpp
rename to include/rive/animation/blend_state_1d.hpp
index eac98d6..e316542 100644
--- a/include/animation/blend_state_1d.hpp
+++ b/include/rive/animation/blend_state_1d.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE1_D_HPP_
 #define _RIVE_BLEND_STATE1_D_HPP_
-#include "generated/animation/blend_state_1d_base.hpp"
+#include "rive/generated/animation/blend_state_1d_base.hpp"
 
 namespace rive
 {
diff --git a/include/animation/blend_state_1d_instance.hpp b/include/rive/animation/blend_state_1d_instance.hpp
similarity index 78%
rename from include/animation/blend_state_1d_instance.hpp
rename to include/rive/animation/blend_state_1d_instance.hpp
index df9d7a8..0dceda8 100644
--- a/include/animation/blend_state_1d_instance.hpp
+++ b/include/rive/animation/blend_state_1d_instance.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_BLEND_STATE_1D_INSTANCE_HPP_
 #define _RIVE_BLEND_STATE_1D_INSTANCE_HPP_
 
-#include "animation/blend_state_instance.hpp"
-#include "animation/blend_state_1d.hpp"
-#include "animation/blend_animation_1d.hpp"
+#include "rive/animation/blend_state_instance.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+#include "rive/animation/blend_animation_1d.hpp"
 
 namespace rive
 {
diff --git a/include/animation/blend_state_direct.hpp b/include/rive/animation/blend_state_direct.hpp
similarity index 79%
rename from include/animation/blend_state_direct.hpp
rename to include/rive/animation/blend_state_direct.hpp
index 9e64e5f..e2f44a5 100644
--- a/include/animation/blend_state_direct.hpp
+++ b/include/rive/animation/blend_state_direct.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE_DIRECT_HPP_
 #define _RIVE_BLEND_STATE_DIRECT_HPP_
-#include "generated/animation/blend_state_direct_base.hpp"
+#include "rive/generated/animation/blend_state_direct_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/blend_state_direct_instance.hpp b/include/rive/animation/blend_state_direct_instance.hpp
similarity index 71%
rename from include/animation/blend_state_direct_instance.hpp
rename to include/rive/animation/blend_state_direct_instance.hpp
index 289adeb..b0b2544 100644
--- a/include/animation/blend_state_direct_instance.hpp
+++ b/include/rive/animation/blend_state_direct_instance.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_BLEND_STATE_DIRECT_INSTANCE_HPP_
 #define _RIVE_BLEND_STATE_DIRECT_INSTANCE_HPP_
 
-#include "animation/blend_state_instance.hpp"
-#include "animation/blend_state_direct.hpp"
-#include "animation/blend_animation_direct.hpp"
+#include "rive/animation/blend_state_instance.hpp"
+#include "rive/animation/blend_state_direct.hpp"
+#include "rive/animation/blend_animation_direct.hpp"
 
 namespace rive
 {
diff --git a/include/animation/blend_state_instance.hpp b/include/rive/animation/blend_state_instance.hpp
similarity index 93%
rename from include/animation/blend_state_instance.hpp
rename to include/rive/animation/blend_state_instance.hpp
index 7ed231a..6e71517 100644
--- a/include/animation/blend_state_instance.hpp
+++ b/include/rive/animation/blend_state_instance.hpp
@@ -3,9 +3,9 @@
 
 #include <string>
 #include <vector>
-#include "animation/state_instance.hpp"
-#include "animation/blend_state.hpp"
-#include "animation/linear_animation_instance.hpp"
+#include "rive/animation/state_instance.hpp"
+#include "rive/animation/blend_state.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
 
 namespace rive
 {
diff --git a/include/animation/blend_state_transition.hpp b/include/rive/animation/blend_state_transition.hpp
similarity index 90%
rename from include/animation/blend_state_transition.hpp
rename to include/rive/animation/blend_state_transition.hpp
index 08a49eb..207b347 100644
--- a/include/animation/blend_state_transition.hpp
+++ b/include/rive/animation/blend_state_transition.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE_TRANSITION_HPP_
 #define _RIVE_BLEND_STATE_TRANSITION_HPP_
-#include "generated/animation/blend_state_transition_base.hpp"
+#include "rive/generated/animation/blend_state_transition_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/cubic_interpolator.hpp b/include/rive/animation/cubic_interpolator.hpp
similarity index 90%
rename from include/animation/cubic_interpolator.hpp
rename to include/rive/animation/cubic_interpolator.hpp
index 5ecb856..f63f4d0 100644
--- a/include/animation/cubic_interpolator.hpp
+++ b/include/rive/animation/cubic_interpolator.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_INTERPOLATOR_HPP_
 #define _RIVE_CUBIC_INTERPOLATOR_HPP_
-#include "generated/animation/cubic_interpolator_base.hpp"
+#include "rive/generated/animation/cubic_interpolator_base.hpp"
 namespace rive
 {
 	class CubicInterpolator : public CubicInterpolatorBase
diff --git a/include/animation/entry_state.hpp b/include/rive/animation/entry_state.hpp
similarity index 76%
rename from include/animation/entry_state.hpp
rename to include/rive/animation/entry_state.hpp
index 4a91324..b03e729 100644
--- a/include/animation/entry_state.hpp
+++ b/include/rive/animation/entry_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ENTRY_STATE_HPP_
 #define _RIVE_ENTRY_STATE_HPP_
-#include "generated/animation/entry_state_base.hpp"
+#include "rive/generated/animation/entry_state_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/exit_state.hpp b/include/rive/animation/exit_state.hpp
similarity index 76%
rename from include/animation/exit_state.hpp
rename to include/rive/animation/exit_state.hpp
index ea4b195..e2aad93 100644
--- a/include/animation/exit_state.hpp
+++ b/include/rive/animation/exit_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_EXIT_STATE_HPP_
 #define _RIVE_EXIT_STATE_HPP_
-#include "generated/animation/exit_state_base.hpp"
+#include "rive/generated/animation/exit_state_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/keyed_object.hpp b/include/rive/animation/keyed_object.hpp
similarity index 90%
rename from include/animation/keyed_object.hpp
rename to include/rive/animation/keyed_object.hpp
index a69c6f4..1ef31d7 100644
--- a/include/animation/keyed_object.hpp
+++ b/include/rive/animation/keyed_object.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEYED_OBJECT_HPP_
 #define _RIVE_KEYED_OBJECT_HPP_
-#include "generated/animation/keyed_object_base.hpp"
+#include "rive/generated/animation/keyed_object_base.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/animation/keyed_property.hpp b/include/rive/animation/keyed_property.hpp
similarity index 89%
rename from include/animation/keyed_property.hpp
rename to include/rive/animation/keyed_property.hpp
index 828be6c..1295f5d 100644
--- a/include/animation/keyed_property.hpp
+++ b/include/rive/animation/keyed_property.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEYED_PROPERTY_HPP_
 #define _RIVE_KEYED_PROPERTY_HPP_
-#include "generated/animation/keyed_property_base.hpp"
+#include "rive/generated/animation/keyed_property_base.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/animation/keyframe.hpp b/include/rive/animation/keyframe.hpp
similarity index 93%
rename from include/animation/keyframe.hpp
rename to include/rive/animation/keyframe.hpp
index 6c86edf..918df5d 100644
--- a/include/animation/keyframe.hpp
+++ b/include/rive/animation/keyframe.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEY_FRAME_HPP_
 #define _RIVE_KEY_FRAME_HPP_
-#include "generated/animation/keyframe_base.hpp"
+#include "rive/generated/animation/keyframe_base.hpp"
 namespace rive
 {
 	class CubicInterpolator;
diff --git a/include/animation/keyframe_color.hpp b/include/rive/animation/keyframe_color.hpp
similarity index 88%
rename from include/animation/keyframe_color.hpp
rename to include/rive/animation/keyframe_color.hpp
index e362bc9..e77bde1 100644
--- a/include/animation/keyframe_color.hpp
+++ b/include/rive/animation/keyframe_color.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEY_FRAME_COLOR_HPP_
 #define _RIVE_KEY_FRAME_COLOR_HPP_
-#include "generated/animation/keyframe_color_base.hpp"
+#include "rive/generated/animation/keyframe_color_base.hpp"
 namespace rive
 {
 	class KeyFrameColor : public KeyFrameColorBase
diff --git a/include/animation/keyframe_double.hpp b/include/rive/animation/keyframe_double.hpp
similarity index 88%
rename from include/animation/keyframe_double.hpp
rename to include/rive/animation/keyframe_double.hpp
index 7acf0c5..6ba5200 100644
--- a/include/animation/keyframe_double.hpp
+++ b/include/rive/animation/keyframe_double.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEY_FRAME_DOUBLE_HPP_
 #define _RIVE_KEY_FRAME_DOUBLE_HPP_
-#include "generated/animation/keyframe_double_base.hpp"
+#include "rive/generated/animation/keyframe_double_base.hpp"
 namespace rive
 {
 	class KeyFrameDouble : public KeyFrameDoubleBase
diff --git a/include/animation/keyframe_id.hpp b/include/rive/animation/keyframe_id.hpp
similarity index 89%
rename from include/animation/keyframe_id.hpp
rename to include/rive/animation/keyframe_id.hpp
index 6d2e05c..294de1c 100644
--- a/include/animation/keyframe_id.hpp
+++ b/include/rive/animation/keyframe_id.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_KEY_FRAME_ID_HPP_
 #define _RIVE_KEY_FRAME_ID_HPP_
-#include "generated/animation/keyframe_id_base.hpp"
+#include "rive/generated/animation/keyframe_id_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/layer_state.hpp b/include/rive/animation/layer_state.hpp
similarity index 94%
rename from include/animation/layer_state.hpp
rename to include/rive/animation/layer_state.hpp
index 932147b..ad8aefd 100644
--- a/include/animation/layer_state.hpp
+++ b/include/rive/animation/layer_state.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_LAYER_STATE_HPP_
 #define _RIVE_LAYER_STATE_HPP_
-#include "generated/animation/layer_state_base.hpp"
+#include "rive/generated/animation/layer_state_base.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/animation/linear_animation.hpp b/include/rive/animation/linear_animation.hpp
similarity index 90%
rename from include/animation/linear_animation.hpp
rename to include/rive/animation/linear_animation.hpp
index 0aba0ec..77499d9 100644
--- a/include/animation/linear_animation.hpp
+++ b/include/rive/animation/linear_animation.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_LINEAR_ANIMATION_HPP_
 #define _RIVE_LINEAR_ANIMATION_HPP_
-#include "animation/loop.hpp"
-#include "generated/animation/linear_animation_base.hpp"
+#include "rive/animation/loop.hpp"
+#include "rive/generated/animation/linear_animation_base.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/animation/linear_animation_instance.hpp b/include/rive/animation/linear_animation_instance.hpp
similarity index 98%
rename from include/animation/linear_animation_instance.hpp
rename to include/rive/animation/linear_animation_instance.hpp
index 808f6db..a803221 100644
--- a/include/animation/linear_animation_instance.hpp
+++ b/include/rive/animation/linear_animation_instance.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_LINEAR_ANIMATION_INSTANCE_HPP_
 #define _RIVE_LINEAR_ANIMATION_INSTANCE_HPP_
-#include "artboard.hpp"
+#include "rive/artboard.hpp"
 
 namespace rive
 {
diff --git a/include/animation/loop.hpp b/include/rive/animation/loop.hpp
similarity index 100%
rename from include/animation/loop.hpp
rename to include/rive/animation/loop.hpp
diff --git a/include/animation/state_instance.hpp b/include/rive/animation/state_instance.hpp
similarity index 100%
rename from include/animation/state_instance.hpp
rename to include/rive/animation/state_instance.hpp
diff --git a/include/animation/state_machine.hpp b/include/rive/animation/state_machine.hpp
similarity index 94%
rename from include/animation/state_machine.hpp
rename to include/rive/animation/state_machine.hpp
index e5089a3..bb88e43 100644
--- a/include/animation/state_machine.hpp
+++ b/include/rive/animation/state_machine.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_HPP_
 #define _RIVE_STATE_MACHINE_HPP_
-#include "generated/animation/state_machine_base.hpp"
+#include "rive/generated/animation/state_machine_base.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/animation/state_machine_bool.hpp b/include/rive/animation/state_machine_bool.hpp
similarity index 76%
rename from include/animation/state_machine_bool.hpp
rename to include/rive/animation/state_machine_bool.hpp
index 10c89bf..e80e58c 100644
--- a/include/animation/state_machine_bool.hpp
+++ b/include/rive/animation/state_machine_bool.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_BOOL_HPP_
 #define _RIVE_STATE_MACHINE_BOOL_HPP_
-#include "generated/animation/state_machine_bool_base.hpp"
+#include "rive/generated/animation/state_machine_bool_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_machine_component.hpp b/include/rive/animation/state_machine_component.hpp
similarity index 76%
rename from include/animation/state_machine_component.hpp
rename to include/rive/animation/state_machine_component.hpp
index 43b012a..831201a 100644
--- a/include/animation/state_machine_component.hpp
+++ b/include/rive/animation/state_machine_component.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_COMPONENT_HPP_
 #define _RIVE_STATE_MACHINE_COMPONENT_HPP_
-#include "generated/animation/state_machine_component_base.hpp"
+#include "rive/generated/animation/state_machine_component_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_machine_input.hpp b/include/rive/animation/state_machine_input.hpp
similarity index 85%
rename from include/animation/state_machine_input.hpp
rename to include/rive/animation/state_machine_input.hpp
index ffa8ebe..1fb5479 100644
--- a/include/animation/state_machine_input.hpp
+++ b/include/rive/animation/state_machine_input.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_INPUT_HPP_
 #define _RIVE_STATE_MACHINE_INPUT_HPP_
-#include "generated/animation/state_machine_input_base.hpp"
+#include "rive/generated/animation/state_machine_input_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_machine_input_instance.hpp b/include/rive/animation/state_machine_input_instance.hpp
similarity index 100%
rename from include/animation/state_machine_input_instance.hpp
rename to include/rive/animation/state_machine_input_instance.hpp
diff --git a/include/animation/state_machine_instance.hpp b/include/rive/animation/state_machine_instance.hpp
similarity index 96%
rename from include/animation/state_machine_instance.hpp
rename to include/rive/animation/state_machine_instance.hpp
index d81c5d0..7569ba7 100644
--- a/include/animation/state_machine_instance.hpp
+++ b/include/rive/animation/state_machine_instance.hpp
@@ -3,7 +3,7 @@
 
 #include <string>
 #include <stddef.h>
-#include "animation/linear_animation_instance.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
 
 namespace rive
 {
diff --git a/include/animation/state_machine_layer.hpp b/include/rive/animation/state_machine_layer.hpp
similarity index 94%
rename from include/animation/state_machine_layer.hpp
rename to include/rive/animation/state_machine_layer.hpp
index c83b788..3279e8d 100644
--- a/include/animation/state_machine_layer.hpp
+++ b/include/rive/animation/state_machine_layer.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_LAYER_HPP_
 #define _RIVE_STATE_MACHINE_LAYER_HPP_
-#include "generated/animation/state_machine_layer_base.hpp"
+#include "rive/generated/animation/state_machine_layer_base.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/animation/state_machine_layer_component.hpp b/include/rive/animation/state_machine_layer_component.hpp
similarity index 76%
rename from include/animation/state_machine_layer_component.hpp
rename to include/rive/animation/state_machine_layer_component.hpp
index 58a4750..25dd045 100644
--- a/include/animation/state_machine_layer_component.hpp
+++ b/include/rive/animation/state_machine_layer_component.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_LAYER_COMPONENT_HPP_
 #define _RIVE_STATE_MACHINE_LAYER_COMPONENT_HPP_
-#include "generated/animation/state_machine_layer_component_base.hpp"
+#include "rive/generated/animation/state_machine_layer_component_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_machine_number.hpp b/include/rive/animation/state_machine_number.hpp
similarity index 76%
rename from include/animation/state_machine_number.hpp
rename to include/rive/animation/state_machine_number.hpp
index c390ee0..590f40c 100644
--- a/include/animation/state_machine_number.hpp
+++ b/include/rive/animation/state_machine_number.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_NUMBER_HPP_
 #define _RIVE_STATE_MACHINE_NUMBER_HPP_
-#include "generated/animation/state_machine_number_base.hpp"
+#include "rive/generated/animation/state_machine_number_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_machine_trigger.hpp b/include/rive/animation/state_machine_trigger.hpp
similarity index 75%
rename from include/animation/state_machine_trigger.hpp
rename to include/rive/animation/state_machine_trigger.hpp
index c2f671d..50e6a7e 100644
--- a/include/animation/state_machine_trigger.hpp
+++ b/include/rive/animation/state_machine_trigger.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_TRIGGER_HPP_
 #define _RIVE_STATE_MACHINE_TRIGGER_HPP_
-#include "generated/animation/state_machine_trigger_base.hpp"
+#include "rive/generated/animation/state_machine_trigger_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/state_transition.hpp b/include/rive/animation/state_transition.hpp
similarity index 96%
rename from include/animation/state_transition.hpp
rename to include/rive/animation/state_transition.hpp
index af082d7..54a9360 100644
--- a/include/animation/state_transition.hpp
+++ b/include/rive/animation/state_transition.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_TRANSITION_HPP_
 #define _RIVE_STATE_TRANSITION_HPP_
-#include "animation/state_transition_flags.hpp"
-#include "generated/animation/state_transition_base.hpp"
+#include "rive/animation/state_transition_flags.hpp"
+#include "rive/generated/animation/state_transition_base.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/animation/state_transition_flags.hpp b/include/rive/animation/state_transition_flags.hpp
similarity index 100%
rename from include/animation/state_transition_flags.hpp
rename to include/rive/animation/state_transition_flags.hpp
diff --git a/include/animation/system_state_instance.hpp b/include/rive/animation/system_state_instance.hpp
similarity index 93%
rename from include/animation/system_state_instance.hpp
rename to include/rive/animation/system_state_instance.hpp
index 2e8b26e..68e860d 100644
--- a/include/animation/system_state_instance.hpp
+++ b/include/rive/animation/system_state_instance.hpp
@@ -2,7 +2,7 @@
 #define _RIVE_SYSTEM_STATE_INSTANCE_HPP_
 
 #include <string>
-#include "animation/state_instance.hpp"
+#include "rive/animation/state_instance.hpp"
 
 namespace rive
 {
diff --git a/include/animation/transition_bool_condition.hpp b/include/rive/animation/transition_bool_condition.hpp
similarity index 84%
rename from include/animation/transition_bool_condition.hpp
rename to include/rive/animation/transition_bool_condition.hpp
index 40a1f27..d0bd53b 100644
--- a/include/animation/transition_bool_condition.hpp
+++ b/include/rive/animation/transition_bool_condition.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_BOOL_CONDITION_HPP_
 #define _RIVE_TRANSITION_BOOL_CONDITION_HPP_
-#include "generated/animation/transition_bool_condition_base.hpp"
+#include "rive/generated/animation/transition_bool_condition_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/transition_condition.hpp b/include/rive/animation/transition_condition.hpp
similarity index 90%
rename from include/animation/transition_condition.hpp
rename to include/rive/animation/transition_condition.hpp
index b970cbd..afa2e73 100644
--- a/include/animation/transition_condition.hpp
+++ b/include/rive/animation/transition_condition.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_CONDITION_HPP_
 #define _RIVE_TRANSITION_CONDITION_HPP_
-#include "generated/animation/transition_condition_base.hpp"
+#include "rive/generated/animation/transition_condition_base.hpp"
 
 namespace rive
 {
diff --git a/include/animation/transition_condition_op.hpp b/include/rive/animation/transition_condition_op.hpp
similarity index 100%
rename from include/animation/transition_condition_op.hpp
rename to include/rive/animation/transition_condition_op.hpp
diff --git a/include/animation/transition_number_condition.hpp b/include/rive/animation/transition_number_condition.hpp
similarity index 84%
rename from include/animation/transition_number_condition.hpp
rename to include/rive/animation/transition_number_condition.hpp
index 99d49fc..092da24 100644
--- a/include/animation/transition_number_condition.hpp
+++ b/include/rive/animation/transition_number_condition.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_NUMBER_CONDITION_HPP_
 #define _RIVE_TRANSITION_NUMBER_CONDITION_HPP_
-#include "generated/animation/transition_number_condition_base.hpp"
+#include "rive/generated/animation/transition_number_condition_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/transition_trigger_condition.hpp b/include/rive/animation/transition_trigger_condition.hpp
similarity index 84%
rename from include/animation/transition_trigger_condition.hpp
rename to include/rive/animation/transition_trigger_condition.hpp
index 72f26bd..f9cc6ce 100644
--- a/include/animation/transition_trigger_condition.hpp
+++ b/include/rive/animation/transition_trigger_condition.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_TRIGGER_CONDITION_HPP_
 #define _RIVE_TRANSITION_TRIGGER_CONDITION_HPP_
-#include "generated/animation/transition_trigger_condition_base.hpp"
+#include "rive/generated/animation/transition_trigger_condition_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/animation/transition_value_condition.hpp b/include/rive/animation/transition_value_condition.hpp
similarity index 71%
rename from include/animation/transition_value_condition.hpp
rename to include/rive/animation/transition_value_condition.hpp
index 52ab1cc..f4a9124 100644
--- a/include/animation/transition_value_condition.hpp
+++ b/include/rive/animation/transition_value_condition.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSITION_VALUE_CONDITION_HPP_
 #define _RIVE_TRANSITION_VALUE_CONDITION_HPP_
-#include "generated/animation/transition_value_condition_base.hpp"
-#include "animation/transition_condition_op.hpp"
+#include "rive/generated/animation/transition_value_condition_base.hpp"
+#include "rive/animation/transition_condition_op.hpp"
 
 namespace rive
 {
diff --git a/include/artboard.hpp b/include/rive/artboard.hpp
similarity index 89%
rename from include/artboard.hpp
rename to include/rive/artboard.hpp
index 2bb9378..a7ec00c 100644
--- a/include/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -1,12 +1,12 @@
 #ifndef _RIVE_ARTBOARD_HPP_
 #define _RIVE_ARTBOARD_HPP_
-#include "animation/linear_animation.hpp"
-#include "animation/state_machine.hpp"
-#include "core_context.hpp"
-#include "generated/artboard_base.hpp"
-#include "math/aabb.hpp"
-#include "renderer.hpp"
-#include "shapes/shape_paint_container.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/core_context.hpp"
+#include "rive/generated/artboard_base.hpp"
+#include "rive/math/aabb.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/shape_paint_container.hpp"
 #include <vector>
 namespace rive
 {
@@ -22,6 +22,7 @@
 	{
 		friend class File;
 		friend class ArtboardImporter;
+		friend class Component;
 
 	private:
 		std::vector<Core*> m_Objects;
diff --git a/include/backboard.hpp b/include/rive/backboard.hpp
similarity index 76%
rename from include/backboard.hpp
rename to include/rive/backboard.hpp
index 3f743ac..1dd09c5 100644
--- a/include/backboard.hpp
+++ b/include/rive/backboard.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BACKBOARD_HPP_
 #define _RIVE_BACKBOARD_HPP_
-#include "generated/backboard_base.hpp"
+#include "rive/generated/backboard_base.hpp"
 namespace rive
 {
 	class Backboard : public BackboardBase
diff --git a/include/bones/bone.hpp b/include/rive/bones/bone.hpp
similarity index 62%
rename from include/bones/bone.hpp
rename to include/rive/bones/bone.hpp
index a01ef9d..f734b4d 100644
--- a/include/bones/bone.hpp
+++ b/include/rive/bones/bone.hpp
@@ -1,15 +1,18 @@
 #ifndef _RIVE_BONE_HPP_
 #define _RIVE_BONE_HPP_
-#include "generated/bones/bone_base.hpp"
+#include "rive/generated/bones/bone_base.hpp"
 #include <stdio.h>
 #include <vector>
 
 namespace rive
 {
+	class Constraint;
 	class Bone : public BoneBase
 	{
+
 	private:
 		std::vector<Bone*> m_ChildBones;
+		std::vector<Constraint*> m_PeerConstraints;
 
 	public:
 		StatusCode onAddedClean(CoreContext* context) override;
@@ -19,6 +22,12 @@
 		inline const std::vector<Bone*> childBones() { return m_ChildBones; }
 
 		void addChildBone(Bone* bone);
+		void tipWorldTranslation(Vec2D& result);
+		void addPeerConstraint(Constraint* peer);
+		const std::vector<Constraint*>& peerConstraints() const
+		{
+			return m_PeerConstraints;
+		}
 
 	private:
 		void lengthChanged() override;
diff --git a/include/bones/cubic_weight.hpp b/include/rive/bones/cubic_weight.hpp
similarity index 86%
rename from include/bones/cubic_weight.hpp
rename to include/rive/bones/cubic_weight.hpp
index f458bb9..9d46512 100644
--- a/include/bones/cubic_weight.hpp
+++ b/include/rive/bones/cubic_weight.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_WEIGHT_HPP_
 #define _RIVE_CUBIC_WEIGHT_HPP_
-#include "generated/bones/cubic_weight_base.hpp"
+#include "rive/generated/bones/cubic_weight_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/bones/root_bone.hpp b/include/rive/bones/root_bone.hpp
similarity index 85%
rename from include/bones/root_bone.hpp
rename to include/rive/bones/root_bone.hpp
index ce11fce..0daae39 100644
--- a/include/bones/root_bone.hpp
+++ b/include/rive/bones/root_bone.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ROOT_BONE_HPP_
 #define _RIVE_ROOT_BONE_HPP_
-#include "generated/bones/root_bone_base.hpp"
+#include "rive/generated/bones/root_bone_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/bones/skeletal_component.hpp b/include/rive/bones/skeletal_component.hpp
similarity index 77%
rename from include/bones/skeletal_component.hpp
rename to include/rive/bones/skeletal_component.hpp
index 9628d4e..401bc64 100644
--- a/include/bones/skeletal_component.hpp
+++ b/include/rive/bones/skeletal_component.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_SKELETAL_COMPONENT_HPP_
 #define _RIVE_SKELETAL_COMPONENT_HPP_
-#include "generated/bones/skeletal_component_base.hpp"
+#include "rive/generated/bones/skeletal_component_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/bones/skin.hpp b/include/rive/bones/skin.hpp
similarity index 90%
rename from include/bones/skin.hpp
rename to include/rive/bones/skin.hpp
index eb0dc1b..4d9155e 100644
--- a/include/bones/skin.hpp
+++ b/include/rive/bones/skin.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SKIN_HPP_
 #define _RIVE_SKIN_HPP_
-#include "generated/bones/skin_base.hpp"
-#include "math/mat2d.hpp"
+#include "rive/generated/bones/skin_base.hpp"
+#include "rive/math/mat2d.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/bones/skinnable.hpp b/include/rive/bones/skinnable.hpp
similarity index 100%
rename from include/bones/skinnable.hpp
rename to include/rive/bones/skinnable.hpp
diff --git a/include/bones/tendon.hpp b/include/rive/bones/tendon.hpp
similarity index 85%
rename from include/bones/tendon.hpp
rename to include/rive/bones/tendon.hpp
index aee0915..a1d4eb4 100644
--- a/include/bones/tendon.hpp
+++ b/include/rive/bones/tendon.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_TENDON_HPP_
 #define _RIVE_TENDON_HPP_
 
-#include "generated/bones/tendon_base.hpp"
-#include "math/mat2d.hpp"
+#include "rive/generated/bones/tendon_base.hpp"
+#include "rive/math/mat2d.hpp"
 #include <stdio.h>
 
 namespace rive
diff --git a/include/bones/weight.hpp b/include/rive/bones/weight.hpp
similarity index 87%
rename from include/bones/weight.hpp
rename to include/rive/bones/weight.hpp
index 8aef07d..7a14aad 100644
--- a/include/bones/weight.hpp
+++ b/include/rive/bones/weight.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_WEIGHT_HPP_
 #define _RIVE_WEIGHT_HPP_
-#include "generated/bones/weight_base.hpp"
-#include "math/vec2d.hpp"
+#include "rive/generated/bones/weight_base.hpp"
+#include "rive/math/vec2d.hpp"
 #include <stdio.h>
 
 namespace rive
diff --git a/include/command_path.hpp b/include/rive/command_path.hpp
similarity index 96%
rename from include/command_path.hpp
rename to include/rive/command_path.hpp
index e3607cb..0d3d63e 100644
--- a/include/command_path.hpp
+++ b/include/rive/command_path.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_COMMAND_PATH_HPP_
 #define _RIVE_COMMAND_PATH_HPP_
 
-#include "math/mat2d.hpp"
+#include "rive/math/mat2d.hpp"
 
 namespace rive
 {
diff --git a/include/component.hpp b/include/rive/component.hpp
similarity index 94%
rename from include/component.hpp
rename to include/rive/component.hpp
index 7a994f1..1916fa2 100644
--- a/include/component.hpp
+++ b/include/rive/component.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_COMPONENT_HPP_
 #define _RIVE_COMPONENT_HPP_
-#include "component_dirt.hpp"
-#include "generated/component_base.hpp"
+#include "rive/component_dirt.hpp"
+#include "rive/generated/component_base.hpp"
 
 #include <vector>
 
diff --git a/include/component_dirt.hpp b/include/rive/component_dirt.hpp
similarity index 100%
rename from include/component_dirt.hpp
rename to include/rive/component_dirt.hpp
diff --git a/include/rive/constraints/constraint.hpp b/include/rive/constraints/constraint.hpp
new file mode 100644
index 0000000..8e3d3aa
--- /dev/null
+++ b/include/rive/constraints/constraint.hpp
@@ -0,0 +1,24 @@
+#ifndef _RIVE_CONSTRAINT_HPP_
+#define _RIVE_CONSTRAINT_HPP_
+#include "rive/generated/constraints/constraint_base.hpp"
+#include <stdio.h>
+namespace rive
+{
+	class TransformComponent;
+	class Mat2D;
+
+	class Constraint : public ConstraintBase
+	{
+	public:
+		void strengthChanged() override;
+		StatusCode onAddedClean(CoreContext* context) override;
+		virtual void markConstraintDirty();
+		virtual void constrain(TransformComponent* component) = 0;
+		void buildDependencies() override;
+		void onDirty(ComponentDirt dirt) override;
+	};
+
+	const Mat2D& getParentWorld(const TransformComponent& component);
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/constraints/distance_constraint.hpp b/include/rive/constraints/distance_constraint.hpp
new file mode 100644
index 0000000..d195813
--- /dev/null
+++ b/include/rive/constraints/distance_constraint.hpp
@@ -0,0 +1,14 @@
+#ifndef _RIVE_DISTANCE_CONSTRAINT_HPP_
+#define _RIVE_DISTANCE_CONSTRAINT_HPP_
+#include "rive/generated/constraints/distance_constraint_base.hpp"
+#include <stdio.h>
+namespace rive
+{
+	class DistanceConstraint : public DistanceConstraintBase
+	{
+	public:
+		void constrain(TransformComponent* component) override;
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/constraints/ik_constraint.hpp b/include/rive/constraints/ik_constraint.hpp
new file mode 100644
index 0000000..24b12a7
--- /dev/null
+++ b/include/rive/constraints/ik_constraint.hpp
@@ -0,0 +1,37 @@
+#ifndef _RIVE_I_KCONSTRAINT_HPP_
+#define _RIVE_I_KCONSTRAINT_HPP_
+#include "rive/generated/constraints/ik_constraint_base.hpp"
+#include "rive/math/mat2d.hpp"
+#include "rive/math/transform_components.hpp"
+#include <stdio.h>
+#include <vector>
+
+namespace rive
+{
+	class Bone;
+	class IKConstraint : public IKConstraintBase
+	{
+	private:
+		struct BoneChainLink
+		{
+			int index;
+			Bone* bone;
+			float angle;
+			TransformComponents transformComponents;
+			Mat2D parentWorldInverse;
+		};
+		std::vector<BoneChainLink> m_FkChain;
+		void solve1(BoneChainLink* fk1, const Vec2D& worldTargetTranslation);
+		void solve2(BoneChainLink* fk1,
+		            BoneChainLink* fk2,
+		            const Vec2D& worldTargetTranslation);
+		void constrainRotation(BoneChainLink& fk, float rotation);
+
+	public:
+		void markConstraintDirty() override;
+		StatusCode onAddedClean(CoreContext* context) override;
+		void constrain(TransformComponent* component) override;
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/constraints/targeted_constraint.hpp b/include/rive/constraints/targeted_constraint.hpp
new file mode 100644
index 0000000..83e058a
--- /dev/null
+++ b/include/rive/constraints/targeted_constraint.hpp
@@ -0,0 +1,19 @@
+#ifndef _RIVE_TARGETED_CONSTRAINT_HPP_
+#define _RIVE_TARGETED_CONSTRAINT_HPP_
+#include "rive/generated/constraints/targeted_constraint_base.hpp"
+#include <stdio.h>
+namespace rive
+{
+	class TransformComponent;
+	class TargetedConstraint : public TargetedConstraintBase
+	{
+	protected:
+		TransformComponent* m_Target = nullptr;
+
+	public:
+		void buildDependencies() override;
+		StatusCode onAddedDirty(CoreContext* context) override;
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/constraints/transform_constraint.hpp b/include/rive/constraints/transform_constraint.hpp
new file mode 100644
index 0000000..20edc76
--- /dev/null
+++ b/include/rive/constraints/transform_constraint.hpp
@@ -0,0 +1,29 @@
+#ifndef _RIVE_TRANSFORM_CONSTRAINT_HPP_
+#define _RIVE_TRANSFORM_CONSTRAINT_HPP_
+#include "rive/generated/constraints/transform_constraint_base.hpp"
+#include "rive/transform_space.hpp"
+#include "rive/math/transform_components.hpp"
+
+#include <stdio.h>
+namespace rive
+{
+	class TransformConstraint : public TransformConstraintBase
+	{
+	private:
+		TransformComponents m_ComponentsA;
+		TransformComponents m_ComponentsB;
+
+	public:
+		void constrain(TransformComponent* component) override;
+		TransformSpace sourceSpace() const
+		{
+			return (TransformSpace)sourceSpaceValue();
+		}
+		TransformSpace destSpace() const
+		{
+			return (TransformSpace)destSpaceValue();
+		}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/container_component.hpp b/include/rive/container_component.hpp
similarity index 78%
rename from include/container_component.hpp
rename to include/rive/container_component.hpp
index d8bd882..01d7acd 100644
--- a/include/container_component.hpp
+++ b/include/rive/container_component.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CONTAINER_COMPONENT_HPP_
 #define _RIVE_CONTAINER_COMPONENT_HPP_
-#include "generated/container_component_base.hpp"
+#include "rive/generated/container_component_base.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/contour_render_path.hpp b/include/rive/contour_render_path.hpp
similarity index 97%
rename from include/contour_render_path.hpp
rename to include/rive/contour_render_path.hpp
index ee0a35b..cc06db2 100644
--- a/include/contour_render_path.hpp
+++ b/include/rive/contour_render_path.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_CONTOUR_RENDER_PATH_HPP_
 #define _RIVE_CONTOUR_RENDER_PATH_HPP_
 
-#include "renderer.hpp"
-#include "math/aabb.hpp"
+#include "rive/renderer.hpp"
+#include "rive/math/aabb.hpp"
 #include <vector>
 #include <cstdint>
 
diff --git a/include/contour_stroke.hpp b/include/rive/contour_stroke.hpp
similarity index 92%
rename from include/contour_stroke.hpp
rename to include/rive/contour_stroke.hpp
index 65f30d6..5bea445 100644
--- a/include/contour_stroke.hpp
+++ b/include/rive/contour_stroke.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_CONTOUR_STROKE_HPP_
 #define _RIVE_CONTOUR_STROKE_HPP_
 
-#include "renderer.hpp"
-#include "math/aabb.hpp"
+#include "rive/renderer.hpp"
+#include "rive/math/aabb.hpp"
 #include <vector>
 #include <cstdint>
 
diff --git a/include/core.hpp b/include/rive/core.hpp
similarity index 95%
rename from include/core.hpp
rename to include/rive/core.hpp
index 8177777..d38ee6a 100644
--- a/include/core.hpp
+++ b/include/rive/core.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_CORE_HPP_
 #define _RIVE_CORE_HPP_
 
-#include "core/binary_reader.hpp"
-#include "status_code.hpp"
+#include "rive/core/binary_reader.hpp"
+#include "rive/status_code.hpp"
 #include <cassert>
 
 namespace rive
diff --git a/include/core/binary_reader.hpp b/include/rive/core/binary_reader.hpp
similarity index 90%
rename from include/core/binary_reader.hpp
rename to include/rive/core/binary_reader.hpp
index c148788..f7e8627 100644
--- a/include/core/binary_reader.hpp
+++ b/include/rive/core/binary_reader.hpp
@@ -23,12 +23,12 @@
 
         size_t lengthInBytes() const;
 
-        uint64_t readVarUint();
         std::string readString();
         double readFloat64();
         float readFloat32();
         uint8_t readByte();
         uint32_t readUint32();
+        uint64_t readVarUint64(); // Reads a LEB128 encoded uint64_t
 	};
 } // namespace rive
 
diff --git a/include/core/field_types/core_bool_type.hpp b/include/rive/core/field_types/core_bool_type.hpp
similarity index 100%
rename from include/core/field_types/core_bool_type.hpp
rename to include/rive/core/field_types/core_bool_type.hpp
diff --git a/include/core/field_types/core_color_type.hpp b/include/rive/core/field_types/core_color_type.hpp
similarity index 100%
rename from include/core/field_types/core_color_type.hpp
rename to include/rive/core/field_types/core_color_type.hpp
diff --git a/include/core/field_types/core_double_type.hpp b/include/rive/core/field_types/core_double_type.hpp
similarity index 100%
rename from include/core/field_types/core_double_type.hpp
rename to include/rive/core/field_types/core_double_type.hpp
diff --git a/include/core/field_types/core_string_type.hpp b/include/rive/core/field_types/core_string_type.hpp
similarity index 100%
rename from include/core/field_types/core_string_type.hpp
rename to include/rive/core/field_types/core_string_type.hpp
diff --git a/include/core/field_types/core_uint_type.hpp b/include/rive/core/field_types/core_uint_type.hpp
similarity index 100%
rename from include/core/field_types/core_uint_type.hpp
rename to include/rive/core/field_types/core_uint_type.hpp
diff --git a/include/core/reader.h b/include/rive/core/reader.h
similarity index 100%
rename from include/core/reader.h
rename to include/rive/core/reader.h
diff --git a/include/core_context.hpp b/include/rive/core_context.hpp
similarity index 100%
rename from include/core_context.hpp
rename to include/rive/core_context.hpp
diff --git a/include/dependency_sorter.hpp b/include/rive/dependency_sorter.hpp
similarity index 100%
rename from include/dependency_sorter.hpp
rename to include/rive/dependency_sorter.hpp
diff --git a/include/draw_rules.hpp b/include/rive/draw_rules.hpp
similarity index 91%
rename from include/draw_rules.hpp
rename to include/rive/draw_rules.hpp
index 132eada..a57c17f 100644
--- a/include/draw_rules.hpp
+++ b/include/rive/draw_rules.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_DRAW_RULES_HPP_
 #define _RIVE_DRAW_RULES_HPP_
-#include "generated/draw_rules_base.hpp"
+#include "rive/generated/draw_rules_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/draw_target.hpp b/include/rive/draw_target.hpp
similarity index 88%
rename from include/draw_target.hpp
rename to include/rive/draw_target.hpp
index 13ee2be..088a5e1 100644
--- a/include/draw_target.hpp
+++ b/include/rive/draw_target.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_DRAW_TARGET_HPP_
 #define _RIVE_DRAW_TARGET_HPP_
 
-#include "draw_target_placement.hpp"
-#include "generated/draw_target_base.hpp"
+#include "rive/draw_target_placement.hpp"
+#include "rive/generated/draw_target_base.hpp"
 #include <stdio.h>
 
 namespace rive
diff --git a/include/draw_target_placement.hpp b/include/rive/draw_target_placement.hpp
similarity index 100%
rename from include/draw_target_placement.hpp
rename to include/rive/draw_target_placement.hpp
diff --git a/include/drawable.hpp b/include/rive/drawable.hpp
similarity index 92%
rename from include/drawable.hpp
rename to include/rive/drawable.hpp
index 8e12041..4bd3568 100644
--- a/include/drawable.hpp
+++ b/include/rive/drawable.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_DRAWABLE_HPP_
 #define _RIVE_DRAWABLE_HPP_
-#include "generated/drawable_base.hpp"
-#include "renderer.hpp"
+#include "rive/generated/drawable_base.hpp"
+#include "rive/renderer.hpp"
 #include <vector>
 
 namespace rive
diff --git a/include/file.hpp b/include/rive/file.hpp
similarity index 94%
rename from include/file.hpp
rename to include/rive/file.hpp
index e5fdb54..dbc0b6d 100644
--- a/include/file.hpp
+++ b/include/rive/file.hpp
@@ -1,10 +1,10 @@
 #ifndef _RIVE_FILE_HPP_
 #define _RIVE_FILE_HPP_
 
-#include "artboard.hpp"
-#include "backboard.hpp"
-#include "core/binary_reader.hpp"
-#include "runtime_header.hpp"
+#include "rive/artboard.hpp"
+#include "rive/backboard.hpp"
+#include "rive/core/binary_reader.hpp"
+#include "rive/runtime_header.hpp"
 #include <vector>
 
 ///
diff --git a/include/generated/animation/animation_base.hpp b/include/rive/generated/animation/animation_base.hpp
similarity index 93%
rename from include/generated/animation/animation_base.hpp
rename to include/rive/generated/animation/animation_base.hpp
index f5dd178..05af5c7 100644
--- a/include/generated/animation/animation_base.hpp
+++ b/include/rive/generated/animation/animation_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_ANIMATION_BASE_HPP_
 #define _RIVE_ANIMATION_BASE_HPP_
 #include <string>
-#include "core.hpp"
-#include "core/field_types/core_string_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_string_type.hpp"
 namespace rive
 {
 	class AnimationBase : public Core
diff --git a/include/generated/animation/animation_state_base.hpp b/include/rive/generated/animation/animation_state_base.hpp
similarity index 93%
rename from include/generated/animation/animation_state_base.hpp
rename to include/rive/generated/animation/animation_state_base.hpp
index d7565fd..e99f175 100644
--- a/include/generated/animation/animation_state_base.hpp
+++ b/include/rive/generated/animation/animation_state_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_ANIMATION_STATE_BASE_HPP_
 #define _RIVE_ANIMATION_STATE_BASE_HPP_
-#include "animation/layer_state.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class AnimationStateBase : public LayerState
diff --git a/include/generated/animation/any_state_base.hpp b/include/rive/generated/animation/any_state_base.hpp
similarity index 94%
rename from include/generated/animation/any_state_base.hpp
rename to include/rive/generated/animation/any_state_base.hpp
index 00df09c..c583f0f 100644
--- a/include/generated/animation/any_state_base.hpp
+++ b/include/rive/generated/animation/any_state_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ANY_STATE_BASE_HPP_
 #define _RIVE_ANY_STATE_BASE_HPP_
-#include "animation/layer_state.hpp"
+#include "rive/animation/layer_state.hpp"
 namespace rive
 {
 	class AnyStateBase : public LayerState
diff --git a/include/generated/animation/blend_animation_1d_base.hpp b/include/rive/generated/animation/blend_animation_1d_base.hpp
similarity index 82%
rename from include/generated/animation/blend_animation_1d_base.hpp
rename to include/rive/generated/animation/blend_animation_1d_base.hpp
index a1e7b6c..8735fe4 100644
--- a/include/generated/animation/blend_animation_1d_base.hpp
+++ b/include/rive/generated/animation/blend_animation_1d_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BLEND_ANIMATION1_DBASE_HPP_
 #define _RIVE_BLEND_ANIMATION1_DBASE_HPP_
-#include "animation/blend_animation.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/animation/blend_animation.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class BlendAnimation1DBase : public BlendAnimation
@@ -44,6 +44,13 @@
 			valueChanged();
 		}
 
+		Core* clone() const override;
+		void copy(const BlendAnimation1DBase& object)
+		{
+			m_Value = object.m_Value;
+			BlendAnimation::copy(object);
+		}
+
 		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
 		{
 			switch (propertyKey)
diff --git a/include/generated/animation/blend_animation_base.hpp b/include/rive/generated/animation/blend_animation_base.hpp
similarity index 87%
rename from include/generated/animation/blend_animation_base.hpp
rename to include/rive/generated/animation/blend_animation_base.hpp
index e89521f..b1100aa 100644
--- a/include/generated/animation/blend_animation_base.hpp
+++ b/include/rive/generated/animation/blend_animation_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BLEND_ANIMATION_BASE_HPP_
 #define _RIVE_BLEND_ANIMATION_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class BlendAnimationBase : public Core
@@ -43,6 +43,11 @@
 			animationIdChanged();
 		}
 
+		void copy(const BlendAnimationBase& object)
+		{
+			m_AnimationId = object.m_AnimationId;
+		}
+
 		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
 		{
 			switch (propertyKey)
diff --git a/include/generated/animation/blend_animation_direct_base.hpp b/include/rive/generated/animation/blend_animation_direct_base.hpp
similarity index 82%
rename from include/generated/animation/blend_animation_direct_base.hpp
rename to include/rive/generated/animation/blend_animation_direct_base.hpp
index 671db13..8459df3 100644
--- a/include/generated/animation/blend_animation_direct_base.hpp
+++ b/include/rive/generated/animation/blend_animation_direct_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BLEND_ANIMATION_DIRECT_BASE_HPP_
 #define _RIVE_BLEND_ANIMATION_DIRECT_BASE_HPP_
-#include "animation/blend_animation.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/blend_animation.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class BlendAnimationDirectBase : public BlendAnimation
@@ -44,6 +44,13 @@
 			inputIdChanged();
 		}
 
+		Core* clone() const override;
+		void copy(const BlendAnimationDirectBase& object)
+		{
+			m_InputId = object.m_InputId;
+			BlendAnimation::copy(object);
+		}
+
 		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
 		{
 			switch (propertyKey)
diff --git a/include/generated/animation/blend_state_1d_base.hpp b/include/rive/generated/animation/blend_state_1d_base.hpp
similarity index 84%
rename from include/generated/animation/blend_state_1d_base.hpp
rename to include/rive/generated/animation/blend_state_1d_base.hpp
index 49560ee..c61ac87 100644
--- a/include/generated/animation/blend_state_1d_base.hpp
+++ b/include/rive/generated/animation/blend_state_1d_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BLEND_STATE1_DBASE_HPP_
 #define _RIVE_BLEND_STATE1_DBASE_HPP_
-#include "animation/blend_state.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/blend_state.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class BlendState1DBase : public BlendState
@@ -46,6 +46,13 @@
 			inputIdChanged();
 		}
 
+		Core* clone() const override;
+		void copy(const BlendState1DBase& object)
+		{
+			m_InputId = object.m_InputId;
+			BlendState::copy(object);
+		}
+
 		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
 		{
 			switch (propertyKey)
diff --git a/include/generated/animation/blend_state_base.hpp b/include/rive/generated/animation/blend_state_base.hpp
similarity index 93%
rename from include/generated/animation/blend_state_base.hpp
rename to include/rive/generated/animation/blend_state_base.hpp
index 7cdf3b9..c128845 100644
--- a/include/generated/animation/blend_state_base.hpp
+++ b/include/rive/generated/animation/blend_state_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE_BASE_HPP_
 #define _RIVE_BLEND_STATE_BASE_HPP_
-#include "animation/layer_state.hpp"
+#include "rive/animation/layer_state.hpp"
 namespace rive
 {
 	class BlendStateBase : public LayerState
diff --git a/include/generated/animation/blend_state_direct_base.hpp b/include/rive/generated/animation/blend_state_direct_base.hpp
similarity index 90%
rename from include/generated/animation/blend_state_direct_base.hpp
rename to include/rive/generated/animation/blend_state_direct_base.hpp
index cb4939b..25a7622 100644
--- a/include/generated/animation/blend_state_direct_base.hpp
+++ b/include/rive/generated/animation/blend_state_direct_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BLEND_STATE_DIRECT_BASE_HPP_
 #define _RIVE_BLEND_STATE_DIRECT_BASE_HPP_
-#include "animation/blend_state.hpp"
+#include "rive/animation/blend_state.hpp"
 namespace rive
 {
 	class BlendStateDirectBase : public BlendState
@@ -29,6 +29,8 @@
 
 		uint16_t coreType() const override { return typeKey; }
 
+		Core* clone() const override;
+
 	protected:
 	};
 } // namespace rive
diff --git a/include/generated/animation/blend_state_transition_base.hpp b/include/rive/generated/animation/blend_state_transition_base.hpp
similarity index 83%
rename from include/generated/animation/blend_state_transition_base.hpp
rename to include/rive/generated/animation/blend_state_transition_base.hpp
index 9988763..40c06d6 100644
--- a/include/generated/animation/blend_state_transition_base.hpp
+++ b/include/rive/generated/animation/blend_state_transition_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BLEND_STATE_TRANSITION_BASE_HPP_
 #define _RIVE_BLEND_STATE_TRANSITION_BASE_HPP_
-#include "animation/state_transition.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class BlendStateTransitionBase : public StateTransition
@@ -48,6 +48,13 @@
 			exitBlendAnimationIdChanged();
 		}
 
+		Core* clone() const override;
+		void copy(const BlendStateTransitionBase& object)
+		{
+			m_ExitBlendAnimationId = object.m_ExitBlendAnimationId;
+			StateTransition::copy(object);
+		}
+
 		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
 		{
 			switch (propertyKey)
diff --git a/include/generated/animation/cubic_interpolator_base.hpp b/include/rive/generated/animation/cubic_interpolator_base.hpp
similarity index 96%
rename from include/generated/animation/cubic_interpolator_base.hpp
rename to include/rive/generated/animation/cubic_interpolator_base.hpp
index cfe772f..f23966f 100644
--- a/include/generated/animation/cubic_interpolator_base.hpp
+++ b/include/rive/generated/animation/cubic_interpolator_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_INTERPOLATOR_BASE_HPP_
 #define _RIVE_CUBIC_INTERPOLATOR_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class CubicInterpolatorBase : public Core
diff --git a/include/generated/animation/entry_state_base.hpp b/include/rive/generated/animation/entry_state_base.hpp
similarity index 94%
rename from include/generated/animation/entry_state_base.hpp
rename to include/rive/generated/animation/entry_state_base.hpp
index 5a13d8c..710db6d 100644
--- a/include/generated/animation/entry_state_base.hpp
+++ b/include/rive/generated/animation/entry_state_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ENTRY_STATE_BASE_HPP_
 #define _RIVE_ENTRY_STATE_BASE_HPP_
-#include "animation/layer_state.hpp"
+#include "rive/animation/layer_state.hpp"
 namespace rive
 {
 	class EntryStateBase : public LayerState
diff --git a/include/generated/animation/exit_state_base.hpp b/include/rive/generated/animation/exit_state_base.hpp
similarity index 94%
rename from include/generated/animation/exit_state_base.hpp
rename to include/rive/generated/animation/exit_state_base.hpp
index 35d4b96..0a0d351 100644
--- a/include/generated/animation/exit_state_base.hpp
+++ b/include/rive/generated/animation/exit_state_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_EXIT_STATE_BASE_HPP_
 #define _RIVE_EXIT_STATE_BASE_HPP_
-#include "animation/layer_state.hpp"
+#include "rive/animation/layer_state.hpp"
 namespace rive
 {
 	class ExitStateBase : public LayerState
diff --git a/include/generated/animation/keyed_object_base.hpp b/include/rive/generated/animation/keyed_object_base.hpp
similarity index 93%
rename from include/generated/animation/keyed_object_base.hpp
rename to include/rive/generated/animation/keyed_object_base.hpp
index 483422a..8d4e845 100644
--- a/include/generated/animation/keyed_object_base.hpp
+++ b/include/rive/generated/animation/keyed_object_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEYED_OBJECT_BASE_HPP_
 #define _RIVE_KEYED_OBJECT_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class KeyedObjectBase : public Core
diff --git a/include/generated/animation/keyed_property_base.hpp b/include/rive/generated/animation/keyed_property_base.hpp
similarity index 94%
rename from include/generated/animation/keyed_property_base.hpp
rename to include/rive/generated/animation/keyed_property_base.hpp
index f555a96..8719b51 100644
--- a/include/generated/animation/keyed_property_base.hpp
+++ b/include/rive/generated/animation/keyed_property_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEYED_PROPERTY_BASE_HPP_
 #define _RIVE_KEYED_PROPERTY_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class KeyedPropertyBase : public Core
diff --git a/include/generated/animation/keyframe_base.hpp b/include/rive/generated/animation/keyframe_base.hpp
similarity index 96%
rename from include/generated/animation/keyframe_base.hpp
rename to include/rive/generated/animation/keyframe_base.hpp
index 38e2206..6d9d6b4 100644
--- a/include/generated/animation/keyframe_base.hpp
+++ b/include/rive/generated/animation/keyframe_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEY_FRAME_BASE_HPP_
 #define _RIVE_KEY_FRAME_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class KeyFrameBase : public Core
diff --git a/include/generated/animation/keyframe_color_base.hpp b/include/rive/generated/animation/keyframe_color_base.hpp
similarity index 93%
rename from include/generated/animation/keyframe_color_base.hpp
rename to include/rive/generated/animation/keyframe_color_base.hpp
index 56c5561..4ebc90d 100644
--- a/include/generated/animation/keyframe_color_base.hpp
+++ b/include/rive/generated/animation/keyframe_color_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEY_FRAME_COLOR_BASE_HPP_
 #define _RIVE_KEY_FRAME_COLOR_BASE_HPP_
-#include "animation/keyframe.hpp"
-#include "core/field_types/core_color_type.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/core/field_types/core_color_type.hpp"
 namespace rive
 {
 	class KeyFrameColorBase : public KeyFrame
diff --git a/include/generated/animation/keyframe_double_base.hpp b/include/rive/generated/animation/keyframe_double_base.hpp
similarity index 93%
rename from include/generated/animation/keyframe_double_base.hpp
rename to include/rive/generated/animation/keyframe_double_base.hpp
index b6b0c2f..5712aa0 100644
--- a/include/generated/animation/keyframe_double_base.hpp
+++ b/include/rive/generated/animation/keyframe_double_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEY_FRAME_DOUBLE_BASE_HPP_
 #define _RIVE_KEY_FRAME_DOUBLE_BASE_HPP_
-#include "animation/keyframe.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class KeyFrameDoubleBase : public KeyFrame
diff --git a/include/generated/animation/keyframe_id_base.hpp b/include/rive/generated/animation/keyframe_id_base.hpp
similarity index 93%
rename from include/generated/animation/keyframe_id_base.hpp
rename to include/rive/generated/animation/keyframe_id_base.hpp
index fb0f872..d744e64 100644
--- a/include/generated/animation/keyframe_id_base.hpp
+++ b/include/rive/generated/animation/keyframe_id_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEY_FRAME_ID_BASE_HPP_
 #define _RIVE_KEY_FRAME_ID_BASE_HPP_
-#include "animation/keyframe.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class KeyFrameIdBase : public KeyFrame
diff --git a/include/generated/animation/layer_state_base.hpp b/include/rive/generated/animation/layer_state_base.hpp
similarity index 91%
rename from include/generated/animation/layer_state_base.hpp
rename to include/rive/generated/animation/layer_state_base.hpp
index 6058c97..6b7515e 100644
--- a/include/generated/animation/layer_state_base.hpp
+++ b/include/rive/generated/animation/layer_state_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_LAYER_STATE_BASE_HPP_
 #define _RIVE_LAYER_STATE_BASE_HPP_
-#include "animation/state_machine_layer_component.hpp"
+#include "rive/animation/state_machine_layer_component.hpp"
 namespace rive
 {
 	class LayerStateBase : public StateMachineLayerComponent
diff --git a/include/generated/animation/linear_animation_base.hpp b/include/rive/generated/animation/linear_animation_base.hpp
similarity index 94%
rename from include/generated/animation/linear_animation_base.hpp
rename to include/rive/generated/animation/linear_animation_base.hpp
index 2cc606c..3a50d02 100644
--- a/include/generated/animation/linear_animation_base.hpp
+++ b/include/rive/generated/animation/linear_animation_base.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_LINEAR_ANIMATION_BASE_HPP_
 #define _RIVE_LINEAR_ANIMATION_BASE_HPP_
-#include "animation/animation.hpp"
-#include "core/field_types/core_bool_type.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/animation.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class LinearAnimationBase : public Animation
diff --git a/include/generated/animation/state_machine_base.hpp b/include/rive/generated/animation/state_machine_base.hpp
similarity index 94%
rename from include/generated/animation/state_machine_base.hpp
rename to include/rive/generated/animation/state_machine_base.hpp
index 521ab32..b58972a 100644
--- a/include/generated/animation/state_machine_base.hpp
+++ b/include/rive/generated/animation/state_machine_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_BASE_HPP_
 #define _RIVE_STATE_MACHINE_BASE_HPP_
-#include "animation/animation.hpp"
+#include "rive/animation/animation.hpp"
 namespace rive
 {
 	class StateMachineBase : public Animation
diff --git a/include/generated/animation/state_machine_bool_base.hpp b/include/rive/generated/animation/state_machine_bool_base.hpp
similarity index 93%
rename from include/generated/animation/state_machine_bool_base.hpp
rename to include/rive/generated/animation/state_machine_bool_base.hpp
index 2e1847a..91a2a5b 100644
--- a/include/generated/animation/state_machine_bool_base.hpp
+++ b/include/rive/generated/animation/state_machine_bool_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_MACHINE_BOOL_BASE_HPP_
 #define _RIVE_STATE_MACHINE_BOOL_BASE_HPP_
-#include "animation/state_machine_input.hpp"
-#include "core/field_types/core_bool_type.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
 namespace rive
 {
 	class StateMachineBoolBase : public StateMachineInput
diff --git a/include/generated/animation/state_machine_component_base.hpp b/include/rive/generated/animation/state_machine_component_base.hpp
similarity index 93%
rename from include/generated/animation/state_machine_component_base.hpp
rename to include/rive/generated/animation/state_machine_component_base.hpp
index 5c7606a..952ca18 100644
--- a/include/generated/animation/state_machine_component_base.hpp
+++ b/include/rive/generated/animation/state_machine_component_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_STATE_MACHINE_COMPONENT_BASE_HPP_
 #define _RIVE_STATE_MACHINE_COMPONENT_BASE_HPP_
 #include <string>
-#include "core.hpp"
-#include "core/field_types/core_string_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_string_type.hpp"
 namespace rive
 {
 	class StateMachineComponentBase : public Core
diff --git a/include/generated/animation/state_machine_input_base.hpp b/include/rive/generated/animation/state_machine_input_base.hpp
similarity index 92%
rename from include/generated/animation/state_machine_input_base.hpp
rename to include/rive/generated/animation/state_machine_input_base.hpp
index 0c42473..2f6c94b 100644
--- a/include/generated/animation/state_machine_input_base.hpp
+++ b/include/rive/generated/animation/state_machine_input_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_INPUT_BASE_HPP_
 #define _RIVE_STATE_MACHINE_INPUT_BASE_HPP_
-#include "animation/state_machine_component.hpp"
+#include "rive/animation/state_machine_component.hpp"
 namespace rive
 {
 	class StateMachineInputBase : public StateMachineComponent
diff --git a/include/generated/animation/state_machine_layer_base.hpp b/include/rive/generated/animation/state_machine_layer_base.hpp
similarity index 92%
rename from include/generated/animation/state_machine_layer_base.hpp
rename to include/rive/generated/animation/state_machine_layer_base.hpp
index d31605a..d3d82b4 100644
--- a/include/generated/animation/state_machine_layer_base.hpp
+++ b/include/rive/generated/animation/state_machine_layer_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_LAYER_BASE_HPP_
 #define _RIVE_STATE_MACHINE_LAYER_BASE_HPP_
-#include "animation/state_machine_component.hpp"
+#include "rive/animation/state_machine_component.hpp"
 namespace rive
 {
 	class StateMachineLayerBase : public StateMachineComponent
diff --git a/include/generated/animation/state_machine_layer_component_base.hpp b/include/rive/generated/animation/state_machine_layer_component_base.hpp
similarity index 96%
rename from include/generated/animation/state_machine_layer_component_base.hpp
rename to include/rive/generated/animation/state_machine_layer_component_base.hpp
index b332be9..5d02da5 100644
--- a/include/generated/animation/state_machine_layer_component_base.hpp
+++ b/include/rive/generated/animation/state_machine_layer_component_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_LAYER_COMPONENT_BASE_HPP_
 #define _RIVE_STATE_MACHINE_LAYER_COMPONENT_BASE_HPP_
-#include "core.hpp"
+#include "rive/core.hpp"
 namespace rive
 {
 	class StateMachineLayerComponentBase : public Core
diff --git a/include/generated/animation/state_machine_number_base.hpp b/include/rive/generated/animation/state_machine_number_base.hpp
similarity index 93%
rename from include/generated/animation/state_machine_number_base.hpp
rename to include/rive/generated/animation/state_machine_number_base.hpp
index c4f2193..7979fa8 100644
--- a/include/generated/animation/state_machine_number_base.hpp
+++ b/include/rive/generated/animation/state_machine_number_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_MACHINE_NUMBER_BASE_HPP_
 #define _RIVE_STATE_MACHINE_NUMBER_BASE_HPP_
-#include "animation/state_machine_input.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class StateMachineNumberBase : public StateMachineInput
diff --git a/include/generated/animation/state_machine_trigger_base.hpp b/include/rive/generated/animation/state_machine_trigger_base.hpp
similarity index 93%
rename from include/generated/animation/state_machine_trigger_base.hpp
rename to include/rive/generated/animation/state_machine_trigger_base.hpp
index 4d2d27f..7a8ea20 100644
--- a/include/generated/animation/state_machine_trigger_base.hpp
+++ b/include/rive/generated/animation/state_machine_trigger_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STATE_MACHINE_TRIGGER_BASE_HPP_
 #define _RIVE_STATE_MACHINE_TRIGGER_BASE_HPP_
-#include "animation/state_machine_input.hpp"
+#include "rive/animation/state_machine_input.hpp"
 namespace rive
 {
 	class StateMachineTriggerBase : public StateMachineInput
diff --git a/include/generated/animation/state_transition_base.hpp b/include/rive/generated/animation/state_transition_base.hpp
similarity index 95%
rename from include/generated/animation/state_transition_base.hpp
rename to include/rive/generated/animation/state_transition_base.hpp
index b7d519a..a74decc 100644
--- a/include/generated/animation/state_transition_base.hpp
+++ b/include/rive/generated/animation/state_transition_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_TRANSITION_BASE_HPP_
 #define _RIVE_STATE_TRANSITION_BASE_HPP_
-#include "animation/state_machine_layer_component.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/state_machine_layer_component.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class StateTransitionBase : public StateMachineLayerComponent
diff --git a/include/generated/animation/transition_bool_condition_base.hpp b/include/rive/generated/animation/transition_bool_condition_base.hpp
similarity index 93%
rename from include/generated/animation/transition_bool_condition_base.hpp
rename to include/rive/generated/animation/transition_bool_condition_base.hpp
index 933bbf4..66c4d2d 100644
--- a/include/generated/animation/transition_bool_condition_base.hpp
+++ b/include/rive/generated/animation/transition_bool_condition_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_BOOL_CONDITION_BASE_HPP_
 #define _RIVE_TRANSITION_BOOL_CONDITION_BASE_HPP_
-#include "animation/transition_value_condition.hpp"
+#include "rive/animation/transition_value_condition.hpp"
 namespace rive
 {
 	class TransitionBoolConditionBase : public TransitionValueCondition
diff --git a/include/generated/animation/transition_condition_base.hpp b/include/rive/generated/animation/transition_condition_base.hpp
similarity index 93%
rename from include/generated/animation/transition_condition_base.hpp
rename to include/rive/generated/animation/transition_condition_base.hpp
index 2b44ce7..896b1a9 100644
--- a/include/generated/animation/transition_condition_base.hpp
+++ b/include/rive/generated/animation/transition_condition_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSITION_CONDITION_BASE_HPP_
 #define _RIVE_TRANSITION_CONDITION_BASE_HPP_
-#include "core.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class TransitionConditionBase : public Core
diff --git a/include/generated/animation/transition_number_condition_base.hpp b/include/rive/generated/animation/transition_number_condition_base.hpp
similarity index 92%
rename from include/generated/animation/transition_number_condition_base.hpp
rename to include/rive/generated/animation/transition_number_condition_base.hpp
index d7877d0..81008cf 100644
--- a/include/generated/animation/transition_number_condition_base.hpp
+++ b/include/rive/generated/animation/transition_number_condition_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSITION_NUMBER_CONDITION_BASE_HPP_
 #define _RIVE_TRANSITION_NUMBER_CONDITION_BASE_HPP_
-#include "animation/transition_value_condition.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/animation/transition_value_condition.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class TransitionNumberConditionBase : public TransitionValueCondition
diff --git a/include/generated/animation/transition_trigger_condition_base.hpp b/include/rive/generated/animation/transition_trigger_condition_base.hpp
similarity index 93%
rename from include/generated/animation/transition_trigger_condition_base.hpp
rename to include/rive/generated/animation/transition_trigger_condition_base.hpp
index 06bc7de..f3c50ec 100644
--- a/include/generated/animation/transition_trigger_condition_base.hpp
+++ b/include/rive/generated/animation/transition_trigger_condition_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRANSITION_TRIGGER_CONDITION_BASE_HPP_
 #define _RIVE_TRANSITION_TRIGGER_CONDITION_BASE_HPP_
-#include "animation/transition_condition.hpp"
+#include "rive/animation/transition_condition.hpp"
 namespace rive
 {
 	class TransitionTriggerConditionBase : public TransitionCondition
diff --git a/include/generated/animation/transition_value_condition_base.hpp b/include/rive/generated/animation/transition_value_condition_base.hpp
similarity index 93%
rename from include/generated/animation/transition_value_condition_base.hpp
rename to include/rive/generated/animation/transition_value_condition_base.hpp
index 38caa6a..022064c 100644
--- a/include/generated/animation/transition_value_condition_base.hpp
+++ b/include/rive/generated/animation/transition_value_condition_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSITION_VALUE_CONDITION_BASE_HPP_
 #define _RIVE_TRANSITION_VALUE_CONDITION_BASE_HPP_
-#include "animation/transition_condition.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/animation/transition_condition.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class TransitionValueConditionBase : public TransitionCondition
diff --git a/include/generated/artboard_base.hpp b/include/rive/generated/artboard_base.hpp
similarity index 96%
rename from include/generated/artboard_base.hpp
rename to include/rive/generated/artboard_base.hpp
index 14b5b5e..e6229bb 100644
--- a/include/generated/artboard_base.hpp
+++ b/include/rive/generated/artboard_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_ARTBOARD_BASE_HPP_
 #define _RIVE_ARTBOARD_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class ArtboardBase : public ContainerComponent
diff --git a/include/generated/backboard_base.hpp b/include/rive/generated/backboard_base.hpp
similarity index 96%
rename from include/generated/backboard_base.hpp
rename to include/rive/generated/backboard_base.hpp
index 28d95d7..60e37f3 100644
--- a/include/generated/backboard_base.hpp
+++ b/include/rive/generated/backboard_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_BACKBOARD_BASE_HPP_
 #define _RIVE_BACKBOARD_BASE_HPP_
-#include "core.hpp"
+#include "rive/core.hpp"
 namespace rive
 {
 	class BackboardBase : public Core
diff --git a/include/generated/bones/bone_base.hpp b/include/rive/generated/bones/bone_base.hpp
similarity index 93%
rename from include/generated/bones/bone_base.hpp
rename to include/rive/generated/bones/bone_base.hpp
index 8ebf1c9..e6df26e 100644
--- a/include/generated/bones/bone_base.hpp
+++ b/include/rive/generated/bones/bone_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_BONE_BASE_HPP_
 #define _RIVE_BONE_BASE_HPP_
-#include "bones/skeletal_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/bones/skeletal_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class BoneBase : public SkeletalComponent
diff --git a/include/generated/bones/cubic_weight_base.hpp b/include/rive/generated/bones/cubic_weight_base.hpp
similarity index 96%
rename from include/generated/bones/cubic_weight_base.hpp
rename to include/rive/generated/bones/cubic_weight_base.hpp
index fbc0954..19dbc97 100644
--- a/include/generated/bones/cubic_weight_base.hpp
+++ b/include/rive/generated/bones/cubic_weight_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_WEIGHT_BASE_HPP_
 #define _RIVE_CUBIC_WEIGHT_BASE_HPP_
-#include "bones/weight.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/bones/weight.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class CubicWeightBase : public Weight
diff --git a/include/generated/bones/root_bone_base.hpp b/include/rive/generated/bones/root_bone_base.hpp
similarity index 95%
rename from include/generated/bones/root_bone_base.hpp
rename to include/rive/generated/bones/root_bone_base.hpp
index 464d165..8c869ef 100644
--- a/include/generated/bones/root_bone_base.hpp
+++ b/include/rive/generated/bones/root_bone_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_ROOT_BONE_BASE_HPP_
 #define _RIVE_ROOT_BONE_BASE_HPP_
-#include "bones/bone.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class RootBoneBase : public Bone
diff --git a/include/generated/bones/skeletal_component_base.hpp b/include/rive/generated/bones/skeletal_component_base.hpp
similarity index 94%
rename from include/generated/bones/skeletal_component_base.hpp
rename to include/rive/generated/bones/skeletal_component_base.hpp
index 36fb59b..f31fe37 100644
--- a/include/generated/bones/skeletal_component_base.hpp
+++ b/include/rive/generated/bones/skeletal_component_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_SKELETAL_COMPONENT_BASE_HPP_
 #define _RIVE_SKELETAL_COMPONENT_BASE_HPP_
-#include "transform_component.hpp"
+#include "rive/transform_component.hpp"
 namespace rive
 {
 	class SkeletalComponentBase : public TransformComponent
diff --git a/include/generated/bones/skin_base.hpp b/include/rive/generated/bones/skin_base.hpp
similarity index 96%
rename from include/generated/bones/skin_base.hpp
rename to include/rive/generated/bones/skin_base.hpp
index 7a5aa99..0126a8e 100644
--- a/include/generated/bones/skin_base.hpp
+++ b/include/rive/generated/bones/skin_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SKIN_BASE_HPP_
 #define _RIVE_SKIN_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class SkinBase : public ContainerComponent
diff --git a/include/generated/bones/tendon_base.hpp b/include/rive/generated/bones/tendon_base.hpp
similarity index 95%
rename from include/generated/bones/tendon_base.hpp
rename to include/rive/generated/bones/tendon_base.hpp
index 164b720..b80bb0b 100644
--- a/include/generated/bones/tendon_base.hpp
+++ b/include/rive/generated/bones/tendon_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_TENDON_BASE_HPP_
 #define _RIVE_TENDON_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class TendonBase : public Component
diff --git a/include/generated/bones/weight_base.hpp b/include/rive/generated/bones/weight_base.hpp
similarity index 95%
rename from include/generated/bones/weight_base.hpp
rename to include/rive/generated/bones/weight_base.hpp
index d3b9ef6..602db43 100644
--- a/include/generated/bones/weight_base.hpp
+++ b/include/rive/generated/bones/weight_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_WEIGHT_BASE_HPP_
 #define _RIVE_WEIGHT_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class WeightBase : public Component
diff --git a/include/generated/component_base.hpp b/include/rive/generated/component_base.hpp
similarity index 92%
rename from include/generated/component_base.hpp
rename to include/rive/generated/component_base.hpp
index 14cc189..b08927b 100644
--- a/include/generated/component_base.hpp
+++ b/include/rive/generated/component_base.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_COMPONENT_BASE_HPP_
 #define _RIVE_COMPONENT_BASE_HPP_
 #include <string>
-#include "core.hpp"
-#include "core/field_types/core_string_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/core.hpp"
+#include "rive/core/field_types/core_string_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class ComponentBase : public Core
diff --git a/include/rive/generated/constraints/constraint_base.hpp b/include/rive/generated/constraints/constraint_base.hpp
new file mode 100644
index 0000000..5f4d3b5
--- /dev/null
+++ b/include/rive/generated/constraints/constraint_base.hpp
@@ -0,0 +1,69 @@
+#ifndef _RIVE_CONSTRAINT_BASE_HPP_
+#define _RIVE_CONSTRAINT_BASE_HPP_
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+namespace rive
+{
+	class ConstraintBase : public Component
+	{
+	protected:
+		typedef Component Super;
+
+	public:
+		static const uint16_t typeKey = 79;
+
+		/// Helper to quickly determine if a core object extends another without
+		/// RTTI at runtime.
+		bool isTypeOf(uint16_t typeKey) const override
+		{
+			switch (typeKey)
+			{
+				case ConstraintBase::typeKey:
+				case ComponentBase::typeKey:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		uint16_t coreType() const override { return typeKey; }
+
+		static const uint16_t strengthPropertyKey = 172;
+
+	private:
+		float m_Strength = 1.0f;
+	public:
+		inline float strength() const { return m_Strength; }
+		void strength(float value)
+		{
+			if (m_Strength == value)
+			{
+				return;
+			}
+			m_Strength = value;
+			strengthChanged();
+		}
+
+		void copy(const ConstraintBase& object)
+		{
+			m_Strength = object.m_Strength;
+			Component::copy(object);
+		}
+
+		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
+		{
+			switch (propertyKey)
+			{
+				case strengthPropertyKey:
+					m_Strength = CoreDoubleType::deserialize(reader);
+					return true;
+			}
+			return Component::deserialize(propertyKey, reader);
+		}
+
+	protected:
+		virtual void strengthChanged() {}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/constraints/distance_constraint_base.hpp b/include/rive/generated/constraints/distance_constraint_base.hpp
new file mode 100644
index 0000000..fa96847
--- /dev/null
+++ b/include/rive/generated/constraints/distance_constraint_base.hpp
@@ -0,0 +1,91 @@
+#ifndef _RIVE_DISTANCE_CONSTRAINT_BASE_HPP_
+#define _RIVE_DISTANCE_CONSTRAINT_BASE_HPP_
+#include "rive/constraints/targeted_constraint.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+namespace rive
+{
+	class DistanceConstraintBase : public TargetedConstraint
+	{
+	protected:
+		typedef TargetedConstraint Super;
+
+	public:
+		static const uint16_t typeKey = 82;
+
+		/// Helper to quickly determine if a core object extends another without
+		/// RTTI at runtime.
+		bool isTypeOf(uint16_t typeKey) const override
+		{
+			switch (typeKey)
+			{
+				case DistanceConstraintBase::typeKey:
+				case TargetedConstraintBase::typeKey:
+				case ConstraintBase::typeKey:
+				case ComponentBase::typeKey:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		uint16_t coreType() const override { return typeKey; }
+
+		static const uint16_t distancePropertyKey = 177;
+		static const uint16_t modeValuePropertyKey = 178;
+
+	private:
+		float m_Distance = 100.0f;
+		int m_ModeValue = 0;
+	public:
+		inline float distance() const { return m_Distance; }
+		void distance(float value)
+		{
+			if (m_Distance == value)
+			{
+				return;
+			}
+			m_Distance = value;
+			distanceChanged();
+		}
+
+		inline int modeValue() const { return m_ModeValue; }
+		void modeValue(int value)
+		{
+			if (m_ModeValue == value)
+			{
+				return;
+			}
+			m_ModeValue = value;
+			modeValueChanged();
+		}
+
+		Core* clone() const override;
+		void copy(const DistanceConstraintBase& object)
+		{
+			m_Distance = object.m_Distance;
+			m_ModeValue = object.m_ModeValue;
+			TargetedConstraint::copy(object);
+		}
+
+		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
+		{
+			switch (propertyKey)
+			{
+				case distancePropertyKey:
+					m_Distance = CoreDoubleType::deserialize(reader);
+					return true;
+				case modeValuePropertyKey:
+					m_ModeValue = CoreUintType::deserialize(reader);
+					return true;
+			}
+			return TargetedConstraint::deserialize(propertyKey, reader);
+		}
+
+	protected:
+		virtual void distanceChanged() {}
+		virtual void modeValueChanged() {}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/constraints/ik_constraint_base.hpp b/include/rive/generated/constraints/ik_constraint_base.hpp
new file mode 100644
index 0000000..3029c4e
--- /dev/null
+++ b/include/rive/generated/constraints/ik_constraint_base.hpp
@@ -0,0 +1,91 @@
+#ifndef _RIVE_I_KCONSTRAINT_BASE_HPP_
+#define _RIVE_I_KCONSTRAINT_BASE_HPP_
+#include "rive/constraints/targeted_constraint.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+namespace rive
+{
+	class IKConstraintBase : public TargetedConstraint
+	{
+	protected:
+		typedef TargetedConstraint Super;
+
+	public:
+		static const uint16_t typeKey = 81;
+
+		/// Helper to quickly determine if a core object extends another without
+		/// RTTI at runtime.
+		bool isTypeOf(uint16_t typeKey) const override
+		{
+			switch (typeKey)
+			{
+				case IKConstraintBase::typeKey:
+				case TargetedConstraintBase::typeKey:
+				case ConstraintBase::typeKey:
+				case ComponentBase::typeKey:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		uint16_t coreType() const override { return typeKey; }
+
+		static const uint16_t invertDirectionPropertyKey = 174;
+		static const uint16_t parentBoneCountPropertyKey = 175;
+
+	private:
+		bool m_InvertDirection = false;
+		int m_ParentBoneCount = 0;
+	public:
+		inline bool invertDirection() const { return m_InvertDirection; }
+		void invertDirection(bool value)
+		{
+			if (m_InvertDirection == value)
+			{
+				return;
+			}
+			m_InvertDirection = value;
+			invertDirectionChanged();
+		}
+
+		inline int parentBoneCount() const { return m_ParentBoneCount; }
+		void parentBoneCount(int value)
+		{
+			if (m_ParentBoneCount == value)
+			{
+				return;
+			}
+			m_ParentBoneCount = value;
+			parentBoneCountChanged();
+		}
+
+		Core* clone() const override;
+		void copy(const IKConstraintBase& object)
+		{
+			m_InvertDirection = object.m_InvertDirection;
+			m_ParentBoneCount = object.m_ParentBoneCount;
+			TargetedConstraint::copy(object);
+		}
+
+		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
+		{
+			switch (propertyKey)
+			{
+				case invertDirectionPropertyKey:
+					m_InvertDirection = CoreBoolType::deserialize(reader);
+					return true;
+				case parentBoneCountPropertyKey:
+					m_ParentBoneCount = CoreUintType::deserialize(reader);
+					return true;
+			}
+			return TargetedConstraint::deserialize(propertyKey, reader);
+		}
+
+	protected:
+		virtual void invertDirectionChanged() {}
+		virtual void parentBoneCountChanged() {}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/constraints/targeted_constraint_base.hpp b/include/rive/generated/constraints/targeted_constraint_base.hpp
new file mode 100644
index 0000000..192991a
--- /dev/null
+++ b/include/rive/generated/constraints/targeted_constraint_base.hpp
@@ -0,0 +1,70 @@
+#ifndef _RIVE_TARGETED_CONSTRAINT_BASE_HPP_
+#define _RIVE_TARGETED_CONSTRAINT_BASE_HPP_
+#include "rive/constraints/constraint.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+namespace rive
+{
+	class TargetedConstraintBase : public Constraint
+	{
+	protected:
+		typedef Constraint Super;
+
+	public:
+		static const uint16_t typeKey = 80;
+
+		/// Helper to quickly determine if a core object extends another without
+		/// RTTI at runtime.
+		bool isTypeOf(uint16_t typeKey) const override
+		{
+			switch (typeKey)
+			{
+				case TargetedConstraintBase::typeKey:
+				case ConstraintBase::typeKey:
+				case ComponentBase::typeKey:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		uint16_t coreType() const override { return typeKey; }
+
+		static const uint16_t targetIdPropertyKey = 173;
+
+	private:
+		int m_TargetId = -1;
+	public:
+		inline int targetId() const { return m_TargetId; }
+		void targetId(int value)
+		{
+			if (m_TargetId == value)
+			{
+				return;
+			}
+			m_TargetId = value;
+			targetIdChanged();
+		}
+
+		void copy(const TargetedConstraintBase& object)
+		{
+			m_TargetId = object.m_TargetId;
+			Constraint::copy(object);
+		}
+
+		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
+		{
+			switch (propertyKey)
+			{
+				case targetIdPropertyKey:
+					m_TargetId = CoreUintType::deserialize(reader);
+					return true;
+			}
+			return Constraint::deserialize(propertyKey, reader);
+		}
+
+	protected:
+		virtual void targetIdChanged() {}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/generated/constraints/transform_constraint_base.hpp b/include/rive/generated/constraints/transform_constraint_base.hpp
new file mode 100644
index 0000000..9a71ce8
--- /dev/null
+++ b/include/rive/generated/constraints/transform_constraint_base.hpp
@@ -0,0 +1,90 @@
+#ifndef _RIVE_TRANSFORM_CONSTRAINT_BASE_HPP_
+#define _RIVE_TRANSFORM_CONSTRAINT_BASE_HPP_
+#include "rive/constraints/targeted_constraint.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+namespace rive
+{
+	class TransformConstraintBase : public TargetedConstraint
+	{
+	protected:
+		typedef TargetedConstraint Super;
+
+	public:
+		static const uint16_t typeKey = 83;
+
+		/// Helper to quickly determine if a core object extends another without
+		/// RTTI at runtime.
+		bool isTypeOf(uint16_t typeKey) const override
+		{
+			switch (typeKey)
+			{
+				case TransformConstraintBase::typeKey:
+				case TargetedConstraintBase::typeKey:
+				case ConstraintBase::typeKey:
+				case ComponentBase::typeKey:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		uint16_t coreType() const override { return typeKey; }
+
+		static const uint16_t sourceSpaceValuePropertyKey = 179;
+		static const uint16_t destSpaceValuePropertyKey = 180;
+
+	private:
+		int m_SourceSpaceValue = 0;
+		int m_DestSpaceValue = 0;
+	public:
+		inline int sourceSpaceValue() const { return m_SourceSpaceValue; }
+		void sourceSpaceValue(int value)
+		{
+			if (m_SourceSpaceValue == value)
+			{
+				return;
+			}
+			m_SourceSpaceValue = value;
+			sourceSpaceValueChanged();
+		}
+
+		inline int destSpaceValue() const { return m_DestSpaceValue; }
+		void destSpaceValue(int value)
+		{
+			if (m_DestSpaceValue == value)
+			{
+				return;
+			}
+			m_DestSpaceValue = value;
+			destSpaceValueChanged();
+		}
+
+		Core* clone() const override;
+		void copy(const TransformConstraintBase& object)
+		{
+			m_SourceSpaceValue = object.m_SourceSpaceValue;
+			m_DestSpaceValue = object.m_DestSpaceValue;
+			TargetedConstraint::copy(object);
+		}
+
+		bool deserialize(uint16_t propertyKey, BinaryReader& reader) override
+		{
+			switch (propertyKey)
+			{
+				case sourceSpaceValuePropertyKey:
+					m_SourceSpaceValue = CoreUintType::deserialize(reader);
+					return true;
+				case destSpaceValuePropertyKey:
+					m_DestSpaceValue = CoreUintType::deserialize(reader);
+					return true;
+			}
+			return TargetedConstraint::deserialize(propertyKey, reader);
+		}
+
+	protected:
+		virtual void sourceSpaceValueChanged() {}
+		virtual void destSpaceValueChanged() {}
+	};
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/generated/container_component_base.hpp b/include/rive/generated/container_component_base.hpp
similarity index 95%
rename from include/generated/container_component_base.hpp
rename to include/rive/generated/container_component_base.hpp
index 25cc2c0..f57c81d 100644
--- a/include/generated/container_component_base.hpp
+++ b/include/rive/generated/container_component_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CONTAINER_COMPONENT_BASE_HPP_
 #define _RIVE_CONTAINER_COMPONENT_BASE_HPP_
-#include "component.hpp"
+#include "rive/component.hpp"
 namespace rive
 {
 	class ContainerComponentBase : public Component
diff --git a/include/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp
similarity index 85%
rename from include/generated/core_registry.hpp
rename to include/rive/generated/core_registry.hpp
index 24a84cf..edc1515 100644
--- a/include/generated/core_registry.hpp
+++ b/include/rive/generated/core_registry.hpp
@@ -1,80 +1,85 @@
 #ifndef _RIVE_CORE_REGISTRY_HPP_
 #define _RIVE_CORE_REGISTRY_HPP_
-#include "animation/animation.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/any_state.hpp"
-#include "animation/blend_animation.hpp"
-#include "animation/blend_animation_1d.hpp"
-#include "animation/blend_animation_direct.hpp"
-#include "animation/blend_state.hpp"
-#include "animation/blend_state_1d.hpp"
-#include "animation/blend_state_direct.hpp"
-#include "animation/blend_state_transition.hpp"
-#include "animation/cubic_interpolator.hpp"
-#include "animation/entry_state.hpp"
-#include "animation/exit_state.hpp"
-#include "animation/keyed_object.hpp"
-#include "animation/keyed_property.hpp"
-#include "animation/keyframe.hpp"
-#include "animation/keyframe_color.hpp"
-#include "animation/keyframe_double.hpp"
-#include "animation/keyframe_id.hpp"
-#include "animation/layer_state.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/state_machine.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/state_machine_component.hpp"
-#include "animation/state_machine_input.hpp"
-#include "animation/state_machine_layer.hpp"
-#include "animation/state_machine_layer_component.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "animation/state_transition.hpp"
-#include "animation/transition_bool_condition.hpp"
-#include "animation/transition_condition.hpp"
-#include "animation/transition_number_condition.hpp"
-#include "animation/transition_trigger_condition.hpp"
-#include "animation/transition_value_condition.hpp"
-#include "artboard.hpp"
-#include "backboard.hpp"
-#include "bones/bone.hpp"
-#include "bones/cubic_weight.hpp"
-#include "bones/root_bone.hpp"
-#include "bones/skeletal_component.hpp"
-#include "bones/skin.hpp"
-#include "bones/tendon.hpp"
-#include "bones/weight.hpp"
-#include "component.hpp"
-#include "container_component.hpp"
-#include "draw_rules.hpp"
-#include "draw_target.hpp"
-#include "drawable.hpp"
-#include "node.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/cubic_asymmetric_vertex.hpp"
-#include "shapes/cubic_detached_vertex.hpp"
-#include "shapes/cubic_mirrored_vertex.hpp"
-#include "shapes/cubic_vertex.hpp"
-#include "shapes/ellipse.hpp"
-#include "shapes/paint/fill.hpp"
-#include "shapes/paint/gradient_stop.hpp"
-#include "shapes/paint/linear_gradient.hpp"
-#include "shapes/paint/radial_gradient.hpp"
-#include "shapes/paint/shape_paint.hpp"
-#include "shapes/paint/solid_color.hpp"
-#include "shapes/paint/stroke.hpp"
-#include "shapes/paint/trim_path.hpp"
-#include "shapes/parametric_path.hpp"
-#include "shapes/path.hpp"
-#include "shapes/path_vertex.hpp"
-#include "shapes/points_path.hpp"
-#include "shapes/polygon.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
-#include "shapes/star.hpp"
-#include "shapes/straight_vertex.hpp"
-#include "shapes/triangle.hpp"
-#include "transform_component.hpp"
+#include "rive/animation/animation.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/any_state.hpp"
+#include "rive/animation/blend_animation.hpp"
+#include "rive/animation/blend_animation_1d.hpp"
+#include "rive/animation/blend_animation_direct.hpp"
+#include "rive/animation/blend_state.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+#include "rive/animation/blend_state_direct.hpp"
+#include "rive/animation/blend_state_transition.hpp"
+#include "rive/animation/cubic_interpolator.hpp"
+#include "rive/animation/entry_state.hpp"
+#include "rive/animation/exit_state.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/animation/keyframe_color.hpp"
+#include "rive/animation/keyframe_double.hpp"
+#include "rive/animation/keyframe_id.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_bool.hpp"
+#include "rive/animation/state_machine_component.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/animation/state_machine_layer.hpp"
+#include "rive/animation/state_machine_layer_component.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/animation/transition_bool_condition.hpp"
+#include "rive/animation/transition_condition.hpp"
+#include "rive/animation/transition_number_condition.hpp"
+#include "rive/animation/transition_trigger_condition.hpp"
+#include "rive/animation/transition_value_condition.hpp"
+#include "rive/artboard.hpp"
+#include "rive/backboard.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/bones/cubic_weight.hpp"
+#include "rive/bones/root_bone.hpp"
+#include "rive/bones/skeletal_component.hpp"
+#include "rive/bones/skin.hpp"
+#include "rive/bones/tendon.hpp"
+#include "rive/bones/weight.hpp"
+#include "rive/component.hpp"
+#include "rive/constraints/constraint.hpp"
+#include "rive/constraints/distance_constraint.hpp"
+#include "rive/constraints/ik_constraint.hpp"
+#include "rive/constraints/targeted_constraint.hpp"
+#include "rive/constraints/transform_constraint.hpp"
+#include "rive/container_component.hpp"
+#include "rive/draw_rules.hpp"
+#include "rive/draw_target.hpp"
+#include "rive/drawable.hpp"
+#include "rive/node.hpp"
+#include "rive/shapes/clipping_shape.hpp"
+#include "rive/shapes/cubic_asymmetric_vertex.hpp"
+#include "rive/shapes/cubic_detached_vertex.hpp"
+#include "rive/shapes/cubic_mirrored_vertex.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
+#include "rive/shapes/ellipse.hpp"
+#include "rive/shapes/paint/fill.hpp"
+#include "rive/shapes/paint/gradient_stop.hpp"
+#include "rive/shapes/paint/linear_gradient.hpp"
+#include "rive/shapes/paint/radial_gradient.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
+#include "rive/shapes/paint/solid_color.hpp"
+#include "rive/shapes/paint/stroke.hpp"
+#include "rive/shapes/paint/trim_path.hpp"
+#include "rive/shapes/parametric_path.hpp"
+#include "rive/shapes/path.hpp"
+#include "rive/shapes/path_vertex.hpp"
+#include "rive/shapes/points_path.hpp"
+#include "rive/shapes/polygon.hpp"
+#include "rive/shapes/rectangle.hpp"
+#include "rive/shapes/shape.hpp"
+#include "rive/shapes/star.hpp"
+#include "rive/shapes/straight_vertex.hpp"
+#include "rive/shapes/triangle.hpp"
+#include "rive/transform_component.hpp"
 namespace rive
 {
 	class CoreRegistry
@@ -86,6 +91,12 @@
 			{
 				case DrawTargetBase::typeKey:
 					return new DrawTarget();
+				case DistanceConstraintBase::typeKey:
+					return new DistanceConstraint();
+				case IKConstraintBase::typeKey:
+					return new IKConstraint();
+				case TransformConstraintBase::typeKey:
+					return new TransformConstraint();
 				case AnimationStateBase::typeKey:
 					return new AnimationState();
 				case KeyedObjectBase::typeKey:
@@ -227,6 +238,23 @@
 				case DrawTargetBase::placementValuePropertyKey:
 					object->as<DrawTargetBase>()->placementValue(value);
 					break;
+				case TargetedConstraintBase::targetIdPropertyKey:
+					object->as<TargetedConstraintBase>()->targetId(value);
+					break;
+				case DistanceConstraintBase::modeValuePropertyKey:
+					object->as<DistanceConstraintBase>()->modeValue(value);
+					break;
+				case IKConstraintBase::parentBoneCountPropertyKey:
+					object->as<IKConstraintBase>()->parentBoneCount(value);
+					break;
+				case TransformConstraintBase::sourceSpaceValuePropertyKey:
+					object->as<TransformConstraintBase>()->sourceSpaceValue(
+					    value);
+					break;
+				case TransformConstraintBase::destSpaceValuePropertyKey:
+					object->as<TransformConstraintBase>()->destSpaceValue(
+					    value);
+					break;
 				case AnimationStateBase::animationIdPropertyKey:
 					object->as<AnimationStateBase>()->animationId(value);
 					break;
@@ -354,6 +382,12 @@
 		{
 			switch (propertyKey)
 			{
+				case ConstraintBase::strengthPropertyKey:
+					object->as<ConstraintBase>()->strength(value);
+					break;
+				case DistanceConstraintBase::distancePropertyKey:
+					object->as<DistanceConstraintBase>()->distance(value);
+					break;
 				case StateMachineNumberBase::valuePropertyKey:
 					object->as<StateMachineNumberBase>()->value(value);
 					break;
@@ -560,25 +594,13 @@
 					break;
 			}
 		}
-		static void setColor(Core* object, int propertyKey, int value)
-		{
-			switch (propertyKey)
-			{
-				case KeyFrameColorBase::valuePropertyKey:
-					object->as<KeyFrameColorBase>()->value(value);
-					break;
-				case SolidColorBase::colorValuePropertyKey:
-					object->as<SolidColorBase>()->colorValue(value);
-					break;
-				case GradientStopBase::colorValuePropertyKey:
-					object->as<GradientStopBase>()->colorValue(value);
-					break;
-			}
-		}
 		static void setBool(Core* object, int propertyKey, bool value)
 		{
 			switch (propertyKey)
 			{
+				case IKConstraintBase::invertDirectionPropertyKey:
+					object->as<IKConstraintBase>()->invertDirection(value);
+					break;
 				case LinearAnimationBase::enableWorkAreaPropertyKey:
 					object->as<LinearAnimationBase>()->enableWorkArea(value);
 					break;
@@ -602,6 +624,21 @@
 					break;
 			}
 		}
+		static void setColor(Core* object, int propertyKey, int value)
+		{
+			switch (propertyKey)
+			{
+				case KeyFrameColorBase::valuePropertyKey:
+					object->as<KeyFrameColorBase>()->value(value);
+					break;
+				case SolidColorBase::colorValuePropertyKey:
+					object->as<SolidColorBase>()->colorValue(value);
+					break;
+				case GradientStopBase::colorValuePropertyKey:
+					object->as<GradientStopBase>()->colorValue(value);
+					break;
+			}
+		}
 		static std::string getString(Core* object, int propertyKey)
 		{
 			switch (propertyKey)
@@ -625,6 +662,18 @@
 					return object->as<DrawTargetBase>()->drawableId();
 				case DrawTargetBase::placementValuePropertyKey:
 					return object->as<DrawTargetBase>()->placementValue();
+				case TargetedConstraintBase::targetIdPropertyKey:
+					return object->as<TargetedConstraintBase>()->targetId();
+				case DistanceConstraintBase::modeValuePropertyKey:
+					return object->as<DistanceConstraintBase>()->modeValue();
+				case IKConstraintBase::parentBoneCountPropertyKey:
+					return object->as<IKConstraintBase>()->parentBoneCount();
+				case TransformConstraintBase::sourceSpaceValuePropertyKey:
+					return object->as<TransformConstraintBase>()
+					    ->sourceSpaceValue();
+				case TransformConstraintBase::destSpaceValuePropertyKey:
+					return object->as<TransformConstraintBase>()
+					    ->destSpaceValue();
 				case AnimationStateBase::animationIdPropertyKey:
 					return object->as<AnimationStateBase>()->animationId();
 				case KeyedObjectBase::objectIdPropertyKey:
@@ -714,6 +763,10 @@
 		{
 			switch (propertyKey)
 			{
+				case ConstraintBase::strengthPropertyKey:
+					return object->as<ConstraintBase>()->strength();
+				case DistanceConstraintBase::distancePropertyKey:
+					return object->as<DistanceConstraintBase>()->distance();
 				case StateMachineNumberBase::valuePropertyKey:
 					return object->as<StateMachineNumberBase>()->value();
 				case TransitionNumberConditionBase::valuePropertyKey:
@@ -855,23 +908,12 @@
 			}
 			return 0.0f;
 		}
-		static int getColor(Core* object, int propertyKey)
-		{
-			switch (propertyKey)
-			{
-				case KeyFrameColorBase::valuePropertyKey:
-					return object->as<KeyFrameColorBase>()->value();
-				case SolidColorBase::colorValuePropertyKey:
-					return object->as<SolidColorBase>()->colorValue();
-				case GradientStopBase::colorValuePropertyKey:
-					return object->as<GradientStopBase>()->colorValue();
-			}
-			return 0;
-		}
 		static bool getBool(Core* object, int propertyKey)
 		{
 			switch (propertyKey)
 			{
+				case IKConstraintBase::invertDirectionPropertyKey:
+					return object->as<IKConstraintBase>()->invertDirection();
 				case LinearAnimationBase::enableWorkAreaPropertyKey:
 					return object->as<LinearAnimationBase>()->enableWorkArea();
 				case StateMachineBoolBase::valuePropertyKey:
@@ -889,6 +931,19 @@
 			}
 			return false;
 		}
+		static int getColor(Core* object, int propertyKey)
+		{
+			switch (propertyKey)
+			{
+				case KeyFrameColorBase::valuePropertyKey:
+					return object->as<KeyFrameColorBase>()->value();
+				case SolidColorBase::colorValuePropertyKey:
+					return object->as<SolidColorBase>()->colorValue();
+				case GradientStopBase::colorValuePropertyKey:
+					return object->as<GradientStopBase>()->colorValue();
+			}
+			return 0;
+		}
 		static int propertyFieldId(int propertyKey)
 		{
 			switch (propertyKey)
@@ -900,6 +955,11 @@
 				case ComponentBase::parentIdPropertyKey:
 				case DrawTargetBase::drawableIdPropertyKey:
 				case DrawTargetBase::placementValuePropertyKey:
+				case TargetedConstraintBase::targetIdPropertyKey:
+				case DistanceConstraintBase::modeValuePropertyKey:
+				case IKConstraintBase::parentBoneCountPropertyKey:
+				case TransformConstraintBase::sourceSpaceValuePropertyKey:
+				case TransformConstraintBase::destSpaceValuePropertyKey:
 				case AnimationStateBase::animationIdPropertyKey:
 				case KeyedObjectBase::objectIdPropertyKey:
 				case BlendAnimationBase::animationIdPropertyKey:
@@ -941,6 +1001,8 @@
 				case CubicWeightBase::outValuesPropertyKey:
 				case CubicWeightBase::outIndicesPropertyKey:
 					return CoreUintType::id;
+				case ConstraintBase::strengthPropertyKey:
+				case DistanceConstraintBase::distancePropertyKey:
 				case StateMachineNumberBase::valuePropertyKey:
 				case TransitionNumberConditionBase::valuePropertyKey:
 				case CubicInterpolatorBase::x1PropertyKey:
@@ -1010,10 +1072,7 @@
 				case TendonBase::txPropertyKey:
 				case TendonBase::tyPropertyKey:
 					return CoreDoubleType::id;
-				case KeyFrameColorBase::valuePropertyKey:
-				case SolidColorBase::colorValuePropertyKey:
-				case GradientStopBase::colorValuePropertyKey:
-					return CoreColorType::id;
+				case IKConstraintBase::invertDirectionPropertyKey:
 				case LinearAnimationBase::enableWorkAreaPropertyKey:
 				case StateMachineBoolBase::valuePropertyKey:
 				case ShapePaintBase::isVisiblePropertyKey:
@@ -1022,6 +1081,10 @@
 				case RectangleBase::linkCornerRadiusPropertyKey:
 				case ClippingShapeBase::isVisiblePropertyKey:
 					return CoreBoolType::id;
+				case KeyFrameColorBase::valuePropertyKey:
+				case SolidColorBase::colorValuePropertyKey:
+				case GradientStopBase::colorValuePropertyKey:
+					return CoreColorType::id;
 				default:
 					return -1;
 			}
diff --git a/include/generated/draw_rules_base.hpp b/include/rive/generated/draw_rules_base.hpp
similarity index 93%
rename from include/generated/draw_rules_base.hpp
rename to include/rive/generated/draw_rules_base.hpp
index 03cc549..c458e66 100644
--- a/include/generated/draw_rules_base.hpp
+++ b/include/rive/generated/draw_rules_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_DRAW_RULES_BASE_HPP_
 #define _RIVE_DRAW_RULES_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class DrawRulesBase : public ContainerComponent
diff --git a/include/generated/draw_target_base.hpp b/include/rive/generated/draw_target_base.hpp
similarity index 95%
rename from include/generated/draw_target_base.hpp
rename to include/rive/generated/draw_target_base.hpp
index 433ba2b..3dd2971 100644
--- a/include/generated/draw_target_base.hpp
+++ b/include/rive/generated/draw_target_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_DRAW_TARGET_BASE_HPP_
 #define _RIVE_DRAW_TARGET_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class DrawTargetBase : public Component
diff --git a/include/generated/drawable_base.hpp b/include/rive/generated/drawable_base.hpp
similarity index 95%
rename from include/generated/drawable_base.hpp
rename to include/rive/generated/drawable_base.hpp
index 0d2d3c8..c545f1f 100644
--- a/include/generated/drawable_base.hpp
+++ b/include/rive/generated/drawable_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_DRAWABLE_BASE_HPP_
 #define _RIVE_DRAWABLE_BASE_HPP_
-#include "core/field_types/core_uint_type.hpp"
-#include "node.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/node.hpp"
 namespace rive
 {
 	class DrawableBase : public Node
diff --git a/include/generated/node_base.hpp b/include/rive/generated/node_base.hpp
similarity index 94%
rename from include/generated/node_base.hpp
rename to include/rive/generated/node_base.hpp
index c35e3ce..1bcbb43 100644
--- a/include/generated/node_base.hpp
+++ b/include/rive/generated/node_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_NODE_BASE_HPP_
 #define _RIVE_NODE_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "transform_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/transform_component.hpp"
 namespace rive
 {
 	class NodeBase : public TransformComponent
diff --git a/include/generated/shapes/clipping_shape_base.hpp b/include/rive/generated/shapes/clipping_shape_base.hpp
similarity index 94%
rename from include/generated/shapes/clipping_shape_base.hpp
rename to include/rive/generated/shapes/clipping_shape_base.hpp
index b20053d..309fb85 100644
--- a/include/generated/shapes/clipping_shape_base.hpp
+++ b/include/rive/generated/shapes/clipping_shape_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_CLIPPING_SHAPE_BASE_HPP_
 #define _RIVE_CLIPPING_SHAPE_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_bool_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class ClippingShapeBase : public Component
diff --git a/include/generated/shapes/cubic_asymmetric_vertex_base.hpp b/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
similarity index 96%
rename from include/generated/shapes/cubic_asymmetric_vertex_base.hpp
rename to include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
index 5321542..9d4c08b 100644
--- a/include/generated/shapes/cubic_asymmetric_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_asymmetric_vertex_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_ASYMMETRIC_VERTEX_BASE_HPP_
 #define _RIVE_CUBIC_ASYMMETRIC_VERTEX_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/cubic_vertex.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
 namespace rive
 {
 	class CubicAsymmetricVertexBase : public CubicVertex
diff --git a/include/generated/shapes/cubic_detached_vertex_base.hpp b/include/rive/generated/shapes/cubic_detached_vertex_base.hpp
similarity index 96%
rename from include/generated/shapes/cubic_detached_vertex_base.hpp
rename to include/rive/generated/shapes/cubic_detached_vertex_base.hpp
index 9a22ce4..279392c 100644
--- a/include/generated/shapes/cubic_detached_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_detached_vertex_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_DETACHED_VERTEX_BASE_HPP_
 #define _RIVE_CUBIC_DETACHED_VERTEX_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/cubic_vertex.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
 namespace rive
 {
 	class CubicDetachedVertexBase : public CubicVertex
diff --git a/include/generated/shapes/cubic_mirrored_vertex_base.hpp b/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
similarity index 95%
rename from include/generated/shapes/cubic_mirrored_vertex_base.hpp
rename to include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
index 6fbd49e..ff5bce8 100644
--- a/include/generated/shapes/cubic_mirrored_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_mirrored_vertex_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_MIRRORED_VERTEX_BASE_HPP_
 #define _RIVE_CUBIC_MIRRORED_VERTEX_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/cubic_vertex.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
 namespace rive
 {
 	class CubicMirroredVertexBase : public CubicVertex
diff --git a/include/generated/shapes/cubic_vertex_base.hpp b/include/rive/generated/shapes/cubic_vertex_base.hpp
similarity index 94%
rename from include/generated/shapes/cubic_vertex_base.hpp
rename to include/rive/generated/shapes/cubic_vertex_base.hpp
index fa739d9..760bdff 100644
--- a/include/generated/shapes/cubic_vertex_base.hpp
+++ b/include/rive/generated/shapes/cubic_vertex_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_VERTEX_BASE_HPP_
 #define _RIVE_CUBIC_VERTEX_BASE_HPP_
-#include "shapes/path_vertex.hpp"
+#include "rive/shapes/path_vertex.hpp"
 namespace rive
 {
 	class CubicVertexBase : public PathVertex
diff --git a/include/generated/shapes/ellipse_base.hpp b/include/rive/generated/shapes/ellipse_base.hpp
similarity index 94%
rename from include/generated/shapes/ellipse_base.hpp
rename to include/rive/generated/shapes/ellipse_base.hpp
index 3c17515..ad90986 100644
--- a/include/generated/shapes/ellipse_base.hpp
+++ b/include/rive/generated/shapes/ellipse_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_ELLIPSE_BASE_HPP_
 #define _RIVE_ELLIPSE_BASE_HPP_
-#include "shapes/parametric_path.hpp"
+#include "rive/shapes/parametric_path.hpp"
 namespace rive
 {
 	class EllipseBase : public ParametricPath
diff --git a/include/generated/shapes/paint/fill_base.hpp b/include/rive/generated/shapes/paint/fill_base.hpp
similarity index 93%
rename from include/generated/shapes/paint/fill_base.hpp
rename to include/rive/generated/shapes/paint/fill_base.hpp
index 06fbebf..922f4ce 100644
--- a/include/generated/shapes/paint/fill_base.hpp
+++ b/include/rive/generated/shapes/paint/fill_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_FILL_BASE_HPP_
 #define _RIVE_FILL_BASE_HPP_
-#include "core/field_types/core_uint_type.hpp"
-#include "shapes/paint/shape_paint.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
 namespace rive
 {
 	class FillBase : public ShapePaint
diff --git a/include/generated/shapes/paint/gradient_stop_base.hpp b/include/rive/generated/shapes/paint/gradient_stop_base.hpp
similarity index 92%
rename from include/generated/shapes/paint/gradient_stop_base.hpp
rename to include/rive/generated/shapes/paint/gradient_stop_base.hpp
index 97757ae..bd79ff1 100644
--- a/include/generated/shapes/paint/gradient_stop_base.hpp
+++ b/include/rive/generated/shapes/paint/gradient_stop_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_GRADIENT_STOP_BASE_HPP_
 #define _RIVE_GRADIENT_STOP_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_color_type.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_color_type.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class GradientStopBase : public Component
diff --git a/include/generated/shapes/paint/linear_gradient_base.hpp b/include/rive/generated/shapes/paint/linear_gradient_base.hpp
similarity index 96%
rename from include/generated/shapes/paint/linear_gradient_base.hpp
rename to include/rive/generated/shapes/paint/linear_gradient_base.hpp
index 4182afb..99555e4 100644
--- a/include/generated/shapes/paint/linear_gradient_base.hpp
+++ b/include/rive/generated/shapes/paint/linear_gradient_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_LINEAR_GRADIENT_BASE_HPP_
 #define _RIVE_LINEAR_GRADIENT_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class LinearGradientBase : public ContainerComponent
diff --git a/include/generated/shapes/paint/radial_gradient_base.hpp b/include/rive/generated/shapes/paint/radial_gradient_base.hpp
similarity index 93%
rename from include/generated/shapes/paint/radial_gradient_base.hpp
rename to include/rive/generated/shapes/paint/radial_gradient_base.hpp
index ae53822..bf4c734 100644
--- a/include/generated/shapes/paint/radial_gradient_base.hpp
+++ b/include/rive/generated/shapes/paint/radial_gradient_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_RADIAL_GRADIENT_BASE_HPP_
 #define _RIVE_RADIAL_GRADIENT_BASE_HPP_
-#include "shapes/paint/linear_gradient.hpp"
+#include "rive/shapes/paint/linear_gradient.hpp"
 namespace rive
 {
 	class RadialGradientBase : public LinearGradient
diff --git a/include/generated/shapes/paint/shape_paint_base.hpp b/include/rive/generated/shapes/paint/shape_paint_base.hpp
similarity index 93%
rename from include/generated/shapes/paint/shape_paint_base.hpp
rename to include/rive/generated/shapes/paint/shape_paint_base.hpp
index f1b9f34..57a6474 100644
--- a/include/generated/shapes/paint/shape_paint_base.hpp
+++ b/include/rive/generated/shapes/paint/shape_paint_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SHAPE_PAINT_BASE_HPP_
 #define _RIVE_SHAPE_PAINT_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_bool_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
 namespace rive
 {
 	class ShapePaintBase : public ContainerComponent
@@ -33,7 +33,6 @@
 
 	private:
 		bool m_IsVisible = true;
-
 	public:
 		virtual bool isVisible() const { return m_IsVisible; }
 		void isVisible(bool value)
diff --git a/include/generated/shapes/paint/solid_color_base.hpp b/include/rive/generated/shapes/paint/solid_color_base.hpp
similarity index 94%
rename from include/generated/shapes/paint/solid_color_base.hpp
rename to include/rive/generated/shapes/paint/solid_color_base.hpp
index f233265..8afe588 100644
--- a/include/generated/shapes/paint/solid_color_base.hpp
+++ b/include/rive/generated/shapes/paint/solid_color_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SOLID_COLOR_BASE_HPP_
 #define _RIVE_SOLID_COLOR_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_color_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_color_type.hpp"
 namespace rive
 {
 	class SolidColorBase : public Component
diff --git a/include/generated/shapes/paint/stroke_base.hpp b/include/rive/generated/shapes/paint/stroke_base.hpp
similarity index 93%
rename from include/generated/shapes/paint/stroke_base.hpp
rename to include/rive/generated/shapes/paint/stroke_base.hpp
index 8615ffa..bd42a93 100644
--- a/include/generated/shapes/paint/stroke_base.hpp
+++ b/include/rive/generated/shapes/paint/stroke_base.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_STROKE_BASE_HPP_
 #define _RIVE_STROKE_BASE_HPP_
-#include "core/field_types/core_bool_type.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
-#include "shapes/paint/shape_paint.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
 namespace rive
 {
 	class StrokeBase : public ShapePaint
diff --git a/include/generated/shapes/paint/trim_path_base.hpp b/include/rive/generated/shapes/paint/trim_path_base.hpp
similarity index 94%
rename from include/generated/shapes/paint/trim_path_base.hpp
rename to include/rive/generated/shapes/paint/trim_path_base.hpp
index 3c52eeb..80d980c 100644
--- a/include/generated/shapes/paint/trim_path_base.hpp
+++ b/include/rive/generated/shapes/paint/trim_path_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_TRIM_PATH_BASE_HPP_
 #define _RIVE_TRIM_PATH_BASE_HPP_
-#include "component.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
+#include "rive/component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
 namespace rive
 {
 	class TrimPathBase : public Component
diff --git a/include/generated/shapes/parametric_path_base.hpp b/include/rive/generated/shapes/parametric_path_base.hpp
similarity index 96%
rename from include/generated/shapes/parametric_path_base.hpp
rename to include/rive/generated/shapes/parametric_path_base.hpp
index dfb8a93..1c4ef80 100644
--- a/include/generated/shapes/parametric_path_base.hpp
+++ b/include/rive/generated/shapes/parametric_path_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_PARAMETRIC_PATH_BASE_HPP_
 #define _RIVE_PARAMETRIC_PATH_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/path.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/path.hpp"
 namespace rive
 {
 	class ParametricPathBase : public Path
diff --git a/include/generated/shapes/path_base.hpp b/include/rive/generated/shapes/path_base.hpp
similarity index 94%
rename from include/generated/shapes/path_base.hpp
rename to include/rive/generated/shapes/path_base.hpp
index 49475b1..6138190 100644
--- a/include/generated/shapes/path_base.hpp
+++ b/include/rive/generated/shapes/path_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_PATH_BASE_HPP_
 #define _RIVE_PATH_BASE_HPP_
-#include "core/field_types/core_uint_type.hpp"
-#include "node.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/node.hpp"
 namespace rive
 {
 	class PathBase : public Node
diff --git a/include/generated/shapes/path_vertex_base.hpp b/include/rive/generated/shapes/path_vertex_base.hpp
similarity index 94%
rename from include/generated/shapes/path_vertex_base.hpp
rename to include/rive/generated/shapes/path_vertex_base.hpp
index 3502557..8af2cf1 100644
--- a/include/generated/shapes/path_vertex_base.hpp
+++ b/include/rive/generated/shapes/path_vertex_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_PATH_VERTEX_BASE_HPP_
 #define _RIVE_PATH_VERTEX_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class PathVertexBase : public ContainerComponent
diff --git a/include/generated/shapes/points_path_base.hpp b/include/rive/generated/shapes/points_path_base.hpp
similarity index 94%
rename from include/generated/shapes/points_path_base.hpp
rename to include/rive/generated/shapes/points_path_base.hpp
index f852e11..5bf78d8 100644
--- a/include/generated/shapes/points_path_base.hpp
+++ b/include/rive/generated/shapes/points_path_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_POINTS_PATH_BASE_HPP_
 #define _RIVE_POINTS_PATH_BASE_HPP_
-#include "core/field_types/core_bool_type.hpp"
-#include "shapes/path.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/shapes/path.hpp"
 namespace rive
 {
 	class PointsPathBase : public Path
diff --git a/include/generated/shapes/polygon_base.hpp b/include/rive/generated/shapes/polygon_base.hpp
similarity index 92%
rename from include/generated/shapes/polygon_base.hpp
rename to include/rive/generated/shapes/polygon_base.hpp
index a0795f8..dfb3f84 100644
--- a/include/generated/shapes/polygon_base.hpp
+++ b/include/rive/generated/shapes/polygon_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_POLYGON_BASE_HPP_
 #define _RIVE_POLYGON_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
-#include "shapes/parametric_path.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/shapes/parametric_path.hpp"
 namespace rive
 {
 	class PolygonBase : public ParametricPath
diff --git a/include/generated/shapes/rectangle_base.hpp b/include/rive/generated/shapes/rectangle_base.hpp
similarity index 95%
rename from include/generated/shapes/rectangle_base.hpp
rename to include/rive/generated/shapes/rectangle_base.hpp
index 3c69947..697f2ed 100644
--- a/include/generated/shapes/rectangle_base.hpp
+++ b/include/rive/generated/shapes/rectangle_base.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_RECTANGLE_BASE_HPP_
 #define _RIVE_RECTANGLE_BASE_HPP_
-#include "core/field_types/core_bool_type.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/parametric_path.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/parametric_path.hpp"
 namespace rive
 {
 	class RectangleBase : public ParametricPath
diff --git a/include/generated/shapes/shape_base.hpp b/include/rive/generated/shapes/shape_base.hpp
similarity index 96%
rename from include/generated/shapes/shape_base.hpp
rename to include/rive/generated/shapes/shape_base.hpp
index f77705d..a705749 100644
--- a/include/generated/shapes/shape_base.hpp
+++ b/include/rive/generated/shapes/shape_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_SHAPE_BASE_HPP_
 #define _RIVE_SHAPE_BASE_HPP_
-#include "drawable.hpp"
+#include "rive/drawable.hpp"
 namespace rive
 {
 	class ShapeBase : public Drawable
diff --git a/include/generated/shapes/star_base.hpp b/include/rive/generated/shapes/star_base.hpp
similarity index 94%
rename from include/generated/shapes/star_base.hpp
rename to include/rive/generated/shapes/star_base.hpp
index b04e871..ae0d615 100644
--- a/include/generated/shapes/star_base.hpp
+++ b/include/rive/generated/shapes/star_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STAR_BASE_HPP_
 #define _RIVE_STAR_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/polygon.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/polygon.hpp"
 namespace rive
 {
 	class StarBase : public Polygon
diff --git a/include/generated/shapes/straight_vertex_base.hpp b/include/rive/generated/shapes/straight_vertex_base.hpp
similarity index 93%
rename from include/generated/shapes/straight_vertex_base.hpp
rename to include/rive/generated/shapes/straight_vertex_base.hpp
index 7db29d7..a1259b8 100644
--- a/include/generated/shapes/straight_vertex_base.hpp
+++ b/include/rive/generated/shapes/straight_vertex_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STRAIGHT_VERTEX_BASE_HPP_
 #define _RIVE_STRAIGHT_VERTEX_BASE_HPP_
-#include "core/field_types/core_double_type.hpp"
-#include "shapes/path_vertex.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/shapes/path_vertex.hpp"
 namespace rive
 {
 	class StraightVertexBase : public PathVertex
diff --git a/include/generated/shapes/triangle_base.hpp b/include/rive/generated/shapes/triangle_base.hpp
similarity index 94%
rename from include/generated/shapes/triangle_base.hpp
rename to include/rive/generated/shapes/triangle_base.hpp
index 4102b1b..1078889 100644
--- a/include/generated/shapes/triangle_base.hpp
+++ b/include/rive/generated/shapes/triangle_base.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_TRIANGLE_BASE_HPP_
 #define _RIVE_TRIANGLE_BASE_HPP_
-#include "shapes/parametric_path.hpp"
+#include "rive/shapes/parametric_path.hpp"
 namespace rive
 {
 	class TriangleBase : public ParametricPath
diff --git a/include/generated/transform_component_base.hpp b/include/rive/generated/transform_component_base.hpp
similarity index 96%
rename from include/generated/transform_component_base.hpp
rename to include/rive/generated/transform_component_base.hpp
index 9f19f69..b85a64f 100644
--- a/include/generated/transform_component_base.hpp
+++ b/include/rive/generated/transform_component_base.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSFORM_COMPONENT_BASE_HPP_
 #define _RIVE_TRANSFORM_COMPONENT_BASE_HPP_
-#include "container_component.hpp"
-#include "core/field_types/core_double_type.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
 namespace rive
 {
 	class TransformComponentBase : public ContainerComponent
diff --git a/include/importers/artboard_importer.hpp b/include/rive/importers/artboard_importer.hpp
similarity index 93%
rename from include/importers/artboard_importer.hpp
rename to include/rive/importers/artboard_importer.hpp
index 9db5f78..0518372 100644
--- a/include/importers/artboard_importer.hpp
+++ b/include/rive/importers/artboard_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_ARTBOARD_IMPORTER_HPP_
 #define _RIVE_ARTBOARD_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/import_stack.hpp b/include/rive/importers/import_stack.hpp
similarity index 98%
rename from include/importers/import_stack.hpp
rename to include/rive/importers/import_stack.hpp
index f31a49e..e3fd3b1 100644
--- a/include/importers/import_stack.hpp
+++ b/include/rive/importers/import_stack.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_IMPORT_STACK_HPP_
 #define _RIVE_IMPORT_STACK_HPP_
-#include "status_code.hpp"
+#include "rive/status_code.hpp"
 #include <algorithm>
 #include <unordered_map>
 #include <vector>
diff --git a/include/importers/keyed_object_importer.hpp b/include/rive/importers/keyed_object_importer.hpp
similarity index 89%
rename from include/importers/keyed_object_importer.hpp
rename to include/rive/importers/keyed_object_importer.hpp
index 57845e8..dc0b70d 100644
--- a/include/importers/keyed_object_importer.hpp
+++ b/include/rive/importers/keyed_object_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEYED_OBJECT_IMPORTER_HPP_
 #define _RIVE_KEYED_OBJECT_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/keyed_property_importer.hpp b/include/rive/importers/keyed_property_importer.hpp
similarity index 92%
rename from include/importers/keyed_property_importer.hpp
rename to include/rive/importers/keyed_property_importer.hpp
index 286772d..a4b581e 100644
--- a/include/importers/keyed_property_importer.hpp
+++ b/include/rive/importers/keyed_property_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_KEYED_PROPERTY_IMPORTER_HPP_
 #define _RIVE_KEYED_PROPERTY_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/layer_state_importer.hpp b/include/rive/importers/layer_state_importer.hpp
similarity index 91%
rename from include/importers/layer_state_importer.hpp
rename to include/rive/importers/layer_state_importer.hpp
index 6212e82..9f3a9dc 100644
--- a/include/importers/layer_state_importer.hpp
+++ b/include/rive/importers/layer_state_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_LAYER_STATE_IMPORTER_HPP_
 #define _RIVE_LAYER_STATE_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/linear_animation_importer.hpp b/include/rive/importers/linear_animation_importer.hpp
similarity index 91%
rename from include/importers/linear_animation_importer.hpp
rename to include/rive/importers/linear_animation_importer.hpp
index 09ee94c..74857f0 100644
--- a/include/importers/linear_animation_importer.hpp
+++ b/include/rive/importers/linear_animation_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_LINEAR_ANIMATION_IMPORTER_HPP_
 #define _RIVE_LINEAR_ANIMATION_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/state_machine_importer.hpp b/include/rive/importers/state_machine_importer.hpp
similarity index 92%
rename from include/importers/state_machine_importer.hpp
rename to include/rive/importers/state_machine_importer.hpp
index 7ab487b..eb4eb6b 100644
--- a/include/importers/state_machine_importer.hpp
+++ b/include/rive/importers/state_machine_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_MACHINE_IMPORTER_HPP_
 #define _RIVE_STATE_MACHINE_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/state_machine_layer_importer.hpp b/include/rive/importers/state_machine_layer_importer.hpp
similarity index 92%
rename from include/importers/state_machine_layer_importer.hpp
rename to include/rive/importers/state_machine_layer_importer.hpp
index c8e666a..36363e3 100644
--- a/include/importers/state_machine_layer_importer.hpp
+++ b/include/rive/importers/state_machine_layer_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STATE_MACHINE_LAYER_IMPORTER_HPP_
 #define _RIVE_STATE_MACHINE_LAYER_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/importers/state_transition_importer.hpp b/include/rive/importers/state_transition_importer.hpp
similarity index 90%
rename from include/importers/state_transition_importer.hpp
rename to include/rive/importers/state_transition_importer.hpp
index 1779f5c..2094b6f 100644
--- a/include/importers/state_transition_importer.hpp
+++ b/include/rive/importers/state_transition_importer.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSITION_IMPORTER_HPP_
 #define _RIVE_TRANSITION_IMPORTER_HPP_
 
-#include "importers/import_stack.hpp"
+#include "rive/importers/import_stack.hpp"
 
 namespace rive
 {
diff --git a/include/layout.hpp b/include/rive/layout.hpp
similarity index 100%
rename from include/layout.hpp
rename to include/rive/layout.hpp
diff --git a/include/math/aabb.hpp b/include/rive/math/aabb.hpp
similarity index 96%
rename from include/math/aabb.hpp
rename to include/rive/math/aabb.hpp
index 92d8569..5483db1 100644
--- a/include/math/aabb.hpp
+++ b/include/rive/math/aabb.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_AABB_HPP_
 #define _RIVE_AABB_HPP_
 
-#include "mat2d.hpp"
-#include "vec2d.hpp"
+#include "rive/math/mat2d.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cstddef>
 #include <limits>
 
diff --git a/include/math/circle_constant.hpp b/include/rive/math/circle_constant.hpp
similarity index 100%
rename from include/math/circle_constant.hpp
rename to include/rive/math/circle_constant.hpp
diff --git a/include/math/color.hpp b/include/rive/math/color.hpp
similarity index 100%
rename from include/math/color.hpp
rename to include/rive/math/color.hpp
diff --git a/include/math/cubic_utilities.hpp b/include/rive/math/cubic_utilities.hpp
similarity index 97%
rename from include/math/cubic_utilities.hpp
rename to include/rive/math/cubic_utilities.hpp
index 64bd33c..684cf46 100644
--- a/include/math/cubic_utilities.hpp
+++ b/include/rive/math/cubic_utilities.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_UTILITIES_HPP_
 #define _RIVE_CUBIC_UTILITIES_HPP_
 
-#include "math/vec2d.hpp"
+#include "rive/math/vec2d.hpp"
 #include <algorithm>
 
 namespace rive
diff --git a/include/math/mat2d.hpp b/include/rive/math/mat2d.hpp
similarity index 96%
rename from include/math/mat2d.hpp
rename to include/rive/math/mat2d.hpp
index 20b5bd3..9518975 100644
--- a/include/math/mat2d.hpp
+++ b/include/rive/math/mat2d.hpp
@@ -16,6 +16,7 @@
 	public:
 		Mat2D();
 		Mat2D(const Mat2D& copy);
+		Mat2D(float x1, float y1, float x2, float y2, float tx, float ty);
 
 		inline const float* values() const { return m_Buffer; }
 
diff --git a/include/math/transform_components.hpp b/include/rive/math/transform_components.hpp
similarity index 97%
rename from include/math/transform_components.hpp
rename to include/rive/math/transform_components.hpp
index 1fc5249..a38b226 100644
--- a/include/math/transform_components.hpp
+++ b/include/rive/math/transform_components.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRANSFORMCOMPONENTS_HPP_
 #define _RIVE_TRANSFORMCOMPONENTS_HPP_
 
-#include "vec2d.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cstddef>
 
 namespace rive
diff --git a/include/math/vec2d.hpp b/include/rive/math/vec2d.hpp
similarity index 100%
rename from include/math/vec2d.hpp
rename to include/rive/math/vec2d.hpp
diff --git a/include/node.hpp b/include/rive/node.hpp
similarity index 84%
rename from include/node.hpp
rename to include/rive/node.hpp
index a6f9d83..d0f322b 100644
--- a/include/node.hpp
+++ b/include/rive/node.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_NODE_HPP_
 #define _RIVE_NODE_HPP_
-#include "generated/node_base.hpp"
+#include "rive/generated/node_base.hpp"
 
 namespace rive
 {
diff --git a/include/renderer.hpp b/include/rive/renderer.hpp
similarity index 93%
rename from include/renderer.hpp
rename to include/rive/renderer.hpp
index 8e0d449..76d1b07 100644
--- a/include/renderer.hpp
+++ b/include/rive/renderer.hpp
@@ -1,13 +1,13 @@
 #ifndef _RIVE_RENDERER_HPP_
 #define _RIVE_RENDERER_HPP_
 
-#include "command_path.hpp"
-#include "layout.hpp"
-#include "math/aabb.hpp"
-#include "math/mat2d.hpp"
-#include "shapes/paint/blend_mode.hpp"
-#include "shapes/paint/stroke_cap.hpp"
-#include "shapes/paint/stroke_join.hpp"
+#include "rive/command_path.hpp"
+#include "rive/layout.hpp"
+#include "rive/math/aabb.hpp"
+#include "rive/math/mat2d.hpp"
+#include "rive/shapes/paint/blend_mode.hpp"
+#include "rive/shapes/paint/stroke_cap.hpp"
+#include "rive/shapes/paint/stroke_join.hpp"
 #include <cmath>
 #include <stdio.h>
 
diff --git a/include/runtime_header.hpp b/include/rive/runtime_header.hpp
similarity index 87%
rename from include/runtime_header.hpp
rename to include/rive/runtime_header.hpp
index d298b85..f8c3fa9 100644
--- a/include/runtime_header.hpp
+++ b/include/rive/runtime_header.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_RUNTIME_HEADER_HPP_
 #define _RIVE_RUNTIME_HEADER_HPP_
 
-#include "core/binary_reader.hpp"
+#include "rive/core/binary_reader.hpp"
 #include <unordered_map>
 
 namespace rive
@@ -55,18 +55,18 @@
 				}
 			}
 
-			header.m_MajorVersion = (int)reader.readVarUint();
+			header.m_MajorVersion = (int)reader.readVarUint64();
 			if (reader.didOverflow())
 			{
 				return false;
 			}
-			header.m_MinorVersion = (int)reader.readVarUint();
+			header.m_MinorVersion = (int)reader.readVarUint64();
 			if (reader.didOverflow())
 			{
 				return false;
 			}
 
-			header.m_FileId = (int)reader.readVarUint();
+			header.m_FileId = (int)reader.readVarUint64();
 
 			if (reader.didOverflow())
 			{
@@ -74,8 +74,8 @@
 			}
 
 			std::vector<int> propertyKeys;
-			for (int propertyKey = (int)reader.readVarUint(); propertyKey != 0;
-			     propertyKey = (int)reader.readVarUint())
+			for (int propertyKey = (int)reader.readVarUint64(); propertyKey != 0;
+			     propertyKey = (int)reader.readVarUint64())
 			{
 				propertyKeys.push_back(propertyKey);
 				if (reader.didOverflow())
diff --git a/include/shapes/clipping_shape.hpp b/include/rive/shapes/clipping_shape.hpp
similarity index 92%
rename from include/shapes/clipping_shape.hpp
rename to include/rive/shapes/clipping_shape.hpp
index 1575ee1..a1e8ec5 100644
--- a/include/shapes/clipping_shape.hpp
+++ b/include/rive/shapes/clipping_shape.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CLIPPING_SHAPE_HPP_
 #define _RIVE_CLIPPING_SHAPE_HPP_
-#include "generated/shapes/clipping_shape_base.hpp"
+#include "rive/generated/shapes/clipping_shape_base.hpp"
 #include <stdio.h>
 #include <vector>
 
diff --git a/include/shapes/cubic_asymmetric_vertex.hpp b/include/rive/shapes/cubic_asymmetric_vertex.hpp
similarity index 85%
rename from include/shapes/cubic_asymmetric_vertex.hpp
rename to include/rive/shapes/cubic_asymmetric_vertex.hpp
index 342c3ff..456f84f 100644
--- a/include/shapes/cubic_asymmetric_vertex.hpp
+++ b/include/rive/shapes/cubic_asymmetric_vertex.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_ASYMMETRIC_VERTEX_HPP_
 #define _RIVE_CUBIC_ASYMMETRIC_VERTEX_HPP_
-#include "generated/shapes/cubic_asymmetric_vertex_base.hpp"
+#include "rive/generated/shapes/cubic_asymmetric_vertex_base.hpp"
 namespace rive
 {
 	class CubicAsymmetricVertex : public CubicAsymmetricVertexBase
diff --git a/include/shapes/cubic_detached_vertex.hpp b/include/rive/shapes/cubic_detached_vertex.hpp
similarity index 86%
rename from include/shapes/cubic_detached_vertex.hpp
rename to include/rive/shapes/cubic_detached_vertex.hpp
index 3d2bf1b..b220d82 100644
--- a/include/shapes/cubic_detached_vertex.hpp
+++ b/include/rive/shapes/cubic_detached_vertex.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_DETACHED_VERTEX_HPP_
 #define _RIVE_CUBIC_DETACHED_VERTEX_HPP_
-#include "generated/shapes/cubic_detached_vertex_base.hpp"
+#include "rive/generated/shapes/cubic_detached_vertex_base.hpp"
 namespace rive
 {
 	class CubicDetachedVertex : public CubicDetachedVertexBase
diff --git a/include/shapes/cubic_mirrored_vertex.hpp b/include/rive/shapes/cubic_mirrored_vertex.hpp
similarity index 83%
rename from include/shapes/cubic_mirrored_vertex.hpp
rename to include/rive/shapes/cubic_mirrored_vertex.hpp
index 5c6bfc4..b548af5 100644
--- a/include/shapes/cubic_mirrored_vertex.hpp
+++ b/include/rive/shapes/cubic_mirrored_vertex.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_CUBIC_MIRRORED_VERTEX_HPP_
 #define _RIVE_CUBIC_MIRRORED_VERTEX_HPP_
-#include "generated/shapes/cubic_mirrored_vertex_base.hpp"
+#include "rive/generated/shapes/cubic_mirrored_vertex_base.hpp"
 namespace rive
 {
 	class CubicMirroredVertex : public CubicMirroredVertexBase
diff --git a/include/shapes/cubic_vertex.hpp b/include/rive/shapes/cubic_vertex.hpp
similarity index 88%
rename from include/shapes/cubic_vertex.hpp
rename to include/rive/shapes/cubic_vertex.hpp
index cb85440..a11de28 100644
--- a/include/shapes/cubic_vertex.hpp
+++ b/include/rive/shapes/cubic_vertex.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_CUBIC_VERTEX_HPP_
 #define _RIVE_CUBIC_VERTEX_HPP_
-#include "generated/shapes/cubic_vertex_base.hpp"
-#include "math/vec2d.hpp"
+#include "rive/generated/shapes/cubic_vertex_base.hpp"
+#include "rive/math/vec2d.hpp"
 
 namespace rive
 {
diff --git a/include/shapes/ellipse.hpp b/include/rive/shapes/ellipse.hpp
similarity index 73%
rename from include/shapes/ellipse.hpp
rename to include/rive/shapes/ellipse.hpp
index c9aad4a..64b6b8f 100644
--- a/include/shapes/ellipse.hpp
+++ b/include/rive/shapes/ellipse.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_ELLIPSE_HPP_
 #define _RIVE_ELLIPSE_HPP_
-#include "generated/shapes/ellipse_base.hpp"
-#include "shapes/cubic_detached_vertex.hpp"
+#include "rive/generated/shapes/ellipse_base.hpp"
+#include "rive/shapes/cubic_detached_vertex.hpp"
 
 namespace rive
 {
diff --git a/include/shapes/metrics_path.hpp b/include/rive/shapes/metrics_path.hpp
similarity index 97%
rename from include/shapes/metrics_path.hpp
rename to include/rive/shapes/metrics_path.hpp
index 1b3bd04..13a6403 100644
--- a/include/shapes/metrics_path.hpp
+++ b/include/rive/shapes/metrics_path.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_METRICS_PATH_HPP_
 #define _RIVE_METRICS_PATH_HPP_
 
-#include "command_path.hpp"
-#include "math/vec2d.hpp"
+#include "rive/command_path.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cassert>
 #include <vector>
 
diff --git a/include/shapes/paint/blend_mode.hpp b/include/rive/shapes/paint/blend_mode.hpp
similarity index 100%
rename from include/shapes/paint/blend_mode.hpp
rename to include/rive/shapes/paint/blend_mode.hpp
diff --git a/include/shapes/paint/color.hpp b/include/rive/shapes/paint/color.hpp
similarity index 100%
rename from include/shapes/paint/color.hpp
rename to include/rive/shapes/paint/color.hpp
diff --git a/include/shapes/paint/fill.hpp b/include/rive/shapes/paint/fill.hpp
similarity index 77%
rename from include/shapes/paint/fill.hpp
rename to include/rive/shapes/paint/fill.hpp
index 63e5ed2..22fedae 100644
--- a/include/shapes/paint/fill.hpp
+++ b/include/rive/shapes/paint/fill.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_FILL_HPP_
 #define _RIVE_FILL_HPP_
-#include "generated/shapes/paint/fill_base.hpp"
-#include "shapes/path_space.hpp"
+#include "rive/generated/shapes/paint/fill_base.hpp"
+#include "rive/shapes/path_space.hpp"
 namespace rive
 {
 	class Fill : public FillBase
diff --git a/include/shapes/paint/gradient_stop.hpp b/include/rive/shapes/paint/gradient_stop.hpp
similarity index 83%
rename from include/shapes/paint/gradient_stop.hpp
rename to include/rive/shapes/paint/gradient_stop.hpp
index c1d0130..4d0256f 100644
--- a/include/shapes/paint/gradient_stop.hpp
+++ b/include/rive/shapes/paint/gradient_stop.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_GRADIENT_STOP_HPP_
 #define _RIVE_GRADIENT_STOP_HPP_
-#include "generated/shapes/paint/gradient_stop_base.hpp"
+#include "rive/generated/shapes/paint/gradient_stop_base.hpp"
 namespace rive
 {
 	class GradientStop : public GradientStopBase
diff --git a/include/shapes/paint/linear_gradient.hpp b/include/rive/shapes/paint/linear_gradient.hpp
similarity index 85%
rename from include/shapes/paint/linear_gradient.hpp
rename to include/rive/shapes/paint/linear_gradient.hpp
index c85a891..f201747 100644
--- a/include/shapes/paint/linear_gradient.hpp
+++ b/include/rive/shapes/paint/linear_gradient.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_LINEAR_GRADIENT_HPP_
 #define _RIVE_LINEAR_GRADIENT_HPP_
-#include "generated/shapes/paint/linear_gradient_base.hpp"
-#include "math/vec2d.hpp"
-#include "shapes/paint/shape_paint_mutator.hpp"
+#include "rive/generated/shapes/paint/linear_gradient_base.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/shapes/paint/shape_paint_mutator.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/shapes/paint/radial_gradient.hpp b/include/rive/shapes/paint/radial_gradient.hpp
similarity index 79%
rename from include/shapes/paint/radial_gradient.hpp
rename to include/rive/shapes/paint/radial_gradient.hpp
index a121344..547b960 100644
--- a/include/shapes/paint/radial_gradient.hpp
+++ b/include/rive/shapes/paint/radial_gradient.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_RADIAL_GRADIENT_HPP_
 #define _RIVE_RADIAL_GRADIENT_HPP_
-#include "generated/shapes/paint/radial_gradient_base.hpp"
+#include "rive/generated/shapes/paint/radial_gradient_base.hpp"
 namespace rive
 {
 	class RadialGradient : public RadialGradientBase
diff --git a/include/shapes/paint/shape_paint.hpp b/include/rive/shapes/paint/shape_paint.hpp
similarity index 83%
rename from include/shapes/paint/shape_paint.hpp
rename to include/rive/shapes/paint/shape_paint.hpp
index c0a67c7..9453ce1 100644
--- a/include/shapes/paint/shape_paint.hpp
+++ b/include/rive/shapes/paint/shape_paint.hpp
@@ -1,10 +1,10 @@
 #ifndef _RIVE_SHAPE_PAINT_HPP_
 #define _RIVE_SHAPE_PAINT_HPP_
-#include "generated/shapes/paint/shape_paint_base.hpp"
-#include "renderer.hpp"
-#include "shapes/paint/blend_mode.hpp"
-#include "shapes/paint/shape_paint_mutator.hpp"
-#include "shapes/path_space.hpp"
+#include "rive/generated/shapes/paint/shape_paint_base.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/paint/blend_mode.hpp"
+#include "rive/shapes/paint/shape_paint_mutator.hpp"
+#include "rive/shapes/path_space.hpp"
 namespace rive
 {
 	class RenderPaint;
diff --git a/include/shapes/paint/shape_paint_mutator.hpp b/include/rive/shapes/paint/shape_paint_mutator.hpp
similarity index 100%
rename from include/shapes/paint/shape_paint_mutator.hpp
rename to include/rive/shapes/paint/shape_paint_mutator.hpp
diff --git a/include/shapes/paint/solid_color.hpp b/include/rive/shapes/paint/solid_color.hpp
similarity index 74%
rename from include/shapes/paint/solid_color.hpp
rename to include/rive/shapes/paint/solid_color.hpp
index 3c489e8..96ab882 100644
--- a/include/shapes/paint/solid_color.hpp
+++ b/include/rive/shapes/paint/solid_color.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SOLID_COLOR_HPP_
 #define _RIVE_SOLID_COLOR_HPP_
-#include "generated/shapes/paint/solid_color_base.hpp"
-#include "shapes/paint/shape_paint_mutator.hpp"
+#include "rive/generated/shapes/paint/solid_color_base.hpp"
+#include "rive/shapes/paint/shape_paint_mutator.hpp"
 namespace rive
 {
 	class SolidColor : public SolidColorBase, public ShapePaintMutator
diff --git a/include/shapes/paint/stroke.hpp b/include/rive/shapes/paint/stroke.hpp
similarity index 87%
rename from include/shapes/paint/stroke.hpp
rename to include/rive/shapes/paint/stroke.hpp
index cce9a43..80c4fb5 100644
--- a/include/shapes/paint/stroke.hpp
+++ b/include/rive/shapes/paint/stroke.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_STROKE_HPP_
 #define _RIVE_STROKE_HPP_
-#include "generated/shapes/paint/stroke_base.hpp"
-#include "shapes/path_space.hpp"
+#include "rive/generated/shapes/paint/stroke_base.hpp"
+#include "rive/shapes/path_space.hpp"
 namespace rive
 {
 	class StrokeEffect;
diff --git a/include/shapes/paint/stroke_cap.hpp b/include/rive/shapes/paint/stroke_cap.hpp
similarity index 100%
rename from include/shapes/paint/stroke_cap.hpp
rename to include/rive/shapes/paint/stroke_cap.hpp
diff --git a/include/shapes/paint/stroke_effect.hpp b/include/rive/shapes/paint/stroke_effect.hpp
similarity index 100%
rename from include/shapes/paint/stroke_effect.hpp
rename to include/rive/shapes/paint/stroke_effect.hpp
diff --git a/include/shapes/paint/stroke_join.hpp b/include/rive/shapes/paint/stroke_join.hpp
similarity index 100%
rename from include/shapes/paint/stroke_join.hpp
rename to include/rive/shapes/paint/stroke_join.hpp
diff --git a/include/shapes/paint/trim_path.hpp b/include/rive/shapes/paint/trim_path.hpp
similarity index 84%
rename from include/shapes/paint/trim_path.hpp
rename to include/rive/shapes/paint/trim_path.hpp
index 36217f6..a7047e4 100644
--- a/include/shapes/paint/trim_path.hpp
+++ b/include/rive/shapes/paint/trim_path.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRIM_PATH_HPP_
 #define _RIVE_TRIM_PATH_HPP_
-#include "generated/shapes/paint/trim_path_base.hpp"
-#include "shapes/paint/stroke_effect.hpp"
+#include "rive/generated/shapes/paint/trim_path_base.hpp"
+#include "rive/shapes/paint/stroke_effect.hpp"
 #include <stdio.h>
 
 namespace rive
diff --git a/include/shapes/parametric_path.hpp b/include/rive/shapes/parametric_path.hpp
similarity index 84%
rename from include/shapes/parametric_path.hpp
rename to include/rive/shapes/parametric_path.hpp
index 728fc99..b72098f 100644
--- a/include/shapes/parametric_path.hpp
+++ b/include/rive/shapes/parametric_path.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_PARAMETRIC_PATH_HPP_
 #define _RIVE_PARAMETRIC_PATH_HPP_
-#include "generated/shapes/parametric_path_base.hpp"
+#include "rive/generated/shapes/parametric_path_base.hpp"
 namespace rive
 {
 	class ParametricPath : public ParametricPathBase
diff --git a/include/shapes/path.hpp b/include/rive/shapes/path.hpp
similarity index 95%
rename from include/shapes/path.hpp
rename to include/rive/shapes/path.hpp
index a4b3567..074b3be 100644
--- a/include/shapes/path.hpp
+++ b/include/rive/shapes/path.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_PATH_HPP_
 #define _RIVE_PATH_HPP_
-#include "generated/shapes/path_base.hpp"
-#include "math/mat2d.hpp"
+#include "rive/generated/shapes/path_base.hpp"
+#include "rive/math/mat2d.hpp"
 #include <vector>
 
 namespace rive
diff --git a/include/shapes/path_composer.hpp b/include/rive/shapes/path_composer.hpp
similarity index 95%
rename from include/shapes/path_composer.hpp
rename to include/rive/shapes/path_composer.hpp
index 385ba41..e412878 100644
--- a/include/shapes/path_composer.hpp
+++ b/include/rive/shapes/path_composer.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_PATH_COMPOSER_HPP_
 #define _RIVE_PATH_COMPOSER_HPP_
-#include "component.hpp"
+#include "rive/component.hpp"
 namespace rive
 {
 	class Shape;
diff --git a/include/shapes/path_space.hpp b/include/rive/shapes/path_space.hpp
similarity index 100%
rename from include/shapes/path_space.hpp
rename to include/rive/shapes/path_space.hpp
diff --git a/include/shapes/path_vertex.hpp b/include/rive/shapes/path_vertex.hpp
similarity index 85%
rename from include/shapes/path_vertex.hpp
rename to include/rive/shapes/path_vertex.hpp
index a1b5d97..d4ce1f8 100644
--- a/include/shapes/path_vertex.hpp
+++ b/include/rive/shapes/path_vertex.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_PATH_VERTEX_HPP_
 #define _RIVE_PATH_VERTEX_HPP_
-#include "bones/weight.hpp"
-#include "generated/shapes/path_vertex_base.hpp"
-#include "math/mat2d.hpp"
+#include "rive/bones/weight.hpp"
+#include "rive/generated/shapes/path_vertex_base.hpp"
+#include "rive/math/mat2d.hpp"
 namespace rive
 {
 	class PathVertex : public PathVertexBase
diff --git a/include/shapes/points_path.hpp b/include/rive/shapes/points_path.hpp
similarity index 82%
rename from include/shapes/points_path.hpp
rename to include/rive/shapes/points_path.hpp
index 70cdd2c..6763608 100644
--- a/include/shapes/points_path.hpp
+++ b/include/rive/shapes/points_path.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_POINTS_PATH_HPP_
 #define _RIVE_POINTS_PATH_HPP_
-#include "bones/skinnable.hpp"
-#include "generated/shapes/points_path_base.hpp"
+#include "rive/bones/skinnable.hpp"
+#include "rive/generated/shapes/points_path_base.hpp"
 namespace rive
 {
 	class PointsPath : public PointsPathBase, public Skinnable
diff --git a/include/shapes/polygon.hpp b/include/rive/shapes/polygon.hpp
similarity index 77%
rename from include/shapes/polygon.hpp
rename to include/rive/shapes/polygon.hpp
index ef3724d..a0e05a0 100644
--- a/include/shapes/polygon.hpp
+++ b/include/rive/shapes/polygon.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_POLYGON_HPP_
 #define _RIVE_POLYGON_HPP_
-#include "generated/shapes/polygon_base.hpp"
-#include "shapes/path_vertex.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/generated/shapes/polygon_base.hpp"
+#include "rive/shapes/path_vertex.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 #include <vector>
 namespace rive
 {
diff --git a/include/shapes/rectangle.hpp b/include/rive/shapes/rectangle.hpp
similarity index 82%
rename from include/shapes/rectangle.hpp
rename to include/rive/shapes/rectangle.hpp
index 5b071f6..df633c5 100644
--- a/include/shapes/rectangle.hpp
+++ b/include/rive/shapes/rectangle.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_RECTANGLE_HPP_
 #define _RIVE_RECTANGLE_HPP_
-#include "generated/shapes/rectangle_base.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/generated/shapes/rectangle_base.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 
 namespace rive
 {
diff --git a/include/shapes/shape.hpp b/include/rive/shapes/shape.hpp
similarity index 85%
rename from include/shapes/shape.hpp
rename to include/rive/shapes/shape.hpp
index b3c03a9..30ca2d9 100644
--- a/include/shapes/shape.hpp
+++ b/include/rive/shapes/shape.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_SHAPE_HPP_
 #define _RIVE_SHAPE_HPP_
-#include "generated/shapes/shape_base.hpp"
-#include "shapes/path_composer.hpp"
-#include "shapes/shape_paint_container.hpp"
+#include "rive/generated/shapes/shape_base.hpp"
+#include "rive/shapes/path_composer.hpp"
+#include "rive/shapes/shape_paint_container.hpp"
 #include <vector>
 
 namespace rive
diff --git a/include/shapes/shape_paint_container.hpp b/include/rive/shapes/shape_paint_container.hpp
similarity index 88%
rename from include/shapes/shape_paint_container.hpp
rename to include/rive/shapes/shape_paint_container.hpp
index a8b2bdf..d00b832 100644
--- a/include/shapes/shape_paint_container.hpp
+++ b/include/rive/shapes/shape_paint_container.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_SHAPE_PAINT_CONTAINER_HPP_
 #define _RIVE_SHAPE_PAINT_CONTAINER_HPP_
-#include "shapes/paint/blend_mode.hpp"
-#include "shapes/path_space.hpp"
+#include "rive/shapes/paint/blend_mode.hpp"
+#include "rive/shapes/path_space.hpp"
 #include <vector>
 
 namespace rive
diff --git a/include/shapes/star.hpp b/include/rive/shapes/star.hpp
similarity index 87%
rename from include/shapes/star.hpp
rename to include/rive/shapes/star.hpp
index 6743b4a..2651a0f 100644
--- a/include/shapes/star.hpp
+++ b/include/rive/shapes/star.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STAR_HPP_
 #define _RIVE_STAR_HPP_
-#include "generated/shapes/star_base.hpp"
+#include "rive/generated/shapes/star_base.hpp"
 #include <stdio.h>
 namespace rive
 {
diff --git a/include/shapes/straight_vertex.hpp b/include/rive/shapes/straight_vertex.hpp
similarity index 78%
rename from include/shapes/straight_vertex.hpp
rename to include/rive/shapes/straight_vertex.hpp
index 93955f4..a5b286b 100644
--- a/include/shapes/straight_vertex.hpp
+++ b/include/rive/shapes/straight_vertex.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_STRAIGHT_VERTEX_HPP_
 #define _RIVE_STRAIGHT_VERTEX_HPP_
-#include "generated/shapes/straight_vertex_base.hpp"
+#include "rive/generated/shapes/straight_vertex_base.hpp"
 namespace rive
 {
 	class StraightVertex : public StraightVertexBase
diff --git a/include/shapes/triangle.hpp b/include/rive/shapes/triangle.hpp
similarity index 74%
rename from include/shapes/triangle.hpp
rename to include/rive/shapes/triangle.hpp
index 2fb8154..a219932 100644
--- a/include/shapes/triangle.hpp
+++ b/include/rive/shapes/triangle.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_TRIANGLE_HPP_
 #define _RIVE_TRIANGLE_HPP_
-#include "generated/shapes/triangle_base.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/generated/shapes/triangle_base.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 
 namespace rive
 {
diff --git a/include/status_code.hpp b/include/rive/status_code.hpp
similarity index 100%
rename from include/status_code.hpp
rename to include/rive/status_code.hpp
diff --git a/include/transform_component.hpp b/include/rive/transform_component.hpp
similarity index 67%
rename from include/transform_component.hpp
rename to include/rive/transform_component.hpp
index f16268e..80dcf57 100644
--- a/include/transform_component.hpp
+++ b/include/rive/transform_component.hpp
@@ -1,10 +1,11 @@
 #ifndef _RIVE_TRANSFORM_COMPONENT_HPP_
 #define _RIVE_TRANSFORM_COMPONENT_HPP_
-#include "generated/transform_component_base.hpp"
-#include "math/mat2d.hpp"
+#include "rive/generated/transform_component_base.hpp"
+#include "rive/math/mat2d.hpp"
 
 namespace rive
 {
+	class Constraint;
 	class TransformComponent : public TransformComponentBase
 	{
 	private:
@@ -12,8 +13,15 @@
 		Mat2D m_WorldTransform;
 		float m_RenderOpacity = 0.0f;
 		TransformComponent* m_ParentTransformComponent = nullptr;
+		std::vector<Constraint*> m_Constraints;
 
 	public:
+#ifdef TESTING
+		const std::vector<Constraint*>& constraints() const
+		{
+			return m_Constraints;
+		}
+#endif
 		StatusCode onAddedClean(CoreContext* context) override;
 		void buildDependencies() override;
 		void update(ComponentDirt value) override;
@@ -21,6 +29,7 @@
 		void updateWorldTransform();
 		void markTransformDirty();
 		void markWorldTransformDirty();
+		void worldTranslation(Vec2D& result) const;
 
 		/// Opacity inherited by any child of this transform component. This'll
 		/// later get overridden by effect layers.
@@ -30,6 +39,11 @@
 		const Mat2D& transform() const;
 		const Mat2D& worldTransform() const;
 
+		/// Explicitly dangerous. Use transform/worldTransform when you don't
+		/// need to transform things outside of their hierarchy.
+		Mat2D& mutableTransform();
+		Mat2D& mutableWorldTransform();
+
 		virtual float x() const = 0;
 		virtual float y() const = 0;
 
@@ -37,6 +51,8 @@
 		void scaleXChanged() override;
 		void scaleYChanged() override;
 		void opacityChanged() override;
+
+		void addConstraint(Constraint* constraint);
 	};
 } // namespace rive
 
diff --git a/include/rive/transform_space.hpp b/include/rive/transform_space.hpp
new file mode 100644
index 0000000..0bfc44d
--- /dev/null
+++ b/include/rive/transform_space.hpp
@@ -0,0 +1,11 @@
+#ifndef _RIVE_TRANSFORM_SPACE_HPP_
+#define _RIVE_TRANSFORM_SPACE_HPP_
+namespace rive
+{
+	enum class TransformSpace : unsigned int
+	{
+		world = 0,
+		local = 1
+	};
+}
+#endif
\ No newline at end of file
diff --git a/renderer/library/include/graphics_api.hpp b/renderer/library/include/graphics_api.hpp
index 1eeeef9..cf92c40 100644
--- a/renderer/library/include/graphics_api.hpp
+++ b/renderer/library/include/graphics_api.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_GRAPHICS_API_HPP_
 #define _RIVE_GRAPHICS_API_HPP_
 
-#include "renderer.hpp"
+#include "rive/renderer.hpp"
 
 namespace rive
 {
diff --git a/renderer/library/include/low_level/low_level_renderer.hpp b/renderer/library/include/low_level/low_level_renderer.hpp
index 9c377a4..17682e9 100644
--- a/renderer/library/include/low_level/low_level_renderer.hpp
+++ b/renderer/library/include/low_level/low_level_renderer.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_LOW_LEVEL_RENDERER_HPP_
 #define _RIVE_LOW_LEVEL_RENDERER_HPP_
 
-#include "renderer.hpp"
+#include "rive/renderer.hpp"
+#include "rive/math/mat2d.hpp"
 #include "graphics_api.hpp"
-#include "math/mat2d.hpp"
 #include <stdint.h>
 #include <list>
 #include <vector>
diff --git a/renderer/library/include/metal/metal_render_paint.hpp b/renderer/library/include/metal/metal_render_paint.hpp
index e8f5c91..fde31ab 100644
--- a/renderer/library/include/metal/metal_render_paint.hpp
+++ b/renderer/library/include/metal/metal_render_paint.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_METAL_RENDER_PAINT_HPP_
 #define _RIVE_METAL_RENDER_PAINT_HPP_
 
-#include "renderer.hpp"
+#include "rive/renderer.hpp"
 
 namespace rive
 {
diff --git a/renderer/library/include/metal/metal_render_path.hpp b/renderer/library/include/metal/metal_render_path.hpp
index 3a3da78..08bb2f0 100644
--- a/renderer/library/include/metal/metal_render_path.hpp
+++ b/renderer/library/include/metal/metal_render_path.hpp
@@ -1,7 +1,7 @@
 #ifndef _RIVE_METAL_RENDER_PATH_HPP_
 #define _RIVE_METAL_RENDER_PATH_HPP_
 
-#include "contour_render_path.hpp"
+#include "rive/contour_render_path.hpp"
 
 namespace rive
 {
diff --git a/renderer/library/include/opengl/opengl_render_paint.hpp b/renderer/library/include/opengl/opengl_render_paint.hpp
index 6a1d941..72ca144 100644
--- a/renderer/library/include/opengl/opengl_render_paint.hpp
+++ b/renderer/library/include/opengl/opengl_render_paint.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_OPENGL_RENDER_PAINT_HPP_
 #define _RIVE_OPENGL_RENDER_PAINT_HPP_
 
-#include "renderer.hpp"
-#include <vector>
+#include "rive/renderer.hpp"
 #include "opengl/opengl.h"
+#include <vector>
 
 namespace rive
 {
diff --git a/renderer/library/include/opengl/opengl_render_path.hpp b/renderer/library/include/opengl/opengl_render_path.hpp
index fa4242c..e56e5b4 100644
--- a/renderer/library/include/opengl/opengl_render_path.hpp
+++ b/renderer/library/include/opengl/opengl_render_path.hpp
@@ -1,9 +1,9 @@
 #ifndef _RIVE_OPENGL_RENDER_PATH_HPP_
 #define _RIVE_OPENGL_RENDER_PATH_HPP_
 
-#include "contour_render_path.hpp"
 #include "opengl.h"
-#include "math/mat2d.hpp"
+#include "rive/contour_render_path.hpp"
+#include "rive/math/mat2d.hpp"
 
 namespace rive
 {
diff --git a/renderer/library/include/opengl/opengl_renderer.hpp b/renderer/library/include/opengl/opengl_renderer.hpp
index cbb538c..2b779e6 100644
--- a/renderer/library/include/opengl/opengl_renderer.hpp
+++ b/renderer/library/include/opengl/opengl_renderer.hpp
@@ -1,8 +1,8 @@
 #ifndef _RIVE_OPENGL_RENDERER_HPP_
 #define _RIVE_OPENGL_RENDERER_HPP_
 
+#include "rive/math/mat2d.hpp"
 #include "low_level/low_level_renderer.hpp"
-#include "math/mat2d.hpp"
 #include "opengl.h"
 #include <vector>
 
diff --git a/renderer/library/src/opengl/opengl_render_paint.cpp b/renderer/library/src/opengl/opengl_render_paint.cpp
index eb44615..902d39c 100644
--- a/renderer/library/src/opengl/opengl_render_paint.cpp
+++ b/renderer/library/src/opengl/opengl_render_paint.cpp
@@ -1,8 +1,9 @@
 #include "opengl/opengl_render_paint.hpp"
-#include "shapes/paint/color.hpp"
 #include "opengl/opengl_renderer.hpp"
 #include "opengl/opengl_render_path.hpp"
-#include "contour_stroke.hpp"
+
+#include "rive/shapes/paint/color.hpp"
+#include "rive/contour_stroke.hpp"
 
 using namespace rive;
 
diff --git a/renderer/library/src/opengl/opengl_render_path.cpp b/renderer/library/src/opengl/opengl_render_path.cpp
index 6e72e68..fa931ae 100644
--- a/renderer/library/src/opengl/opengl_render_path.cpp
+++ b/renderer/library/src/opengl/opengl_render_path.cpp
@@ -1,7 +1,7 @@
 #include "opengl/opengl_render_path.hpp"
 #include "opengl/opengl_renderer.hpp"
 #include "opengl/opengl.h"
-#include "contour_stroke.hpp"
+#include "rive/contour_stroke.hpp"
 
 using namespace rive;
 
diff --git a/renderer/viewer/src/viewer.cpp b/renderer/viewer/src/viewer.cpp
index 3631e17..517d5a2 100644
--- a/renderer/viewer/src/viewer.cpp
+++ b/renderer/viewer/src/viewer.cpp
@@ -1,7 +1,7 @@
-#include "artboard.hpp"
-#include "file.hpp"
-#include "layout.hpp"
-#include "animation/linear_animation_instance.hpp"
+#include "rive/artboard.hpp"
+#include "rive/file.hpp"
+#include "rive/layout.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
 #include "low_level/low_level_renderer.hpp"
 #include <string.h>
 
diff --git a/skia/renderer/build/premake5.lua b/skia/renderer/build/premake5.lua
index 4eeb7b7..7d25a55 100644
--- a/skia/renderer/build/premake5.lua
+++ b/skia/renderer/build/premake5.lua
@@ -5,6 +5,7 @@
 kind "StaticLib"
 language "C++"
 cppdialect "C++17"
+toolset "clang"
 targetdir "bin/%{cfg.buildcfg}"
 objdir "obj/%{cfg.buildcfg}"
 includedirs {"../include", "../../../include", "../../dependencies/skia", "../../dependencies/skia/include/core",
diff --git a/skia/renderer/include/skia_renderer.hpp b/skia/renderer/include/skia_renderer.hpp
index 4242f1d..002d768 100644
--- a/skia/renderer/include/skia_renderer.hpp
+++ b/skia/renderer/include/skia_renderer.hpp
@@ -4,7 +4,7 @@
 #include "SkCanvas.h"
 #include "SkPaint.h"
 #include "SkPath.h"
-#include "renderer.hpp"
+#include "rive/renderer.hpp"
 #include <vector>
 
 namespace rive
diff --git a/skia/renderer/include/to_skia.hpp b/skia/renderer/include/to_skia.hpp
index 68b0ad4..cf3f7d9 100644
--- a/skia/renderer/include/to_skia.hpp
+++ b/skia/renderer/include/to_skia.hpp
@@ -2,11 +2,11 @@
 #define _RIVE_TO_SKIA_HPP_
 
 #include "SkPaint.h"
-#include "math/mat2d.hpp"
-#include "math/vec2d.hpp"
-#include "shapes/paint/stroke_cap.hpp"
-#include "shapes/paint/stroke_join.hpp"
-#include "shapes/paint/blend_mode.hpp"
+#include "rive/math/mat2d.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/shapes/paint/stroke_cap.hpp"
+#include "rive/shapes/paint/stroke_join.hpp"
+#include "rive/shapes/paint/blend_mode.hpp"
 
 namespace rive
 {
diff --git a/skia/renderer/src/skia_renderer.cpp b/skia/renderer/src/skia_renderer.cpp
index dc0fce4..4d05007 100644
--- a/skia/renderer/src/skia_renderer.cpp
+++ b/skia/renderer/src/skia_renderer.cpp
@@ -1,8 +1,8 @@
 #include "skia_renderer.hpp"
 #include "SkGradientShader.h"
 #include "SkPath.h"
-#include "math/vec2d.hpp"
-#include "shapes/paint/color.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/shapes/paint/color.hpp"
 #include "to_skia.hpp"
 
 using namespace rive;
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp
index 25f61a0..fc138a9 100644
--- a/skia/viewer/src/main.cpp
+++ b/skia/viewer/src/main.cpp
@@ -13,16 +13,16 @@
 #include "SkTypes.h"
 #include "gl/GrGLInterface.h"
 
-#include "animation/linear_animation_instance.hpp"
-#include "animation/state_machine_instance.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "artboard.hpp"
-#include "file.hpp"
-#include "layout.hpp"
-#include "math/aabb.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
+#include "rive/animation/state_machine_instance.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/state_machine_bool.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/artboard.hpp"
+#include "rive/file.hpp"
+#include "rive/layout.hpp"
+#include "rive/math/aabb.hpp"
 #include "skia_renderer.hpp"
 
 #include "imgui/backends/imgui_impl_glfw.h"
diff --git a/src/animation/animation_state.cpp b/src/animation/animation_state.cpp
index ccb6811..ea63f16 100644
--- a/src/animation/animation_state.cpp
+++ b/src/animation/animation_state.cpp
@@ -1,9 +1,9 @@
-#include "animation/animation_state.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/animation_state_instance.hpp"
-#include "animation/system_state_instance.hpp"
-#include "core_context.hpp"
-#include "artboard.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/animation_state_instance.hpp"
+#include "rive/animation/system_state_instance.hpp"
+#include "rive/core_context.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/animation_state_instance.cpp b/src/animation/animation_state_instance.cpp
index b349b63..6b5ca9b 100644
--- a/src/animation/animation_state_instance.cpp
+++ b/src/animation/animation_state_instance.cpp
@@ -1,5 +1,5 @@
-#include "animation/animation_state_instance.hpp"
-#include "animation/animation_state.hpp"
+#include "rive/animation/animation_state_instance.hpp"
+#include "rive/animation/animation_state.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_animation.cpp b/src/animation/blend_animation.cpp
index 43c4dc7..5a319ba 100644
--- a/src/animation/blend_animation.cpp
+++ b/src/animation/blend_animation.cpp
@@ -1,8 +1,8 @@
-#include "artboard.hpp"
-#include "animation/blend_animation.hpp"
-#include "animation/layer_state.hpp"
-#include "importers/layer_state_importer.hpp"
-#include "importers/artboard_importer.hpp"
+#include "rive/artboard.hpp"
+#include "rive/animation/blend_animation.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/importers/layer_state_importer.hpp"
+#include "rive/importers/artboard_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_animation_1d.cpp b/src/animation/blend_animation_1d.cpp
index 607f142..d4c930d 100644
--- a/src/animation/blend_animation_1d.cpp
+++ b/src/animation/blend_animation_1d.cpp
@@ -1,4 +1,4 @@
-#include "animation/blend_animation_1d.hpp"
+#include "rive/animation/blend_animation_1d.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_animation_direct.cpp b/src/animation/blend_animation_direct.cpp
index 5013f1e..a64eb06 100644
--- a/src/animation/blend_animation_direct.cpp
+++ b/src/animation/blend_animation_direct.cpp
@@ -1,7 +1,7 @@
-#include "animation/blend_animation_direct.hpp"
-#include "animation/state_machine.hpp"
-#include "animation/state_machine_number.hpp"
-#include "importers/state_machine_importer.hpp"
+#include "rive/animation/blend_animation_direct.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/importers/state_machine_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state.cpp b/src/animation/blend_state.cpp
index 856514d..8ba0fba 100644
--- a/src/animation/blend_state.cpp
+++ b/src/animation/blend_state.cpp
@@ -1,5 +1,5 @@
-#include "animation/blend_state.hpp"
-#include "animation/blend_animation.hpp"
+#include "rive/animation/blend_state.hpp"
+#include "rive/animation/blend_animation.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state_1d.cpp b/src/animation/blend_state_1d.cpp
index 965a0d1..e4a4da9 100644
--- a/src/animation/blend_state_1d.cpp
+++ b/src/animation/blend_state_1d.cpp
@@ -1,8 +1,8 @@
-#include "animation/blend_state_1d.hpp"
-#include "animation/state_machine.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/blend_state_1d_instance.hpp"
-#include "importers/state_machine_importer.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/blend_state_1d_instance.hpp"
+#include "rive/importers/state_machine_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state_1d_instance.cpp b/src/animation/blend_state_1d_instance.cpp
index d14b3d4..690ea3c 100644
--- a/src/animation/blend_state_1d_instance.cpp
+++ b/src/animation/blend_state_1d_instance.cpp
@@ -1,5 +1,5 @@
-#include "animation/blend_state_1d_instance.hpp"
-#include "animation/state_machine_input_instance.hpp"
+#include "rive/animation/blend_state_1d_instance.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state_direct.cpp b/src/animation/blend_state_direct.cpp
index 67356b2..d439f73 100644
--- a/src/animation/blend_state_direct.cpp
+++ b/src/animation/blend_state_direct.cpp
@@ -1,8 +1,8 @@
-#include "animation/blend_state_direct.hpp"
-#include "animation/state_machine.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/blend_state_direct_instance.hpp"
-#include "importers/state_machine_importer.hpp"
+#include "rive/animation/blend_state_direct.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/blend_state_direct_instance.hpp"
+#include "rive/importers/state_machine_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state_direct_instance.cpp b/src/animation/blend_state_direct_instance.cpp
index 1e2bef8..fa3bf17 100644
--- a/src/animation/blend_state_direct_instance.cpp
+++ b/src/animation/blend_state_direct_instance.cpp
@@ -1,5 +1,5 @@
-#include "animation/blend_state_direct_instance.hpp"
-#include "animation/state_machine_input_instance.hpp"
+#include "rive/animation/blend_state_direct_instance.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/blend_state_transition.cpp b/src/animation/blend_state_transition.cpp
index de3d807..7068a6d 100644
--- a/src/animation/blend_state_transition.cpp
+++ b/src/animation/blend_state_transition.cpp
@@ -1,10 +1,10 @@
-#include "artboard.hpp"
-#include "animation/blend_state_transition.hpp"
-#include "animation/blend_state_instance.hpp"
-#include "animation/blend_state_1d.hpp"
-#include "animation/blend_state_direct.hpp"
-#include "animation/blend_state_1d_instance.hpp"
-#include "animation/blend_state_direct_instance.hpp"
+#include "rive/artboard.hpp"
+#include "rive/animation/blend_state_transition.hpp"
+#include "rive/animation/blend_state_instance.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+#include "rive/animation/blend_state_direct.hpp"
+#include "rive/animation/blend_state_1d_instance.hpp"
+#include "rive/animation/blend_state_direct_instance.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/cubic_interpolator.cpp b/src/animation/cubic_interpolator.cpp
index 7de6139..6d33fc8 100644
--- a/src/animation/cubic_interpolator.cpp
+++ b/src/animation/cubic_interpolator.cpp
@@ -1,7 +1,7 @@
-#include "animation/cubic_interpolator.hpp"
-#include "artboard.hpp"
-#include "importers/artboard_importer.hpp"
-#include "importers/import_stack.hpp"
+#include "rive/animation/cubic_interpolator.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/importers/import_stack.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/animation/keyed_object.cpp b/src/animation/keyed_object.cpp
index 73738a2..f27386c 100644
--- a/src/animation/keyed_object.cpp
+++ b/src/animation/keyed_object.cpp
@@ -1,8 +1,8 @@
-#include "animation/keyed_object.hpp"
-#include "animation/keyed_property.hpp"
-#include "animation/linear_animation.hpp"
-#include "artboard.hpp"
-#include "importers/linear_animation_importer.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/linear_animation_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/keyed_property.cpp b/src/animation/keyed_property.cpp
index ab7c9b5..9f6d7b2 100644
--- a/src/animation/keyed_property.cpp
+++ b/src/animation/keyed_property.cpp
@@ -1,8 +1,8 @@
-#include "animation/keyed_property.hpp"
-#include "animation/keyed_object.hpp"
-#include "animation/keyframe.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/keyed_object_importer.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/keyed_object_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/keyframe.cpp b/src/animation/keyframe.cpp
index b25cdf9..3f76471 100644
--- a/src/animation/keyframe.cpp
+++ b/src/animation/keyframe.cpp
@@ -1,9 +1,9 @@
-#include "animation/keyframe.hpp"
-#include "animation/cubic_interpolator.hpp"
-#include "animation/keyed_property.hpp"
-#include "core_context.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/keyed_property_importer.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/animation/cubic_interpolator.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/core_context.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/keyed_property_importer.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/keyframe_color.cpp b/src/animation/keyframe_color.cpp
index f51ad27..3dcd5ab 100644
--- a/src/animation/keyframe_color.cpp
+++ b/src/animation/keyframe_color.cpp
@@ -1,6 +1,6 @@
-#include "animation/keyframe_color.hpp"
-#include "generated/core_registry.hpp"
-#include "shapes/paint/color.hpp"
+#include "rive/animation/keyframe_color.hpp"
+#include "rive/generated/core_registry.hpp"
+#include "rive/shapes/paint/color.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/keyframe_double.cpp b/src/animation/keyframe_double.cpp
index bc57c04..1fcc2e1 100644
--- a/src/animation/keyframe_double.cpp
+++ b/src/animation/keyframe_double.cpp
@@ -1,5 +1,5 @@
-#include "animation/keyframe_double.hpp"
-#include "generated/core_registry.hpp"
+#include "rive/animation/keyframe_double.hpp"
+#include "rive/generated/core_registry.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/keyframe_id.cpp b/src/animation/keyframe_id.cpp
index 7fbc94c..dfcc104 100644
--- a/src/animation/keyframe_id.cpp
+++ b/src/animation/keyframe_id.cpp
@@ -1,5 +1,5 @@
-#include "animation/keyframe_id.hpp"
-#include "generated/core_registry.hpp"
+#include "rive/animation/keyframe_id.hpp"
+#include "rive/generated/core_registry.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/layer_state.cpp b/src/animation/layer_state.cpp
index a40de0e..f4c5446 100644
--- a/src/animation/layer_state.cpp
+++ b/src/animation/layer_state.cpp
@@ -1,10 +1,10 @@
-#include "animation/layer_state.hpp"
-#include "animation/transition_bool_condition.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/state_machine_layer_importer.hpp"
-#include "generated/animation/state_machine_layer_base.hpp"
-#include "animation/state_transition.hpp"
-#include "animation/system_state_instance.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/animation/transition_bool_condition.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/state_machine_layer_importer.hpp"
+#include "rive/generated/animation/state_machine_layer_base.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/animation/system_state_instance.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/linear_animation.cpp b/src/animation/linear_animation.cpp
index adab0f2..1ec54c4 100644
--- a/src/animation/linear_animation.cpp
+++ b/src/animation/linear_animation.cpp
@@ -1,8 +1,8 @@
-#include "animation/linear_animation.hpp"
-#include "animation/keyed_object.hpp"
-#include "artboard.hpp"
-#include "importers/artboard_importer.hpp"
-#include "importers/import_stack.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/importers/import_stack.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/linear_animation_instance.cpp b/src/animation/linear_animation_instance.cpp
index b58e006..8240476 100644
--- a/src/animation/linear_animation_instance.cpp
+++ b/src/animation/linear_animation_instance.cpp
@@ -1,6 +1,6 @@
-#include "animation/linear_animation_instance.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/loop.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/loop.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/animation/state_instance.cpp b/src/animation/state_instance.cpp
index dc9e49e..b39b08d 100644
--- a/src/animation/state_instance.cpp
+++ b/src/animation/state_instance.cpp
@@ -1,4 +1,4 @@
-#include "animation/state_instance.hpp"
+#include "rive/animation/state_instance.hpp"
 using namespace rive;
 
 StateInstance::StateInstance(const LayerState* layerState) :
diff --git a/src/animation/state_machine.cpp b/src/animation/state_machine.cpp
index 6103052..7d1caa8 100644
--- a/src/animation/state_machine.cpp
+++ b/src/animation/state_machine.cpp
@@ -1,8 +1,8 @@
-#include "animation/state_machine.hpp"
-#include "artboard.hpp"
-#include "importers/artboard_importer.hpp"
-#include "animation/state_machine_layer.hpp"
-#include "animation/state_machine_input.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/animation/state_machine_layer.hpp"
+#include "rive/animation/state_machine_input.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/state_machine_input.cpp b/src/animation/state_machine_input.cpp
index db65528..1bc26a3 100644
--- a/src/animation/state_machine_input.cpp
+++ b/src/animation/state_machine_input.cpp
@@ -1,7 +1,7 @@
-#include "animation/state_machine_input.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/state_machine_importer.hpp"
-#include "generated/animation/state_machine_base.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/generated/animation/state_machine_base.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/state_machine_input_instance.cpp b/src/animation/state_machine_input_instance.cpp
index 692a8c0..f1a4706 100644
--- a/src/animation/state_machine_input_instance.cpp
+++ b/src/animation/state_machine_input_instance.cpp
@@ -1,8 +1,8 @@
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "animation/state_machine_instance.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_bool.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/animation/state_machine_instance.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/state_machine_instance.cpp b/src/animation/state_machine_instance.cpp
index 86ac51b..ccb5db0 100644
--- a/src/animation/state_machine_instance.cpp
+++ b/src/animation/state_machine_instance.cpp
@@ -1,18 +1,18 @@
-#include "animation/state_machine_instance.hpp"
-#include "animation/state_machine_input.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine.hpp"
-#include "animation/state_machine_layer.hpp"
-#include "animation/any_state.hpp"
-#include "animation/entry_state.hpp"
-#include "animation/state_transition.hpp"
-#include "animation/transition_condition.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/state_instance.hpp"
-#include "animation/animation_state_instance.hpp"
+#include "rive/animation/state_machine_instance.hpp"
+#include "rive/animation/state_machine_input.hpp"
+#include "rive/animation/state_machine_bool.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/animation/state_machine_layer.hpp"
+#include "rive/animation/any_state.hpp"
+#include "rive/animation/entry_state.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/animation/transition_condition.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/state_instance.hpp"
+#include "rive/animation/animation_state_instance.hpp"
 
 using namespace rive;
 namespace rive
diff --git a/src/animation/state_machine_layer.cpp b/src/animation/state_machine_layer.cpp
index 5f17007..de5e157 100644
--- a/src/animation/state_machine_layer.cpp
+++ b/src/animation/state_machine_layer.cpp
@@ -1,10 +1,10 @@
-#include "animation/state_machine_layer.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/state_machine_importer.hpp"
-#include "generated/animation/state_machine_base.hpp"
-#include "animation/any_state.hpp"
-#include "animation/entry_state.hpp"
-#include "animation/exit_state.hpp"
+#include "rive/animation/state_machine_layer.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/generated/animation/state_machine_base.hpp"
+#include "rive/animation/any_state.hpp"
+#include "rive/animation/entry_state.hpp"
+#include "rive/animation/exit_state.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/state_transition.cpp b/src/animation/state_transition.cpp
index 8bbce44..754b657 100644
--- a/src/animation/state_transition.cpp
+++ b/src/animation/state_transition.cpp
@@ -1,14 +1,14 @@
-#include "animation/state_transition.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/layer_state_importer.hpp"
-#include "animation/layer_state.hpp"
-#include "animation/transition_condition.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "animation/animation_state_instance.hpp"
-#include "animation/transition_trigger_condition.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/layer_state_importer.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/animation/transition_condition.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/animation/animation_state_instance.hpp"
+#include "rive/animation/transition_trigger_condition.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/system_state_instance.cpp b/src/animation/system_state_instance.cpp
index 54c5d0e..347f7d5 100644
--- a/src/animation/system_state_instance.cpp
+++ b/src/animation/system_state_instance.cpp
@@ -1,4 +1,4 @@
-#include "animation/system_state_instance.hpp"
+#include "rive/animation/system_state_instance.hpp"
 using namespace rive;
 
 SystemStateInstance::SystemStateInstance(const LayerState* layerState) :
diff --git a/src/animation/transition_bool_condition.cpp b/src/animation/transition_bool_condition.cpp
index a4c795c..2437bdc 100644
--- a/src/animation/transition_bool_condition.cpp
+++ b/src/animation/transition_bool_condition.cpp
@@ -1,7 +1,7 @@
-#include "animation/transition_bool_condition.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/transition_condition_op.hpp"
+#include "rive/animation/transition_bool_condition.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_bool.hpp"
+#include "rive/animation/transition_condition_op.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/transition_condition.cpp b/src/animation/transition_condition.cpp
index e12a50b..e9012e7 100644
--- a/src/animation/transition_condition.cpp
+++ b/src/animation/transition_condition.cpp
@@ -1,8 +1,8 @@
-#include "animation/transition_bool_condition.hpp"
-#include "animation/state_transition.hpp"
-#include "importers/state_transition_importer.hpp"
-#include "importers/state_machine_importer.hpp"
-#include "animation/state_machine.hpp"
+#include "rive/animation/transition_bool_condition.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/importers/state_transition_importer.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/animation/state_machine.hpp"
 
 using namespace rive;
 
diff --git a/src/animation/transition_number_condition.cpp b/src/animation/transition_number_condition.cpp
index 877dd04..33b44fa 100644
--- a/src/animation/transition_number_condition.cpp
+++ b/src/animation/transition_number_condition.cpp
@@ -1,7 +1,7 @@
-#include "animation/transition_number_condition.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_number.hpp"
-#include "animation/transition_condition_op.hpp"
+#include "rive/animation/transition_number_condition.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_number.hpp"
+#include "rive/animation/transition_condition_op.hpp"
 
 using namespace rive;
 
@@ -37,4 +37,5 @@
 		case TransitionConditionOp::greaterThan:
 			return numberInput->value() > value();
 	}
+	return false;
 }
\ No newline at end of file
diff --git a/src/animation/transition_trigger_condition.cpp b/src/animation/transition_trigger_condition.cpp
index 63306e8..f4755e5 100644
--- a/src/animation/transition_trigger_condition.cpp
+++ b/src/animation/transition_trigger_condition.cpp
@@ -1,7 +1,7 @@
-#include "animation/transition_trigger_condition.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/state_machine_trigger.hpp"
-#include "animation/transition_condition_op.hpp"
+#include "rive/animation/transition_trigger_condition.hpp"
+#include "rive/animation/state_machine_input_instance.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
+#include "rive/animation/transition_condition_op.hpp"
 
 using namespace rive;
 
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 5f5f4a5..78b8844 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -1,13 +1,13 @@
-#include "artboard.hpp"
-#include "animation/animation.hpp"
-#include "dependency_sorter.hpp"
-#include "draw_rules.hpp"
-#include "draw_target.hpp"
-#include "draw_target_placement.hpp"
-#include "drawable.hpp"
-#include "node.hpp"
-#include "renderer.hpp"
-#include "shapes/paint/shape_paint.hpp"
+#include "rive/artboard.hpp"
+#include "rive/animation/animation.hpp"
+#include "rive/dependency_sorter.hpp"
+#include "rive/draw_rules.hpp"
+#include "rive/draw_target.hpp"
+#include "rive/draw_target_placement.hpp"
+#include "rive/drawable.hpp"
+#include "rive/node.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
 #include <unordered_map>
 
 using namespace rive;
diff --git a/src/bones/bone.cpp b/src/bones/bone.cpp
index 61c3a41..49e1990 100644
--- a/src/bones/bone.cpp
+++ b/src/bones/bone.cpp
@@ -1,4 +1,6 @@
-#include "bones/bone.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/math/vec2d.hpp"
+#include <algorithm>
 
 using namespace rive;
 
@@ -25,4 +27,19 @@
 
 float Bone::x() const { return parent()->as<Bone>()->length(); }
 
-float Bone::y() const { return 0.0f; }
\ No newline at end of file
+float Bone::y() const { return 0.0f; }
+
+void Bone::tipWorldTranslation(Vec2D& result)
+{
+	result[0] = length();
+	result[1] = 0.0f;
+	Vec2D::transform(result, result, worldTransform());
+}
+
+void Bone::addPeerConstraint(Constraint* peer)
+{
+	assert(std::find(m_PeerConstraints.begin(),
+	                 m_PeerConstraints.end(),
+	                 peer) == m_PeerConstraints.end());
+	m_PeerConstraints.push_back(peer);
+}
\ No newline at end of file
diff --git a/src/bones/root_bone.cpp b/src/bones/root_bone.cpp
index 02d2a47..8ae5598 100644
--- a/src/bones/root_bone.cpp
+++ b/src/bones/root_bone.cpp
@@ -1,4 +1,4 @@
-#include "bones/root_bone.hpp"
+#include "rive/bones/root_bone.hpp"
 
 using namespace rive;
 
diff --git a/src/bones/skin.cpp b/src/bones/skin.cpp
index 588bcd5..a0d38a1 100644
--- a/src/bones/skin.cpp
+++ b/src/bones/skin.cpp
@@ -1,8 +1,9 @@
-#include "bones/skin.hpp"
-#include "bones/bone.hpp"
-#include "bones/skinnable.hpp"
-#include "bones/tendon.hpp"
-#include "shapes/path_vertex.hpp"
+#include "rive/bones/skin.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/bones/skinnable.hpp"
+#include "rive/bones/tendon.hpp"
+#include "rive/shapes/path_vertex.hpp"
+#include "rive/constraints/constraint.hpp"
 
 using namespace rive;
 
@@ -50,7 +51,12 @@
 	// depend on bones from tendons
 	for (auto tendon : m_Tendons)
 	{
-		tendon->bone()->addDependent(this);
+		auto bone = tendon->bone();
+		bone->addDependent(this);
+		for (auto constraint : bone->peerConstraints())
+		{
+			constraint->parent()->addDependent(this);
+		}
 	}
 
 	// Make sure no-one is calling this twice.
diff --git a/src/bones/skinnable.cpp b/src/bones/skinnable.cpp
index 7c09ed4..95f6dcb 100644
--- a/src/bones/skinnable.cpp
+++ b/src/bones/skinnable.cpp
@@ -1,5 +1,5 @@
-#include "bones/skinnable.hpp"
-#include "shapes/points_path.hpp"
+#include "rive/bones/skinnable.hpp"
+#include "rive/shapes/points_path.hpp"
 
 using namespace rive;
 
diff --git a/src/bones/tendon.cpp b/src/bones/tendon.cpp
index 1e5aea3..f213446 100644
--- a/src/bones/tendon.cpp
+++ b/src/bones/tendon.cpp
@@ -1,7 +1,7 @@
-#include "bones/tendon.hpp"
-#include "bones/bone.hpp"
-#include "bones/skin.hpp"
-#include "core_context.hpp"
+#include "rive/bones/tendon.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/bones/skin.hpp"
+#include "rive/core_context.hpp"
 
 using namespace rive;
 
diff --git a/src/bones/weight.cpp b/src/bones/weight.cpp
index 5c16a94..3630617 100644
--- a/src/bones/weight.cpp
+++ b/src/bones/weight.cpp
@@ -1,6 +1,6 @@
-#include "bones/weight.hpp"
-#include "container_component.hpp"
-#include "shapes/path_vertex.hpp"
+#include "rive/bones/weight.hpp"
+#include "rive/container_component.hpp"
+#include "rive/shapes/path_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/component.cpp b/src/component.cpp
index a03ed25..08bfec0 100644
--- a/src/component.cpp
+++ b/src/component.cpp
@@ -1,9 +1,9 @@
-#include "component.hpp"
-#include "artboard.hpp"
-#include "container_component.hpp"
-#include "core_context.hpp"
-#include "importers/artboard_importer.hpp"
-#include "importers/import_stack.hpp"
+#include "rive/component.hpp"
+#include "rive/artboard.hpp"
+#include "rive/container_component.hpp"
+#include "rive/core_context.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/importers/import_stack.hpp"
 #include <algorithm>
 
 using namespace rive;
@@ -28,8 +28,11 @@
 void Component::addDependent(Component* component)
 {
 	// Make it's not already a dependent.
-	assert(std::find(m_Dependents.begin(), m_Dependents.end(), component) ==
-	       m_Dependents.end());
+	if (std::find(m_Dependents.begin(), m_Dependents.end(), component) !=
+	    m_Dependents.end())
+	{
+		return;
+	}
 	m_Dependents.push_back(component);
 }
 
@@ -62,6 +65,14 @@
 
 StatusCode Component::import(ImportStack& importStack)
 {
+	if (is<Artboard>())
+	{
+		// Artboards are always their first object.
+		assert(as<Artboard>()->objects().size() == 0);
+		as<Artboard>()->addObject(this);
+		return Super::import(importStack);
+	}
+
 	auto artboardImporter =
 	    importStack.latest<ArtboardImporter>(ArtboardBase::typeKey);
 	if (artboardImporter == nullptr)
diff --git a/src/constraints/constraint.cpp b/src/constraints/constraint.cpp
new file mode 100644
index 0000000..292c638
--- /dev/null
+++ b/src/constraints/constraint.cpp
@@ -0,0 +1,56 @@
+#include "rive/constraints/constraint.hpp"
+#include "rive/container_component.hpp"
+#include "rive/transform_component.hpp"
+#include "rive/core_context.hpp"
+#include "rive/artboard.hpp"
+#include "rive/math/mat2d.hpp"
+
+using namespace rive;
+
+StatusCode Constraint::onAddedClean(CoreContext* context)
+{
+	if (!parent()->is<TransformComponent>())
+	{
+		return StatusCode::InvalidObject;
+	}
+
+	parent()->as<TransformComponent>()->addConstraint(this);
+
+	return StatusCode::Ok;
+}
+
+void Constraint::markConstraintDirty()
+{
+	parent()->as<TransformComponent>()->markTransformDirty();
+}
+
+void Constraint::strengthChanged() { markConstraintDirty(); }
+
+void Constraint::buildDependencies()
+{
+	Super::buildDependencies();
+	parent()->addDependent(this);
+}
+
+void Constraint::onDirty(ComponentDirt dirt)
+{
+	// Whenever the constraint gets any dirt, make sure to mark the constrained
+	// component dirty.
+	markConstraintDirty();
+}
+
+static Mat2D identity;
+const Mat2D& rive::getParentWorld(const TransformComponent& component)
+{
+	auto parent = component.parent();
+	if (parent->is<Artboard>())
+	{
+		// TODO: when we have symbols working artboards will need to store their
+		// world transform (probably should just become TransformComponent).
+		return identity;
+	}
+	else
+	{
+		return parent->as<TransformComponent>()->worldTransform();
+	}
+}
\ No newline at end of file
diff --git a/src/constraints/distance_constraint.cpp b/src/constraints/distance_constraint.cpp
new file mode 100644
index 0000000..06873fe
--- /dev/null
+++ b/src/constraints/distance_constraint.cpp
@@ -0,0 +1,62 @@
+#include "rive/constraints/distance_constraint.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/artboard.hpp"
+#include <algorithm>
+
+using namespace rive;
+
+enum class Mode
+{
+	Closer = 0,
+	Further = 1,
+	Exact = 2
+};
+
+void DistanceConstraint::constrain(TransformComponent* component)
+{
+	if (m_Target == nullptr)
+	{
+		return;
+	}
+
+	Vec2D targetTranslation;
+	m_Target->worldTranslation(targetTranslation);
+
+	Vec2D ourTranslation;
+	component->worldTranslation(ourTranslation);
+
+	Vec2D toTarget;
+	Vec2D::subtract(toTarget, ourTranslation, targetTranslation);
+	float currentDistance = Vec2D::length(toTarget);
+	switch (static_cast<Mode>(modeValue()))
+	{
+		case Mode::Closer:
+			if (currentDistance < distance())
+			{
+				return;
+			}
+			break;
+		case Mode::Further:
+			if (currentDistance > distance())
+			{
+				return;
+			}
+			break;
+		default:
+			break;
+	}
+	if (currentDistance < 0.001f)
+	{
+		return;
+	}
+
+	Vec2D::scale(toTarget, toTarget, 1.0f / currentDistance);
+	Vec2D::scale(toTarget, toTarget, distance());
+
+	Mat2D& world = component->mutableWorldTransform();
+	Vec2D position;
+	Vec2D::add(position, targetTranslation, toTarget);
+	Vec2D::lerp(position, ourTranslation, position, strength());
+	world[4] = position[0];
+	world[5] = position[1];
+}
\ No newline at end of file
diff --git a/src/constraints/ik_constraint.cpp b/src/constraints/ik_constraint.cpp
new file mode 100644
index 0000000..66e3a2d
--- /dev/null
+++ b/src/constraints/ik_constraint.cpp
@@ -0,0 +1,305 @@
+#include "rive/constraints/ik_constraint.hpp"
+#include "rive/bones/bone.hpp"
+#include "rive/artboard.hpp"
+#include <algorithm>
+
+using namespace rive;
+
+StatusCode IKConstraint::onAddedClean(CoreContext* context)
+{
+	if (!parent()->is<Bone>())
+	{
+		return StatusCode::InvalidObject;
+	}
+
+	auto boneCount = parentBoneCount();
+	auto bone = parent()->as<Bone>();
+	std::vector<Bone*> bones;
+	bones.push_back(bone);
+	// Get the reverse FK chain of bones (from tip up).
+	while (bone->parent()->is<Bone>() && boneCount > 0)
+	{
+		boneCount--;
+		bone = bone->parent()->as<Bone>();
+		bone->addPeerConstraint(this);
+		bones.push_back(bone);
+	}
+	int numBones = (int)bones.size();
+	m_FkChain.resize(numBones);
+	// Now put them in FK order (top to bottom).
+	int idx = 0;
+	for (auto boneItr = bones.rbegin(); boneItr != bones.rend(); ++boneItr)
+	{
+		BoneChainLink& link = m_FkChain[idx];
+		link.index = idx++;
+		link.bone = *boneItr;
+		link.angle = 0.0f;
+	}
+
+	// Make sure all of the first level children of each bone depend on the
+	// tip (constrainedComponent).
+	auto tip = parent()->as<Bone>();
+
+	auto artboard = static_cast<Artboard*>(context);
+
+	// Find all children of this bone (we don't directly build up
+	// hierarchy at runtime, so we have to traverse everything and check
+	// parents).
+	for (auto core : artboard->objects())
+	{
+		if (core == nullptr || !core->is<TransformComponent>())
+		{
+			continue;
+		}
+		auto transformComponent = core->as<TransformComponent>();
+
+		for (int i = 1; i < numBones; i++)
+		{
+			auto bone = bones[i];
+			if (transformComponent->parent() == bone &&
+			    std::find(bones.begin(), bones.end(), transformComponent) ==
+			        bones.end())
+			{
+				tip->addDependent(transformComponent);
+			}
+		}
+	}
+	return Super::onAddedClean(context);
+}
+
+void IKConstraint::markConstraintDirty()
+{
+	Super::markConstraintDirty();
+	// We automatically propagate dirt to the parent constrained bone, but we
+	// also need to make sure the other bones we influence above it rebuild
+	// their transforms.
+	for (int i = 0, length = (int)m_FkChain.size() - 1; i < length; i++)
+	{
+		m_FkChain[i].bone->markTransformDirty();
+	}
+}
+
+void IKConstraint::solve1(BoneChainLink* fk1,
+                          const Vec2D& worldTargetTranslation)
+{
+	Mat2D iworld = fk1->parentWorldInverse;
+	Vec2D pA;
+	fk1->bone->worldTranslation(pA);
+	Vec2D pBT(worldTargetTranslation);
+
+	// To target in worldspace
+	Vec2D toTarget;
+	Vec2D::subtract(toTarget, pBT, pA);
+
+	// Note this is directional, hence not transformMat2d
+	Vec2D toTargetLocal;
+	Vec2D::transformDir(toTargetLocal, toTarget, iworld);
+	float r = std::atan2(toTargetLocal[1], toTargetLocal[0]);
+
+	constrainRotation(*fk1, r);
+	fk1->angle = r;
+}
+
+void IKConstraint::solve2(BoneChainLink* fk1,
+                          BoneChainLink* fk2,
+                          const Vec2D& worldTargetTranslation)
+{
+	Bone* b1 = fk1->bone;
+	Bone* b2 = fk2->bone;
+	BoneChainLink* firstChild = &(m_FkChain[fk1->index + 1]);
+
+	const Mat2D& iworld = fk1->parentWorldInverse;
+
+	Vec2D pA, pC, pB;
+	b1->worldTranslation(pA);
+	firstChild->bone->worldTranslation(pC);
+	b2->tipWorldTranslation(pB);
+	Vec2D pBT(worldTargetTranslation);
+
+	Vec2D::transform(pA, pA, iworld);
+	Vec2D::transform(pC, pC, iworld);
+	Vec2D::transform(pB, pB, iworld);
+	Vec2D::transform(pBT, pBT, iworld);
+
+	// http://mathworld.wolfram.com/LawofCosines.html
+	Vec2D av, bv, cv;
+	Vec2D::subtract(av, pB, pC);
+	float a = Vec2D::length(av);
+
+	Vec2D::subtract(bv, pC, pA);
+	float b = Vec2D::length(bv);
+
+	Vec2D::subtract(cv, pBT, pA);
+	float c = Vec2D::length(cv);
+
+	float A = std::acos(std::max(
+	    -1.0f, std::min(1.0f, (-a * a + b * b + c * c) / (2.0f * b * c))));
+	float C = std::acos(std::max(
+	    -1.0f, std::min(1.0f, (a * a + b * b - c * c) / (2.0f * a * b))));
+
+	float r1, r2;
+	if (b2->parent() != b1)
+	{
+		BoneChainLink& secondChild = m_FkChain[fk1->index + 2];
+
+		const Mat2D& secondChildWorldInverse = secondChild.parentWorldInverse;
+
+		firstChild->bone->worldTranslation(pC);
+		b2->tipWorldTranslation(pB);
+
+		Vec2D avec;
+		Vec2D::subtract(avec, pB, pC);
+		Vec2D avLocal;
+		Vec2D::transformDir(avLocal, avec, secondChildWorldInverse);
+		float angleCorrection = -std::atan2(avLocal[1], avLocal[0]);
+
+		if (invertDirection())
+		{
+			r1 = std::atan2(cv[1], cv[0]) - A;
+			r2 = -C + M_PI + angleCorrection;
+		}
+		else
+		{
+			r1 = A + std::atan2(cv[1], cv[0]);
+			r2 = C - M_PI + angleCorrection;
+		}
+	}
+	else if (invertDirection())
+	{
+		r1 = std::atan2(cv[1], cv[0]) - A;
+		r2 = -C + M_PI;
+	}
+	else
+	{
+		r1 = A + std::atan2(cv[1], cv[0]);
+		r2 = C - M_PI;
+	}
+
+	constrainRotation(*fk1, r1);
+	constrainRotation(*firstChild, r2);
+	if (firstChild != fk2)
+	{
+		Bone* bone = fk2->bone;
+		Mat2D::multiply(bone->mutableWorldTransform(),
+		                getParentWorld(*bone),
+		                bone->transform());
+	}
+
+	// Simple storage, need this for interpolation.
+	fk1->angle = r1;
+	firstChild->angle = r2;
+}
+
+void IKConstraint::constrainRotation(BoneChainLink& fk, float rotation)
+{
+	Bone* bone = fk.bone;
+	const Mat2D& parentWorld = getParentWorld(*bone);
+	Mat2D& transform = bone->mutableTransform();
+	TransformComponents& c = fk.transformComponents;
+
+	if (rotation == 0.0f)
+	{
+		Mat2D::identity(transform);
+	}
+	else
+	{
+		Mat2D::fromRotation(transform, rotation);
+	}
+
+	// Translate
+	transform[4] = c.x();
+	transform[5] = c.y();
+	// Scale
+	float scaleX = c.scaleX();
+	float scaleY = c.scaleY();
+	transform[0] *= scaleX;
+	transform[1] *= scaleX;
+	transform[2] *= scaleY;
+	transform[3] *= scaleY;
+
+	// Skew
+	const float skew = c.skew();
+	if (skew != 0.0f)
+	{
+		transform[2] = transform[0] * skew + transform[2];
+		transform[3] = transform[1] * skew + transform[3];
+	}
+
+	Mat2D::multiply(bone->mutableWorldTransform(), parentWorld, transform);
+}
+
+void IKConstraint::constrain(TransformComponent* component)
+{
+	if (m_Target == nullptr)
+	{
+		return;
+	}
+
+	Vec2D worldTargetTranslation;
+	m_Target->worldTranslation(worldTargetTranslation);
+
+	// Decompose the chain.
+	for (BoneChainLink& item : m_FkChain)
+	{
+		auto bone = item.bone;
+		const Mat2D& parentWorld = getParentWorld(*bone);
+		Mat2D::invert(item.parentWorldInverse, parentWorld);
+
+		Mat2D& boneTransform = bone->mutableTransform();
+		Mat2D::multiply(
+		    boneTransform, item.parentWorldInverse, bone->worldTransform());
+		Mat2D::decompose(item.transformComponents, boneTransform);
+	}
+
+	int count = (int)m_FkChain.size();
+	switch (count)
+	{
+		case 1:
+			solve1(&m_FkChain[0], worldTargetTranslation);
+			break;
+		case 2:
+			solve2(&m_FkChain[0], &m_FkChain[1], worldTargetTranslation);
+			break;
+		default:
+		{
+			auto last = count - 1;
+			BoneChainLink* tip = &m_FkChain[last];
+			for (int i = 0; i < last; i++)
+			{
+				BoneChainLink* item = &m_FkChain[i];
+				solve2(item, tip, worldTargetTranslation);
+				for (int j = item->index + 1, end = m_FkChain.size() - 1;
+				     j < end;
+				     j++)
+				{
+					BoneChainLink& fk = m_FkChain[j];
+					Mat2D::invert(fk.parentWorldInverse,
+					              getParentWorld(*fk.bone));
+				}
+			}
+			break;
+		}
+	}
+
+	// At the end, mix the FK angle with the IK angle by strength
+	if (strength() != 1.0f)
+	{
+		for (BoneChainLink& fk : m_FkChain)
+		{
+			float fromAngle =
+			    std::fmod(fk.transformComponents.rotation(), (float)M_PI_2);
+			float toAngle = std::fmod(fk.angle, (float)M_PI_2);
+			float diff = toAngle - fromAngle;
+			if (diff > M_PI)
+			{
+				diff -= M_PI_2;
+			}
+			else if (diff < -M_PI)
+			{
+				diff += M_PI_2;
+			}
+			float angle = fromAngle + diff * strength();
+			constrainRotation(fk, angle);
+		}
+	}
+}
diff --git a/src/constraints/targeted_constraint.cpp b/src/constraints/targeted_constraint.cpp
new file mode 100644
index 0000000..4ab500b
--- /dev/null
+++ b/src/constraints/targeted_constraint.cpp
@@ -0,0 +1,33 @@
+#include "rive/constraints/targeted_constraint.hpp"
+#include "rive/transform_component.hpp"
+#include "rive/core_context.hpp"
+
+using namespace rive;
+
+StatusCode TargetedConstraint::onAddedDirty(CoreContext* context)
+{
+	StatusCode code = Super::onAddedDirty(context);
+	if (code != StatusCode::Ok)
+	{
+		return code;
+	}
+	auto coreObject = context->resolve(targetId());
+	if (coreObject == nullptr || !coreObject->is<TransformComponent>())
+	{
+		return StatusCode::MissingObject;
+	}
+
+	m_Target = reinterpret_cast<TransformComponent*>(coreObject);
+
+	return StatusCode::Ok;
+}
+
+void TargetedConstraint::buildDependencies()
+{
+	// Targeted constraints must have their constrained component (parent)
+	// update after the target.
+	if (m_Target != nullptr)
+	{
+		m_Target->addDependent(parent());
+	}
+}
\ No newline at end of file
diff --git a/src/constraints/transform_constraint.cpp b/src/constraints/transform_constraint.cpp
new file mode 100644
index 0000000..c29dacd
--- /dev/null
+++ b/src/constraints/transform_constraint.cpp
@@ -0,0 +1,62 @@
+#include "rive/constraints/transform_constraint.hpp"
+#include "rive/transform_component.hpp"
+#include "rive/math/mat2d.hpp"
+#include <cmath>
+
+using namespace rive;
+
+void TransformConstraint::constrain(TransformComponent* component)
+{
+	if (m_Target == nullptr)
+	{
+		return;
+	}
+
+	const Mat2D& transformA = component->worldTransform();
+	Mat2D transformB(m_Target->worldTransform());
+	if (sourceSpace() == TransformSpace::local)
+	{
+		const Mat2D& targetParentWorld = getParentWorld(*m_Target);
+
+		Mat2D inverse;
+		if (!Mat2D::invert(inverse, targetParentWorld))
+		{
+			return;
+		}
+		Mat2D::multiply(transformB, inverse, transformB);
+	}
+	if (destSpace() == TransformSpace::local)
+	{
+		const Mat2D& targetParentWorld = getParentWorld(*component);
+		Mat2D::multiply(transformB, targetParentWorld, transformB);
+	}
+
+	Mat2D::decompose(m_ComponentsA, transformA);
+	Mat2D::decompose(m_ComponentsB, transformB);
+
+	float angleA = std::fmod(m_ComponentsA.rotation(), (float)M_PI_2);
+	float angleB = std::fmod(m_ComponentsB.rotation(), (float)M_PI_2);
+	float diff = angleB - angleA;
+	if (diff > M_PI)
+	{
+		diff -= M_PI_2;
+	}
+	else if (diff < -M_PI)
+	{
+		diff += M_PI_2;
+	}
+
+	float t = strength();
+	float ti = 1.0f - t;
+
+	m_ComponentsB.rotation(angleA + diff * t);
+	m_ComponentsB.x(m_ComponentsA.x() * ti + m_ComponentsB.x() * t);
+	m_ComponentsB.y(m_ComponentsA.y() * ti + m_ComponentsB.y() * t);
+	m_ComponentsB.scaleX(m_ComponentsA.scaleX() * ti +
+	                     m_ComponentsB.scaleX() * t);
+	m_ComponentsB.scaleY(m_ComponentsA.scaleY() * ti +
+	                     m_ComponentsB.scaleY() * t);
+	m_ComponentsB.skew(m_ComponentsA.skew() * ti + m_ComponentsB.skew() * t);
+
+	Mat2D::compose(component->mutableWorldTransform(), m_ComponentsB);
+}
diff --git a/src/contour_render_path.cpp b/src/contour_render_path.cpp
index 7211492..d70b986 100644
--- a/src/contour_render_path.cpp
+++ b/src/contour_render_path.cpp
@@ -1,6 +1,6 @@
 #ifdef LOW_LEVEL_RENDERING
-#include "contour_render_path.hpp"
-#include "contour_stroke.hpp"
+#include "rive/contour_render_path.hpp"
+#include "rive/contour_stroke.hpp"
 
 using namespace rive;
 
diff --git a/src/contour_render_path_recursive.cpp b/src/contour_render_path_recursive.cpp
index fe63497..ce11b6b 100644
--- a/src/contour_render_path_recursive.cpp
+++ b/src/contour_render_path_recursive.cpp
@@ -1,7 +1,7 @@
 #if defined(LOW_LEVEL_RENDERING) && defined(CONTOUR_RECURSIVE)
 
-#include "contour_render_path.hpp"
-#include "math/cubic_utilities.hpp"
+#include "rive/contour_render_path.hpp"
+#include "rive/math/cubic_utilities.hpp"
 #include <cassert>
 
 using namespace rive;
diff --git a/src/contour_stroke.cpp b/src/contour_stroke.cpp
index aa7f540..54bc4d4 100644
--- a/src/contour_stroke.cpp
+++ b/src/contour_stroke.cpp
@@ -1,7 +1,7 @@
 #ifdef LOW_LEVEL_RENDERING
-#include "contour_stroke.hpp"
-#include "contour_render_path.hpp"
-#include "math/vec2d.hpp"
+#include "rive/contour_stroke.hpp"
+#include "rive/contour_render_path.hpp"
+#include "rive/math/vec2d.hpp"
 
 using namespace rive;
 
diff --git a/src/core/binary_reader.cpp b/src/core/binary_reader.cpp
index 66efb61..0596549 100644
--- a/src/core/binary_reader.cpp
+++ b/src/core/binary_reader.cpp
@@ -1,5 +1,5 @@
-#include "core/binary_reader.hpp"
-#include "core/reader.h"
+#include "rive/core/binary_reader.hpp"
+#include "rive/core/reader.h"
 #include <vector>
 
 using namespace rive;
@@ -27,7 +27,7 @@
 	m_Position = m_End;
 }
 
-uint64_t BinaryReader::readVarUint()
+uint64_t BinaryReader::readVarUint64()
 {
 	uint64_t value;
 	auto readBytes = decode_uint_leb(m_Position, m_End, &value);
@@ -42,7 +42,7 @@
 
 std::string BinaryReader::readString()
 {
-	uint64_t length = readVarUint();
+	uint64_t length = readVarUint64();
 	if (didOverflow())
 	{
 		return std::string();
diff --git a/src/core/field_types/core_bool_type.cpp b/src/core/field_types/core_bool_type.cpp
index eb956eb..9fa5681 100644
--- a/src/core/field_types/core_bool_type.cpp
+++ b/src/core/field_types/core_bool_type.cpp
@@ -1,5 +1,5 @@
-#include "core/field_types/core_bool_type.hpp"
-#include "core/binary_reader.hpp"
+#include "rive/core/field_types/core_bool_type.hpp"
+#include "rive/core/binary_reader.hpp"
 
 using namespace rive;
 
diff --git a/src/core/field_types/core_color_type.cpp b/src/core/field_types/core_color_type.cpp
index ade817b..99a6133 100644
--- a/src/core/field_types/core_color_type.cpp
+++ b/src/core/field_types/core_color_type.cpp
@@ -1,5 +1,5 @@
-#include "core/field_types/core_color_type.hpp"
-#include "core/binary_reader.hpp"
+#include "rive/core/field_types/core_color_type.hpp"
+#include "rive/core/binary_reader.hpp"
 
 using namespace rive;
 
diff --git a/src/core/field_types/core_double_type.cpp b/src/core/field_types/core_double_type.cpp
index a645d8a..496a2ab 100644
--- a/src/core/field_types/core_double_type.cpp
+++ b/src/core/field_types/core_double_type.cpp
@@ -1,5 +1,5 @@
-#include "core/field_types/core_double_type.hpp"
-#include "core/binary_reader.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/binary_reader.hpp"
 
 using namespace rive;
 
diff --git a/src/core/field_types/core_string_type.cpp b/src/core/field_types/core_string_type.cpp
index 37da03d..48ffc44 100644
--- a/src/core/field_types/core_string_type.cpp
+++ b/src/core/field_types/core_string_type.cpp
@@ -1,5 +1,5 @@
-#include "core/field_types/core_string_type.hpp"
-#include "core/binary_reader.hpp"
+#include "rive/core/field_types/core_string_type.hpp"
+#include "rive/core/binary_reader.hpp"
 
 using namespace rive;
 
diff --git a/src/core/field_types/core_uint_type.cpp b/src/core/field_types/core_uint_type.cpp
index aeb7a60..3d8e43f 100644
--- a/src/core/field_types/core_uint_type.cpp
+++ b/src/core/field_types/core_uint_type.cpp
@@ -1,9 +1,9 @@
-#include "core/field_types/core_uint_type.hpp"
-#include "core/binary_reader.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/core/binary_reader.hpp"
 
 using namespace rive;
 
 unsigned int CoreUintType::deserialize(BinaryReader& reader)
 {
-	return (int) reader.readVarUint();
+	return (int) reader.readVarUint64();
 }
diff --git a/src/dependency_sorter.cpp b/src/dependency_sorter.cpp
index 34b3033..3ae140d 100644
--- a/src/dependency_sorter.cpp
+++ b/src/dependency_sorter.cpp
@@ -1,5 +1,5 @@
-#include "dependency_sorter.hpp"
-#include "component.hpp"
+#include "rive/dependency_sorter.hpp"
+#include "rive/component.hpp"
 
 using namespace rive;
 
diff --git a/src/draw_rules.cpp b/src/draw_rules.cpp
index f838320..13cd4ee 100644
--- a/src/draw_rules.cpp
+++ b/src/draw_rules.cpp
@@ -1,7 +1,7 @@
-#include "draw_rules.hpp"
-#include "artboard.hpp"
-#include "core_context.hpp"
-#include "draw_target.hpp"
+#include "rive/draw_rules.hpp"
+#include "rive/artboard.hpp"
+#include "rive/core_context.hpp"
+#include "rive/draw_target.hpp"
 
 using namespace rive;
 
diff --git a/src/draw_target.cpp b/src/draw_target.cpp
index c061036..05e1efe 100644
--- a/src/draw_target.cpp
+++ b/src/draw_target.cpp
@@ -1,7 +1,7 @@
-#include "draw_target.hpp"
-#include "core_context.hpp"
-#include "drawable.hpp"
-#include "artboard.hpp"
+#include "rive/draw_target.hpp"
+#include "rive/core_context.hpp"
+#include "rive/drawable.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/drawable.cpp b/src/drawable.cpp
index 40760bd..02ed17b 100644
--- a/src/drawable.cpp
+++ b/src/drawable.cpp
@@ -1,8 +1,8 @@
-#include "drawable.hpp"
-#include "artboard.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/path_composer.hpp"
-#include "shapes/shape.hpp"
+#include "rive/drawable.hpp"
+#include "rive/artboard.hpp"
+#include "rive/shapes/clipping_shape.hpp"
+#include "rive/shapes/path_composer.hpp"
+#include "rive/shapes/shape.hpp"
 
 using namespace rive;
 
diff --git a/src/file.cpp b/src/file.cpp
index cbe17a5..976daf6 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -1,40 +1,51 @@
-#include "file.hpp"
-#include "animation/animation.hpp"
-#include "core/field_types/core_color_type.hpp"
-#include "core/field_types/core_double_type.hpp"
-#include "core/field_types/core_string_type.hpp"
-#include "core/field_types/core_uint_type.hpp"
-#include "generated/core_registry.hpp"
-#include "importers/artboard_importer.hpp"
-#include "importers/import_stack.hpp"
-#include "importers/keyed_object_importer.hpp"
-#include "importers/keyed_property_importer.hpp"
-#include "importers/linear_animation_importer.hpp"
-#include "importers/state_machine_importer.hpp"
-#include "importers/state_machine_layer_importer.hpp"
-#include "importers/layer_state_importer.hpp"
-#include "importers/state_transition_importer.hpp"
-#include "animation/blend_state_transition.hpp"
-#include "animation/any_state.hpp"
-#include "animation/entry_state.hpp"
-#include "animation/exit_state.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/blend_state_1d.hpp"
-#include "animation/blend_state_direct.hpp"
+#include "rive/file.hpp"
+#include "rive/animation/animation.hpp"
+#include "rive/core/field_types/core_color_type.hpp"
+#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_string_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
+#include "rive/generated/core_registry.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/keyed_object_importer.hpp"
+#include "rive/importers/keyed_property_importer.hpp"
+#include "rive/importers/linear_animation_importer.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/importers/state_machine_layer_importer.hpp"
+#include "rive/importers/layer_state_importer.hpp"
+#include "rive/importers/state_transition_importer.hpp"
+#include "rive/animation/blend_state_transition.hpp"
+#include "rive/animation/any_state.hpp"
+#include "rive/animation/entry_state.hpp"
+#include "rive/animation/exit_state.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+#include "rive/animation/blend_state_direct.hpp"
 
 // Default namespace for Rive Cpp code
 using namespace rive;
 
+#if !defined(RIVE_FMT_U64)
+    #if defined(__ANDROID__)
+        #define RIVE_FMT_U64 "%llu"
+        #define RIVE_FMT_I64 "%lld"
+    #else
+        #include <inttypes.h>
+        #define RIVE_FMT_U64 "%" PRIu64
+        #define RIVE_FMT_I64 "%" PRId64
+    #endif
+#endif
+
 // Import a single Rive runtime object.
 // Used by the file importer.
 static Core* readRuntimeObject(BinaryReader& reader,
                                const RuntimeHeader& header)
 {
-	auto coreObjectKey = reader.readVarUint();
+	auto coreObjectKey = reader.readVarUint64();
 	auto object = CoreRegistry::makeCoreInstance((int)coreObjectKey);
 	while (true)
 	{
-		auto propertyKey = reader.readVarUint();
+		auto propertyKey = reader.readVarUint64();
 		if (propertyKey == 0)
 		{
 			// Terminator. https://media.giphy.com/media/7TtvTUMm9mp20/giphy.gif
@@ -62,7 +73,7 @@
 				// Still couldn't find it, give up.
 				fprintf(
 				    stderr,
-				    "Unknown property key %llu, missing from property ToC.\n",
+				    "Unknown property key " RIVE_FMT_U64 ", missing from property ToC.\n",
 				    propertyKey);
 				delete object;
 				return nullptr;
@@ -88,7 +99,7 @@
 	if (object == nullptr)
 	{
 		// fprintf(stderr,
-		//         "File contains an unknown object with coreType %llu, which "
+		//         "File contains an unknown object with coreType " RIVE_FMT_U64 ", which "
 		//         "this runtime doesn't understand.\n",
 		//         coreObjectKey);
 		return nullptr;
@@ -146,6 +157,26 @@
 			importStack.readNullObject();
 			continue;
 		}
+		if (object->import(importStack) == StatusCode::Ok)
+		{
+			switch (object->coreType())
+			{
+				case Backboard::typeKey:
+					m_Backboard = object->as<Backboard>();
+					break;
+				case Artboard::typeKey:
+					m_Artboards.push_back(object->as<Artboard>());
+					break;
+			}
+		}
+		else
+		{
+			fprintf(stderr,
+			        "Failed to import object of type %d\n",
+			        object->coreType());
+			delete object;
+			continue;
+		}
 		ImportStackObject* stackObject = nullptr;
 		auto stackType = object->coreType();
 
@@ -214,18 +245,6 @@
 			// Some previous stack item didn't resolve.
 			return ImportResult::malformed;
 		}
-		if (object->import(importStack) == StatusCode::Ok)
-		{
-			switch (object->coreType())
-			{
-				case Backboard::typeKey:
-					m_Backboard = object->as<Backboard>();
-					break;
-				case Artboard::typeKey:
-					m_Artboards.push_back(object->as<Artboard>());
-					break;
-			}
-		}
 	}
 
 	return importStack.resolve() == StatusCode::Ok ? ImportResult::success
diff --git a/src/generated/animation/animation_base.cpp b/src/generated/animation/animation_base.cpp
index f91d78d..e464750 100644
--- a/src/generated/animation/animation_base.cpp
+++ b/src/generated/animation/animation_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/animation_base.hpp"
-#include "animation/animation.hpp"
+#include "rive/generated/animation/animation_base.hpp"
+#include "rive/animation/animation.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/animation_state_base.cpp b/src/generated/animation/animation_state_base.cpp
index 1ca34dc..b4a0766 100644
--- a/src/generated/animation/animation_state_base.cpp
+++ b/src/generated/animation/animation_state_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/animation_state_base.hpp"
-#include "animation/animation_state.hpp"
+#include "rive/generated/animation/animation_state_base.hpp"
+#include "rive/animation/animation_state.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/any_state_base.cpp b/src/generated/animation/any_state_base.cpp
index f94d5d1..4856036 100644
--- a/src/generated/animation/any_state_base.cpp
+++ b/src/generated/animation/any_state_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/any_state_base.hpp"
-#include "animation/any_state.hpp"
+#include "rive/generated/animation/any_state_base.hpp"
+#include "rive/animation/any_state.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/blend_animation_1d_base.cpp b/src/generated/animation/blend_animation_1d_base.cpp
new file mode 100644
index 0000000..05a461e
--- /dev/null
+++ b/src/generated/animation/blend_animation_1d_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/animation/blend_animation_1d_base.hpp"
+#include "rive/animation/blend_animation_1d.hpp"
+
+using namespace rive;
+
+Core* BlendAnimation1DBase::clone() const
+{
+	auto cloned = new BlendAnimation1D();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/animation/blend_animation_direct_base.cpp b/src/generated/animation/blend_animation_direct_base.cpp
new file mode 100644
index 0000000..5b95866
--- /dev/null
+++ b/src/generated/animation/blend_animation_direct_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/animation/blend_animation_direct_base.hpp"
+#include "rive/animation/blend_animation_direct.hpp"
+
+using namespace rive;
+
+Core* BlendAnimationDirectBase::clone() const
+{
+	auto cloned = new BlendAnimationDirect();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/animation/blend_state_1d_base.cpp b/src/generated/animation/blend_state_1d_base.cpp
new file mode 100644
index 0000000..81bffaa
--- /dev/null
+++ b/src/generated/animation/blend_state_1d_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/animation/blend_state_1d_base.hpp"
+#include "rive/animation/blend_state_1d.hpp"
+
+using namespace rive;
+
+Core* BlendState1DBase::clone() const
+{
+	auto cloned = new BlendState1D();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/animation/blend_state_direct_base.cpp b/src/generated/animation/blend_state_direct_base.cpp
new file mode 100644
index 0000000..3e794ae
--- /dev/null
+++ b/src/generated/animation/blend_state_direct_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/animation/blend_state_direct_base.hpp"
+#include "rive/animation/blend_state_direct.hpp"
+
+using namespace rive;
+
+Core* BlendStateDirectBase::clone() const
+{
+	auto cloned = new BlendStateDirect();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/animation/blend_state_transition_base.cpp b/src/generated/animation/blend_state_transition_base.cpp
new file mode 100644
index 0000000..372aeb4
--- /dev/null
+++ b/src/generated/animation/blend_state_transition_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/animation/blend_state_transition_base.hpp"
+#include "rive/animation/blend_state_transition.hpp"
+
+using namespace rive;
+
+Core* BlendStateTransitionBase::clone() const
+{
+	auto cloned = new BlendStateTransition();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/animation/cubic_interpolator_base.cpp b/src/generated/animation/cubic_interpolator_base.cpp
index 86b7683..98f75a0 100644
--- a/src/generated/animation/cubic_interpolator_base.cpp
+++ b/src/generated/animation/cubic_interpolator_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/cubic_interpolator_base.hpp"
-#include "animation/cubic_interpolator.hpp"
+#include "rive/generated/animation/cubic_interpolator_base.hpp"
+#include "rive/animation/cubic_interpolator.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/entry_state_base.cpp b/src/generated/animation/entry_state_base.cpp
index 5f5ec14..8e232a0 100644
--- a/src/generated/animation/entry_state_base.cpp
+++ b/src/generated/animation/entry_state_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/entry_state_base.hpp"
-#include "animation/entry_state.hpp"
+#include "rive/generated/animation/entry_state_base.hpp"
+#include "rive/animation/entry_state.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/exit_state_base.cpp b/src/generated/animation/exit_state_base.cpp
index 56c790c..baa32c1 100644
--- a/src/generated/animation/exit_state_base.cpp
+++ b/src/generated/animation/exit_state_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/exit_state_base.hpp"
-#include "animation/exit_state.hpp"
+#include "rive/generated/animation/exit_state_base.hpp"
+#include "rive/animation/exit_state.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/keyed_object_base.cpp b/src/generated/animation/keyed_object_base.cpp
index e428590..aed4062 100644
--- a/src/generated/animation/keyed_object_base.cpp
+++ b/src/generated/animation/keyed_object_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/keyed_object_base.hpp"
-#include "animation/keyed_object.hpp"
+#include "rive/generated/animation/keyed_object_base.hpp"
+#include "rive/animation/keyed_object.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/keyed_property_base.cpp b/src/generated/animation/keyed_property_base.cpp
index 6c1c3d7..302cc49 100644
--- a/src/generated/animation/keyed_property_base.cpp
+++ b/src/generated/animation/keyed_property_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/keyed_property_base.hpp"
-#include "animation/keyed_property.hpp"
+#include "rive/generated/animation/keyed_property_base.hpp"
+#include "rive/animation/keyed_property.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/keyframe_color_base.cpp b/src/generated/animation/keyframe_color_base.cpp
index 1fa4fab..df61549 100644
--- a/src/generated/animation/keyframe_color_base.cpp
+++ b/src/generated/animation/keyframe_color_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/keyframe_color_base.hpp"
-#include "animation/keyframe_color.hpp"
+#include "rive/generated/animation/keyframe_color_base.hpp"
+#include "rive/animation/keyframe_color.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/keyframe_double_base.cpp b/src/generated/animation/keyframe_double_base.cpp
index 9d5975d..0dd3be5 100644
--- a/src/generated/animation/keyframe_double_base.cpp
+++ b/src/generated/animation/keyframe_double_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/keyframe_double_base.hpp"
-#include "animation/keyframe_double.hpp"
+#include "rive/generated/animation/keyframe_double_base.hpp"
+#include "rive/animation/keyframe_double.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/keyframe_id_base.cpp b/src/generated/animation/keyframe_id_base.cpp
index 87815bc..254362c 100644
--- a/src/generated/animation/keyframe_id_base.cpp
+++ b/src/generated/animation/keyframe_id_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/keyframe_id_base.hpp"
-#include "animation/keyframe_id.hpp"
+#include "rive/generated/animation/keyframe_id_base.hpp"
+#include "rive/animation/keyframe_id.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/linear_animation_base.cpp b/src/generated/animation/linear_animation_base.cpp
index 0024799..4f29801 100644
--- a/src/generated/animation/linear_animation_base.cpp
+++ b/src/generated/animation/linear_animation_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/linear_animation_base.hpp"
-#include "animation/linear_animation.hpp"
+#include "rive/generated/animation/linear_animation_base.hpp"
+#include "rive/animation/linear_animation.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_machine_base.cpp b/src/generated/animation/state_machine_base.cpp
index 3eb6814..e638f38 100644
--- a/src/generated/animation/state_machine_base.cpp
+++ b/src/generated/animation/state_machine_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_machine_base.hpp"
-#include "animation/state_machine.hpp"
+#include "rive/generated/animation/state_machine_base.hpp"
+#include "rive/animation/state_machine.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_machine_bool_base.cpp b/src/generated/animation/state_machine_bool_base.cpp
index 65f8d0d..b94b2ec 100644
--- a/src/generated/animation/state_machine_bool_base.cpp
+++ b/src/generated/animation/state_machine_bool_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_machine_bool_base.hpp"
-#include "animation/state_machine_bool.hpp"
+#include "rive/generated/animation/state_machine_bool_base.hpp"
+#include "rive/animation/state_machine_bool.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_machine_layer_base.cpp b/src/generated/animation/state_machine_layer_base.cpp
index 907e9ca..d012d93 100644
--- a/src/generated/animation/state_machine_layer_base.cpp
+++ b/src/generated/animation/state_machine_layer_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_machine_layer_base.hpp"
-#include "animation/state_machine_layer.hpp"
+#include "rive/generated/animation/state_machine_layer_base.hpp"
+#include "rive/animation/state_machine_layer.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_machine_number_base.cpp b/src/generated/animation/state_machine_number_base.cpp
index d1f9a25..bc04fe8 100644
--- a/src/generated/animation/state_machine_number_base.cpp
+++ b/src/generated/animation/state_machine_number_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_machine_number_base.hpp"
-#include "animation/state_machine_number.hpp"
+#include "rive/generated/animation/state_machine_number_base.hpp"
+#include "rive/animation/state_machine_number.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_machine_trigger_base.cpp b/src/generated/animation/state_machine_trigger_base.cpp
index aae23cc..9bdaa96 100644
--- a/src/generated/animation/state_machine_trigger_base.cpp
+++ b/src/generated/animation/state_machine_trigger_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_machine_trigger_base.hpp"
-#include "animation/state_machine_trigger.hpp"
+#include "rive/generated/animation/state_machine_trigger_base.hpp"
+#include "rive/animation/state_machine_trigger.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/state_transition_base.cpp b/src/generated/animation/state_transition_base.cpp
index 3ba27d5..ded9d53 100644
--- a/src/generated/animation/state_transition_base.cpp
+++ b/src/generated/animation/state_transition_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/state_transition_base.hpp"
-#include "animation/state_transition.hpp"
+#include "rive/generated/animation/state_transition_base.hpp"
+#include "rive/animation/state_transition.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/transition_bool_condition_base.cpp b/src/generated/animation/transition_bool_condition_base.cpp
index 1d61d07..9f7aebf 100644
--- a/src/generated/animation/transition_bool_condition_base.cpp
+++ b/src/generated/animation/transition_bool_condition_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/transition_bool_condition_base.hpp"
-#include "animation/transition_bool_condition.hpp"
+#include "rive/generated/animation/transition_bool_condition_base.hpp"
+#include "rive/animation/transition_bool_condition.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/transition_number_condition_base.cpp b/src/generated/animation/transition_number_condition_base.cpp
index bbca747..44cd977 100644
--- a/src/generated/animation/transition_number_condition_base.cpp
+++ b/src/generated/animation/transition_number_condition_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/transition_number_condition_base.hpp"
-#include "animation/transition_number_condition.hpp"
+#include "rive/generated/animation/transition_number_condition_base.hpp"
+#include "rive/animation/transition_number_condition.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/animation/transition_trigger_condition_base.cpp b/src/generated/animation/transition_trigger_condition_base.cpp
index 5ef1634..250859c 100644
--- a/src/generated/animation/transition_trigger_condition_base.cpp
+++ b/src/generated/animation/transition_trigger_condition_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/animation/transition_trigger_condition_base.hpp"
-#include "animation/transition_trigger_condition.hpp"
+#include "rive/generated/animation/transition_trigger_condition_base.hpp"
+#include "rive/animation/transition_trigger_condition.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/artboard_base.cpp b/src/generated/artboard_base.cpp
index b5a34fd..02740a5 100644
--- a/src/generated/artboard_base.cpp
+++ b/src/generated/artboard_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/artboard_base.hpp"
-#include "artboard.hpp"
+#include "rive/generated/artboard_base.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/backboard_base.cpp b/src/generated/backboard_base.cpp
index 28a609f..ec7a500 100644
--- a/src/generated/backboard_base.cpp
+++ b/src/generated/backboard_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/backboard_base.hpp"
-#include "backboard.hpp"
+#include "rive/generated/backboard_base.hpp"
+#include "rive/backboard.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/bone_base.cpp b/src/generated/bones/bone_base.cpp
index 4a10a1e..fe76923 100644
--- a/src/generated/bones/bone_base.cpp
+++ b/src/generated/bones/bone_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/bone_base.hpp"
-#include "bones/bone.hpp"
+#include "rive/generated/bones/bone_base.hpp"
+#include "rive/bones/bone.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/cubic_weight_base.cpp b/src/generated/bones/cubic_weight_base.cpp
index 5b9ebb0..989c013 100644
--- a/src/generated/bones/cubic_weight_base.cpp
+++ b/src/generated/bones/cubic_weight_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/cubic_weight_base.hpp"
-#include "bones/cubic_weight.hpp"
+#include "rive/generated/bones/cubic_weight_base.hpp"
+#include "rive/bones/cubic_weight.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/root_bone_base.cpp b/src/generated/bones/root_bone_base.cpp
index c88b526..13645c0 100644
--- a/src/generated/bones/root_bone_base.cpp
+++ b/src/generated/bones/root_bone_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/root_bone_base.hpp"
-#include "bones/root_bone.hpp"
+#include "rive/generated/bones/root_bone_base.hpp"
+#include "rive/bones/root_bone.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/skin_base.cpp b/src/generated/bones/skin_base.cpp
index 64d2d30..e388930 100644
--- a/src/generated/bones/skin_base.cpp
+++ b/src/generated/bones/skin_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/skin_base.hpp"
-#include "bones/skin.hpp"
+#include "rive/generated/bones/skin_base.hpp"
+#include "rive/bones/skin.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/tendon_base.cpp b/src/generated/bones/tendon_base.cpp
index 014854f..18fae18 100644
--- a/src/generated/bones/tendon_base.cpp
+++ b/src/generated/bones/tendon_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/tendon_base.hpp"
-#include "bones/tendon.hpp"
+#include "rive/generated/bones/tendon_base.hpp"
+#include "rive/bones/tendon.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/bones/weight_base.cpp b/src/generated/bones/weight_base.cpp
index e2347e3..a963a6b 100644
--- a/src/generated/bones/weight_base.cpp
+++ b/src/generated/bones/weight_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/bones/weight_base.hpp"
-#include "bones/weight.hpp"
+#include "rive/generated/bones/weight_base.hpp"
+#include "rive/bones/weight.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/constraints/distance_constraint_base.cpp b/src/generated/constraints/distance_constraint_base.cpp
new file mode 100644
index 0000000..e08fc58
--- /dev/null
+++ b/src/generated/constraints/distance_constraint_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/constraints/distance_constraint_base.hpp"
+#include "rive/constraints/distance_constraint.hpp"
+
+using namespace rive;
+
+Core* DistanceConstraintBase::clone() const
+{
+	auto cloned = new DistanceConstraint();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/constraints/ik_constraint_base.cpp b/src/generated/constraints/ik_constraint_base.cpp
new file mode 100644
index 0000000..be4f4b9
--- /dev/null
+++ b/src/generated/constraints/ik_constraint_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/constraints/ik_constraint_base.hpp"
+#include "rive/constraints/ik_constraint.hpp"
+
+using namespace rive;
+
+Core* IKConstraintBase::clone() const
+{
+	auto cloned = new IKConstraint();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/constraints/transform_constraint_base.cpp b/src/generated/constraints/transform_constraint_base.cpp
new file mode 100644
index 0000000..f7b3544
--- /dev/null
+++ b/src/generated/constraints/transform_constraint_base.cpp
@@ -0,0 +1,11 @@
+#include "rive/generated/constraints/transform_constraint_base.hpp"
+#include "rive/constraints/transform_constraint.hpp"
+
+using namespace rive;
+
+Core* TransformConstraintBase::clone() const
+{
+	auto cloned = new TransformConstraint();
+	cloned->copy(*this);
+	return cloned;
+}
diff --git a/src/generated/draw_rules_base.cpp b/src/generated/draw_rules_base.cpp
index 8d3b56b..200ed27 100644
--- a/src/generated/draw_rules_base.cpp
+++ b/src/generated/draw_rules_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/draw_rules_base.hpp"
-#include "draw_rules.hpp"
+#include "rive/generated/draw_rules_base.hpp"
+#include "rive/draw_rules.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/draw_target_base.cpp b/src/generated/draw_target_base.cpp
index 4e8fb32..ef6a485 100644
--- a/src/generated/draw_target_base.cpp
+++ b/src/generated/draw_target_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/draw_target_base.hpp"
-#include "draw_target.hpp"
+#include "rive/generated/draw_target_base.hpp"
+#include "rive/draw_target.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/node_base.cpp b/src/generated/node_base.cpp
index d78200d..8155ae2 100644
--- a/src/generated/node_base.cpp
+++ b/src/generated/node_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/node_base.hpp"
-#include "node.hpp"
+#include "rive/generated/node_base.hpp"
+#include "rive/node.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/clipping_shape_base.cpp b/src/generated/shapes/clipping_shape_base.cpp
index 2a824a7..d15f0ac 100644
--- a/src/generated/shapes/clipping_shape_base.cpp
+++ b/src/generated/shapes/clipping_shape_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/clipping_shape_base.hpp"
-#include "shapes/clipping_shape.hpp"
+#include "rive/generated/shapes/clipping_shape_base.hpp"
+#include "rive/shapes/clipping_shape.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/cubic_asymmetric_vertex_base.cpp b/src/generated/shapes/cubic_asymmetric_vertex_base.cpp
index e4e15e3..9cd329d 100644
--- a/src/generated/shapes/cubic_asymmetric_vertex_base.cpp
+++ b/src/generated/shapes/cubic_asymmetric_vertex_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/cubic_asymmetric_vertex_base.hpp"
-#include "shapes/cubic_asymmetric_vertex.hpp"
+#include "rive/generated/shapes/cubic_asymmetric_vertex_base.hpp"
+#include "rive/shapes/cubic_asymmetric_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/cubic_detached_vertex_base.cpp b/src/generated/shapes/cubic_detached_vertex_base.cpp
index c261c9a..b8c9cec 100644
--- a/src/generated/shapes/cubic_detached_vertex_base.cpp
+++ b/src/generated/shapes/cubic_detached_vertex_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/cubic_detached_vertex_base.hpp"
-#include "shapes/cubic_detached_vertex.hpp"
+#include "rive/generated/shapes/cubic_detached_vertex_base.hpp"
+#include "rive/shapes/cubic_detached_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/cubic_mirrored_vertex_base.cpp b/src/generated/shapes/cubic_mirrored_vertex_base.cpp
index 5042916..037fa8d 100644
--- a/src/generated/shapes/cubic_mirrored_vertex_base.cpp
+++ b/src/generated/shapes/cubic_mirrored_vertex_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/cubic_mirrored_vertex_base.hpp"
-#include "shapes/cubic_mirrored_vertex.hpp"
+#include "rive/generated/shapes/cubic_mirrored_vertex_base.hpp"
+#include "rive/shapes/cubic_mirrored_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/ellipse_base.cpp b/src/generated/shapes/ellipse_base.cpp
index 0bd28db..97f3860 100644
--- a/src/generated/shapes/ellipse_base.cpp
+++ b/src/generated/shapes/ellipse_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/ellipse_base.hpp"
-#include "shapes/ellipse.hpp"
+#include "rive/generated/shapes/ellipse_base.hpp"
+#include "rive/shapes/ellipse.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/fill_base.cpp b/src/generated/shapes/paint/fill_base.cpp
index 50f77d1..31d0627 100644
--- a/src/generated/shapes/paint/fill_base.cpp
+++ b/src/generated/shapes/paint/fill_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/fill_base.hpp"
-#include "shapes/paint/fill.hpp"
+#include "rive/generated/shapes/paint/fill_base.hpp"
+#include "rive/shapes/paint/fill.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/gradient_stop_base.cpp b/src/generated/shapes/paint/gradient_stop_base.cpp
index 1675e99..ccac754 100644
--- a/src/generated/shapes/paint/gradient_stop_base.cpp
+++ b/src/generated/shapes/paint/gradient_stop_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/gradient_stop_base.hpp"
-#include "shapes/paint/gradient_stop.hpp"
+#include "rive/generated/shapes/paint/gradient_stop_base.hpp"
+#include "rive/shapes/paint/gradient_stop.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/linear_gradient_base.cpp b/src/generated/shapes/paint/linear_gradient_base.cpp
index ce52929..5d2b198 100644
--- a/src/generated/shapes/paint/linear_gradient_base.cpp
+++ b/src/generated/shapes/paint/linear_gradient_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/linear_gradient_base.hpp"
-#include "shapes/paint/linear_gradient.hpp"
+#include "rive/generated/shapes/paint/linear_gradient_base.hpp"
+#include "rive/shapes/paint/linear_gradient.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/radial_gradient_base.cpp b/src/generated/shapes/paint/radial_gradient_base.cpp
index a337539..9ee1e75 100644
--- a/src/generated/shapes/paint/radial_gradient_base.cpp
+++ b/src/generated/shapes/paint/radial_gradient_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/radial_gradient_base.hpp"
-#include "shapes/paint/radial_gradient.hpp"
+#include "rive/generated/shapes/paint/radial_gradient_base.hpp"
+#include "rive/shapes/paint/radial_gradient.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/solid_color_base.cpp b/src/generated/shapes/paint/solid_color_base.cpp
index ea66a82..24076dc 100644
--- a/src/generated/shapes/paint/solid_color_base.cpp
+++ b/src/generated/shapes/paint/solid_color_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/solid_color_base.hpp"
-#include "shapes/paint/solid_color.hpp"
+#include "rive/generated/shapes/paint/solid_color_base.hpp"
+#include "rive/shapes/paint/solid_color.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/stroke_base.cpp b/src/generated/shapes/paint/stroke_base.cpp
index aa05103..274ab2e 100644
--- a/src/generated/shapes/paint/stroke_base.cpp
+++ b/src/generated/shapes/paint/stroke_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/stroke_base.hpp"
-#include "shapes/paint/stroke.hpp"
+#include "rive/generated/shapes/paint/stroke_base.hpp"
+#include "rive/shapes/paint/stroke.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/paint/trim_path_base.cpp b/src/generated/shapes/paint/trim_path_base.cpp
index a1c9c47..6acfb19 100644
--- a/src/generated/shapes/paint/trim_path_base.cpp
+++ b/src/generated/shapes/paint/trim_path_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/paint/trim_path_base.hpp"
-#include "shapes/paint/trim_path.hpp"
+#include "rive/generated/shapes/paint/trim_path_base.hpp"
+#include "rive/shapes/paint/trim_path.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/points_path_base.cpp b/src/generated/shapes/points_path_base.cpp
index e6708f8..926c233 100644
--- a/src/generated/shapes/points_path_base.cpp
+++ b/src/generated/shapes/points_path_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/points_path_base.hpp"
-#include "shapes/points_path.hpp"
+#include "rive/generated/shapes/points_path_base.hpp"
+#include "rive/shapes/points_path.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/polygon_base.cpp b/src/generated/shapes/polygon_base.cpp
index 58dd71f..ed2d887 100644
--- a/src/generated/shapes/polygon_base.cpp
+++ b/src/generated/shapes/polygon_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/polygon_base.hpp"
-#include "shapes/polygon.hpp"
+#include "rive/generated/shapes/polygon_base.hpp"
+#include "rive/shapes/polygon.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/rectangle_base.cpp b/src/generated/shapes/rectangle_base.cpp
index 7a7c168..9f475a4 100644
--- a/src/generated/shapes/rectangle_base.cpp
+++ b/src/generated/shapes/rectangle_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/rectangle_base.hpp"
-#include "shapes/rectangle.hpp"
+#include "rive/generated/shapes/rectangle_base.hpp"
+#include "rive/shapes/rectangle.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/shape_base.cpp b/src/generated/shapes/shape_base.cpp
index e6d187b..d167a50 100644
--- a/src/generated/shapes/shape_base.cpp
+++ b/src/generated/shapes/shape_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/shape_base.hpp"
-#include "shapes/shape.hpp"
+#include "rive/generated/shapes/shape_base.hpp"
+#include "rive/shapes/shape.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/star_base.cpp b/src/generated/shapes/star_base.cpp
index 3e0e7f0..b5287f1 100644
--- a/src/generated/shapes/star_base.cpp
+++ b/src/generated/shapes/star_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/star_base.hpp"
-#include "shapes/star.hpp"
+#include "rive/generated/shapes/star_base.hpp"
+#include "rive/shapes/star.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/straight_vertex_base.cpp b/src/generated/shapes/straight_vertex_base.cpp
index 606b80c..b2f9166 100644
--- a/src/generated/shapes/straight_vertex_base.cpp
+++ b/src/generated/shapes/straight_vertex_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/straight_vertex_base.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/generated/shapes/straight_vertex_base.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/generated/shapes/triangle_base.cpp b/src/generated/shapes/triangle_base.cpp
index d365815..e9b7ebf 100644
--- a/src/generated/shapes/triangle_base.cpp
+++ b/src/generated/shapes/triangle_base.cpp
@@ -1,5 +1,5 @@
-#include "generated/shapes/triangle_base.hpp"
-#include "shapes/triangle.hpp"
+#include "rive/generated/shapes/triangle_base.hpp"
+#include "rive/shapes/triangle.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/artboard_importer.cpp b/src/importers/artboard_importer.cpp
index 768912b..1bf6551 100644
--- a/src/importers/artboard_importer.cpp
+++ b/src/importers/artboard_importer.cpp
@@ -1,8 +1,8 @@
-#include "artboard.hpp"
-#include "importers/artboard_importer.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/state_machine.hpp"
-#include "artboard.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/state_machine.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/keyed_object_importer.cpp b/src/importers/keyed_object_importer.cpp
index e7ec3aa..9b0b9fb 100644
--- a/src/importers/keyed_object_importer.cpp
+++ b/src/importers/keyed_object_importer.cpp
@@ -1,7 +1,7 @@
-#include "importers/keyed_object_importer.hpp"
-#include "animation/keyed_object.hpp"
-#include "animation/keyed_property.hpp"
-#include "artboard.hpp"
+#include "rive/importers/keyed_object_importer.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/keyed_property_importer.cpp b/src/importers/keyed_property_importer.cpp
index 733bd00..2e48c74 100644
--- a/src/importers/keyed_property_importer.cpp
+++ b/src/importers/keyed_property_importer.cpp
@@ -1,7 +1,7 @@
-#include "importers/keyed_property_importer.hpp"
-#include "animation/keyed_property.hpp"
-#include "animation/keyframe.hpp"
-#include "animation/linear_animation.hpp"
+#include "rive/importers/keyed_property_importer.hpp"
+#include "rive/animation/keyed_property.hpp"
+#include "rive/animation/keyframe.hpp"
+#include "rive/animation/linear_animation.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/layer_state_importer.cpp b/src/importers/layer_state_importer.cpp
index 8b3fa60..7f7824e 100644
--- a/src/importers/layer_state_importer.cpp
+++ b/src/importers/layer_state_importer.cpp
@@ -1,8 +1,8 @@
-#include "importers/layer_state_importer.hpp"
-#include "animation/state_transition.hpp"
-#include "animation/layer_state.hpp"
-#include "animation/blend_state.hpp"
-#include "animation/blend_state_transition.hpp"
+#include "rive/importers/layer_state_importer.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/animation/layer_state.hpp"
+#include "rive/animation/blend_state.hpp"
+#include "rive/animation/blend_state_transition.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/linear_animation_importer.cpp b/src/importers/linear_animation_importer.cpp
index 37d9607..d5540e9 100644
--- a/src/importers/linear_animation_importer.cpp
+++ b/src/importers/linear_animation_importer.cpp
@@ -1,7 +1,7 @@
-#include "importers/linear_animation_importer.hpp"
-#include "animation/keyed_object.hpp"
-#include "animation/linear_animation.hpp"
-#include "artboard.hpp"
+#include "rive/importers/linear_animation_importer.hpp"
+#include "rive/animation/keyed_object.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/state_machine_importer.cpp b/src/importers/state_machine_importer.cpp
index f734d73..c4915ff 100644
--- a/src/importers/state_machine_importer.cpp
+++ b/src/importers/state_machine_importer.cpp
@@ -1,5 +1,5 @@
-#include "importers/state_machine_importer.hpp"
-#include "animation/state_machine.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/animation/state_machine.hpp"
 
 using namespace rive;
 
diff --git a/src/importers/state_machine_layer_importer.cpp b/src/importers/state_machine_layer_importer.cpp
index 4ab1722..0d785ac 100644
--- a/src/importers/state_machine_layer_importer.cpp
+++ b/src/importers/state_machine_layer_importer.cpp
@@ -1,9 +1,9 @@
-#include "importers/state_machine_layer_importer.hpp"
-#include "importers/artboard_importer.hpp"
-#include "animation/state_machine_layer.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/state_transition.hpp"
-#include "artboard.hpp"
+#include "rive/importers/state_machine_layer_importer.hpp"
+#include "rive/importers/artboard_importer.hpp"
+#include "rive/animation/state_machine_layer.hpp"
+#include "rive/animation/animation_state.hpp"
+#include "rive/animation/state_transition.hpp"
+#include "rive/artboard.hpp"
 
 using namespace rive;
 StateMachineLayerImporter::StateMachineLayerImporter(StateMachineLayer* layer,
diff --git a/src/importers/state_transition_importer.cpp b/src/importers/state_transition_importer.cpp
index 387ae6e..f48aa28 100644
--- a/src/importers/state_transition_importer.cpp
+++ b/src/importers/state_transition_importer.cpp
@@ -1,6 +1,6 @@
-#include "importers/state_transition_importer.hpp"
-#include "animation/transition_condition.hpp"
-#include "animation/state_transition.hpp"
+#include "rive/importers/state_transition_importer.hpp"
+#include "rive/animation/transition_condition.hpp"
+#include "rive/animation/state_transition.hpp"
 
 using namespace rive;
 
diff --git a/src/layout.cpp b/src/layout.cpp
index 6c7d33d..55d9e8f 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -1,4 +1,4 @@
-#include "layout.hpp"
+#include "rive/layout.hpp"
 
 using namespace rive;
 
diff --git a/src/math/aabb.cpp b/src/math/aabb.cpp
index d561127..ab06c4e 100644
--- a/src/math/aabb.cpp
+++ b/src/math/aabb.cpp
@@ -1,4 +1,4 @@
-#include "math/aabb.hpp"
+#include "rive/math/aabb.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/math/mat2d.cpp b/src/math/mat2d.cpp
index b8bd10d..2db040b 100644
--- a/src/math/mat2d.cpp
+++ b/src/math/mat2d.cpp
@@ -1,6 +1,6 @@
-#include "math/mat2d.hpp"
-#include "math/transform_components.hpp"
-#include "math/vec2d.hpp"
+#include "rive/math/mat2d.hpp"
+#include "rive/math/transform_components.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cmath>
 
 using namespace rive;
@@ -12,6 +12,11 @@
 {
 }
 
+Mat2D::Mat2D(float x1, float y1, float x2, float y2, float tx, float ty) :
+    m_Buffer{x1, y1, x2, y2, tx, ty}
+{
+}
+
 void Mat2D::fromRotation(Mat2D& result, float rad)
 {
 	float s = sin(rad);
@@ -99,7 +104,7 @@
 {
 	float r = components.rotation();
 
-	if (r != 0.0)
+	if (r != 0.0f)
 	{
 		Mat2D::fromRotation(result, r);
 	}
@@ -114,7 +119,7 @@
 	Mat2D::scale(result, result, scale);
 
 	float sk = components.skew();
-	if (sk != 0.0)
+	if (sk != 0.0f)
 	{
 		result[2] = result[0] * sk + result[2];
 		result[3] = result[1] * sk + result[3];
diff --git a/src/math/vec2d.cpp b/src/math/vec2d.cpp
index 8aac69e..468fd16 100644
--- a/src/math/vec2d.cpp
+++ b/src/math/vec2d.cpp
@@ -1,5 +1,5 @@
-#include "math/vec2d.hpp"
-#include "math/mat2d.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/math/mat2d.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/node.cpp b/src/node.cpp
index 74578cb..7cc4664 100644
--- a/src/node.cpp
+++ b/src/node.cpp
@@ -1,4 +1,4 @@
-#include "node.hpp"
+#include "rive/node.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/clipping_shape.cpp b/src/shapes/clipping_shape.cpp
index 27ede97..9a6b78b 100644
--- a/src/shapes/clipping_shape.cpp
+++ b/src/shapes/clipping_shape.cpp
@@ -1,10 +1,10 @@
-#include "shapes/clipping_shape.hpp"
-#include "artboard.hpp"
-#include "core_context.hpp"
-#include "node.hpp"
-#include "renderer.hpp"
-#include "shapes/path_composer.hpp"
-#include "shapes/shape.hpp"
+#include "rive/shapes/clipping_shape.hpp"
+#include "rive/artboard.hpp"
+#include "rive/core_context.hpp"
+#include "rive/node.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/path_composer.hpp"
+#include "rive/shapes/shape.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/cubic_asymmetric_vertex.cpp b/src/shapes/cubic_asymmetric_vertex.cpp
index da34b09..51c58ff 100644
--- a/src/shapes/cubic_asymmetric_vertex.cpp
+++ b/src/shapes/cubic_asymmetric_vertex.cpp
@@ -1,5 +1,5 @@
-#include "shapes/cubic_asymmetric_vertex.hpp"
-#include "math/vec2d.hpp"
+#include "rive/shapes/cubic_asymmetric_vertex.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/shapes/cubic_detached_vertex.cpp b/src/shapes/cubic_detached_vertex.cpp
index 2cb2d78..5d03bab 100644
--- a/src/shapes/cubic_detached_vertex.cpp
+++ b/src/shapes/cubic_detached_vertex.cpp
@@ -1,5 +1,5 @@
-#include "shapes/cubic_detached_vertex.hpp"
-#include "math/vec2d.hpp"
+#include "rive/shapes/cubic_detached_vertex.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/shapes/cubic_mirrored_vertex.cpp b/src/shapes/cubic_mirrored_vertex.cpp
index bf171a9..09735db 100644
--- a/src/shapes/cubic_mirrored_vertex.cpp
+++ b/src/shapes/cubic_mirrored_vertex.cpp
@@ -1,5 +1,5 @@
-#include "shapes/cubic_mirrored_vertex.hpp"
-#include "math/vec2d.hpp"
+#include "rive/shapes/cubic_mirrored_vertex.hpp"
+#include "rive/math/vec2d.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/shapes/cubic_vertex.cpp b/src/shapes/cubic_vertex.cpp
index 4851c86..795c127 100644
--- a/src/shapes/cubic_vertex.cpp
+++ b/src/shapes/cubic_vertex.cpp
@@ -1,5 +1,5 @@
-#include "shapes/cubic_vertex.hpp"
-#include "bones/cubic_weight.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
+#include "rive/bones/cubic_weight.hpp"
 using namespace rive;
 
 const Vec2D& CubicVertex::renderIn()
diff --git a/src/shapes/ellipse.cpp b/src/shapes/ellipse.cpp
index 0642fc2..334400e 100644
--- a/src/shapes/ellipse.cpp
+++ b/src/shapes/ellipse.cpp
@@ -1,6 +1,6 @@
-#include "shapes/ellipse.hpp"
-#include "component_dirt.hpp"
-#include "math/circle_constant.hpp"
+#include "rive/shapes/ellipse.hpp"
+#include "rive/component_dirt.hpp"
+#include "rive/math/circle_constant.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/metrics_path.cpp b/src/shapes/metrics_path.cpp
index d05f9cb..91008e6 100644
--- a/src/shapes/metrics_path.cpp
+++ b/src/shapes/metrics_path.cpp
@@ -1,6 +1,6 @@
-#include "shapes/metrics_path.hpp"
-#include "renderer.hpp"
-#include "math/cubic_utilities.hpp"
+#include "rive/shapes/metrics_path.hpp"
+#include "rive/renderer.hpp"
+#include "rive/math/cubic_utilities.hpp"
 #include <math.h>
 
 using namespace rive;
diff --git a/src/shapes/paint/color.cpp b/src/shapes/paint/color.cpp
index 5b79d90..dbcb959 100644
--- a/src/shapes/paint/color.cpp
+++ b/src/shapes/paint/color.cpp
@@ -1,4 +1,4 @@
-#include "shapes/paint/color.hpp"
+#include "rive/shapes/paint/color.hpp"
 #include <stdio.h>
 
 namespace rive
diff --git a/src/shapes/paint/fill.cpp b/src/shapes/paint/fill.cpp
index 0b45e67..f0f6ed4 100644
--- a/src/shapes/paint/fill.cpp
+++ b/src/shapes/paint/fill.cpp
@@ -1,4 +1,4 @@
-#include "shapes/paint/fill.hpp"
+#include "rive/shapes/paint/fill.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/gradient_stop.cpp b/src/shapes/paint/gradient_stop.cpp
index 9ea6ba3..fa9f516 100644
--- a/src/shapes/paint/gradient_stop.cpp
+++ b/src/shapes/paint/gradient_stop.cpp
@@ -1,5 +1,5 @@
-#include "shapes/paint/gradient_stop.hpp"
-#include "shapes/paint/linear_gradient.hpp"
+#include "rive/shapes/paint/gradient_stop.hpp"
+#include "rive/shapes/paint/linear_gradient.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/linear_gradient.cpp b/src/shapes/paint/linear_gradient.cpp
index 1724c60..bd078fb 100644
--- a/src/shapes/paint/linear_gradient.cpp
+++ b/src/shapes/paint/linear_gradient.cpp
@@ -1,11 +1,11 @@
-#include "shapes/paint/linear_gradient.hpp"
-#include "math/vec2d.hpp"
-#include "node.hpp"
-#include "renderer.hpp"
-#include "shapes/paint/color.hpp"
-#include "shapes/paint/gradient_stop.hpp"
-#include "shapes/shape_paint_container.hpp"
-#include "shapes/paint/shape_paint.hpp"
+#include "rive/shapes/paint/linear_gradient.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/node.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/paint/color.hpp"
+#include "rive/shapes/paint/gradient_stop.hpp"
+#include "rive/shapes/shape_paint_container.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
 #include <algorithm>
 
 using namespace rive;
diff --git a/src/shapes/paint/radial_gradient.cpp b/src/shapes/paint/radial_gradient.cpp
index 1a97ba8..4d17891 100644
--- a/src/shapes/paint/radial_gradient.cpp
+++ b/src/shapes/paint/radial_gradient.cpp
@@ -1,5 +1,5 @@
-#include "shapes/paint/radial_gradient.hpp"
-#include "renderer.hpp"
+#include "rive/shapes/paint/radial_gradient.hpp"
+#include "rive/renderer.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/shape_paint.cpp b/src/shapes/paint/shape_paint.cpp
index f500e5f..b2499d6 100644
--- a/src/shapes/paint/shape_paint.cpp
+++ b/src/shapes/paint/shape_paint.cpp
@@ -1,7 +1,7 @@
-#include "shapes/paint/shape_paint.hpp"
-#include "shapes/shape_paint_container.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
+#include "rive/shapes/shape_paint_container.hpp"
 
-#include "renderer.hpp"
+#include "rive/renderer.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/shape_paint_mutator.cpp b/src/shapes/paint/shape_paint_mutator.cpp
index c1263fa..f9fec3f 100644
--- a/src/shapes/paint/shape_paint_mutator.cpp
+++ b/src/shapes/paint/shape_paint_mutator.cpp
@@ -1,6 +1,6 @@
-#include "shapes/paint/shape_paint_mutator.hpp"
-#include "component.hpp"
-#include "shapes/paint/shape_paint.hpp"
+#include "rive/shapes/paint/shape_paint_mutator.hpp"
+#include "rive/component.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/solid_color.cpp b/src/shapes/paint/solid_color.cpp
index 987b31e..9459f65 100644
--- a/src/shapes/paint/solid_color.cpp
+++ b/src/shapes/paint/solid_color.cpp
@@ -1,7 +1,7 @@
-#include "shapes/paint/solid_color.hpp"
-#include "container_component.hpp"
-#include "renderer.hpp"
-#include "shapes/paint/color.hpp"
+#include "rive/shapes/paint/solid_color.hpp"
+#include "rive/container_component.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/paint/color.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/stroke.cpp b/src/shapes/paint/stroke.cpp
index ec581c1..9a853a9 100644
--- a/src/shapes/paint/stroke.cpp
+++ b/src/shapes/paint/stroke.cpp
@@ -1,7 +1,7 @@
-#include "shapes/paint/stroke.hpp"
-#include "shapes/paint/stroke_cap.hpp"
-#include "shapes/paint/stroke_effect.hpp"
-#include "shapes/paint/stroke_join.hpp"
+#include "rive/shapes/paint/stroke.hpp"
+#include "rive/shapes/paint/stroke_cap.hpp"
+#include "rive/shapes/paint/stroke_effect.hpp"
+#include "rive/shapes/paint/stroke_join.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/paint/trim_path.cpp b/src/shapes/paint/trim_path.cpp
index 9132792..b62cd65 100644
--- a/src/shapes/paint/trim_path.cpp
+++ b/src/shapes/paint/trim_path.cpp
@@ -1,6 +1,6 @@
-#include "shapes/paint/trim_path.hpp"
-#include "shapes/metrics_path.hpp"
-#include "shapes/paint/stroke.hpp"
+#include "rive/shapes/paint/trim_path.hpp"
+#include "rive/shapes/metrics_path.hpp"
+#include "rive/shapes/paint/stroke.hpp"
 
 using namespace rive;
 
@@ -98,7 +98,7 @@
 				{
 					startLength = 0;
 					endLength -= pathLength;
-					path->trim(startLength, endLength, false, m_TrimmedPath);
+					path->trim(startLength, endLength, true, m_TrimmedPath);
 				}
 			}
 		}
diff --git a/src/shapes/parametric_path.cpp b/src/shapes/parametric_path.cpp
index d5d7fe6..923d1d7 100644
--- a/src/shapes/parametric_path.cpp
+++ b/src/shapes/parametric_path.cpp
@@ -1,4 +1,4 @@
-#include "shapes/parametric_path.hpp"
+#include "rive/shapes/parametric_path.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/path.cpp b/src/shapes/path.cpp
index 348d07a..e201c98 100644
--- a/src/shapes/path.cpp
+++ b/src/shapes/path.cpp
@@ -1,11 +1,11 @@
-#include "shapes/path.hpp"
-#include "math/circle_constant.hpp"
-#include "renderer.hpp"
-#include "shapes/cubic_vertex.hpp"
-#include "shapes/cubic_detached_vertex.hpp"
-#include "shapes/path_vertex.hpp"
-#include "shapes/shape.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/shapes/path.hpp"
+#include "rive/math/circle_constant.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/cubic_vertex.hpp"
+#include "rive/shapes/cubic_detached_vertex.hpp"
+#include "rive/shapes/path_vertex.hpp"
+#include "rive/shapes/shape.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 #include <cassert>
 
 using namespace rive;
diff --git a/src/shapes/path_composer.cpp b/src/shapes/path_composer.cpp
index d1415ec..5877005 100644
--- a/src/shapes/path_composer.cpp
+++ b/src/shapes/path_composer.cpp
@@ -1,8 +1,8 @@
-#include "shapes/path_composer.hpp"
-#include "artboard.hpp"
-#include "renderer.hpp"
-#include "shapes/path.hpp"
-#include "shapes/shape.hpp"
+#include "rive/shapes/path_composer.hpp"
+#include "rive/artboard.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/path.hpp"
+#include "rive/shapes/shape.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/path_vertex.cpp b/src/shapes/path_vertex.cpp
index 24cea98..c34e39b 100644
--- a/src/shapes/path_vertex.cpp
+++ b/src/shapes/path_vertex.cpp
@@ -1,5 +1,5 @@
-#include "shapes/path_vertex.hpp"
-#include "shapes/path.hpp"
+#include "rive/shapes/path_vertex.hpp"
+#include "rive/shapes/path.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/points_path.cpp b/src/shapes/points_path.cpp
index 02c9860..16c80c4 100644
--- a/src/shapes/points_path.cpp
+++ b/src/shapes/points_path.cpp
@@ -1,5 +1,5 @@
-#include "shapes/points_path.hpp"
-#include "bones/skin.hpp"
+#include "rive/shapes/points_path.hpp"
+#include "rive/bones/skin.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/polygon.cpp b/src/shapes/polygon.cpp
index 9a8a7a5..144cf2c 100644
--- a/src/shapes/polygon.cpp
+++ b/src/shapes/polygon.cpp
@@ -1,6 +1,6 @@
-#include "shapes/polygon.hpp"
-#include "shapes/star.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/shapes/polygon.hpp"
+#include "rive/shapes/star.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 #include <cmath>
 
 using namespace rive;
diff --git a/src/shapes/rectangle.cpp b/src/shapes/rectangle.cpp
index 3cd739e..ac22bc3 100644
--- a/src/shapes/rectangle.cpp
+++ b/src/shapes/rectangle.cpp
@@ -1,4 +1,4 @@
-#include "shapes/rectangle.hpp"
+#include "rive/shapes/rectangle.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/shape.cpp b/src/shapes/shape.cpp
index ce21ba5..66ab67e 100644
--- a/src/shapes/shape.cpp
+++ b/src/shapes/shape.cpp
@@ -1,8 +1,8 @@
-#include "shapes/shape.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/paint/blend_mode.hpp"
-#include "shapes/paint/shape_paint.hpp"
-#include "shapes/path_composer.hpp"
+#include "rive/shapes/shape.hpp"
+#include "rive/shapes/clipping_shape.hpp"
+#include "rive/shapes/paint/blend_mode.hpp"
+#include "rive/shapes/paint/shape_paint.hpp"
+#include "rive/shapes/path_composer.hpp"
 #include <algorithm>
 
 using namespace rive;
diff --git a/src/shapes/shape_paint_container.cpp b/src/shapes/shape_paint_container.cpp
index e9deb1e..a527cde 100644
--- a/src/shapes/shape_paint_container.cpp
+++ b/src/shapes/shape_paint_container.cpp
@@ -1,11 +1,11 @@
-#include "shapes/shape_paint_container.hpp"
-#include "artboard.hpp"
-#include "component.hpp"
-#include "renderer.hpp"
-#include "shapes/metrics_path.hpp"
-#include "shapes/paint/fill.hpp"
-#include "shapes/paint/stroke.hpp"
-#include "shapes/shape.hpp"
+#include "rive/shapes/shape_paint_container.hpp"
+#include "rive/artboard.hpp"
+#include "rive/component.hpp"
+#include "rive/renderer.hpp"
+#include "rive/shapes/metrics_path.hpp"
+#include "rive/shapes/paint/fill.hpp"
+#include "rive/shapes/paint/stroke.hpp"
+#include "rive/shapes/shape.hpp"
 
 using namespace rive;
 ShapePaintContainer* ShapePaintContainer::from(Component* component)
diff --git a/src/shapes/star.cpp b/src/shapes/star.cpp
index 6f95266..e1dd7e7 100644
--- a/src/shapes/star.cpp
+++ b/src/shapes/star.cpp
@@ -1,5 +1,5 @@
-#include "shapes/star.hpp"
-#include "shapes/straight_vertex.hpp"
+#include "rive/shapes/star.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 #include <cmath>
 #include <cstdio>
 
diff --git a/src/shapes/straight_vertex.cpp b/src/shapes/straight_vertex.cpp
index f35f76d..07d0d2b 100644
--- a/src/shapes/straight_vertex.cpp
+++ b/src/shapes/straight_vertex.cpp
@@ -1,4 +1,4 @@
-#include "shapes/straight_vertex.hpp"
+#include "rive/shapes/straight_vertex.hpp"
 
 using namespace rive;
 
diff --git a/src/shapes/triangle.cpp b/src/shapes/triangle.cpp
index 4b2d162..73af0bc 100644
--- a/src/shapes/triangle.cpp
+++ b/src/shapes/triangle.cpp
@@ -1,6 +1,6 @@
-#include "shapes/triangle.hpp"
-#include "component_dirt.hpp"
-#include "math/circle_constant.hpp"
+#include "rive/shapes/triangle.hpp"
+#include "rive/component_dirt.hpp"
+#include "rive/math/circle_constant.hpp"
 
 using namespace rive;
 
diff --git a/src/transform_component.cpp b/src/transform_component.cpp
index 1a5f308..df4af10 100644
--- a/src/transform_component.cpp
+++ b/src/transform_component.cpp
@@ -1,5 +1,7 @@
-#include "transform_component.hpp"
-#include "shapes/clipping_shape.hpp"
+#include "rive/transform_component.hpp"
+#include "rive/shapes/clipping_shape.hpp"
+#include "rive/math/vec2d.hpp"
+#include "rive/constraints/constraint.hpp"
 
 using namespace rive;
 
@@ -61,6 +63,11 @@
 	{
 		Mat2D::copy(m_WorldTransform, m_Transform);
 	}
+
+	for (auto constraint : m_Constraints)
+	{
+		constraint->constrain(this);
+	}
 }
 
 void TransformComponent::update(ComponentDirt value)
@@ -89,10 +96,24 @@
 	return m_WorldTransform;
 }
 
+Mat2D& TransformComponent::mutableWorldTransform() { return m_WorldTransform; }
+Mat2D& TransformComponent::mutableTransform() { return m_Transform; }
+
 void TransformComponent::rotationChanged() { markTransformDirty(); }
 void TransformComponent::scaleXChanged() { markTransformDirty(); }
 void TransformComponent::scaleYChanged() { markTransformDirty(); }
 void TransformComponent::opacityChanged()
 {
 	addDirt(ComponentDirt::RenderOpacity, true);
+}
+
+void TransformComponent::worldTranslation(Vec2D& result) const
+{
+	result[0] = m_WorldTransform[4];
+	result[1] = m_WorldTransform[5];
+}
+
+void TransformComponent::addConstraint(Constraint* constraint)
+{
+	m_Constraints.push_back(constraint);
 }
\ No newline at end of file
diff --git a/test/assets/complex_ik_dependency.riv b/test/assets/complex_ik_dependency.riv
new file mode 100644
index 0000000..745fbbb
--- /dev/null
+++ b/test/assets/complex_ik_dependency.riv
Binary files differ
diff --git a/test/assets/distance_constraint.riv b/test/assets/distance_constraint.riv
new file mode 100644
index 0000000..1daae68
--- /dev/null
+++ b/test/assets/distance_constraint.riv
Binary files differ
diff --git a/test/assets/transform_constraint.riv b/test/assets/transform_constraint.riv
new file mode 100644
index 0000000..30f765f
--- /dev/null
+++ b/test/assets/transform_constraint.riv
Binary files differ
diff --git a/test/assets/two_bone_ik.riv b/test/assets/two_bone_ik.riv
new file mode 100644
index 0000000..c227124
--- /dev/null
+++ b/test/assets/two_bone_ik.riv
Binary files differ
diff --git a/test/bound_bones_test.cpp b/test/bound_bones_test.cpp
index 7aa312c..3667b0e 100644
--- a/test/bound_bones_test.cpp
+++ b/test/bound_bones_test.cpp
@@ -1,15 +1,15 @@
-#include "bones/skin.hpp"
-#include "bones/tendon.hpp"
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/bones/skin.hpp>
+#include <rive/bones/tendon.hpp>
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/clipping_shape.hpp>
+#include <rive/shapes/path_vertex.hpp>
+#include <rive/shapes/points_path.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/path_vertex.hpp"
-#include "shapes/points_path.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("bound bones load correctly", "[bones]")
diff --git a/test/clip_test.cpp b/test/clip_test.cpp
index 7cee4d9..100e3f0 100644
--- a/test/clip_test.cpp
+++ b/test/clip_test.cpp
@@ -1,11 +1,11 @@
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/clipping_shape.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("clipping loads correctly", "[clipping]")
diff --git a/test/distance_constraint_test.cpp b/test/distance_constraint_test.cpp
new file mode 100644
index 0000000..2976571
--- /dev/null
+++ b/test/distance_constraint_test.cpp
@@ -0,0 +1,54 @@
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/constraints/distance_constraint.hpp>
+#include <rive/node.hpp>
+#include <rive/math/vec2d.hpp>
+#include <rive/shapes/shape.hpp>
+#include "rive_testing.hpp"
+#include <cstdio>
+
+TEST_CASE("distance constraints moves items as expected", "[file]")
+{
+	FILE* fp = fopen("../../test/assets/distance_constraint.riv", "r");
+	REQUIRE(fp != nullptr);
+
+	fseek(fp, 0, SEEK_END);
+	auto length = ftell(fp);
+	fseek(fp, 0, SEEK_SET);
+	uint8_t* bytes = new uint8_t[length];
+	REQUIRE(fread(bytes, 1, length, fp) == length);
+	auto reader = rive::BinaryReader(bytes, length);
+	rive::File* file = nullptr;
+	auto result = rive::File::import(reader, &file);
+
+	REQUIRE(result == rive::ImportResult::success);
+	REQUIRE(file != nullptr);
+	REQUIRE(file->artboard() != nullptr);
+
+	auto artboard = file->artboard();
+
+	REQUIRE(artboard->find<rive::Shape>("A") != nullptr);
+	auto a = artboard->find<rive::Shape>("A");
+
+	REQUIRE(artboard->find<rive::Shape>("B") != nullptr);
+	auto b = artboard->find<rive::Shape>("B");
+
+	REQUIRE(a->constraints().size() == 1);
+	REQUIRE(a->constraints()[0]->is<rive::DistanceConstraint>());
+
+	auto distanceConstraint =
+	    a->constraints()[0]->as<rive::DistanceConstraint>();
+	REQUIRE(distanceConstraint->modeValue() == 1);
+
+	b->x(259.31f);
+	b->y(137.87f);
+	artboard->advance(0.0f);
+
+	rive::Vec2D at;
+	a->worldTranslation(at);
+	rive::Vec2D expectedTranslation(259.2808837890625, 62.87000274658203);
+	REQUIRE(rive::Vec2D::distance(at, expectedTranslation) < 0.001f);
+
+	delete file;
+	delete[] bytes;
+}
\ No newline at end of file
diff --git a/test/draw_order_test.cpp b/test/draw_order_test.cpp
index c02e60a..1515cc0 100644
--- a/test/draw_order_test.cpp
+++ b/test/draw_order_test.cpp
@@ -1,11 +1,11 @@
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/clipping_shape.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("draw rules load and sort correctly", "[draw rules]")
diff --git a/test/file_test.cpp b/test/file_test.cpp
index 3b6bcc4..845e222 100644
--- a/test/file_test.cpp
+++ b/test/file_test.cpp
@@ -1,10 +1,10 @@
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("file can be read", "[file]")
diff --git a/test/ik_constraint_test.cpp b/test/ik_constraint_test.cpp
new file mode 100644
index 0000000..4e0649b
--- /dev/null
+++ b/test/ik_constraint_test.cpp
@@ -0,0 +1,55 @@
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/constraints/ik_constraint.hpp>
+#include <rive/node.hpp>
+#include <rive/math/vec2d.hpp>
+#include <rive/shapes/shape.hpp>
+#include <rive/bones/skin.hpp>
+#include <rive/bones/bone.hpp>
+#include "rive_testing.hpp"
+#include <cstdio>
+
+TEST_CASE("ik with skinned bones orders correctly", "[file]")
+{
+	FILE* fp = fopen("../../test/assets/complex_ik_dependency.riv", "r");
+	REQUIRE(fp != nullptr);
+
+	fseek(fp, 0, SEEK_END);
+	auto length = ftell(fp);
+	fseek(fp, 0, SEEK_SET);
+	uint8_t* bytes = new uint8_t[length];
+	REQUIRE(fread(bytes, 1, length, fp) == length);
+	auto reader = rive::BinaryReader(bytes, length);
+	rive::File* file = nullptr;
+	auto result = rive::File::import(reader, &file);
+
+	REQUIRE(result == rive::ImportResult::success);
+	REQUIRE(file != nullptr);
+	REQUIRE(file->artboard() != nullptr);
+
+	auto artboard = file->artboard();
+
+	REQUIRE(artboard->find<rive::Bone>("One") != nullptr);
+	auto one = artboard->find<rive::Bone>("One");
+
+	REQUIRE(artboard->find<rive::Bone>("Two") != nullptr);
+	auto two = artboard->find<rive::Bone>("Two");
+	rive::Skin* skin = nullptr;
+	for (auto object : artboard->objects())
+	{
+		if (object->is<rive::Skin>())
+		{
+			skin = object->as<rive::Skin>();
+			break;
+		}
+	}
+
+	REQUIRE(skin != nullptr);
+	REQUIRE(two->constraints()[0]->is<rive::IKConstraint>());
+
+	REQUIRE(skin->graphOrder() > one->graphOrder());
+	REQUIRE(skin->graphOrder() > two->graphOrder());
+
+	delete file;
+	delete[] bytes;
+}
\ No newline at end of file
diff --git a/test/ik_test.cpp b/test/ik_test.cpp
new file mode 100644
index 0000000..2e2f93e
--- /dev/null
+++ b/test/ik_test.cpp
@@ -0,0 +1,101 @@
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/bones/bone.hpp>
+#include <rive/shapes/shape.hpp>
+#include "no_op_renderer.hpp"
+#include "rive_testing.hpp"
+#include <cstdio>
+
+TEST_CASE("two bone ik places bones correctly", "[file]")
+{
+	FILE* fp = fopen("../../test/assets/two_bone_ik.riv", "r");
+	REQUIRE(fp != nullptr);
+
+	fseek(fp, 0, SEEK_END);
+	auto length = ftell(fp);
+	fseek(fp, 0, SEEK_SET);
+	uint8_t* bytes = new uint8_t[length];
+	REQUIRE(fread(bytes, 1, length, fp) == length);
+	auto reader = rive::BinaryReader(bytes, length);
+	rive::File* file = nullptr;
+	auto result = rive::File::import(reader, &file);
+
+	REQUIRE(result == rive::ImportResult::success);
+	REQUIRE(file != nullptr);
+	REQUIRE(file->artboard() != nullptr);
+
+	auto artboard = file->artboard();
+
+	REQUIRE(artboard->find<rive::Shape>("circle a") != nullptr);
+	auto circleA = artboard->find<rive::Shape>("circle a");
+
+	REQUIRE(artboard->find<rive::Shape>("circle b") != nullptr);
+	auto circleB = artboard->find<rive::Shape>("circle b");
+
+	REQUIRE(artboard->find<rive::Bone>("a") != nullptr);
+	auto boneA = artboard->find<rive::Bone>("a");
+
+	REQUIRE(artboard->find<rive::Bone>("b") != nullptr);
+	auto boneB = artboard->find<rive::Bone>("b");
+
+	REQUIRE(artboard->find<rive::Node>("target") != nullptr);
+	auto target = artboard->find<rive::Node>("target");
+
+	REQUIRE(artboard->animation("Animation 1") != nullptr);
+	auto animation = artboard->animation("Animation 1");
+
+	// Make sure dependency structure is correct. Important thing here is to
+	// ensure that circle a is dependent upon the tip of the ik chain (bone b).
+	// circle b is a child of bone b so it'll be there anyway, but may as well
+	// validate.
+	REQUIRE(std::find(boneB->dependents().begin(),
+	                  boneB->dependents().end(),
+	                  circleA) != boneB->dependents().end());
+	REQUIRE(std::find(boneB->dependents().begin(),
+	                  boneB->dependents().end(),
+	                  circleB) != boneB->dependents().end());
+
+	animation->apply(artboard, 0.0f, 1.0f);
+	artboard->advance(0.0f);
+	REQUIRE(target->x() == 296.0f);
+	REQUIRE(target->y() == 202.0f);
+	REQUIRE(aboutEqual(boneA->worldTransform(),
+	                   rive::Mat2D(0.11632211506366729736328125f,
+	                               -0.993211567401885986328125f,
+	                               0.993211567401885986328125f,
+	                               0.11632211506366729736328125f,
+	                               26.015254974365234375f,
+	                               475.2149658203125f)));
+
+	REQUIRE(aboutEqual(boneB->worldTransform(),
+	                   rive::Mat2D(0.974071562290191650390625f,
+	                               0.2262403070926666259765625f,
+	                               -0.2262403070926666259765625f,
+	                               0.974071562290191650390625f,
+	                               64.31568145751953125f,
+	                               148.1883544921875f)));
+
+	animation->apply(artboard, 1.0f, 1.0f);
+	artboard->advance(0.0f);
+	REQUIRE(target->x() == 450.0f);
+	REQUIRE(target->y() == 337.0f);
+	REQUIRE(aboutEqual(boneA->worldTransform(),
+	                   rive::Mat2D(0.650279819965362548828125f,
+	                               -0.7596948146820068359375f,
+	                               0.7596948146820068359375f,
+	                               0.650279819965362548828125f,
+	                               26.015254974365234375f,
+	                               475.2149658203125f)));
+
+	REQUIRE(aboutEqual(boneB->worldTransform(),
+	                   rive::Mat2D(0.8823678493499755859375f,
+	                               0.470560371875762939453125f,
+	                               -0.47056043148040771484375f,
+	                               0.882367908954620361328125f,
+	                               240.1275634765625f,
+	                               225.07647705078125f)));
+
+	delete file;
+	delete[] bytes;
+}
\ No newline at end of file
diff --git a/test/instancing_test.cpp b/test/instancing_test.cpp
index 9ca21cd..639f50c 100644
--- a/test/instancing_test.cpp
+++ b/test/instancing_test.cpp
@@ -1,11 +1,11 @@
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/clipping_shape.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/clipping_shape.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("cloning an ellipse works", "[instancing]")
diff --git a/test/linear_animation_instance_test.cpp b/test/linear_animation_instance_test.cpp
index 1f85934..ad368dd 100644
--- a/test/linear_animation_instance_test.cpp
+++ b/test/linear_animation_instance_test.cpp
@@ -1,7 +1,7 @@
-#include "catch.hpp"
-#include "animation/loop.hpp"
-#include "animation/linear_animation.hpp"
-#include "animation/linear_animation_instance.hpp"
+#include <rive/animation/loop.hpp>
+#include <rive/animation/linear_animation.hpp>
+#include <rive/animation/linear_animation_instance.hpp>
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("LinearAnimationInstance oneShot", "[animation]")
diff --git a/test/main_test.cpp b/test/main_test.cpp
index 614ab0f..37eab93 100644
--- a/test/main_test.cpp
+++ b/test/main_test.cpp
@@ -3,4 +3,4 @@
 
 #define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this
                           // in one cpp file
-#include "catch.hpp"
\ No newline at end of file
+#include <catch.hpp>
\ No newline at end of file
diff --git a/test/metrics_path_test.cpp b/test/metrics_path_test.cpp
index 0d04a29..2da655f 100644
--- a/test/metrics_path_test.cpp
+++ b/test/metrics_path_test.cpp
@@ -1,5 +1,5 @@
-#include "catch.hpp"
-#include "shapes/metrics_path.hpp"
+#include <catch.hpp>
+#include <rive/shapes/metrics_path.hpp>
 
 TEST_CASE("path metrics compute correctly", "[bezier]")
 {
diff --git a/test/no_op_renderer.cpp b/test/no_op_renderer.cpp
index 2ad2bc1..51d91c2 100644
--- a/test/no_op_renderer.cpp
+++ b/test/no_op_renderer.cpp
@@ -1,5 +1,5 @@
 #include "no_op_renderer.hpp"
-#include "renderer.hpp"
+#include <rive/renderer.hpp>
 
 namespace rive
 {
diff --git a/test/no_op_renderer.hpp b/test/no_op_renderer.hpp
index d5ec7f1..07622cd 100644
--- a/test/no_op_renderer.hpp
+++ b/test/no_op_renderer.hpp
@@ -1,6 +1,6 @@
 #ifndef _RIVE_NOOP_RENDERER_HPP_
 #define _RIVE_NOOP_RENDERER_HPP_
-#include "renderer.hpp"
+#include <rive/renderer.hpp>
 #include <vector>
 
 namespace rive
diff --git a/test/node_test.cpp b/test/node_test.cpp
index afbf71d..4a7fb28 100644
--- a/test/node_test.cpp
+++ b/test/node_test.cpp
@@ -1,5 +1,5 @@
-#include "catch.hpp"
-#include "node.hpp"
+#include <catch.hpp>
+#include <rive/node.hpp>
 
 TEST_CASE("Node instances", "[core]") { REQUIRE(rive::Node().x() == 0.0f); }
 
diff --git a/test/path_test.cpp b/test/path_test.cpp
index 73dcca0..eeafd13 100644
--- a/test/path_test.cpp
+++ b/test/path_test.cpp
@@ -1,14 +1,14 @@
-#include "artboard.hpp"
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
-#include "math/circle_constant.hpp"
+#include <rive/artboard.hpp>
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/math/circle_constant.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/ellipse.hpp>
+#include <rive/shapes/path_composer.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/ellipse.hpp"
-#include "shapes/path_composer.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("rectangle path builds expected commands", "[path]")
diff --git a/test/reader_test.cpp b/test/reader_test.cpp
index 182db42..e69453d 100644
--- a/test/reader_test.cpp
+++ b/test/reader_test.cpp
@@ -1,5 +1,5 @@
-#include "catch.hpp"
-#include "core/reader.h"
+#include <catch.hpp>
+#include <rive/core/reader.h>
 
 TEST_CASE("uint leb decoder", "[reader]")
 {
diff --git a/test/rive_testing.cpp b/test/rive_testing.cpp
new file mode 100644
index 0000000..0191903
--- /dev/null
+++ b/test/rive_testing.cpp
@@ -0,0 +1,14 @@
+#include "rive_testing.hpp"
+
+bool aboutEqual(const rive::Mat2D& a, const rive::Mat2D& b)
+{
+	const float epsilon = 0.0001f;
+	for (int i = 0; i < 6; i++)
+	{
+		if (std::fabs(a[i] - b[i]) > epsilon)
+		{
+			return false;
+		}
+	}
+	return true;
+}
\ No newline at end of file
diff --git a/test/rive_testing.hpp b/test/rive_testing.hpp
new file mode 100644
index 0000000..0b6d8da
--- /dev/null
+++ b/test/rive_testing.hpp
@@ -0,0 +1,23 @@
+#ifndef _CATCH_RIVE_TESTING_
+#define _CATCH_RIVE_TESTING_
+
+#include <catch.hpp>
+#include <sstream>
+#include <rive/math/mat2d.hpp>
+
+bool aboutEqual(const rive::Mat2D& a, const rive::Mat2D& b);
+
+namespace Catch
+{
+	template <> struct StringMaker<rive::Mat2D>
+	{
+		static std::string convert(rive::Mat2D const& value)
+		{
+			std::ostringstream os;
+			os << value[0] << ", " << value[1] << ", " << value[2] << ", "
+			   << value[3] << ", " << value[4] << ", " << value[5];
+			return os.str();
+		}
+	};
+} // namespace Catch
+#endif
\ No newline at end of file
diff --git a/test/state_machine_test.cpp b/test/state_machine_test.cpp
index 004d0ce..217f4ee 100644
--- a/test/state_machine_test.cpp
+++ b/test/state_machine_test.cpp
@@ -1,17 +1,17 @@
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/animation/state_machine_bool.hpp>
+#include <rive/animation/state_machine_layer.hpp>
+#include <rive/animation/animation_state.hpp>
+#include <rive/animation/entry_state.hpp>
+#include <rive/animation/state_transition.hpp>
+#include <rive/animation/state_machine_instance.hpp>
+#include <rive/animation/state_machine_input_instance.hpp>
+#include <rive/animation/blend_state_1d.hpp>
+#include <rive/animation/blend_animation_1d.hpp>
+#include <rive/animation/blend_state_direct.hpp>
+#include <rive/animation/blend_state_transition.hpp>
 #include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
-#include "animation/state_machine_bool.hpp"
-#include "animation/state_machine_layer.hpp"
-#include "animation/animation_state.hpp"
-#include "animation/entry_state.hpp"
-#include "animation/state_transition.hpp"
-#include "animation/state_machine_instance.hpp"
-#include "animation/state_machine_input_instance.hpp"
-#include "animation/blend_state_1d.hpp"
-#include "animation/blend_animation_1d.hpp"
-#include "animation/blend_state_direct.hpp"
-#include "animation/blend_state_transition.hpp"
 #include <cstdio>
 
 TEST_CASE("file with state machine be read", "[file]")
diff --git a/test/stroke_test.cpp b/test/stroke_test.cpp
index 346d9a9..97627c7 100644
--- a/test/stroke_test.cpp
+++ b/test/stroke_test.cpp
@@ -1,13 +1,13 @@
-#include "catch.hpp"
-#include "core/binary_reader.hpp"
-#include "file.hpp"
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/shapes/rectangle.hpp>
+#include <rive/shapes/shape.hpp>
+#include <rive/shapes/paint/stroke.hpp>
+#include <rive/shapes/paint/solid_color.hpp>
+#include <rive/shapes/paint/color.hpp>
 #include "no_op_renderer.hpp"
-#include "node.hpp"
-#include "shapes/rectangle.hpp"
-#include "shapes/shape.hpp"
-#include "shapes/paint/stroke.hpp"
-#include "shapes/paint/solid_color.hpp"
-#include "shapes/paint/color.hpp"
+#include <catch.hpp>
 #include <cstdio>
 
 TEST_CASE("stroke can be looked up at runtime", "[file]")
diff --git a/test/transform_constraint_test.cpp b/test/transform_constraint_test.cpp
new file mode 100644
index 0000000..3c5fa7a
--- /dev/null
+++ b/test/transform_constraint_test.cpp
@@ -0,0 +1,44 @@
+#include <rive/core/binary_reader.hpp>
+#include <rive/file.hpp>
+#include <rive/node.hpp>
+#include <rive/bones/bone.hpp>
+#include <rive/shapes/shape.hpp>
+#include "no_op_renderer.hpp"
+#include "rive_testing.hpp"
+#include <cstdio>
+
+TEST_CASE("transform constraint updates world transform", "[file]")
+{
+	FILE* fp = fopen("../../test/assets/transform_constraint.riv", "r");
+	REQUIRE(fp != nullptr);
+
+	fseek(fp, 0, SEEK_END);
+	auto length = ftell(fp);
+	fseek(fp, 0, SEEK_SET);
+	uint8_t* bytes = new uint8_t[length];
+	REQUIRE(fread(bytes, 1, length, fp) == length);
+	auto reader = rive::BinaryReader(bytes, length);
+	rive::File* file = nullptr;
+	auto result = rive::File::import(reader, &file);
+
+	REQUIRE(result == rive::ImportResult::success);
+	REQUIRE(file != nullptr);
+	REQUIRE(file->artboard() != nullptr);
+
+	auto artboard = file->artboard();
+
+	REQUIRE(artboard->find<rive::TransformComponent>("Target") != nullptr);
+	auto target = artboard->find<rive::TransformComponent>("Target");
+
+	REQUIRE(artboard->find<rive::TransformComponent>("Rectangle") != nullptr);
+	auto rectangle = artboard->find<rive::TransformComponent>("Rectangle");
+
+	artboard->advance(0.0f);
+
+	// Expect the transform constraint to have placed the shape in the same
+	// exact world transform as the target.
+	REQUIRE(aboutEqual(target->worldTransform(), rectangle->worldTransform()));
+
+	delete file;
+	delete[] bytes;
+}
\ No newline at end of file