diff --git a/roles/artemis/defaults/main.yml b/roles/artemis/defaults/main.yml
index 9f833ff..106cc70 100644
--- a/roles/artemis/defaults/main.yml
+++ b/roles/artemis/defaults/main.yml
@@ -249,9 +249,17 @@ hazelcast_address: "{% if is_multinode_install is defined and is_multinode_insta
 artemis_eureka_urls: "{% if registry.url is defined and registry.url is not none %}http://admin:${jhipster.registry.password}@{{ registry.url }}:8761/eureka/{% endif %}"
 artemis_eureka_instance_id: "{{ node_id }}"
 
+artemis_redis_client_name: "{% if artemis_redis_client_name is defined %}{{ artemis_redis_client_name }}{% else %}{{ artemis_eureka_instance_id }}{% endif %}"
+
 node_short_name: unnamed-artemis-node
 node_display_name: Unnamed Artemis Node
 
+#redis:
+#  host:
+#  port:
+#  username:
+#  password:
+
 ##############################################################################
 # Iris Configuration
 ##############################################################################
diff --git a/roles/artemis/tasks/artemis_configuration.yml b/roles/artemis/tasks/artemis_configuration.yml
index eff6637..37a7517 100644
--- a/roles/artemis/tasks/artemis_configuration.yml
+++ b/roles/artemis/tasks/artemis_configuration.yml
@@ -123,7 +123,7 @@
     state: stopped
   failed_when: false    # e.g. if file exists but service does not
   changed_when: true    # e.g. if service was already stopped
-  when: (config.changed or permissions.changed or service.changed or ssh_key.changed or artemis_force_restart) and not artemis_force_no_restart # noqa 503
+  when: (config.changed or permissions.changed or service.changed or artemis_force_restart) and not artemis_force_no_restart # noqa 503
   notify: restart artemis
   throttle: 1
 
diff --git a/roles/artemis/tasks/deploy_artemis.yml b/roles/artemis/tasks/deploy_artemis.yml
index 332adc4..8461581 100644
--- a/roles/artemis/tasks/deploy_artemis.yml
+++ b/roles/artemis/tasks/deploy_artemis.yml
@@ -15,4 +15,5 @@
     - version_control.localvc is defined and version_control.localvc is not none
     - version_control.localvc.ssh_key_path is defined and version_control.localvc.ssh_key_path|length > 0
     - not (only_update_artemis_config | bool)
+    - contionous_integration.localci is defined and contionous_integration.localci is not none and contionous_integration.localci.is_core_node is defined and contionous_integration.localci.is_core_node
 
diff --git a/roles/artemis/tasks/docker_deploy_artemis.yml b/roles/artemis/tasks/docker_deploy_artemis.yml
index a89488a..d2cb7e2 100644
--- a/roles/artemis/tasks/docker_deploy_artemis.yml
+++ b/roles/artemis/tasks/docker_deploy_artemis.yml
@@ -8,23 +8,14 @@
 - name: Create artemis data directory
   become: true
   file:
-    path: "{{ artemis_working_directory }}/data"
-    state: directory
-    mode: '0770'
-
-- name: Create artemis database directory
-  become: true
-  file:
-    path: "{{ artemis_working_directory }}/data/database"
-    state: directory
-    mode: '0770'
-
-- name: Create artemis data/artemis directory
-  become: true
-  file:
-    path: "{{ artemis_working_directory }}/data/artemis"
+    path: "{{ artemis_working_directory }}/{{ item }}"
     state: directory
     mode: '0770'
+  loop:
+    - "data"
+    - "data/database"
+    - "data/artemis"
+    - "data/redis"
 
 - name: Set permissions for artemis directory
   become: true
diff --git a/roles/artemis/templates/application-prod.yml.j2 b/roles/artemis/templates/application-prod.yml.j2
index 259966f..3f43f6d 100644
--- a/roles/artemis/templates/application-prod.yml.j2
+++ b/roles/artemis/templates/application-prod.yml.j2
@@ -32,6 +32,17 @@ spring:
       addresses: "{{ broker.url }}:61613"
 {% endif %}
 {% endif %}
