diff --git a/controller/northbound/server/topology.go b/controller/northbound/server/topology.go
index 099afe5347d1d431a82e7b73ed93109d77d66e2c..27e7dd3618fcafb2c28e585e48f81dc86b1c2b95 100644
--- a/controller/northbound/server/topology.go
+++ b/controller/northbound/server/topology.go
@@ -78,8 +78,19 @@ func (t *TopologyServer) AddLink(ctx context.Context, request *topopb.AddLinkReq
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
+	// check if UUID is set
+	var id uuid.UUID
+	if requestId := request.Link.Id; requestId != "" {
+		id, err = uuid.Parse(requestId)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		id = uuid.New()
+	}
+
 	link := links.Link{
-		ID:         uuid.New(),
+		ID:         id,
 		Name:       request.Link.Name,
 		SourceNode: sourceNode,
 		SourcePort: sourcePort,
diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go
index b562a9d7b09e4c34a512007212c24cc2c0c10ee5..a1edd6464fa21ef0c2e869b68fff9be94993d335 100644
--- a/controller/topology/topologyService.go
+++ b/controller/topology/topologyService.go
@@ -51,25 +51,6 @@ func NewTopologyService(
 
 // AddLink adds a new link to the topology.
 func (t *TopoService) AddLink(link links.Link) error {
-	// These checks are also happening in the current NBI implementation.
-	// This should be refactored to only to these checks here.
-	// _, err := t.nodeService.EnsureExists(link.SourceNode)
-	// if err != nil {
-	// 	return err
-	// }
-	// _, err = t.portService.EnsureExists(link.SourcePort)
-	// if err != nil {
-	// 	return err
-	// }
-
-	// _, err = t.nodeService.EnsureExists(link.TargetNode)
-	// if err != nil {
-	// 	return err
-	// }
-	// _, err = t.portService.EnsureExists(link.TargetPort)
-	// if err != nil {
-	// 	return err
-	// }
 	ctx := context.Background()
 
 	err := t.store.Add(ctx, link)
diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go
index 009d1eab7b78899a0d813a4815c35c7e5be971cf..f434248f2ea72c2d535e7600442ea0af3de5f910 100644
--- a/controller/topology/topologyStore.go
+++ b/controller/topology/topologyStore.go
@@ -62,7 +62,7 @@ func (s *DatabaseTopologyStore) Get(ctx context.Context, query query.Query) (lin
 }
 
 func (s *DatabaseTopologyStore) getByID(ctx context.Context, idOfTopology uuid.UUID) (loadedTopology links.Link, err error) {
-	result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology.String()}})
+	result := s.collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology}})
 	if result == nil {
 		return loadedTopology, customerrs.CouldNotFindError{ID: idOfTopology}
 	}
@@ -136,7 +136,7 @@ func (s *DatabaseTopologyStore) Update(ctx context.Context, linkToUpdate links.L
 
 	err = s.collection.
 		FindOneAndUpdate(
-			ctx, bson.M{"_id": linkToUpdate.ID.String()}, update, &opt).
+			ctx, bson.M{"_id": linkToUpdate.ID}, update, &opt).
 		Decode(&updatedLink)
 	if err != nil {
 		return customerrs.CouldNotUpdateError{Identifier: linkToUpdate.ID, Type: linkToUpdate, Err: err}
@@ -147,7 +147,7 @@ func (s *DatabaseTopologyStore) Update(ctx context.Context, linkToUpdate links.L
 
 // Delete deletes a link from the link store.
 func (s *DatabaseTopologyStore) Delete(ctx context.Context, linkToDelete links.Link) (err error) {
-	_, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: linkToDelete.ID.String()}})
+	_, err = s.collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: linkToDelete.ID}})
 	if err != nil {
 		return err
 	}
