You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/06/10 12:11:13 UTC

[isis] branch master updated: ISIS-2727: remove AnonymousInteractionFactory

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new fe9d58e  ISIS-2727: remove AnonymousInteractionFactory
fe9d58e is described below

commit fe9d58ed13592b52377d80d92d91eed1102c40bd
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jun 10 14:10:57 2021 +0200

    ISIS-2727: remove AnonymousInteractionFactory
    
    (merge up into InteractionService)
    
    remove InteractionFactory, as is now identical to InteractionService
    
    rename InteractionFactoryDefault->
    InteractionServiceDefault
    
    also cleanup InteractionContextFactory
---
 .../org/apache/isis/applib/clock/VirtualClock.java |  5 +-
 .../services/iactnlayer/InteractionService.java    | 24 ++++++-
 .../isis/applib/services/user/UserMemento.java     | 14 ++--
 .../interaction/integration/IsisRequestCycle.java  | 21 ++++--
 .../interaction/session/InteractionFactory.java    | 83 ----------------------
 .../title/TitlesAndTranslationsValidator.java      |  2 +-
 .../core/runtime/context/RuntimeContextBase.java   |  5 +-
 .../IsisModuleCoreRuntimeServices.java             |  4 +-
 ...Default.java => InteractionServiceDefault.java} | 37 +++-------
 .../runtimeservices/sudo/SudoServiceDefault.java   |  6 +-
 .../wrapper/WrapperFactoryDefault.java             |  6 +-
 .../_testing/InteractionService_forTesting.java    | 82 +++++++++++++++++++++
 .../authentication/InteractionContextFactory.java  | 22 ++----
 .../manager/AnonymousInteractionFactory.java       | 78 --------------------
 .../manager/AuthenticationManager.java             |  9 +--
 .../AuthenticationManager_authenticators_Test.java | 14 ++--
 ...rdAuthenticationManager_AuthenticationTest.java |  4 +-
 .../HealthIndicatorUsingHealthCheckService.java    | 10 +--
 .../main/java/demoapp/javafx/DemoAppJavaFx.java    |  4 +-
 .../java/demoapp/webapp/vaadin/DemoAppVaadin.java  |  4 +-
 .../secondary/job/ReplicateAndReplayJob.java       |  8 +--
 .../authenticator/AuthenticatorSecman.java         |  6 +-
 .../shiro/IsisModuleExtSecmanShiroRealm.java       |  8 +--
 .../viewer/javafx/model/context/UiContextFx.java   |  4 +-
 .../javafx/ui/components/object/ObjectViewFx.java  |  9 +--
 .../viewer/javafx/ui/main/MainViewFx.java          |  6 +-
 .../viewer/javafx/ui/main/UiActionHandlerFx.java   |  6 +-
 .../viewer/javafx/ui/main/UiContextFxDefault.java  |  6 +-
 .../viewer/vaadin/model/context/UiContextVaa.java  |  2 +-
 .../ui/auth/VaadinAuthenticationHandler.java       |  8 +--
 .../vaadin/ui/components/object/ObjectViewVaa.java |  2 +-
 .../vaadin/ui/pages/main/UiActionHandlerVaa.java   |  6 +-
 .../vaadin/ui/pages/main/UiContextVaaDefault.java  |  6 +-
 .../viewer/IsisModuleIncViewerVaadinViewer.java    |  6 +-
 .../viewer/vaadin/viewer/IsisServletForVaadin.java | 14 ++--
 .../jdo/JdoExceptionTranslationTest.java           | 76 ++++++++++----------
 ...xceptionTranslationTest_usingTransactional.java | 14 ++--
 ...TransactionRollbackTest_usingTransactional.java | 54 +++++++-------
 .../jdo/JdoTransactionScopeListenerTest.java       | 52 +++++++-------
 .../jpa/JpaExceptionTranslationTest.java           | 82 ++++++++++-----------
 ...xceptionTranslationTest_usingTransactional.java | 16 ++---
 .../jpa/JpaTransactionScopeListenerTest.java       | 52 +++++++-------
 .../applayer/ApplicationLayerTestFactory.java      | 25 +++----
 .../keycloak/webmodule/KeycloakFilter.java         |  6 +-
 .../shiro/authentication/AuthenticatorShiro.java   |  6 +-
 .../spring/webmodule/SpringSecurityFilter.java     |  6 +-
 .../applib/fixturescripts/FixtureScripts.java      |  8 +--
 .../testing/integtestsupport/applib/_Helper.java   |  7 +-
 .../tooling/javamodel/test/ProjectSamples.java     |  2 +-
 .../sse/ui/wkt/services/SseServiceDefault.java     |  6 +-
 ..._ensureCompatibleAcceptHeader_ContractTest.java |  6 +-
 .../viewer/resources/SwaggerSpecResource.java      | 10 +--
 .../IsisRestfulObjectsInteractionFilter.java       | 10 +--
 .../context/ResourceContext_getArg_Test.java       |  6 +-
 .../isis/viewer/wicket/ui/pages/WebPageBase.java   |  8 +--
 .../ui/pages/accmngt/EmailAvailableValidator.java  | 10 +--
 .../pages/accmngt/UsernameAvailableValidator.java  | 10 +--
 .../accmngt/password_reset/PasswordResetPage.java  |  2 +-
 .../accmngt/password_reset/PasswordResetPanel.java |  2 +-
 .../ui/pages/accmngt/register/RegisterPanel.java   |  6 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  5 +-
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |  8 +--
 .../AuthenticatedWebSessionForIsis.java            |  8 +--
 .../viewer/integration/LocalizerForIsis.java       | 10 +--
 .../viewer/integration/WebRequestCycleForIsis.java |  4 +-
 ...uthenticatedWebSessionForIsis_Authenticate.java | 20 +++---
 .../AuthenticatedWebSessionForIsis_SignIn.java     | 16 ++---
 ...uthenticatedWebSessionForIsis_TestAbstract.java | 10 +--
 68 files changed, 511 insertions(+), 583 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
index e01bf1d..0bbdc4c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
@@ -34,14 +34,15 @@ import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 
 import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
-import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 
 import lombok.NonNull;
 import lombok.val;
 
 /**
- * Works in connection with {@code org.apache.isis.core.interaction.session.InteractionFactory},
+ * Works in connection with {@link InteractionService},
  * such that it allows an {@link Interaction}
  * to run with its own simulated (or actual) time.
  *
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/iactnlayer/InteractionService.java b/api/applib/src/main/java/org/apache/isis/applib/services/iactnlayer/InteractionService.java
index 200686e..18e8cc2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/iactnlayer/InteractionService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/iactnlayer/InteractionService.java
@@ -2,6 +2,8 @@ package org.apache.isis.applib.services.iactnlayer;
 
 import java.util.concurrent.Callable;
 
+import org.springframework.boot.autoconfigure.neo4j.Neo4jProperties.Authentication;
+
 import lombok.NonNull;
 
 /**
@@ -65,6 +67,11 @@ public interface InteractionService {
             @NonNull InteractionContext interactionContext);
 
     /**
+     * closes all open {@link InteractionLayer}(s) as stacked on the current thread
+     */
+    void closeInteractionLayers();
+
+    /**
      * @return whether the calling thread is within the context of an open {@link InteractionLayer}
      */
     boolean isInInteraction();
