diff --git a/.gitlab/ci/.mk-docs-deploy.yml b/.gitlab/ci/.mk-docs-deploy.yml
index e465f465216e8faae42ee2cd1641ed09b71256e4..2814aea56da8dbaac0f57154253e3ba63e5cd2ea 100644
--- a/.gitlab/ci/.mk-docs-deploy.yml
+++ b/.gitlab/ci/.mk-docs-deploy.yml
@@ -1,5 +1,5 @@
 build-mkdocs:
-    image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/python:3.11.5-slim-bullseye
+    image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/python:3.11.5-slim-bookworm
     stage: build
     before_script:
         - pip install mkdocs-material
@@ -13,7 +13,7 @@ build-mkdocs:
         - if: $CI_COMMIT_REF_PROTECTED == "true"
 
 .pages-options: &pages-options
-    image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/python:3.11.5-slim-bullseye
+    image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/python:3.11.5-slim-bookworm
     stage: deploy
     script:
         - mv mkdocs-built public
diff --git a/application-framework/event/type.go b/application-framework/event/type.go
index a26631660a58546b28e9b1e36b5f6fa7816590c0..787076e5665565953fb9743934cc8279f724737f 100644
--- a/application-framework/event/type.go
+++ b/application-framework/event/type.go
@@ -12,6 +12,8 @@ const (
 	Update
 	// Delete is a delete event.
 	Delete
+	// Subscribe is a gNMI subscribe event.
+	Subscribe
 )
 
 // String implements the stringer interface for types.
@@ -23,6 +25,8 @@ func (t Type) String() string {
 		return "update"
 	case Delete:
 		return "delete"
+	case Subscribe:
+		return "subscribe"
 	}
 
 	return "unknown"
@@ -30,9 +34,10 @@ func (t Type) String() string {
 
 var (
 	typeLookup = map[string]Type{
-		"add":    Add,
-		"update": Update,
-		"delete": Delete,
+		"add":       Add,
+		"update":    Update,
+		"delete":    Delete,
+		"subscribe": Subscribe,
 	}
 )
 
diff --git a/applications/venv-manager/venv-manager.Dockerfile b/applications/venv-manager/venv-manager.Dockerfile
index 4df26553aeea1d1148c940fb0a4c343c95c6c972..a4f8cb9b0326b6200aa034c4801408eea551a07d 100644
--- a/applications/venv-manager/venv-manager.Dockerfile
+++ b/applications/venv-manager/venv-manager.Dockerfile
@@ -2,7 +2,7 @@ ARG GOLANG_VERSION=1.21
 ARG BUILDARGS
 ARG $GITLAB_PROXY=code.fbi.h-da.de:443/danet/dependency_proxy/containers
 
-FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bullseye AS builder
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm AS builder
 
 WORKDIR /gosdn
 
diff --git a/controller/controller.Dockerfile b/controller/controller.Dockerfile
index 398dc23946a6853b8bc3777476895d817fb2472d..978d84ce46d72bac716f4d4dbb6c057e1aea5cda 100644
--- a/controller/controller.Dockerfile
+++ b/controller/controller.Dockerfile
@@ -2,14 +2,14 @@ ARG GOLANG_VERSION=1.21
 ARG BUILDARGS
 ARG $GITLAB_PROXY
 
-FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bullseye as builder
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm as builder
 WORKDIR /gosdn/
 COPY . .
 RUN --mount=type=cache,target=/root/go/pkg/mod \
     --mount=type=cache,target=/root/.cache/go-build \
     make build-gosdn
 
-FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bullseye
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm
 WORKDIR /app/
 COPY --from=builder /gosdn/controller/configs/development-gosdn.toml.example ./configs/development-gosdn.toml
 COPY --from=builder /gosdn/controller/configs/containerlab-gosdn.toml.example ./configs/containerlab-gosdn.toml
diff --git a/controller/event/event.go b/controller/event/event.go
index df39d2b9a8c17b6074825fb05b079ee8d6096dae..bf74817d525b24674e865c3a215ad1608ff7ef2a 100644
--- a/controller/event/event.go
+++ b/controller/event/event.go
@@ -19,6 +19,9 @@ const (
 
 	// TypeDelete is a delete event.
 	TypeDelete = "delete"
+
+	// TypeSubscribe is a gNMI subscribe event.
+	TypeSubscribe = "subscribe"
 )
 
 // NewAddEvent creates a new add event.
@@ -48,12 +51,12 @@ func NewUpdateEvent(entityID uuid.UUID) Event {
 	}
 }
 
-// NewMneUpdateEvent creates a new update event for managed network elements.
-func NewMneUpdateEvent(entityID uuid.UUID, pathsAndValues map[string]string) Event {
+// NewGnmiSubscribeEvent creates a new gNMI subscribe event for managed network elements.
+func NewGnmiSubscribeEvent(entityID uuid.UUID, pathsAndValues map[string]string) Event {
 	return Event{
 		ID:                uuid.New(),
 		EntityID:          entityID,
-		Type:              TypeUpdate,
+		Type:              TypeSubscribe,
 		PathsAndValuesMap: pathsAndValues,
 	}
 }
diff --git a/controller/event/event_test.go b/controller/event/event_test.go
index 011c6a8ed9f342d3ff1f9fb947552a08c452f30c..8acfb3c5c52e31521364c2fef8bcfe2704e09b29 100644
--- a/controller/event/event_test.go
+++ b/controller/event/event_test.go
@@ -121,7 +121,7 @@ func TestNewUpdateEvent(t *testing.T) {
 	}
 }
 
