Rename event->listener and update defs.
diff --git a/dev/defs/animation/event_bool_change.json b/dev/defs/animation/event_bool_change.json
deleted file mode 100644
index 7a67cd7..0000000
--- a/dev/defs/animation/event_bool_change.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "EventBoolChange",
-  "key": {
-    "int": 117,
-    "string": "event_bool_change"
-  },
-  "extends": "animation/event_input_change.json",
-  "properties": {
-    "value": {
-      "type": "uint",
-      "initialValue": "1",
-      "key": {
-        "int": 228,
-        "string": "value"
-      },
-      "description": "Value to set the input to when the event occurs."
-    }
-  }
-}
\ No newline at end of file
diff --git a/dev/defs/animation/event_number_change.json b/dev/defs/animation/event_number_change.json
deleted file mode 100644
index cc96e0a..0000000
--- a/dev/defs/animation/event_number_change.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "EventNumberChange",
-  "key": {
-    "int": 118,
-    "string": "event_number_change"
-  },
-  "extends": "animation/event_input_change.json",
-  "properties": {
-    "value": {
-      "type": "double",
-      "initialValue": "0",
-      "key": {
-        "int": 229,
-        "string": "value"
-      },
-      "description": "Value to set the input to when the event occurs."
-    }
-  }
-}
\ No newline at end of file
diff --git a/dev/defs/animation/event_trigger_change.json b/dev/defs/animation/event_trigger_change.json
deleted file mode 100644
index 9aa6e0d..0000000
--- a/dev/defs/animation/event_trigger_change.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "EventTriggerChange",
-  "key": {
-    "int": 115,
-    "string": "event_trigger_change"
-  },
-  "extends": "animation/event_input_change.json"
-}
\ No newline at end of file
diff --git a/dev/defs/animation/listener_bool_change.json b/dev/defs/animation/listener_bool_change.json
new file mode 100644
index 0000000..54b5ca0
--- /dev/null
+++ b/dev/defs/animation/listener_bool_change.json
@@ -0,0 +1,19 @@
+{
+  "name": "ListenerBoolChange",
+  "key": {
+    "int": 117,
+    "string": "listener_bool_change"
+  },
+  "extends": "animation/listener_input_change.json",
+  "properties": {
+    "value": {
+      "type": "uint",
+      "initialValue": "1",
+      "key": {
+        "int": 228,
+        "string": "value"
+      },
+      "description": "Value to set the input to when the listener occurs."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/animation/event_input_change.json b/dev/defs/animation/listener_input_change.json
similarity index 79%
rename from dev/defs/animation/event_input_change.json
rename to dev/defs/animation/listener_input_change.json
index 5dc1811..df4cd3b 100644
--- a/dev/defs/animation/event_input_change.json
+++ b/dev/defs/animation/listener_input_change.json
@@ -1,21 +1,21 @@
 {
-  "name": "EventInputChange",
+  "name": "ListenerInputChange",
   "key": {
     "int": 116,
-    "string": "event_input_change"
+    "string": "listener_input_change"
   },
   "abstract": true,
   "properties": {
-    "eventId": {
+    "listenerId": {
       "type": "Id",
       "typeRuntime": "uint",
       "initialValue": "Core.missingId",
       "initialValueRuntime": "0",
       "key": {
         "int": 226,
-        "string": "eventid"
+        "string": "listenerId"
       },
-      "description": "Identifier used to track the StateMachineEvent this result belongs to.",
+      "description": "Identifier used to track the StateMachineListener this result belongs to.",
       "runtime": false
     },
     "inputId": {
diff --git a/dev/defs/animation/listener_number_change.json b/dev/defs/animation/listener_number_change.json
new file mode 100644
index 0000000..f980b3a
--- /dev/null
+++ b/dev/defs/animation/listener_number_change.json
@@ -0,0 +1,19 @@
+{
+  "name": "ListenerNumberChange",
+  "key": {
+    "int": 118,
+    "string": "listener_number_change"
+  },
+  "extends": "animation/listener_input_change.json",
+  "properties": {
+    "value": {
+      "type": "double",
+      "initialValue": "0",
+      "key": {
+        "int": 229,
+        "string": "value"
+      },
+      "description": "Value to set the input to when the listener occurs."
+    }
+  }
+}
\ No newline at end of file
diff --git a/dev/defs/animation/listener_trigger_change.json b/dev/defs/animation/listener_trigger_change.json
new file mode 100644
index 0000000..d3d0759
--- /dev/null
+++ b/dev/defs/animation/listener_trigger_change.json
@@ -0,0 +1,8 @@
+{
+  "name": "ListenerTriggerChange",
+  "key": {
+    "int": 115,
+    "string": "listener_trigger_change"
+  },
+  "extends": "animation/listener_input_change.json"
+}
\ No newline at end of file
diff --git a/dev/defs/animation/nested_state_machine.json b/dev/defs/animation/nested_state_machine.json
index 5b69e0a..1982515 100644
--- a/dev/defs/animation/nested_state_machine.json
+++ b/dev/defs/animation/nested_state_machine.json
@@ -2,7 +2,7 @@
   "name": "NestedStateMachine",
   "key": {
     "int": 95,
-    "string": "nestedstatemachine"
+    "string": "nestedStateMachine"
   },
   "extends": "nested_animation.json",
   "generic": "animation/state_machine.json"
diff --git a/dev/defs/animation/state_machine.json b/dev/defs/animation/state_machine.json
index c28736f..c73a1cc 100644
--- a/dev/defs/animation/state_machine.json
+++ b/dev/defs/animation/state_machine.json
@@ -6,17 +6,6 @@
   },
   "extends": "animation/animation.json",
   "properties": {
-    "editingListValue": {
-      "type": "uint",
-      "initialValue": "0",
-      "key": {
-        "int": 136,
-        "string": "editinglistvalue"
-      },
-      "description": "Backing value for enum representing which list being edited.",
-      "runtime": false,
-      "coop": false
-    },
     "editingLayerId": {
       "type": "Id",
       "initialValue": "Core.missingId",
diff --git a/dev/defs/animation/state_machine_event.json b/dev/defs/animation/state_machine_listener.json
similarity index 68%
rename from dev/defs/animation/state_machine_event.json
rename to dev/defs/animation/state_machine_listener.json
index 64a8ffe..12a6892 100644
--- a/dev/defs/animation/state_machine_event.json
+++ b/dev/defs/animation/state_machine_listener.json
@@ -1,8 +1,8 @@
 {
-  "name": "StateMachineEvent",
+  "name": "StateMachineListener",
   "key": {
     "int": 114,
-    "string": "statemachineevent"
+    "string": "stateMachineListener"
   },
   "extends": "animation/state_machine_component.json",
   "properties": {
@@ -15,16 +15,16 @@
         "int": 224,
         "string": "targetid"
       },
-      "description": "Identifier used to track the object use as a target fo this event."
+      "description": "Identifier used to track the object use as a target fo this listener."
     },
-    "eventTypeValue": {
+    "listenerTypeValue": {
       "type": "uint",
       "initialValue": "0",
       "key": {
         "int": 225,
-        "string": "eventtypevalue"
+        "string": "listenertypevalue"
       },
-      "description": "Event type (hover, click, etc)."
+      "description": "Listener type (hover, click, etc)."
     }
   }
 }
\ No newline at end of file
diff --git a/include/rive/animation/event_bool_change.hpp b/include/rive/animation/event_bool_change.hpp
deleted file mode 100644
index 61f79a2..0000000
--- a/include/rive/animation/event_bool_change.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _RIVE_EVENT_BOOL_CHANGE_HPP_
-#define _RIVE_EVENT_BOOL_CHANGE_HPP_
-#include "rive/generated/animation/event_bool_change_base.hpp"
-
-namespace rive {
-    class EventBoolChange : public EventBoolChangeBase {
-    public:
-        bool validateInputType(const StateMachineInput* input) const override;
-        void perform(StateMachineInstance* stateMachineInstance) const override;
-    };
-} // namespace rive
-
-#endif
\ No newline at end of file
diff --git a/include/rive/animation/event_number_change.hpp b/include/rive/animation/event_number_change.hpp
deleted file mode 100644
index 6e123d0..0000000
--- a/include/rive/animation/event_number_change.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _RIVE_EVENT_NUMBER_CHANGE_HPP_
-#define _RIVE_EVENT_NUMBER_CHANGE_HPP_
-#include "rive/generated/animation/event_number_change_base.hpp"
-
-namespace rive {
-    class EventNumberChange : public EventNumberChangeBase {
-    public:
-        bool validateInputType(const StateMachineInput* input) const override;
-        void perform(StateMachineInstance* stateMachineInstance) const override;
-    };
-} // namespace rive
-
-#endif
\ No newline at end of file
diff --git a/include/rive/animation/event_trigger_change.hpp b/include/rive/animation/event_trigger_change.hpp
deleted file mode 100644
index 20200b5..0000000
--- a/include/rive/animation/event_trigger_change.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _RIVE_EVENT_TRIGGER_CHANGE_HPP_
-#define _RIVE_EVENT_TRIGGER_CHANGE_HPP_
-#include "rive/generated/animation/event_trigger_change_base.hpp"
-
-namespace rive {
-    class EventTriggerChange : public EventTriggerChangeBase {
-    public:
-        bool validateInputType(const StateMachineInput* input) const override;
-        void perform(StateMachineInstance* stateMachineInstance) const override;
-    };
-} // namespace rive
-
-#endif
\ No newline at end of file
diff --git a/include/rive/animation/listener_bool_change.hpp b/include/rive/animation/listener_bool_change.hpp
new file mode 100644
index 0000000..2bc6efb
--- /dev/null
+++ b/include/rive/animation/listener_bool_change.hpp
@@ -0,0 +1,13 @@
+#ifndef _RIVE_LISTENER_BOOL_CHANGE_HPP_
+#define _RIVE_LISTENER_BOOL_CHANGE_HPP_
+#include "rive/generated/animation/listener_bool_change_base.hpp"
+
+namespace rive {
+    class ListenerBoolChange : public ListenerBoolChangeBase {
+    public:
+        bool validateInputType(const StateMachineInput* input) const override;
+        void perform(StateMachineInstance* stateMachineInstance) const override;
+    };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/animation/event_input_change.hpp b/include/rive/animation/listener_input_change.hpp
similarity index 63%
rename from include/rive/animation/event_input_change.hpp
rename to include/rive/animation/listener_input_change.hpp
index b3ae0ce..c7ccc04 100644
--- a/include/rive/animation/event_input_change.hpp
+++ b/include/rive/animation/listener_input_change.hpp
@@ -1,11 +1,11 @@
-#ifndef _RIVE_EVENT_INPUT_CHANGE_HPP_
-#define _RIVE_EVENT_INPUT_CHANGE_HPP_
-#include "rive/generated/animation/event_input_change_base.hpp"
+#ifndef _RIVE_LISTENER_INPUT_CHANGE_HPP_
+#define _RIVE_LISTENER_INPUT_CHANGE_HPP_
+#include "rive/generated/animation/listener_input_change_base.hpp"
 
 namespace rive {
     class StateMachineInstance;
     class StateMachineInput;
-    class EventInputChange : public EventInputChangeBase {
+    class ListenerInputChange : public ListenerInputChangeBase {
     public:
         StatusCode import(ImportStack& importStack) override;
         virtual void perform(StateMachineInstance* stateMachineInstance) const = 0;
diff --git a/include/rive/animation/listener_number_change.hpp b/include/rive/animation/listener_number_change.hpp
new file mode 100644
index 0000000..a20c911
--- /dev/null
+++ b/include/rive/animation/listener_number_change.hpp
@@ -0,0 +1,13 @@
+#ifndef _RIVE_LISTENER_NUMBER_CHANGE_HPP_
+#define _RIVE_LISTENER_NUMBER_CHANGE_HPP_
+#include "rive/generated/animation/listener_number_change_base.hpp"
+
+namespace rive {
+    class ListenerNumberChange : public ListenerNumberChangeBase {
+    public:
+        bool validateInputType(const StateMachineInput* input) const override;
+        void perform(StateMachineInstance* stateMachineInstance) const override;
+    };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/animation/listener_trigger_change.hpp b/include/rive/animation/listener_trigger_change.hpp
new file mode 100644
index 0000000..ab89e1f
--- /dev/null
+++ b/include/rive/animation/listener_trigger_change.hpp
@@ -0,0 +1,13 @@
+#ifndef _RIVE_LISTENER_TRIGGER_CHANGE_HPP_
+#define _RIVE_LISTENER_TRIGGER_CHANGE_HPP_
+#include "rive/generated/animation/listener_trigger_change_base.hpp"
+
+namespace rive {
+    class ListenerTriggerChange : public ListenerTriggerChangeBase {
+    public:
+        bool validateInputType(const StateMachineInput* input) const override;
+        void perform(StateMachineInstance* stateMachineInstance) const override;
+    };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/animation/state_machine.hpp b/include/rive/animation/state_machine.hpp
index c711878..ca6b5eb 100644
--- a/include/rive/animation/state_machine.hpp
+++ b/include/rive/animation/state_machine.hpp
@@ -7,7 +7,7 @@
 namespace rive {
     class StateMachineLayer;
     class StateMachineInput;
-    class StateMachineEvent;
+    class StateMachineListener;
     class StateMachineImporter;
     class StateMachine : public StateMachineBase {
         friend class StateMachineImporter;
@@ -15,11 +15,11 @@
     private:
         std::vector<std::unique_ptr<StateMachineLayer>> m_Layers;
         std::vector<std::unique_ptr<StateMachineInput>> m_Inputs;
-        std::vector<std::unique_ptr<StateMachineEvent>> m_Events;
+        std::vector<std::unique_ptr<StateMachineListener>> m_Listeners;
 
         void addLayer(std::unique_ptr<StateMachineLayer>);
         void addInput(std::unique_ptr<StateMachineInput>);
-        void addEvent(std::unique_ptr<StateMachineEvent>);
+        void addListener(std::unique_ptr<StateMachineListener>);
 
     public:
         StateMachine();
@@ -29,13 +29,13 @@
 
         size_t layerCount() const { return m_Layers.size(); }
         size_t inputCount() const { return m_Inputs.size(); }
-        size_t eventCount() const { return m_Events.size(); }
+        size_t listenerCount() const { return m_Listeners.size(); }
 
         const StateMachineInput* input(std::string name) const;
         const StateMachineInput* input(size_t index) const;
         const StateMachineLayer* layer(std::string name) const;
         const StateMachineLayer* layer(size_t index) const;
-        const StateMachineEvent* event(size_t index) const;
+        const StateMachineListener* listener(size_t index) const;
 
         StatusCode onAddedDirty(CoreContext* context) override;
         StatusCode onAddedClean(CoreContext* context) override;
diff --git a/include/rive/animation/state_machine_event.hpp b/include/rive/animation/state_machine_event.hpp
deleted file mode 100644
index ea6cb5a..0000000
--- a/include/rive/animation/state_machine_event.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _RIVE_STATE_MACHINE_EVENT_HPP_
-#define _RIVE_STATE_MACHINE_EVENT_HPP_
-#include "rive/generated/animation/state_machine_event_base.hpp"
-#include "rive/event_type.hpp"
-
-namespace rive {
-    class Shape;
-    class StateMachineEventImporter;
-    class EventInputChange;
-    class StateMachineInstance;
-    class StateMachineEvent : public StateMachineEventBase {
-        friend class StateMachineEventImporter;
-
-    private:
-        std::vector<uint32_t> m_HitShapesIds;
-        std::vector<EventInputChange*> m_InputChanges;
-        void addInputChange(EventInputChange* inputChange);
-
-    public:
-        EventType eventType() const { return (EventType)eventTypeValue(); }
-        size_t inputChangeCount() const { return m_InputChanges.size(); }
-        const EventInputChange* inputChange(size_t index) const;
-        StatusCode import(ImportStack& importStack) override;
-        StatusCode onAddedClean(CoreContext* context) override;
-
-        const std::vector<uint32_t>& hitShapeIds() const { return m_HitShapesIds; }
-        void performChanges(StateMachineInstance* stateMachineInstance) const;
-    };
-} // namespace rive
-
-#endif
\ No newline at end of file
diff --git a/include/rive/animation/state_machine_instance.hpp b/include/rive/animation/state_machine_instance.hpp
index 5b05aa6..fa8fe6f 100644
--- a/include/rive/animation/state_machine_instance.hpp
+++ b/include/rive/animation/state_machine_instance.hpp
@@ -5,7 +5,7 @@
 #include <stddef.h>
 #include <vector>
 #include "rive/animation/linear_animation_instance.hpp"
-#include "rive/event_type.hpp"
+#include "rive/listener_type.hpp"
 #include "rive/scene.hpp"
 
 namespace rive {
@@ -37,8 +37,9 @@
         std::vector<std::unique_ptr<HitShape>> m_HitShapes;
         std::vector<NestedArtboard*> m_HitNestedArtboards;
 
-        /// Provide a hitEvent if you want to process a down or an up for the pointer position too.
-        void processEvent(Vec2D position, EventType hitEvent = EventType::updateHover);
+        /// Provide a hitListener if you want to process a down or an up for the pointer position
+        /// too.
+        void updateListeners(Vec2D position, ListenerType hitListener = ListenerType::updateHover);
 
         template <typename SMType, typename InstType>
         InstType* getNamedInput(const std::string& name) const;
diff --git a/include/rive/animation/state_machine_listener.hpp b/include/rive/animation/state_machine_listener.hpp
new file mode 100644
index 0000000..14bd60b
--- /dev/null
+++ b/include/rive/animation/state_machine_listener.hpp
@@ -0,0 +1,31 @@
+#ifndef _RIVE_STATE_MACHINE_LISTENER_HPP_
+#define _RIVE_STATE_MACHINE_LISTENER_HPP_
+#include "rive/generated/animation/state_machine_listener_base.hpp"
+#include "rive/listener_type.hpp"
+
+namespace rive {
+    class Shape;
+    class StateMachineListenerImporter;
+    class ListenerInputChange;
+    class StateMachineInstance;
+    class StateMachineListener : public StateMachineListenerBase {
+        friend class StateMachineListenerImporter;
+
+    private:
+        std::vector<uint32_t> m_HitShapesIds;
+        std::vector<ListenerInputChange*> m_InputChanges;
+        void addInputChange(ListenerInputChange* inputChange);
+
+    public:
+        ListenerType listenerType() const { return (ListenerType)listenerTypeValue(); }
+        size_t inputChangeCount() const { return m_InputChanges.size(); }
+        const ListenerInputChange* inputChange(size_t index) const;
+        StatusCode import(ImportStack& importStack) override;
+        StatusCode onAddedClean(CoreContext* context) override;
+
+        const std::vector<uint32_t>& hitShapeIds() const { return m_HitShapesIds; }
+        void performChanges(StateMachineInstance* stateMachineInstance) const;
+    };
+} // namespace rive
+
+#endif
\ No newline at end of file
diff --git a/include/rive/event_type.hpp b/include/rive/event_type.hpp
deleted file mode 100644
index deb1cea..0000000
--- a/include/rive/event_type.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _RIVE_EVENT_TYPE_HPP_
-#define _RIVE_EVENT_TYPE_HPP_
-namespace rive {
-    enum class EventType : int {
-        updateHover = -1,
-        enter = 0,
-        exit = 1,
-        down = 2,
-        up = 3,
-    };
-}
-#endif
\ No newline at end of file
diff --git a/include/rive/generated/animation/event_bool_change_base.hpp b/include/rive/generated/animation/listener_bool_change_base.hpp
similarity index 71%
rename from include/rive/generated/animation/event_bool_change_base.hpp
rename to include/rive/generated/animation/listener_bool_change_base.hpp
index e0914b7..e4e667b 100644
--- a/include/rive/generated/animation/event_bool_change_base.hpp
+++ b/include/rive/generated/animation/listener_bool_change_base.hpp
@@ -1,11 +1,11 @@
-#ifndef _RIVE_EVENT_BOOL_CHANGE_BASE_HPP_
-#define _RIVE_EVENT_BOOL_CHANGE_BASE_HPP_
-#include "rive/animation/event_input_change.hpp"
+#ifndef _RIVE_LISTENER_BOOL_CHANGE_BASE_HPP_
+#define _RIVE_LISTENER_BOOL_CHANGE_BASE_HPP_
+#include "rive/animation/listener_input_change.hpp"
 #include "rive/core/field_types/core_uint_type.hpp"
 namespace rive {
-    class EventBoolChangeBase : public EventInputChange {
+    class ListenerBoolChangeBase : public ListenerInputChange {
     protected:
-        typedef EventInputChange Super;
+        typedef ListenerInputChange Super;
 
     public:
         static const uint16_t typeKey = 117;
@@ -14,8 +14,8 @@
         /// at runtime.
         bool isTypeOf(uint16_t typeKey) const override {
             switch (typeKey) {
-                case EventBoolChangeBase::typeKey:
-                case EventInputChangeBase::typeKey:
+                case ListenerBoolChangeBase::typeKey:
+                case ListenerInputChangeBase::typeKey:
                     return true;
                 default:
                     return false;
@@ -40,9 +40,9 @@
         }
 
         Core* clone() const override;
-        void copy(const EventBoolChangeBase& object) {
+        void copy(const ListenerBoolChangeBase& object) {
             m_Value = object.m_Value;
-            EventInputChange::copy(object);
+            ListenerInputChange::copy(object);
         }
 
         bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
@@ -51,7 +51,7 @@
                     m_Value = CoreUintType::deserialize(reader);
                     return true;
             }
-            return EventInputChange::deserialize(propertyKey, reader);
+            return ListenerInputChange::deserialize(propertyKey, reader);
         }
 
     protected:
diff --git a/include/rive/generated/animation/event_input_change_base.hpp b/include/rive/generated/animation/listener_input_change_base.hpp
similarity index 82%
rename from include/rive/generated/animation/event_input_change_base.hpp
rename to include/rive/generated/animation/listener_input_change_base.hpp
index 7212efb..f4dca8a 100644
--- a/include/rive/generated/animation/event_input_change_base.hpp
+++ b/include/rive/generated/animation/listener_input_change_base.hpp
@@ -1,9 +1,9 @@
-#ifndef _RIVE_EVENT_INPUT_CHANGE_BASE_HPP_
-#define _RIVE_EVENT_INPUT_CHANGE_BASE_HPP_
+#ifndef _RIVE_LISTENER_INPUT_CHANGE_BASE_HPP_
+#define _RIVE_LISTENER_INPUT_CHANGE_BASE_HPP_
 #include "rive/core.hpp"
 #include "rive/core/field_types/core_uint_type.hpp"
 namespace rive {
-    class EventInputChangeBase : public Core {
+    class ListenerInputChangeBase : public Core {
     protected:
         typedef Core Super;
 
@@ -14,7 +14,7 @@
         /// at runtime.
         bool isTypeOf(uint16_t typeKey) const override {
             switch (typeKey) {
-                case EventInputChangeBase::typeKey:
+                case ListenerInputChangeBase::typeKey:
                     return true;
                 default:
                     return false;
@@ -38,7 +38,7 @@
             inputIdChanged();
         }
 
-        void copy(const EventInputChangeBase& object) { m_InputId = object.m_InputId; }
+        void copy(const ListenerInputChangeBase& object) { m_InputId = object.m_InputId; }
 
         bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
             switch (propertyKey) {
diff --git a/include/rive/generated/animation/event_number_change_base.hpp b/include/rive/generated/animation/listener_number_change_base.hpp
similarity index 70%
rename from include/rive/generated/animation/event_number_change_base.hpp
rename to include/rive/generated/animation/listener_number_change_base.hpp
index 4c647ed..54a7209 100644
--- a/include/rive/generated/animation/event_number_change_base.hpp
+++ b/include/rive/generated/animation/listener_number_change_base.hpp
@@ -1,11 +1,11 @@
-#ifndef _RIVE_EVENT_NUMBER_CHANGE_BASE_HPP_
-#define _RIVE_EVENT_NUMBER_CHANGE_BASE_HPP_
-#include "rive/animation/event_input_change.hpp"
+#ifndef _RIVE_LISTENER_NUMBER_CHANGE_BASE_HPP_
+#define _RIVE_LISTENER_NUMBER_CHANGE_BASE_HPP_
+#include "rive/animation/listener_input_change.hpp"
 #include "rive/core/field_types/core_double_type.hpp"
 namespace rive {
-    class EventNumberChangeBase : public EventInputChange {
+    class ListenerNumberChangeBase : public ListenerInputChange {
     protected:
-        typedef EventInputChange Super;
+        typedef ListenerInputChange Super;
 
     public:
         static const uint16_t typeKey = 118;
@@ -14,8 +14,8 @@
         /// at runtime.
         bool isTypeOf(uint16_t typeKey) const override {
             switch (typeKey) {
-                case EventNumberChangeBase::typeKey:
-                case EventInputChangeBase::typeKey:
+                case ListenerNumberChangeBase::typeKey:
+                case ListenerInputChangeBase::typeKey:
                     return true;
                 default:
                     return false;
@@ -40,9 +40,9 @@
         }
 
         Core* clone() const override;
-        void copy(const EventNumberChangeBase& object) {
+        void copy(const ListenerNumberChangeBase& object) {
             m_Value = object.m_Value;
-            EventInputChange::copy(object);
+            ListenerInputChange::copy(object);
         }
 
         bool deserialize(uint16_t propertyKey, BinaryReader& reader) override {
@@ -51,7 +51,7 @@
                     m_Value = CoreDoubleType::deserialize(reader);
                     return true;
             }
-            return EventInputChange::deserialize(propertyKey, reader);
+            return ListenerInputChange::deserialize(propertyKey, reader);
         }
 
     protected:
diff --git a/include/rive/generated/animation/event_trigger_change_base.hpp b/include/rive/generated/animation/listener_trigger_change_base.hpp
similarity index 60%
rename from include/rive/generated/animation/event_trigger_change_base.hpp
rename to include/rive/generated/animation/listener_trigger_change_base.hpp
index 7232825..14985b3 100644
--- a/include/rive/generated/animation/event_trigger_change_base.hpp
+++ b/include/rive/generated/animation/listener_trigger_change_base.hpp
@@ -1,10 +1,10 @@
-#ifndef _RIVE_EVENT_TRIGGER_CHANGE_BASE_HPP_
-#define _RIVE_EVENT_TRIGGER_CHANGE_BASE_HPP_
-#include "rive/animation/event_input_change.hpp"
+#ifndef _RIVE_LISTENER_TRIGGER_CHANGE_BASE_HPP_
+#define _RIVE_LISTENER_TRIGGER_CHANGE_BASE_HPP_
+#include "rive/animation/listener_input_change.hpp"
 namespace rive {
-    class EventTriggerChangeBase : public EventInputChange {
+    class ListenerTriggerChangeBase : public ListenerInputChange {
     protected:
-        typedef EventInputChange Super;
+        typedef ListenerInputChange Super;
 
     public:
         static const uint16_t typeKey = 115;
@@ -13,8 +13,8 @@
         /// at runtime.
         bool isTypeOf(uint16_t typeKey) const override {
             switch (typeKey) {
-                case EventTriggerChangeBase::typeKey:
-                case EventInputChangeBase::typeKey:
+                case ListenerTriggerChangeBase::typeKey:
+                case ListenerInputChangeBase::typeKey:
                     return true;
                 default:
                     return false;
diff --git a/include/rive/generated/animation/state_machine_event_base.hpp b/include/rive/generated/animation/state_machine_listener_base.hpp
similarity index 65%
rename from include/rive/generated/animation/state_machine_event_base.hpp
rename to include/rive/generated/animation/state_machine_listener_base.hpp
index a67e39c..6811b29 100644
--- a/include/rive/generated/animation/state_machine_event_base.hpp
+++ b/include/rive/generated/animation/state_machine_listener_base.hpp
@@ -1,9 +1,9 @@
-#ifndef _RIVE_STATE_MACHINE_EVENT_BASE_HPP_
-#define _RIVE_STATE_MACHINE_EVENT_BASE_HPP_
+#ifndef _RIVE_STATE_MACHINE_LISTENER_BASE_HPP_
+#define _RIVE_STATE_MACHINE_LISTENER_BASE_HPP_
 #include "rive/animation/state_machine_component.hpp"
 #include "rive/core/field_types/core_uint_type.hpp"
 namespace rive {
-    class StateMachineEventBase : public StateMachineComponent {
+    class StateMachineListenerBase : public StateMachineComponent {
     protected:
         typedef StateMachineComponent Super;
 
@@ -14,7 +14,7 @@
         /// at runtime.
         bool isTypeOf(uint16_t typeKey) const override {
             switch (typeKey) {
-                case StateMachineEventBase::typeKey:
+                case StateMachineListenerBase::typeKey:
                 case StateMachineComponentBase::typeKey:
                     return true;
                 default:
@@ -25,11 +25,11 @@
         uint16_t coreType() const override { return typeKey; }
 
         static const uint16_t targetIdPropertyKey = 224;
-        static const uint16_t eventTypeValuePropertyKey = 225;
+        static const uint16_t listenerTypeValuePropertyKey = 225;
 
     private:
         uint32_t m_TargetId = 0;
-        uint32_t m_EventTypeValue = 0;
+        uint32_t m_ListenerTypeValue = 0;
 
     public:
         inline uint32_t targetId() const { return m_TargetId; }
@@ -41,19 +41,19 @@
             targetIdChanged();
         }
 
-        inline uint32_t eventTypeValue() const { return m_EventTypeValue; }
-        void eventTypeValue(uint32_t value) {
-            if (m_EventTypeValue == value) {
+        inline uint32_t listenerTypeValue() const { return m_ListenerTypeValue; }
+        void listenerTypeValue(uint32_t value) {
+            if (m_ListenerTypeValue == value) {
                 return;
             }
-            m_EventTypeValue = value;
-            eventTypeValueChanged();
+            m_ListenerTypeValue = value;
+            listenerTypeValueChanged();
         }
 
         Core* clone() const override;
-        void copy(const StateMachineEventBase& object) {
+        void copy(const StateMachineListenerBase& object) {
             m_TargetId = object.m_TargetId;
-            m_EventTypeValue = object.m_EventTypeValue;
+            m_ListenerTypeValue = object.m_ListenerTypeValue;
             StateMachineComponent::copy(object);
         }
 
@@ -62,8 +62,8 @@
                 case targetIdPropertyKey:
                     m_TargetId = CoreUintType::deserialize(reader);
                     return true;
-                case eventTypeValuePropertyKey:
-                    m_EventTypeValue = CoreUintType::deserialize(reader);
+                case listenerTypeValuePropertyKey:
+                    m_ListenerTypeValue = CoreUintType::deserialize(reader);
                     return true;
             }
             return StateMachineComponent::deserialize(propertyKey, reader);
@@ -71,7 +71,7 @@
 
     protected:
         virtual void targetIdChanged() {}
-        virtual void eventTypeValueChanged() {}
+        virtual void listenerTypeValueChanged() {}
     };
 } // namespace rive
 
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp
index bf06626..ed1a0f7 100644
--- a/include/rive/generated/core_registry.hpp
+++ b/include/rive/generated/core_registry.hpp
@@ -12,10 +12,6 @@
 #include "rive/animation/blend_state_transition.hpp"
 #include "rive/animation/cubic_interpolator.hpp"
 #include "rive/animation/entry_state.hpp"
-#include "rive/animation/event_bool_change.hpp"
-#include "rive/animation/event_input_change.hpp"
-#include "rive/animation/event_number_change.hpp"
-#include "rive/animation/event_trigger_change.hpp"
 #include "rive/animation/exit_state.hpp"
 #include "rive/animation/keyed_object.hpp"
 #include "rive/animation/keyed_property.hpp"
@@ -26,6 +22,10 @@
 #include "rive/animation/keyframe_id.hpp"
 #include "rive/animation/layer_state.hpp"
 #include "rive/animation/linear_animation.hpp"
+#include "rive/animation/listener_bool_change.hpp"
+#include "rive/animation/listener_input_change.hpp"
+#include "rive/animation/listener_number_change.hpp"
+#include "rive/animation/listener_trigger_change.hpp"
 #include "rive/animation/nested_linear_animation.hpp"
 #include "rive/animation/nested_remap_animation.hpp"
 #include "rive/animation/nested_simple_animation.hpp"
@@ -33,10 +33,10 @@
 #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_event.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_listener.hpp"
 #include "rive/animation/state_machine_number.hpp"
 #include "rive/animation/state_machine_trigger.hpp"
 #include "rive/animation/state_transition.hpp"
@@ -133,14 +133,10 @@
                     return new Node();
                 case NestedArtboardBase::typeKey:
                     return new NestedArtboard();
-                case EventNumberChangeBase::typeKey:
-                    return new EventNumberChange();
                 case NestedSimpleAnimationBase::typeKey:
                     return new NestedSimpleAnimation();
                 case AnimationStateBase::typeKey:
                     return new AnimationState();
-                case StateMachineEventBase::typeKey:
-                    return new StateMachineEvent();
                 case KeyedObjectBase::typeKey:
                     return new KeyedObject();
                 case BlendAnimationDirectBase::typeKey:
@@ -151,22 +147,24 @@
                     return new TransitionTriggerCondition();
                 case KeyedPropertyBase::typeKey:
                     return new KeyedProperty();
+                case StateMachineListenerBase::typeKey:
+                    return new StateMachineListener();
                 case KeyFrameIdBase::typeKey:
                     return new KeyFrameId();
                 case KeyFrameBoolBase::typeKey:
                     return new KeyFrameBool();
+                case ListenerBoolChangeBase::typeKey:
+                    return new ListenerBoolChange();
                 case TransitionNumberConditionBase::typeKey:
                     return new TransitionNumberCondition();
-                case EventBoolChangeBase::typeKey:
-                    return new EventBoolChange();
                 case AnyStateBase::typeKey:
                     return new AnyState();
-                case EventTriggerChangeBase::typeKey:
-                    return new EventTriggerChange();
                 case StateMachineLayerBase::typeKey:
                     return new StateMachineLayer();
                 case AnimationBase::typeKey:
                     return new Animation();
+                case ListenerNumberChangeBase::typeKey:
+                    return new ListenerNumberChange();
                 case CubicInterpolatorBase::typeKey:
                     return new CubicInterpolator();
                 case StateTransitionBase::typeKey:
@@ -183,6 +181,8 @@
                     return new LinearAnimation();
                 case StateMachineTriggerBase::typeKey:
                     return new StateMachineTrigger();
+                case ListenerTriggerChangeBase::typeKey:
+                    return new ListenerTriggerChange();
                 case BlendStateDirectBase::typeKey:
                     return new BlendStateDirect();
                 case NestedStateMachineBase::typeKey:
@@ -331,18 +331,12 @@
                 case NestedAnimationBase::animationIdPropertyKey:
                     object->as<NestedAnimationBase>()->animationId(value);
                     break;
-                case EventInputChangeBase::inputIdPropertyKey:
-                    object->as<EventInputChangeBase>()->inputId(value);
+                case ListenerInputChangeBase::inputIdPropertyKey:
+                    object->as<ListenerInputChangeBase>()->inputId(value);
                     break;
                 case AnimationStateBase::animationIdPropertyKey:
                     object->as<AnimationStateBase>()->animationId(value);
                     break;
-                case StateMachineEventBase::targetIdPropertyKey:
-                    object->as<StateMachineEventBase>()->targetId(value);
-                    break;
-                case StateMachineEventBase::eventTypeValuePropertyKey:
-                    object->as<StateMachineEventBase>()->eventTypeValue(value);
-                    break;
                 case KeyedObjectBase::objectIdPropertyKey:
                     object->as<KeyedObjectBase>()->objectId(value);
                     break;
@@ -358,6 +352,12 @@
                 case KeyedPropertyBase::propertyKeyPropertyKey:
                     object->as<KeyedPropertyBase>()->propertyKey(value);
                     break;
+                case StateMachineListenerBase::targetIdPropertyKey:
+                    object->as<StateMachineListenerBase>()->targetId(value);
+                    break;
+                case StateMachineListenerBase::listenerTypeValuePropertyKey:
+                    object->as<StateMachineListenerBase>()->listenerTypeValue(value);
+                    break;
                 case KeyFrameBase::framePropertyKey:
                     object->as<KeyFrameBase>()->frame(value);
                     break;
@@ -370,12 +370,12 @@
                 case KeyFrameIdBase::valuePropertyKey:
                     object->as<KeyFrameIdBase>()->value(value);
                     break;
+                case ListenerBoolChangeBase::valuePropertyKey:
+                    object->as<ListenerBoolChangeBase>()->value(value);
+                    break;
                 case TransitionValueConditionBase::opValuePropertyKey:
                     object->as<TransitionValueConditionBase>()->opValue(value);
                     break;
-                case EventBoolChangeBase::valuePropertyKey:
-                    object->as<EventBoolChangeBase>()->value(value);
-                    break;
                 case StateTransitionBase::stateToIdPropertyKey:
                     object->as<StateTransitionBase>()->stateToId(value);
                     break;
@@ -512,9 +512,6 @@
                 case NodeBase::yPropertyKey:
                     object->as<NodeBase>()->y(value);
                     break;
-                case EventNumberChangeBase::valuePropertyKey:
-                    object->as<EventNumberChangeBase>()->value(value);
-                    break;
                 case NestedLinearAnimationBase::mixPropertyKey:
                     object->as<NestedLinearAnimationBase>()->mix(value);
                     break;
@@ -527,6 +524,9 @@
                 case TransitionNumberConditionBase::valuePropertyKey:
                     object->as<TransitionNumberConditionBase>()->value(value);
                     break;
+                case ListenerNumberChangeBase::valuePropertyKey:
+                    object->as<ListenerNumberChangeBase>()->value(value);
+                    break;
                 case CubicInterpolatorBase::x1PropertyKey:
                     object->as<CubicInterpolatorBase>()->x1(value);
                     break;
@@ -836,14 +836,10 @@
                     return object->as<NestedArtboardBase>()->artboardId();
                 case NestedAnimationBase::animationIdPropertyKey:
                     return object->as<NestedAnimationBase>()->animationId();
-                case EventInputChangeBase::inputIdPropertyKey:
-                    return object->as<EventInputChangeBase>()->inputId();
+                case ListenerInputChangeBase::inputIdPropertyKey:
+                    return object->as<ListenerInputChangeBase>()->inputId();
                 case AnimationStateBase::animationIdPropertyKey:
                     return object->as<AnimationStateBase>()->animationId();
-                case StateMachineEventBase::targetIdPropertyKey:
-                    return object->as<StateMachineEventBase>()->targetId();
-                case StateMachineEventBase::eventTypeValuePropertyKey:
-                    return object->as<StateMachineEventBase>()->eventTypeValue();
                 case KeyedObjectBase::objectIdPropertyKey:
                     return object->as<KeyedObjectBase>()->objectId();
                 case BlendAnimationBase::animationIdPropertyKey:
@@ -854,6 +850,10 @@
                     return object->as<TransitionConditionBase>()->inputId();
                 case KeyedPropertyBase::propertyKeyPropertyKey:
                     return object->as<KeyedPropertyBase>()->propertyKey();
+                case StateMachineListenerBase::targetIdPropertyKey:
+                    return object->as<StateMachineListenerBase>()->targetId();
+                case StateMachineListenerBase::listenerTypeValuePropertyKey:
+                    return object->as<StateMachineListenerBase>()->listenerTypeValue();
                 case KeyFrameBase::framePropertyKey:
                     return object->as<KeyFrameBase>()->frame();
                 case KeyFrameBase::interpolationTypePropertyKey:
@@ -862,10 +862,10 @@
                     return object->as<KeyFrameBase>()->interpolatorId();
                 case KeyFrameIdBase::valuePropertyKey:
                     return object->as<KeyFrameIdBase>()->value();
+                case ListenerBoolChangeBase::valuePropertyKey:
+                    return object->as<ListenerBoolChangeBase>()->value();
                 case TransitionValueConditionBase::opValuePropertyKey:
                     return object->as<TransitionValueConditionBase>()->opValue();
-                case EventBoolChangeBase::valuePropertyKey:
-                    return object->as<EventBoolChangeBase>()->value();
                 case StateTransitionBase::stateToIdPropertyKey:
                     return object->as<StateTransitionBase>()->stateToId();
                 case StateTransitionBase::flagsPropertyKey:
@@ -959,8 +959,6 @@
                     return object->as<NodeBase>()->x();
                 case NodeBase::yPropertyKey:
                     return object->as<NodeBase>()->y();
-                case EventNumberChangeBase::valuePropertyKey:
-                    return object->as<EventNumberChangeBase>()->value();
                 case NestedLinearAnimationBase::mixPropertyKey:
                     return object->as<NestedLinearAnimationBase>()->mix();
                 case NestedSimpleAnimationBase::speedPropertyKey:
@@ -969,6 +967,8 @@
                     return object->as<StateMachineNumberBase>()->value();
                 case TransitionNumberConditionBase::valuePropertyKey:
                     return object->as<TransitionNumberConditionBase>()->value();
+                case ListenerNumberChangeBase::valuePropertyKey:
+                    return object->as<ListenerNumberChangeBase>()->value();
                 case CubicInterpolatorBase::x1PropertyKey:
                     return object->as<CubicInterpolatorBase>()->x1();
                 case CubicInterpolatorBase::y1PropertyKey:
@@ -1174,21 +1174,21 @@
                 case DrawableBase::drawableFlagsPropertyKey:
                 case NestedArtboardBase::artboardIdPropertyKey:
                 case NestedAnimationBase::animationIdPropertyKey:
-                case EventInputChangeBase::inputIdPropertyKey:
+                case ListenerInputChangeBase::inputIdPropertyKey:
                 case AnimationStateBase::animationIdPropertyKey:
-                case StateMachineEventBase::targetIdPropertyKey:
-                case StateMachineEventBase::eventTypeValuePropertyKey:
                 case KeyedObjectBase::objectIdPropertyKey:
                 case BlendAnimationBase::animationIdPropertyKey:
                 case BlendAnimationDirectBase::inputIdPropertyKey:
                 case TransitionConditionBase::inputIdPropertyKey:
                 case KeyedPropertyBase::propertyKeyPropertyKey:
+                case StateMachineListenerBase::targetIdPropertyKey:
+                case StateMachineListenerBase::listenerTypeValuePropertyKey:
                 case KeyFrameBase::framePropertyKey:
                 case KeyFrameBase::interpolationTypePropertyKey:
                 case KeyFrameBase::interpolatorIdPropertyKey:
                 case KeyFrameIdBase::valuePropertyKey:
+                case ListenerBoolChangeBase::valuePropertyKey:
                 case TransitionValueConditionBase::opValuePropertyKey:
-                case EventBoolChangeBase::valuePropertyKey:
                 case StateTransitionBase::stateToIdPropertyKey:
                 case StateTransitionBase::flagsPropertyKey:
                 case StateTransitionBase::durationPropertyKey:
@@ -1234,11 +1234,11 @@
                 case TransformComponentBase::scaleYPropertyKey:
                 case NodeBase::xPropertyKey:
                 case NodeBase::yPropertyKey:
-                case EventNumberChangeBase::valuePropertyKey:
                 case NestedLinearAnimationBase::mixPropertyKey:
                 case NestedSimpleAnimationBase::speedPropertyKey:
                 case StateMachineNumberBase::valuePropertyKey:
                 case TransitionNumberConditionBase::valuePropertyKey:
+                case ListenerNumberChangeBase::valuePropertyKey:
                 case CubicInterpolatorBase::x1PropertyKey:
                 case CubicInterpolatorBase::y1PropertyKey:
                 case CubicInterpolatorBase::x2PropertyKey:
diff --git a/include/rive/importers/state_machine_event_importer.hpp b/include/rive/importers/state_machine_event_importer.hpp
deleted file mode 100644
index 64ac249..0000000
--- a/include/rive/importers/state_machine_event_importer.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _RIVE_STATE_MACHINE_EVENT_IMPORTER_HPP_
-#define _RIVE_STATE_MACHINE_EVENT_IMPORTER_HPP_
-
-#include "rive/importers/import_stack.hpp"
-
-namespace rive {
-    class StateMachineEvent;
-    class StateMachine;
-    class EventInputChange;
-    class StateMachineEventImporter : public ImportStackObject {
-    private:
-        StateMachineEvent* m_StateMachineEvent;
-
-    public:
-        StateMachineEventImporter(StateMachineEvent* event);
-        const StateMachineEvent* stateMachineEvent() const { return m_StateMachineEvent; }
-        void addInputChange(EventInputChange* change);
-        StatusCode resolve() override;
-    };
-} // namespace rive
-#endif
diff --git a/include/rive/importers/state_machine_importer.hpp b/include/rive/importers/state_machine_importer.hpp
index fb014ce..fa643ba 100644
--- a/include/rive/importers/state_machine_importer.hpp
+++ b/include/rive/importers/state_machine_importer.hpp
@@ -6,7 +6,7 @@
 namespace rive {
     class StateMachineInput;
     class StateMachineLayer;
-    class StateMachineEvent;
+    class StateMachineListener;
     class StateMachine;
     class StateMachineImporter : public ImportStackObject {
     private:
@@ -18,7 +18,7 @@
 
         void addLayer(std::unique_ptr<StateMachineLayer>);
         void addInput(std::unique_ptr<StateMachineInput>);
-        void addEvent(std::unique_ptr<StateMachineEvent>);
+        void addListener(std::unique_ptr<StateMachineListener>);
 
         StatusCode resolve() override;
         bool readNullObject() override;
diff --git a/include/rive/importers/state_machine_listener_importer.hpp b/include/rive/importers/state_machine_listener_importer.hpp
new file mode 100644
index 0000000..6702e44
--- /dev/null
+++ b/include/rive/importers/state_machine_listener_importer.hpp
@@ -0,0 +1,21 @@
+#ifndef _RIVE_STATE_MACHINE_LISTENER_IMPORTER_HPP_
+#define _RIVE_STATE_MACHINE_LISTENER_IMPORTER_HPP_
+
+#include "rive/importers/import_stack.hpp"
+
+namespace rive {
+    class StateMachineListener;
+    class StateMachine;
+    class ListenerInputChange;
+    class StateMachineListenerImporter : public ImportStackObject {
+    private:
+        StateMachineListener* m_StateMachineListener;
+
+    public:
+        StateMachineListenerImporter(StateMachineListener* listener);
+        const StateMachineListener* stateMachineListener() const { return m_StateMachineListener; }
+        void addInputChange(ListenerInputChange* change);
+        StatusCode resolve() override;
+    };
+} // namespace rive
+#endif
diff --git a/include/rive/listener_type.hpp b/include/rive/listener_type.hpp
new file mode 100644
index 0000000..a2c8471
--- /dev/null
+++ b/include/rive/listener_type.hpp
@@ -0,0 +1,12 @@
+#ifndef _RIVE_LISTENER_TYPE_HPP_
+#define _RIVE_LISTENER_TYPE_HPP_
+namespace rive {
+    enum class ListenerType : int {
+        updateHover = -1,
+        enter = 0,
+        exit = 1,
+        down = 2,
+        up = 3,
+    };
+}
+#endif
\ No newline at end of file
diff --git a/src/animation/event_input_change.cpp b/src/animation/event_input_change.cpp
deleted file mode 100644
index 7914ae3..0000000
--- a/src/animation/event_input_change.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "rive/animation/state_machine_event.hpp"
-#include "rive/importers/import_stack.hpp"
-#include "rive/importers/state_machine_event_importer.hpp"
-#include "rive/importers/state_machine_importer.hpp"
-#include "rive/animation/event_input_change.hpp"
-#include "rive/animation/state_machine.hpp"
-
-using namespace rive;
-
-StatusCode EventInputChange::import(ImportStack& importStack) {
-    auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachine::typeKey);
-    if (stateMachineImporter == nullptr) {
-        return StatusCode::MissingObject;
-    }
-
-    auto stateMachineEventImporter =
-        importStack.latest<StateMachineEventImporter>(StateMachineEventBase::typeKey);
-    if (stateMachineEventImporter == nullptr) {
-        return StatusCode::MissingObject;
-    }
-
-    if (!validateInputType(stateMachineImporter->stateMachine()->input((size_t)inputId()))) {
-        return StatusCode::InvalidObject;
-    }
-    stateMachineEventImporter->addInputChange(this);
-    return Super::import(importStack);
-}
diff --git a/src/animation/event_bool_change.cpp b/src/animation/listener_bool_change.cpp
similarity index 82%
rename from src/animation/event_bool_change.cpp
rename to src/animation/listener_bool_change.cpp
index 2d81753..a930b28 100644
--- a/src/animation/event_bool_change.cpp
+++ b/src/animation/listener_bool_change.cpp
@@ -1,17 +1,17 @@
-#include "rive/animation/event_bool_change.hpp"
+#include "rive/animation/listener_bool_change.hpp"
 #include "rive/animation/state_machine_instance.hpp"
 #include "rive/animation/state_machine_bool.hpp"
 #include "rive/animation/state_machine_input_instance.hpp"
 using namespace rive;
 
-bool EventBoolChange::validateInputType(const StateMachineInput* input) const {
+bool ListenerBoolChange::validateInputType(const StateMachineInput* input) const {
     // A null input is valid as the StateMachine can attempt to limp along if we
     // introduce new input types that old conditions are expected to handle in
     // newer runtimes. The older runtimes will just evaluate them to true.
     return input == nullptr || input->is<StateMachineBool>();
 }
 
-void EventBoolChange::perform(StateMachineInstance* stateMachineInstance) const {
+void ListenerBoolChange::perform(StateMachineInstance* stateMachineInstance) const {
     auto inputInstance = stateMachineInstance->input(inputId());
     if (inputInstance == nullptr) {
         return;
diff --git a/src/animation/listener_input_change.cpp b/src/animation/listener_input_change.cpp
new file mode 100644
index 0000000..a3e3e54
--- /dev/null
+++ b/src/animation/listener_input_change.cpp
@@ -0,0 +1,27 @@
+#include "rive/animation/state_machine_listener.hpp"
+#include "rive/importers/import_stack.hpp"
+#include "rive/importers/state_machine_listener_importer.hpp"
+#include "rive/importers/state_machine_importer.hpp"
+#include "rive/animation/listener_input_change.hpp"
+#include "rive/animation/state_machine.hpp"
+
+using namespace rive;
+
+StatusCode ListenerInputChange::import(ImportStack& importStack) {
+    auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachine::typeKey);
+    if (stateMachineImporter == nullptr) {
+        return StatusCode::MissingObject;
+    }
+
+    auto stateMachineListenerImporter =
+        importStack.latest<StateMachineListenerImporter>(StateMachineListenerBase::typeKey);
+    if (stateMachineListenerImporter == nullptr) {
+        return StatusCode::MissingObject;
+    }
+
+    if (!validateInputType(stateMachineImporter->stateMachine()->input((size_t)inputId()))) {
+        return StatusCode::InvalidObject;
+    }
+    stateMachineListenerImporter->addInputChange(this);
+    return Super::import(importStack);
+}
diff --git a/src/animation/event_number_change.cpp b/src/animation/listener_number_change.cpp
similarity index 78%
rename from src/animation/event_number_change.cpp
rename to src/animation/listener_number_change.cpp
index a97d306..33c8316 100644
--- a/src/animation/event_number_change.cpp
+++ b/src/animation/listener_number_change.cpp
@@ -1,18 +1,18 @@
-#include "rive/animation/event_number_change.hpp"
+#include "rive/animation/listener_number_change.hpp"
 #include "rive/animation/state_machine_instance.hpp"
 #include "rive/animation/state_machine_number.hpp"
 #include "rive/animation/state_machine_input_instance.hpp"
 
 using namespace rive;
 
-bool EventNumberChange::validateInputType(const StateMachineInput* input) const {
+bool ListenerNumberChange::validateInputType(const StateMachineInput* input) const {
     // A null input is valid as the StateMachine can attempt to limp along if we
     // introduce new input types that old conditions are expected to handle in
     // newer runtimes. The older runtimes will just evaluate them to true.
     return input == nullptr || input->is<StateMachineNumber>();
 }
 
-void EventNumberChange::perform(StateMachineInstance* stateMachineInstance) const {
+void ListenerNumberChange::perform(StateMachineInstance* stateMachineInstance) const {
     auto inputInstance = stateMachineInstance->input(inputId());
     if (inputInstance == nullptr) {
         return;
diff --git a/src/animation/event_trigger_change.cpp b/src/animation/listener_trigger_change.cpp
similarity index 77%
rename from src/animation/event_trigger_change.cpp
rename to src/animation/listener_trigger_change.cpp
index e2b8d9d..f1939e0 100644
--- a/src/animation/event_trigger_change.cpp
+++ b/src/animation/listener_trigger_change.cpp
@@ -1,18 +1,18 @@
-#include "rive/animation/event_trigger_change.hpp"
+#include "rive/animation/listener_trigger_change.hpp"
 #include "rive/animation/state_machine_instance.hpp"
 #include "rive/animation/state_machine_trigger.hpp"
 #include "rive/animation/state_machine_input_instance.hpp"
 
 using namespace rive;
 
-bool EventTriggerChange::validateInputType(const StateMachineInput* input) const {
+bool ListenerTriggerChange::validateInputType(const StateMachineInput* input) const {
     // A null input is valid as the StateMachine can attempt to limp along if we
     // introduce new input types that old conditions are expected to handle in
     // newer runtimes. The older runtimes will just evaluate them to true.
     return input == nullptr || input->is<StateMachineTrigger>();
 }
 
-void EventTriggerChange::perform(StateMachineInstance* stateMachineInstance) const {
+void ListenerTriggerChange::perform(StateMachineInstance* stateMachineInstance) const {
     auto inputInstance = stateMachineInstance->input(inputId());
     if (inputInstance == nullptr) {
         return;
diff --git a/src/animation/state_machine.cpp b/src/animation/state_machine.cpp
index 0959b21..3d4a441 100644
--- a/src/animation/state_machine.cpp
+++ b/src/animation/state_machine.cpp
@@ -3,7 +3,7 @@
 #include "rive/importers/artboard_importer.hpp"
 #include "rive/animation/state_machine_layer.hpp"
 #include "rive/animation/state_machine_input.hpp"
-#include "rive/animation/state_machine_event.hpp"
+#include "rive/animation/state_machine_listener.hpp"
 
 using namespace rive;
 
@@ -23,7 +23,7 @@
             return code;
         }
     }
-    for (auto& object : m_Events) {
+    for (auto& object : m_Listeners) {
         if ((code = object->onAddedDirty(context)) != StatusCode::Ok) {
             return code;
         }
@@ -43,7 +43,7 @@
             return code;
         }
     }
-    for (auto& object : m_Events) {
+    for (auto& object : m_Listeners) {
         if ((code = object->onAddedClean(context)) != StatusCode::Ok) {
             return code;
         }
@@ -68,8 +68,8 @@
     m_Inputs.push_back(std::move(input));
 }
 
-void StateMachine::addEvent(std::unique_ptr<StateMachineEvent> event) {
-    m_Events.push_back(std::move(event));
+void StateMachine::addListener(std::unique_ptr<StateMachineListener> listener) {
+    m_Listeners.push_back(std::move(listener));
 }
 
 const StateMachineInput* StateMachine::input(std::string name) const {
@@ -104,9 +104,9 @@
     return nullptr;
 }
 
-const StateMachineEvent* StateMachine::event(size_t index) const {
-    if (index < m_Events.size()) {
-        return m_Events[index].get();
+const StateMachineListener* StateMachine::listener(size_t index) const {
+    if (index < m_Listeners.size()) {
+        return m_Listeners[index].get();
     }
     return nullptr;
 }
\ No newline at end of file
diff --git a/src/animation/state_machine_instance.cpp b/src/animation/state_machine_instance.cpp
index 30d34fb..d7bbe98 100644
--- a/src/animation/state_machine_instance.cpp
+++ b/src/animation/state_machine_instance.cpp
@@ -13,7 +13,7 @@
 #include "rive/animation/animation_state.hpp"
 #include "rive/animation/state_instance.hpp"
 #include "rive/animation/animation_state_instance.hpp"
-#include "rive/animation/state_machine_event.hpp"
+#include "rive/animation/state_machine_listener.hpp"
 #include "rive/shapes/shape.hpp"
 #include "rive/math/aabb.hpp"
 #include "rive/math/hit_test.hpp"
@@ -224,9 +224,9 @@
         }
     };
 
-    /// Representation of a Shape from the Artboard Instance and all the events it
+    /// Representation of a Shape from the Artboard Instance and all the listeners it
     /// triggers. Allows tracking hover and performing hit detection only once on
-    /// shapes that trigger multiple events.
+    /// shapes that trigger multiple listeners.
     class HitShape {
     private:
         Shape* m_Shape;
@@ -235,11 +235,11 @@
         Shape* shape() const { return m_Shape; }
         HitShape(Shape* shape) : m_Shape(shape) {}
         bool isHovered = false;
-        std::vector<const StateMachineEvent*> events;
+        std::vector<const StateMachineListener*> listeners;
     };
 } // namespace rive
 
-void StateMachineInstance::processEvent(Vec2D position, EventType hitEvent) {
+void StateMachineInstance::updateListeners(Vec2D position, ListenerType hitType) {
     if (m_ArtboardInstance->frameOrigin()) {
         position -= Vec2D(m_ArtboardInstance->originX() * m_ArtboardInstance->width(),
                           m_ArtboardInstance->originY() * m_ArtboardInstance->height());
@@ -261,21 +261,21 @@
         bool hoverChange = hitShape->isHovered != isOver;
         hitShape->isHovered = isOver;
 
-        // iterate all events associated with this hit shape
-        for (auto event : hitShape->events) {
-            // Always update hover states regardless of which specific event type
+        // iterate all listeners associated with this hit shape
+        for (auto listener : hitShape->listeners) {
+            // Always update hover states regardless of which specific listener type
             // we're trying to trigger.
             if (hoverChange) {
-                if (isOver && event->eventType() == EventType::enter) {
-                    event->performChanges(this);
+                if (isOver && listener->listenerType() == ListenerType::enter) {
+                    listener->performChanges(this);
                     markNeedsAdvance();
-                } else if (!isOver && event->eventType() == EventType::exit) {
-                    event->performChanges(this);
+                } else if (!isOver && listener->listenerType() == ListenerType::exit) {
+                    listener->performChanges(this);
                     markNeedsAdvance();
                 }
             }
-            if (isOver && hitEvent == event->eventType()) {
-                event->performChanges(this);
+            if (isOver && hitType == listener->listenerType()) {
+                listener->performChanges(this);
                 markNeedsAdvance();
             }
         }
@@ -295,14 +295,14 @@
         for (auto nestedAnimation : nestedArtboard->nestedAnimations()) {
             if (nestedAnimation->is<NestedStateMachine>()) {
                 auto nestedStateMachine = nestedAnimation->as<NestedStateMachine>();
-                switch (hitEvent) {
-                    case EventType::down:
+                switch (hitType) {
+                    case ListenerType::down:
                         nestedStateMachine->pointerDown(nestedPosition);
                         break;
-                    case EventType::up:
+                    case ListenerType::up:
                         nestedStateMachine->pointerUp(nestedPosition);
                         break;
-                    case EventType::updateHover:
+                    case ListenerType::updateHover:
                         nestedStateMachine->pointerMove(nestedPosition);
                         break;
                     default:
@@ -314,10 +314,14 @@
 }
 
 void StateMachineInstance::pointerMove(Vec2D position) {
-    processEvent(position, EventType::updateHover);
+    updateListeners(position, ListenerType::updateHover);
 }
-void StateMachineInstance::pointerDown(Vec2D position) { processEvent(position, EventType::down); }
-void StateMachineInstance::pointerUp(Vec2D position) { processEvent(position, EventType::up); }
+void StateMachineInstance::pointerDown(Vec2D position) {
+    updateListeners(position, ListenerType::down);
+}
+void StateMachineInstance::pointerUp(Vec2D position) {
+    updateListeners(position, ListenerType::up);
+}
 
 StateMachineInstance::StateMachineInstance(const StateMachine* machine,
                                            ArtboardInstance* instance) :
@@ -351,16 +355,16 @@
         m_Layers[i].init(machine->layer(i), m_ArtboardInstance);
     }
 
-    // Initialize events. Store a lookup table of shape id to hit shape
-    // representation (an object that stores all the events triggered by the
-    // shape producing an event).
+    // Initialize listeners. Store a lookup table of shape id to hit shape
+    // representation (an object that stores all the listeners triggered by the
+    // shape producing a listener).
     std::unordered_map<uint32_t, HitShape*> hitShapeLookup;
-    for (std::size_t i = 0; i < machine->eventCount(); i++) {
-        auto event = machine->event(i);
+    for (std::size_t i = 0; i < machine->listenerCount(); i++) {
+        auto listener = machine->listener(i);
 
-        // Iterate actual leaf hittable shapes tied to this event and resolve
+        // Iterate actual leaf hittable shapes tied to this listener and resolve
         // corresponding ones in the artboard instance.
-        for (auto id : event->hitShapeIds()) {
+        for (auto id : listener->hitShapeIds()) {
             HitShape* hitShape;
             auto itr = hitShapeLookup.find(id);
             if (itr == hitShapeLookup.end()) {
@@ -376,7 +380,7 @@
             } else {
                 hitShape = itr->second;
             }
-            hitShape->events.push_back(event);
+            hitShape->listeners.push_back(listener);
         }
     }
 
diff --git a/src/animation/state_machine_event.cpp b/src/animation/state_machine_listenable.cpp
similarity index 73%
rename from src/animation/state_machine_event.cpp
rename to src/animation/state_machine_listenable.cpp
index bd17743..36e54b5 100644
--- a/src/animation/state_machine_event.cpp
+++ b/src/animation/state_machine_listenable.cpp
@@ -1,36 +1,36 @@
-#include "rive/animation/state_machine_event.hpp"
+#include "rive/animation/state_machine_listener.hpp"
 #include "rive/importers/import_stack.hpp"
 #include "rive/importers/state_machine_importer.hpp"
 #include "rive/generated/animation/state_machine_base.hpp"
 #include "rive/artboard.hpp"
 #include "rive/shapes/shape.hpp"
 #include "rive/animation/state_machine_instance.hpp"
-#include "rive/animation/event_input_change.hpp"
+#include "rive/animation/listener_input_change.hpp"
 
 using namespace rive;
 
-void StateMachineEvent::addInputChange(EventInputChange* inputChange) {
+void StateMachineListener::addInputChange(ListenerInputChange* inputChange) {
     m_InputChanges.push_back(inputChange);
 }
 
-StatusCode StateMachineEvent::import(ImportStack& importStack) {
+StatusCode StateMachineListener::import(ImportStack& importStack) {
     auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
     if (stateMachineImporter == nullptr) {
         return StatusCode::MissingObject;
     }
     // Handing off ownership of this!
-    stateMachineImporter->addEvent(std::unique_ptr<StateMachineEvent>(this));
+    stateMachineImporter->addListener(std::unique_ptr<StateMachineListener>(this));
     return Super::import(importStack);
 }
 
-const EventInputChange* StateMachineEvent::inputChange(size_t index) const {
+const ListenerInputChange* StateMachineListener::inputChange(size_t index) const {
     if (index < m_InputChanges.size()) {
         return m_InputChanges[index];
     }
     return nullptr;
 }
 
-StatusCode StateMachineEvent::onAddedClean(CoreContext* context) {
+StatusCode StateMachineListener::onAddedClean(CoreContext* context) {
     auto artboard = static_cast<Artboard*>(context);
     auto target = artboard->resolve(targetId());
 
@@ -59,7 +59,7 @@
     return Super::onAddedClean(context);
 }
 
-void StateMachineEvent::performChanges(StateMachineInstance* stateMachineInstance) const {
+void StateMachineListener::performChanges(StateMachineInstance* stateMachineInstance) const {
     for (auto inputChange : m_InputChanges) {
         inputChange->perform(stateMachineInstance);
     }
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 349e81e..dffdf8c 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -71,7 +71,7 @@
     // Animations and StateMachines initialize only once on the source/origin
     // Artboard. Instances will hold references to the original Animations and StateMachines, so
     // running this code for instances will effectively initialize them twice. This can lead to
-    // unpredictable behaviour. One such example was that resolved objects like event inputs were
+    // unpredictable behaviour. One such example was that resolved objects like listener inputs were
     // being added to lists twice.
     if (!isInstance()) {
         for (auto object : m_Animations) {
diff --git a/src/file.cpp b/src/file.cpp
index 3f1bdb8..a231f9c 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -14,7 +14,7 @@
 #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_event_importer.hpp"
+#include "rive/importers/state_machine_listener_importer.hpp"
 #include "rive/importers/state_machine_layer_importer.hpp"
 #include "rive/importers/layer_state_importer.hpp"
 #include "rive/importers/state_transition_importer.hpp"
@@ -75,9 +75,8 @@
 
             if (id == -1) {
                 // Still couldn't find it, give up.
-                fprintf(stderr,
-                        "Unknown property key %d, missing from property ToC.\n",
-                        propertyKey);
+                fprintf(
+                    stderr, "Unknown property key %d, missing from property ToC.\n", propertyKey);
                 delete object;
                 return nullptr;
             }
@@ -108,18 +107,17 @@
     return object;
 }
 
-File::File(Factory* factory, FileAssetResolver* assetResolver)
-    : m_Factory(factory)
-    , m_AssetResolver(assetResolver)
-{
+File::File(Factory* factory, FileAssetResolver* assetResolver) :
+    m_Factory(factory), m_AssetResolver(assetResolver) {
     assert(factory);
 }
 
 File::~File() {}
 
-std::unique_ptr<File>
-File::import(Span<const uint8_t> bytes, Factory* factory,
-             ImportResult* result, FileAssetResolver* assetResolver) {
+std::unique_ptr<File> File::import(Span<const uint8_t> bytes,
+                                   Factory* factory,
+                                   ImportResult* result,
+                                   FileAssetResolver* assetResolver) {
     BinaryReader reader(bytes);
     RuntimeHeader header;
     if (!RuntimeHeader::read(reader, header)) {
@@ -230,11 +228,12 @@
                 stackObject = new StateTransitionImporter(object->as<StateTransition>());
                 stackType = StateTransition::typeKey;
                 break;
-            case StateMachineEvent::typeKey:
-                stackObject = new StateMachineEventImporter(object->as<StateMachineEvent>());
+            case StateMachineListener::typeKey:
+                stackObject = new StateMachineListenerImporter(object->as<StateMachineListener>());
                 break;
             case ImageAsset::typeKey:
-                stackObject = new FileAssetImporter(object->as<FileAsset>(), m_AssetResolver, m_Factory);
+                stackObject =
+                    new FileAssetImporter(object->as<FileAsset>(), m_AssetResolver, m_Factory);
                 stackType = FileAsset::typeKey;
                 break;
         }
@@ -244,8 +243,8 @@
         }
     }
 
-    return !reader.hasError() && importStack.resolve() == StatusCode::Ok
-        ? ImportResult::success : ImportResult::malformed;
+    return !reader.hasError() && importStack.resolve() == StatusCode::Ok ? ImportResult::success
+                                                                         : ImportResult::malformed;
 }
 
 Artboard* File::artboard(std::string name) const {
diff --git a/src/generated/animation/event_bool_change_base.cpp b/src/generated/animation/event_bool_change_base.cpp
deleted file mode 100644
index 722a754..0000000
--- a/src/generated/animation/event_bool_change_base.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "rive/generated/animation/event_bool_change_base.hpp"
-#include "rive/animation/event_bool_change.hpp"
-
-using namespace rive;
-
-Core* EventBoolChangeBase::clone() const {
-    auto cloned = new EventBoolChange();
-    cloned->copy(*this);
-    return cloned;
-}
diff --git a/src/generated/animation/event_number_change_base.cpp b/src/generated/animation/event_number_change_base.cpp
deleted file mode 100644
index 64eb85a..0000000
--- a/src/generated/animation/event_number_change_base.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "rive/generated/animation/event_number_change_base.hpp"
-#include "rive/animation/event_number_change.hpp"
-
-using namespace rive;
-
-Core* EventNumberChangeBase::clone() const {
-    auto cloned = new EventNumberChange();
-    cloned->copy(*this);
-    return cloned;
-}
diff --git a/src/generated/animation/event_trigger_change_base.cpp b/src/generated/animation/event_trigger_change_base.cpp
deleted file mode 100644
index 4a78dfe..0000000
--- a/src/generated/animation/event_trigger_change_base.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "rive/generated/animation/event_trigger_change_base.hpp"
-#include "rive/animation/event_trigger_change.hpp"
-
-using namespace rive;
-
-Core* EventTriggerChangeBase::clone() const {
-    auto cloned = new EventTriggerChange();
-    cloned->copy(*this);
-    return cloned;
-}
diff --git a/src/generated/animation/listener_bool_change_base.cpp b/src/generated/animation/listener_bool_change_base.cpp
new file mode 100644
index 0000000..0b756d5
--- /dev/null
+++ b/src/generated/animation/listener_bool_change_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/animation/listener_bool_change_base.hpp"
+#include "rive/animation/listener_bool_change.hpp"
+
+using namespace rive;
+
+Core* ListenerBoolChangeBase::clone() const {
+    auto cloned = new ListenerBoolChange();
+    cloned->copy(*this);
+    return cloned;
+}
diff --git a/src/generated/animation/listener_number_change_base.cpp b/src/generated/animation/listener_number_change_base.cpp
new file mode 100644
index 0000000..8051ae2
--- /dev/null
+++ b/src/generated/animation/listener_number_change_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/animation/listener_number_change_base.hpp"
+#include "rive/animation/listener_number_change.hpp"
+
+using namespace rive;
+
+Core* ListenerNumberChangeBase::clone() const {
+    auto cloned = new ListenerNumberChange();
+    cloned->copy(*this);
+    return cloned;
+}
diff --git a/src/generated/animation/listener_trigger_change_base.cpp b/src/generated/animation/listener_trigger_change_base.cpp
new file mode 100644
index 0000000..732933b
--- /dev/null
+++ b/src/generated/animation/listener_trigger_change_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/animation/listener_trigger_change_base.hpp"
+#include "rive/animation/listener_trigger_change.hpp"
+
+using namespace rive;
+
+Core* ListenerTriggerChangeBase::clone() const {
+    auto cloned = new ListenerTriggerChange();
+    cloned->copy(*this);
+    return cloned;
+}
diff --git a/src/generated/animation/state_machine_event_base.cpp b/src/generated/animation/state_machine_event_base.cpp
deleted file mode 100644
index 0ba8a2b..0000000
--- a/src/generated/animation/state_machine_event_base.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "rive/generated/animation/state_machine_event_base.hpp"
-#include "rive/animation/state_machine_event.hpp"
-
-using namespace rive;
-
-Core* StateMachineEventBase::clone() const {
-    auto cloned = new StateMachineEvent();
-    cloned->copy(*this);
-    return cloned;
-}
diff --git a/src/generated/animation/state_machine_listener_base.cpp b/src/generated/animation/state_machine_listener_base.cpp
new file mode 100644
index 0000000..a5315fc
--- /dev/null
+++ b/src/generated/animation/state_machine_listener_base.cpp
@@ -0,0 +1,10 @@
+#include "rive/generated/animation/state_machine_listener_base.hpp"
+#include "rive/animation/state_machine_listener.hpp"
+
+using namespace rive;
+
+Core* StateMachineListenerBase::clone() const {
+    auto cloned = new StateMachineListener();
+    cloned->copy(*this);
+    return cloned;
+}
diff --git a/src/importers/state_machine_event_importer.cpp b/src/importers/state_machine_event_importer.cpp
deleted file mode 100644
index 9d8fd3c..0000000
--- a/src/importers/state_machine_event_importer.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "rive/importers/state_machine_event_importer.hpp"
-#include "rive/animation/state_machine_event.hpp"
-
-using namespace rive;
-
-StateMachineEventImporter::StateMachineEventImporter(StateMachineEvent* event) :
-    m_StateMachineEvent(event) {}
-
-void StateMachineEventImporter::addInputChange(EventInputChange* change) {
-    m_StateMachineEvent->addInputChange(change);
-}
-
-StatusCode StateMachineEventImporter::resolve() { return StatusCode::Ok; }
\ No newline at end of file
diff --git a/src/importers/state_machine_importer.cpp b/src/importers/state_machine_importer.cpp
index c6aa5a3..f5aa9aa 100644
--- a/src/importers/state_machine_importer.cpp
+++ b/src/importers/state_machine_importer.cpp
@@ -1,6 +1,6 @@
 #include "rive/importers/state_machine_importer.hpp"
 #include "rive/animation/state_machine.hpp"
-#include "rive/animation/state_machine_event.hpp"
+#include "rive/animation/state_machine_listener.hpp"
 #include "rive/animation/state_machine_input.hpp"
 #include "rive/animation/state_machine_layer.hpp"
 
@@ -16,8 +16,8 @@
     m_StateMachine->addInput(std::move(input));
 }
 
-void StateMachineImporter::addEvent(std::unique_ptr<StateMachineEvent> event) {
-    m_StateMachine->addEvent(std::move(event));
+void StateMachineImporter::addListener(std::unique_ptr<StateMachineListener> listener) {
+    m_StateMachine->addListener(std::move(listener));
 }
 
 bool StateMachineImporter::readNullObject() {
diff --git a/src/importers/state_machine_listener_importer.cpp b/src/importers/state_machine_listener_importer.cpp
new file mode 100644
index 0000000..bf403af
--- /dev/null
+++ b/src/importers/state_machine_listener_importer.cpp
@@ -0,0 +1,13 @@
+#include "rive/importers/state_machine_listener_importer.hpp"
+#include "rive/animation/state_machine_listener.hpp"
+
+using namespace rive;
+
+StateMachineListenerImporter::StateMachineListenerImporter(StateMachineListener* listener) :
+    m_StateMachineListener(listener) {}
+
+void StateMachineListenerImporter::addInputChange(ListenerInputChange* change) {
+    m_StateMachineListener->addInputChange(change);
+}
+
+StatusCode StateMachineListenerImporter::resolve() { return StatusCode::Ok; }
\ No newline at end of file
diff --git a/test/state_machine_event_test.cpp b/test/state_machine_event_test.cpp
index 9bc81cf..5e9b462 100644
--- a/test/state_machine_event_test.cpp
+++ b/test/state_machine_event_test.cpp
@@ -2,7 +2,7 @@
 #include <rive/file.hpp>
 #include <rive/animation/state_machine_bool.hpp>
 #include <rive/animation/state_machine_layer.hpp>
-#include <rive/animation/state_machine_event.hpp>
+#include <rive/animation/state_machine_listener.hpp>
 #include <rive/animation/animation_state.hpp>
 #include <rive/animation/entry_state.hpp>
 #include <rive/animation/state_transition.hpp>
@@ -12,13 +12,13 @@
 #include <rive/animation/blend_animation_1d.hpp>
 #include <rive/animation/blend_state_direct.hpp>
 #include <rive/animation/blend_state_transition.hpp>
-#include <rive/animation/event_input_change.hpp>
+#include <rive/animation/listener_input_change.hpp>
 #include <rive/node.hpp>
 #include "catch.hpp"
 #include "rive_file_reader.hpp"
 #include <cstdio>
 
-TEST_CASE("file with state machine events be read", "[file]") {
+TEST_CASE("file with state machine listeners be read", "[file]") {
     auto file = ReadRiveFile("../../test/assets/bullet_man.riv");
 
     auto artboard = file->artboard("Bullet Man");
@@ -28,34 +28,34 @@
     auto stateMachine = artboard->stateMachine(0);
     REQUIRE(stateMachine != nullptr);
 
-    REQUIRE(stateMachine->eventCount() == 3);
+    REQUIRE(stateMachine->listenerCount() == 3);
     REQUIRE(stateMachine->inputCount() == 4);
 
-    // Expect each of the three events to have one input change each.
-    auto event1 = stateMachine->event(0);
-    auto target1 = artboard->resolve(event1->targetId());
+    // Expect each of the three listeners to have one input change each.
+    auto listener1 = stateMachine->listener(0);
+    auto target1 = artboard->resolve(listener1->targetId());
     REQUIRE(target1->is<rive::Node>());
     REQUIRE(target1->as<rive::Node>()->name() == "HandWickHit");
-    REQUIRE(event1->inputChangeCount() == 1);
-    auto inputChange1 = event1->inputChange(0);
+    REQUIRE(listener1->inputChangeCount() == 1);
+    auto inputChange1 = listener1->inputChange(0);
     REQUIRE(inputChange1 != nullptr);
     REQUIRE(inputChange1->inputId() == 0);
 
-    auto event2 = stateMachine->event(1);
-    auto target2 = artboard->resolve(event2->targetId());
+    auto listener2 = stateMachine->listener(1);
+    auto target2 = artboard->resolve(listener2->targetId());
     REQUIRE(target2->is<rive::Node>());
     REQUIRE(target2->as<rive::Node>()->name() == "HandCannonHit");
-    REQUIRE(event2->inputChangeCount() == 1);
-    auto inputChange2 = event2->inputChange(0);
+    REQUIRE(listener2->inputChangeCount() == 1);
+    auto inputChange2 = listener2->inputChange(0);
     REQUIRE(inputChange2 != nullptr);
     REQUIRE(inputChange2->inputId() == 1);
 
-    auto event3 = stateMachine->event(2);
-    auto target3 = artboard->resolve(event3->targetId());
+    auto listener3 = stateMachine->listener(2);
+    auto target3 = artboard->resolve(listener3->targetId());
     REQUIRE(target3->is<rive::Node>());
     REQUIRE(target3->as<rive::Node>()->name() == "HandHelmetHit");
-    REQUIRE(event3->inputChangeCount() == 1);
-    auto inputChange3 = event3->inputChange(0);
+    REQUIRE(listener3->inputChangeCount() == 1);
+    auto inputChange3 = listener3->inputChange(0);
     REQUIRE(inputChange3 != nullptr);
     REQUIRE(inputChange3->inputId() == 2);
 }
@@ -82,7 +82,7 @@
     REQUIRE(trigger->didFire());
 }
 
-TEST_CASE("hit a toggle boolean event", "[file]") {
+TEST_CASE("hit a toggle boolean listener", "[file]") {
     auto file = ReadRiveFile("../../test/assets/light_switch.riv");
 
     auto artboard = file->artboard()->instance();