diff --git a/integration-tests/topology_tests/topology_test.go b/integration-tests/topology_tests/topology_test.go
index 5e6a44baffc7dcf14a55f9dc5dbef11bd8ac9a3d..54c625541f789fc5b616d995dc95dd988e99c70a 100644
--- a/integration-tests/topology_tests/topology_test.go
+++ b/integration-tests/topology_tests/topology_test.go
@@ -78,81 +78,78 @@ func TestCreateTopologyAndGetIt(t *testing.T) {
 	assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength)
 }
 
-// goSDN crashed due to validation errors in the topology service. If bug is fixed, uncomment and finish this test.
-//func TestCreateTopologyFailsValidation(t *testing.T) {
-//	defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig)
-//
-//	addLinkRequest := topologyPb.AddLinkRequest{
-//		Link: &topologyPb.Link{
-//			Name:       "Link1",
-//			SourceNode: &topologyPb.Node{Name: "Node1"},
-//			TargetNode: &topologyPb.Node{Name: "Node2"},
-//			SourcePort: &topologyPb.Port{Name: "Port1"},
-//			TargetPort: &topologyPb.Port{Name: "Port2"}},
-//	}
-//
-//	topologyService := topologyPb.NewTopologyServiceClient(conn)
-//	_, err := topologyService.AddLink(ctx, &addLinkRequest)
-//
-//	if err == nil {
-//		t.Errorf("Test expected an error, none received.")
-//	}
-//}
+func TestCreateTopologyFailsValidation(t *testing.T) {
+	defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig)
+
+	addLinkRequest := topologyPb.AddLinkRequest{
+		Link: &topologyPb.Link{
+			Name:       "Link1",
+			SourceNode: &topologyPb.Node{Name: "Node1"},
+			TargetNode: &topologyPb.Node{Name: "Node2"},
+			SourcePort: &topologyPb.Port{Name: "Port1"},
+			TargetPort: &topologyPb.Port{Name: "Port2"}},
+	}
+
+	topologyService := topologyPb.NewTopologyServiceClient(conn)
+	resp, err := topologyService.AddLink(ctx, &addLinkRequest)
+	assert.Error(t, err, "Test expected an error, none received.")
+	assert.Nil(t, resp, "Test expects the resp to be nil if an error is thrown beforehand.")
+}
 
 // Test that creates a topology and then deletes it and checks that all topologies are deleted.
 
 // Can't delete topology because of bug in goSDN. If bug is fixed, uncomment and finish this test.
