diff --git a/Makefile b/Makefile
index cae9f0788740df7a2f668eddabee10431c845aca..faf46fc1aa63506f41a1090170c628858edc6e67 100644
--- a/Makefile
+++ b/Makefile
@@ -103,6 +103,9 @@ build-hostname-checker-app: pre
 build-basic-interface-monitoring-app: pre
 	$(GOBUILD) -trimpath -o $(BUILD_ARTIFACTS_PATH)/basic-interface-monitoring ./applications/basic-interface-monitoring
 
+build-ws-events-app: pre
+	$(GOBUILD) -trimpath -o $(BUILD_ARTIFACTS_PATH)/ws-events ./applications/ws-events
+
 containerize-all: containerize-gosdn containerize-gosdnc containerize-plugin-registry containerize-target
 
 containerize-slim: containerize-gosdn containerize-gosdnc containerize-plugin-registry
@@ -131,6 +134,9 @@ containerize-arista-routing-engine-app:
 containerize-hostname-checker-app:
 	docker buildx build --rm -t hostname-checker-app -f applications/hostname-checker/hostname-checker.Dockerfile .
 
+containerize-ws-events-app:
+	docker buildx build --rm -t ws-events-app -f applications/ws-events/ws-events.Dockerfile .
+
 containerlab-start: create-clab-dir containerize-all
 	cd $(CLAB_DIR) &&\
 	sudo containerlab deploy --topo $(MAKEFILE_DIR)dev_env_data/clab/gosdn.clab.yaml