+
+{% if redis is defined and redis is not none %}
+  data:
+    redis:
+      host: {{ redis.host }}
+      port: {{ redis.port}}
+      username: {{ redis.username}}
+      password: {{ redis.password }}
+      client-name: {{ artemis_redis_client_name }}
+{% endif %}
+
 {% if is_multinode_install and hazelcast_address is defined %}
   hazelcast:
     interface: "{{ hazelcast_address }}"
diff --git a/roles/artemis/templates/artemis.env.j2 b/roles/artemis/templates/artemis.env.j2
index 5582b81..614a4f3 100644
--- a/roles/artemis/templates/artemis.env.j2
+++ b/roles/artemis/templates/artemis.env.j2
@@ -22,6 +22,14 @@ SPRING_WEBSOCKET_BROKER_USERNAME='{{ broker.username }}'
 SPRING_WEBSOCKET_BROKER_PASSWORD='{{ broker.password }}'
 SPRING_WEBSOCKET_BROKER_ADDRESSES='{{ broker.url }}:61613'
 {% endif %}
+
+{% if redis is defined and redis is not none %}
+SPRING_DATA_REDIS_HOST='{{ redis.host }}'
+SPRING_DATA_REDIS_PORT='{{ redis.port}}'
+SPRING_DATA_REDIS_USERNAME='{{ redis.username}}'
+SPRING_DATA_REDIS_PASSWORD='{{ redis.password }}'
+SPRING_DATA_REDIS_CLIENTNAME='{{ artemis_redis_client_name }}'
+{% endif %}
 {% if is_multinode_install and hazelcast_address is defined %}
 SPRING_HAZELCAST_INTERFACE='{{ hazelcast_address }}'
 {% endif %}
diff --git a/roles/artemis/templates/docker.env.j2 b/roles/artemis/templates/docker.env.j2
index 793e5b1..1df5381 100644
--- a/roles/artemis/templates/docker.env.j2
+++ b/roles/artemis/templates/docker.env.j2
@@ -15,6 +15,11 @@ ARTEMIS_DATA_EXPORT_MOUNT='{{ artemis_working_directory }}/data-exports'
 DATABASE_ENV_FILE='{{ artemis_working_directory }}/database.env'
 DATABASE_VOLUME_MOUNT='{{ artemis_working_directory }}/data/database'
 
+{% if redis is defined and redis is not none %}
+REDIS_DATA_VOLUME='{{ artemis_working_directory }}/data/redis'
+REDIS_PASSWORD='{{ redis.password }}'
+{% endif %}
+
 # Broker & Registry vars
 {% if is_multinode_install %}
 REGISTRY_PASSWORD='{{ artemis_jhipster_registry_password }}'
diff --git a/roles/artemis/templates/node.env.j2 b/roles/artemis/templates/node.env.j2
index 13d2469..57ccfd8 100644
--- a/roles/artemis/templates/node.env.j2
+++ b/roles/artemis/templates/node.env.j2
@@ -2,5 +2,8 @@ SPRING_PROFILES_ACTIVE='{{ artemis_spring_profiles }}{% if docker_node_id == 1 %
 EUREKA_INSTANCE_INSTANCEID='Artemis:{{ docker_node_id }}'
 EUREKA_INSTANCE_HOSTNAME='artemis-app-node-{{ docker_node_id }}'
 SPRING_HAZELCAST_INTERFACE='artemis-app-node-{{ docker_node_id }}'
+{% if redis is defined and redis is not none %}
+SPRING_DATA_REDIS_CLIENTNAME='{{ artemis_redis_client_name }}'
+{% endif %}
 ARTEMIS_CONTINUOUSINTEGRATION_BUILDAGENT_SHORTNAME='artemis-node-{{ docker_node_id }}'
 ARTEMIS_CONTINUOUSINTEGRATION_BUILDAGENT_DISPLAYNAME='Artemis Node {{ docker_node_id }}'
diff --git a/roles/firewall/defaults/main.yml b/roles/firewall/defaults/main.yml
index 3575d13..7b4d859 100644
--- a/roles/firewall/defaults/main.yml
+++ b/roles/firewall/defaults/main.yml
@@ -1,6 +1,6 @@
 wireguard_port: 51820
 