-//func TestCreateThenDeleteTopologyAndGetEmptyTopologies(t *testing.T) {
-//	defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig)
-//
-//	addLinkRequest := topologyPb.AddLinkRequest{
-//		Link: &topologyPb.Link{
-//			Name:       "Link1",
-//			SourceNode: &topologyPb.Node{Name: "Node1"},
-//			TargetNode: &topologyPb.Node{Name: "Node2"},
-//			SourcePort: &topologyPb.Port{Name: "Port1",
-//				Configuration: &topologyPb.Configuration{
-//					Ip:           "10.0.0.1",
-//					PrefixLength: 24}},
-//			TargetPort: &topologyPb.Port{Name: "Port2",
-//				Configuration: &topologyPb.Configuration{
-//					Ip:           "10.0.0.2",
-//					PrefixLength: 24}}},
-//	}
-//
-//	topologyService := topologyPb.NewTopologyServiceClient(conn)
-//	_, err := topologyService.AddLink(ctx, &addLinkRequest)
-//	if err != nil {
-//		t.Errorf("Error while adding link: %v", err)
-//	}
-//
-//	getTopolgyResponse, err := topologyService.GetTopology(ctx, &topologyPb.GetTopologyRequest{})
-//	if err != nil {
-//		t.Errorf("Error while getting topology: %v", err)
-//	}
-//
-//	assert.Equal(t, 1, len(getTopolgyResponse.Toplogy.Links))
-//	assert.Equal(t, "Link1", getTopolgyResponse.Toplogy.Links[0].Name)
-//	assert.Equal(t, "Node1", getTopolgyResponse.Toplogy.Links[0].SourceNode.Name)
-//	assert.Equal(t, "Node2", getTopolgyResponse.Toplogy.Links[0].TargetNode.Name)
-//	assert.Equal(t, "Port1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Name)
-//	assert.Equal(t, "10.0.0.1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.Ip)
-//	assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.PrefixLength)
-//	assert.Equal(t, "Port2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Name)
-//	assert.Equal(t, "10.0.0.2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.Ip)
-//	assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength)
-//
-//	deleteLinkRequest := topologyPb.DeleteLinkRequest{Id: getTopolgyResponse.Toplogy.Links[0].Id}
-//	_, err = topologyService.DeleteLink(ctx, &deleteLinkRequest)
-//	if err != nil {
-//		t.Errorf("Error while deleting link: %v", err)
-//	}
-//	getTopologyRequest := &topologyPb.GetTopologyRequest{}
-//	getTopologyResponse, err := topologyService.GetTopology(ctx, getTopologyRequest)
-//	if err != nil {
-//		t.Errorf("Error while getting topologies: %v", err)
-//	}
-//
-//	assert.Equal(t, 0, len(getTopologyResponse.Toplogy.Links))
-//}
-//
+func TestCreateThenDeleteTopologyAndGetEmptyTopologies(t *testing.T) {
+	defer integration_test_utils.ApplySDNConfig(conn, ctx, defaultSDNConfig)
+
+	addLinkRequest := topologyPb.AddLinkRequest{
+		Link: &topologyPb.Link{
+			Id:         "8a01b8b0-6244-42bf-b72a-3821efc1a353",
+			Name:       "Link1",
+			SourceNode: &topologyPb.Node{Name: "Node1"},
+			TargetNode: &topologyPb.Node{Name: "Node2"},
+			SourcePort: &topologyPb.Port{Name: "Port1",
+				Configuration: &topologyPb.Configuration{
+					Ip:           "10.0.0.1",
+					PrefixLength: 24}},
+			TargetPort: &topologyPb.Port{Name: "Port2",
+				Configuration: &topologyPb.Configuration{
+					Ip:           "10.0.0.2",
+					PrefixLength: 24}}},
+	}
+
+	topologyService := topologyPb.NewTopologyServiceClient(conn)
+	_, err := topologyService.AddLink(ctx, &addLinkRequest)
+	if err != nil {
+		t.Errorf("Error while adding link: %v", err)
+	}
+
+	getTopolgyResponse, err := topologyService.GetTopology(ctx, &topologyPb.GetTopologyRequest{})
+	if err != nil {
+		t.Errorf("Error while getting topology: %v", err)
+	}
+
+	assert.Equal(t, 1, len(getTopolgyResponse.Toplogy.Links))
+	assert.Equal(t, "Link1", getTopolgyResponse.Toplogy.Links[0].Name)
+	assert.Equal(t, "Node1", getTopolgyResponse.Toplogy.Links[0].SourceNode.Name)
+	assert.Equal(t, "Node2", getTopolgyResponse.Toplogy.Links[0].TargetNode.Name)
+	assert.Equal(t, "Port1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Name)
+	assert.Equal(t, "10.0.0.1", getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.Ip)
+	assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].SourcePort.Configuration.PrefixLength)
+	assert.Equal(t, "Port2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Name)
+	assert.Equal(t, "10.0.0.2", getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.Ip)
+	assert.Equal(t, int64(24), getTopolgyResponse.Toplogy.Links[0].TargetPort.Configuration.PrefixLength)
+
+	deleteLinkRequest := topologyPb.DeleteLinkRequest{Id: getTopolgyResponse.Toplogy.Links[0].Id}
+	_, err = topologyService.DeleteLink(ctx, &deleteLinkRequest)
+	if err != nil {
+		t.Errorf("Error while deleting link: %v", err)
+	}
+	getTopologyRequest := &topologyPb.GetTopologyRequest{}
+	getTopologyResponse, err := topologyService.GetTopology(ctx, getTopologyRequest)
+	if err != nil {
+		t.Errorf("Error while getting topologies: %v", err)
+	}
+
+	assert.Equal(t, 0, len(getTopologyResponse.Toplogy.Links))
+}