@Override
  protected void performBoottime(
      final OperationContext context, ModelNode operation, final ModelNode model)
      throws OperationFailedException {

    // setup IIOP related stuff
    // This goes here rather than in EJB3IIOPAdd as it affects the server when it is acting as an
    // iiop client
    // setup our dynamic stub factory
    DelegatingStubFactoryFactory.setOverriddenDynamicFactory(new DynamicStubFactoryFactory());

    // setup the substitution service, that translates between ejb proxies and IIOP stubs
    final RemoteObjectSubstitutionService substitutionService =
        new RemoteObjectSubstitutionService();
    context
        .getServiceTarget()
        .addService(RemoteObjectSubstitutionService.SERVICE_NAME, substitutionService)
        .addDependency(
            DeploymentRepository.SERVICE_NAME,
            DeploymentRepository.class,
            substitutionService.getDeploymentRepositoryInjectedValue())
        .install();

    RemoteObjectSubstitutionManager.setRemoteObjectSubstitution(substitutionService);

    // setup ejb: namespace
    EjbNamingContextSetup.setupEjbNamespace();
    // TODO: this is a bit of a hack
    InitialContext.addUrlContextFactory("ejb", new ejbURLContextFactory());
    final boolean appclient = context.getProcessType() == ProcessType.APPLICATION_CLIENT;

    final ModelNode defaultDistinctName =
        EJB3SubsystemRootResourceDefinition.DEFAULT_DISTINCT_NAME.resolveModelAttribute(
            context, model);
    final DefaultDistinctNameService defaultDistinctNameService =
        new DefaultDistinctNameService(
            defaultDistinctName.isDefined() ? defaultDistinctName.asString() : null);
    context
        .getServiceTarget()
        .addService(DefaultDistinctNameService.SERVICE_NAME, defaultDistinctNameService)
        .install();

    // set the default security domain name in the deployment unit processor, configured at the
    // subsytem level
    final ModelNode defaultSecurityDomainModelNode =
        EJB3SubsystemRootResourceDefinition.DEFAULT_SECURITY_DOMAIN.resolveModelAttribute(
            context, model);
    final String defaultSecurityDomain =
        defaultSecurityDomainModelNode.isDefined()
            ? defaultSecurityDomainModelNode.asString()
            : null;
    this.defaultSecurityDomainDeploymentProcessor.setDefaultSecurityDomainName(
        defaultSecurityDomain);

    // set the default security domain name in the deployment unit processor, configured at the
    // subsytem level
    final ModelNode defaultMissingMethod =
        EJB3SubsystemRootResourceDefinition.DEFAULT_MISSING_METHOD_PERMISSIONS_DENY_ACCESS
            .resolveModelAttribute(context, model);
    final boolean defaultMissingMethodValue = defaultMissingMethod.asBoolean();
    this.missingMethodPermissionsDenyAccessMergingProcessor.setDenyAccessByDefault(
        defaultMissingMethodValue);

    context.addStep(
        new AbstractDeploymentChainStep() {
          @Override
          protected void execute(DeploymentProcessorTarget processorTarget) {

            // DUP's that are used even for app client deployments
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.STRUCTURE,
                Phase.STRUCTURE_REGISTER_JBOSS_ALL_EJB,
                new JBossAllXmlParserRegisteringProcessor<EjbJarMetaData>(
                    EjbJarJBossAllParser.ROOT_ELEMENT,
                    EjbJarJBossAllParser.ATTACHMENT_KEY,
                    new EjbJarJBossAllParser()));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_DEFAULT_DISTINCT_NAME,
                new EjbDefaultDistinctNameProcessor(defaultDistinctNameService));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_CONTEXT_BINDING,
                new EjbContextJndiBindingProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_DEPLOYMENT,
                new EjbJarParsingDeploymentUnitProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_CREATE_COMPONENT_DESCRIPTIONS,
                new AnnotatedEJBComponentDescriptionDeploymentUnitProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_SESSION_BEAN_DD,
                new SessionBeanXmlDescriptorProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_ANNOTATION_EJB,
                new EjbAnnotationProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_INJECTION_ANNOTATION,
                new EjbResourceInjectionAnnotationProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.PARSE,
                Phase.PARSE_EJB_ASSEMBLY_DESC_DD,
                new AssemblyDescriptorProcessor());

            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.DEPENDENCIES,
                Phase.DEPENDENCIES_EJB,
                new EjbDependencyDeploymentUnitProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_HOME_MERGE,
                new HomeViewMergingProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_REF,
                new EjbRefProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_BUSINESS_VIEW_ANNOTATION,
                new BusinessViewAnnotationProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_ORB_BIND,
                new IIOPJndiBindingProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_JNDI_BINDINGS,
                new EjbJndiBindingsDeploymentUnitProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_CLIENT_METADATA,
                new EJBClientDescriptorMetaDataProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_DEFAULT_SECURITY_DOMAIN,
                EJB3SubsystemAdd.this.defaultSecurityDomainDeploymentProcessor);
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EE_COMPONENT_SUSPEND,
                new EJBComponentSuspendDeploymentUnitProcessor());
            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.POST_MODULE,
                Phase.POST_MODULE_EE_COMPONENT_SUSPEND + 1,
                new EjbClientContextSetupProcessor()); // TODO: real phase numbers

            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.INSTALL,
                Phase.INSTALL_EJB_JACC_PROCESSING,
                new JaccEjbDeploymentProcessor());

            processorTarget.addDeploymentProcessor(
                EJB3Extension.SUBSYSTEM_NAME,
                Phase.CLEANUP,
                Phase.CLEANUP_EJB,
                new EjbCleanUpProcessor());

            if (!appclient) {
              // add the metadata parser deployment processor

              // Process @DependsOn after the @Singletons have been registered.
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.PARSE,
                  Phase.PARSE_EJB_TIMERSERVICE_BINDING,
                  new TimerServiceJndiBindingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.PARSE,
                  Phase.PARSE_EJB_APPLICATION_EXCEPTION_ANNOTATION,
                  new ApplicationExceptionAnnotationProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.PARSE,
                  Phase.PARSE_EJB_DD_INTERCEPTORS,
                  new InterceptorClassDeploymentDescriptorProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.PARSE,
                  Phase.PARSE_EJB_SECURITY_ROLE_REF_DD,
                  new SecurityRoleRefDDProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.PARSE,
                  Phase.PARSE_PASSIVATION_ANNOTATION,
                  new PassivationAnnotationParsingProcessor());

              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_IMPLICIT_NO_INTERFACE_VIEW,
                  new ImplicitLocalViewProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_APPLICATION_EXCEPTIONS,
                  new ApplicationExceptionMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_DD_INTERCEPTORS,
                  new DeploymentDescriptorInterceptorBindingsProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_DD_METHOD_RESOLUTION,
                  new DeploymentDescriptorMethodProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_TRANSACTION_MANAGEMENT,
                  new TransactionManagementMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CONCURRENCY_MANAGEMENT_MERGE,
                  new ConcurrencyManagementMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CONCURRENCY_MERGE,
                  new EjbConcurrencyMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_TX_ATTR_MERGE,
                  new TransactionAttributeMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_RUN_AS_MERGE,
                  new RunAsMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_RESOURCE_ADAPTER_MERGE,
                  new ResourceAdaptorMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CLUSTERED,
                  new ClusteredSingletonMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_DELIVERY_ACTIVE_MERGE,
                  new MdbDeliveryMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_REMOVE_METHOD,
                  new RemoveMethodMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_STARTUP_MERGE,
                  new StartupMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SECURITY_DOMAIN,
                  new SecurityDomainMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SECURITY_MISSING_METHOD_PERMISSIONS,
                  missingMethodPermissionsDenyAccessMergingProcessor);
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_ROLES,
                  new DeclareRolesMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_METHOD_PERMISSIONS,
                  new MethodPermissionsMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_STATEFUL_TIMEOUT,
                  new StatefulTimeoutMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SESSION_SYNCHRONIZATION,
                  new SessionSynchronizationMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_INIT_METHOD,
                  new InitMethodMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SESSION_BEAN,
                  new SessionBeanMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SECURITY_PRINCIPAL_ROLE_MAPPING_MERGE,
                  new SecurityRolesMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_LOCAL_HOME,
                  new SessionBeanHomeProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CACHE,
                  new CacheMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SLSB_POOL_NAME_MERGE,
                  new StatelessSessionBeanPoolMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_MDB_POOL_NAME_MERGE,
                  new MessageDrivenBeanPoolMergingProcessor());
              // Add the deployment unit processor responsible for processing the user application
              // specific container interceptors configured in jboss-ejb3.xml
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_USER_APP_SPECIFIC_CONTAINER_INTERCEPTORS,
                  new ContainerInterceptorBindingsDDProcessor());

              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.INSTALL,
                  Phase.INSTALL_DEPENDS_ON_ANNOTATION,
                  new EjbDependsOnMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.INSTALL,
                  Phase.INSTALL_DEPLOYMENT_REPOSITORY,
                  new DeploymentRepositoryProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.INSTALL,
                  Phase.INSTALL_EJB_MANAGEMENT_RESOURCES,
                  new EjbManagementDeploymentUnitProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.INSTALL,
                  Phase.INSTALL_CACHE_DEPENDENCIES,
                  new CacheDependenciesProcessor());
              processorTarget.addDeploymentProcessor(
                  EJB3Extension.SUBSYSTEM_NAME,
                  Phase.INSTALL,
                  Phase.INSTALL_EE_MODULE_CONFIG + 1,
                  new MdbDeliveryDependenciesProcessor()); // TODO Phase: replace by
                                                           // Phase.INSTALL_MDB_DELIVERY_DEPENDENCIES
            }
          }
        },
        OperationContext.Stage.RUNTIME);

    // todo maybe needs
    // EJB3SubsystemRootResourceDefinition.DEFAULT_MDB_INSTANCE_POOL.resolveModelAttribute(context,model).isDefined()
    if (model.hasDefined(DEFAULT_MDB_INSTANCE_POOL)) {
      EJB3SubsystemDefaultPoolWriteHandler.MDB_POOL.updatePoolService(context, model);
    }

    if (model.hasDefined(DEFAULT_SLSB_INSTANCE_POOL)) {
      EJB3SubsystemDefaultPoolWriteHandler.SLSB_POOL.updatePoolService(context, model);
    }

    if (model.hasDefined(DEFAULT_ENTITY_BEAN_INSTANCE_POOL)) {
      EJB3SubsystemDefaultPoolWriteHandler.ENTITY_BEAN_POOL.updatePoolService(context, model);
    }

    if (model.hasDefined(DEFAULT_SFSB_CACHE)) {
      EJB3SubsystemDefaultCacheWriteHandler.SFSB_CACHE.updateCacheService(context, model);
    }

    if (model.hasDefined(DEFAULT_SFSB_PASSIVATION_DISABLED_CACHE)) {
      EJB3SubsystemDefaultCacheWriteHandler.SFSB_PASSIVATION_DISABLED_CACHE.updateCacheService(
          context, model);
    }

    if (model.hasDefined(DEFAULT_RESOURCE_ADAPTER_NAME)) {
      DefaultResourceAdapterWriteHandler.INSTANCE.updateDefaultAdapterService(context, model);
    }

    if (model.hasDefined(DEFAULT_SINGLETON_BEAN_ACCESS_TIMEOUT)) {
      DefaultSingletonBeanAccessTimeoutWriteHandler.INSTANCE
          .updateOrCreateDefaultSingletonBeanAccessTimeoutService(context, model);
    }

    if (model.hasDefined(DEFAULT_STATEFUL_BEAN_ACCESS_TIMEOUT)) {
      DefaultStatefulBeanAccessTimeoutWriteHandler.INSTANCE
          .updateOrCreateDefaultStatefulBeanAccessTimeoutService(context, model);
    }

    if (model.hasDefined(DEFAULT_ENTITY_BEAN_OPTIMISTIC_LOCKING)) {
      EJB3SubsystemDefaultEntityBeanOptimisticLockingWriteHandler.INSTANCE.updateOptimisticLocking(
          context, model);
    }

    ExceptionLoggingWriteHandler.INSTANCE.updateOrCreateDefaultExceptionLoggingEnabledService(
        context, model);

    final ServiceTarget serviceTarget = context.getServiceTarget();

    context
        .getServiceTarget()
        .addService(DeploymentRepository.SERVICE_NAME, new DeploymentRepository())
        .install();

    addRemoteInvocationServices(context, model, appclient);
    // add clustering service
    addClusteringServices(context, appclient);

    // add user transaction access control service
    final EJB3UserTransactionAccessControlService userTxAccessControlService =
        new EJB3UserTransactionAccessControlService();
    context
        .getServiceTarget()
        .addService(
            EJB3UserTransactionAccessControlService.SERVICE_NAME, userTxAccessControlService)
        .addDependency(
            UserTransactionAccessControlService.SERVICE_NAME,
            UserTransactionAccessControlService.class,
            userTxAccessControlService.getUserTransactionAccessControlServiceInjector())
        .install();

    if (!appclient) {
      final EJBUtilities utilities = new EJBUtilities();
      serviceTarget
          .addService(EJBUtilities.SERVICE_NAME, utilities)
          .addDependency(
              ConnectorServices.RA_REPOSITORY_SERVICE,
              ResourceAdapterRepository.class,
              utilities.getResourceAdapterRepositoryInjector())
          .addDependency(
              SimpleSecurityManagerService.SERVICE_NAME,
              ServerSecurityManager.class,
              utilities.getSecurityManagerInjector())
          .addDependency(
              TxnServices.JBOSS_TXN_TRANSACTION_MANAGER,
              TransactionManager.class,
              utilities.getTransactionManagerInjector())
          .addDependency(
              TxnServices.JBOSS_TXN_SYNCHRONIZATION_REGISTRY,
              TransactionSynchronizationRegistry.class,
              utilities.getTransactionSynchronizationRegistryInjector())
          .addDependency(
              TxnServices.JBOSS_TXN_USER_TRANSACTION,
              UserTransaction.class,
              utilities.getUserTransactionInjector())
          .setInitialMode(ServiceController.Mode.ACTIVE)
          .install();

      // create the POA Registry use by iiop
      final POARegistry poaRegistry = new POARegistry();
      context
          .getServiceTarget()
          .addService(POARegistry.SERVICE_NAME, poaRegistry)
          .addDependency(CorbaPOAService.ROOT_SERVICE_NAME, POA.class, poaRegistry.getRootPOA())
          .setInitialMode(ServiceController.Mode.PASSIVE)
          .install();

      EnableStatisticsWriteHandler.INSTANCE.updateToRuntime(context, model);
    }
  }
  protected void performBoottime(
      final OperationContext context,
      ModelNode operation,
      final ModelNode model,
      ServiceVerificationHandler verificationHandler,
      List<ServiceController<?>> newControllers)
      throws OperationFailedException {

    // setup ejb: namespace
    EjbNamingContextSetup.setupEjbNamespace();
    // TODO: this is a bit of a hack
    InitialContext.addUrlContextFactory("ejb", new ejbURLContextFactory());
    final boolean appclient = model.hasDefined(APPCLIENT) && model.get(APPCLIENT).asBoolean();

    context.addStep(
        new AbstractDeploymentChainStep() {
          protected void execute(DeploymentProcessorTarget processorTarget) {

            // DUP's that are used even for app client deployments
            processorTarget.addDeploymentProcessor(
                Phase.PARSE,
                Phase.PARSE_EJB_DEPLOYMENT,
                new EjbJarParsingDeploymentUnitProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.PARSE,
                Phase.PARSE_SESSION_BEAN_CREATE_COMPONENT_DESCRIPTIONS,
                new SessionBeanComponentDescriptionFactory(appclient));
            processorTarget.addDeploymentProcessor(
                Phase.PARSE,
                Phase.PARSE_EJB_SESSION_BEAN_DD,
                new SessionBeanXmlDescriptorProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                Phase.PARSE, Phase.PARSE_ANNOTATION_EJB, new EjbAnnotationProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.PARSE,
                Phase.PARSE_EJB_INJECTION_ANNOTATION,
                new EjbResourceInjectionAnnotationProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.PARSE,
                Phase.PARSE_ENTITY_BEAN_CREATE_COMPONENT_DESCRIPTIONS,
                new EntityBeanComponentDescriptionFactory(appclient));

            processorTarget.addDeploymentProcessor(
                Phase.DEPENDENCIES,
                Phase.DEPENDENCIES_EJB,
                new EjbDependencyDeploymentUnitProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_HOME_MERGE,
                new HomeViewMergingProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                Phase.POST_MODULE, Phase.POST_MODULE_EJB_REF, new EjbRefProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_CLIENT_CONTEXT_SETUP,
                new EjbClientContextSetupProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.POST_MODULE,
                Phase.POST_MODULE_EJB_BUSINESS_VIEW_ANNOTATION,
                new BusinessViewAnnotationProcessor(appclient));
            processorTarget.addDeploymentProcessor(
                Phase.POST_MODULE, Phase.POST_MODULE_EJB_ORB_BIND, new ORBJndiBindingProcessor());

            processorTarget.addDeploymentProcessor(
                Phase.INSTALL,
                Phase.INSTALL_RESOLVE_EJB_INJECTIONS,
                new EjbInjectionResolutionProcessor());
            processorTarget.addDeploymentProcessor(
                Phase.INSTALL, Phase.INSTALL_EJB_JACC_PROCESSING, new JaccEjbDeploymentProcessor());

            processorTarget.addDeploymentProcessor(
                Phase.CLEANUP, Phase.CLEANUP_EJB, new EjbCleanUpProcessor());

            if (!appclient) {
              // add the metadata parser deployment processor

              // Process @DependsOn after the @Singletons have been registered.
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_CONTEXT_BINDING,
                  new EjbContextJndiBindingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_TIMERSERVICE_BINDING,
                  new TimerServiceJndiBindingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_APPLICATION_EXCEPTION_ANNOTATION,
                  new ApplicationExceptionAnnotationProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_DD_INTERCEPTORS,
                  new InterceptorClassDeploymentDescriptorProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE, Phase.PARSE_EJB_ASSEMBLY_DESC_DD, new AssemblyDescriptorProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_SECURITY_ROLE_REF_DD,
                  new SecurityRoleRefDDProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_EJB_REMOTE_CLIENT_CONTEXT,
                  new EjbClientContextParsingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.PARSE,
                  Phase.PARSE_MDB_CREATE_COMPONENT_DESCRIPTIONS,
                  new MessageDrivenComponentDescriptionFactory());

              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_IMPLICIT_NO_INTERFACE_VIEW,
                  new ImplicitLocalViewProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_JNDI_BINDINGS,
                  new EjbJndiBindingsDeploymentUnitProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_APPLICATION_EXCEPTIONS,
                  new ApplicationExceptionMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_DD_INTERCEPTORS,
                  new DeploymentDescriptorInterceptorBindingsProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_DD_METHOD_RESOLUTION,
                  new DeploymentDescriptorMethodProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_TRANSACTION_MANAGEMENT,
                  new TransactionManagementMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CONCURRENCY_MANAGEMENT_MERGE,
                  new ConcurrencyManagementMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_CONCURRENCY_MERGE,
                  new EjbConcurrencyMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_TX_ATTR_MERGE,
                  new TransactionAttributeMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_RUN_AS_MERGE,
                  new RunAsMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_RESOURCE_ADAPTER_MERGE,
                  new ResourceAdaptorMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_REMOVE_METHOD,
                  new RemoveMethodMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_STARTUP_MERGE,
                  new StartupMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SECURITY_DOMAIN,
                  new SecurityDomainMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_ROLES,
                  new DeclareRolesMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_METHOD_PERMISSIONS,
                  new MethodPermissionsMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_STATEFUL_TIMEOUT,
                  new StatefulTimeoutMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_SESSION_SYNCHRONIZATION,
                  new SessionSynchronizationMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_INIT_METHOD,
                  new InitMethodMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE, Phase.POST_MODULE_LOCAL_HOME, new SessionBeanHomeProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.POST_MODULE,
                  Phase.POST_MODULE_EJB_IIOP,
                  new EjbIIOPDeploymentUnitProcessor());

              processorTarget.addDeploymentProcessor(
                  Phase.INSTALL,
                  Phase.INSTALL_DEPENDS_ON_ANNOTATION,
                  new EjbDependsOnMergingProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.INSTALL,
                  Phase.INSTALL_DEPLOYMENT_REPOSITORY,
                  new DeploymentRepositoryProcessor());
              processorTarget.addDeploymentProcessor(
                  Phase.INSTALL,
                  Phase.INSTALL_EJB_MANAGEMENT_RESOURCES,
                  new EjbManagementDeploymentUnitProcessor());
            }
          }
        },
        OperationContext.Stage.RUNTIME);

    if (model.hasDefined(DEFAULT_MDB_INSTANCE_POOL)) {
      EJB3SubsystemDefaultPoolWriteHandler.MDB_POOL.updatePoolService(
          context, model, newControllers);
    }

    if (model.hasDefined(DEFAULT_SLSB_INSTANCE_POOL)) {
      EJB3SubsystemDefaultPoolWriteHandler.SLSB_POOL.updatePoolService(
          context, model, newControllers);
    }

    if (model.hasDefined(DEFAULT_RESOURCE_ADAPTER_NAME)) {
      DefaultResourceAdapterWriteHandler.INSTANCE.updateDefaultAdapterService(
          context, model, newControllers);
    }

    if (model.hasDefined(DEFAULT_SINGLETON_BEAN_ACCESS_TIMEOUT)) {
      DefaultSingletonBeanAccessTimeoutWriteHandler.INSTANCE
          .updateOrCreateDefaultSingletonBeanAccessTimeoutService(context, model, newControllers);
    }

    if (model.hasDefined(DEFAULT_STATEFUL_BEAN_ACCESS_TIMEOUT)) {
      DefaultStatefulBeanAccessTimeoutWriteHandler.INSTANCE
          .updateOrCreateDefaultStatefulBeanAccessTimeoutService(context, model, newControllers);
    }

    final ServiceTarget serviceTarget = context.getServiceTarget();

    newControllers.add(
        context
            .getServiceTarget()
            .addService(DeploymentRepository.SERVICE_NAME, new DeploymentRepository())
            .install());

    addRemoteInvocationServices(context, newControllers, appclient);

    if (!appclient) {
      final EJBUtilities utilities = new EJBUtilities();
      newControllers.add(
          serviceTarget
              .addService(EJBUtilities.SERVICE_NAME, utilities)
              .addDependency(
                  ConnectorServices.RA_REPOSISTORY_SERVICE,
                  ResourceAdapterRepository.class,
                  utilities.getResourceAdapterRepositoryInjector())
              .addDependency(
                  ConnectorServices.IRONJACAMAR_MDR,
                  MetadataRepository.class,
                  utilities.getMdrInjector())
              .addDependency(
                  SimpleSecurityManagerService.SERVICE_NAME,
                  SimpleSecurityManager.class,
                  utilities.getSecurityManagerInjector())
              .addDependency(
                  TxnServices.JBOSS_TXN_TRANSACTION_MANAGER,
                  TransactionManager.class,
                  utilities.getTransactionManagerInjector())
              .addDependency(
                  TxnServices.JBOSS_TXN_SYNCHRONIZATION_REGISTRY,
                  TransactionSynchronizationRegistry.class,
                  utilities.getTransactionSynchronizationRegistryInjector())
              .addDependency(
                  TxnServices.JBOSS_TXN_USER_TRANSACTION,
                  UserTransaction.class,
                  utilities.getUserTransactionInjector())
              .addListener(verificationHandler)
              .setInitialMode(ServiceController.Mode.ACTIVE)
              .install());

      // create the POA Registry use by iiop
      final POARegistry poaRegistry = new POARegistry();
      newControllers.add(
          context
              .getServiceTarget()
              .addService(POARegistry.SERVICE_NAME, poaRegistry)
              .addDependency(CorbaPOAService.ROOT_SERVICE_NAME, POA.class, poaRegistry.getRootPOA())
              .addListener(verificationHandler)
              .install());
    }
  }