diff --git a/CMakeLists.txt b/CMakeLists.txt
index fdd3380862f195decb1c8dd2ef116d189b5b3b93..e4a86b7aeefa13cae104b3115028e4dbdd585853 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,8 +49,8 @@ catkin_python_setup()
 ## Generate messages in the 'msg' folder
 add_message_files(
    FILES
-#   Message1.msg
-#   Message2.msg
+   State.msg
+   States.msg
 )
 
 ## Generate services in the 'srv' folder
@@ -161,7 +161,7 @@ include_directories(
 ## Mark executable scripts (Python etc.) for installation
 ## in contrast to setup.py, you can choose the destination
 catkin_install_python(PROGRAMS
-#   scripts/my_python_script
+   nodes/visualiser
    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )
 
diff --git a/msg/State.msg b/msg/State.msg
new file mode 100644
index 0000000000000000000000000000000000000000..0d2c235a8af317a531ffa9be244984e49e194967
--- /dev/null
+++ b/msg/State.msg
@@ -0,0 +1,3 @@
+string  component # Name of the component, whose
+                  # critical level is monitored.
+float32 critical  # Critical level of the family.
\ No newline at end of file
diff --git a/msg/States.msg b/msg/States.msg
new file mode 100644
index 0000000000000000000000000000000000000000..d6705831806ee8d3908995353186638fe8aa46c5
--- /dev/null
+++ b/msg/States.msg
@@ -0,0 +1 @@
+State[] states # Array of states.
diff --git a/nodes/visualiser b/nodes/visualiser
new file mode 100755
index 0000000000000000000000000000000000000000..d202ccc2f718602bcb2b6c3a6afc56fe8ddaee8b
--- /dev/null
+++ b/nodes/visualiser
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+
+import rospy
+from visualising.visualiser import Visualiser
+
+
+def visualiser():
+    rospy.init_node("visualiser")
+    node = Visualiser()
+
+    rate = rospy.Rate(10)
+    while not rospy.is_shutdown():
+        rate.sleep()
+
+
+if __name__ == '__main__':
+    try:
+        visualiser()
+    except rospy.ROSInterruptException:
+        pass
diff --git a/setup.py b/setup.py
index ae086d42738c966245e0bbfca0bf685297156a76..07e0e91f434ec7cd5ed1b2b6da08010b87a9c312 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,8 @@ from distutils.core import setup
 from catkin_pkg.python_setup import generate_distutils_setup
 
 setup_args = generate_distutils_setup(
-    packages=['visualising'],
-    package_dir={'': 'src'}
+    packages=["visualising"],
+    package_dir={"": "src"}
 )
 
 setup(**setup_args)
diff --git a/src/visualising/animation.py b/src/visualising/animation.py
index 162c2982d6abc6a0a426619433a9d082dc485321..a639dfd8e14a3aa679d3948899d4733fea68d776 100755
--- a/src/visualising/animation.py
+++ b/src/visualising/animation.py
@@ -1,6 +1,9 @@
 #!/usr/bin/env python
+
 import re
-from .exception import AnimationException
+import importlib.resources
+from . import animations
+from visualising.exception import AnimationException
 
 
 class Animation:
@@ -66,7 +69,7 @@ class Animation:
     @staticmethod
     def read_frames_from_file(filename):
         try:
-            file = open(filename, 'r')
+            file = importlib.resources.open_text(animations, filename)
         except AttributeError:
             raise AnimationException("P: -- ERROR -- The file is incorrectly formatted!")
         except FileNotFoundError:
@@ -77,8 +80,10 @@ class Animation:
         animation = []
         for line in file:
             frame = []
+
             for value in line.split(','):
                 frame.append(int(re.search(r'\d+', value).group()))
+
             animation.append(frame)
 
         return animation
diff --git a/src/visualising/animations/__init__.py b/src/visualising/animations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/visualising/animations/animation_happy.txt b/src/visualising/animations/animation_happy.txt
new file mode 100644
index 0000000000000000000000000000000000000000..661bc2bc745418543262e99a54b7601abf8aa080
--- /dev/null
+++ b/src/visualising/animations/animation_happy.txt
@@ -0,0 +1,4 @@
+0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/animations/animation_ok.txt b/src/visualising/animations/animation_ok.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cfbcd9a63da0bb5b555083656b81b0ba411b6004
--- /dev/null
+++ b/src/visualising/animations/animation_ok.txt
@@ -0,0 +1,4 @@
+0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/animations/animation_sad.txt b/src/visualising/animations/animation_sad.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b39214e1c226433a3a70c2f7397e1dd814c3220e
--- /dev/null
+++ b/src/visualising/animations/animation_sad.txt
@@ -0,0 +1,4 @@
+50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/arduino.py b/src/visualising/arduino.py
index 2ed3d5d7bec57d72948fa0fe01fdfb1d071b7cc1..896deadf5c665091ca087257be35ce25798318e2 100755
--- a/src/visualising/arduino.py
+++ b/src/visualising/arduino.py
@@ -1,8 +1,9 @@
 #!/usr/bin/env python
+
 import time
-from . message import FrameMsg, InstrMsg
-from . animation import Animation
-from . exception import ArduinoException
+from visualising.message import FrameMsg, InstrMsg
+from visualising.animation import Animation
+from visualising.exception import ArduinoException
 
 
 class Arduino:
diff --git a/src/visualising/connection.py b/src/visualising/connection.py
index 7d861ed3e370c48accffa941983ab4f3d0c4175a..745c536dacb5430ccd50bb344aaa0d458b68ba49 100755
--- a/src/visualising/connection.py
+++ b/src/visualising/connection.py
@@ -1,8 +1,9 @@
 #!/usr/bin/env python
+
 import time
 import serial
 
-from . exception import ConnectionException
+from visualising.exception import ConnectionException
 from serial.serialutil import SerialException
 
 
diff --git a/src/visualising/exception.py b/src/visualising/exception.py
index 82abeb9b58619c848f5a1d6bc3e3ff01a6af33b3..0671296631cea33ac1ea6726685f5eb0d7d77bdb 100755
--- a/src/visualising/exception.py
+++ b/src/visualising/exception.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+
 class Error(Exception):
     pass
 
diff --git a/src/visualising/visualiser.py b/src/visualising/visualiser.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5123ca9b82fccb3a21de42790376812988814f5
--- /dev/null
+++ b/src/visualising/visualiser.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+
+import rospy
+from visualising.msg import State
+from visualising.msg import States
+from visualising.arduino import Arduino
+from visualising.connection import Connection
+from visualising.animation import Animation
+from visualising.exception import *
+
+
+class Visualiser:
+    def __init__(self, port="/dev/ttyUSB0", baud=57600):
+        self.arduino = Arduino(Connection(port, baud))
+        self.robot_state = 0  # Robot starts in a happy state.
+
+        self.happy = Animation(Animation.read_frames_from_file("animation_happy.txt"), 100, 1)
+        self.ok = Animation(Animation.read_frames_from_file("animation_ok.txt"), 100, 1)
+        self.sad = Animation(Animation.read_frames_from_file("animation_sad.txt"), 100, 1)
+
+        rospy.Subscriber("states", States, self.evaluate)
+
+        animation_duration = 1
+        self.timer = rospy.Timer(rospy.Duration(animation_duration), self.update_mood)
+
+    # TODO: Add different modes!
+    def evaluate(self, event):
+        number = 0
+        value = 0
+
+        for state in event.states:
+            value = value + state.critical
+            number = number + 1
+
+        self.robot_state = value / number
+
+    # TODO: Add different modes!
+    def update_mood(self, event):
+        print(self.robot_state)
+        if self.robot_state > 0.7:
+            self.stream_animation(self.sad)
+        else:
+            if self.robot_state > 0.4:
+                self.stream_animation(self.ok)
+            else:
+                self.stream_animation(self.happy)
+
+    def stream_animation(self, animation):
+        self.arduino.stream_animation(animation)