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 2022/08/26 08:05:08 UTC

[isis] branch master updated: ISIS-3182: splits Viewer Commons Model into Applib/Model/Services

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 c6ec33e977 ISIS-3182: splits Viewer Commons Model into Applib/Model/Services
c6ec33e977 is described below

commit c6ec33e97732d9285d9387c00acc65cf9906bff7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Aug 26 10:05:01 2022 +0200

    ISIS-3182: splits Viewer Commons Model into Applib/Model/Services
---
 core/pom.xml                                       | 15 ++++++
 .../main/java/demoapp/dom/DemoModuleCommon.java    |  2 +
 .../javafx/ui/IsisModuleIncViewerJavaFxUi.java     |  6 +--
 .../viewer/javafx/ui/main/MainViewFx.java          | 13 ++---
 .../viewer/javafx/ui/main/MenuBuilderFx.java       |  4 +-
 .../viewer/vaadin/model/decorator/Decorators.java  |  4 +-
 incubator/viewers/vaadin/ui/pom.xml                |  6 ++-
 .../vaadin/ui/IsisModuleIncViewerVaadinUi.java     |  4 +-
 .../viewer/vaadin/ui/pages/main/MainViewVaa.java   | 10 ++--
 .../ui/pages/main/MainView_createHeader.java       | 13 +++--
 .../vaadin/ui/pages/main/MenuBuilderVaa.java       |  4 +-
 viewers/commons/{model => applib}/pom.xml          | 26 +++------
 .../applib/IsisModuleViewerCommonsApplib.java}     | 17 +++---
 .../IsisModuleViewerCommonsApplibMixins.java}      | 14 +----
 .../commons/applib/mixins/Object_impersonate.java  |  0
 .../applib/mixins/Object_impersonateWithRoles.java |  0
 .../applib/services}/branding/BrandingUiModel.java |  2 +-
 .../services/branding/BrandingUiService.java}      | 17 +++---
 .../applib/services}/header/HeaderUiModel.java     |  6 +--
 .../applib/services/header/HeaderUiService.java}   | 16 +++---
 .../commons/applib/services}/menu/MenuItemDto.java |  2 +-
 .../commons/applib/services}/menu/MenuUiModel.java | 22 ++++----
 .../applib/services/menu/MenuUiService.java}       | 17 +++---
 .../commons/applib/services}/menu/MenuVisitor.java |  2 +-
 .../services/userprof/UserProfileUiModel.java      |  0
 .../services/userprof/UserProfileUiService.java}   |  2 +-
 viewers/commons/model/pom.xml                      |  5 ++
 .../model/header/HeaderUiModelProvider.java        | 46 ----------------
 viewers/commons/pom.xml                            |  4 +-
 viewers/commons/{model => services}/pom.xml        | 29 ++++------
 .../services/IsisModuleViewerCommonsServices.java} | 30 +++++------
 .../branding/BrandingUiServiceDefault.java}        | 22 ++++++--
 .../services/header/HeaderUiServiceDefault.java    | 61 ++++++++++++++++++++++
 .../services/menu/MenuUiServiceDefault.java}       | 39 ++++++++++++--
 .../commons/services/menu/_MenuItemBuilder.java}   | 45 ++++++++--------
 .../userprof/UserProfileUiServiceDefault.java}     | 15 +++---
 viewers/restfulobjects/viewer/pom.xml              |  2 +-
 .../IsisModuleViewerRestfulObjectsViewer.java      |  4 +-
 .../viewer/resources/HomePageReprRenderer.java     |  8 +--
 .../wicket/model/models/ServiceActionsModel.java   |  2 +-
 viewers/wicket/ui/pom.xml                          |  6 ++-
 .../viewer/wicket/ui/IsisModuleViewerWicketUi.java |  4 +-
 .../serviceactions/ServiceActionUtil.java          | 10 ++--
 .../wicket/ui/components/header/HeaderPanel.java   |  6 +--
 .../ui/components/widgets/navbar/BrandLogo.java    |  2 +-
 .../ui/components/widgets/navbar/BrandName.java    |  2 +-
 .../accmngt/AccountManagementPageAbstract.java     |  4 +-
 .../isis/viewer/wicket/ui/panels/PanelBase.java    | 10 ++--
 48 files changed, 315 insertions(+), 265 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index 6bc2f16a0c..a31c1125d1 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -517,11 +517,26 @@
 				<artifactId>isis-core-webapp</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>isis-viewer-commons-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.viewer</groupId>
 				<artifactId>isis-viewer-commons-model</artifactId>
 				<version>2.0.0-SNAPSHOT</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>isis-viewer-commons-prism</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>isis-viewer-commons-services</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.isis.viewer</groupId>
 				<artifactId>isis-viewer-restfulobjects-applib</artifactId>
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleCommon.java b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleCommon.java
index 772e990e08..6aee405a5e 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleCommon.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/DemoModuleCommon.java
@@ -29,11 +29,13 @@ import org.apache.isis.applib.IsisModuleApplibMixins;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;
 import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
+import org.apache.isis.viewer.commons.applib.IsisModuleViewerCommonsApplibMixins;
 
 @Configuration
 @Import({
     IsisModuleApplibChangeAndExecutionLoggers.class,
     IsisModuleApplibMixins.class,
+    IsisModuleViewerCommonsApplibMixins.class, // basically adds object impersonation mixins
     IsisModuleCoreRuntimeServices.class,
     IsisModuleTestingFixturesApplib.class,
 })
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
index 304f56b68f..2e26b8da35 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/IsisModuleIncViewerJavaFxUi.java
@@ -37,11 +37,11 @@ import org.apache.isis.incubator.viewer.javafx.ui.decorator.icon.IconServiceDefa
 import org.apache.isis.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingDecoratorForButton;
 import org.apache.isis.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingDecoratorForFormField;
 import org.apache.isis.incubator.viewer.javafx.ui.decorator.prototyping.PrototypingInfoPopupProvider;
+import org.apache.isis.incubator.viewer.javafx.ui.main.MainViewFx;
 import org.apache.isis.incubator.viewer.javafx.ui.main.UiActionHandlerFx;
 import org.apache.isis.incubator.viewer.javafx.ui.main.UiBuilderFx;
 import org.apache.isis.incubator.viewer.javafx.ui.main.UiContextFxDefault;