@@ -96,7 +103,20 @@ public interface InteractionService {
     void run(@NonNull InteractionContext interactionContext, @NonNull ThrowingRunnable runnable);
 
     /**
-     * closes all open {@link InteractionLayer}(s) as stacked on the current thread
+     * As per {@link #call(InteractionContext, Callable)}, but using an
+     * anonymous {@link InteractionContext}.
+     *
+     * @param <R>
+     * @param callable (non-null)
      */
-    void closeInteractionLayers();
+    <R> R callAnonymous(@NonNull Callable<R> callable);
+
+    /**
+     * As per {@link #callAnonymous(Callable)}, but for a runnable.
+     *
+     * @param runnable (non-null)
+     */
+    void runAnonymous(@NonNull ThrowingRunnable runnable);
+
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
index 1b3213a..3ae84de 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java
@@ -35,6 +35,7 @@ import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
+import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 
@@ -204,10 +205,11 @@ public final class UserMemento implements Serializable {
     public enum AuthenticationSource {
         DEFAULT,
         /**
-         * Instructs the {@link org.apache.isis.core.security.authentication.manager.AuthenticationManager} to not cache this session in its internal map of
-         * sessions by validation code, and therefore to ignore this aspect when considering if an
-         * {@link Authentication} is
-         * {@link org.apache.isis.core.security.authentication.manager.AuthenticationManager#isSessionValid(Authentication) valid} or not.
+         * Instructs the {@link org.apache.isis.core.security.authentication.manager.AuthenticationManager}
+         * to not cache this session in its internal map of sessions by validation code,
+         * and therefore to ignore this aspect when considering if an {@link InteractionContext} is
+         * {@link org.apache.isis.core.security.authentication.manager.AuthenticationManager#isSessionValid(Authentication) valid}
+         * or not.
          */
         EXTERNAL;
 
@@ -216,6 +218,8 @@ public final class UserMemento implements Serializable {
         }
     }
 
+    private static final String DEFAULT_AUTH_VALID_CODE = "";
+
     /**
      * A unique code given to this user during authentication.
      * <p>
@@ -226,7 +230,7 @@ public final class UserMemento implements Serializable {
     @Property
     @PropertyLayout(sequence = "2.1")
     @Getter @Builder.Default @With(onMethod_ = {@Programmatic})
-    private final @NonNull String authenticationCode = "";
+    private final @NonNull String authenticationCode = DEFAULT_AUTH_VALID_CODE;
 
 
     // -- UTILITY
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/integration/IsisRequestCycle.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/integration/IsisRequestCycle.java
index ed90701..2f6432c 100644
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/integration/IsisRequestCycle.java
+++ b/core/interaction/src/main/java/org/apache/isis/core/interaction/integration/IsisRequestCycle.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.interaction.integration;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.user.ImpersonatedUserHolder;
-import org.apache.isis.core.security.authentication.InteractionContextFactory;
+import org.apache.isis.applib.services.user.UserMemento;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -41,10 +41,12 @@ public class IsisRequestCycle {
     public void onBeginRequest(final InteractionContext authenticatedContext) {
 
         val contextToUse = impersonatedUserHolder.getUserMemento()
-                .<InteractionContext>map(impersonatingUserMemento->
-                    InteractionContextFactory.valid(
-                        impersonatingUserMemento,
-                        authenticatedContext.getUser().getAuthenticationCode()))
+                .map(impersonatingUserMemento->
+                    InteractionContext
+                        .ofUserWithSystemDefaults(
+                                merge(
+                                        authenticatedContext.getUser(),
+                                        impersonatingUserMemento)))
                 .orElse(authenticatedContext);
 
         interactionService.openInteraction(contextToUse);
@@ -55,9 +57,16 @@ public class IsisRequestCycle {
     }
 
     public void onEndRequest() {
-
         interactionService.closeInteractionLayers();
+    }
+
+    // -- HELPER
 
+    // not sure if this is strictly required; idea is to preserve some state from the origin user
+    private static UserMemento merge(UserMemento origin, UserMemento fake) {
+        return fake
+                .withAuthenticationSource(origin.getAuthenticationSource())
+                .withAuthenticationCode(origin.getAuthenticationCode());
     }
 
 
diff --git a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionFactory.java b/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionFactory.java
deleted file mode 100644
index 14f220d..0000000
--- a/core/interaction/src/main/java/org/apache/isis/core/interaction/session/InteractionFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.interaction.session;
-
-import java.util.concurrent.Callable;
-
-import org.apache.isis.applib.services.iactnlayer.InteractionContext;
-import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
-import org.apache.isis.applib.services.iactnlayer.InteractionService;
-import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
-import org.apache.isis.core.security.authentication.manager.AnonymousInteractionFactory;
-
-import lombok.NonNull;
-
-/**
- * The factory of {@link InteractionLayer}(s),
- * holding a reference to the current
- * {@link InteractionLayer authentication layer} stack using
- * a thread-local.
- *
- * <p>
- * @apiNote This is a framework internal class and so does not constitute a formal API.
- * </p>
- *
- * @since 2.0 {@index}
- */
-public interface InteractionFactory
-extends AnonymousInteractionFactory, InteractionService {
-
-//    /**
-//     * As per {@link #call(InteractionContext, Callable)}, using the {@link InteractionContext}
-//     * {@link Authentication#getInteractionContext() obtained} from the provided {@link Authentication}.
-//     *
-//     * @param authentication - the user details to run under (non-null)
-//     * @param callable - the piece of code to run (non-null)
-//     */
-//    <R> R callAuthenticated(@NonNull Authentication authentication, @NonNull Callable<R> callable);
-
-    /**
-     * As per {@link #call(InteractionContext, Callable)}, but using an
-     * anonymous {@link InteractionContext}.
-     *
-     * @param <R>
-     * @param callable (non-null)
-     */
-    @Override
-    <R> R callAnonymous(@NonNull Callable<R> callable);
-
-//    /**
-//     * As per {@link #callAuthenticated(Authentication, Callable)}, but for a runnable.
-//     *
-//     * @param authentication - the user details to run under (non-null)
-//     * @param runnable (non-null)
-//     */
-//    void runAuthenticated(@NonNull Authentication authentication, @NonNull ThrowingRunnable runnable);
-
-    /**
-     * As per {@link #callAnonymous(Callable)}, but for a runnable.
-     *
-     * @param runnable (non-null)
-     */
-    @Override
-    void runAnonymous(@NonNull ThrowingRunnable runnable);
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
index 270f674..47f2412 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitlesAndTranslationsValidator.java
@@ -143,7 +143,7 @@ extends MetaModelValidatorAbstract {
         val translationService = super.getMetaModelContext().getTranslationService();
 
         // as used by the Wicket UI?
-        // final TranslationContext context = "org.apache.isis.core.interaction.session.InteractionFactory";
+        // final TranslationContext context = "org.apache.isis...InteractionService";
 
         // see @ConfirmUiModel#translate()
         val translationContext = TranslationContext.forClassName(MessageRegistry.class);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/context/RuntimeContextBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/context/RuntimeContextBase.java
index 429009f..b711059 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/context/RuntimeContextBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/context/RuntimeContextBase.java
@@ -20,12 +20,11 @@ package org.apache.isis.core.runtime.context;
 
 import java.util.function.Supplier;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.interaction.session.InteractionFactory;
-import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
@@ -69,7 +68,7 @@ public abstract class RuntimeContextBase implements RuntimeContext {
         this.objectManager = mmc.getObjectManager();
         this.transactionService = mmc.getTransactionService();
         this.homePageSupplier = mmc::getHomePageAdapter;
-        this.interactionService = serviceRegistry.lookupServiceElseFail(InteractionFactory.class);
+        this.interactionService = serviceRegistry.lookupServiceElseFail(InteractionService.class);
         this.authenticationManager = serviceRegistry.lookupServiceElseFail(AuthenticationManager.class);
         this.interactionTracker = serviceRegistry.lookupServiceElseFail(InteractionTracker.class);
     }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
index 9291c88..4eef5f1 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java
@@ -54,7 +54,7 @@ import org.apache.isis.core.runtimeservices.recognizer.dae.ExceptionRecognizerFo
 import org.apache.isis.core.runtimeservices.repository.RepositoryServiceDefault;
 import org.apache.isis.core.runtimeservices.routing.RoutingServiceDefault;
 import org.apache.isis.core.runtimeservices.scratchpad.ScratchpadDefault;
-import org.apache.isis.core.runtimeservices.session.InteractionFactoryDefault;
+import org.apache.isis.core.runtimeservices.session.InteractionServiceDefault;
 import org.apache.isis.core.runtimeservices.sudo.SudoServiceDefault;
 import org.apache.isis.core.runtimeservices.transaction.TransactionServiceSpring;
 import org.apache.isis.core.runtimeservices.urlencoding.UrlEncodingServiceWithCompression;
@@ -90,7 +90,7 @@ import org.apache.isis.core.runtimeservices.xmlsnapshot.XmlSnapshotServiceDefaul
         ImpersonatedUserHolderDefault.class,
         ImpersonateMenuAdvisorDefault.class,
         InteractionDtoFactoryDefault.class,
-        InteractionFactoryDefault.class,
+        InteractionServiceDefault.class,
         JaxbServiceDefault.class,
         TranslationServicePo.class,
         MemberExecutorServiceDefault.class,
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java
similarity index 94%
rename from core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java
rename to core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java
index 91038ea..a805b5e 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.util.schema.ChangesDtoUtils;
@@ -60,7 +61,6 @@ import org.apache.isis.core.interaction.integration.InteractionAwareTransactiona
 import org.apache.isis.core.interaction.scope.InteractionScopeAware;
 import org.apache.isis.core.interaction.scope.InteractionScopeBeanFactoryPostProcessor;
 import org.apache.isis.core.interaction.scope.InteractionScopeLifecycleHandler;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.interaction.session.IsisInteraction;
 import org.apache.isis.core.metamodel.services.publishing.CommandPublisher;
@@ -82,14 +82,14 @@ import lombok.extern.log4j.Log4j2;
  * @implNote holds a reference to the current session using a thread-local
  */
 @Service
-@Named("isis.runtimeservices.InteractionFactoryDefault")
+@Named("isis.runtimeservices.InteractionServiceDefault")
 @Order(OrderPrecedence.MIDPOINT)
 @Primary
 @Qualifier("Default")
 @Log4j2
-public class InteractionFactoryDefault
+public class InteractionServiceDefault
 implements
-    InteractionFactory,
+    InteractionService,
     InteractionTracker {
 
     @Inject AuthenticationManager authenticationManager;
@@ -238,7 +238,9 @@ implements
 
     @Override
     @SneakyThrows
-    public <R> R call(@NonNull InteractionContext interactionContext, @NonNull Callable<R> callable) {
+    public <R> R call(
+            final @NonNull InteractionContext interactionContext,
+            final @NonNull Callable<R> callable) {
 
         final int stackSizeWhenEntering = interactionLayerStack.get().size();
         openInteraction(interactionContext);
@@ -251,19 +253,12 @@ implements
         }
     }
 
-
-//    @Override
-//    @SneakyThrows
-//    public <R> R callAuthenticated(
-//            @NonNull final Authentication authentication,
-//            @NonNull final Callable<R> callable) {
-//
-//        return call(authentication.getInteractionContext(), callable);
-//    }
-
     @Override
     @SneakyThrows
-    public void run(@NonNull InteractionContext interactionContext, @NonNull ThrowingRunnable runnable) {
+    public void run(
+            final @NonNull InteractionContext interactionContext,
+            final @NonNull ThrowingRunnable runnable) {
+
         final int stackSizeWhenEntering = interactionLayerStack.get().size();
         openInteraction(interactionContext);
 
@@ -276,16 +271,6 @@ implements
 
     }
 
-//    @Override
-//    @SneakyThrows
-//    public void runAuthenticated(
-//            @NonNull final Authentication authentication,
-//            @NonNull final ThrowingRunnable runnable) {
-//
-//        run(authentication.getInteractionContext(), runnable);
-//    }
-
-
     // -- ANONYMOUS EXECUTION
 
     @Override
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sudo/SudoServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sudo/SudoServiceDefault.java
index b976bf7..7109942 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sudo/SudoServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/sudo/SudoServiceDefault.java
@@ -32,11 +32,11 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.applib.services.sudo.SudoServiceListener;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 
 import lombok.NonNull;
@@ -53,7 +53,7 @@ import jakarta.annotation.PostConstruct;
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
 public class SudoServiceDefault implements SudoService {
 
-    private final InteractionFactory interactionFactory;
+    private final InteractionService interactionService;
     private final InteractionTracker interactionTracker;
 
     // -- LISTENERS
@@ -79,7 +79,7 @@ public class SudoServiceDefault implements SudoService {
         try {
             beforeCall(currentInteractionContext, sudoInteractionContext);
 
-            return interactionFactory
+            return interactionService
                     .call(sudoInteractionContext, callable);
         } finally {
             afterCall(sudoInteractionContext, currentInteractionContext);
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 5a52903..e3f841f 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -50,6 +50,7 @@ import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -82,7 +83,6 @@ import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.proxy._ProxyFactoryService;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
@@ -588,7 +588,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         private final Command parentCommand;
         private final ServiceInjector serviceInjector;
 
-        @Inject InteractionFactory interactionFactory;
+        @Inject InteractionService interactionService;
         @Inject TransactionService transactionService;
         @Inject CommandExecutorService commandExecutorService;
         @Inject Provider<InteractionProvider> interactionProviderProvider;
@@ -599,7 +599,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         @Override
         public R call() {
             serviceInjector.injectServicesInto(this);
-            return interactionFactory.call(interactionContext, this::updateDomainObjectHonoringTransactionalPropagation);
+            return interactionService.call(interactionContext, this::updateDomainObjectHonoringTransactionalPropagation);
         }
 
         private R updateDomainObjectHonoringTransactionalPropagation() {
diff --git a/core/security/src/main/java/org/apache/isis/core/security/_testing/InteractionService_forTesting.java b/core/security/src/main/java/org/apache/isis/core/security/_testing/InteractionService_forTesting.java
new file mode 100644
index 0000000..34e36c4
--- /dev/null
+++ b/core/security/src/main/java/org/apache/isis/core/security/_testing/InteractionService_forTesting.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.security._testing;
+
+import java.util.concurrent.Callable;
+
+import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionLayer;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
+import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
+
+import lombok.NonNull;
+import lombok.SneakyThrows;
+
+/**
+ * A pass-through implementation, free of side-effects,
+ * in support of simple JUnit tests.
+ */
+public class InteractionService_forTesting
+implements InteractionService {
+
+    private boolean isInInteraction = false;
+
+    @Override
+    public InteractionLayer openInteraction() {
+        isInInteraction = true;
+        return null;
+    }
+
+    @Override
+    public InteractionLayer openInteraction(@NonNull InteractionContext interactionContext) {
+        return openInteraction();
+    }
+
+    @Override
+    public void closeInteractionLayers() {
+        isInInteraction = false;
+    }
+
+    @Override
+    public boolean isInInteraction() {
+        return isInInteraction;
+    }
+
+    @Override @SneakyThrows
+    public <R> R call(@NonNull InteractionContext interactionContext, @NonNull Callable<R> callable) {
+        return callable.call();
+    }
+
+    @Override @SneakyThrows
+    public void run(@NonNull InteractionContext interactionContext, @NonNull ThrowingRunnable runnable) {
+        runnable.run();
+    }
+
+
+    @Override @SneakyThrows
+    public void runAnonymous(@NonNull ThrowingRunnable runnable) {
+        runnable.run();
+    }
+
+    @Override @SneakyThrows
+    public <R> R callAnonymous(@NonNull Callable<R> callable) {
+        return callable.call();
+    }
+
+}
\ No newline at end of file
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/InteractionContextFactory.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/InteractionContextFactory.java
index b5fe369..ba9818b 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/InteractionContextFactory.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/InteractionContextFactory.java
@@ -22,17 +22,16 @@ import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.user.UserMemento;
 
 import lombok.NonNull;
+import lombok.experimental.UtilityClass;
 
+@UtilityClass
 public final class InteractionContextFactory {
 
-    public static final String DEFAULT_AUTH_VALID_CODE = "";
-
     public static InteractionContext anonymous() {
         return InteractionContext
                 .ofUserWithSystemDefaults(
                         UserMemento
-                            .system()
-                            .withAuthenticationCode(DEFAULT_AUTH_VALID_CODE));
+                            .system());
     }
 
     public static InteractionContext health() {
@@ -41,16 +40,14 @@ public final class InteractionContextFactory {
                         UserMemento
                             .ofNameAndRoleNames(
                                 "__health", // user name
-                                "__health-role") // role(s)
-                            .withAuthenticationCode(DEFAULT_AUTH_VALID_CODE));
+                                "__health-role")); // role(s)
     }
 
     public static InteractionContext testing() {
         return InteractionContext
                 .ofUserWithSystemDefaults(
                         UserMemento
-                            .ofName("prototyping")
-                            .withAuthenticationCode(DEFAULT_AUTH_VALID_CODE));
+                            .ofName("prototyping"));
     }
 
     public static InteractionContext testing(final @NonNull String authenticationCode) {
@@ -61,14 +58,5 @@ public final class InteractionContextFactory {
                             .withAuthenticationCode(authenticationCode));
     }
 
-    @Deprecated //TODO remove second arg or probably use InteractionContext.of... instead
-    public static InteractionContext valid(
-            final @NonNull UserMemento user,
-            final @NonNull String authenticationCode) {
-
-        return InteractionContext
-                .ofUserWithSystemDefaults(
-                        user.withAuthenticationCode(authenticationCode));
-    }
 
 }
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AnonymousInteractionFactory.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AnonymousInteractionFactory.java
deleted file mode 100644
index 446e7fa..0000000
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AnonymousInteractionFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.security.authentication.manager;
-
-import java.util.concurrent.Callable;
-
-import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
-
-import lombok.NonNull;
-import lombok.SneakyThrows;
-
-/**
- * Inversion of dependency pattern.
- * <p>
- * Introduced to allow the AuthenticationManager (module: security) access to the
- * InteractionFactory service (module: interaction),
- * which otherwise was not possible, due to Maven module dependencies (preventing circles).
- *
- * @apiNote This is a framework internal class and so does not constitute a formal API.
- *
- * @since 2.0 {@index}
- */
-public interface AnonymousInteractionFactory {
-
-    /**
-     * Executes a block of code with anonymous credentials.
-     *
-     * @param runnable
-     */
-    void runAnonymous(@NonNull ThrowingRunnable runnable);
-
-    /**
-     * Executes a block of code with anonymous credentials.
-     *
-     * @param <R>
-     * @param callable (non-null)
-     */
-    <R> R callAnonymous(@NonNull Callable<R> callable);
-
-
-    // -- JUNIT SUPPORT
-
-    /**
-     * Returns a pass-through implementation, free of side-effects,
-     * in support of simple JUnit tests.
-     */
-    static AnonymousInteractionFactory forTesting() {
-        return new AnonymousInteractionFactory() {
-
-            @Override @SneakyThrows
-            public void runAnonymous(@NonNull ThrowingRunnable runnable) {
-                runnable.run();
-            }
-
-            @Override @SneakyThrows
-            public <R> R callAnonymous(@NonNull Callable<R> callable) {
-                return callable.call();
-            }
-
-        };
-    }
-}
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
index 0b809e8..6192b9a 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
@@ -36,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.exceptions.unrecoverable.NoAuthenticatorException;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Timing;
@@ -59,7 +60,7 @@ public class AuthenticationManager {
     @Getter private final @NonNull Can<Authenticator> authenticators;
 
     private final Map<String, String> userByValidationCode = _Maps.newConcurrentHashMap();
-    private final @NonNull AnonymousInteractionFactory anonymousInteractionFactory;
+    private final @NonNull InteractionService interactionService;
     private final @NonNull RandomCodeGenerator randomCodeGenerator;
     private final @NonNull Can<Registrar> registrars;
 
@@ -67,9 +68,9 @@ public class AuthenticationManager {
     public AuthenticationManager(
             final List<Authenticator> authenticators,
             // needs @Lazy due to circular provisioning dependency
-            final @Lazy AnonymousInteractionFactory anonymousInteractionFactory,
+            final @Lazy InteractionService anonymousInteractionFactory,
             final RandomCodeGenerator randomCodeGenerator) {
-        this.anonymousInteractionFactory = anonymousInteractionFactory;
+        this.interactionService = anonymousInteractionFactory;
         this.randomCodeGenerator = randomCodeGenerator;
         this.authenticators = Can.ofCollection(authenticators);
         if (this.authenticators.isEmpty()) {
@@ -100,7 +101,7 @@ public class AuthenticationManager {
 
         // open a new anonymous interaction for this loop to run in
         // we simply participate with the current transaction
-        return anonymousInteractionFactory.callAnonymous(()->{
+        return interactionService.callAnonymous(()->{
 
             for (val authenticator : compatibleAuthenticators) {
                 val authentication = authenticator.authenticate(request, getUnusedRandomCode());
diff --git a/core/security/src/test/java/org/apache/isis/security/authentication/standard/AuthenticationManager_authenticators_Test.java b/core/security/src/test/java/org/apache/isis/security/authentication/standard/AuthenticationManager_authenticators_Test.java
index 5cc8756..0d67d00 100644
--- a/core/security/src/test/java/org/apache/isis/security/authentication/standard/AuthenticationManager_authenticators_Test.java
+++ b/core/security/src/test/java/org/apache/isis/security/authentication/standard/AuthenticationManager_authenticators_Test.java
@@ -23,17 +23,17 @@ import java.util.Collections;
 
 import org.junit.Test;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import org.apache.isis.applib.exceptions.unrecoverable.NoAuthenticatorException;
+import org.apache.isis.core.security._testing.InteractionService_forTesting;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
-import org.apache.isis.core.security.authentication.manager.AnonymousInteractionFactory;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.security.authentication.standard.RandomCodeGeneratorDefault;
 import org.apache.isis.security.AuthenticatorsForTesting;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.hamcrest.MatcherAssert.assertThat;
-
 import lombok.val;
 
 public class AuthenticationManager_authenticators_Test {
@@ -45,7 +45,7 @@ public class AuthenticationManager_authenticators_Test {
 
         authenticationManager = new AuthenticationManager(
                 Collections.emptyList(),
-                AnonymousInteractionFactory.forTesting(),
+                new InteractionService_forTesting(),
                 new RandomCodeGeneratorDefault());
         authenticationManager.authenticate(new AuthenticationRequestPassword("foo", "bar"));
     }
@@ -57,7 +57,7 @@ public class AuthenticationManager_authenticators_Test {
 
         authenticationManager = new AuthenticationManager(
                 Collections.singletonList(auth),
-                AnonymousInteractionFactory.forTesting(),
+                new InteractionService_forTesting(),
                 new RandomCodeGeneratorDefault());
         assertThat(authenticationManager.getAuthenticators().size(), is(1));
         assertThat(authenticationManager.getAuthenticators().getElseFail(0), is(sameInstance(auth)));
diff --git a/core/security/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java b/core/security/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
index 241a53a..e462f8f 100644
--- a/core/security/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
+++ b/core/security/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
@@ -28,8 +28,8 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.core.security._testing.InteractionService_forTesting;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
-import org.apache.isis.core.security.authentication.manager.AnonymousInteractionFactory;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.security.authentication.standard.RandomCodeGeneratorDefault;
 import org.apache.isis.security.AuthenticatorsForTesting;
@@ -43,7 +43,7 @@ public class StandardAuthenticationManager_AuthenticationTest {
 
         authenticationManager = new AuthenticationManager(
                 Collections.singletonList(AuthenticatorsForTesting.authenticatorValidForFoo()),
-                AnonymousInteractionFactory.forTesting(),
+                new InteractionService_forTesting(),
                 new RandomCodeGeneratorDefault());
     }
 
diff --git a/core/webapp/src/main/java/org/apache/isis/core/webapp/health/HealthIndicatorUsingHealthCheckService.java b/core/webapp/src/main/java/org/apache/isis/core/webapp/health/HealthIndicatorUsingHealthCheckService.java
index 6f561ec..1306752 100644
--- a/core/webapp/src/main/java/org/apache/isis/core/webapp/health/HealthIndicatorUsingHealthCheckService.java
+++ b/core/webapp/src/main/java/org/apache/isis/core/webapp/health/HealthIndicatorUsingHealthCheckService.java
@@ -28,7 +28,7 @@ import org.springframework.boot.actuate.health.Health;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.services.health.HealthCheckService;
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.security.authentication.InteractionContextFactory;
 
 import lombok.val;
@@ -37,14 +37,14 @@ import lombok.val;
 @Named("isis.webapp.HealthCheckService") // logical name appears in the endpoint
 public class HealthIndicatorUsingHealthCheckService extends AbstractHealthIndicator {
 
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
     private final Optional<HealthCheckService> healthCheckServiceIfAny;
 
     @Inject
     public HealthIndicatorUsingHealthCheckService(
-            final InteractionFactory isisInteractionFactory,
+            final InteractionService interactionService,
             final Optional<HealthCheckService> healthCheckServiceIfAny) {
-        this.isisInteractionFactory = isisInteractionFactory;
+        this.interactionService = interactionService;
         this.healthCheckServiceIfAny = healthCheckServiceIfAny;
     }
 
@@ -52,7 +52,7 @@ public class HealthIndicatorUsingHealthCheckService extends AbstractHealthIndica
     protected void doHealthCheck(Health.Builder builder) throws Exception {
         val health = healthCheckServiceIfAny
                 .map(healthCheckService ->
-                    isisInteractionFactory
+                    interactionService
                         .call(InteractionContextFactory.health(), healthCheckService::check))
                 .orElse(null);
         if(health != null) {
diff --git a/examples/demo/javafx/src/main/java/demoapp/javafx/DemoAppJavaFx.java b/examples/demo/javafx/src/main/java/demoapp/javafx/DemoAppJavaFx.java
index 59c1a23..ab5b32a 100644
--- a/examples/demo/javafx/src/main/java/demoapp/javafx/DemoAppJavaFx.java
+++ b/examples/demo/javafx/src/main/java/demoapp/javafx/DemoAppJavaFx.java
@@ -24,7 +24,7 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.runtimeservices.session.InteractionFactoryDefault;
+import org.apache.isis.core.runtimeservices.session.InteractionServiceDefault;
 import org.apache.isis.incubator.viewer.javafx.model.events.JavaFxViewerConfig;
 import org.apache.isis.incubator.viewer.javafx.model.util._fx;
 import org.apache.isis.incubator.viewer.javafx.viewer.IsisModuleIncViewerJavaFxViewer;
@@ -59,7 +59,7 @@ public class DemoAppJavaFx {
 
     public static void main(String[] args) {
 
-        IsisPresets.logging(InteractionFactoryDefault.class, "debug");
+        IsisPresets.logging(InteractionServiceDefault.class, "debug");
         IsisPresets.logging(_Probe.class, "debug"); // enable debug entry logging
 
         IsisPresets.prototyping(); // use prototyping mode as default, unless explicitly overridden (INCUBATING)
diff --git a/examples/demo/vaadin/src/main/java/demoapp/webapp/vaadin/DemoAppVaadin.java b/examples/demo/vaadin/src/main/java/demoapp/webapp/vaadin/DemoAppVaadin.java
index 0771e1d..fe86481 100644
--- a/examples/demo/vaadin/src/main/java/demoapp/webapp/vaadin/DemoAppVaadin.java
+++ b/examples/demo/vaadin/src/main/java/demoapp/webapp/vaadin/DemoAppVaadin.java
@@ -25,7 +25,7 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.runtimeservices.session.InteractionFactoryDefault;
+import org.apache.isis.core.runtimeservices.session.InteractionServiceDefault;
 import org.apache.isis.incubator.viewer.vaadin.viewer.IsisModuleIncViewerVaadinViewer;
 import org.apache.isis.valuetypes.asciidoc.ui.vaa.IsisModuleValAsciidocUiVaa;
 import org.apache.isis.valuetypes.asciidoc.ui.wkt.IsisModuleValAsciidocUiWkt;
@@ -61,7 +61,7 @@ public class DemoAppVaadin extends SpringBootServletInitializer {
      */
     public static void main(String[] args) {
 
-        IsisPresets.logging(InteractionFactoryDefault.class, "debug");
+        IsisPresets.logging(InteractionServiceDefault.class, "debug");
 //        IsisPresets.logging(VaadinAuthenticationHandler.class, "debug");
 //        IsisPresets.logging(IsisServletForVaadin.class, "debug");
         IsisPresets.logging(_Probe.class, "debug"); // enable debug entry logging
diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java
index 0716308..ed9c3eb 100644
--- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java
+++ b/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java
@@ -26,8 +26,8 @@ import org.quartz.JobExecutionContext;
 import org.quartz.PersistJobDataAfterExecution;
 
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.user.UserMemento;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.extensions.commandreplay.secondary.SecondaryStatus;
 import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig;
 import org.apache.isis.extensions.commandreplay.secondary.jobcallables.IsTickingClockInitialized;
@@ -64,7 +64,7 @@ public class ReplicateAndReplayJob implements Job {
         }
     }
 
-    @Inject protected InteractionFactory isisInteractionFactory;
+    @Inject protected InteractionService interactionService;
 
     private void exec(final JobExecutionContext quartzContext) {
         val ssh = new SecondaryStatusData(quartzContext);
@@ -87,7 +87,7 @@ public class ReplicateAndReplayJob implements Job {
 
             case OK:
                 val newStatus =
-                        isisInteractionFactory.call(authentication, new ReplicateAndRunCommands());
+                        interactionService.call(authentication, new ReplicateAndRunCommands());
 
                 if(newStatus != null) {
                     ssh.setSecondaryStatus(newStatus);
@@ -105,7 +105,7 @@ public class ReplicateAndReplayJob implements Job {
     }
 
     private boolean isTickingClockInitialized(final InteractionContext authentication) {
-        return isisInteractionFactory.call(authentication, new IsTickingClockInitialized());
+        return interactionService.call(authentication, new IsTickingClockInitialized());
     }
 
 }
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
index f30f014..052a62d 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.core.security.authentication.AuthenticationRequest;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
 import org.apache.isis.core.security.authentication.Authenticator;
-import org.apache.isis.core.security.authentication.InteractionContextFactory;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
@@ -79,8 +78,9 @@ public class AuthenticatorSecman implements Authenticator {
                     val roleNames = Stream.concat(
                             appUser.getRoles().stream().map(ApplicationRole::getName),
                             request.streamRoles());
-                    val user = UserMemento.ofNameAndRoleNames(username, roleNames);
-                    return InteractionContextFactory.valid(user, code);
+                    val user = UserMemento.ofNameAndRoleNames(username, roleNames)
+                            .withAuthenticationCode(code);
+                    return InteractionContext.ofUserWithSystemDefaults(user);
                 })
                 .orElse(null);
     }
diff --git a/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/IsisModuleExtSecmanShiroRealm.java b/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/IsisModuleExtSecmanShiroRealm.java
index f59e1e9..d8866e4 100644
--- a/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/IsisModuleExtSecmanShiroRealm.java
+++ b/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/IsisModuleExtSecmanShiroRealm.java
@@ -37,17 +37,17 @@ import org.apache.shiro.subject.PrincipalCollection;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.support.TransactionTemplate;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.security.authorization.Authorizor;
 import org.apache.isis.extensions.secman.applib.SecmanConfiguration;
-import org.apache.isis.extensions.secman.applib.user.spi.PasswordEncryptionService;
 import org.apache.isis.extensions.secman.applib.user.dom.AccountType;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
+import org.apache.isis.extensions.secman.applib.user.spi.PasswordEncryptionService;
 import org.apache.isis.extensions.secman.shiro.util.ShiroUtils;
 
 import lombok.Getter;
@@ -61,7 +61,7 @@ public class IsisModuleExtSecmanShiroRealm extends AuthorizingRealm {
 
     private static final String SECMAN_UNLOCK_DELEGATED_USERS = "isis.ext.secman.unlockDelegatedUsers";
 	@Inject protected ServiceInjector serviceInjector;
-    @Inject protected InteractionFactory isisInteractionFactory;
+    @Inject protected InteractionService interactionService;
     @Inject protected PlatformTransactionManager txMan;
     @Inject private SecmanConfiguration configBean;
 	@Inject protected IsisConfiguration isisConfiguration;
@@ -279,7 +279,7 @@ public class IsisModuleExtSecmanShiroRealm extends AuthorizingRealm {
     }
 
     <V> V execute(final Supplier<V> closure) {
-        return isisInteractionFactory.callAnonymous(
+        return interactionService.callAnonymous(
                 new Callable<V>() {
                     @Override
                     public V call() {
diff --git a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/context/UiContextFx.java b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/context/UiContextFx.java
index 19192cd..5d5f71b 100644
--- a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/context/UiContextFx.java
+++ b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/context/UiContextFx.java
@@ -22,7 +22,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.incubator.viewer.javafx.model.action.ActionUiModelFactoryFx;
 import org.apache.isis.incubator.viewer.javafx.model.events.JavaFxViewerConfig;
@@ -39,7 +39,7 @@ public interface UiContextFx {
 
     JavaFxViewerConfig getJavaFxViewerConfig();
 
-    InteractionFactory getIsisInteractionFactory();
+    InteractionService getInteractionService();
     ActionUiModelFactoryFx getActionUiModelFactory();
 
     void setNewPageHandler(Consumer<Node> onNewPage);
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/object/ObjectViewFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/object/ObjectViewFx.java
index d5a9410..d098b9f 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/object/ObjectViewFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/object/ObjectViewFx.java
@@ -48,13 +48,14 @@ import org.apache.isis.viewer.common.model.components.UiComponentFactory;
 import org.apache.isis.viewer.common.model.decorator.disable.DisablingUiModel;
 import org.apache.isis.viewer.common.model.gridlayout.UiGridLayout;
 
-import javafx.scene.control.TabPane;
-import javafx.scene.layout.Pane;
-import javafx.scene.layout.VBox;
 import lombok.NonNull;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
+import javafx.scene.control.TabPane;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+
 @Log4j2
 public class ObjectViewFx extends VBox {
 
@@ -77,7 +78,7 @@ public class ObjectViewFx extends VBox {
             final ManagedObject managedObject) {
 
         log.info("binding object interaction to owner {}", managedObject.getSpecification().getIdentifier());
-        _Assert.assertTrue(uiContext.getIsisInteractionFactory().isInInteraction(), "requires an active interaction");
+        _Assert.assertTrue(uiContext.getInteractionService().isInInteraction(), "requires an active interaction");
 
         val objectTitle = ManagedObjects.titleOf(managedObject);
 
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MainViewFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MainViewFx.java
index 09c497c..7ec0abf 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MainViewFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MainViewFx.java
@@ -23,7 +23,7 @@ import javax.inject.Inject;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
@@ -57,7 +57,7 @@ public class MainViewFx {
     private final JavaFxViewerConfig viewerConfig;
     private final MetaModelContext metaModelContext;
     private final HeaderUiModelProvider headerUiModelProvider;
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
     private final UiContextFx uiContext;
     private final UiActionHandlerFx uiActionHandler;
     private final UiComponentFactoryFx uiComponentFactory;
@@ -82,7 +82,7 @@ public class MainViewFx {
         contentView.setVbarPolicy(ScrollBarPolicy.ALWAYS);
         contentPane.setFillWidth(true);
         //_fx.borderDashed(contentPane, Color.CRIMSON); //debug
-        isisInteractionFactory.runAnonymous(this::buildMenu);
+        interactionService.runAnonymous(this::buildMenu);
 
         renderHomepage();
     }
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiActionHandlerFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiActionHandlerFx.java
index b536ba8..0b60646 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiActionHandlerFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiActionHandlerFx.java
@@ -22,8 +22,8 @@ import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -46,7 +46,7 @@ import javafx.scene.layout.GridPane;
 public class UiActionHandlerFx {
 
     private final UiContextFx uiContext;
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
     private final UiComponentFactoryFx uiComponentFactory;
 
     public void handleActionLinkClicked(ManagedAction managedAction) {
@@ -107,7 +107,7 @@ public class UiActionHandlerFx {
             ManagedAction managedAction,
             Can<ManagedObject> params) {
 
-        isisInteractionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             //Thread.sleep(1000); // simulate long running
 
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiContextFxDefault.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiContextFxDefault.java
index 59d45bb..a2e0f3c 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiContextFxDefault.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/UiContextFxDefault.java
@@ -26,7 +26,7 @@ import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.incubator.viewer.javafx.model.action.ActionUiModelFactoryFx;
 import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx;
@@ -54,7 +54,7 @@ public class UiContextFxDefault implements UiContextFx {
     @Getter(onMethod_ = {@Override})
     private final JavaFxViewerConfig javaFxViewerConfig;
     @Getter(onMethod_ = {@Override})
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
     @Getter(onMethod_ = {@Override})
     private final ActionUiModelFactoryFx actionUiModelFactory = new ActionUiModelFactoryFx();
 
@@ -72,7 +72,7 @@ public class UiContextFxDefault implements UiContextFx {
 
     @Override
     public void route(Supplier<ManagedObject> objectSupplier) {
-        isisInteractionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
             val object = objectSupplier.get();
             route(object);
         });
diff --git a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/context/UiContextVaa.java b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/context/UiContextVaa.java
index 5d2f187..910e826 100644
--- a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/context/UiContextVaa.java
+++ b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/context/UiContextVaa.java
@@ -31,7 +31,7 @@ public interface UiContextVaa {
 
     //JavaFxViewerConfig getJavaFxViewerConfig();
 
-    InteractionService getIsisInteractionFactory();
+    InteractionService getInteractionService();
     //ActionUiModelFactoryFx getActionUiModelFactory();
 
     void setNewPageHandler(Consumer<Component> onNewPage);
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/auth/VaadinAuthenticationHandler.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/auth/VaadinAuthenticationHandler.java
index 30f1025..a7d3064 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/auth/VaadinAuthenticationHandler.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/auth/VaadinAuthenticationHandler.java
@@ -33,8 +33,8 @@ import com.vaadin.flow.theme.lumo.Lumo;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.security.authentication.AuthenticationRequest;
 import org.apache.isis.incubator.viewer.vaadin.ui.pages.login.VaadinLoginView;
@@ -59,7 +59,7 @@ implements
 
     private static final long serialVersionUID = 1L;
 
-    @Inject private transient InteractionFactory isisInteractionFactory;
+    @Inject private transient InteractionService interactionService;
     @Inject private transient MetaModelContext metaModelContext;
 
     @Override
@@ -99,7 +99,7 @@ implements
      */
     public <R> R callAuthenticated(Callable<R> callable) {
         return AuthSessionStoreUtil.get()
-                .map(authentication->isisInteractionFactory.call(authentication, callable))
+                .map(authentication->interactionService.call(authentication, callable))
                 .orElse(null); // TODO redirect to login
     }
 
@@ -121,7 +121,7 @@ implements
 
         val authentication = AuthSessionStoreUtil.get().orElse(null);
         if(authentication!=null) {
-            isisInteractionFactory.openInteraction(authentication);
+            interactionService.openInteraction(authentication);
             return; // access granted
         }
         // otherwise redirect to login page
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
index e59d90f..72c9be4 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectViewVaa.java
@@ -85,7 +85,7 @@ public class ObjectViewVaa extends VerticalLayout {
             final ManagedObject managedObject) {
 
         log.info("binding object interaction to owner {}", managedObject.getSpecification().getIdentifier());
-        _Assert.assertTrue(uiContext.getIsisInteractionFactory().isInInteraction(), "requires an active interaction");
+        _Assert.assertTrue(uiContext.getInteractionService().isInInteraction(), "requires an active interaction");
 
         val objectTitle = ManagedObjects.titleOf(managedObject);
 
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
index 2657c3b..fdee429 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
@@ -22,8 +22,8 @@ import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.incubator.viewer.vaadin.model.context.UiContextVaa;
@@ -40,7 +40,7 @@ import lombok.extern.log4j.Log4j2;
 public class UiActionHandlerVaa {
 
     private final UiContextVaa uiContext;
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
     private final UiComponentFactoryVaa uiComponentFactory;
 
     public void handleActionLinkClicked(ManagedAction managedAction) {
@@ -74,7 +74,7 @@ public class UiActionHandlerVaa {
             ManagedAction managedAction,
             Can<ManagedObject> params) {
 
-        isisInteractionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             //Thread.sleep(1000); // simulate long running
 
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
index 4915d0a..435e590 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiContextVaaDefault.java
@@ -28,7 +28,7 @@ import com.vaadin.flow.component.Component;
 
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.incubator.viewer.vaadin.model.context.UiContextVaa;
 
@@ -46,7 +46,7 @@ public class UiContextVaaDefault implements UiContextVaa {
 //    @Getter(onMethod_ = {@Override})
 //    private final JavaFxViewerConfig javaFxViewerConfig;
     @Getter(onMethod_ = {@Override})
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
 //    @Getter(onMethod_ = {@Override})
 //    private final ActionUiModelFactoryFx actionUiModelFactory = new ActionUiModelFactoryFx();
 
@@ -64,7 +64,7 @@ public class UiContextVaaDefault implements UiContextVaa {
 
     @Override
     public void route(Supplier<ManagedObject> objectSupplier) {
-        isisInteractionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
             val object = objectSupplier.get();
             route(object);
         });
diff --git a/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisModuleIncViewerVaadinViewer.java b/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisModuleIncViewerVaadinViewer.java
index ca77f24..ead2a01 100644
--- a/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisModuleIncViewerVaadinViewer.java
+++ b/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisModuleIncViewerVaadinViewer.java
@@ -41,7 +41,7 @@ import org.springframework.util.ClassUtils;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.incubator.viewer.vaadin.ui.IsisModuleIncViewerVaadinUi;
 
 import lombok.val;
@@ -71,7 +71,7 @@ public class IsisModuleIncViewerVaadinViewer {
 
     @Inject private WebApplicationContext context;
     @Inject private VaadinConfigurationProperties configurationProperties;
-    @Inject private InteractionFactory interactionFactory;
+    @Inject private InteractionService interactionService;
 
     /**
      * Creates a {@link ServletContextInitializer} instance.
@@ -99,7 +99,7 @@ public class IsisModuleIncViewerVaadinViewer {
                     makeContextRelative(urlMapping.replace("*", "")));
         }
         val registration = new ServletRegistrationBean<SpringServlet>(
-                new IsisServletForVaadin(interactionFactory, context, isRootMapping),
+                new IsisServletForVaadin(interactionService, context, isRootMapping),
                 urlMapping);
         registration.setInitParameters(initParameters);
         registration.setAsyncSupported(configurationProperties.isAsyncSupported());
diff --git a/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisServletForVaadin.java b/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisServletForVaadin.java
index 0ffa451..32eb657 100644
--- a/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisServletForVaadin.java
+++ b/incubator/viewers/vaadin/viewer/src/main/java/org/apache/isis/incubator/viewer/vaadin/viewer/IsisServletForVaadin.java
@@ -29,7 +29,7 @@ import com.vaadin.flow.spring.SpringServlet;
 import org.springframework.context.ApplicationContext;
 
 import org.apache.isis.applib.services.iactn.Interaction;
-import org.apache.isis.core.interaction.session.InteractionFactory;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.incubator.viewer.vaadin.ui.auth.AuthSessionStoreUtil;
 
 import lombok.NonNull;
@@ -47,14 +47,14 @@ extends SpringServlet {
 
     private static final long serialVersionUID = 1L;
 
-    private final InteractionFactory interactionFactory;
+    private final InteractionService interactionService;
 
     public IsisServletForVaadin(
-            @NonNull final InteractionFactory interactionFactory,
+            @NonNull final InteractionService interactionService,
             @NonNull final ApplicationContext context,
             final boolean forwardingEnforced) {
         super(context, forwardingEnforced);
-        this.interactionFactory = interactionFactory;
+        this.interactionService = interactionService;
     }
 
 
@@ -68,7 +68,7 @@ extends SpringServlet {
         log.debug("new request incoming (authentication={})", authentication);
 
         if(authentication!=null) {
-            interactionFactory.run(authentication, ()->{
+            interactionService.run(authentication, ()->{
                 super.service(request, response);
             });
         } else {
@@ -79,8 +79,8 @@ extends SpringServlet {
 
         log.debug("request was successfully serviced (authentication={})", authentication);
 
-        if(interactionFactory.isInInteraction()) {
-            interactionFactory.closeInteractionLayers();
+        if(interactionService.isInInteraction()) {
+            interactionService.closeInteractionLayers();
             log.warn("after servicing current request some interactions have been closed forcefully (authentication={})", authentication);
         }
 
diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java
index d1af388..e3d122e 100644
--- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java
+++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java
@@ -37,10 +37,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.persistence.jdo.spring.integration.JdoTransactionManager;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.entities.JdoInventory;
@@ -48,21 +48,21 @@ import org.apache.isis.testdomain.jdo.entities.JdoInventory;
 import lombok.val;
 
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJdo.class,
         })
 @TestPropertySources({
-    @TestPropertySource(IsisPresets.UseLog4j2Test)    
+    @TestPropertySource(IsisPresets.UseLog4j2Test)
 })
 //@Transactional ... we manage transaction ourselves
 class JdoExceptionTranslationTest
 {
 
     // @Inject private JdoSupportService JdoSupport;
-    
+
     @Inject private TransactionService transactionService;
     @Inject private RepositoryService repositoryService;
-    @Inject private InteractionFactory interactionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private JdoTransactionManager txManager;
 
     @BeforeAll
@@ -71,75 +71,75 @@ class JdoExceptionTranslationTest
         // Util_H2Console.main(null);
     }
 
-    @Test 
+    @Test
     void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() {
 
-        
+
         transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-            
-            interactionFactory.runAnonymous(()->{
-            
+
+            interactionService.runAnonymous(()->{
+
                 _TestFixtures.setUp3Books(repositoryService);
-                
+
             });
-            
-            
+
+
         });
-        
+
         // when adding a book for which one with same ISBN already exists in the database,
-        // we expect to see a Spring recognized DataAccessException been thrown 
-        
+        // we expect to see a Spring recognized DataAccessException been thrown
+
         assertThrows(DataAccessException.class, ()->{
 
             transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-                
-                interactionFactory.runAnonymous(()->{
-                
+
+                interactionService.runAnonymous(()->{
+
                     // given
-                    
+
                     val inventories = repositoryService.allInstances(JdoInventory.class);
                     assertEquals(1, inventories.size());
-                    
+
                     val inventory = inventories.get(0);
                     assertNotNull(inventory);
-                    
-                    
+
+
                     // add a conflicting book (unique ISBN violation)
                     _TestFixtures.addABookTo(inventory);
-                
+
                 });
-    
+
             })
             .ifSuccess(__->fail("expected to fail, but did not"))
             //.mapFailure(ex->_JdoExceptionTranslator.translate(ex, txManager))
             .ifFailure(ex->assertTrue(ex instanceof DataIntegrityViolationException))
             .optionalElseFail();
-            
+
         });
-        
+
         // expected post condition: ONE inventory with 3 books
-        
+
         transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-            
-            interactionFactory.runAnonymous(()->{
-            
+
+            interactionService.runAnonymous(()->{
+
                 val inventories = repositoryService.allInstances(JdoInventory.class);
                 assertEquals(1, inventories.size());
-                
+
                 val inventory = inventories.get(0);
                 assertNotNull(inventory);
-                
+
                 assertNotNull(inventory);
                 assertNotNull(inventory.getProducts());
                 assertEquals(3, inventory.getProducts().size());
 
                 _TestFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3);
-                
+
             });
-            
-            
+
+
         });
 
-        
-    }    
+
+    }
 }
diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java
index cfed472..ee720be 100644
--- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java
+++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java
@@ -41,10 +41,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
-import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
+import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.persistence.jdo.spring.integration.JdoTransactionManager;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.JdoInventoryDao;
@@ -67,7 +67,7 @@ class JdoExceptionTranslationTest_usingTransactional
     //@Inject private JdoSupportService jdoSupport;
     //@Inject private TransactionService transactionService;
     @Inject private RepositoryService repositoryService;
-    @Inject private InteractionFactory interactionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private Provider<JdoInventoryDao> inventoryDao;
     @Inject private JdoTransactionManager txManager;
 
@@ -80,7 +80,7 @@ class JdoExceptionTranslationTest_usingTransactional
     @Test @Order(1)
     @Transactional @Rollback(false)
     void booksUniqueByIsbn_setupPhase() {
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             _TestFixtures.setUp3Books(repositoryService);
 
@@ -98,7 +98,7 @@ class JdoExceptionTranslationTest_usingTransactional
 
         assertThrows(DataIntegrityViolationException.class, ()->{
 
-            interactionFactory.runAnonymous(()->{
+            interactionService.runAnonymous(()->{
 
                 ThrowingRunnable.resultOf(uniqueConstraintViolator)
                 .ifSuccess(__->fail("expected to fail, but did not"))
@@ -118,7 +118,7 @@ class JdoExceptionTranslationTest_usingTransactional
 
         // expected post condition: ONE inventory with 3 books
 
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             val inventories = repositoryService.allInstances(JdoInventory.class);
             assertEquals(1, inventories.size());
@@ -140,7 +140,7 @@ class JdoExceptionTranslationTest_usingTransactional
     @Transactional @Rollback(false)
     void booksUniqueByIsbn_cleanupPhase() {
 
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             _TestFixtures.cleanUp(repositoryService);
 
diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java
index 4826bf4..f943bfc 100644
--- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java
+++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.testdomain.transactions.jdo;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.MethodOrderer;
@@ -30,9 +28,11 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.annotation.Commit;
 import org.springframework.transaction.annotation.Transactional;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.debug._Probe;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
@@ -40,11 +40,11 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
 /**
  * These tests use the {@code @Transactional} annotation as provided by Spring.
- * <p> 
- * We test whether JUnit Tests are automatically rolled back by Spring. 
+ * <p>
+ * We test whether JUnit Tests are automatically rolled back by Spring.
  */
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJdo.class
         },
         properties = {
@@ -52,59 +52,59 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
                 "logging.level.org.springframework.test.context.transaction.*=DEBUG",
                 "logging.level.org.datanucleus.*=DEBUG",
                 "logging.config=log4j2-debug-persistence.xml"
-                
+
         })
 @Transactional
 //@TestPropertySource(IsisPresets.UseLog4j2Test)
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 class JdoTransactionRollbackTest_usingTransactional
 {
-    
+
     @Inject private FixtureScripts fixtureScripts;
     @Inject private RepositoryService repository;
-    @Inject private InteractionFactory interactionFactory;
-    
+    @Inject private InteractionService interactionService;
+
     @Test @Order(1) @Commit
     void cleanup_justInCase() {
-   
+
         // cleanup just in case
         fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
     }
-    
+
     @Test @Order(2)
     void happyCaseTx_shouldCommit() {
-   
+
         _Probe.errOut("before interaction");
-        
-        interactionFactory.runAnonymous(()->{
-            
+
+        interactionService.runAnonymous(()->{
+
             // expected pre condition
             assertEquals(0, repository.allInstances(JdoBook.class).size());
-                
+
             _Probe.errOut("before fixture");
-            
+
             fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
-            
+
             _Probe.errOut("after fixture");
-            
+
             // expected post condition
             assertEquals(1, repository.allInstances(JdoBook.class).size());
-            
-            
+
+
         });
-        
+
         _Probe.errOut("after interaction");
-        
+
     }
-    
+
     @Test @Order(3)
     void previousTest_shouldHaveBeenRolledBack() {
 
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             // expected condition
             assertEquals(0, repository.allInstances(JdoBook.class).size());
-        
+
         });
 
     }
diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java
index bddc2da..246bfad 100644
--- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java
+++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.testdomain.transactions.jdo;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -27,10 +25,12 @@ import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
@@ -39,7 +39,7 @@ import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJdo.class,
                 InteractionBoundaryProbe.class
         })
@@ -49,64 +49,64 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
  * With this test we manage IsisInteractions ourselves. (not sub-classing IsisIntegrationTestAbstract)
  */
 class JdoTransactionScopeListenerTest {
-    
+
     @Inject private FixtureScripts fixtureScripts;
     @Inject private TransactionService transactionService;
     @Inject private RepositoryService repository;
-    @Inject private InteractionFactory isisInteractionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private KVStoreForTesting kvStoreForTesting;
-    
+
     /* Expectations:
      * 1. for each InteractionScope there should be a new InteractionBoundaryProbe instance
      * 2. for each Transaction the current InteractionBoundaryProbe should get notified
-     * 
+     *
      * first we have 1 InteractionScope with 1 expected Transaction during 'setUp'
      * then we have 1 InteractionScope with 3 expected Transactions within the test method
-     *  
+     *
      */
-    
+
     @BeforeEach
     void setUp() {
-        
+
         // new InteractionScope with a new transaction (#1)
-        isisInteractionFactory.runAnonymous(()->{
-        
+        interactionService.runAnonymous(()->{
+
             // cleanup
             fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
-            
+
         });
-        
+
     }
-    
+
     @Test
     void sessionScopedProbe_shouldBeReused_andBeAwareofTransactionBoundaries() {
-        
+
         // new InteractionScope with a new transaction (#2)
-        isisInteractionFactory.runAnonymous(()->{
-            
+        interactionService.runAnonymous(()->{
+
             // expected pre condition
             // reuse transaction (#2)
             assertEquals(0, repository.allInstances(JdoBook.class).size());
-        
+
             // reuse transaction (#2)
             transactionService.runWithinCurrentTransactionElseCreateNew(()->{
-                
+
                 fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
-                
+
             });
-            
+
             // expected post condition
             // reuse transaction (#2)
             assertEquals(1, repository.allInstances(JdoBook.class).size());
-            
+
         });
-        
+
         assertEquals(2, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting));
 
     }
-    
+
 
 }
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest.java
index 983ce9c..bbe9fc5 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest.java
@@ -32,37 +32,37 @@ import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.TestPropertySources;
 import org.springframework.transaction.annotation.Propagation;
 
-import static org.junit.Assert.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.jpa.entities.JpaInventory;
 
 import lombok.val;
 
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJpa.class,
         })
 @TestPropertySources({
-    @TestPropertySource(IsisPresets.UseLog4j2Test)    
+    @TestPropertySource(IsisPresets.UseLog4j2Test)
 })
 //@Transactional ... we manage transaction ourselves
 class JpaExceptionTranslationTest
 {
 
     // @Inject private JpaSupportService jpaSupport;
-    
+
     @Inject private TransactionService transactionService;
     @Inject private RepositoryService repositoryService;
-    @Inject private InteractionFactory interactionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private JpaTransactionManager txManager;
 
     @BeforeAll
@@ -71,76 +71,76 @@ class JpaExceptionTranslationTest
         // Util_H2Console.main(null);
     }
 
-    @Test 
+    @Test
     void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() {
 
-        
+
         transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-            
-            interactionFactory.runAnonymous(()->{
-            
+
+            interactionService.runAnonymous(()->{
+
                 _TestFixtures.setUp3Books(repositoryService);
-                
+
             });
-            
-            
+
+
         });
-        
+
         // when adding a book for which one with same ISBN already exists in the database,
-        // we expect to see a Spring recognized DataAccessException been thrown 
-        
+        // we expect to see a Spring recognized DataAccessException been thrown
+
         assertThrows(DataAccessException.class, ()->{
-        
+
             transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-                
-                interactionFactory.runAnonymous(()->{
-                
+
+                interactionService.runAnonymous(()->{
+
                     // given
-                    
+
                     val inventories = repositoryService.allInstances(JpaInventory.class);
                     assertEquals(1, inventories.size());
-                    
+
                     val inventory = inventories.get(0);
                     assertNotNull(inventory);
-                    
-                    
+
+
                     // add a conflicting book (unique ISBN violation)
                     _TestFixtures.addABookTo(inventory);
-                
+
                 });
-    
+
             })
             .ifSuccess(__->fail("expected to fail, but did not"))
-            //.mapFailure(ex->_JpaExceptionTranslator.translate(ex, txManager)) 
+            //.mapFailure(ex->_JpaExceptionTranslator.translate(ex, txManager))
             .ifFailure(ex->assertTrue(ex instanceof DataIntegrityViolationException))
             .optionalElseFail();
-           
+
         });
-        
+
         // expected post condition: ONE inventory with 3 books
-        
+
         transactionService.runTransactional(Propagation.REQUIRES_NEW, ()->{
-            
-            interactionFactory.runAnonymous(()->{
-            
+
+            interactionService.runAnonymous(()->{
+
                 val inventories = repositoryService.allInstances(JpaInventory.class);
                 assertEquals(1, inventories.size());
-                
+
                 val inventory = inventories.get(0);
                 assertNotNull(inventory);
-                
+
                 assertNotNull(inventory);
                 assertNotNull(inventory.getProducts());
                 assertEquals(3, inventory.getProducts().size());
 
                 _TestFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3);
-                
+
             });
-            
-            
+
+
         });
 
-        
+
     }
-    
+
 }
\ No newline at end of file
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest_usingTransactional.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest_usingTransactional.java
index 32d433e..2c1d50c 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest_usingTransactional.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/persistence/jpa/JpaExceptionTranslationTest_usingTransactional.java
@@ -36,16 +36,16 @@ import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.TestPropertySources;
 import org.springframework.transaction.annotation.Transactional;
 
-import static org.junit.Assert.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
-import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
+import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.jpa.JpaInventoryDao;
 import org.apache.isis.testdomain.jpa.entities.JpaInventory;
@@ -67,7 +67,7 @@ class JpaExceptionTranslationTest_usingTransactional
     //@Inject private JpaSupportService jpaSupport;
     //@Inject private TransactionService transactionService;
     @Inject private RepositoryService repositoryService;
-    @Inject private InteractionFactory interactionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private Provider<JpaInventoryDao> inventoryDao;
     @Inject private JpaTransactionManager txManager;
 
@@ -80,7 +80,7 @@ class JpaExceptionTranslationTest_usingTransactional
     @Test @Order(1)
     @Transactional @Rollback(false)
     void booksUniqueByIsbn_setupPhase() {
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             _TestFixtures.setUp3Books(repositoryService);
 
@@ -98,7 +98,7 @@ class JpaExceptionTranslationTest_usingTransactional
 
         assertThrows(DataIntegrityViolationException.class, ()->{
 
-            interactionFactory.runAnonymous(()->{
+            interactionService.runAnonymous(()->{
 
                 ThrowingRunnable.resultOf(uniqueConstraintViolator)
                 .ifSuccess(__->fail("expected to fail, but did not"))
@@ -118,7 +118,7 @@ class JpaExceptionTranslationTest_usingTransactional
 
         // expected post condition: ONE inventory with 3 books
 
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             val inventories = repositoryService.allInstances(JpaInventory.class);
             assertEquals(1, inventories.size());
@@ -140,7 +140,7 @@ class JpaExceptionTranslationTest_usingTransactional
     @Transactional @Rollback(false)
     void booksUniqueByIsbn_cleanupPhase() {
 
-        interactionFactory.runAnonymous(()->{
+        interactionService.runAnonymous(()->{
 
             _TestFixtures.cleanUp(repositoryService);
 
diff --git a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
index d33bafc..066afdb 100644
--- a/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
+++ b/regressiontests/stable-persistence-jpa/src/test/java/org/apache/isis/testdomain/transactions/jpa/JpaTransactionScopeListenerTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.isis.testdomain.transactions.jpa;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -27,10 +25,12 @@ import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testdomain.conf.Configuration_usingJpa;
 import org.apache.isis.testdomain.jpa.JpaTestDomainPersona;
 import org.apache.isis.testdomain.jpa.entities.JpaBook;
@@ -39,7 +39,7 @@ import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
 @SpringBootTest(
-        classes = { 
+        classes = {
                 Configuration_usingJpa.class,
                 InteractionBoundaryProbe.class
         })
@@ -48,64 +48,64 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
  * With this test we manage IsisInteractions ourselves. (not sub-classing IsisIntegrationTestAbstract)
  */
 class JpaTransactionScopeListenerTest {
-    
+
     @Inject private FixtureScripts fixtureScripts;
     @Inject private TransactionService transactionService;
     @Inject private RepositoryService repository;
-    @Inject private InteractionFactory isisInteractionFactory;
+    @Inject private InteractionService interactionService;
     @Inject private KVStoreForTesting kvStoreForTesting;
-    
+
     /* Expectations:
      * 1. for each InteractionScope there should be a new InteractionBoundaryProbe instance
      * 2. for each Transaction the current InteractionBoundaryProbe should get notified
-     * 
+     *
      * first we have 1 InteractionScope with 1 expected Transaction during 'setUp'
      * then we have 1 InteractionScope with 1 expected Transaction within the test method
-     *  
+     *
      */
-    
+
     @BeforeEach
     void setUp() {
-        
+
         // new IsisInteractionScope with a new transaction (#1)
-        isisInteractionFactory.runAnonymous(()->{
-        
+        interactionService.runAnonymous(()->{
+
             // cleanup
             fixtureScripts.runPersona(JpaTestDomainPersona.PurgeAll);
-            
+
         });
-        
+
     }
-    
+
     @Test
     void sessionScopedProbe_shouldBeReused_andBeAwareofTransactionBoundaries() {
-        
+
         // new IsisInteractionScope with a new transaction (#2)
-        isisInteractionFactory.runAnonymous(()->{
-            
+        interactionService.runAnonymous(()->{
+
             // expected pre condition
             // reuse transaction (#2)
             assertEquals(0, repository.allInstances(JpaBook.class).size());
-        
+
             // reuse transaction (#2)
             transactionService.runWithinCurrentTransactionElseCreateNew(()->{
-                
+
                 fixtureScripts.runPersona(JpaTestDomainPersona.InventoryWith1Book);
-                
+
             });
-            
+
             // expected post condition
             // reuse transaction (#2)
             assertEquals(1, repository.allInstances(JpaBook.class).size());
-            
+
         });
-        
+
         assertEquals(2, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting));
         assertEquals(2, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting));
 
     }
-    
+
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/ApplicationLayerTestFactory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/ApplicationLayerTestFactory.java
index 7d33ac7..2021946 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/ApplicationLayerTestFactory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/applayer/ApplicationLayerTestFactory.java
@@ -18,13 +18,6 @@
  */
 package org.apache.isis.testdomain.applayer;
 
-import static org.apache.isis.applib.services.wrapper.control.AsyncControl.returningVoid;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.DynamicTest.dynamicTest;
-
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -45,8 +38,15 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.api.DynamicTest.dynamicTest;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.wrapper.DisabledException;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
@@ -58,7 +58,6 @@ import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.debug.xray.XrayUi;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.functions._Functions.CheckedConsumer;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
@@ -71,6 +70,8 @@ import org.apache.isis.testdomain.jdo.entities.JdoInventory;
 import org.apache.isis.testdomain.jdo.entities.JdoProduct;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
+import static org.apache.isis.applib.services.wrapper.control.AsyncControl.returningVoid;
+
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.val;
@@ -88,7 +89,7 @@ public class ApplicationLayerTestFactory {
     private final ObjectManager objectManager;
     private final FixtureScripts fixtureScripts;
     private final PreCommitListener preCommitListener;
-    private final InteractionFactory interactionFactory;
+    private final InteractionService interactionService;
     private final InteractionTracker interactionTracker;
 
     @Named("transaction-aware-pmf-proxy")
@@ -176,10 +177,10 @@ public class ApplicationLayerTestFactory {
 
             xrayAddTest(displayName);
 
-            assertFalse(interactionFactory.isInInteraction());
+            assertFalse(interactionService.isInInteraction());
             assert_no_initial_tx_context();
 
-            final boolean isSuccesfulRun = interactionFactory.callAnonymous(()->{
+            final boolean isSuccesfulRun = interactionService.callAnonymous(()->{
                 val currentInteraction = interactionTracker.currentInteraction();
                 xrayEnterInteraction(currentInteraction);
                 val result = interactionTestRunner.run(given, verifier);
@@ -187,7 +188,7 @@ public class ApplicationLayerTestFactory {
                 return result;
             });
 
-            interactionFactory.closeInteractionLayers();
+            interactionService.closeInteractionLayers();
 
             if(isSuccesfulRun) {
                 verifier.accept(onSuccess);
diff --git a/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/KeycloakFilter.java b/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/KeycloakFilter.java
index 6f423ea..83f6f34 100644
--- a/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/KeycloakFilter.java
+++ b/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/KeycloakFilter.java
@@ -35,9 +35,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserMemento.AuthenticationSource;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 
 import lombok.val;
 
@@ -46,7 +46,7 @@ import lombok.val;
  */
 public class KeycloakFilter implements Filter {
 
-    @Autowired private InteractionFactory interactionFactory;
+    @Autowired private InteractionService interactionService;
 
     @Override
     public void doFilter(
@@ -69,7 +69,7 @@ public class KeycloakFilter implements Filter {
                 .withAuthenticationSource(AuthenticationSource.EXTERNAL)
                 .withAuthenticationCode(subjectHeader);
 
-        interactionFactory.run(
+        interactionService.run(
                 InteractionContext.ofUserWithSystemDefaults(user),
                 ()->filterChain.doFilter(servletRequest, servletResponse));
     }
diff --git a/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java b/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
index 6100f1e..7b20c70 100644
--- a/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
+++ b/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
@@ -54,7 +54,6 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.security.authentication.AuthenticationRequest;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
 import org.apache.isis.core.security.authentication.Authenticator;
-import org.apache.isis.core.security.authentication.InteractionContextFactory;
 import org.apache.isis.core.security.authorization.Authorizor;
 import org.apache.isis.security.shiro.context.ShiroSecurityContext;
 
@@ -172,8 +171,9 @@ public class AuthenticatorShiro implements Authenticator {
                 // (this is used by the Wicket viewer, for example).
                 request.streamRoles());
 
-        val user = UserMemento.ofNameAndRoleNames(request.getName(), roles);
-        return InteractionContextFactory.valid(user, validationCode);
+        val user = UserMemento.ofNameAndRoleNames(request.getName(), roles)
+                .withAuthenticationCode(validationCode);
+        return InteractionContext.ofUserWithSystemDefaults(user);
     }
 
     /**
diff --git a/security/spring/src/main/java/org/apache/isis/security/spring/webmodule/SpringSecurityFilter.java b/security/spring/src/main/java/org/apache/isis/security/spring/webmodule/SpringSecurityFilter.java
index 3db1afd..9199df0 100644
--- a/security/spring/src/main/java/org/apache/isis/security/spring/webmodule/SpringSecurityFilter.java
+++ b/security/spring/src/main/java/org/apache/isis/security/spring/webmodule/SpringSecurityFilter.java
@@ -33,9 +33,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.context.SecurityContextHolder;
 
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserMemento.AuthenticationSource;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.security.spring.authconverters.AuthenticationConverter;
 
 import lombok.val;
@@ -46,7 +46,7 @@ import lombok.val;
 //@Log4j2
 public class SpringSecurityFilter implements Filter {
 
-    @Autowired private InteractionFactory interactionFactory;
+    @Autowired private InteractionService interactionService;
 
     @Override
     public void doFilter(
@@ -84,7 +84,7 @@ public class SpringSecurityFilter implements Filter {
         userMemento = userMemento.withRoleAdded("org.apache.isis.viewer.wicket.roles.USER")
                 .withAuthenticationSource(AuthenticationSource.EXTERNAL);
 
-        interactionFactory.run(
+        interactionService.run(
                 InteractionContext.ofUserWithSystemDefaults(userMemento),
                 ()->filterChain.doFilter(servletRequest, servletResponse));
     }
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index 382609a..e76278f 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -42,6 +42,7 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.services.eventbus.EventBusService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -51,7 +52,6 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
 import org.apache.isis.testing.fixtures.applib.events.FixturesInstalledEvent;
 import org.apache.isis.testing.fixtures.applib.events.FixturesInstallingEvent;
@@ -87,7 +87,7 @@ public class FixtureScripts {
     @Inject private RepositoryService repositoryService;
     @Inject private TransactionService transactionService;
     @Inject private ExecutionParametersService executionParametersService;
-    @Inject private InteractionFactory isisInteractionFactory;
+    @Inject private InteractionService interactionService;
 
     @Inject private EventBusService eventBusService;
 
@@ -422,7 +422,7 @@ public class FixtureScripts {
     	val singleScript = toSingleScript(fixtureScriptList);
     	String parameters = null;
 
-    	isisInteractionFactory.runAnonymous(()->{
+    	interactionService.runAnonymous(()->{
     	    transactionService.runWithinCurrentTransactionElseCreateNew(()->{
                 runScript(singleScript, parameters);
             });
@@ -456,7 +456,7 @@ public class FixtureScripts {
     @Programmatic
     public <T> T runBuilder(final BuilderScriptAbstract<T> builderScript) {
 
-        return isisInteractionFactory.callAnonymous(()->
+        return interactionService.callAnonymous(()->
             transactionService.callWithinCurrentTransactionElseCreateNew(()->
                 runBuilderScriptNonTransactional(builderScript)
             )
diff --git a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/_Helper.java b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/_Helper.java
index b9316bc..8c93098 100644
--- a/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/_Helper.java
+++ b/testing/integtestsupport/applib/src/main/java/org/apache/isis/testing/integtestsupport/applib/_Helper.java
@@ -23,9 +23,8 @@ import java.util.Optional;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerService;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 
 class _Helper {
 
@@ -38,9 +37,9 @@ class _Helper {
 
     // -- SHORTCUTS
 
-    static Optional<InteractionFactory> getInteractionFactory(final ExtensionContext extensionContext) {
+    static Optional<InteractionService> getInteractionFactory(final ExtensionContext extensionContext) {
         return getServiceRegistry(extensionContext)
-        .flatMap(serviceRegistry->serviceRegistry.lookupService(InteractionFactory.class));
+        .flatMap(serviceRegistry->serviceRegistry.lookupService(InteractionService.class));
     }
 
     static Optional<ExceptionRecognizerService> getExceptionRecognizerService(
diff --git a/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/ProjectSamples.java b/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/ProjectSamples.java
index 3494a40..b8af943 100644
--- a/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/ProjectSamples.java
+++ b/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/ProjectSamples.java
@@ -81,7 +81,7 @@ class ProjectSamples {
         assertTrue(sources.contains("o.a.i/core/runtime/events/persistence/TimestampService.java"));
         assertTrue(sources.contains("o.a.i/core/runtime/events/RuntimeEventService.java"));
         assertTrue(sources.contains("o.a.i/core/runtime/iactn/IsisInteraction.java"));
-        assertTrue(sources.contains("o.a.i/core/runtime/iactn/InteractionFactory.java"));
+        assertTrue(sources.contains("o.a.i/core/runtime/iactn/InteractionService.java"));
         assertTrue(sources.contains("o.a.i/core/runtime/iactn/InteractionTracker.java"));
         assertTrue(sources.contains("o.a.i/core/runtime/iactn/scope/IsisInteractionScope.java"));
         assertTrue(sources.contains("o.a.i/core/runtime/iactn/scope/IsisInteractionScopeBeanFactoryPostProcessor.java"));
diff --git a/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/services/SseServiceDefault.java b/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/services/SseServiceDefault.java
index 785aa07..36179a5 100644
--- a/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/services/SseServiceDefault.java
+++ b/valuetypes/sse/ui/wicket/src/main/java/org/apache/isis/valuetypes/sse/ui/wkt/services/SseServiceDefault.java
@@ -40,9 +40,9 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.valuetypes.sse.applib.annotations.SseSource;
 import org.apache.isis.valuetypes.sse.applib.service.SseChannel;
 import org.apache.isis.valuetypes.sse.applib.service.SseService;
@@ -69,7 +69,7 @@ import lombok.extern.log4j.Log4j2;
 public class SseServiceDefault implements SseService {
 
     @Inject private TransactionService transactionService;
-    @Inject private InteractionFactory isisInteractionFactory;
+    @Inject private InteractionService interactionService;
 
     private final EventStreamPool eventStreamPool = new EventStreamPool();
 
@@ -97,7 +97,7 @@ public class SseServiceDefault implements SseService {
         // spawn a new thread that gets its own session
         CompletableFuture.runAsync(()->{
 
-            isisInteractionFactory.runAnonymous(()->{
+            interactionService.runAnonymous(()->{
                 transactionService.runWithinCurrentTransactionElseCreateNew(()->run(task));
             });
 
diff --git a/viewers/restfulobjects/testing/src/main/java/org/apache/isis/viewer/restfulobjects/testing/ResourceContext_ensureCompatibleAcceptHeader_ContractTest.java b/viewers/restfulobjects/testing/src/main/java/org/apache/isis/viewer/restfulobjects/testing/ResourceContext_ensureCompatibleAcceptHeader_ContractTest.java
index 861598d..76faa08 100644
--- a/viewers/restfulobjects/testing/src/main/java/org/apache/isis/viewer/restfulobjects/testing/ResourceContext_ensureCompatibleAcceptHeader_ContractTest.java
+++ b/viewers/restfulobjects/testing/src/main/java/org/apache/isis/viewer/restfulobjects/testing/ResourceContext_ensureCompatibleAcceptHeader_ContractTest.java
@@ -39,8 +39,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
@@ -68,7 +68,7 @@ public abstract class ResourceContext_ensureCompatibleAcceptHeader_ContractTest
     @Mock HttpHeaders mockHttpHeaders;
     @Mock HttpServletRequest mockHttpServletRequest;
     @Mock ServletContext mockServletContext;
-    @Mock InteractionFactory mockInteractionFactory;
+    @Mock InteractionService mockInteractionService;
     @Mock Interaction mockInteraction;
     @Mock SpecificationLoader mockSpecificationLoader;
     @Mock WebApplicationContext webApplicationContext;
@@ -87,7 +87,7 @@ public abstract class ResourceContext_ensureCompatibleAcceptHeader_ContractTest
                 .authentication(iaContext)
                 .singleton(mockAuthenticationManager)
                 .singleton(mockIsisInteractionTracker)
-                .singleton(mockInteractionFactory)
+                .singleton(mockInteractionService)
                 .build();
 
         context.checking(new Expectations() {
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
index 1ca670b..b72cf5b 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
@@ -33,10 +33,10 @@ import javax.ws.rs.core.MediaType;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.swagger.Format;
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.applib.services.swagger.Visibility;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -46,7 +46,7 @@ import lombok.val;
 public class SwaggerSpecResource {
 
     private final SwaggerService swaggerService;
-    private final InteractionFactory isisInteractionFactory;
+    private final InteractionService interactionService;
 
     @Context HttpHeaders httpHeaders;
     @Context HttpServletRequest httpServletRequest;
@@ -54,9 +54,9 @@ public class SwaggerSpecResource {
     @Inject
     public SwaggerSpecResource(
             final SwaggerService swaggerService,
-            final InteractionFactory isisInteractionFactory) {
+            final InteractionService interactionService) {
         this.swaggerService = swaggerService;
-        this.isisInteractionFactory = isisInteractionFactory;
+        this.interactionService = interactionService;
     }
 
     @Path("/private")
@@ -94,7 +94,7 @@ public class SwaggerSpecResource {
         val format = deriveFrom(httpHeaders);
         val callable = new MyCallable(swaggerService, visibility, format);
 
-        val spec = isisInteractionFactory.callAnonymous(callable);
+        val spec = interactionService.callAnonymous(callable);
         return spec;
     }
 
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsInteractionFilter.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsInteractionFilter.java
index 8af2bce..9d73817 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsInteractionFilter.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/webmodule/IsisRestfulObjectsInteractionFilter.java
@@ -41,12 +41,12 @@ import javax.transaction.TransactionalException;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.factory._InstanceUtil;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -157,7 +157,7 @@ public class IsisRestfulObjectsInteractionFilter implements Filter {
         return Pattern.compile(".*\\." + input);
     };
 
-    @Autowired private InteractionFactory interactionFactory;
+    @Autowired private InteractionService interactionService;
     @Autowired private SpecificationLoader specificationLoader;
     @Autowired private TransactionService transactionService;
 
@@ -344,7 +344,7 @@ public class IsisRestfulObjectsInteractionFilter implements Filter {
     @Override
     public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
 
-        requires(interactionFactory, "isisInteractionFactory");
+        requires(interactionService, "isisInteractionFactory");
         requires(specificationLoader, "specificationLoader");
 
         ensureMetamodelIsValid(specificationLoader);
@@ -379,7 +379,7 @@ public class IsisRestfulObjectsInteractionFilter implements Filter {
 
                 authStrategy.bind(httpServletRequest, httpServletResponse, authentication);
 
-                interactionFactory.run(
+                interactionService.run(
                         authentication,
                         ()->{
                             transactionService.runWithinCurrentTransactionElseCreateNew(()->
@@ -404,7 +404,7 @@ public class IsisRestfulObjectsInteractionFilter implements Filter {
             }
 
         } finally {
-            interactionFactory.closeInteractionLayers();
+            interactionService.closeInteractionLayers();
         }
 
     }
diff --git a/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java b/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
index c90112d..ad3610f 100644
--- a/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
+++ b/viewers/restfulobjects/viewer/src/test/java/org/apache/isis/viewer/restfulobjects/viewer/context/ResourceContext_getArg_Test.java
@@ -31,8 +31,8 @@ import org.springframework.web.context.WebApplicationContext;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.internal.codec._UrlDecoderUtil;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.interaction.session.IsisInteraction;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
@@ -54,7 +54,7 @@ public class ResourceContext_getArg_Test {
     @Mock private HttpServletRequest mockHttpServletRequest;
     @Mock private ServletContext mockServletContext;
     @Mock private IsisInteraction mockIsisInteraction;
-    @Mock private InteractionFactory mockInteractionFactory;
+    @Mock private InteractionService mockInteractionService;
     @Mock private InteractionTracker mockIsisInteractionTracker;
     @Mock private AuthenticationManager mockAuthenticationManager;
     @Mock private SpecificationLoader mockSpecificationLoader;
@@ -70,7 +70,7 @@ public class ResourceContext_getArg_Test {
 
         metaModelContext = MetaModelContext_forTesting.builder()
                 .specificationLoader(mockSpecificationLoader)
-                .singleton(mockInteractionFactory)
+                .singleton(mockInteractionService)
                 .singleton(mockAuthenticationManager)
                 .singleton(mockIsisInteractionTracker)
                 //                .serviceInjector(mockServiceInjector)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
index 376f194..5938647 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
@@ -24,11 +24,11 @@ import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.config.viewer.wicket.WebAppContextPath;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
@@ -46,7 +46,7 @@ implements HasCommonContext {
     private transient WebAppContextPath webAppContextPath;
     private transient PageClassRegistry pageClassRegistry;
     private transient IsisAppCommonContext commonContext;
-    private transient InteractionFactory isisInteractionFactory;
+    private transient InteractionService interactionService;
 
     protected WebPageBase(PageParameters parameters) {
         super(parameters);
@@ -93,8 +93,8 @@ implements HasCommonContext {
         return pageClassRegistry = computeIfAbsent(PageClassRegistry.class, pageClassRegistry);
     }
 
-    public InteractionFactory getIsisInteractionFactory() {
-        return isisInteractionFactory = computeIfAbsent(InteractionFactory.class, isisInteractionFactory);
+    public InteractionService getInteractionService() {
+        return interactionService = computeIfAbsent(InteractionService.class, interactionService);
     }
 
     public IsisSystemEnvironment getSystemEnvironment() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/EmailAvailableValidator.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/EmailAvailableValidator.java
index 67fa2e9..91219d2 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/EmailAvailableValidator.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/EmailAvailableValidator.java
@@ -21,10 +21,10 @@ package org.apache.isis.viewer.wicket.ui.pages.accmngt;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.ValidationError;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
-import org.apache.isis.viewer.wicket.ui.validation.ValidatorBase;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.viewer.wicket.ui.validation.ValidatorBase;
 
 import lombok.val;
 
@@ -62,10 +62,10 @@ public class EmailAvailableValidator extends ValidatorBase<String> {
         val userRegistrationService = super.getCommonContext()
                 .lookupServiceElseFail(UserRegistrationService.class);
 
-        val isisInteractionFactory = super.getCommonContext()
-                .lookupServiceElseFail(InteractionFactory.class);
+        val interactionService = super.getCommonContext()
+                .lookupServiceElseFail(InteractionService.class);
 
-        isisInteractionFactory.runAnonymous(() -> {
+        interactionService.runAnonymous(() -> {
             String email = validatable.getValue();
             boolean emailExists1 = userRegistrationService.emailExists(email);
             if (emailExists1 != emailExists) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/UsernameAvailableValidator.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/UsernameAvailableValidator.java
index d5226cb..f1e9baa 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/UsernameAvailableValidator.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/UsernameAvailableValidator.java
@@ -21,10 +21,10 @@ package org.apache.isis.viewer.wicket.ui.pages.accmngt;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.ValidationError;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
-import org.apache.isis.viewer.wicket.ui.validation.ValidatorBase;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.viewer.wicket.ui.validation.ValidatorBase;
 
 import lombok.val;
 
@@ -50,10 +50,10 @@ public class UsernameAvailableValidator extends ValidatorBase<String> {
         val userRegistrationService = super.getCommonContext()
                 .lookupServiceElseFail(UserRegistrationService.class);
 
-        val isisInteractionFactory = super.getCommonContext()
-                .lookupServiceElseFail(InteractionFactory.class);
+        val interactionService = super.getCommonContext()
+                .lookupServiceElseFail(InteractionService.class);
 
-        isisInteractionFactory.runAnonymous(() -> {
+        interactionService.runAnonymous(() -> {
 
             final String username = validatable.getValue();
             boolean usernameExists = userRegistrationService.usernameExists(username);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPage.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPage.java
index 38eb561..a88389f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPage.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPage.java
@@ -76,7 +76,7 @@ public class PasswordResetPage extends AccountManagementPageAbstract {
                 error(getString("passwordResetExpiredOrInvalidToken"));
                 addOrReplace(addPasswordResetEmailPanel(ID_CONTENT_PANEL));
             } else {
-                Boolean emailExists = getIsisInteractionFactory().callAnonymous(new Callable<Boolean>() {
+                Boolean emailExists = getInteractionService().callAnonymous(new Callable<Boolean>() {
                     @Override
                     public Boolean call() throws Exception {
                         val serviceRegistry = getServiceRegistry();
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPanel.java
index 07d1822..cc28d4d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/password_reset/PasswordResetPanel.java
@@ -86,7 +86,7 @@ public class PasswordResetPanel extends PanelBase<Void> {
                 val userRegistrationService =
                         commonContext.lookupServiceElseFail(UserRegistrationService.class);
 
-                Boolean passwordUpdated = getIsisInteractionFactory().callAnonymous(new Callable<Boolean>() {
+                Boolean passwordUpdated = getInteractionService().callAnonymous(new Callable<Boolean>() {
                     @Override
                     public Boolean call() throws Exception {
                         String email = accountConfirmationMap.get(uuid);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/register/RegisterPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/register/RegisterPanel.java
index 9d978e1..8d58dd3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/register/RegisterPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/register/RegisterPanel.java
@@ -34,10 +34,10 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.userreg.UserDetails;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
 import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.pages.accmngt.AccountConfirmationMap;
 import org.apache.isis.viewer.wicket.ui.pages.accmngt.UsernameAvailableValidator;
@@ -115,7 +115,7 @@ public abstract class RegisterPanel extends PanelBase<UserDetails> {
 
         @Inject private transient UserRegistrationService userRegistrationService;
         @Inject private transient TransactionService transactionService;
-        @Inject private transient InteractionFactory isisInteractionFactory;
+        @Inject private transient InteractionService interactionService;
 
         private final String uuid;
 
@@ -141,7 +141,7 @@ public abstract class RegisterPanel extends PanelBase<UserDetails> {
         public final void onSubmit() {
             final UserDetails userDetails = getModelObject();
 
-            isisInteractionFactory.runAnonymous(() -> {
+            interactionService.runAnonymous(() -> {
                 transactionService.runWithinCurrentTransactionElseCreateNew(() -> {
                     userRegistrationService.registerUser(userDetails);
                     removeAccountConfirmation();
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index dc8ec1e..d837b6a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -37,11 +37,10 @@ import org.apache.isis.applib.services.exceprecog.Category;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerService;
 import org.apache.isis.applib.services.exceprecog.Recognition;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.core.interaction.session.InteractionFactory;
-import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
 import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
@@ -431,7 +430,7 @@ implements FormExecutor {
     }
 
     protected InteractionService getIsisInteractionFactory() {
-        return getCommonContext().lookupServiceElseFail(InteractionFactory.class);
+        return getCommonContext().lookupServiceElseFail(InteractionService.class);
     }
 
     protected Optional<MessageBroker> currentMessageBroker() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
index 06afa12..bfac266 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
@@ -27,11 +27,11 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.userreg.EmailNotificationService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.viewer.wicket.WebAppContextPath;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
@@ -67,7 +67,7 @@ implements HasCommonContext {
     private transient ImageResourceCache imageCache;
     private transient MetaModelContext metaModelContext;
     private transient IsisAppCommonContext commonContext;
-    private transient InteractionFactory isisInteractionFactory;
+    private transient InteractionService interactionService;
     private transient TranslationService translationService;
     private transient LocaleProvider localeProvider;
     private transient TreeThemeProvider treeThemeProvider;
@@ -113,8 +113,8 @@ implements HasCommonContext {
         return metaModelContext = computeIfAbsent(MetaModelContext.class, metaModelContext);
     }
 
-    public InteractionFactory getIsisInteractionFactory() {
-        return isisInteractionFactory = computeIfAbsent(InteractionFactory.class, isisInteractionFactory);
+    public InteractionService getInteractionService() {
+        return interactionService = computeIfAbsent(InteractionService.class, interactionService);
     }
 
     public TranslationService getTranslationService() {
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
index d0fe946..a52b6c7 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
@@ -30,11 +30,11 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.isis.applib.clock.VirtualClock;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.session.SessionLoggingService;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserMemento.AuthenticationSource;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext.HasCommonContext;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
@@ -237,7 +237,7 @@ implements BreadcrumbModelProvider, BookmarkedPagesModelProvider, HasCommonConte
             final SessionLoggingService.CausedBy causedBy) {
 
 
-        val interactionFactory = getInteractionFactory();
+        val interactionFactory = getInteractionService();
         val sessionLoggingServices = getSessionLoggingServices();
 
         final Runnable loggingTask = ()->{
@@ -262,8 +262,8 @@ implements BreadcrumbModelProvider, BookmarkedPagesModelProvider, HasCommonConte
         return commonContext.getServiceRegistry().select(SessionLoggingService.class);
     }
 
-    protected InteractionFactory getInteractionFactory() {
-        return commonContext.lookupServiceElseFail(InteractionFactory.class);
+    protected InteractionService getInteractionService() {
+        return commonContext.lookupServiceElseFail(InteractionService.class);
     }
 
     private VirtualClock virtualClock() {
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/LocalizerForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/LocalizerForIsis.java
index 33d8e90..a80b12a 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/LocalizerForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/LocalizerForIsis.java
@@ -34,9 +34,9 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.viewer.wicket.viewer.wicketapp.IsisWicketApplication;
 
@@ -48,8 +48,8 @@ import lombok.val;
  */
 public class LocalizerForIsis extends Localizer {
 
-    @Inject private InteractionTracker isisInteractionTracker;
-    @Inject private InteractionFactory isisInteractionFactory;
+    @Inject private InteractionTracker interactionTracker;
+    @Inject private InteractionService interactionService;
     @Inject private TranslationService translationService;
 
     /**
@@ -76,10 +76,10 @@ public class LocalizerForIsis extends Localizer {
     protected String translate(final String key, final Component component) {
         final Class<?> contextClass = determineContextClassElse(component, IsisWicketApplication.class);
         final TranslationContext context = TranslationContext.forClassName(contextClass);
-        if(isisInteractionTracker.isInInteraction()) {
+        if(interactionTracker.isInInteraction()) {
             return translate(key, context);
         } else {
-            return isisInteractionFactory.callAnonymous(()->translate(key, context));
+            return interactionService.callAnonymous(()->translate(key, context));
         }
     }
 
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
index 30a19b4..378dff6 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/WebRequestCycleForIsis.java
@@ -52,12 +52,12 @@ import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerService;
 import org.apache.isis.applib.services.exceprecog.Recognition;
 import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.applib.services.iactn.Interaction;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.user.ImpersonatedUserHolder;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.interaction.integration.IsisRequestCycle;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -147,7 +147,7 @@ public class WebRequestCycleForIsis implements IRequestCycleListener {
         }
 
         val isisRequestCycle = IsisRequestCycle.next(
-                commonContext.lookupServiceElseFail(InteractionFactory.class),
+                commonContext.lookupServiceElseFail(InteractionService.class),
                 commonContext.lookupServiceElseFail(ImpersonatedUserHolder.class)
                 );
 
diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java
index f84cd82..08ed729 100644
--- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java
+++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java
@@ -34,19 +34,19 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.nullValue;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.session.SessionLoggingService;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.interaction.session.InteractionTracker;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.core.security._testing.InteractionService_forTesting;
 import org.apache.isis.core.security.authentication.AuthenticationRequest;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
 import org.apache.isis.core.security.authentication.Authenticator;
 import org.apache.isis.core.security.authentication.InteractionContextFactory;
-import org.apache.isis.core.security.authentication.manager.AnonymousInteractionFactory;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.security.authentication.standard.RandomCodeGeneratorDefault;
 
@@ -57,12 +57,12 @@ public class AuthenticatedWebSessionForIsis_Authenticate {
     public final JUnitRuleMockery2 context =
             JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    protected Request mockRequest;
     private AuthenticationManager authMgr;
+
+    @Mock protected Request mockRequest;
     @Mock protected Authenticator mockAuthenticator;
     @Mock protected IsisAppCommonContext mockCommonContext;
-    @Mock protected InteractionFactory mockInteractionFactory;
+    @Mock protected InteractionService mockInteractionService;
     @Mock protected InteractionTracker mockInteractionTracker;
     @Mock protected ServiceRegistry mockServiceRegistry;
 
@@ -72,7 +72,7 @@ public class AuthenticatedWebSessionForIsis_Authenticate {
     public void setUp() throws Exception {
         authMgr = new AuthenticationManager(
                 Collections.singletonList(mockAuthenticator),
-                AnonymousInteractionFactory.forTesting(),
+                new InteractionService_forTesting(),
                 new RandomCodeGeneratorDefault());
 
         context.checking(new Expectations() {
@@ -83,8 +83,8 @@ public class AuthenticatedWebSessionForIsis_Authenticate {
                 allowing(mockServiceRegistry).select(SessionLoggingService.class);
                 will(returnValue(Can.empty()));
 
-                allowing(mockCommonContext).lookupServiceElseFail(InteractionFactory.class);
-                will(returnValue(mockInteractionFactory));
+                allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class);
+                will(returnValue(mockInteractionService));
 
                 allowing(mockCommonContext).getInteractionTracker();
                 will(returnValue(mockInteractionTracker));
@@ -92,10 +92,10 @@ public class AuthenticatedWebSessionForIsis_Authenticate {
                 allowing(mockInteractionTracker).currentInteractionContext();
                 will(returnValue(Optional.of(InteractionContextFactory.testing())));
 
-                allowing(mockInteractionFactory)
+                allowing(mockInteractionService)
                 .run(with(InteractionContextFactory.testing()), with(any(ThrowingRunnable.class)));
 
-                allowing(mockInteractionFactory)
+                allowing(mockInteractionService)
                 .runAnonymous(with(any(ThrowingRunnable.class)));
 
                 // ignore
diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java
index 470331f..f050eca 100644
--- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java
+++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java
@@ -32,18 +32,18 @@ import org.junit.Test;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.session.SessionLoggingService;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.core.security._testing.InteractionService_forTesting;
 import org.apache.isis.core.security.authentication.AuthenticationRequest;
 import org.apache.isis.core.security.authentication.AuthenticationRequestPassword;
 import org.apache.isis.core.security.authentication.Authenticator;
 import org.apache.isis.core.security.authentication.InteractionContextFactory;
-import org.apache.isis.core.security.authentication.manager.AnonymousInteractionFactory;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.security.authentication.standard.RandomCodeGeneratorDefault;
 
@@ -58,7 +58,7 @@ public class AuthenticatedWebSessionForIsis_SignIn {
     @Mock protected Request mockRequest;
     @Mock protected Authenticator mockAuthenticator;
     @Mock protected IsisAppCommonContext mockCommonContext;
-    @Mock protected InteractionFactory mockInteractionFactory;
+    @Mock protected InteractionService mockInteractionService;
     @Mock protected ServiceRegistry mockServiceRegistry;
 
     protected AuthenticatedWebSessionForIsis webSession;
@@ -67,7 +67,7 @@ public class AuthenticatedWebSessionForIsis_SignIn {
     public void setUp() throws Exception {
         authMgr = new AuthenticationManager(
                 Collections.singletonList(mockAuthenticator),
-                AnonymousInteractionFactory.forTesting(),
+                new InteractionService_forTesting(),
                 new RandomCodeGeneratorDefault());
     }
 
@@ -81,13 +81,13 @@ public class AuthenticatedWebSessionForIsis_SignIn {
                 allowing(mockServiceRegistry).select(SessionLoggingService.class);
                 will(returnValue(Can.empty()));
 
-                allowing(mockCommonContext).lookupServiceElseFail(InteractionFactory.class);
-                will(returnValue(mockInteractionFactory));
+                allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class);
+                will(returnValue(mockInteractionService));
 
-                allowing(mockInteractionFactory)
+                allowing(mockInteractionService)
                 .run(with(InteractionContextFactory.testing()), with(any(ThrowingRunnable.class)));
 
-                allowing(mockInteractionFactory)
+                allowing(mockInteractionService)
                 .runAnonymous(with(any(ThrowingRunnable.class)));
 
                 // ignore
diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java
index 239da8b..d6051e8 100644
--- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java
+++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java
@@ -27,10 +27,10 @@ import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Rule;
 
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.iactnlayer.ThrowingRunnable;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.session.SessionLoggingService;
-import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
@@ -45,7 +45,7 @@ public abstract class AuthenticatedWebSessionForIsis_TestAbstract {
     @Mock protected Request mockRequest;
     @Mock protected AuthenticationManager mockAuthMgr;
     @Mock protected IsisAppCommonContext mockCommonContext;
-    @Mock protected InteractionFactory mockInteractionFactory;
+    @Mock protected InteractionService mockInteractionService;
     @Mock protected ServiceRegistry mockServiceRegistry;
 
     protected AuthenticatedWebSessionForIsis webSession;
@@ -59,10 +59,10 @@ public abstract class AuthenticatedWebSessionForIsis_TestAbstract {
                 allowing(mockServiceRegistry).lookupService(SessionLoggingService.class);
                 will(returnValue(Optional.empty()));
 
-                allowing(mockCommonContext).lookupServiceElseFail(InteractionFactory.class);
-                will(returnValue(mockInteractionFactory));
+                allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class);
+                will(returnValue(mockInteractionService));
 
-                allowing(mockInteractionFactory).run(
+                allowing(mockInteractionService).run(
                         InteractionContextFactory.testing(),
                         with(any(ThrowingRunnable.class)));
                 // ignore