diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go
index 54c2d55efe2e8a2b9914f1ea46871f0ca9d71924..298803804f7a43bfbd7abf021a5b7c792d6f6c55 100644
--- a/applications/rtdt-manager/main.go
+++ b/applications/rtdt-manager/main.go
@@ -24,6 +24,8 @@ func main() {
 	var user string
 	var topology_file string
 	var withTwin bool
+	var benchmark bool
+
 	flag.StringVar(&address, "address", "172.100.0.5:55055", "Address of the gosdn controller")
 	flag.StringVar(&address, "a", "172.100.0.5:55055", "Address of the gosdn controller (shorthand)")
 	flag.StringVar(&pass, "password", "TestPassword", "Password for admin user")
@@ -33,6 +35,8 @@ func main() {
 	flag.BoolVar(&withTwin, "with-twin", false, "Whether to start a twin")
 	flag.StringVar(&topology_file, "topology", "data/clab.yaml", "Containerlab file on the basis of which to create topo")
 	flag.StringVar(&topology_file, "t", "data/clab.yaml", "Containerlab file on the basis of which to create topo (shorthand)")
+	flag.BoolVar(&benchmark, "benchmark", false, "Run performance tests (measure propagation delay)")
+	flag.BoolVar(&benchmark, "b", false, "Run performance tests (measure propagation delay)")
 
 	flag.Usage = func() {
 		fmt.Println("--address, -a: Address of the gosdn controller (realnet)")
@@ -63,6 +67,12 @@ func main() {
 		fmt.Printf("Error occured while initializing event system: %v", err)
 		return
 	}
+	// Do performance tests of realnet before starting twin
+	if benchmark {
+		fmt.Println("Now doing performance measurements of gosdn's propagation delay ")
+		rtdtMan.RunBenchmark()
+	}
+
 	if withTwin {
 		rtdtMan.LaunchTwin("172.101.0.0/16", "2001:db9::/64", "TEST-TWIN")
 	}
diff --git a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
index 10d96bde226cfa8484def426b5fe0ee997bde76a..e25f216d0d22f226e114232341ef2dd25db9d63c 100644
--- a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
+++ b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
@@ -5,8 +5,10 @@ import (
 	"os"
 	"path/filepath"
 	"regexp"
+	"strconv"
 	"strings"
 	"sync"
+	"time"
 
 	"code.fbi.h-da.de/danet/gosdn/application-framework/event"
 
@@ -62,6 +64,30 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string
 	return nil
 }
 
+// Performance benchmarks of realnet
+func (r *RtdtManager) RunBenchmark() error {
+	var mneid string
+	for _, node := range r.realnet.GetTopology().Nodes {
+		if strings.HasPrefix(node.Name, "gnmi-target-switch0") {
+			mneid = node.ID
+		}
+	}
+	numTests := int64(200)
+	results := make([]time.Duration, numTests)
+	// Change a property and measure the time when it's applied
+	for i, value := 0, int64(2001); i < int(numTests); i, value = i+1, value+1 {
+		t1 := time.Now()
+		r.realnet.SetGnmiPath("/interfaces/interface[name=eth2]/config/mtu", strconv.FormatInt(value, 10), mneid, false)
+		timeDiff := time.Now().Sub(t1)
+		results[i] = timeDiff
+	}
+
+	for i, res := range results {
+		fmt.Printf("%d - %v\n", i, res)
+	}
+	return nil
+}
+
 // Run realnet and twins (if present) until signal received, manage clean up
 func (r *RtdtManager) Run() error {
 	if r.realnet == nil {
@@ -185,11 +211,11 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) {
 			}
 		}
 
-        // MTU Change
+		// MTU Change
 		if strings.HasPrefix(path, prefix) && strings.HasSuffix(path, suffixMTU) {
 			fmt.Println("--- CHANGE MTU TRIGGERED ---")
 			fmt.Println("Value of new MTU: ", value)
-			twin.SetGnmiPath(path, value, twinEntityID)
+			twin.SetGnmiPath(path, value, twinEntityID, false)
 		}
 		// Hostname change
 		if strings.HasPrefix(path, prefixHostname) {
@@ -200,7 +226,7 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) {
 					continue
 				}
 				fmt.Println("ENTERING SETGNMIPATH, value: ", value, "path:", path)
-				twin.SetGnmiPath(path, value, twinEntityID)
+				twin.SetGnmiPath(path, value, twinEntityID, false)
 			}
 		}
 		// LINK UP/DOWN
@@ -215,7 +241,7 @@ func (r *RtdtManager) updateMNECallback(event *event.Event) {
 			} else {
 				value = "true"
 			}
-			twin.SetGnmiPath(path, value, twinEntityID)
+			twin.SetGnmiPath(path, value, twinEntityID, false)
 		}
 	}
 }
diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go
index 57d80f53dc9b3a7891b62c42f76a75f6b89143ca..3e3afee16c676ca97b4b817a7eb74e6f8206c343 100644
--- a/applications/rtdt-manager/venv/venv.go
+++ b/applications/rtdt-manager/venv/venv.go
@@ -38,6 +38,7 @@ type VEnv struct {
 	waitGroup            *sync.WaitGroup
 	topology             rtdt_topology.Topology
 	containerRegistryURL string
+    savedChanges         []*networkelement.ChangeRequest
 }
 
 // Accepts a yaml filename to deploy a container lab environment
@@ -231,7 +232,7 @@ func getTypedValue(value string) *gnmi.TypedValue {
 	}
 }
 
-func (v *VEnv) SetGnmiPath(path, value, mneid string) error {
+func (v *VEnv) SetGnmiPath(path, value, mneid string, save bool) error {
 	ctx := v.auth.CreateContextWithAuthorization()
 	fmt.Println("--IN SETGNMIPATH-----------------------")
 	mneService := networkelement.NewNetworkElementServiceClient(v.conn)
@@ -242,14 +243,14 @@ func (v *VEnv) SetGnmiPath(path, value, mneid string) error {
 	//gosdnAddr := v.auth.GetAddress()
 	gnmiVal := getTypedValue(value)
 
-	request := &networkelement.ChangeRequest{
+	changeRequest := &networkelement.ChangeRequest{
 		Mneid: mneid,
 		Path:  gnmiPath,
 		Value: gnmiVal,
 		ApiOp: networkelement.ApiOperation_API_OPERATION_UPDATE,
 	}
 
-	changeRequests := []*networkelement.ChangeRequest{request}
+	changeRequests := []*networkelement.ChangeRequest{changeRequest}
 
 	pid := v.pnd.Id
 	setPathResponse, err := mneService.SetPathList(ctx, &networkelement.SetPathListRequest{
@@ -281,6 +282,9 @@ func (v *VEnv) SetGnmiPath(path, value, mneid string) error {
 	} else {
 		fmt.Println("Successfully applied changes:", clResponse)
 	}
+    if save {
+        v.savedChanges = append(v.savedChanges, changeRequest)
+    }
 	return nil
 }