diff --git a/common/go/src/asapo_common/generated_proto/AsapoMonitoringCommonService.pb.go b/common/go/src/asapo_common/generated_proto/AsapoMonitoringCommonService.pb.go
index 88e6c8379675c7ddd76bec07d60a94f20602bacf..676fcbbbb432790879f8ea3041a047446c44f75f 100644
--- a/common/go/src/asapo_common/generated_proto/AsapoMonitoringCommonService.pb.go
+++ b/common/go/src/asapo_common/generated_proto/AsapoMonitoringCommonService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringCommonService.proto
 
 package generated_proto
diff --git a/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService.pb.go b/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService.pb.go
index be5733a6c8e31252d650dd8765ccbfd93b5e3d6a..57dd0daa844e5e52b15b68272baabc52241dfbfb 100644
--- a/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService.pb.go
+++ b/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringIngestService.proto
 
 package generated_proto
diff --git a/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService_grpc.pb.go b/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
index abe4edc729c568cc64d514a2b9f6bfaa3bcffe58..284fe6f9ba0087b91bb1e4f6fbb740222eed28f9 100644
--- a/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
+++ b/common/go/src/asapo_common/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.12.4
 // source: AsapoMonitoringIngestService.proto
 
 package generated_proto
@@ -18,6 +18,12 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName = "/AsapoMonitoringIngestService/InsertReceiverDataPoints"
+	AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName   = "/AsapoMonitoringIngestService/InsertBrokerDataPoints"
+	AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName      = "/AsapoMonitoringIngestService/InsertFtsDataPoints"
+)
+
 // AsapoMonitoringIngestServiceClient is the client API for AsapoMonitoringIngestService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -37,7 +43,7 @@ func NewAsapoMonitoringIngestServiceClient(cc grpc.ClientConnInterface) AsapoMon
 
 func (c *asapoMonitoringIngestServiceClient) InsertReceiverDataPoints(ctx context.Context, in *ReceiverDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertReceiverDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -46,7 +52,7 @@ func (c *asapoMonitoringIngestServiceClient) InsertReceiverDataPoints(ctx contex
 
 func (c *asapoMonitoringIngestServiceClient) InsertBrokerDataPoints(ctx context.Context, in *BrokerDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertBrokerDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -55,7 +61,7 @@ func (c *asapoMonitoringIngestServiceClient) InsertBrokerDataPoints(ctx context.
 
 func (c *asapoMonitoringIngestServiceClient) InsertFtsDataPoints(ctx context.Context, in *FtsToConsumerDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertFtsDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -109,7 +115,7 @@ func _AsapoMonitoringIngestService_InsertReceiverDataPoints_Handler(srv interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertReceiverDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertReceiverDataPoints(ctx, req.(*ReceiverDataPointContainer))
@@ -127,7 +133,7 @@ func _AsapoMonitoringIngestService_InsertBrokerDataPoints_Handler(srv interface{
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertBrokerDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertBrokerDataPoints(ctx, req.(*BrokerDataPointContainer))
@@ -145,7 +151,7 @@ func _AsapoMonitoringIngestService_InsertFtsDataPoints_Handler(srv interface{},
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertFtsDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertFtsDataPoints(ctx, req.(*FtsToConsumerDataPointContainer))
diff --git a/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService.pb.go b/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService.pb.go
index e5d6e3658c17ccc1e26a90815fb25542391e04ff..e2bb11836af257ea9fa01e39bbc592f2cad90764 100644
--- a/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService.pb.go
+++ b/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringQueryService.proto
 
 package generated_proto
@@ -902,8 +902,9 @@ type GroupDelayResponseItem struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	GroupId string `protobuf:"bytes,1,opt,name=groupId,proto3" json:"groupId,omitempty"`
-	DelayMs uint32 `protobuf:"varint,2,opt,name=delayMs,proto3" json:"delayMs,omitempty"`
+	GroupId      string `protobuf:"bytes,1,opt,name=groupId,proto3" json:"groupId,omitempty"`
+	DelayMs      uint32 `protobuf:"varint,2,opt,name=delayMs,proto3" json:"delayMs,omitempty"`
+	PipelineStep string `protobuf:"bytes,3,opt,name=pipelineStep,proto3" json:"pipelineStep,omitempty"`
 }
 
 func (x *GroupDelayResponseItem) Reset() {
@@ -952,6 +953,13 @@ func (x *GroupDelayResponseItem) GetDelayMs() uint32 {
 	return 0
 }
 
+func (x *GroupDelayResponseItem) GetPipelineStep() string {
+	if x != nil {
+		return x.PipelineStep
+	}
+	return ""
+}
+
 type GroupDelayResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1146,39 +1154,42 @@ var file_AsapoMonitoringQueryService_proto_rawDesc = []byte{
 	0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
 	0x70, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x65, 0x61, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c,
 	0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x65, 0x61, 0x6d, 0x74,
-	0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4c, 0x0a, 0x16, 0x47, 0x72, 0x6f,
+	0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x16, 0x47, 0x72, 0x6f,
 	0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49,
 	0x74, 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a,
 	0x07, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
-	0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x22, 0x49, 0x0a, 0x12, 0x47, 0x72, 0x6f, 0x75, 0x70,
-	0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a,
-	0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x17, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49,
-	0x64, 0x73, 0x2a, 0x5b, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f,
-	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64,
-	0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x51, 0x55, 0x45,
-	0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x78, 0x61,
-	0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x75, 0x73, 0x74,
-	0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x74, 0x65, 0x70, 0x10, 0x02, 0x32,
-	0xf0, 0x01, 0x0a, 0x1b, 0x41, 0x73, 0x61, 0x70, 0x6f, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
-	0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
-	0x2a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x06,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0b, 0x47,
-	0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x0d, 0x2e, 0x54, 0x6f, 0x70,
-	0x6c, 0x6f, 0x67, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x11, 0x2e, 0x54, 0x6f, 0x70, 0x6f,
-	0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38,
-	0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12,
-	0x10, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72,
-	0x79, 0x1a, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x47,
-	0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x10, 0x2e, 0x47, 0x72, 0x6f, 0x75,
-	0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x47, 0x72,
-	0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
-	0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0x49, 0x0a, 0x12, 0x47,
+	0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x33, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x67, 0x72,
+	0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x2a, 0x5b, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69,
+	0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72,
+	0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
+	0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a,
+	0x09, 0x45, 0x78, 0x61, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11,
+	0x4a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x74, 0x65,
+	0x70, 0x10, 0x02, 0x32, 0xf0, 0x01, 0x0a, 0x1b, 0x41, 0x73, 0x61, 0x70, 0x6f, 0x4d, 0x6f, 0x6e,
+	0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x12, 0x06, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x31, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x0d,
+	0x2e, 0x54, 0x6f, 0x70, 0x6c, 0x6f, 0x67, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x11, 0x2e,
+	0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69,
+	0x6e, 0x74, 0x73, 0x12, 0x10, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73,
+	0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e,
+	0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d,
+	0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x10, 0x2e,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a,
+	0x13, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x67, 0x65, 0x6e, 0x65,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService_grpc.pb.go b/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
index e8cf3493af77686d3d60aeca413274d400ae3cf7..1c4fdd70318ff725953fe3ee77dc23d80e648f8c 100644
--- a/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
+++ b/common/go/src/asapo_common/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.12.4
 // source: AsapoMonitoringQueryService.proto
 
 package generated_proto
@@ -18,6 +18,13 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	AsapoMonitoringQueryService_GetMetadata_FullMethodName   = "/AsapoMonitoringQueryService/GetMetadata"
+	AsapoMonitoringQueryService_GetTopology_FullMethodName   = "/AsapoMonitoringQueryService/GetTopology"
+	AsapoMonitoringQueryService_GetDataPoints_FullMethodName = "/AsapoMonitoringQueryService/GetDataPoints"
+	AsapoMonitoringQueryService_GetGroupDelay_FullMethodName = "/AsapoMonitoringQueryService/GetGroupDelay"
+)
+
 // AsapoMonitoringQueryServiceClient is the client API for AsapoMonitoringQueryService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -38,7 +45,7 @@ func NewAsapoMonitoringQueryServiceClient(cc grpc.ClientConnInterface) AsapoMoni
 
 func (c *asapoMonitoringQueryServiceClient) GetMetadata(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*MetadataResponse, error) {
 	out := new(MetadataResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetMetadata", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetMetadata_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -47,7 +54,7 @@ func (c *asapoMonitoringQueryServiceClient) GetMetadata(ctx context.Context, in
 
 func (c *asapoMonitoringQueryServiceClient) GetTopology(ctx context.Context, in *ToplogyQuery, opts ...grpc.CallOption) (*TopologyResponse, error) {
 	out := new(TopologyResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetTopology", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetTopology_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +63,7 @@ func (c *asapoMonitoringQueryServiceClient) GetTopology(ctx context.Context, in
 
 func (c *asapoMonitoringQueryServiceClient) GetDataPoints(ctx context.Context, in *DataPointsQuery, opts ...grpc.CallOption) (*DataPointsResponse, error) {
 	out := new(DataPointsResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -65,7 +72,7 @@ func (c *asapoMonitoringQueryServiceClient) GetDataPoints(ctx context.Context, i
 
 func (c *asapoMonitoringQueryServiceClient) GetGroupDelay(ctx context.Context, in *GroupDelayQuery, opts ...grpc.CallOption) (*GroupDelayResponse, error) {
 	out := new(GroupDelayResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetGroupDelay", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetGroupDelay_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -123,7 +130,7 @@ func _AsapoMonitoringQueryService_GetMetadata_Handler(srv interface{}, ctx conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetMetadata",
+		FullMethod: AsapoMonitoringQueryService_GetMetadata_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetMetadata(ctx, req.(*Empty))
@@ -141,7 +148,7 @@ func _AsapoMonitoringQueryService_GetTopology_Handler(srv interface{}, ctx conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetTopology",
+		FullMethod: AsapoMonitoringQueryService_GetTopology_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetTopology(ctx, req.(*ToplogyQuery))
@@ -159,7 +166,7 @@ func _AsapoMonitoringQueryService_GetDataPoints_Handler(srv interface{}, ctx con
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetDataPoints",
+		FullMethod: AsapoMonitoringQueryService_GetDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetDataPoints(ctx, req.(*DataPointsQuery))
@@ -177,7 +184,7 @@ func _AsapoMonitoringQueryService_GetGroupDelay_Handler(srv interface{}, ctx con
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetGroupDelay",
+		FullMethod: AsapoMonitoringQueryService_GetGroupDelay_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetGroupDelay(ctx, req.(*GroupDelayQuery))
diff --git a/common/networking/monitoring/AsapoMonitoringQueryService.proto b/common/networking/monitoring/AsapoMonitoringQueryService.proto
index 91d1c21d757ad6c7a9f963c448cf38542f2527c9..805d0a2bac148e380e6eadef107e43ebd6d8b917 100644
--- a/common/networking/monitoring/AsapoMonitoringQueryService.proto
+++ b/common/networking/monitoring/AsapoMonitoringQueryService.proto
@@ -116,6 +116,7 @@ message GroupDelayQuery {
 message GroupDelayResponseItem {
     string groupId = 1;
     uint32 delayMs = 2;
+    string pipelineStep = 3;
 }
     
 message GroupDelayResponse {
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringCommonService.pb.go b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringCommonService.pb.go
index 88e6c8379675c7ddd76bec07d60a94f20602bacf..676fcbbbb432790879f8ea3041a047446c44f75f 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringCommonService.pb.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringCommonService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringCommonService.proto
 
 package generated_proto
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService.pb.go b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService.pb.go
index be5733a6c8e31252d650dd8765ccbfd93b5e3d6a..57dd0daa844e5e52b15b68272baabc52241dfbfb 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService.pb.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringIngestService.proto
 
 package generated_proto
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService_grpc.pb.go b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
index abe4edc729c568cc64d514a2b9f6bfaa3bcffe58..284fe6f9ba0087b91bb1e4f6fbb740222eed28f9 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringIngestService_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.12.4
 // source: AsapoMonitoringIngestService.proto
 
 package generated_proto
@@ -18,6 +18,12 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName = "/AsapoMonitoringIngestService/InsertReceiverDataPoints"
+	AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName   = "/AsapoMonitoringIngestService/InsertBrokerDataPoints"
+	AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName      = "/AsapoMonitoringIngestService/InsertFtsDataPoints"
+)
+
 // AsapoMonitoringIngestServiceClient is the client API for AsapoMonitoringIngestService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -37,7 +43,7 @@ func NewAsapoMonitoringIngestServiceClient(cc grpc.ClientConnInterface) AsapoMon
 
 func (c *asapoMonitoringIngestServiceClient) InsertReceiverDataPoints(ctx context.Context, in *ReceiverDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertReceiverDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -46,7 +52,7 @@ func (c *asapoMonitoringIngestServiceClient) InsertReceiverDataPoints(ctx contex
 
 func (c *asapoMonitoringIngestServiceClient) InsertBrokerDataPoints(ctx context.Context, in *BrokerDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertBrokerDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -55,7 +61,7 @@ func (c *asapoMonitoringIngestServiceClient) InsertBrokerDataPoints(ctx context.
 
 func (c *asapoMonitoringIngestServiceClient) InsertFtsDataPoints(ctx context.Context, in *FtsToConsumerDataPointContainer, opts ...grpc.CallOption) (*Empty, error) {
 	out := new(Empty)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringIngestService/InsertFtsDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -109,7 +115,7 @@ func _AsapoMonitoringIngestService_InsertReceiverDataPoints_Handler(srv interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertReceiverDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertReceiverDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertReceiverDataPoints(ctx, req.(*ReceiverDataPointContainer))
@@ -127,7 +133,7 @@ func _AsapoMonitoringIngestService_InsertBrokerDataPoints_Handler(srv interface{
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertBrokerDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertBrokerDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertBrokerDataPoints(ctx, req.(*BrokerDataPointContainer))
@@ -145,7 +151,7 @@ func _AsapoMonitoringIngestService_InsertFtsDataPoints_Handler(srv interface{},
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringIngestService/InsertFtsDataPoints",
+		FullMethod: AsapoMonitoringIngestService_InsertFtsDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringIngestServiceServer).InsertFtsDataPoints(ctx, req.(*FtsToConsumerDataPointContainer))
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService.pb.go b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService.pb.go
index e5d6e3658c17ccc1e26a90815fb25542391e04ff..e2bb11836af257ea9fa01e39bbc592f2cad90764 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService.pb.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.31.0-devel
+// 	protoc        v3.12.4
 // source: AsapoMonitoringQueryService.proto
 
 package generated_proto
@@ -902,8 +902,9 @@ type GroupDelayResponseItem struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	GroupId string `protobuf:"bytes,1,opt,name=groupId,proto3" json:"groupId,omitempty"`
-	DelayMs uint32 `protobuf:"varint,2,opt,name=delayMs,proto3" json:"delayMs,omitempty"`
+	GroupId      string `protobuf:"bytes,1,opt,name=groupId,proto3" json:"groupId,omitempty"`
+	DelayMs      uint32 `protobuf:"varint,2,opt,name=delayMs,proto3" json:"delayMs,omitempty"`
+	PipelineStep string `protobuf:"bytes,3,opt,name=pipelineStep,proto3" json:"pipelineStep,omitempty"`
 }
 
 func (x *GroupDelayResponseItem) Reset() {
@@ -952,6 +953,13 @@ func (x *GroupDelayResponseItem) GetDelayMs() uint32 {
 	return 0
 }
 
+func (x *GroupDelayResponseItem) GetPipelineStep() string {
+	if x != nil {
+		return x.PipelineStep
+	}
+	return ""
+}
+
 type GroupDelayResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1146,39 +1154,42 @@ var file_AsapoMonitoringQueryService_proto_rawDesc = []byte{
 	0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
 	0x70, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x65, 0x61, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c,
 	0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x65, 0x61, 0x6d, 0x74,
-	0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4c, 0x0a, 0x16, 0x47, 0x72, 0x6f,
+	0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x16, 0x47, 0x72, 0x6f,
 	0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49,
 	0x74, 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a,
 	0x07, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
-	0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x22, 0x49, 0x0a, 0x12, 0x47, 0x72, 0x6f, 0x75, 0x70,
-	0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a,
-	0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x17, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49,
-	0x64, 0x73, 0x2a, 0x5b, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x6f,
-	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64,
-	0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x51, 0x55, 0x45,
-	0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x78, 0x61,
-	0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4a, 0x75, 0x73, 0x74,
-	0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x74, 0x65, 0x70, 0x10, 0x02, 0x32,
-	0xf0, 0x01, 0x0a, 0x1b, 0x41, 0x73, 0x61, 0x70, 0x6f, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
-	0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
-	0x2a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x06,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
-	0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0b, 0x47,
-	0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x0d, 0x2e, 0x54, 0x6f, 0x70,
-	0x6c, 0x6f, 0x67, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x11, 0x2e, 0x54, 0x6f, 0x70, 0x6f,
-	0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38,
-	0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12,
-	0x10, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72,
-	0x79, 0x1a, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x47,
-	0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x10, 0x2e, 0x47, 0x72, 0x6f, 0x75,
-	0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x47, 0x72,
-	0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
-	0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c,
+	0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70,
+	0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0x49, 0x0a, 0x12, 0x47,
+	0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x33, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x67, 0x72,
+	0x6f, 0x75, 0x70, 0x49, 0x64, 0x73, 0x2a, 0x5b, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69,
+	0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72,
+	0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44,
+	0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a,
+	0x09, 0x45, 0x78, 0x61, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11,
+	0x4a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x53, 0x74, 0x65,
+	0x70, 0x10, 0x02, 0x32, 0xf0, 0x01, 0x0a, 0x1b, 0x41, 0x73, 0x61, 0x70, 0x6f, 0x4d, 0x6f, 0x6e,
+	0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x12, 0x06, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x31, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x0d,
+	0x2e, 0x54, 0x6f, 0x70, 0x6c, 0x6f, 0x67, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x11, 0x2e,
+	0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69,
+	0x6e, 0x74, 0x73, 0x12, 0x10, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73,
+	0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e,
+	0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x0d,
+	0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x10, 0x2e,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a,
+	0x13, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x67, 0x65, 0x6e, 0x65,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService_grpc.pb.go b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
index e8cf3493af77686d3d60aeca413274d400ae3cf7..1c4fdd70318ff725953fe3ee77dc23d80e648f8c 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/generated_proto/AsapoMonitoringQueryService_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.12.4
 // source: AsapoMonitoringQueryService.proto
 
 package generated_proto
@@ -18,6 +18,13 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	AsapoMonitoringQueryService_GetMetadata_FullMethodName   = "/AsapoMonitoringQueryService/GetMetadata"
+	AsapoMonitoringQueryService_GetTopology_FullMethodName   = "/AsapoMonitoringQueryService/GetTopology"
+	AsapoMonitoringQueryService_GetDataPoints_FullMethodName = "/AsapoMonitoringQueryService/GetDataPoints"
+	AsapoMonitoringQueryService_GetGroupDelay_FullMethodName = "/AsapoMonitoringQueryService/GetGroupDelay"
+)
+
 // AsapoMonitoringQueryServiceClient is the client API for AsapoMonitoringQueryService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -38,7 +45,7 @@ func NewAsapoMonitoringQueryServiceClient(cc grpc.ClientConnInterface) AsapoMoni
 
 func (c *asapoMonitoringQueryServiceClient) GetMetadata(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*MetadataResponse, error) {
 	out := new(MetadataResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetMetadata", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetMetadata_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -47,7 +54,7 @@ func (c *asapoMonitoringQueryServiceClient) GetMetadata(ctx context.Context, in
 
 func (c *asapoMonitoringQueryServiceClient) GetTopology(ctx context.Context, in *ToplogyQuery, opts ...grpc.CallOption) (*TopologyResponse, error) {
 	out := new(TopologyResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetTopology", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetTopology_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +63,7 @@ func (c *asapoMonitoringQueryServiceClient) GetTopology(ctx context.Context, in
 
 func (c *asapoMonitoringQueryServiceClient) GetDataPoints(ctx context.Context, in *DataPointsQuery, opts ...grpc.CallOption) (*DataPointsResponse, error) {
 	out := new(DataPointsResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetDataPoints", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetDataPoints_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -65,7 +72,7 @@ func (c *asapoMonitoringQueryServiceClient) GetDataPoints(ctx context.Context, i
 
 func (c *asapoMonitoringQueryServiceClient) GetGroupDelay(ctx context.Context, in *GroupDelayQuery, opts ...grpc.CallOption) (*GroupDelayResponse, error) {
 	out := new(GroupDelayResponse)
-	err := c.cc.Invoke(ctx, "/AsapoMonitoringQueryService/GetGroupDelay", in, out, opts...)
+	err := c.cc.Invoke(ctx, AsapoMonitoringQueryService_GetGroupDelay_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -123,7 +130,7 @@ func _AsapoMonitoringQueryService_GetMetadata_Handler(srv interface{}, ctx conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetMetadata",
+		FullMethod: AsapoMonitoringQueryService_GetMetadata_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetMetadata(ctx, req.(*Empty))
@@ -141,7 +148,7 @@ func _AsapoMonitoringQueryService_GetTopology_Handler(srv interface{}, ctx conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetTopology",
+		FullMethod: AsapoMonitoringQueryService_GetTopology_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetTopology(ctx, req.(*ToplogyQuery))
@@ -159,7 +166,7 @@ func _AsapoMonitoringQueryService_GetDataPoints_Handler(srv interface{}, ctx con
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetDataPoints",
+		FullMethod: AsapoMonitoringQueryService_GetDataPoints_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetDataPoints(ctx, req.(*DataPointsQuery))
@@ -177,7 +184,7 @@ func _AsapoMonitoringQueryService_GetGroupDelay_Handler(srv interface{}, ctx con
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/AsapoMonitoringQueryService/GetGroupDelay",
+		FullMethod: AsapoMonitoringQueryService_GetGroupDelay_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AsapoMonitoringQueryServiceServer).GetGroupDelay(ctx, req.(*GroupDelayQuery))
diff --git a/monitoring/monitoring_server/src/asapo_monitoring_server/server/QueryServer.go b/monitoring/monitoring_server/src/asapo_monitoring_server/server/QueryServer.go
index e6f6ebed124dd7922308e03dfd7f08676e22500c..74caff6f1041ac7eaa4b96e54f310f096adf04f0 100644
--- a/monitoring/monitoring_server/src/asapo_monitoring_server/server/QueryServer.go
+++ b/monitoring/monitoring_server/src/asapo_monitoring_server/server/QueryServer.go
@@ -189,7 +189,7 @@ func GetRequestPeriods(fromTimestamp uint64, toTimestamp uint64, groupedInterval
 		intervalInSec = int(groupedInterval)
 		if toTimestamp < switchTime {
 			timeRangeAve = "start: " + startTime + ", stop: " + endTime
-			timeRange = ""
+			timeRange = "start: 0, stop: 1 "
 		} else {
 			timeRangeAve = "start: " + startTime + ", stop: " + strconv.FormatUint(switchTime, 10)
 			timeRange = "start: " + strconv.FormatUint(switchTime, 10) + ", stop: " + endTime
@@ -618,153 +618,97 @@ func (s *QueryServer) GetTopology(ctx context.Context, query *pb.ToplogyQuery) (
 		involvedReceivers map[string] /*receiver id*/ bool
 	}
 
-	// Simple algorithm
-	// Goes through each remainingStepIds and checks if all consumesSourceIds of this step is available
-	//    If all consuming sources are available
-	//      add it to the current level
-	//      add all connecting edges
-	//      and producing sources to availableSourcesInNextLevel
-	//    If not go to next step, which might produces this
-	// When an iteration of remainingStepIds is done:
-	//    Add all new producing sources to availableSources
-	//    Go to next level
-	remainingStepIds := map[string] /*pipelineStepId*/ bool{}
-	availableSources := map[string] /*sourceId*/ [] /* available from pipelineStepId */ string{}
-
-	for stepId, _ := range pipelineSteps {
-		remainingStepIds[stepId] = true
-	}
-
 	var levels [] /*levelDepth*/ [] /*verticalIdx*/ PipelineLevelStepInfo
 	var edges []PipelineEdgeInfo
 	var currentLevel = -1
-
-	for len(remainingStepIds) > 0 {
-		currentLevel++
-		levels = append(levels, []PipelineLevelStepInfo{})
-
-		var foundAtLeastOne = false
-		availableSourcesInNextLevel := map[string] /*sourceId*/ [] /* available from pipelineStepId */ string{}
-		for stepId := range remainingStepIds {
-			var allConsumingSourcesAvailable = true
-			for requiredSourceId := range pipelineSteps[stepId].consumesSourceId {
-				if _, sourceIsAvailable := availableSources[requiredSourceId]; !sourceIsAvailable { // Oh source is unavailable
-					allConsumingSourcesAvailable = false
-				} else {
-					// Verify that no other producer can create this source.
-					// Maybe we have to wait one or two steps until all producers are available
-					for stepId2 := range remainingStepIds {
-						if _, thereIsAnotherProducer := pipelineSteps[stepId2].producesSourceId[requiredSourceId]; thereIsAnotherProducer {
-							if stepId == stepId2 {
-								continue // The pipeline has self reference?! allow it
-							}
-							allConsumingSourcesAvailable = false
-						}
-					}
-				}
-				if !allConsumingSourcesAvailable {
-					break // We don't even need to try the other options
+	var unkStep = "Unknown"
+	var addUnknownStep = false
+	unknownSources := map[string] /*sourceId*/ bool{}
+	// Loop over all consumers of all pipeline steps
+	for inStepId := range pipelineSteps {
+		for requiredSourceId := range pipelineSteps[inStepId].consumesSourceId {
+			// Search for existing producer for given consumer
+			// Create edge ifprodures is found
+			var producerFound = false
+			for outStepId := range pipelineSteps {
+				if pipelineSteps[outStepId].producesSourceId[requiredSourceId] {
+					edges = append(edges, PipelineEdgeInfo{
+						fromStepId:        outStepId,
+						toStepId:          inStepId,
+						sourceId:          requiredSourceId,
+						involvedReceivers: pipelineSteps[outStepId].involvedReceivers,
+					})
+					producerFound = true
 				}
 			}
-
-			if allConsumingSourcesAvailable {
-				foundAtLeastOne = true
-				stepInfo := pipelineSteps[stepId]
-
-				// Add edge connection
-				for consumingSourceId := range stepInfo.consumesSourceId {
-					if stepInfo.producesSourceId[consumingSourceId] { // Add self reference edge
-						edges = append(edges, PipelineEdgeInfo{
-							fromStepId:        stepId,
-							toStepId:          stepId,
-							sourceId:          consumingSourceId,
-							involvedReceivers: stepInfo.involvedReceivers,
-						})
-					}
-					for _, sourceIdAvailableFromStepId := range availableSources[consumingSourceId] { // Add all the others edges
-						var producingSource = pipelineSteps[sourceIdAvailableFromStepId]
-						edges = append(edges, PipelineEdgeInfo{
-							fromStepId:        sourceIdAvailableFromStepId,
-							toStepId:          stepId,
-							sourceId:          consumingSourceId,
-							involvedReceivers: producingSource.involvedReceivers,
-						})
-					}
-				}
-
-				// prepare sources for next level
-				for sourceId := range stepInfo.producesSourceId {
-					if _, sourceIsAvailable := availableSourcesInNextLevel[sourceId]; !sourceIsAvailable {
-						availableSourcesInNextLevel[sourceId] = nil
-					}
-
-					availableSourcesInNextLevel[sourceId] = append(availableSourcesInNextLevel[sourceId], stepId)
-				}
-
-				levels[currentLevel] = append(levels[currentLevel], PipelineLevelStepInfo{
-					stepId: stepId,
+			// Create edge with Unknown pipeline step is not found
+			if !producerFound {
+				addUnknownStep = true
+				unknownSources[requiredSourceId] = true
+				edges = append(edges, PipelineEdgeInfo{
+					fromStepId:        unkStep,
+					toStepId:          inStepId,
+					sourceId:          requiredSourceId,
+					involvedReceivers: nil,
 				})
-
-				delete(remainingStepIds, stepId)
 			}
 		}
+	}
+	if addUnknownStep {
+		pipelineSteps[unkStep] = PipelineStep{
+			producesSourceId:  nil,
+			consumesSourceId:  nil,
+			producerInstances: nil,
+			consumerInstances: nil,
+			involvedReceivers: nil,
+		}
+	}
 
-		if !foundAtLeastOne {
-			// probably only requests of files came, but no receiver registered a producer
-			// log.Error("infinite loop while building topology tree; Still has pipeline steps but found no way how to connect them")
-			// return nil, errors.New("infinite loop while building topology tree; Still has pipeline steps but found no way how to connect them")
-
-			var unkStep = "Unknown"
-
-			pipelineSteps[unkStep] = PipelineStep{
-				producesSourceId:  nil,
-				consumesSourceId:  nil,
-				producerInstances: nil,
-				consumerInstances: nil,
-				involvedReceivers: nil,
-			}
+	// Define node dependencies
+	remainingStepIds := map[string] /*pipelineStepId*/ bool{}
+	availableSources := map[string] /*sourceId*/ bool{}
+	for stepId, _ := range pipelineSteps {
+		remainingStepIds[stepId] = true
+	}
 
-			levels[0] = append(levels[0], PipelineLevelStepInfo{
-				stepId: unkStep,
-			})
+	// limit of 10 levels is given to avoid stuck in case of bug
+	for len(remainingStepIds) > 0 && currentLevel < 10 {
+		currentLevel++
+		levels = append(levels, []PipelineLevelStepInfo{})
+		currentSources := map[string]bool{}
+		for stepId := range remainingStepIds {
 
-			if len(levels) < 2 {
-				levels = append(levels, []PipelineLevelStepInfo{})
+			// If not, check if at this level all sources are already available
+			var allAvailable = true
+			for consumerSource, _ := range pipelineSteps[stepId].consumesSourceId {
+				if !availableSources[consumerSource] && !pipelineSteps[stepId].producesSourceId[consumerSource] {
+					allAvailable = false
+				}
 			}
+			if allAvailable {
 
-			for stepId := range remainingStepIds {
-				var step = pipelineSteps[stepId]
-				levels[1] = append(levels[1], PipelineLevelStepInfo{
+				levels[currentLevel] = append(levels[currentLevel], PipelineLevelStepInfo{
 					stepId: stepId,
 				})
-
-				for sourceId := range step.consumesSourceId {
-					edges = append(edges, PipelineEdgeInfo{
-						fromStepId:        unkStep,
-						toStepId:          stepId,
-						sourceId:          sourceId,
-						involvedReceivers: nil,
-					})
+				// Add all receiver of given pipeline step to current available sources
+				for sourceId := range pipelineSteps[stepId].producesSourceId {
+					currentSources[sourceId] = true
 				}
+				delete(remainingStepIds, stepId)
 			}
-
-			break // Go to response building
 		}
-
-		for sourceId, element := range availableSourcesInNextLevel {
-			if _, sourceIsAvailable := availableSources[sourceId]; !sourceIsAvailable {
-				availableSources[sourceId] = nil
-			}
-
-			for _, newSource := range element {
-				availableSources[sourceId] = append(availableSources[sourceId], newSource)
+		if currentLevel == 0 {
+			for source, _ := range unknownSources {
+				availableSources[source] = true
 			}
 		}
+		for source, _ := range currentSources {
+			availableSources[source] = true
+		}
 	}
 
 	// Response building
 	var response pb.TopologyResponse
-
 	for levelIndex, level := range levels {
 		for _, node := range level {
 			var producers []string = nil
@@ -818,11 +762,11 @@ func (s *QueryServer) GetGroupDelay(ctx context.Context, query *pb.GroupDelayQue
 
 	result, err := s.dbQueryApi.Query(ctx, "from(bucket: \""+s.settings.InfluxDbDatabase+"\")"+
 		" |> range(start: "+startTime+", stop: "+endTime+")"+
-		" |> filter(fn: (r) => r._measurement == \""+dbMeasurementBrokerFileRequests+"\""+" and r.brokerCommand == \"next\")"+
+		" |> filter(fn: (r) => r._measurement == \""+dbMeasurementBrokerFileRequests+"\""+" )"+
 		" |> filter(fn: (r) => r.beamtime == \""+query.BeamtimeFilter+"\" and r._field == \"delayMs\")"+
 		" |> group(columns: [\"groupId\"])"+
 		" |> last()"+
-		" |> keep(columns: [\"groupId\", \"_value\"])"+
+		" |> keep(columns: [\"groupId\", \"_value\", \"pipelineStepId\"])"+
 		" |> group()",
 	)
 	if err != nil {
@@ -831,10 +775,15 @@ func (s *QueryServer) GetGroupDelay(ctx context.Context, query *pb.GroupDelayQue
 
 	response := pb.GroupDelayResponse{}
 	for result.Next() {
-		if result.Record().Values()["groupId"] != nil && result.Record().Value() != nil {
+		if result.Record().Value() != nil && result.Record().Values()["pipelineStepId"] != nil {
+			groupId := result.Record().Values()["groupId"]
+			if groupId == nil {
+				groupId = ""
+			}
 			item := pb.GroupDelayResponseItem{
-				GroupId: result.Record().Values()["groupId"].(string),
-				DelayMs: (uint32)(result.Record().Value().(int64)),
+				GroupId:      groupId.(string),
+				DelayMs:      (uint32)(result.Record().Value().(int64)),
+				PipelineStep: result.Record().Values()["pipelineStepId"].(string),
 			}
 			response.GroupIds = append(response.GroupIds, &item)
 		}
diff --git a/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.d.ts b/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.d.ts
index c267fcff9f90510eaade72e893e3944319d3a7f7..5118aceb067a5f31fdf0690dbae663d6e19caab8 100644
--- a/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.d.ts
+++ b/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.d.ts
@@ -25,8 +25,8 @@ export class DataPointsQuery extends jspb.Message {
   getTopipelinestepfilter(): string;
   setTopipelinestepfilter(value: string): DataPointsQuery;
 
-  getPipelinequerymode(): PipelineConnectionQueryMode;
-  setPipelinequerymode(value: PipelineConnectionQueryMode): DataPointsQuery;
+  getPipelinequerymode(): ipelineConnectionQueryMode;
+  setPipelinequerymode(value: ipelineConnectionQueryMode): DataPointsQuery;
 
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): DataPointsQuery.AsObject;
@@ -45,7 +45,7 @@ export namespace DataPointsQuery {
     receiverfilter: string,
     frompipelinestepfilter: string,
     topipelinestepfilter: string,
-    pipelinequerymode: PipelineConnectionQueryMode,
+    pipelinequerymode: ipelineConnectionQueryMode,
   }
 }
 
@@ -378,6 +378,9 @@ export class GroupDelayResponseItem extends jspb.Message {
   getDelayms(): number;
   setDelayms(value: number): GroupDelayResponseItem;
 
+  getPipelinestep(): string;
+  setPipelinestep(value: string): GroupDelayResponseItem;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): GroupDelayResponseItem.AsObject;
   static toObject(includeInstance: boolean, msg: GroupDelayResponseItem): GroupDelayResponseItem.AsObject;
@@ -390,6 +393,7 @@ export namespace GroupDelayResponseItem {
   export type AsObject = {
     groupid: string,
     delayms: number,
+    pipelinestep: string,
   }
 }
 
diff --git a/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.js b/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.js
index c3820257486ee969d9b75544777c1f81e48adaa3..350bb433317743a3062a3a21a75bc056365ca041 100644
--- a/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.js
+++ b/monitoring/monitoring_ui/src/generated_proto/AsapoMonitoringQueryService_pb.js
@@ -3158,7 +3158,8 @@ proto.GroupDelayResponseItem.prototype.toObject = function(opt_includeInstance)
 proto.GroupDelayResponseItem.toObject = function(includeInstance, msg) {
   var f, obj = {
     groupid: jspb.Message.getFieldWithDefault(msg, 1, ""),
-    delayms: jspb.Message.getFieldWithDefault(msg, 2, 0)
+    delayms: jspb.Message.getFieldWithDefault(msg, 2, 0),
+    pipelinestep: jspb.Message.getFieldWithDefault(msg, 3, "")
   };
 
   if (includeInstance) {
@@ -3203,6 +3204,10 @@ proto.GroupDelayResponseItem.deserializeBinaryFromReader = function(msg, reader)
       var value = /** @type {number} */ (reader.readUint32());
       msg.setDelayms(value);
       break;
+    case 3:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setPipelinestep(value);
+      break;
     default:
       reader.skipField();
       break;
@@ -3246,6 +3251,13 @@ proto.GroupDelayResponseItem.serializeBinaryToWriter = function(message, writer)
       f
     );
   }
+  f = message.getPipelinestep();
+  if (f.length > 0) {
+    writer.writeString(
+      3,
+      f
+    );
+  }
 };
 
 
@@ -3285,6 +3297,24 @@ proto.GroupDelayResponseItem.prototype.setDelayms = function(value) {
 };
 
 
+/**
+ * optional string pipelineStep = 3;
+ * @return {string}
+ */
+proto.GroupDelayResponseItem.prototype.getPipelinestep = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.GroupDelayResponseItem} returns this
+ */
+proto.GroupDelayResponseItem.prototype.setPipelinestep = function(value) {
+  return jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
 
 /**
  * List of repeated fields within this message type.
diff --git a/monitoring/monitoring_ui/src/store/groupDelayStore.ts b/monitoring/monitoring_ui/src/store/groupDelayStore.ts
index 739f273a844b2e183578a148e4c142139122bc2c..55b22071a55dbcd104af0407a5e56320c12d1167 100644
--- a/monitoring/monitoring_ui/src/store/groupDelayStore.ts
+++ b/monitoring/monitoring_ui/src/store/groupDelayStore.ts
@@ -1,7 +1,7 @@
-import { reactive } from "vue";
-import { GroupDelayResponse } from "../generated_proto/AsapoMonitoringQueryService_pb";
-import { FixedTimeRange } from "../lib/TimeRange";
-import { timeStore } from "./timeStore";
+import {reactive} from "vue";
+import {GroupDelayResponse} from "../generated_proto/AsapoMonitoringQueryService_pb";
+import {FixedTimeRange} from "../lib/TimeRange";
+import {timeStore} from "./timeStore";
 
 export interface GroupDelayStoreState {
     lastUpdateRange: FixedTimeRange,
@@ -29,14 +29,16 @@ class GroupDelayStore {
         } else if (delayMs > 1000) {
             return Math.floor(delayMs / 1000).toString() + " secs"
         }
-        return "0."+delayMs.toString().padStart(3, '0')+" secs"
+        return "0." + delayMs.toString().padStart(3, '0') + " secs"
     }
 
     public parseServerResponse(groupDelayData: GroupDelayResponse): void {
         const newGroupIds: string[] = [];
-        for(const groupId of groupDelayData.getGroupidsList()) {
+        for (const groupId of groupDelayData.getGroupidsList()) {
             const value: string = groupId.getGroupid() + groupId.getDelayms()
-            newGroupIds.push( groupId.getGroupid().padEnd(25, '\xa0') + this.beautifyDelayMs(groupId.getDelayms()) )
+            newGroupIds.push(groupId.getGroupid().padEnd(25, '\xa0') +
+                groupId.getPipelinestep().padEnd(25, '\xa0') +
+                this.beautifyDelayMs(groupId.getDelayms()))
         }
 
         this.internalState.GroupIdList = newGroupIds
@@ -47,9 +49,9 @@ class GroupDelayStore {
 
     public couldBeOutdated(): boolean {
         const maxDelayOldnessInSec = 5;
-        
-        return  Math.abs(this.internalState.lastUpdateRange.fromUnixSec - timeStore.state.lastFixedTimeRange.fromUnixSec) > maxDelayOldnessInSec ||
-                Math.abs(this.internalState.lastUpdateRange.toUnixSec - timeStore.state.lastFixedTimeRange.toUnixSec) > maxDelayOldnessInSec
+
+        return Math.abs(this.internalState.lastUpdateRange.fromUnixSec - timeStore.state.lastFixedTimeRange.fromUnixSec) > maxDelayOldnessInSec ||
+            Math.abs(this.internalState.lastUpdateRange.toUnixSec - timeStore.state.lastFixedTimeRange.toUnixSec) > maxDelayOldnessInSec
     }
 }
 
diff --git a/monitoring/monitoring_ui/src/views/Dashboard.vue b/monitoring/monitoring_ui/src/views/Dashboard.vue
index 2a6e532120c4d86210d3ee8bd1e07448c1f9ee02..ad0630f58bace393df1057bc49d955771154be00 100644
--- a/monitoring/monitoring_ui/src/views/Dashboard.vue
+++ b/monitoring/monitoring_ui/src/views/Dashboard.vue
@@ -29,7 +29,7 @@
                         ]}" />
                     <GenericListChart class="inline-flex" label="Producers" :elements="involvedProducers" />
                     <GenericListChart class="inline-flex" label="Consumers" :elements="involvedConsumers" />
-                    <GenericListChart class="inline-flex" label="Group IDs" :elements="involvedGroupIds" />
+                    <GenericListChart class="inline-flex" style="width: 100%" label="Group IDs, Pipeline steps, Delay time" :elements="involvedGroupIds" />
                 </div>
                 
                 <h2 class="ml-1 mt-2">Advanced stats</h2>