public async Task <IEnumerable <INotification> > CreateDigitizedEvent(RouteSegment routeSegment)
        {
            if (routeSegment is null)
            {
                throw new ArgumentNullException($"Parameter {nameof(routeSegment)} must not be null");
            }

            if (IsCreatedByApplication(routeSegment))
            {
                return(new List <INotification>());
            }

            // Update integrator "shadow table" with the used digitized segment
            await _geoDatabase.InsertRouteSegmentShadowTable(routeSegment);

            if (!_routeSegmentValidator.LineIsValid(routeSegment.GetLineString()))
            {
                return new List <INotification> {
                           new InvalidRouteSegmentOperation {
                               RouteSegment = routeSegment
                           }
                }
            }
            ;

            var intersectingStartNodes = await _geoDatabase.GetIntersectingStartRouteNodes(routeSegment);

            var intersectingEndNodes = await _geoDatabase.GetIntersectingEndRouteNodes(routeSegment);

            var intersectingStartSegments = await _geoDatabase.GetIntersectingStartRouteSegments(routeSegment);

            var intersectingEndSegments = await _geoDatabase.GetIntersectingEndRouteSegments(routeSegment);

            var allIntersectingRouteNodesNoEdges = await _geoDatabase.GetAllIntersectingRouteNodesNotIncludingEdges(routeSegment);

            if (intersectingStartNodes.Count >= 2 || intersectingEndNodes.Count >= 2)
            {
                return new List <INotification> {
                           new InvalidRouteSegmentOperation {
                               RouteSegment = routeSegment
                           }
                }
            }
            ;

            var notifications = new List <INotification>();

            notifications.AddRange(HandleExistingRouteSegmentSplitted(intersectingStartSegments.Count, intersectingStartNodes.Count, routeSegment.FindStartPoint(), routeSegment));
            notifications.AddRange(HandleExistingRouteSegmentSplitted(intersectingEndSegments.Count, intersectingEndNodes.Count, routeSegment.FindEndPoint(), routeSegment));

            notifications.Add(CreateNewRouteSegmentDigitized(routeSegment));

            if (allIntersectingRouteNodesNoEdges.Count > 0)
            {
                foreach (var intersectingRouteNode in allIntersectingRouteNodesNoEdges)
                {
                    var routeSegmentSplitted = CreateExistingRouteSegmentSplitted(null, intersectingRouteNode, false);
                    notifications.Add(routeSegmentSplitted);
                }
            }

            return(notifications);
        }