diff --git a/src/dawn/display/animation/SimpleAnimation.hpp b/src/dawn/display/animation/SimpleAnimation.hpp
index 297bd3c4..2917f284 100644
--- a/src/dawn/display/animation/SimpleAnimation.hpp
+++ b/src/dawn/display/animation/SimpleAnimation.hpp
@@ -15,12 +15,27 @@ namespace Dawn {
 
   template<typename T>
   struct SimpleAnimation : public Animation {
+    protected:
+      /**
+       * Function for subclasses to be "notified" when the value has been 
+       * modified.
+       */
+      virtual void onValueModified() {
+
+      }
+
     public:
       easefunction_t *easing = &easeLinear;
       T *modifies;
       std::vector<struct SimpleKeyframe<T>> keyframes;
 
+      /**
+       * Constructs a new Simple Animation instance.
+       * 
+       * @param modifies Pointer to the value that will be modified.
+       */
       SimpleAnimation(T *modifies) {
+        assertNotNull(modifies);
         this->modifies = modifies;
       }
 
@@ -31,6 +46,8 @@ namespace Dawn {
        * @param value Value at this given time.
        */
       void addKeyframe(float_t time, T value) {
+        assertTrue(time >= 0);
+        
         struct SimpleKeyframe<T> keyframe;
         keyframe.time = time;
         keyframe.value = value;
@@ -83,6 +100,17 @@ namespace Dawn {
         this->addSequentialKeyframes(0, frameTime, start, end, 1);
       }
 
+      /**
+       * Immediately sets the value, bypassing keyframes and ticks. Useful for
+       * setting an initial value.
+       * 
+       * @param value Value to set.
+       */
+      void setValue(T value) {
+        *modifies = value;
+        this->onValueModified();
+      }
+
       void tick(float_t delta) override {
         if(this->finished) return;
 
@@ -106,6 +134,7 @@ namespace Dawn {
         if(keyframeCurrent != nullptr && keyframeNext == nullptr) {
           // "End of animation"
           *this->modifies = keyframeCurrent->value;
+          this->onValueModified();
         } else if(keyframeNext != nullptr) {
           T oldValue;
           float_t oldTime;
@@ -127,6 +156,13 @@ namespace Dawn {
           *this->modifies = oldValue + (
             (keyframeNext->value - oldValue) * keyframeDelta
           );
+          this->onValueModified();
+        }
+
+        // First possible frame? I think this can be done cleaner
+        if(this->time == 0 && keyframeCurrent->time == 0) {
+          *this->modifies = keyframeCurrent->value;
+          this->onValueModified();
         }
 
         // Update time.
diff --git a/src/dawn/display/animation/SimpleCallbackAnimation.hpp b/src/dawn/display/animation/SimpleCallbackAnimation.hpp
new file mode 100644
index 00000000..8c15b5d4
--- /dev/null
+++ b/src/dawn/display/animation/SimpleCallbackAnimation.hpp
@@ -0,0 +1,51 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "SimpleAnimation.hpp"
+
+namespace Dawn {
+  template<typename T, class I>
+  struct SimpleCallbackAnimation : public SimpleAnimation<T> {
+    protected:
+      I *instance;
+      void (I::*callback)(T arg);
+      T value;
+
+      /**
+       * Internally invoke the function that this animation is owning.
+       */
+      void invoke() {
+        assertNotNull(this->instance);
+        ((*this->instance).*(this->callback))(this->value);
+      }
+
+      void onValueModified() override {
+        SimpleAnimation::onValueModified();
+        this->invoke();
+      }
+
+    public:
+      /**
+       * Construct a new Simple Function Animation object
+       */
+      SimpleCallbackAnimation() :
+        SimpleAnimation(&value)
+      {
+      }
+
+      /**
+       * Sets the callback for the animation to use.
+       * 
+       * @param instance Instance of the object that has the callback.
+       * @param callback Callback method to be invoked.
+       */
+      void setCallback(I *instance, void (I::*callback)(T arg)) {
+        assertNotNull(instance);
+        this->instance = instance;
+        this->callback = callback;
+      }
+  };
+}
\ No newline at end of file
diff --git a/src/dawn/scene/components/display/AnimationController.cpp b/src/dawn/scene/components/display/AnimationController.cpp
index efec17da..76948266 100644
--- a/src/dawn/scene/components/display/AnimationController.cpp
+++ b/src/dawn/scene/components/display/AnimationController.cpp
@@ -15,9 +15,17 @@ AnimationController::AnimationController(SceneItem *item) :
 
 }
 
+void AnimationController::addAnimation(Animation *animation) {
+  assertNotNull(animation);
+  this->animations.push_back(animation);
+}
+
 void AnimationController::onSceneUpdate() {
-  if(this->animation == nullptr) return;
-  this->animation->tick(this->getGame()->timeManager.delta);
+  auto it = this->animations.begin();
+  while(it != this->animations.end()) {
+    (*it)->tick(this->getGame()->timeManager.delta);
+    ++it;
+  }
 }
 
 void AnimationController::onStart() {
diff --git a/src/dawn/scene/components/display/AnimationController.hpp b/src/dawn/scene/components/display/AnimationController.hpp
index a8af9bf3..c138482c 100644
--- a/src/dawn/scene/components/display/AnimationController.hpp
+++ b/src/dawn/scene/components/display/AnimationController.hpp
@@ -10,13 +10,14 @@
 namespace Dawn {
   class AnimationController : public SceneItemComponent {
     private:
+      std::vector<Animation*> animations;
       void onSceneUpdate();
 
     public:
-      Animation *animation = nullptr;
-
       AnimationController(SceneItem *item);
 
+      void addAnimation(Animation *animation);
+
       void onStart() override;
       void onDispose() override;
   };
diff --git a/src/dawn/visualnovel/components/VisualNovelCharacter.cpp b/src/dawn/visualnovel/components/VisualNovelCharacter.cpp
index 5ab7a711..a43274f8 100644
--- a/src/dawn/visualnovel/components/VisualNovelCharacter.cpp
+++ b/src/dawn/visualnovel/components/VisualNovelCharacter.cpp
@@ -10,5 +10,19 @@ using namespace Dawn;
 VisualNovelCharacter::VisualNovelCharacter(SceneItem *item) :
   SceneItemComponent(item)
 {
-  
+}
+
+void VisualNovelCharacter::setOpacity(float_t opacity) {
+  auto interface = this->item->getComponent<SimpleTexturedShaderInterface>();
+  assertNotNull(interface);
+  auto color = interface->getColor();
+  color.a = opacity;
+  interface->setColor(color);
+}
+
+float_t VisualNovelCharacter::getOpacity() {
+  auto interface = this->item->getComponent<SimpleTexturedShaderInterface>();
+  assertNotNull(interface);
+  auto color = interface->getColor();
+  return color.a;
 }
\ No newline at end of file
diff --git a/src/dawn/visualnovel/components/VisualNovelCharacter.hpp b/src/dawn/visualnovel/components/VisualNovelCharacter.hpp
index e5f7b3cd..d3bd243a 100644
--- a/src/dawn/visualnovel/components/VisualNovelCharacter.hpp
+++ b/src/dawn/visualnovel/components/VisualNovelCharacter.hpp
@@ -5,10 +5,12 @@
 
 #pragma once
 #include "scene/SceneItemComponent.hpp"
+#include "scene/components/display/shader/SimpleTexturedShaderInterface.hpp"
 
 namespace Dawn {
   class VisualNovelCharacter : public SceneItemComponent {
     protected:
+      SimpleTexturedShaderInterface *shaderInterface = nullptr;
     
     public:
       std::string nameKey = "character.unknown";
@@ -20,5 +22,11 @@ namespace Dawn {
        * @param item Item that this component belongs to.
        */
       VisualNovelCharacter(SceneItem *item);
+
+      SimpleTexturedShaderInterface * getShaderInterface();
+
+      void setOpacity(float_t opacity);
+
+      float_t getOpacity();
   };
 }
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/CMakeLists.txt b/src/dawn/visualnovel/events/CMakeLists.txt
index c3a8c6b5..a4129f27 100644
--- a/src/dawn/visualnovel/events/CMakeLists.txt
+++ b/src/dawn/visualnovel/events/CMakeLists.txt
@@ -6,9 +6,12 @@
 # Sources
 target_sources(${DAWN_TARGET_NAME}
   PRIVATE
-    VisualNovelAnimationEvent.cpp
     VisualNovelFadeEvent.cpp
-    VisualNovelPauseEvent.cpp
     VisualNovelTextboxEvent.cpp
     VisualNovelChangeSimpleBackgroundEvent.cpp
-)
\ No newline at end of file
+)
+
+# Subdirs
+add_subdirectory(animation)
+add_subdirectory(characters)
+add_subdirectory(timing)
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/VisualNovelFadeEvent.cpp b/src/dawn/visualnovel/events/VisualNovelFadeEvent.cpp
index defae717..3ffdf18b 100644
--- a/src/dawn/visualnovel/events/VisualNovelFadeEvent.cpp
+++ b/src/dawn/visualnovel/events/VisualNovelFadeEvent.cpp
@@ -19,7 +19,7 @@ VisualNovelFadeEvent::VisualNovelFadeEvent(
   this->duration = duration;
   this->simpleAnimation.easing = ease;
 }
-
+ 
 void VisualNovelFadeEvent::onStart(IVisualNovelEvent *previous) {
   VisualNovelSimpleAnimationEvent::onStart(previous);
 
diff --git a/src/dawn/visualnovel/events/VisualNovelFadeEvent.hpp b/src/dawn/visualnovel/events/VisualNovelFadeEvent.hpp
index b6a57800..4939a21e 100644
--- a/src/dawn/visualnovel/events/VisualNovelFadeEvent.hpp
+++ b/src/dawn/visualnovel/events/VisualNovelFadeEvent.hpp
@@ -4,7 +4,7 @@
 // https://opensource.org/licenses/MIT
 
 #pragma once
-#include "VisualNovelSimpleAnimationEvent.hpp"
+#include "visualnovel/events/animation/VisualNovelSimpleAnimationEvent.hpp"
 
 namespace Dawn {
   class VisualNovelFadeEvent : public VisualNovelSimpleAnimationEvent<float_t> {
diff --git a/src/dawn/visualnovel/events/animation/CMakeLists.txt b/src/dawn/visualnovel/events/animation/CMakeLists.txt
new file mode 100644
index 00000000..73cd7e52
--- /dev/null
+++ b/src/dawn/visualnovel/events/animation/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright (c) 2022 Dominic Masters
+# 
+# This software is released under the MIT License.
+# https://opensource.org/licenses/MIT
+
+# Sources
+target_sources(${DAWN_TARGET_NAME}
+  PRIVATE
+    VisualNovelAnimationEvent.cpp
+)
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/VisualNovelAnimationEvent.cpp b/src/dawn/visualnovel/events/animation/VisualNovelAnimationEvent.cpp
similarity index 100%
rename from src/dawn/visualnovel/events/VisualNovelAnimationEvent.cpp
rename to src/dawn/visualnovel/events/animation/VisualNovelAnimationEvent.cpp
diff --git a/src/dawn/visualnovel/events/VisualNovelAnimationEvent.hpp b/src/dawn/visualnovel/events/animation/VisualNovelAnimationEvent.hpp
similarity index 100%
rename from src/dawn/visualnovel/events/VisualNovelAnimationEvent.hpp
rename to src/dawn/visualnovel/events/animation/VisualNovelAnimationEvent.hpp
diff --git a/src/dawn/visualnovel/events/VisualNovelSimpleAnimationEvent.hpp b/src/dawn/visualnovel/events/animation/VisualNovelSimpleAnimationEvent.hpp
similarity index 100%
rename from src/dawn/visualnovel/events/VisualNovelSimpleAnimationEvent.hpp
rename to src/dawn/visualnovel/events/animation/VisualNovelSimpleAnimationEvent.hpp
diff --git a/src/dawn/visualnovel/events/animation/VisualNovelSimpleCallbackAnimationEvent.hpp b/src/dawn/visualnovel/events/animation/VisualNovelSimpleCallbackAnimationEvent.hpp
new file mode 100644
index 00000000..658b77a3
--- /dev/null
+++ b/src/dawn/visualnovel/events/animation/VisualNovelSimpleCallbackAnimationEvent.hpp
@@ -0,0 +1,24 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "VisualNovelAnimationEvent.hpp"
+#include "display/animation/SimpleCallbackAnimation.hpp"
+
+namespace Dawn {
+  template<typename T, class I>
+  class VisualNovelSimpleCallbackAnimationEvent :
+    public VisualNovelAnimationEvent
+  {
+    public:
+      struct SimpleCallbackAnimation<T, I> callbackAnimation;
+
+      VisualNovelSimpleCallbackAnimationEvent(VisualNovelManager *man) :
+        VisualNovelAnimationEvent(man)
+      {
+        this->animation = &callbackAnimation;
+      }
+  };
+}
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/characters/CMakeLists.txt b/src/dawn/visualnovel/events/characters/CMakeLists.txt
new file mode 100644
index 00000000..cc223e7d
--- /dev/null
+++ b/src/dawn/visualnovel/events/characters/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright (c) 2022 Dominic Masters
+# 
+# This software is released under the MIT License.
+# https://opensource.org/licenses/MIT
+
+# Sources
+target_sources(${DAWN_TARGET_NAME}
+  PRIVATE
+    VisualNovelFadeCharacterEvent.cpp
+)
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.cpp b/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.cpp
new file mode 100644
index 00000000..7ca22dce
--- /dev/null
+++ b/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.cpp
@@ -0,0 +1,29 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#include "VisualNovelFadeCharacterEvent.hpp"
+
+using namespace Dawn;
+
+VisualNovelFadeCharacterEvent::VisualNovelFadeCharacterEvent(
+  VisualNovelManager *man,
+  VisualNovelCharacter *character,
+  bool_t fadeIn,
+  easefunction_t *ease,
+  float_t duration
+) : VisualNovelSimpleCallbackAnimationEvent<float_t, VisualNovelCharacter>(man)
+{
+  this->callbackAnimation.easing = ease;
+  this->callbackAnimation.setCallback(
+    character, &VisualNovelCharacter::setOpacity
+  );
+  if(fadeIn) {
+    this->callbackAnimation.addKeyframe(0.0f, 0.0f);
+    this->callbackAnimation.addKeyframe(duration, 1.0f);
+  } else {
+    this->callbackAnimation.addKeyframe(0.0f, 1.0f);
+    this->callbackAnimation.addKeyframe(duration, 0.0f);
+  }
+}
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.hpp b/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.hpp
new file mode 100644
index 00000000..8b8b9480
--- /dev/null
+++ b/src/dawn/visualnovel/events/characters/VisualNovelFadeCharacterEvent.hpp
@@ -0,0 +1,24 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "visualnovel/events/animation/VisualNovelSimpleCallbackAnimationEvent.hpp"
+#include "visualnovel/components/VisualNovelCharacter.hpp"
+#include "scene/components/display/Material.hpp"
+
+namespace Dawn {
+  class VisualNovelFadeCharacterEvent :
+    public VisualNovelSimpleCallbackAnimationEvent<float_t,VisualNovelCharacter>
+  {
+    public:
+      VisualNovelFadeCharacterEvent(
+        VisualNovelManager *man,
+        VisualNovelCharacter *character,
+        bool_t fadeIn,
+        easefunction_t *ease,
+        float_t duration
+      );
+  };
+}
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/timing/CMakeLists.txt b/src/dawn/visualnovel/events/timing/CMakeLists.txt
new file mode 100644
index 00000000..c633123e
--- /dev/null
+++ b/src/dawn/visualnovel/events/timing/CMakeLists.txt
@@ -0,0 +1,11 @@
+# Copyright (c) 2022 Dominic Masters
+# 
+# This software is released under the MIT License.
+# https://opensource.org/licenses/MIT
+
+# Sources
+target_sources(${DAWN_TARGET_NAME}
+  PRIVATE
+    VisualNovelBatchEvent.cpp
+    VisualNovelPauseEvent.cpp
+)
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.cpp b/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.cpp
new file mode 100644
index 00000000..0c4e26e9
--- /dev/null
+++ b/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.cpp
@@ -0,0 +1,66 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#include "VisualNovelBatchEvent.hpp"
+
+using namespace Dawn;
+
+VisualNovelBatchEvent::VisualNovelBatchEvent(
+  VisualNovelManager *man,
+  std::vector<IVisualNovelEvent*> events
+) : IVisualNovelEvent(man) {
+  this->activeEvents = events;
+}
+
+void VisualNovelBatchEvent::onStart(IVisualNovelEvent *previous) {
+  auto it = this->activeEvents.begin();
+  while(it != this->activeEvents.end()) {
+    auto evt = *it;
+    evt->start(previous);
+    ++it;
+  }
+}
+
+bool_t VisualNovelBatchEvent::onUpdate() {
+  bool_t result;
+  auto it = this->activeEvents.begin();
+  while(it != this->activeEvents.end()) {
+    auto evt = *it;
+    result = evt->update();
+    if(result) {
+      ++it;
+      continue;
+    }
+
+    auto subNext = evt->end();
+
+    // In future I may remove this and instead immediately queue the next thing.
+    assertNull(subNext);
+
+    it = this->activeEvents.erase(it);
+    this->inactiveEvents.push_back(evt);
+  }
+  return this->activeEvents.size() > 0;
+}
+
+void VisualNovelBatchEvent::onEnd() {
+
+}
+
+VisualNovelBatchEvent::~VisualNovelBatchEvent() {
+  auto itActive = this->activeEvents.begin();
+  while(itActive != this->activeEvents.end()) {
+    auto evt = *itActive;
+    delete evt;
+    ++itActive;
+  }
+
+  auto itInactive = this->inactiveEvents.begin();
+  while(itInactive != this->inactiveEvents.end()) {
+    auto evt = *itInactive;
+    delete evt;
+    ++itInactive;
+  }
+}
diff --git a/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.hpp b/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.hpp
new file mode 100644
index 00000000..6699052e
--- /dev/null
+++ b/src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.hpp
@@ -0,0 +1,27 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "visualnovel/VisualNovelManager.hpp"
+
+namespace Dawn {
+  class VisualNovelBatchEvent : public IVisualNovelEvent {
+    protected:
+      std::vector<IVisualNovelEvent*> activeEvents;
+      std::vector<IVisualNovelEvent*> inactiveEvents;
+
+      void onStart(IVisualNovelEvent *previous) override;
+      bool_t onUpdate() override;
+      void onEnd() override;
+
+    public:
+      VisualNovelBatchEvent(
+        VisualNovelManager *man,
+        std::vector<IVisualNovelEvent*> events
+      );
+
+      ~VisualNovelBatchEvent();
+  };
+}
\ No newline at end of file
diff --git a/src/dawn/visualnovel/events/VisualNovelPauseEvent.cpp b/src/dawn/visualnovel/events/timing/VisualNovelPauseEvent.cpp
similarity index 100%
rename from src/dawn/visualnovel/events/VisualNovelPauseEvent.cpp
rename to src/dawn/visualnovel/events/timing/VisualNovelPauseEvent.cpp
diff --git a/src/dawn/visualnovel/events/VisualNovelPauseEvent.hpp b/src/dawn/visualnovel/events/timing/VisualNovelPauseEvent.hpp
similarity index 100%
rename from src/dawn/visualnovel/events/VisualNovelPauseEvent.hpp
rename to src/dawn/visualnovel/events/timing/VisualNovelPauseEvent.hpp
diff --git a/src/dawn/visualnovel/scene/SimpleVNScene.hpp b/src/dawn/visualnovel/scene/SimpleVNScene.hpp
index 895e739f..ee36268a 100644
--- a/src/dawn/visualnovel/scene/SimpleVNScene.hpp
+++ b/src/dawn/visualnovel/scene/SimpleVNScene.hpp
@@ -11,7 +11,7 @@
 #include "scene/components/audio/AudioListener.hpp"
 #include "visualnovel/VisualNovelManager.hpp"
 #include "visualnovel/events/VisualNovelTextboxEvent.hpp"
-#include "visualnovel/events/VisualNovelPauseEvent.hpp"
+#include "visualnovel/events/timing/VisualNovelPauseEvent.hpp"
 #include "visualnovel/events/VisualNovelFadeEvent.hpp"
 #include "visualnovel/events/VisualNovelCAllbackEvent.hpp"
 #include "visualnovel/events/VisualNovelChangeSimpleBackgroundEvent.hpp"
diff --git a/src/dawnopenal/scene/components/audio/AudioSource.cpp b/src/dawnopenal/scene/components/audio/AudioSource.cpp
index 85f03f2b..440aa186 100644
--- a/src/dawnopenal/scene/components/audio/AudioSource.cpp
+++ b/src/dawnopenal/scene/components/audio/AudioSource.cpp
@@ -95,7 +95,7 @@ void AudioSource::onStart() {
   alGenBuffers((ALuint)AUDIO_SOURCE_BUFFER_COUNT, this->buffers);
 
   // Set up the source positions
-  glm::vec3 position = this->transform->getLocalPosition();
+  glm::vec3 position = this->transform->getWorldPosition();
   alSource3f(this->source, AL_POSITION, position.x, position.y, position.z);
   alSource3f(this->source, AL_VELOCITY, 0, 0, 0);
 
diff --git a/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.cpp b/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.cpp
index e000ecb2..92846719 100644
--- a/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.cpp
+++ b/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.cpp
@@ -19,4 +19,8 @@ void SimpleTexturedShaderInterface::setTexture(Texture *texture) {
 
 void SimpleTexturedShaderInterface::setColor(struct Color color) {
   this->getMaterial()->colorValues[this->getShader()->paramColor] = color;
+}
+
+struct Color SimpleTexturedShaderInterface::getColor() {
+  return this->getMaterial()->colorValues[this->getShader()->paramColor];
 }
\ No newline at end of file
diff --git a/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.hpp b/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.hpp
index 3cc62532..ee9162db 100644
--- a/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.hpp
+++ b/src/dawnopengl/scene/components/display/shader/SimpleTexturedShaderInterface.hpp
@@ -32,5 +32,12 @@ namespace Dawn {
        * @param color Color to be used.
        */
       void setColor(struct Color color);
+
+      /**
+       * Returns the current color from the shader.
+       * 
+       * @return Current color.
+       */
+      struct Color getColor();
   };
 }
\ No newline at end of file
diff --git a/src/dawnpokergame/CMakeLists.txt b/src/dawnpokergame/CMakeLists.txt
index 70b1f645..2845dc1a 100644
--- a/src/dawnpokergame/CMakeLists.txt
+++ b/src/dawnpokergame/CMakeLists.txt
@@ -32,11 +32,11 @@ tool_texture(texture_test texture_test.png)
 tool_language(language_en ${DIR_GAME_ASSETS}/locale/en.csv)
 tool_language(language_jp ${DIR_GAME_ASSETS}/locale/jp.csv)
 
-tool_tileset(tileset_death texture_death ${DIR_GAME_ASSETS}/characters/death/sheet.png 1 2)
+tool_tileset(tileset_death texture_death ${DIR_GAME_ASSETS}/characters/death/sheet.png 1 3)
 
 tool_truetype(truetype_alice ${DIR_GAME_ASSETS}/font/Alice-Regular.ttf truetype_alice 2048 2048 120)
 
-tool_audio(audio_test borrowed/sample.wav)
+tool_audio(audio_test borrowed/sample_long.wav)
 
 add_dependencies(${DAWN_TARGET_NAME}
   language_en
diff --git a/src/dawnpokergame/prefabs/characters/DeathPrefab.hpp b/src/dawnpokergame/prefabs/characters/DeathPrefab.hpp
index 5767a8fe..81009475 100644
--- a/src/dawnpokergame/prefabs/characters/DeathPrefab.hpp
+++ b/src/dawnpokergame/prefabs/characters/DeathPrefab.hpp
@@ -17,6 +17,7 @@ namespace Dawn {
     public:
       VisualNovelCharacter *vnCharacter;
       SimpleTexturedShaderInterface *shaderInterface;
+      AnimationController *animation;
 
       static std::vector<Asset*> prefabAssets(AssetManager *assMan) {
         return std::vector<Asset*>{
@@ -25,7 +26,10 @@ namespace Dawn {
         };
       }
 
-      DeathPrefab(Scene *scene, sceneitemid_t id) : SceneItemPrefab(scene, id){}
+      DeathPrefab(Scene *scene, sceneitemid_t id) : SceneItemPrefab(scene, id)
+      {
+
+      }
 
       void prefabInit(AssetManager *man) override {
         auto textureAsset = man->get<TextureAsset>("texture_death");
@@ -34,17 +38,18 @@ namespace Dawn {
         auto meshRenderer = this->addComponent<MeshRenderer>();
         auto material = this->addComponent<Material>();
         auto meshHost = this->addComponent<MeshHost>();
-        auto animation = this->addComponent<AnimationController>();
-
-        auto tiledSprite = this->addComponent<TiledSprite>();
-        tiledSprite->setTilesetAndSize(&tilesetAsset->tileset);
-        tiledSprite->setTile(0);
-        
-        vnCharacter = this->addComponent<VisualNovelCharacter>();
-        vnCharacter->nameKey = "character.death.name";
 
         shaderInterface = this->addComponent<SimpleTexturedShaderInterface>();
         shaderInterface->setTexture(&textureAsset->texture);
+
+        vnCharacter = this->addComponent<VisualNovelCharacter>();
+        vnCharacter->nameKey = "character.death.name";
+
+        animation = this->addComponent<AnimationController>();
+        
+        auto tiledSprite = this->addComponent<TiledSprite>();
+        tiledSprite->setTilesetAndSize(&tilesetAsset->tileset);
+        tiledSprite->setTile(0);
         
         this->transform.setLocalPosition(glm::vec3(0, 0, 0)); 
       }
diff --git a/src/dawnpokergame/scenes/Scene_1.hpp b/src/dawnpokergame/scenes/Scene_1.hpp
index 77a86439..6e436537 100644
--- a/src/dawnpokergame/scenes/Scene_1.hpp
+++ b/src/dawnpokergame/scenes/Scene_1.hpp
@@ -9,34 +9,23 @@
 #include "prefabs/characters/DeathPrefab.hpp"
 #include "scene/components/audio/AudioListener.hpp"
 #include "scene/components/audio/AudioSource.hpp"
+#include "visualnovel/events/characters/VisualNovelFadeCharacterEvent.hpp"
+#include "visualnovel/events/timing/VisualNovelBatchEvent.hpp"
 
 namespace Dawn {
   class Scene_1 : public PixelVNScene {
     protected:
       DeathPrefab *death;
-      AudioSource *source;
-
-      void onFinished() {
-        std::cout << "Finished" << std::endl;
-        source->rewind();
-      }
+      DeathPrefab *death2;
 
       void vnStage() override {
         PixelVNScene::vnStage();
         
         this->death = DeathPrefab::create(this);
-        // this->death->vnCharacter.setOpacity(0);
+        this->death->vnCharacter->setOpacity(0);
 
-        auto sourceItem = this->createSceneItem();
-        source = sourceItem->addComponent<AudioSource>();
-        source->transform->setLocalPosition(glm::vec3(1, 0, 0));
-        source->eventFinished.addListener(this, &Scene_1::onFinished);
-        
-        auto audio = this->game->assetManager.get<AudioAsset>("audio_test");
-
-        source->setAudioData(audio);
-        source->loop = true;
-        source->state = AUDIO_SOURCE_STATE_PLAYING;
+        this->death2 = DeathPrefab::create(this);
+        this->death2->transform.setLocalPosition(glm::vec3(100, 0, 0));
       }
 
       void onSceneEnded() {
@@ -51,12 +40,29 @@ namespace Dawn {
 
       IVisualNovelEvent * getVNEvent() override {
         auto start = new VisualNovelPauseEvent(vnManager, 1.0f);
-
         start
-          // ->then(new VisualNovelTextboxEvent(vnManager, nullptr, "scene.1.1"))
-          // ->then(new VisualNovelCallbackEvent<Scene_1>(vnManager, this, &Scene_1::onSceneEnded))
+          ->then(new VisualNovelBatchEvent(
+            vnManager,
+            std::vector<IVisualNovelEvent*>{
+              new VisualNovelFadeCharacterEvent(
+                vnManager,
+                this->death->vnCharacter,
+                true,
+                &easeLinear,
+                2.0f
+              ),
+              new VisualNovelFadeCharacterEvent(
+                vnManager,
+                this->death2->vnCharacter,
+                false,
+                &easeLinear,
+                2.0f
+              )
+            }
+          ))
+          ->then(new VisualNovelTextboxEvent(vnManager, nullptr, "scene.1.1"))
+          ->then(new VisualNovelCallbackEvent<Scene_1>(vnManager, this, &Scene_1::onSceneEnded))
         ;
-
         return start;
       }