public TransactionStatus Submit(AsyncComplexContent content, NamedEndpointVisit visit)
        {
            Activity       activity         = null;
            IList <string> newDocumentIds   = null;
            bool           isNewTransaction = false;

            try
            {
                // Validate inputs
                NodeVisit nodeVisit;
                MakeEndpointActivity(visit, ActivityType.Audit, NodeMethod.Submit,
                                     out nodeVisit, out activity);

                if (content == null)
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter,
                                                 "Input content is null");
                }
                if (CollectionUtils.IsNullOrEmpty(content.Documents))
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter,
                                                 "Input document list is empty");
                }
                if (content.Transaction == null)
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter,
                                                 "Input transaction is null");
                }
                if ((content.Flow == null) || string.IsNullOrEmpty(content.Flow.FlowName))
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidParameter,
                                                 "Input flow is null");
                }
                bool   isFlowProtected;
                string flowId = FlowManager.GetDataFlowIdByName(content.Flow.FlowName, out isFlowProtected);
                if (flowId == null)
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_InvalidDataflow,
                                                 "Flow \"{0}\" was not found", content.Flow.FlowName);
                }
                activity.FlowName  = content.Flow.FlowName;
                activity.Operation = content.Flow.Operation;
                isNewTransaction   = string.IsNullOrEmpty(content.Transaction.Id);
                string networkId = null;

                // Get the flow id associated with the transaction
                if (isNewTransaction)
                {
                }
                else
                {
                    // Existing transaction
                    isNewTransaction =
                        ValidateTransaction(visit.Version, NodeMethod.Submit, content, (visit.Version != EndpointVersionType.EN11),
                                            flowId, out networkId);
                    if (!isNewTransaction)
                    {
                        activity.TransactionId = content.Transaction.Id;
                    }
                }

                DataService documentService = FlowManager.GetSubmitDocumentServiceForFlow(flowId, content.Flow.Operation);
                if (documentService == null)
                {
                    if (!string.IsNullOrEmpty(content.Flow.Operation))
                    {
                        throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_ServiceUnavailable,
                                                     "A valid Submit service was not found for the flow \"{0}\"", content.Flow.FlowName);
                    }
                    // Let empty operation pass through, even without a valid service, per Mark
                }
                else if (!documentService.IsActive)
                {
                    throw FaultProvider.GetFault(visit.Version, ENExceptionCodeType.E_ServiceUnavailable,
                                                 "The Submit service is not active for the flow \"{0}\"", content.Flow.FlowName);
                }

                if (isFlowProtected)
                {
                    ValidateUserPermissions(nodeVisit, content.Flow.FlowName, content.Flow.Operation,
                                            NodeMethod.Submit, activity);
                }

                if (isNewTransaction)
                {
                    // Create a new transaction
                    content.Transaction.Id =
                        TransactionManager.CreateTransaction(NodeMethod.Submit, visit.Version, flowId, content.Flow.Operation,
                                                             nodeVisit.Account.Id, CommonTransactionStatusCode.Unknown,
                                                             null, content.Notifications, content.Recipients, false);
                    activity.TransactionId = content.Transaction.Id;
                    if (networkId != null)
                    {
                        TransactionManager.SetNetworkId(content.Transaction.Id, networkId,
                                                        EndpointVersionType.Undefined, null, null, null);
                    }
                    activity.AppendFormat("Created new submit transaction id: {0}.", activity.TransactionId);
                }
                else
                {
                    activity.AppendFormat("Retrieved existing submit transaction id: {0}.", activity.TransactionId);
                }

                foreach (Document document in content.Documents)
                {
                    activity.AppendFormat("Adding submit document to transaction: {0}.", document);
                }
                // Add the documents to repository and DB
                newDocumentIds =
                    DocumentManager.AddDocuments(content.Transaction.Id, content.Documents);

#if DEBUG
                //NodeTransaction nodeTransaction = TransactionManager.GetTransaction(content.Transaction.Id,
                //                                                                    CommonTransactionStatusCode.Received);
#endif // DEBUG
                TransactionStatus rtnTransactionStatus =
                    TransactionManager.SetTransactionStatus(content.Transaction.Id, nodeVisit.Account.Id,
                                                            CommonTransactionStatusCode.Received,
                                                            null, false);

                NotificationManager.DoSubmitNotifications(rtnTransactionStatus, flowId, content.Flow.FlowName,
                                                          content.Flow.Operation,
                                                          nodeVisit.Account.NaasAccount);

                SubmitProcessor.Wakeup();

                return(rtnTransactionStatus);
            }
            catch (Exception ex)
            {
                if (newDocumentIds != null)
                {
                    DocumentManager.RollbackDocuments(content.Transaction.Id, newDocumentIds);
                }
                if (isNewTransaction && !string.IsNullOrEmpty(content.Transaction.Id))
                {
                    TransactionManager.SetTransactionStatusNoThrow(content.Transaction.Id,
                                                                   CommonTransactionStatusCode.Failed,
                                                                   ex.Message, false);
                }
                if (activity != null)
                {
                    activity.Append(ExceptionUtils.ToShortString(ex));
                    activity.Type = ActivityType.Error;
                }
                if (ex is SoapException)
                {
                    throw;      // Throw directly since already SoapException
                }
                else
                {
                    throw FaultProvider.GetFault(visit.Version, ex);
                }
            }
            finally
            {
                if (activity != null)
                {
                    ActivityManager.Log(activity);
                }
            }
        }