-firewall_hostgroup:  # Can be 'registry', 'nodes', 'proxy' or left blank for default rules
+firewall_hostgroup: default # Can be 'registry', 'nodes', 'proxy' or left blank for default rules
 
 # Management Networks - used to allow SSH / HTTP access to Hosts and services
 management_network_ipv4: "172.24.152.0/24"
diff --git a/roles/redis/README.md b/roles/redis/README.md
new file mode 100644
index 0000000..7b545d6
--- /dev/null
+++ b/roles/redis/README.md
@@ -0,0 +1,19 @@
+Redis
+=========
+
+This role installes Redis in a docker container and configures it for the use with artemis.
+
+Please install docker before continuing with this role.
+
+Role Variables
+--------------
+
+Default variables can be found in the `defaults/main.yml` file.
+
+You have to configure the follwoing varaibles in your ansible `group_vars`:
+
+```
+redis:
+  user: artemis # Also used by the artemis role
+  password: #FIXME # Also used by the artemis role
+```
diff --git a/roles/redis/defaults/main.yml b/roles/redis/defaults/main.yml
new file mode 100644
index 0000000..1e2b16d
--- /dev/null
+++ b/roles/redis/defaults/main.yml
@@ -0,0 +1,5 @@
+redis:
+  user: artemis
+  password: #FIXME
+  working_directory: /opt/redis
+  version: 6.2.6-v18
diff --git a/roles/redis/handlers/main.yml b/roles/redis/handlers/main.yml
new file mode 100644
index 0000000..0c8a6c1
--- /dev/null
+++ b/roles/redis/handlers/main.yml
@@ -0,0 +1,5 @@
+- name: restart redis
+  become: true
+  community.docker.docker_compose_v2:
+    project_src: "{{ redis.working_directory }}"
+    state: present
diff --git a/roles/redis/tasks/main.yml b/roles/redis/tasks/main.yml
new file mode 100644
index 0000000..79dbb04
--- /dev/null
+++ b/roles/redis/tasks/main.yml
@@ -0,0 +1,27 @@
+
+- name: Check if redis.password is set
+  fail:
+    msg: "No redis password is configured!"
+  when:
+    - redis.password is undefined or redis.password is none
+
+- name: Create working directory
+  become: true
+  file:
+    path: "{{ redis.working_directory }}"
+    state: directory
+    mode: '0775'
+  notify: restart redis
+
+- name: Copy configuration file
+  become: true
+  template:
+    src: "{{ item.src }}"
+    dest: "{{ redis.working_directory }}/{{ item.dest }}"
+    mode: '0600'
+  notify: restart redis
+  with_items:
+    - src: redis.conf.j2
+      dest: "redis.conf"
+    - src: docker-compose.yml.j2
+      dest: "docker-compose.yml"
diff --git a/roles/redis/templates/docker-compose.yml.j2 b/roles/redis/templates/docker-compose.yml.j2
new file mode 100644
index 0000000..1fcacd5
--- /dev/null
+++ b/roles/redis/templates/docker-compose.yml.j2
@@ -0,0 +1,24 @@
+{{ ansible_managed | comment }}
+
+services:
+  redis:
+    image: redis/redis-stack-server:latest
+    restart: always
+    ports:
+      - "6379:6379"
+    volumes:
+      - ./redis.conf:/usr/local/etc/redis/redis.conf
+      - ./redis-data:/data
+    command: [
+      "redis-server",
+      "/usr/local/etc/redis/redis.conf",
+      "--requirepass {{ redis.password }}",
+      "--user {{ redis.user }} on >{{ redis.password }} +@all &* ~*",
+      "--user default off nopass nocommands",
+      "--protected-mode no"
+    ]
+    healthcheck:
+      test: ["CMD", "redis-cli", "-a", "{{ redis.password }}", "ping"]
+      interval: 10s
+      timeout: 5s
+      retries: 3
diff --git a/roles/redis/templates/redis.conf.j2 b/roles/redis/templates/redis.conf.j2
new file mode 100644
index 0000000..6addb76
--- /dev/null
+++ b/roles/redis/templates/redis.conf.j2
@@ -0,0 +1,3 @@
+{{ ansible_managed | comment }}
+
+notify-keyspace-events lshKE