-func TestNewMneUpdateEvent(t *testing.T) {
+func TestNewGnmiSubscribeEvent(t *testing.T) {
 	type args struct {
 		entityID          uuid.UUID
 		pathsAndValuesMap map[string]string
@@ -132,7 +132,7 @@ func TestNewMneUpdateEvent(t *testing.T) {
 		want Event
 	}{
 		{
-			name: "should create a new update event",
+			name: "should create a new subscribe event",
 			args: args{
 				entityID:          getTestEntityUUID(),
 				pathsAndValuesMap: map[string]string{"some/random/path": "val"},
@@ -140,25 +140,25 @@ func TestNewMneUpdateEvent(t *testing.T) {
 			want: Event{
 				ID:                uuid.New(),
 				EntityID:          getTestEntityUUID(),
-				Type:              TypeUpdate,
+				Type:              TypeSubscribe,
 				PathsAndValuesMap: map[string]string{"some/random/path": "val"},
 			},
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got := NewMneUpdateEvent(tt.args.entityID, tt.args.pathsAndValuesMap)
+			got := NewGnmiSubscribeEvent(tt.args.entityID, tt.args.pathsAndValuesMap)
 
 			if !reflect.DeepEqual(got.EntityID, tt.want.EntityID) {
-				t.Errorf("NewMneUpdateEvent().EntityID = %v, want %v", got, tt.want)
+				t.Errorf("NewGnmiSubscribeEvent().EntityID = %v, want %v", got, tt.want)
 			}
 
 			if !reflect.DeepEqual(got.Type, tt.want.Type) {
-				t.Errorf("NewMneUpdateEvent().Type = %v, want %v", got, tt.want)
+				t.Errorf("NewGnmiSubscribeEvent().Type = %v, want %v", got, tt.want)
 			}
 
 			if !reflect.DeepEqual(got.PathsAndValuesMap, tt.want.PathsAndValuesMap) {
-				t.Errorf("NewMneUpdateEvent().PathsAndValuesMap = %v, want %v", got, tt.want)
+				t.Errorf("NewGnmiSubscribeEvent().PathsAndValuesMap = %v, want %v", got, tt.want)
 			}
 		})
 	}
diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/networkElementService.go
index 32736bdbba65d0dc210985abdf7c9f0bebc9525e..a5fe2cac1dc846d731844c5a39998fd817f3340b 100644
--- a/controller/nucleus/networkElementService.go
+++ b/controller/nucleus/networkElementService.go
@@ -146,7 +146,7 @@ func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsS
 	}
 
 	// TODO (faseid): check if we want to add the paths with values here instead of empty map!
-	pubEvent := event.NewMneUpdateEvent(networkElementID, map[string]string{})
+	pubEvent := event.NewUpdateEvent(networkElementID)
 	if err := s.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			s.eventService.Reconnect()
@@ -169,7 +169,7 @@ func (s *NetworkElementService) Update(networkElementToUpdate networkelement.Net
 	}
 
 	// TODO (faseid): check if we want to add the paths with values here instead of empty map!
-	pubEvent := event.NewMneUpdateEvent(networkElementToUpdate.ID(), map[string]string{})
+	pubEvent := event.NewUpdateEvent(networkElementToUpdate.ID())
 	if err := s.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			s.eventService.Reconnect()
diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go
index 2102a969b9c8eafd681348dff5b6c48607e115dc..672574d90a8a18a1020ea7195119b3c2b6f208f9 100644
--- a/controller/nucleus/networkElementWatcher.go
+++ b/controller/nucleus/networkElementWatcher.go
@@ -201,7 +201,7 @@ func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.Subscrib
 		log.Errorf("Error trying to parse uuid, could not handle subscription response: %v", err)
 	}
 
-	pubEvent := event.NewMneUpdateEvent(mneID, pathsAndValues)
+	pubEvent := event.NewGnmiSubscribeEvent(mneID, pathsAndValues)
 	if err := n.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			n.eventService.Reconnect()
diff --git a/plugin-registry/plugin-registry.Dockerfile b/plugin-registry/plugin-registry.Dockerfile
index 92237ccb64354b7f5f13373024ac038b336ce4c0..6448d49d22ee5bcfdbfe0b7543b125457c93023c 100644
--- a/plugin-registry/plugin-registry.Dockerfile
+++ b/plugin-registry/plugin-registry.Dockerfile
@@ -2,7 +2,7 @@ ARG GOLANG_VERSION=1.21
 ARG BUILDARGS
 ARG $GITLAB_PROXY
 
-FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bullseye as builder
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm as builder
 WORKDIR /plugin-registry/
 RUN apt-get update
 RUN apt-get -y install --no-install-recommends zip
diff --git a/plugin-registry/plugin-registry.debug.Dockerfile b/plugin-registry/plugin-registry.debug.Dockerfile
index 4a930d69512e62668991045565d62b4077f9d286..827ec93033117838e9538899dcd9ab6d746c062d 100644
--- a/plugin-registry/plugin-registry.debug.Dockerfile
+++ b/plugin-registry/plugin-registry.debug.Dockerfile
@@ -2,7 +2,7 @@ ARG GOLANG_VERSION=1.21
 ARG BUILDARGS
 ARG $GITLAB_PROXY
 
-FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bullseye as builder
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm as builder
 WORKDIR /plugin-registry/
 RUN apt-get update
 RUN apt-get -y install --no-install-recommends zip