diff --git a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
index 59458bae3c1a433bc43dcc9aec6bea1ac26c4156..46d75c2168661e9ea67d1ab29392dbb2a701a6d4 100644
--- a/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
+++ b/applications/rtdt-manager/rtdt-topology/rtdt-topology.go
@@ -61,6 +61,23 @@ func (t *Topology) GetNodeByName(name string) *Node {
 	return nil
 }
 
+func (t *Topology) GetPortByUUID(UUID string) *Port {
+	for _, port := range t.Ports {
+		if port.ID == UUID {
+			return port
+		}
+	}
+	return nil
+}
+func (t *Topology) GetLinkByUUID(UUID string) *Link {
+    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"
 // commit: 0264b698286b6cbb965d743078c681f8af55edf6
 // GetLinkAsSliceOfStrings returns the link as a slice of strings for yaml representation.
@@ -117,14 +134,12 @@ func (p *Port) Convert() *topoPb.Port {
 	}
 }
 func (l *Link) Convert() *topoPb.Link {
-    return &topoPb.Link{
-        Id: l.ID,
-        Name: l.Name,
-        SourceNode: l.SourceNode.Convert(),
-        SourcePort: l.SourcePort.Convert(),
-        TargetNode: l.TargetNode.Convert(),
-        TargetPort: l.TargetPort.Convert(),
-
-    }
+	return &topoPb.Link{
+		Id:         l.ID,
+		Name:       l.Name,
+		SourceNode: l.SourceNode.Convert(),
+		SourcePort: l.SourcePort.Convert(),
+		TargetNode: l.TargetNode.Convert(),
+		TargetPort: l.TargetPort.Convert(),
+	}
 }
-
diff --git a/applications/rtdt-manager/venv/venv.go b/applications/rtdt-manager/venv/venv.go
index 8b182cd135ca729d03557190f4200cec7b1c08aa..d414651dabe1d3445847524d65ebe06984fd1cc6 100644
--- a/applications/rtdt-manager/venv/venv.go
+++ b/applications/rtdt-manager/venv/venv.go
@@ -317,6 +317,56 @@ func (v *VEnv) UploadTopology() error {
 	return nil
 }
 
+func (v *VEnv) RetrieveTopology() error {
+	conn := v.auth.GetConn()
+	ctx := v.auth.CreateContextWithAuthorization()
+	topoService := topoPb.NewTopologyServiceClient(conn)
+	topoResponse, err := topoService.GetTopology(ctx, &topoPb.GetTopologyRequest{Timestamp: util.Now()})
+	if err != nil {
+		return fmt.Errorf("Couldn't retrieve topology from DB: %v\n", err)
+	}
+	sourceTopo := topoResponse.GetToplogy()
+	targetTopo := rtdt_topology.NewTopology()
+	for _, link := range sourceTopo.Links {
+		var n0 rtdt_topology.Node
+		var n1 rtdt_topology.Node
+		if targetTopo.GetNodeByUUID(link.SourceNode.Id) == nil {
+			snode := link.SourceNode
+			n1 = 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)
+		}
+		if targetTopo.GetNodeByUUID(link.TargetNode.Id) == nil {
+			tnode := link.TargetNode
+			n1 = rtdt_topology.Node{
+				ID:       tnode.Id,
+				Name:     tnode.Name,
+				Kind:     "todo",
+				Image:    "todo", // How to do this?
+				MgmtIpv4: "todo",
+			}
+			v.topology.Nodes = append(v.topology.Nodes, &n1)
+		}
+		if targetTopo.GetLinkByUUID(link.Id) == nil {
+
+			var newLink = rtdt_topology.Link{
+				ID:         link.Id,
+				Name:       link.Name,
+				SourceNode: &n0,
+				TargetNode: &n1,
+			}
+            v.topology.Links = append(v.topology.Links, &newLink)
+		}
+	}
+
+	return nil
+}
+
 func getTypedValue(value string) *gnmi.TypedValue {
 	if boolVal, err := strconv.ParseBool(value); err == nil {
 		return &gnmi.TypedValue{Value: &gnmi.TypedValue_BoolVal{BoolVal: boolVal}}