private void process(NsaMessage provisionMessage) {

    String correlationId = provisionMessage.getCorrelationId();
    String replyTo = provisionMessage.getReplyTo();
    String requesterNSA = provisionMessage.getRequesterNSA();
    String providerNSA = provisionMessage.getProviderNSA();
    String connectionId = provisionMessage.getConnectionId();
    String globalReservationId = provisionMessage.getGlobalReservationId();

    // Get handles to the data managers.
    DataManager dataManager = DataManager.getInstance();
    StateMachineManager stateMachineManager = dataManager.getStateMachineManager();
    CastingDirector castingDirector = dataManager.getCastingDirector();
    PendingOperationManager pendingOperations = dataManager.getPendingOperationManager();

    // Update the time we sent out the operation.
    PendingOperation pendingOperation = pendingOperations.get(correlationId);
    if (pendingOperation == null) {
      logger.error(
          "ProvisionRequesterLocalActor.process: could not find pendingOperation for "
              + correlationId);
      return;
    }
    pendingOperation.setTimeSentNow();
    PathSegment pathSegment = pendingOperation.getSegment();
    String parentConnectionId = pathSegment.getParentConnectionId();
    String scheduleId = pathSegment.getData();

    // Get the state machine using the parent connectionId.
    StateMachine stateMachine = stateMachineManager.getStateMachine(parentConnectionId);
    if (stateMachine == null) {
      logger.error(
          "ProvisionRequesterLocalActor.process: could not find stateMachine for "
              + parentConnectionId);
      return;
    }

    /*
     * These are the valid states to receive a provision message.  We would
     * have already rejected the message in the ProvisionProviderActor for
     * invalid states on the parent state machine, however, we need to
     * handle our segment individually since some segments may already be
     * provisioned (ESnet requested the protocol leave already provisioned
     * segements in the PROVISIONED state if other segments fail).
     *
     * If we are in the PROVISIONED state then we can send a
     * provisionConfirmed back immediately.
     */
    ConnectionStateType segmentState = pathSegment.getCurrentState();
    if (segmentState == ConnectionStateType.PROVISIONED) {
      // Send back a provisionConfirmed.
      logger.info(
          "ProvisionRequesterLocalActor.process: already provisioned - sending provisionConfirm back for scheduleId="
              + scheduleId);

      NsaMessage childMessage = new NsaMessage();
      childMessage.setCorrelationId(correlationId);
      childMessage.setConnectionId(connectionId);
      childMessage.setConnectionState(pathSegment.getCurrentState());
      childMessage.setGlobalReservationId(globalReservationId);
      childMessage.setMessageType(NsaMessage.MessageType.provisionConfirmedRequester);
      childMessage.setProviderNSA(providerNSA);
      childMessage.setRequesterNSA(requesterNSA);

      // Route this message to the appropriate ReservationFailedRequesterActor for processing.
      castingDirector.send(childMessage);
      logger.info(
          "ProvisionRequesterLocalActor.process: provisionConfirmed message issued to actor so returning");
      return;
    } else if (segmentState != ConnectionStateType.RESERVED
        && segmentState != ConnectionStateType.SCHEDULED) {
      /*
       * We need to feed this back to the reserveFailedRequesterActor
       * to process with other responses.
       */
      ServiceException exception =
          ExceptionCodes.buildProviderException(
              ExceptionCodes.INVALID_STATE, "nrmSegmentState", segmentState.value());

      NsaMessage failedMessage = new NsaMessage();
      failedMessage.setMessageType(NsaMessage.MessageType.provisionFailedRequester);
      failedMessage.setCorrelationId(correlationId);
      failedMessage.setRequesterNSA(requesterNSA);
      failedMessage.setProviderNSA(providerNSA);
      failedMessage.setConnectionId(connectionId);
      failedMessage.setGlobalReservationId(globalReservationId);
      failedMessage.setPayload(exception.getFaultInfo());

      // Route this message to the appropriate ReservationFailedRequesterActor for processing.
      castingDirector.send(failedMessage);
      logger.error(
          "ProvisionRequesterLocalActor.process: segment state invalid for connectionId="
              + parentConnectionId
              + ", state="
              + segmentState.name());
      return;
    }

    /*
     * We transition into the AUTO_PROVISION state to kick off this schedule
     * at startTime. If after startTime we should go into PROVISIONING but
     * we simplify this for the local NRM and just set to AUTO_PROVISION.
     */
    logger.info(
        "ProvisionRequesterLocalActor.process: connectionId="
            + parentConnectionId
            + " transitioning to state="
            + ConnectionStateType.AUTO_PROVISION.name());
    pathSegment.setCurrentState(ConnectionStateType.AUTO_PROVISION);

    /*
     * Now we need to kick the startTime scheduler to look at this new
     * state machine state.  When it is time for provisioning to start on
     * the local NRM this will manage the transition.
     */
    logger.info("ProvisionRequesterLocalActor.process: kicking StartTimeScheduler.");
    StartTimeScheduler.getInstance().timerAudit(stateMachine.getStartTime());

    logger.info("ProvisionRequesterLocalActor.process: completed");
  }