diff --git a/src/engine.liq b/src/engine.liq
index 705b0bd08913dce37eff1aa83e1a9d95871757a1..6627542a4fec2ee391fc6a7a0d24ca5d0ef1dc7d 100644
--- a/src/engine.liq
+++ b/src/engine.liq
@@ -36,68 +36,8 @@ engine_state = {
 # Include dependency-free functions
 %include "functions.liq"
 
-#####################################
-#              EVENTS               #
-#####################################
-
-# Updates the playout state
-def on_playout_state_change(source_type) =
-    if source_type == "fallback" then
-        engine_state.is_fallback := true
-    else
-        engine_state.is_fallback := false
-    end
-end
-
-# Called when some new metadata info is available
-def on_metadata_notification(meta) =
-    # FIXME For some reason stream channels do not pass the `source` property in meta
-    channel_name = meta["source"]
-    source_type = eval_source_type(channel_name)
-    on_playout_state_change(source_type)
-
-    log(level=3, label="metadata", "Raw metadata before POST:\n\n #{meta}\n\n")
-
-    show_name = ref(list.assoc(default="", "show_name", meta))
-    show_id = ref(list.assoc(default="", "show_id", meta))
-    timeslot_id = list.assoc(default="-1", "timeslot_id", meta)
-    playlist_id = list.assoc(default="-1", "playlist_id", meta)
-    playlist_track_num = list.assoc(default="", "playlist_item", meta)
-    track_start = list.assoc(default=meta["track_start"], "on_air", meta)
-    track_duration = get_meta_track_duration(meta)
-    track_type = eval_track_type(meta["track_type"], meta["source"])
-    track_artist = list.assoc(default=meta["track_artist"], "artist", meta)
-    track_album = list.assoc(default=meta["track_album"], "album", meta)
-    track_title = list.assoc(default=meta["track_title"], "title", meta)
-
-    if source_type == "fallback" then
-        log(level=3, label="metadata", "Detected FALLBACK channel `#{channel_name}` playing \
-            (Show ID: #{!fallback_show_id})")
-        show_name := !fallback_show_name
-        show_id := !fallback_show_id
-    end
-
-    playlog = [
-        ("log_source", engine_id),
-        ("show_name", !show_name),
-        ("show_id", !show_id),
-        ("timeslot_id", timeslot_id),
-        ("playlist_id", playlist_id),
-        ("track_type", track_type),
-        ("track_start", track_start),
-        ("track_duration", "#{track_duration}"),
-        ("track_title", track_title),
-        ("track_album", track_album),
-        ("track_artist", track_artist),
-        ("track_num", playlist_track_num)
-    ]
-    if playlog["show_id"] == "" then
-        log(level=3, label="metadata", "Skip posting playlog because of missing show ID!")
-    else
-        post_playlog(engine_api_playlog, playlog)
-    end
-end
-
+# Handle events
+%include "events.liq"
 
 #####################################
 #              INPUTS               #
diff --git a/src/events.liq b/src/events.liq
new file mode 100644
index 0000000000000000000000000000000000000000..d32956915e4ea2e0cea4bdfe92db21f43c8d4ecd
--- /dev/null
+++ b/src/events.liq
@@ -0,0 +1,77 @@
+#
+# Aura Engine (https://gitlab.servus.at/aura/engine)
+#
+# Copyright (C) 2017-now() - The Aura Engine Team.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+# Updates the playout state
+def on_playout_state_change(source_type) =
+    if source_type == "fallback" then
+        engine_state.is_fallback := true
+    else
+        engine_state.is_fallback := false
+    end
+end
+
+# Called when some new metadata info is available
+def on_metadata_notification(meta) =
+    # FIXME For some reason stream channels do not pass the `source` property in meta
+    channel_name = meta["source"]
+    source_type = eval_source_type(channel_name)
+    on_playout_state_change(source_type)
+
+    log(level=3, label="metadata", "Raw metadata before POST:\n\n #{meta}\n\n")
+
+    show_name = ref(list.assoc(default="", "show_name", meta))
+    show_id = ref(list.assoc(default="", "show_id", meta))
+    timeslot_id = list.assoc(default="-1", "timeslot_id", meta)
+    playlist_id = list.assoc(default="-1", "playlist_id", meta)
+    playlist_track_num = list.assoc(default="", "playlist_item", meta)
+    track_start = list.assoc(default=meta["track_start"], "on_air", meta)
+    track_duration = get_meta_track_duration(meta)
+    track_type = eval_track_type(meta["track_type"], meta["source"])
+    track_artist = list.assoc(default=meta["track_artist"], "artist", meta)
+    track_album = list.assoc(default=meta["track_album"], "album", meta)
+    track_title = list.assoc(default=meta["track_title"], "title", meta)
+
+    if source_type == "fallback" then
+        log(level=3, label="metadata", "Detected FALLBACK channel `#{channel_name}` playing \
+            (Show ID: #{!fallback_show_id})")
+        show_name := !fallback_show_name
+        show_id := !fallback_show_id
+    end
+
+    playlog = [
+        ("log_source", engine_id),
+        ("show_name", !show_name),
+        ("show_id", !show_id),
+        ("timeslot_id", timeslot_id),
+        ("playlist_id", playlist_id),
+        ("track_type", track_type),
+        ("track_start", track_start),
+        ("track_duration", "#{track_duration}"),
+        ("track_title", track_title),
+        ("track_album", track_album),
+        ("track_artist", track_artist),
+        ("track_num", playlist_track_num)
+    ]
+    if playlog["show_id"] == "" then
+        log(level=3, label="metadata", "Skip posting playlog because of missing show ID!")
+    else
+        post_playlog(engine_api_playlog, playlog)
+    end
+end
\ No newline at end of file