-import org.apache.isis.viewer.commons.model.IsisModuleViewerCommon;
-import org.apache.isis.incubator.viewer.javafx.ui.main.MainViewFx;
+import org.apache.isis.viewer.commons.applib.IsisModuleViewerCommonsApplib;
 
 /**
  *
@@ -50,7 +50,7 @@ import org.apache.isis.incubator.viewer.javafx.ui.main.MainViewFx;
 @Configuration
 @Import({
         // Modules
-        IsisModuleViewerCommon.class,
+        IsisModuleViewerCommonsApplib.class,
         IsisModuleIncViewerJavaFxModel.class,
 
         // @Components's
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 e288c80958..9cd2c7860a 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
@@ -27,14 +27,13 @@ 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.metamodel.spec.ManagedObjects;
-import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx;
 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.ui.components.UiComponentFactoryFx;
 import org.apache.isis.incubator.viewer.javafx.ui.components.collections.TableViewFx;
 import org.apache.isis.incubator.viewer.javafx.ui.components.object.ObjectViewFx;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiService;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -57,7 +56,7 @@ public class MainViewFx {
 
     private final JavaFxViewerConfig viewerConfig;
     private final MetaModelContext metaModelContext;
-    private final HeaderUiModelProvider headerUiModelProvider;
+    private final HeaderUiService headerUiModelProvider;
     private final InteractionService interactionService;
     private final UiContextFx uiContext;
     private final UiActionHandlerFx uiActionHandler;
@@ -91,8 +90,6 @@ public class MainViewFx {
     private void buildMenu() {
         val header = headerUiModelProvider.getHeader();
 
-        val commonContext = IsisAppCommonContext.of(metaModelContext);
-
         // adding a top level menu 'Home' decorated with a branding-icon ...
 
         val brandingIcon = new ImageView(viewerConfig.getBrandingIcon());
@@ -108,9 +105,9 @@ public class MainViewFx {
         val leftMenuBuilder = MenuBuilderFx.of(uiContext, menuBarLeft, uiActionHandler::handleActionLinkClicked);
         val rightMenuBuilder = MenuBuilderFx.of(uiContext, menuBarRight, uiActionHandler::handleActionLinkClicked);
 
-        header.getPrimary().buildMenuItems(commonContext, leftMenuBuilder);
-        header.getSecondary().buildMenuItems(commonContext, rightMenuBuilder);
-        header.getTertiary().buildMenuItems(commonContext, rightMenuBuilder);
+        header.getPrimary().buildMenuItems(metaModelContext, leftMenuBuilder);
+        header.getSecondary().buildMenuItems(metaModelContext, rightMenuBuilder);
+        header.getTertiary().buildMenuItems(metaModelContext, rightMenuBuilder);
     }
 
     private void replaceContent(final Node node) {
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MenuBuilderFx.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MenuBuilderFx.java
index a0a13b0c8a..dff947e82e 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MenuBuilderFx.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/main/MenuBuilderFx.java
@@ -22,8 +22,8 @@ import java.util.function.Consumer;
 
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx;
-import org.apache.isis.viewer.commons.model.menu.MenuItemDto;
-import org.apache.isis.viewer.commons.model.menu.MenuVisitor;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuItemDto;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuVisitor;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
diff --git a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/decorator/Decorators.java b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/decorator/Decorators.java
index df6d8793f0..b9a4f46656 100644
--- a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/decorator/Decorators.java
+++ b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/decorator/Decorators.java
@@ -32,7 +32,7 @@ import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
 import org.apache.isis.applib.layout.component.CssClassFaPosition;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModel;
-import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiService;
 import org.apache.isis.viewer.commons.model.decorators.IconDecorator;
 import org.apache.isis.viewer.commons.model.decorators.TooltipDecorator;
 
@@ -123,7 +123,7 @@ public class Decorators {
                 final Label label,
                 final IsisAppCommonContext commonContext) {
 
-            val profileIfAny = commonContext.lookupServiceElseFail(UserProfileUiModelProvider.class)
+            val profileIfAny = commonContext.lookupServiceElseFail(UserProfileUiService.class)
                     .userProfile();
             return decorateWithAvatar(label, Optional.ofNullable(profileIfAny));
         }
diff --git a/incubator/viewers/vaadin/ui/pom.xml b/incubator/viewers/vaadin/ui/pom.xml
index 568cce9582..69ab186ed4 100644
--- a/incubator/viewers/vaadin/ui/pom.xml
+++ b/incubator/viewers/vaadin/ui/pom.xml
@@ -124,8 +124,12 @@
 		
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-commons-services</artifactId>
+        </dependency>
+        
+        <dependency>
+			<groupId>org.apache.isis.viewer</groupId>
             <artifactId>isis-viewer-commons-prism</artifactId>
-            <version>${project.version}</version>
         </dependency>
 
 		<dependency>
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/IsisModuleIncViewerVaadinUi.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/IsisModuleIncViewerVaadinUi.java
index b2f41229bc..50ca5c2a7b 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/IsisModuleIncViewerVaadinUi.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/IsisModuleIncViewerVaadinUi.java
@@ -36,13 +36,13 @@ import org.apache.isis.incubator.viewer.vaadin.ui.components.text.TextFieldFacto
 import org.apache.isis.incubator.viewer.vaadin.ui.components.text.uuid.UuidFieldFactory;
 import org.apache.isis.incubator.viewer.vaadin.ui.pages.main.UiActionHandlerVaa;
 import org.apache.isis.incubator.viewer.vaadin.ui.pages.main.UiContextVaaDefault;
-import org.apache.isis.viewer.commons.model.IsisModuleViewerCommon;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
 
 
 @Configuration
 @Import({
         // Modules
-        IsisModuleViewerCommon.class,
+        IsisModuleViewerCommonsServices.class,
         IsisModuleIncViewerVaadinModel.class,
 
         // @Service's
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
index 8101d621f4..64c938939c 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainViewVaa.java
@@ -39,8 +39,8 @@ import org.apache.isis.incubator.viewer.vaadin.ui.components.UiComponentFactoryV
 import org.apache.isis.incubator.viewer.vaadin.ui.components.collection.TableViewVaa;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.object.ObjectViewVaa;
 import org.apache.isis.incubator.viewer.vaadin.ui.util.LocalResourceUtil;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiService;
 import org.apache.isis.viewer.commons.model.decorators.IconDecorator;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModelProvider;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -63,7 +63,7 @@ implements BeforeEnterObserver {
     private final transient UiContextVaa uiContext;
     private final transient UiActionHandlerVaa uiActionHandler;
     private final transient UiComponentFactoryVaa uiComponentFactory;
-    private final transient HeaderUiModelProvider headerUiModelProvider;
+    private final transient HeaderUiService headerUiService;
 
 
     private Div pageContent = new Div();
@@ -75,14 +75,14 @@ implements BeforeEnterObserver {
     public MainViewVaa(
             final MetaModelContext metaModelContext,
             final UiActionHandlerVaa uiActionHandler,
-            final HeaderUiModelProvider headerUiModelProvider,
+            final HeaderUiService headerUiService,
             final UiContextVaa uiContext,
             final UiComponentFactoryVaa uiComponentFactory) {
 
         this.metaModelContext = metaModelContext;
         this.commonContext = IsisAppCommonContext.of(metaModelContext);
         this.uiActionHandler = uiActionHandler;
-        this.headerUiModelProvider = headerUiModelProvider;
+        this.headerUiService = headerUiService;
         this.uiContext = uiContext;
         this.uiComponentFactory = uiComponentFactory;
 
@@ -100,7 +100,7 @@ implements BeforeEnterObserver {
 
         val menuBarContainer = MainView_createHeader.createHeader(
                 commonContext,
-                headerUiModelProvider.getHeader(),
+                headerUiService.getHeader(),
                 uiActionHandler::handleActionLinkClicked,
                 this::renderHomepage);
 
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
index 774f3b7dc0..fd5c5ee926 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MainView_createHeader.java
@@ -32,8 +32,9 @@ import com.vaadin.flow.component.orderedlayout.FlexLayout.FlexWrap;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.incubator.viewer.vaadin.model.util._vaa;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModel;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModel;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiService;
 
 import lombok.val;
 
@@ -72,9 +73,11 @@ final class MainView_createHeader {
         val leftMenuBuilder = MenuBuilderVaa.of(commonContext, menuActionEventHandler, leftMenuBar);
         val rightMenuBuilder = MenuBuilderVaa.of(commonContext, menuActionEventHandler, rightMenuBar);
 
-        headerUiModel.getPrimary().buildMenuItems(commonContext, leftMenuBuilder);
-        headerUiModel.getSecondary().buildMenuItems(commonContext, rightMenuBuilder);
-        headerUiModel.getTertiary().buildMenuItems(commonContext, rightMenuBuilder);
+        val menuUiModelProvider = commonContext.lookupServiceElseFail(MenuUiService.class);
+
+        headerUiModel.getPrimary().buildMenuItems(menuUiModelProvider, leftMenuBuilder);
+        headerUiModel.getSecondary().buildMenuItems(menuUiModelProvider, rightMenuBuilder);
+        headerUiModel.getTertiary().buildMenuItems(menuUiModelProvider, rightMenuBuilder);
 
         return menuBarContainer;
 
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MenuBuilderVaa.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MenuBuilderVaa.java
index 0bad9c6b98..968c6ee6f2 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MenuBuilderVaa.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/MenuBuilderVaa.java
@@ -29,8 +29,8 @@ import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.incubator.viewer.vaadin.model.action.ActionUiModelFactoryVaa;
 import org.apache.isis.incubator.viewer.vaadin.model.decorator.Decorators;
-import org.apache.isis.viewer.commons.model.menu.MenuItemDto;
-import org.apache.isis.viewer.commons.model.menu.MenuVisitor;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuItemDto;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuVisitor;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
diff --git a/viewers/commons/model/pom.xml b/viewers/commons/applib/pom.xml
similarity index 69%
copy from viewers/commons/model/pom.xml
copy to viewers/commons/applib/pom.xml
index 51a4cc20ed..120174cc21 100644
--- a/viewers/commons/model/pom.xml
+++ b/viewers/commons/applib/pom.xml
@@ -27,33 +27,19 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-viewer-commons-model</artifactId>
-    <name>Apache Isis Viewer - Commons Model</name>
+    <artifactId>isis-viewer-commons-applib</artifactId>
+    <name>Apache Isis Viewer - Commons Applib</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.viewer.commons.model</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/viewer/commons/model</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.viewer.commons.applib</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/viewer/commons/applib</git-plugin.propertiesDir>
     </properties>
 
     <dependencies>
-
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-runtime</artifactId>
-        </dependency>
-        
+    
 		<dependency>
-			<groupId>org.webjars</groupId>
-			<artifactId>font-awesome</artifactId>
-			<version>6.1.2</version> <!-- must correspond to entry in /viewer/common/.../IconDecorator.java -->
-		</dependency>
-	
-		<!-- TESTING -->
-		
-        <dependency>
             <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-internaltestsupport</artifactId>
-            <scope>test</scope>
+            <artifactId>isis-core-metamodel</artifactId>
         </dependency>
 
     </dependencies>
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplib.java
similarity index 73%
copy from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
copy to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplib.java
index 8c4fa7975c..866b02368e 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplib.java
@@ -16,17 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib;
 
-public interface MenuVisitor {
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
 
-    void addTopLevel(MenuItemDto menuDto);
-    void addSectionSpacer();
-    void addSubMenu(MenuItemDto menuDto);
-
-    /**
-     * @param named - not null and not empty
-     */
-    void addSectionLabel(String named);
+@Configuration
+@Import({
 
+})
+public class IsisModuleViewerCommonsApplib {
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/IsisModuleViewerCommon.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplibMixins.java
similarity index 68%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/IsisModuleViewerCommon.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplibMixins.java
index 37e55187b0..9f931ec82f 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/IsisModuleViewerCommon.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/IsisModuleViewerCommonsApplibMixins.java
@@ -16,31 +16,21 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model;
+package org.apache.isis.viewer.commons.applib;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 import org.apache.isis.viewer.commons.applib.mixins.Object_impersonate;
 import org.apache.isis.viewer.commons.applib.mixins.Object_impersonateWithRoles;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModelProvider;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModelProvider;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModelProvider;
-import org.apache.isis.viewer.commons.model.userprofile.UserProfileUiModelProviderDefault;
 
 @Configuration
 @Import({
 
-    // @Service's
-    BrandingUiModelProvider.class,
-    UserProfileUiModelProviderDefault.class,
-    MenuUiModelProvider.class,
-    HeaderUiModelProvider.class,
-
     // @Mixin's
     Object_impersonate.class,
     Object_impersonateWithRoles.class,
 
 })
-public class IsisModuleViewerCommon {
+public class IsisModuleViewerCommonsApplibMixins {
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonate.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonate.java
similarity index 100%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonate.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonate.java
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonateWithRoles.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonateWithRoles.java
similarity index 100%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonateWithRoles.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/mixins/Object_impersonateWithRoles.java
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModel.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiModel.java
similarity index 95%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModel.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiModel.java
index 1f7c4115f1..46ec4d7ef6 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModel.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiModel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.branding;
+package org.apache.isis.viewer.commons.applib.services.branding;
 
 import java.io.Serializable;
 import java.util.Optional;
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiService.java
similarity index 73%
copy from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
copy to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiService.java
index 8c4fa7975c..27cbea4adc 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/branding/BrandingUiService.java
@@ -16,17 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.branding;
 
-public interface MenuVisitor {
-
-    void addTopLevel(MenuItemDto menuDto);
-    void addSectionSpacer();
-    void addSubMenu(MenuItemDto menuDto);
+/**
+ * @since 2.0 {@index}}
+ */
+public interface BrandingUiService {
 
-    /**
-     * @param named - not null and not empty
-     */
-    void addSectionLabel(String named);
+    BrandingUiModel getHeaderBranding();
+    BrandingUiModel getSignInBranding();
 
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModel.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiModel.java
similarity index 85%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModel.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiModel.java
index 0c5f56cae4..19cd36f608 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModel.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiModel.java
@@ -16,11 +16,11 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.header;
+package org.apache.isis.viewer.commons.applib.services.header;
 
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiModel;
 import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModel;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModel;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModel;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiService.java
similarity index 73%
copy from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
copy to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiService.java
index 8c4fa7975c..fe6f4de66c 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/header/HeaderUiService.java
@@ -16,17 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.header;
 
-public interface MenuVisitor {
-
-    void addTopLevel(MenuItemDto menuDto);
-    void addSectionSpacer();
-    void addSubMenu(MenuItemDto menuDto);
+/**
+ * @since 2.0 {@index}}
+ */
+public interface HeaderUiService {
 
-    /**
-     * @param named - not null and not empty
-     */
-    void addSectionLabel(String named);
+    HeaderUiModel getHeader();
 
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuItemDto.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuItemDto.java
similarity index 96%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuItemDto.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuItemDto.java
index f4392a4f62..1ab4c36822 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuItemDto.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuItemDto.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.menu;
 
 import org.springframework.lang.Nullable;
 
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiModel.java
similarity index 74%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiModel.java
index b4d0315f1b..5271c9c221 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiModel.java
@@ -16,20 +16,18 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.menu;
 
 import java.io.Serializable;
 import java.util.List;
 import java.util.Locale;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.layout.menubars.bootstrap.BSMenuBar;
-import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
 
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
-import lombok.val;
 
 @Getter
 @RequiredArgsConstructor(staticName = "of")
@@ -46,17 +44,15 @@ public class MenuUiModel implements Serializable {
     }
 
     public void buildMenuItems(
-            final IsisAppCommonContext commonContext,
+            final MetaModelContext mmc,
             final MenuVisitor menuBuilder) {
+        buildMenuItems(mmc.getServiceRegistry().lookupServiceElseFail(MenuUiService.class), menuBuilder);
+    }
 
-        val menuBars = commonContext.getMenuBarsService().menuBars();
-        val menuBar = (BSMenuBar) menuBars.menuBarFor(getMenuBarSelect());
-
-        MenuUiModel_buildMenuItems.buildMenuItems(
-                commonContext,
-                menuBar,
-                menuBuilder);
-
+    public void buildMenuItems(
+            final MenuUiService menuUiService,
+            final MenuVisitor menuBuilder) {
+        menuUiService.buildMenuItems(this, menuBuilder);
     }
 
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiService.java
similarity index 71%
copy from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
copy to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiService.java
index 8c4fa7975c..3f82ef7227 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuUiService.java
@@ -16,17 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.menu;
 
-public interface MenuVisitor {
+import org.apache.isis.applib.annotation.DomainServiceLayout;
 
-    void addTopLevel(MenuItemDto menuDto);
-    void addSectionSpacer();
-    void addSubMenu(MenuItemDto menuDto);
+/**
+ * @since 2.0 {@index}}
+ */
+public interface MenuUiService {
 
-    /**
-     * @param named - not null and not empty
-     */
-    void addSectionLabel(String named);
+    MenuUiModel getMenu(DomainServiceLayout.MenuBar menuBarSelect);
+    void buildMenuItems(MenuUiModel menuUiModel, MenuVisitor menuBuilder);
 
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuVisitor.java
similarity index 94%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuVisitor.java
index 8c4fa7975c..2e0f8931bf 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuVisitor.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/menu/MenuVisitor.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.applib.services.menu;
 
 public interface MenuVisitor {
 
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModel.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModel.java
similarity index 100%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModel.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModel.java
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModelProvider.java b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiService.java
similarity index 96%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModelProvider.java
rename to viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiService.java
index 0401b7cd99..1851d60d45 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiModelProvider.java
+++ b/viewers/commons/applib/src/main/java/org/apache/isis/viewer/commons/applib/services/userprof/UserProfileUiService.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.services.user.UserService;
  *
  * @since 2.0 {@index}
  */
-public interface UserProfileUiModelProvider {
+public interface UserProfileUiService {
 
     /**
      * A UI model to represent the currently logged in user.
diff --git a/viewers/commons/model/pom.xml b/viewers/commons/model/pom.xml
index 51a4cc20ed..ec21da3be8 100644
--- a/viewers/commons/model/pom.xml
+++ b/viewers/commons/model/pom.xml
@@ -36,6 +36,11 @@
     </properties>
 
     <dependencies>
+    
+    	<dependency>
+            <groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-commons-applib</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.isis.core</groupId>
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModelProvider.java b/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModelProvider.java
deleted file mode 100644
index b3e1bc946b..0000000000
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/header/HeaderUiModelProvider.java
+++ /dev/null
@@ -1,46 +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.viewer.commons.model.header;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import org.apache.isis.applib.annotation.DomainServiceLayout.MenuBar;
-import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModelProvider;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModelProvider;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModelProvider;
-
-@Service
-public class HeaderUiModelProvider {
-
-    @Inject private BrandingUiModelProvider brandingUiModelProvider;
-    @Inject private UserProfileUiModelProvider userProfileUiModelProvider;
-    @Inject private MenuUiModelProvider menuUiModelProvider;
-
-    public HeaderUiModel getHeader() {
-        return HeaderUiModel.of(
-                brandingUiModelProvider.getHeaderBranding(),
-                userProfileUiModelProvider.userProfile(),
-                menuUiModelProvider.getMenu(MenuBar.PRIMARY),
-                menuUiModelProvider.getMenu(MenuBar.SECONDARY),
-                menuUiModelProvider.getMenu(MenuBar.TERTIARY));
-    }
-
-}
diff --git a/viewers/commons/pom.xml b/viewers/commons/pom.xml
index e2e5e907ea..c7fd6a7214 100644
--- a/viewers/commons/pom.xml
+++ b/viewers/commons/pom.xml
@@ -39,10 +39,12 @@
 
     <dependencies>
     </dependencies>
-    
+  
     <modules>
+    	<module>applib</module>
     	<module>model</module>
     	<module>prism</module>
+    	<module>services</module>
     </modules>
 
 </project>
diff --git a/viewers/commons/model/pom.xml b/viewers/commons/services/pom.xml
similarity index 72%
copy from viewers/commons/model/pom.xml
copy to viewers/commons/services/pom.xml
index 51a4cc20ed..2b84412875 100644
--- a/viewers/commons/model/pom.xml
+++ b/viewers/commons/services/pom.xml
@@ -27,33 +27,24 @@
         <version>2.0.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>isis-viewer-commons-model</artifactId>
-    <name>Apache Isis Viewer - Commons Model</name>
+    <artifactId>isis-viewer-commons-services</artifactId>
+    <name>Apache Isis Viewer - Commons Services</name>
 
     <properties>
-        <jar-plugin.automaticModuleName>org.apache.isis.viewer.commons.model</jar-plugin.automaticModuleName>
-        <git-plugin.propertiesDir>org/apache/isis/viewer/commons/model</git-plugin.propertiesDir>
+        <jar-plugin.automaticModuleName>org.apache.isis.viewer.commons.services</jar-plugin.automaticModuleName>
+        <git-plugin.propertiesDir>org/apache/isis/viewer/commons/services</git-plugin.propertiesDir>
     </properties>
 
     <dependencies>
-
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-runtime</artifactId>
+    
+    	<dependency>
+            <groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-commons-model</artifactId>
         </dependency>
-        
+    
 		<dependency>
-			<groupId>org.webjars</groupId>
-			<artifactId>font-awesome</artifactId>
-			<version>6.1.2</version> <!-- must correspond to entry in /viewer/common/.../IconDecorator.java -->
-		</dependency>
-	
-		<!-- TESTING -->
-		
-        <dependency>
             <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-core-internaltestsupport</artifactId>
-            <scope>test</scope>
+            <artifactId>isis-core-runtime</artifactId>
         </dependency>
 
     </dependencies>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/IsisModuleViewerCommonsServices.java
similarity index 60%
copy from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java
copy to viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/IsisModuleViewerCommonsServices.java
index 3aacaf9bdd..4c5b095eff 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/IsisModuleViewerCommonsServices.java
@@ -16,28 +16,28 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui;
+package org.apache.isis.viewer.commons.services;
 
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
-import org.apache.isis.viewer.commons.model.IsisModuleViewerCommon;
-import org.apache.isis.viewer.wicket.model.IsisModuleViewerWicketModel;
-import org.apache.isis.viewer.wicket.ui.app.logout.LogoutHandlerWkt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicketThemeSupportDefault;
+import org.apache.isis.viewer.commons.services.branding.BrandingUiServiceDefault;
+import org.apache.isis.viewer.commons.services.header.HeaderUiServiceDefault;
+import org.apache.isis.viewer.commons.services.menu.MenuUiServiceDefault;
+import org.apache.isis.viewer.commons.services.userprof.UserProfileUiServiceDefault;
 
-/**
- * @since 1.x {@index}
- */
 @Configuration
 @Import({
-        // Modules
-        IsisModuleViewerCommon.class,
-        IsisModuleViewerWicketModel.class,
 
-        // @Service's
-        IsisWicketThemeSupportDefault.class,
-        LogoutHandlerWkt.class,
+    // @Service's
+    BrandingUiServiceDefault.class,
+    UserProfileUiServiceDefault.class,
+    MenuUiServiceDefault.class,
+    HeaderUiServiceDefault.class,
+
 })
-public class IsisModuleViewerWicketUi {
+public class IsisModuleViewerCommonsServices {
+
+    public static final String NAMESPACE = "isis.viewer.commons";
+
 }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModelProvider.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/branding/BrandingUiServiceDefault.java
similarity index 65%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModelProvider.java
rename to viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/branding/BrandingUiServiceDefault.java
index fad5f1c697..6eda31a501 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/branding/BrandingUiModelProvider.java
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/branding/BrandingUiServiceDefault.java
@@ -16,32 +16,46 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.branding;
+package org.apache.isis.viewer.commons.services.branding;
 
+import javax.annotation.Priority;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.IsisConfiguration.Viewer.Wicket.Application;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiService;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
 
 @Service
-public class BrandingUiModelProvider {
+@Named(IsisModuleViewerCommonsServices.NAMESPACE + ".BrandingUiServiceDefault")
+@Priority(PriorityPrecedence.LATE)
+@Qualifier("Default")
+public class BrandingUiServiceDefault
+implements BrandingUiService {
 
     private final Application appConfig;
 
     @Inject
-    public BrandingUiModelProvider(IsisConfiguration isisConfiguration) {
-        //TODO application name/logo borrowed from Wicket's configuration, we might generalize this config option to all viewers
+    public BrandingUiServiceDefault(final IsisConfiguration isisConfiguration) {
+        //TODO application name/logo borrowed from Wicket's configuration,
+        // we might generalize this config option to all viewers
         this.appConfig = isisConfiguration.getViewer().getWicket().getApplication();
     }
 
+    @Override
     public BrandingUiModel getHeaderBranding() {
         return BrandingUiModel.of(
                 appConfig.getName(),
                 appConfig.getBrandLogoHeader().orElse(null));
     }
 
+    @Override
     public BrandingUiModel getSignInBranding() {
         return BrandingUiModel.of(
                 appConfig.getName(),
diff --git a/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/header/HeaderUiServiceDefault.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/header/HeaderUiServiceDefault.java
new file mode 100644
index 0000000000..01ccc1f11b
--- /dev/null
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/header/HeaderUiServiceDefault.java
@@ -0,0 +1,61 @@
+/*
+ *  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.viewer.commons.services.header;
+
+import javax.annotation.Priority;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+import org.apache.isis.applib.annotation.DomainServiceLayout.MenuBar;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiService;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiModel;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiService;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiService;
+import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiService;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@Named(IsisModuleViewerCommonsServices.NAMESPACE + ".HeaderUiServiceDefault")
+@Priority(PriorityPrecedence.LATE)
+@Qualifier("Default")
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class HeaderUiServiceDefault
+implements HeaderUiService {
+
+    private final BrandingUiService brandingUiService;
+    private final UserProfileUiService userProfileUiService;
+    private final MenuUiService menuUiService;
+
+    @Override
+    public HeaderUiModel getHeader() {
+        return HeaderUiModel.of(
+                brandingUiService.getHeaderBranding(),
+                userProfileUiService.userProfile(),
+                menuUiService.getMenu(MenuBar.PRIMARY),
+                menuUiService.getMenu(MenuBar.SECONDARY),
+                menuUiService.getMenu(MenuBar.TERTIARY));
+    }
+
+}
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModelProvider.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/MenuUiServiceDefault.java
similarity index 59%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModelProvider.java
rename to viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/MenuUiServiceDefault.java
index eabfa7882a..6634e19477 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModelProvider.java
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/MenuUiServiceDefault.java
@@ -16,31 +16,64 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.services.menu;
 
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
+import javax.annotation.Priority;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.layout.menubars.bootstrap.BSMenuBar;
+import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.util.Facets;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiService;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuVisitor;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
+
+import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 @Service
-public class MenuUiModelProvider {
+@Named(IsisModuleViewerCommonsServices.NAMESPACE + ".MenuUiServiceDefault")
+@Priority(PriorityPrecedence.LATE)
+@Qualifier("Default")
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class MenuUiServiceDefault
+implements MenuUiService {
 
-    @Inject private MetaModelContext metaModelContext;
+    private final MetaModelContext metaModelContext;
+    private final MenuBarsService menuBarsService;
 
     public MenuUiModel getMenu(final DomainServiceLayout.MenuBar menuBarSelect) {
         return MenuUiModel.of(menuBarSelect, select(menuBarSelect));
     }
 
+    public void buildMenuItems(
+            final MenuUiModel menuUiModel,
+            final MenuVisitor menuBuilder) {
+
+        val menuBars = menuBarsService.menuBars();
+        val menuBar = (BSMenuBar) menuBars.menuBarFor(menuUiModel.getMenuBarSelect());
+
+        _MenuItemBuilder.buildMenuItems(
+                metaModelContext,
+                menuBar,
+                menuBuilder);
+
+    }
+
     // -- HELPER
 
     private List<String> select(final DomainServiceLayout.MenuBar menuBarSelect) {
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel_buildMenuItems.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/_MenuItemBuilder.java
similarity index 80%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel_buildMenuItems.java
rename to viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/_MenuItemBuilder.java
index a520e5c7ca..9551c40c14 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/menu/MenuUiModel_buildMenuItems.java
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/menu/_MenuItemBuilder.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.menu;
+package org.apache.isis.viewer.commons.services.menu;
 
 import java.util.concurrent.atomic.LongAdder;
 
@@ -26,9 +26,11 @@ import org.apache.isis.applib.layout.menubars.bootstrap.BSMenu;
 import org.apache.isis.applib.layout.menubars.bootstrap.BSMenuBar;
 import org.apache.isis.applib.layout.menubars.bootstrap.BSMenuSection;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
-import org.apache.isis.core.runtime.context.IsisAppCommonContext;
-import org.apache.isis.viewer.commons.model.userprofile.UserProfileUiModelProviderDefault;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuItemDto;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuVisitor;
+import org.apache.isis.viewer.commons.services.userprof.UserProfileUiServiceDefault;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -36,16 +38,16 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-final class MenuUiModel_buildMenuItems {
+final class _MenuItemBuilder {
 
     public static void buildMenuItems(
-            IsisAppCommonContext commonContext,
-            BSMenuBar menuBar,
-            MenuVisitor menuBuilder) {
+            final MetaModelContext mmc,
+            final BSMenuBar menuBar,
+            final MenuVisitor menuBuilder) {
 
         val itemsPerSectionCounter = new LongAdder();
 
-        val menuVisitor = MenuProcessor.of(commonContext, menuBuilder);
+        val menuVisitor = MenuProcessor.of(mmc, menuBuilder);
 
         for (val menu : menuBar.getMenus()) {
 
@@ -58,7 +60,7 @@ final class MenuUiModel_buildMenuItems {
                 for (val actionLayoutData : menuSection.getServiceActions()) {
                     val serviceBeanName = actionLayoutData.getLogicalTypeName();
 
-                    val serviceAdapter = commonContext.lookupServiceAdapterById(serviceBeanName);
+                    val serviceAdapter = mmc.lookupServiceAdapterById(serviceBeanName);
                     if(serviceAdapter == null) {
                         // service not recognized, presumably the menu layout is out of sync with actual configured modules
                         continue;
@@ -95,25 +97,25 @@ final class MenuUiModel_buildMenuItems {
     @RequiredArgsConstructor(staticName = "of")
     private static class MenuProcessor {
 
-        private final IsisAppCommonContext commonContext;
+        private final MetaModelContext metaModelContext;
         private final MenuVisitor menuVisitor;
 
         private BSMenu currentTopLevel;
         private boolean pushedCurrentTopLevel = false;
 
-        public void addTopLevel(BSMenu menu) {
+        public void addTopLevel(final BSMenu menu) {
             currentTopLevel = menu;
             pushedCurrentTopLevel = false;
         }
 
         public void addSubMenu(
-                @NonNull BSMenuSection menuSection,
-                @NonNull ManagedAction managedAction,
-                boolean isFirstInSection,
-                ServiceActionLayoutData actionLayoutData) {
+                @NonNull final BSMenuSection menuSection,
+                @NonNull final ManagedAction managedAction,
+                final boolean isFirstInSection,
+                final ServiceActionLayoutData actionLayoutData) {
 
             if(!pushedCurrentTopLevel) {
-                val topLevelDto = topLevelDto(commonContext, currentTopLevel);
+                val topLevelDto = topLevelDto(metaModelContext, currentTopLevel);
 
                 menuVisitor.addTopLevel(topLevelDto);
                 pushedCurrentTopLevel = true;
@@ -151,13 +153,13 @@ final class MenuUiModel_buildMenuItems {
      * to the current user's profile name
      */
     private static MenuItemDto topLevelDto(
-            final IsisAppCommonContext commonContext,
+            final MetaModelContext mmc,
             final BSMenu menu) {
 
         val menuItemIsUserProfile = _Strings.isNullOrEmpty(menu.getNamed()); // top level menu item name
 
         val menuItemName = menuItemIsUserProfile
-                ? userProfileName(commonContext)
+                ? userProfileName(mmc)
                 : menu.getNamed();
 
         return menuItemIsUserProfile
@@ -167,9 +169,10 @@ final class MenuUiModel_buildMenuItems {
     }
 
     private static String userProfileName(
-            final IsisAppCommonContext commonContext) {
-        val userProfile = commonContext
-                .lookupServiceElseFail(UserProfileUiModelProviderDefault.class)
+            final MetaModelContext mmc) {
+        val userProfile = mmc
+                .getServiceRegistry()
+                .lookupServiceElseFail(UserProfileUiServiceDefault.class)
                 .userProfile();
         return userProfile.getUserProfileName();
     }
diff --git a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/userprofile/UserProfileUiModelProviderDefault.java b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/userprof/UserProfileUiServiceDefault.java
similarity index 84%
rename from viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/userprofile/UserProfileUiModelProviderDefault.java
rename to viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/userprof/UserProfileUiServiceDefault.java
index e3e7c7991e..0134b554a7 100644
--- a/viewers/commons/model/src/main/java/org/apache/isis/viewer/commons/model/userprofile/UserProfileUiModelProviderDefault.java
+++ b/viewers/commons/services/src/main/java/org/apache/isis/viewer/commons/services/userprof/UserProfileUiServiceDefault.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.commons.model.userprofile;
+package org.apache.isis.viewer.commons.services.userprof;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -31,17 +31,18 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModel;
-import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiService;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @Service
-@Named("isis.viewer.common.UserProfileServiceDefault")
+@Named(IsisModuleViewerCommonsServices.NAMESPACE + ".UserProfileUiServiceDefault")
 @Priority(PriorityPrecedence.LATE)
 @Qualifier("Default")
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
-public class UserProfileUiModelProviderDefault implements UserProfileUiModelProvider {
+public class UserProfileUiServiceDefault implements UserProfileUiService {
 
     private final UserService userService;
     private final TranslationService translationService;
@@ -57,7 +58,7 @@ public class UserProfileUiModelProviderDefault implements UserProfileUiModelProv
                 .orElse(String.format("<%s>", translated("Anonymous")));
     }
 
-    private String userNameFor(UserMemento x) {
+    private String userNameFor(final UserMemento x) {
         final String username = x.getName();
         if (x.isImpersonating()) {
             return String.format("%s (%s)", username, translated("impersonating"));
@@ -68,11 +69,11 @@ public class UserProfileUiModelProviderDefault implements UserProfileUiModelProv
                 : username;
     }
 
-    private String translated(String str) {
+    private String translated(final String str) {
         return translationService.translate(TranslationContext.forClassName(getClass()), str);
     }
 
-    private static boolean isNullOrEmpty(String realName) {
+    private static boolean isNullOrEmpty(final String realName) {
         return realName == null || realName.equals("");
     }
 
diff --git a/viewers/restfulobjects/viewer/pom.xml b/viewers/restfulobjects/viewer/pom.xml
index 2fe944738c..ec9dcf0808 100644
--- a/viewers/restfulobjects/viewer/pom.xml
+++ b/viewers/restfulobjects/viewer/pom.xml
@@ -44,7 +44,7 @@
 
 		<dependency>
             <groupId>org.apache.isis.viewer</groupId>
-            <artifactId>isis-viewer-commons-model</artifactId>
+            <artifactId>isis-viewer-commons-services</artifactId>
         </dependency>
 
         <dependency>
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/IsisModuleViewerRestfulObjectsViewer.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/IsisModuleViewerRestfulObjectsViewer.java
index e572649c8d..12e1c4c3e8 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/IsisModuleViewerRestfulObjectsViewer.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/IsisModuleViewerRestfulObjectsViewer.java
@@ -22,7 +22,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 import org.apache.isis.core.webapp.IsisModuleCoreWebapp;
-import org.apache.isis.viewer.commons.model.IsisModuleViewerCommon;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
 import org.apache.isis.viewer.restfulobjects.rendering.IsisModuleRestfulObjectsRendering;
 import org.apache.isis.viewer.restfulobjects.rendering.service.acceptheader.AcceptHeaderServiceForRest;
 import org.apache.isis.viewer.restfulobjects.viewer.mappers.ExceptionMapperForObjectNotFound;
@@ -45,7 +45,7 @@ import org.apache.isis.viewer.restfulobjects.viewer.resources.VersionResourceSer
 @Import({
         // Modules
         IsisModuleCoreWebapp.class,
-        IsisModuleViewerCommon.class,
+        IsisModuleViewerCommonsServices.class,
         IsisModuleRestfulObjectsRendering.class,
 
         // @Component's
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/HomePageReprRenderer.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/HomePageReprRenderer.java
index 70b50ee64c..b8a876ad1d 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/HomePageReprRenderer.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/HomePageReprRenderer.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiService;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -44,7 +44,7 @@ public class HomePageReprRenderer
 extends ReprRendererAbstract<Void> {
 
     // injection points not directly managed by Spring, instead resolved via constructor
-    @Inject BrandingUiModelProvider brandingUiModelProvider;
+    @Inject BrandingUiService brandingUiService;
 
     HomePageReprRenderer(
             final IResourceContext resourceContext,
@@ -171,7 +171,7 @@ extends ReprRendererAbstract<Void> {
 
     private void addLinksToApplicationLogos() {
 
-        brandingUiModelProvider
+        brandingUiService
         .getSignInBranding()
         .getLogoHref()
         .ifPresent(href->
@@ -183,7 +183,7 @@ extends ReprRendererAbstract<Void> {
                         href)
                 .buildAsApplicationResource()));
 
-        brandingUiModelProvider
+        brandingUiService
         .getHeaderBranding()
         .getLogoHref()
         .ifPresent(href->
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ServiceActionsModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ServiceActionsModel.java
index 5fadee054b..720cbf969f 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ServiceActionsModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ServiceActionsModel.java
@@ -19,7 +19,7 @@
 package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiModel;
 /**
  * Backing model for actions of application services menu bar (typically, as
  * displayed along the top or side of the page).
diff --git a/viewers/wicket/ui/pom.xml b/viewers/wicket/ui/pom.xml
index cc58e429fa..3a85bb9a87 100644
--- a/viewers/wicket/ui/pom.xml
+++ b/viewers/wicket/ui/pom.xml
@@ -72,10 +72,14 @@
 			<artifactId>isis-viewer-wicket-model</artifactId>
 		</dependency>
 		
+		<dependency>
+			<groupId>org.apache.isis.viewer</groupId>
+            <artifactId>isis-viewer-commons-services</artifactId>
+        </dependency>
+		
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
             <artifactId>isis-viewer-commons-prism</artifactId>
-            <version>${project.version}</version>
         </dependency>
 		
 		<dependency>
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java
index 3aacaf9bdd..dcca476ffa 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/IsisModuleViewerWicketUi.java
@@ -21,7 +21,7 @@ package org.apache.isis.viewer.wicket.ui;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
-import org.apache.isis.viewer.commons.model.IsisModuleViewerCommon;
+import org.apache.isis.viewer.commons.services.IsisModuleViewerCommonsServices;
 import org.apache.isis.viewer.wicket.model.IsisModuleViewerWicketModel;
 import org.apache.isis.viewer.wicket.ui.app.logout.LogoutHandlerWkt;
 import org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicketThemeSupportDefault;
@@ -32,7 +32,7 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.IsisWicke
 @Configuration
 @Import({
         // Modules
-        IsisModuleViewerCommon.class,
+        IsisModuleViewerCommonsServices.class,
         IsisModuleViewerWicketModel.class,
 
         // @Service's
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index 8d1e7124d8..ec04acda62 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -27,14 +27,14 @@ import org.apache.wicket.markup.html.panel.Fragment;
 
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
-import org.apache.isis.viewer.commons.model.menu.MenuItemDto;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModel;
-import org.apache.isis.viewer.commons.model.menu.MenuVisitor;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuItemDto;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuVisitor;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.LinkAndLabelFactory;
-import org.apache.isis.viewer.wicket.ui.util.WktDecorators;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
+import org.apache.isis.viewer.wicket.ui.util.WktDecorators;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -147,7 +147,7 @@ public final class ServiceActionUtil {
             final MenuUiModel menuUiModel,
             final Consumer<CssMenuItem> onNewMenuItem) {
 
-        menuUiModel.buildMenuItems(commonContext,
+        menuUiModel.buildMenuItems(commonContext.getMetaModelContext(),
                 MenuBuilderWkt.of(
                         commonContext,
                         onNewMenuItem));
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/header/HeaderPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/header/HeaderPanel.java
index 30cc371b25..5bf6c48576 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/header/HeaderPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/header/HeaderPanel.java
@@ -23,11 +23,11 @@ import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiModel;
+import org.apache.isis.viewer.commons.applib.services.menu.MenuUiModel;
 import org.apache.isis.viewer.commons.applib.services.userprof.UserProfileUiModel;
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModel;
 import org.apache.isis.viewer.commons.model.components.ComponentType;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModel;
-import org.apache.isis.viewer.commons.model.menu.MenuUiModel;
 import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
 import org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
 import org.apache.isis.viewer.wicket.ui.components.widgets.navbar.AvatarImage;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandLogo.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandLogo.java
index 73c04e8931..e45991db87 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandLogo.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandLogo.java
@@ -20,7 +20,7 @@ package org.apache.isis.viewer.wicket.ui.components.widgets.navbar;
 
 import org.apache.wicket.markup.ComponentTag;
 
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
 import org.apache.isis.viewer.wicket.ui.components.WebComponentBase;
 
 /**
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandName.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandName.java
index 099de21150..529de8d59c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandName.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/navbar/BrandName.java
@@ -20,7 +20,7 @@ package org.apache.isis.viewer.wicket.ui.components.widgets.navbar;
 
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModel;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiModel;
 import org.apache.isis.viewer.wicket.ui.components.LabelBase;
 
 /**
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/AccountManagementPageAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/AccountManagementPageAbstract.java
index 69e35e51e6..f6733e8bd4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/AccountManagementPageAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/accmngt/AccountManagementPageAbstract.java
@@ -31,7 +31,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
-import org.apache.isis.viewer.commons.model.branding.BrandingUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.branding.BrandingUiService;
 import org.apache.isis.viewer.wicket.model.models.PageType;
 import org.apache.isis.viewer.wicket.ui.components.widgets.navbar.BrandLogo;
 import org.apache.isis.viewer.wicket.ui.components.widgets.navbar.BrandName;
@@ -99,7 +99,7 @@ public class AccountManagementPageAbstract extends WebPageBase {
 
     private void addApplicationName(final MarkupContainer parent) {
         val branding = super.getCommonContext()
-                .lookupServiceElseFail(BrandingUiModelProvider.class)
+                .lookupServiceElseFail(BrandingUiService.class)
                 .getSignInBranding();
         val brandLogo = new BrandLogo("brandLogo", branding);
         val brandName = new BrandName(ID_APPLICATION_NAME, branding);
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 88e8ea0a0f..175e9e730b 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
@@ -38,8 +38,8 @@ import org.apache.isis.core.interaction.session.MessageBroker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext.HasCommonContext;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModel;
-import org.apache.isis.viewer.commons.model.header.HeaderUiModelProvider;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiModel;
+import org.apache.isis.viewer.commons.applib.services.header.HeaderUiService;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
 import org.apache.isis.viewer.wicket.model.util.WktContext;
@@ -74,7 +74,7 @@ implements HasCommonContext {
     private transient EmailNotificationService emailNotificationService;
     private transient EmailVerificationUrlService emailVerificationUrlService;
     private transient PageNavigationService pageNavigationService;
-    private transient HeaderUiModelProvider headerUiModelProvider;
+    private transient HeaderUiService headerUiService;
 
     protected PanelBase(final String id) {
         this(id, null);
@@ -152,8 +152,8 @@ implements HasCommonContext {
     }
 
     protected HeaderUiModel getHeaderModel() {
-        headerUiModelProvider = computeIfAbsent(HeaderUiModelProvider.class, headerUiModelProvider);
-        return headerUiModelProvider.getHeader();
+        headerUiService = computeIfAbsent(HeaderUiService.class, headerUiService);
+        return headerUiService.getHeader();
     }
 
     // -- TRANSLATION