diff --git a/applications/ws-events/app.go b/applications/ws-events/app.go
new file mode 100644
index 0000000000000000000000000000000000000000..6660b9d7dc5832674a445e7bfef99991fb23a98f
--- /dev/null
+++ b/applications/ws-events/app.go
@@ -0,0 +1,62 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+
+	"code.fbi.h-da.de/danet/gosdn/application-framework/event"
+	"github.com/lesismal/nbio/nbhttp"
+	"github.com/sirupsen/logrus"
+)
+
+// Application is an example for a sdn application.
+type Application struct {
+	eventService event.ServiceInterface
+	stopChannel  chan os.Signal
+}
+
+// Run runs the application.
+func (a *Application) Run() {
+	signal.Notify(a.stopChannel, os.Interrupt, syscall.SIGTERM)
+
+	a.eventService.SubscribeToEventType([]event.TypeToCallbackTuple{
+		{Type: event.Add, Callback: a.callback},
+		{Type: event.Delete, Callback: a.callback},
+		{Type: event.Update, Callback: a.callback},
+	})
+	a.eventService.SetupEventReciever(a.stopChannel)
+
+	mux := &http.ServeMux{}
+	mux.HandleFunc("/events", onWebsocket)
+
+	svr := nbhttp.NewServer(nbhttp.Config{
+		Network: "tcp",
+		Addrs:   []string{"localhost:80"},
+		Handler: mux,
+	})
+
+	err := svr.Start()
+	if err != nil {
+		fmt.Printf("Server start failed: %v\n", err)
+		return
+	}
+
+	<-a.stopChannel
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
+	defer cancel()
+	svr.Shutdown(ctx)
+}
+
+func (a *Application) callback(event *event.Event) {
+	b, err := json.Marshal(event)
+	if err != nil {
+		logrus.Error("Failed marshal of event")
+	}
+	clientManager.Publish(b)
+}
diff --git a/applications/ws-events/main.go b/applications/ws-events/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..53ca1520d2d68918434565b58239abeee2ffb7fa
--- /dev/null
+++ b/applications/ws-events/main.go
@@ -0,0 +1,33 @@
+package main
+
+import (
+	"os"
+
+	"code.fbi.h-da.de/danet/gosdn/application-framework/event"
+	"code.fbi.h-da.de/danet/gosdn/application-framework/registration"
+	"github.com/sirupsen/logrus"
+)
+
+func main() {
+	queueCredentials, err := registration.Register("localhost:55055", "ws-events", "SecurePresharedToken")
+	if err != nil {
+		logrus.Errorf("failed to register application on control plane. %v", err)
+		os.Exit(1)
+	}
+
+	eventService, err := event.NewEventService(
+		queueCredentials,
+		[]event.Topic{event.ManagedNetworkElement},
+	)
+	if err != nil {
+		logrus.Errorf("failed to create event service. %v", err)
+		os.Exit(1)
+	}
+
+	app := &Application{
+		eventService: eventService,
+		stopChannel:  make(chan os.Signal, 1),
+	}
+
+	app.Run()
+}
diff --git a/applications/ws-events/ws-events.Dockerfile b/applications/ws-events/ws-events.Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..0aaf5a1d176923d0b720b322afb6b554520c95e8
--- /dev/null
+++ b/applications/ws-events/ws-events.Dockerfile
@@ -0,0 +1,16 @@
+ARG GOLANG_VERSION=1.20.5
+ARG BUILDARGS
+ARG $GITLAB_PROXY
+
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-alpine as builder
+WORKDIR /app/
+RUN apk add --no-cache build-base
+RUN apk add --no-cache bash
+COPY . .
+RUN --mount=type=cache,target=/root/go/pkg/mod \
+    --mount=type=cache,target=/root/.cache/go-build \
+    make build-ws-events-app
+
+FROM scratch
+COPY --from=builder /app/artifacts/ws-events /app/artifacts/ws-events
+ENTRYPOINT ["./artifacts/ws-events"]
diff --git a/applications/ws-events/ws-events.Dockerfile.dockerignore b/applications/ws-events/ws-events.Dockerfile.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..596599720f6a5e760fcc7d8c238b48603d52ae0d
--- /dev/null
+++ b/applications/ws-events/ws-events.Dockerfile.dockerignore
@@ -0,0 +1,29 @@
+.git
+.gitlab
+build
+documentation
+mocks
+test
+clab-gosdn_csbi_arista_base
+clab-gosdn_sts_demo_basic
+.cobra.yaml
+.dockeringore
+.gitlab-ci.yaml
+ARCHITECTURE.md
+CONTRIBUTING.md
+README.md
+artifacts
+build-tools
+cli
+config
+csbi
+dev_env_data
+docker_volume_backup
+docs
+documentation
+forks
+lab-vm
+models
+plugin-registry
+plugins
+scripts
diff --git a/applications/ws-events/ws.go b/applications/ws-events/ws.go
new file mode 100644
index 0000000000000000000000000000000000000000..8db7fba8c72ada9e2618d5624f48cffbcefcd709
--- /dev/null
+++ b/applications/ws-events/ws.go
@@ -0,0 +1,73 @@
+package main
+
+import (
+	"net/http"
+	"time"
+
+	"github.com/lesismal/nbio/nbhttp/websocket"
+	"github.com/sirupsen/logrus"
+	"golang.org/x/sync/errgroup"
+)
+
+var (
+	clientManager  = NewClientManager()
+	keepaliveTimer = time.Second * 30
+)
+
+type ClientManager struct {
+	clients map[*websocket.Conn]struct{}
+}
+
+func (cMngr *ClientManager) Register(client *websocket.Conn) {
+	cMngr.clients[client] = struct{}{}
+	logrus.Println("Added new client: ", client.RemoteAddr())
+}
+func (cMngr *ClientManager) Deregister(client *websocket.Conn) {
+	delete(cMngr.clients, client)
+	logrus.Println("Removed client: ", client.RemoteAddr())
+}
+func (cMngr *ClientManager) Publish(message []byte) {
+	var eg errgroup.Group
+	for c := range cMngr.clients {
+		eg.Go(func() error {
+			logrus.Println("Publishing to client", c.RemoteAddr())
+			return c.WriteMessage(websocket.TextMessage, message)
+		})
+		if err := eg.Wait(); err != nil {
+			logrus.Printf("Websocket failed to broadcast message to: %s, %v\n", c.Conn.RemoteAddr().String(), err)
+		}
+	}
+}
+func NewClientManager() *ClientManager {
+	return &ClientManager{
+		clients: make(map[*websocket.Conn]struct{}),
+	}
+}
+func newUpgrader() *websocket.Upgrader {
+	u := websocket.NewUpgrader()
+
+	u.OnOpen(func(c *websocket.Conn) {
+		clientManager.Register(c)
+	})
+
+	u.OnClose(func(c *websocket.Conn, err error) {
+		clientManager.Deregister(c)
+	})
+
+	u.OnMessage(func(c *websocket.Conn, messageType websocket.MessageType, data []byte) {
+		c.SetReadDeadline(time.Now().Add(keepaliveTimer))
+	})
+
+	return u
+}
+
+func onWebsocket(w http.ResponseWriter, r *http.Request) {
+	upgrader := newUpgrader()
+	conn, err := upgrader.Upgrade(w, r, nil)
+	if err != nil {
+		logrus.Println("Could not create websocket")
+		return
+	}
+
+	conn.SetReadDeadline(time.Now().Add(keepaliveTimer))
+}
diff --git a/go.mod b/go.mod
index 3a0804bc66fb89945af7cbb9ac0c8b4dc2e9a91d..426620beebbf5bea842f8592f6a4ccae801ffd95 100644
--- a/go.mod
+++ b/go.mod
@@ -86,7 +86,7 @@ require (
 	github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
 	github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
 	go.opencensus.io v0.24.0 // indirect
-	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa
+	golang.org/x/crypto v0.6.0
 	golang.org/x/net v0.8.0
 	golang.org/x/sys v0.8.0 // indirect
 	golang.org/x/term v0.8.0 // indirect
@@ -94,7 +94,10 @@ require (
 	gopkg.in/ini.v1 v1.67.0 // indirect
 )
 
-require github.com/hashicorp/go-plugin v1.4.5
+require (
+	github.com/hashicorp/go-plugin v1.4.5
+	github.com/lesismal/nbio v1.3.17
+)
 
 require (
 	atomicgo.dev/cursor v0.1.1 // indirect
@@ -104,6 +107,7 @@ require (
 	github.com/fatih/color v1.13.0 // indirect
 	github.com/hashicorp/go-hclog v1.2.0 // indirect
 	github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect
+	github.com/lesismal/llib v1.1.12 // indirect
 	github.com/lithammer/fuzzysearch v1.1.7 // indirect
 	github.com/mitchellh/go-testing-interface v1.0.0 // indirect
 	github.com/oklog/run v1.0.0 // indirect
diff --git a/go.sum b/go.sum
index 7c2894961d4e616db8961c1fd821c29b90dbcc5d..6ac79008559f766bd4932131097f913305f43499 100644
--- a/go.sum
+++ b/go.sum
@@ -327,8 +327,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
 github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
-github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v20.10.25+incompatible h1:URiHXOEOlhi6FS5U+YUE8YnsnZjIV3R+TFezL2ngdW0=
 github.com/docker/docker v20.10.25+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
@@ -386,7 +384,6 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
 github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
@@ -632,6 +629,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/lesismal/llib v1.1.12 h1:KJFB8bL02V+QGIvILEw/w7s6bKj9Ps9Px97MZP2EOk0=
+github.com/lesismal/llib v1.1.12/go.mod h1:70tFXXe7P1FZ02AU9l8LgSOK7d7sRrpnkUr3rd3gKSg=
+github.com/lesismal/nbio v1.3.17 h1:rsDwVdRfFK/QcFckDBgdGIZTf6Y98XWHRQWDY+EldO8=
+github.com/lesismal/nbio v1.3.17/go.mod h1:KWlouFT5cgDdW5sMX8RsHASUMGniea9X0XIellZ0B38=
 github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
 github.com/lithammer/fuzzysearch v1.1.7 h1:q8rZNmBIUkqxsxb/IlwsXVbCoPIH/0juxjFHY0UIwhU=
 github.com/lithammer/fuzzysearch v1.1.7/go.mod h1:ZhIlfRGxnD8qa9car/yplC6GmnM14CS07BYAKJJBK2I=
@@ -817,8 +818,6 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
-github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
 github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
 github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
 github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
@@ -897,8 +896,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -1080,12 +1077,13 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210513122933-cd7d49e622d5/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
-golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
+golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1175,6 +1173,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=