diff --git a/applications/rtdt-manager/main.go b/applications/rtdt-manager/main.go
index 77e6026e397a21de0fe2fd52c9d0b48153ddd3b1..fcd02133058ef724be327726dd3dffefc486dc7f 100644
--- a/applications/rtdt-manager/main.go
+++ b/applications/rtdt-manager/main.go
@@ -72,7 +72,7 @@ func main() {
 		fmt.Printf("Error occured while trying to upload realnet topology to DB: %v\n", err)
 		return
 	}
-	// Register realnet with rtdt-manager
+	// Register realnet with a new rtdt-manager
 	rtdtMan := RtdtMan.NewRtdtManager(realnet, &wg, &stopChan)
 	if rtdtMan == nil {
 		fmt.Println("Couldn't initialize rtdt-manager, quitting!")
diff --git a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
index 1f1cd17a379a4eeabd97af69cdc181fa5c507710..67a40db137e64a5e4564075208ed0b7abdb89a7e 100644
--- a/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
+++ b/applications/rtdt-manager/rtdt-manager/rtdt-manager.go
@@ -14,6 +14,7 @@ import (
 
 	"code.fbi.h-da.de/danet/gosdn/application-framework/registration"
 	clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config"
+	rtdt_topology "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/rtdt-topology"
 	"code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/venv"
 )
 
@@ -47,8 +48,19 @@ func (r *RtdtManager) LaunchTwin(twinSubnetIPv4, twinSubnetIPv6, twinName string
 	var derivedConfig *clabconfig.ClabConfig
 	var clabConfigPath string
 	var err error
+    var topo *rtdt_topology.Topology
+
+    topo = r.realnet.GetTopology()
+    if topo == nil {
+        return fmt.Errorf("Error: Couldn't get topology since it hasn't been retrieved from DB yet")
+    }
 	baseConfig := r.realnet.GetClabData()
 
+	// Instead of deriving config do the following:
+	// - retrieve topology for realnet from DB
+	// -
+
+	/// OOOOOLLLLDDD
 	if derivedConfig, err = clabconfig.DeriveConfig(baseConfig, twinSubnetIPv4, twinSubnetIPv6, twinName); err != nil {
 		return fmt.Errorf("Failed to derive config for twin: %w", err)
 	}
diff --git a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
index 46d75c2168661e9ea67d1ab29392dbb2a701a6d4..68dc231f23232cfb37bfaf3d953aaeace32ed7dd 100644
--- a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
+++ b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
@@ -1,9 +1,12 @@
 package rtdt_topology
 
 import (
+	"regexp"
+	"strings"
+
 	topoPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology"
+	clabconfig "code.fbi.h-da.de/danet/gosdn/applications/rtdt-manager/clab-config"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
-	"regexp"
 )
 
 // Struct definitions were taken from:
@@ -70,12 +73,12 @@ func (t *Topology) GetPortByUUID(UUID string) *Port {
 	return nil
 }
 func (t *Topology) GetLinkByUUID(UUID string) *Link {
-    for _, link := range t.Links {
-        if link.ID == UUID {
-            return link
-        }
-    }
-    return nil
+	for _, link := range t.Links {
+		if link.ID == UUID {
+			return link
+		}
+	}
+	return nil
 }
 
 // Source for function: "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/link.go"
@@ -120,6 +123,54 @@ func (n *Node) FillAllFields(containerRegistryURL string) {
 	n.Image = containerRegistryURL + n.Kind + ":" + dockerTag
 }
 
+func (t *Topology) ToYAML() *clabconfig.ClabConfig {
+	var yamlMgmt clabconfig.Mgmt
+	var yamlNodes map[string]clabconfig.Node
+	var yamlLinks []clabconfig.Link
+
+	// First get topology information, meaning gnmi-targets and hosts
+	for _, n := range t.Nodes {
+		// TODO This is very ugly, for now just fill in missing data based on name of node
+		var cmd string
+		var binds []string
+		var ports []string
+		var env map[string]string
+		var startupDelay int
+		switch {
+		case strings.Contains(n.Name, "gnmi-target"):
+			cmd = "start --ca_file /etc/gnmi-target/ssl/ca.crt --cert /etc/gnmi-target/ssl/certs/gnmi-target-selfsigned.crt --key /etc/gnmi-target/ssl/private/gnmi-target-selfsigned.key"
+			binds = []string{"../../../artifacts/ssl/gnmi-target", "/etc/gnmi-target/ssl"}
+			startupDelay = 5
+		case strings.Contains(n.Name, "gosdn"):
+			cmd = "--config /app/configs/containerlab-gosdn.toml"
+			binds = []string{"../../../artifacts/ssl/gosdn", "/app/ssl"}
+		}
+		node := clabconfig.Node{
+			Kind:         n.Kind,
+			Image:        n.Image,
+			Ports:        ports,
+			Cmd:          cmd,
+			MgmtIPv4:     n.MgmtIpv4,
+			Env:          env,
+			Binds:        binds,
+			StartupDelay: startupDelay,
+			Group:        "",
+		}
+		yamlNodes[n.Name] = node
+	}
+
+    // Now: Get configuration for environment (controller, rabbitmq, mongodb) somehow..
+
+	return &clabconfig.ClabConfig{
+		Name: "",
+		Mgmt: yamlMgmt,
+		Topology: clabconfig.Topology{
+			Nodes: yamlNodes,
+			Links: yamlLinks,
+		},
+	}
+}
+
 // Converter functions to convert between this and topoPb version of topology
 func (n *Node) Convert() *topoPb.Node {
 	return &topoPb.Node{
diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go
index d414651dabe1d3445847524d65ebe06984fd1cc6..ce5e4ce83eae06429682a6df3b972702736acf65 100644
--- a/applications/rtdt-manager/venv/venv.go
+++ b/applications/rtdt-manager/venv/venv.go
@@ -317,6 +317,11 @@ func (v *VEnv) UploadTopology() error {
 	return nil
 }
 
+// Topology doesn't give Kind, Image and MgmtIpv4
+// For Kind: could just set linux since we don't use arista switches
+// For Image: möp
+// For MgmtIpv4: Find some way to get it from realnet
+// Also TODO Should be possible to retrieve topology from realnet, so maybe put this in rtdt-manager
 func (v *VEnv) RetrieveTopology() error {
 	conn := v.auth.GetConn()
 	ctx := v.auth.CreateContextWithAuthorization()
@@ -332,14 +337,15 @@ func (v *VEnv) RetrieveTopology() error {
 		var n1 rtdt_topology.Node
 		if targetTopo.GetNodeByUUID(link.SourceNode.Id) == nil {
 			snode := link.SourceNode
-			n1 = rtdt_topology.Node{
+			n0 = rtdt_topology.Node{
 				ID:       snode.Id,
 				Name:     snode.Name,
 				Kind:     "todo",
 				Image:    "todo", // How to do this?
 				MgmtIpv4: "todo",
 			}
-			v.topology.Nodes = append(v.topology.Nodes, &n1)
+			n0.FillAllFields(v.containerRegistryURL)
+			v.topology.Nodes = append(v.topology.Nodes, &n0)
 		}
 		if targetTopo.GetNodeByUUID(link.TargetNode.Id) == nil {
 			tnode := link.TargetNode
@@ -350,17 +356,35 @@ func (v *VEnv) RetrieveTopology() error {
 				Image:    "todo", // How to do this?
 				MgmtIpv4: "todo",
 			}
+			n1.FillAllFields(v.containerRegistryURL)
 			v.topology.Nodes = append(v.topology.Nodes, &n1)
 		}
 		if targetTopo.GetLinkByUUID(link.Id) == nil {
+			var p0 rtdt_topology.Port
+			var p1 rtdt_topology.Port
+
+			if targetTopo.GetPortByUUID(link.SourcePort.Id) == nil {
+				p0 = rtdt_topology.Port{
+					Name: link.SourcePort.Name,
+					ID:   link.SourcePort.Id,
+				}
+			}
+			if targetTopo.GetPortByUUID(link.SourcePort.Id) == nil {
+				p1 = rtdt_topology.Port{
+					Name: link.TargetPort.Name,
+					ID:   link.TargetPort.Id,
+				}
+			}
 
 			var newLink = rtdt_topology.Link{
 				ID:         link.Id,
 				Name:       link.Name,
 				SourceNode: &n0,
 				TargetNode: &n1,
+				SourcePort: &p0,
+				TargetPort: &p1,
 			}
-            v.topology.Links = append(v.topology.Links, &newLink)
+			v.topology.Links = append(v.topology.Links, &newLink)
 		}
 	}
 
@@ -488,6 +512,7 @@ func (v *VEnv) GetWaitgroup() *sync.WaitGroup {
 func (v *VEnv) GetTopology() *rtdt_topology.Topology {
 	return v.topology
 }
+
 func (v *VEnv) GetSavedChanges() *[]*networkelement.ChangeRequest {
 	return &v.savedChanges
 }