diff --git a/docker-compose.yml b/docker-compose.yml
index 32355fb8cdc1d8074579e1d6e4bb62430ff3bc35..d1ca2a189ab837a8a8a40c801d650bf75bb970da 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,128 +1,133 @@
 services:
-  kms01:
-    image: gokms
-    command: ["--log", "debug", "--kms_config", "/tmp/kms/config/kms01.yaml"]
-    volumes:
-        - ./config/goKMS/example01.yaml:/tmp/kms/config/kms01.yaml
-        - ./artifacts/ssl:/ssl
-    ports:
-        - "127.0.0.1:4401:1337"
-        - "127.0.0.1:9696:9696"
-
-  kms02:
-    image: gokms
-    command: ["--log", "debug", "--kms_config", "/tmp/kms/config/kms02.yaml"]
-    volumes:
-        - ./config/goKMS/example02.yaml:/tmp/kms/config/kms02.yaml
-        - ./artifacts/ssl:/ssl
-    ports:
-        - "127.0.0.1:4402:1337"
-
-  kms03:
-    image: gokms
-    command: ["--log", "debug", "--kms_config", "/tmp/kms/config/kms03.yaml"]
-    volumes:
-        - ./config/goKMS/example03.yaml:/tmp/kms/config/kms03.yaml
-        - ./artifacts/ssl:/ssl
-    ports:
-        - "127.0.0.1:4403:1337"
-
-  kms04:
-    image: gokms
-    command: ["--log", "debug", "--kms_config", "/tmp/kms/config/kms04.yaml"]
-    volumes:
-        - ./config/goKMS/example04.yaml:/tmp/kms/config/kms04.yaml
-        - ./artifacts/ssl:/ssl
-    ports:
-        - "127.0.0.1:4404:1337"
-        - "127.0.0.1:9697:9696"
-
-  qlayer01:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer01.yaml"]
-    volumes:
-        - ./config/quantumlayer/example01.yaml:/tmp/quantumlayer/config/quantumlayer01.yaml
-
-  qlayer02:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer02.yaml"]
-    volumes:
-        - ./config/quantumlayer/example02.yaml:/tmp/quantumlayer/config/quantumlayer02.yaml
-
-  qlayer03:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer03.yaml"]
-    volumes:
-        - ./config/quantumlayer/example03.yaml:/tmp/quantumlayer/config/quantumlayer03.yaml
-
-  qlayer04:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer04.yaml"]
-    volumes:
-        - ./config/quantumlayer/example04.yaml:/tmp/quantumlayer/config/quantumlayer04.yaml
-
-  qlayer05:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer05.yaml"]
-    volumes:
-        - ./config/quantumlayer/example05.yaml:/tmp/quantumlayer/config/quantumlayer05.yaml
-
-  qlayer06:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer06.yaml"]
-    volumes:
-        - ./config/quantumlayer/example06.yaml:/tmp/quantumlayer/config/quantumlayer06.yaml
-
-  qlayer07:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer07.yaml"]
-    volumes:
-        - ./config/quantumlayer/example07.yaml:/tmp/quantumlayer/config/quantumlayer07.yaml
-
-  qlayer08:
-    image: quantumlayer
-    command: ["--config", "/tmp/quantumlayer/config/quantumlayer08.yaml"]
-    volumes:
-        - ./config/quantumlayer/example08.yaml:/tmp/quantumlayer/config/quantumlayer08.yaml
-
-  akms-receiver01:
-    image: akms-simulator
-
-  akms-receiver02:
-    image: akms-simulator
-
-  qkdn-controller:
-    image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller:qkdn-main
-    volumes:
-      - ./config/controller/qkdn-gosdn.toml:/app/configs/qkdn-gosdn.toml
-      - ./config/controller/gNMISubscriptions.txt:/app/configs/gNMISubscriptions.txt
-    command: --config ./configs/qkdn-gosdn.toml
-    ports:
-      - "127.0.0.1:55055:55055"
-    environment:
-      GOSDN_ADMIN_PASSWORD: TestPassword
-
-  gosdnc:
-    image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/gosdnc:qkdn-main
-    volumes:
-      - ./config/controller/add_devices.sh:/scripts/add_devices.sh
-    entrypoint: ["/scripts/add_devices.sh"]
-
-  plugin-registry:
-    image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/plugin-registry:qkdn-main
-
-  mongo:
-    image: mongo:7
-    environment:
-      MONGO_INITDB_ROOT_USERNAME: root
-      MONGO_INITDB_ROOT_PASSWORD: example
-
-  rabbitmq:
-    image: rabbitmq:3-management
-
-  routing-app:
-    image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/routing-app:qkdn-main
-    entrypoint: ["./start_ra_sleep.sh"]
-    volumes:
-      - ./config/controller/start_ra_sleep.sh:/app/start_ra_sleep.sh
-      - ./config/controller/routing-config.yaml:/new/routing-config.yaml
+    kms01:
+        image: gokms
+        command:
+            ["--log", "debug", "--kms_config", "/tmp/kms/config/kms01.yaml"]
+        volumes:
+            - ./config/goKMS/example01.yaml:/tmp/kms/config/kms01.yaml
+            - ./artifacts/ssl:/ssl
+        ports:
+            - "127.0.0.1:7030:7030"
+            - "127.0.0.1:4401:1337"
+            - "127.0.0.1:9696:9696"
+
+    kms02:
+        image: gokms
+        command:
+            ["--log", "debug", "--kms_config", "/tmp/kms/config/kms02.yaml"]
+        volumes:
+            - ./config/goKMS/example02.yaml:/tmp/kms/config/kms02.yaml
+            - ./artifacts/ssl:/ssl
+        ports:
+            - "127.0.0.1:4402:1337"
+
+    kms03:
+        image: gokms
+        command:
+            ["--log", "debug", "--kms_config", "/tmp/kms/config/kms03.yaml"]
+        volumes:
+            - ./config/goKMS/example03.yaml:/tmp/kms/config/kms03.yaml
+            - ./artifacts/ssl:/ssl
+        ports:
+            - "127.0.0.1:4403:1337"
+
+    kms04:
+        image: gokms
+        command:
+            ["--log", "debug", "--kms_config", "/tmp/kms/config/kms04.yaml"]
+        volumes:
+            - ./config/goKMS/example04.yaml:/tmp/kms/config/kms04.yaml
+            - ./artifacts/ssl:/ssl
+        ports:
+            - "127.0.0.1:4404:1337"
+            - "127.0.0.1:9697:9696"
+
+    qlayer01:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer01.yaml"]
+        volumes:
+            - ./config/quantumlayer/example01.yaml:/tmp/quantumlayer/config/quantumlayer01.yaml
+
+    qlayer02:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer02.yaml"]
+        volumes:
+            - ./config/quantumlayer/example02.yaml:/tmp/quantumlayer/config/quantumlayer02.yaml
+
+    qlayer03:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer03.yaml"]
+        volumes:
+            - ./config/quantumlayer/example03.yaml:/tmp/quantumlayer/config/quantumlayer03.yaml
+
+    qlayer04:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer04.yaml"]
+        volumes:
+            - ./config/quantumlayer/example04.yaml:/tmp/quantumlayer/config/quantumlayer04.yaml
+
+    qlayer05:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer05.yaml"]
+        volumes:
+            - ./config/quantumlayer/example05.yaml:/tmp/quantumlayer/config/quantumlayer05.yaml
+
+    qlayer06:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer06.yaml"]
+        volumes:
+            - ./config/quantumlayer/example06.yaml:/tmp/quantumlayer/config/quantumlayer06.yaml
+
+    qlayer07:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer07.yaml"]
+        volumes:
+            - ./config/quantumlayer/example07.yaml:/tmp/quantumlayer/config/quantumlayer07.yaml
+
+    qlayer08:
+        image: quantumlayer
+        command: ["--config", "/tmp/quantumlayer/config/quantumlayer08.yaml"]
+        volumes:
+            - ./config/quantumlayer/example08.yaml:/tmp/quantumlayer/config/quantumlayer08.yaml
+
+    akms-receiver01:
+        image: akms-simulator
+
+    akms-receiver02:
+        image: akms-simulator
+
+    qkdn-controller:
+        image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller:qkdn-main
+        volumes:
+            - ./config/controller/qkdn-gosdn.toml:/app/configs/qkdn-gosdn.toml
+            - ./config/controller/gNMISubscriptions.txt:/app/configs/gNMISubscriptions.txt
+        command: --config ./configs/qkdn-gosdn.toml
+        ports:
+            - "127.0.0.1:55055:55055"
+        environment:
+            GOSDN_ADMIN_PASSWORD: TestPassword
+
+    gosdnc:
+        image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/gosdnc:qkdn-main
+        volumes:
+            - ./config/controller/add_devices.sh:/scripts/add_devices.sh
+        entrypoint: ["/scripts/add_devices.sh"]
+
+    plugin-registry:
+        image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/plugin-registry:qkdn-main
+
+    mongo:
+        image: mongo:7
+        environment:
+            MONGO_INITDB_ROOT_USERNAME: root
+            MONGO_INITDB_ROOT_PASSWORD: example
+
+    rabbitmq:
+        image: rabbitmq:3-management
+
+    routing-app:
+        image: registry.code.fbi.h-da.de/demoquandt/qkdn-controller/routing-app:qkdn-main
+        entrypoint: ["./start_ra_sleep.sh"]
+        volumes:
+            - ./config/controller/start_ra_sleep.sh:/app/start_ra_sleep.sh
+            - ./config/controller/routing-config.yaml:/new/routing-config.yaml
diff --git a/go.mod b/go.mod
index e70ca39ca93589151b15a037ecf93d6e7d1bc1cc..a42ecce2fcd967a6687fdb74137cee62b845895b 100644
--- a/go.mod
+++ b/go.mod
@@ -27,7 +27,7 @@ require (
 	buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240221180331-f05a6f4403ce.1 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/go-ole/go-ole v1.3.0 // indirect
-	github.com/golang/glog v1.2.2 // indirect
+	github.com/golang/glog v1.2.4 // indirect
 	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
diff --git a/go.sum b/go.sum
index 3257a676d81094b0ba2486b2a20d4e69bdb0e34d..a179c122c477e6a2ca7516e4249d27ced201f937 100644
--- a/go.sum
+++ b/go.sum
@@ -27,12 +27,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
 github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY=
-github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
+github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc=
+github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -64,8 +68,6 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -109,8 +111,6 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
@@ -120,6 +120,16 @@ github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDgu
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
 github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
+go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
+go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
+go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
+go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
+go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
+go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
+go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
+go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
+go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -143,12 +153,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
-golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
-golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
-golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
-golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
-golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
 golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
 golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -170,16 +174,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
-golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
-golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
-golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
-golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
 golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -188,10 +182,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
-golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
 golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -213,40 +203,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98
 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto v0.0.0-20210811021853-ddbe55d93216/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
-google.golang.org/genproto/googleapis/api v0.0.0-20240820151423-278611b39280 h1:YDFM9oOjiFhaMAVgbDxfxW+66nRrsvzQzJ51wp3OxC0=
-google.golang.org/genproto/googleapis/api v0.0.0-20240820151423-278611b39280/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g=
-google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0=
-google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
 google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ=
 google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 h1:9Xyg6I9IWQZhRVfCWjKK+l6kI0jHcPesVlMnT//aHNo=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 h1:Di6ANFilr+S60a4S61ZM00vLdw0IrQOSMS2/6mrnOU0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240723171418-e6d459c13d2a h1:hqK4+jJZXCU4pW7jsAdGOVFIfLHQeV7LaizZKnZ84HI=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240723171418-e6d459c13d2a/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f h1:RARaIm8pxYuxyNPbBQf5igT7XdOyCNtat1qAT2ZxjU4=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf h1:liao9UHurZLtiEwBgT9LMOnKYsHze6eA6w1KQCMVN2Q=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240823204242-4ba0660f739c h1:Kqjm4WpoWvwhMPcrAczoTyMySQmYa9Wy2iL6Con4zn8=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240823204242-4ba0660f739c/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -257,22 +215,6 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
 google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
 google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
-google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
-google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c=
-google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
-google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM=
-google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
-google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo=
-google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
-google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw=
-google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
-google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0=
-google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA=
-google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0=
-google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw=
 google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
 google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
@@ -290,10 +232,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
 google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/goKMS/gnmiHandlers/kms/assignForwardingHandler.go b/goKMS/gnmiHandlers/kms/assignForwardingHandler.go
index bc4daedacc12d99e48b11db7179c5f36cc2dc3af..35c4da1b09509eea586c5d07744651fac982fd9e 100644
--- a/goKMS/gnmiHandlers/kms/assignForwardingHandler.go
+++ b/goKMS/gnmiHandlers/kms/assignForwardingHandler.go
@@ -36,6 +36,28 @@ func (yh *AssignForwardingHandler) Init(config *handler.Config, publishToSubsFun
 	yh.Config = config
 	yh.PublishToSubs = publishToSubsFunc
 
+	yh.Config.Lock()
+	defer yh.Config.Unlock()
+
+	copyCurrentConfig, err := ygot.DeepCopy(yh.Config.Data)
+	if err != nil {
+		return err
+	}
+
+	newConfig, ok := copyCurrentConfig.(*gnmitargetygot.Gnmitarget)
+	if !ok {
+		return fmt.Errorf("Wrong type, exptected: %T, got: %T", (*gnmitargetygot.OpenconfigInterfaces_Interfaces)(nil), copyCurrentConfig)
+	}
+
+	newConfig.GetOrCreateAssignForwarding()
+
+	//validate struct
+	if err := newConfig.Validate(); err != nil {
+		return err
+	}
+
+	yh.Config.Data = newConfig
+
 	return nil
 }
 
diff --git a/goKMS/gnmiHandlers/kms/keyStoreHandler.go b/goKMS/gnmiHandlers/kms/keyStoreHandler.go
index ddff4a7cc9d73a62a5adeec5a7228b7a4f04739e..b9be8da734beedd9fb5c48081f9ff532921220b1 100644
--- a/goKMS/gnmiHandlers/kms/keyStoreHandler.go
+++ b/goKMS/gnmiHandlers/kms/keyStoreHandler.go
@@ -2,10 +2,10 @@ package kmsHandler
 
 import (
 	"fmt"
-	"time"
 
 	"code.fbi.h-da.de/danet/gnmi-target/handler"
 	"code.fbi.h-da.de/danet/quant/goKMS/kms"
+	"code.fbi.h-da.de/danet/quant/goKMS/kms/event"
 	gnmitargetygot "code.fbi.h-da.de/danet/quant/goKMS/model"
 	"github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
@@ -15,6 +15,7 @@ import (
 type KeyStoreHandler struct {
 	handler.DefaultPathHandler
 	kms                     *kms.KMS
+	events                  <-chan event.Event
 	maxKeyFillLevelsDefined map[string]uint64
 }
 
@@ -35,20 +36,31 @@ func (yh *KeyStoreHandler) Init(config *handler.Config, publishToSubsFunc func([
 	yh.Config = config
 	yh.PublishToSubs = publishToSubsFunc
 
+	var err error
+	yh.events, err = event.NewEventBus().Subscribe(event.KEY_STORE)
+	if err != nil {
+		return err
+	}
+
+	if _, err := yh.updateOrCreateKeyStores(); err != nil {
+		return err
+	}
+
 	// Start the go routine that takes care of any update from the kms
 	go func() {
-		ticker := time.NewTicker(15 * time.Second)
-		defer ticker.Stop()
-
-		// TODO: add context/channel to stop
-		for range ticker.C {
-			diff, err := yh.updateOrCreateKeyStores(yh.kms)
-			if err != nil {
-				log.Errorf("Error within key stores subscription goroutine; %v", err)
-				break
-			}
-			if err := yh.PublishToSubs(diff); err != nil {
-				log.Errorf("Error within key stores subscription goroutine; %v", err)
+		for {
+			select {
+			case <-yh.events:
+				log.Println("Update for key stores.")
+
+				diff, err := yh.updateOrCreateKeyStores()
+				if err != nil {
+					log.Errorf("Error within key stores subscription goroutine; %v", err)
+					break
+				}
+				if err := yh.PublishToSubs(diff); err != nil {
+					log.Errorf("Error within key stores subscription goroutine; %v", err)
+				}
 			}
 		}
 	}()
@@ -60,7 +72,7 @@ func (yh *KeyStoreHandler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi.Update)
 	return nil
 }
 
-func (yh *KeyStoreHandler) updateOrCreateKeyStores(kms *kms.KMS) ([]*gnmi.Notification, error) {
+func (yh *KeyStoreHandler) updateOrCreateKeyStores() ([]*gnmi.Notification, error) {
 	yh.Config.Lock()
 	defer yh.Config.Unlock()
 
@@ -74,7 +86,7 @@ func (yh *KeyStoreHandler) updateOrCreateKeyStores(kms *kms.KMS) ([]*gnmi.Notifi
 		return nil, fmt.Errorf("Wrong type, exptected: %T, got: %T", (*gnmitargetygot.Temp_KeyStores)(nil), copyCurrentConfig)
 	}
 
-	kmsPeers := kms.PeersDeepCopy()
+	kmsPeers := yh.kms.PeersDeepCopy()
 
 	confKeyStores := newConfig.GetOrCreateKeyStores()
 
diff --git a/goKMS/kms/event/bus.go b/goKMS/kms/event/bus.go
index 301b883b09fa8d71d10cfae043415fc5adad0e80..947c3aac882fb79a7a070647b9028d275808b2ca 100644
--- a/goKMS/kms/event/bus.go
+++ b/goKMS/kms/event/bus.go
@@ -1,15 +1,31 @@
 package event
 
-import "fmt"
+import (
+	"fmt"
+	"sync"
+)
+
+var eventBusLock = &sync.Mutex{}
+var eventBus *EventBus
 
 type EventBus struct {
 	subscribers map[Topic]map[chan<- Event]struct{}
 }
 
 func NewEventBus() *EventBus {
-	return &EventBus{
-		subscribers: make(map[Topic]map[chan<- Event]struct{}),
+	if eventBus == nil {
+		// lock access to eventBus
+		eventBusLock.Lock()
+		defer eventBusLock.Unlock()
+		// check if eventBus is still nil
+		if eventBus == nil {
+			fmt.Println("Initializing KMS EventBus.")
+			eventBus = &EventBus{
+				subscribers: make(map[Topic]map[chan<- Event]struct{}),
+			}
+		}
 	}
+	return eventBus
 }
 
 func (b *EventBus) Subscribe(topic Topic) (<-chan Event, error) {
diff --git a/goKMS/kms/event/event.go b/goKMS/kms/event/event.go
index b99faee99ccabaf0ca246dff53294935ce7961ac..2e89cf2b52842a72dbfff0529a32555c69c248ec 100644
--- a/goKMS/kms/event/event.go
+++ b/goKMS/kms/event/event.go
@@ -9,6 +9,7 @@ const (
 	ROUTE
 	QUANTUM_MODULE
 	CREATE_ROUTE
+	KEY_STORE
 )
 
 // Event ...
@@ -86,3 +87,23 @@ func (e *RouteEvent) Topic() Topic {
 func (e *RouteEvent) Time() time.Time {
 	return e.Timestamp
 }
+
+type KeyStoreEvent struct {
+	EventTopic Topic
+	Timestamp  time.Time
+}
+
+func NewKeyStoreEvent() *KeyStoreEvent {
+	return &KeyStoreEvent{
+		EventTopic: KEY_STORE,
+		Timestamp:  time.Now(),
+	}
+}
+
+func (e *KeyStoreEvent) Topic() Topic {
+	return e.EventTopic
+}
+
+func (e *KeyStoreEvent) Time() time.Time {
+	return e.Timestamp
+}
diff --git a/goKMS/kms/kmsintercom.go b/goKMS/kms/kmsintercom.go
index 09c6bff8fc577701a290c0fe7e4f8c49f084759f..344d20c8bd2cb247bebe3ee9308941da225ce3d2 100644
--- a/goKMS/kms/kmsintercom.go
+++ b/goKMS/kms/kmsintercom.go
@@ -128,7 +128,7 @@ func (s *kmsTalkerServer) SyncQkdBulk(ctx context.Context, in *pb.SyncQkdBulkReq
 		}
 	}
 
-	return nil, status.Errorf(codes.Unimplemented, "method SyncQkdBulk not implemented")
+	return nil, status.Errorf(codes.Internal, "Could not find a RawBulkKey that matches the provided IDs: %v", in.BulkId)
 }
 
 func (s *kmsTalkerServer) SyncKeyIdsForBulk(ctx context.Context, in *pb.SyncKeyIdsForBulkRequest) (*pb.SyncKeyIdsForBulkResponse, error) {
@@ -155,10 +155,8 @@ func (s *kmsTalkerServer) SyncKeyIdsForBulk(ctx context.Context, in *pb.SyncKeyI
 		return nil, status.Errorf(codes.Internal, "%v", err)
 	}
 
-	for keyId, key := range keyData {
-		if err := eqm.KeyStore().AddKey(keyId, key); err != nil {
-			log.Error(err)
-		}
+	if err := eqm.KeyStore().AddKeys(keyData); err != nil {
+		log.Error(err)
 	}
 
 	delete(eqm.RawBulkKeys, in.GetBulkId())
diff --git a/goKMS/kms/peers/danetQuantummodule.go b/goKMS/kms/peers/danetQuantummodule.go
index fd967f6b7399512c104605d3c0a79c0b5c76bfe2..b237a3794c1be123792ca1b3df5e074b6a3c6fb9 100644
--- a/goKMS/kms/peers/danetQuantummodule.go
+++ b/goKMS/kms/peers/danetQuantummodule.go
@@ -123,10 +123,8 @@ func (qm *DanetQuantumModule) Sync() error {
 		return err
 	}
 
-	for keyId, key := range keyData {
-		if err := qm.keyStore.AddKey(keyId, key); err != nil {
-			log.Error(err)
-		}
+	if err := qm.keyStore.AddKeys(keyData); err != nil {
+		log.Error(err)
 	}
 
 	qm.RawBulkKeysMutex.Lock()
diff --git a/goKMS/kms/quipsec.go b/goKMS/kms/quipsec.go
index da6c9c4ec4fad45007f0057338d7dce2035f7ea6..4eb66b6623b4c0f7b96a239fa3c5de38936e689c 100644
--- a/goKMS/kms/quipsec.go
+++ b/goKMS/kms/quipsec.go
@@ -48,17 +48,23 @@ func (qs *quipSecServer) PushKeys(ctx context.Context, req *pb.PushKeysRequest)
 		return nil, status.Errorf(codes.Internal, "could not get bulkkeyid")
 	}
 
-	eqm.RawBulkKeysMutex.Lock()
-	defer eqm.RawBulkKeysMutex.Unlock()
 	if !eqm.IsActive() {
 		logrus.Debugf("Quantum module: %s is not active and denied incoming bulk keys", eqm.ID())
 		return nil, status.Errorf(codes.Aborted, "Currently no new bulk keys are accepted")
 	}
+	eqm.RawBulkKeysMutex.Lock()
 	eqm.RawBulkKeys[bulkKeyId] = &quantumlayer.QuantumLayerBulkKey{
 		BulkKeyId:     bulkKeyId,
 		BulkKeyLength: int(req.GetKeyBulk().GetKeyLength()),
 		BulkKey:       req.GetKeyBulk().Keys,
 	}
+	eqm.RawBulkKeysMutex.Unlock()
+
+	if eqm.KeyStore().Length() == 0 {
+		if err := eqm.Sync(); err != nil {
+			logrus.Error("Syncing key stores after a bulk key push failed; err: ", err)
+		}
+	}
 
 	logrus.Debugf("%s received a new bulk from: %s with id: %s and a length of: %d", qs.KMS.kmsName, qm.Address(), req.GetKeyBulk().GetKeyId(), req.GetKeyBulk().GetKeyLength())
 	return &pb.PushKeysResponse{Timestamp: time.Now().Unix()}, nil
diff --git a/goKMS/kms/store/kms-keystore.go b/goKMS/kms/store/kms-keystore.go
index ef1a5212aa1933dc2ca104d64b72412bfb879c94..1132e2478c4723e90b41284b52fc81debcfbb42f 100644
--- a/goKMS/kms/store/kms-keystore.go
+++ b/goKMS/kms/store/kms-keystore.go
@@ -6,6 +6,7 @@ import (
 	"sync"
 
 	etsi14 "code.fbi.h-da.de/danet/quant/etsi014/go/rest/etsi/client"
+	"code.fbi.h-da.de/danet/quant/goKMS/kms/event"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
 )
@@ -30,6 +31,7 @@ type KmsKeyStore struct {
 	keyStoreMutex sync.Mutex
 	keyStore      map[uuid.UUID]*KmsKSElement
 	KeySingleSize uint // the size of a single key, given as unit of bits
+	eventBus      *event.EventBus
 }
 
 func NewKmsKeyStore(desiredkeySingleSizeLength uint) *KmsKeyStore {
@@ -37,6 +39,7 @@ func NewKmsKeyStore(desiredkeySingleSizeLength uint) *KmsKeyStore {
 		// NOTE: could be useful to use something like a ordered map here
 		keyStore:      make(map[uuid.UUID]*KmsKSElement),
 		KeySingleSize: desiredkeySingleSizeLength,
+		eventBus:      event.NewEventBus(),
 	}
 }
 
@@ -47,7 +50,7 @@ func (ks *KmsKeyStore) Length() int {
 	return len(ks.keyStore)
 }
 
-func (ks *KmsKeyStore) AddKey(keyId uuid.UUID, keyToadd []byte) error {
+func (ks *KmsKeyStore) AddKey(keyId uuid.UUID, keyToAdd []byte) error {
 	ks.keyStoreMutex.Lock()
 	defer ks.keyStoreMutex.Unlock()
 
@@ -58,11 +61,45 @@ func (ks *KmsKeyStore) AddKey(keyId uuid.UUID, keyToadd []byte) error {
 
 	newKeyElement := &KmsKSElement{
 		KeyID:  keyId,
-		Key:    keyToadd,
+		Key:    keyToAdd,
 		Status: AVAILABLE,
 	}
 	// ok to add
 	ks.keyStore[newKeyElement.KeyID] = newKeyElement
+
+	// publish to eventBus
+	go func() {
+		err := ks.eventBus.Publish(event.NewKeyStoreEvent())
+		if err != nil {
+			log.Errorf("Publishing a key store update through the eventBus failed, err: %s", err)
+		}
+	}()
+	return nil
+}
+
+func (ks *KmsKeyStore) AddKeys(keys map[uuid.UUID][]byte) error {
+	ks.keyStoreMutex.Lock()
+	defer ks.keyStoreMutex.Unlock()
+
+	// INFO: could be useful to also check for collisions
+
+	for keyId, keyToAdd := range keys {
+		newKeyElement := &KmsKSElement{
+			KeyID:  keyId,
+			Key:    keyToAdd,
+			Status: AVAILABLE,
+		}
+		// ok to add
+		ks.keyStore[newKeyElement.KeyID] = newKeyElement
+	}
+
+	// publish to eventBus
+	go func() {
+		err := ks.eventBus.Publish(event.NewKeyStoreEvent())
+		if err != nil {
+			log.Errorf("Publishing a key store update through the eventBus failed, err: %s", err)
+		}
+	}()
 	return nil
 }
 
@@ -100,6 +137,14 @@ func (ks *KmsKeyStore) DeleteKey(keyId uuid.UUID) {
 	ks.keyStoreMutex.Lock()
 	defer ks.keyStoreMutex.Unlock()
 	delete(ks.keyStore, keyId)
+
+	// publish to eventBus
+	go func() {
+		err := ks.eventBus.Publish(event.NewKeyStoreEvent())
+		if err != nil {
+			log.Errorf("Publishing a key store update through the eventBus failed, err: %s", err)
+		}
+	}()
 }
 
 func (ks *KmsKeyStore) Reset() {
@@ -109,6 +154,7 @@ func (ks *KmsKeyStore) Reset() {
 }
 
 func AddETSIKeysToKeystore(keyStore *KmsKeyStore, keyContainer []etsi14.KeyContainerKeysInner) error {
+	keysToAdd := make(map[uuid.UUID][]byte)
 	for _, keyItem := range keyContainer {
 		// decode base64 encoded key string
 		key, err := base64.StdEncoding.DecodeString(keyItem.GetKey())
@@ -119,10 +165,11 @@ func AddETSIKeysToKeystore(keyStore *KmsKeyStore, keyContainer []etsi14.KeyConta
 		if err != nil {
 			return err
 		}
-		// add to keystore
-		if err := keyStore.AddKey(keyId, key); err != nil {
-			log.Error(err)
-		}
+		keysToAdd[keyId] = key
+	}
+	// add to keystore
+	if err := keyStore.AddKeys(keysToAdd); err != nil {
+		log.Error(err)
 	}
 	log.Debugf("Current key store length: %d", keyStore.Length())
 	return nil