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 2019/06/03 08:52:31 UTC

[isis] branch 2112_SpringBoot updated: ISIS-2112: convert slf4j loggers to log4j-2

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

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


The following commit(s) were added to refs/heads/2112_SpringBoot by this push:
     new 6db8ba2  ISIS-2112: convert slf4j loggers to log4j-2
6db8ba2 is described below

commit 6db8ba203b8100ffea1c08bbc75d738b4bdd4547
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jun 3 10:52:23 2019 +0200

    ISIS-2112: convert slf4j loggers to log4j-2
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2112
---
 .../apache/isis/applib/client/RestfulClient.java   |  10 +-
 .../applib/client/log/RestfulLoggingFilter.java    |  11 +-
 .../applib/services/command/CommandContext.java    |   8 +-
 .../exceprecog/ExceptionRecognizerAbstract.java    |  10 +-
 .../applib/services/iactn/InteractionContext.java  |   6 -
 .../QueryResultsCacheInternal.java                 |  15 +-
 .../services/routing/RoutingServiceDefault.java    |   6 -
 .../apache/isis/applib/util/ObjectContracts.java   |  12 +-
 .../isis/commons/internal/cdi/_CDI_Lifecycle.java  |  10 +-
 .../commons/encoding/DebugDataInputExtended.java   |  30 ++-
 .../commons/encoding/DebugDataOutputExtended.java  |  30 ++-
 .../isis/core/commons/encoding/FieldType.java      | 280 ++++++++++-----------
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java |   2 -
 .../facets/object/grid/GridFacetDefault.java       |   2 -
 .../annotation/TitleFacetViaTitleAnnotation.java   |   9 +-
 .../title/methods/TitleFacetViaTitleMethod.java    |  10 +-
 .../services/grid/GridSystemServiceAbstract.java   |  14 +-
 .../services/metamodel/MetaModelExporter.java      |   6 -
 .../metamodel/specloader/ServiceInitializer.java   |  30 ++-
 .../specloader/specimpl/ObjectActionDefault.java   |   2 -
 .../isis/core/runtime/snapshot/XmlSnapshot.java    | 202 ++++++++-------
 .../commands/DataNucleusCreateObjectCommand.java   |  13 +-
 .../commands/DataNucleusDeleteObjectCommand.java   |  12 +-
 .../CreateSchemaObjectFromClassMetadata.java       |  15 +-
 .../datanucleus/DataNucleusLifeCycleHelper.java    |   2 -
 .../PersistenceQueryFindAllInstancesProcessor.java |  12 +-
 ...sistenceQueryFindUsingApplibQueryProcessor.java |  16 +-
 .../datanucleus/persistence/queries/QueryUtil.java |  10 +-
 .../core/webapp/IsisWebAppContextListener.java     |  24 +-
 .../isis/core/webapp/content/ResourceServlet.java  |  13 +-
 .../diagnostics/IsisLogOnExceptionFilter.java      |   8 +-
 .../core/webapp/routing/RedirectToDocsFilter.java  |  12 +-
 .../core/runtime/services/ServiceInstantiator.java |  20 +-
 .../background/BackgroundCommandExecution.java     |  10 +-
 .../background/CommandExecutionAbstract.java       |   2 -
 .../background/CommandExecutorServiceDefault.java  |  15 +-
 .../services/email/EmailServiceDefault.java        |  14 +-
 .../core/runtime/services/i18n/po/PoWriter.java    |  12 +-
 .../userreg/EmailNotificationServiceDefault.java   |   1 -
 .../system/internal/IsisLocaleInitializer.java     |  12 +-
 .../system/internal/IsisTimeZoneInitializer.java   |  12 +-
 .../persistence/PersistenceQueryFactory.java       |  12 +-
 .../ObjectAdapterContext_ObjectCreation.java       |  23 +-
 .../system/transaction/IsisTransaction.java        |  31 ++-
 .../resources/DomainObjectResourceServerside.java  |   9 +-
 .../services/HintStoreUsingWicketSession.java      |  30 +--
 .../viewer/services/LocaleProviderWicket.java      |   7 +-
 .../model/models/ScalarModelWithPending.java       |  17 +-
 .../serviceactions/ServiceActionUtil.java          |  23 +-
 .../themepicker/IsisWicketThemeSupport.java        |  17 +-
 .../themepicker/IsisWicketThemeSupportDefault.java |  15 +-
 .../widgets/themepicker/ThemeChooser.java          |   1 -
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  71 +++---
 .../wicket/ui/panels/FormExecutorDefault.java      |  33 ++-
 54 files changed, 548 insertions(+), 681 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClient.java b/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClient.java
index 6fd9078..c4d598f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClient.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/client/RestfulClient.java
@@ -18,10 +18,11 @@
  */
 package org.apache.isis.applib.client;
 
+import static org.apache.isis.commons.internal.base._NullSafe.stream;
+
 import java.util.EnumSet;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Future;
-import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 import javax.ws.rs.client.Client;
@@ -35,7 +36,7 @@ import org.apache.isis.applib.client.log.RestfulLoggingFilter;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.context._Context;
 
-import static org.apache.isis.commons.internal.base._NullSafe.stream;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Setup the Restful Client with Basic-Auth:
@@ -127,10 +128,9 @@ if(digest.isSuccess()) {
  * 
  * @since 2.0.0-M2
  */
+@Log4j2
 public class RestfulClient {
     
-    private static final Logger LOG = Logger.getLogger(RestfulClient.class.getName());
-    
     public static String DEFAULT_RESPONSE_CONTENT_TYPE = "application/json;profile=\"urn:org.apache.isis/v1\"";
 
     private RestfulClientConfig clientConfig;
@@ -212,7 +212,7 @@ public class RestfulClient {
             Class<?> MOXyJsonProvider = _Context.loadClass("org.eclipse.persistence.jaxb.rs.MOXyJsonProvider");
             client.register(MOXyJsonProvider);
         } catch (Exception e) {
-            LOG.warning("This implementation of RestfulClient does require the class 'MOXyJsonProvider'"
+            log.warn("This implementation of RestfulClient does require the class 'MOXyJsonProvider'"
                     + " on the class-path."
                     + " Are you missing a maven dependency?");
         }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/client/log/RestfulLoggingFilter.java b/core/applib/src/main/java/org/apache/isis/applib/client/log/RestfulLoggingFilter.java
index 8ea45f1..ac9b4c3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/client/log/RestfulLoggingFilter.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/client/log/RestfulLoggingFilter.java
@@ -22,8 +22,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
@@ -34,13 +32,14 @@ import javax.ws.rs.client.ClientResponseFilter;
 
 import org.apache.isis.commons.internal.base._Strings;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * 
  * @since 2.0.0-M2
  */
-@Priority(999)
+@Priority(999) @Log4j2
 public class RestfulLoggingFilter implements ClientRequestFilter, ClientResponseFilter{
-    private static final Logger LOG = Logger.getLogger(RestfulLoggingFilter.class.getName());
 
     @Override
     public void filter(ClientRequestContext requestContext) throws IOException {
@@ -77,7 +76,7 @@ public class RestfulLoggingFilter implements ClientRequestFilter, ClientResponse
         .append("----------------------------------------\n")
         ;
         
-        LOG.log(Level.INFO, sb.toString());
+        log.info(sb.toString());
     }
     
     @Override
@@ -99,7 +98,7 @@ public class RestfulLoggingFilter implements ClientRequestFilter, ClientResponse
         .append("----------------------------------------\n")
         ;
         
-        LOG.log(Level.INFO, sb.toString());
+        log.info(sb.toString());
         
     }
        
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
index 1ae1719..699501b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
@@ -18,9 +18,6 @@ package org.apache.isis.applib.services.command;
 
 import javax.enterprise.context.RequestScoped;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -36,12 +33,9 @@ import org.apache.isis.applib.annotation.Programmatic;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
         )
-@RequestScoped
+@RequestScoped 
 public class CommandContext {
 
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(CommandContext.class);
-
     private Command command;
 
     @Programmatic
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
index da15905..60ad74a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
@@ -25,15 +25,14 @@ import java.util.function.Predicate;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Abstract implementation of {@link ExceptionRecognizer} that looks
  * exceptions meeting the {@link Predicate} supplied in the constructor
@@ -44,10 +43,9 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
  * If a messaging-parsing {@link Function} is provided through the constructor,
  * then the message can be altered.  Otherwise the exception's {@link Throwable#getMessage() message} is returned as-is.
  */
+@Log4j2
 public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer {
 
-    public static final Logger LOG = LoggerFactory.getLogger(ExceptionRecognizerAbstract.class);
-
     /**
      * Normally recognized exceptions are not logged (because they are expected and handled).
      *
@@ -140,7 +138,7 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
                 .filter(predicate)
                 .map(throwable->{
                     if(logRecognizedExceptions) {
-                        LOG.info("Recognized exception, stacktrace : ", throwable);
+                        log.info("Recognized exception, stacktrace : ", throwable);
                     }
                     if(ex instanceof TranslatableException) {
                         final TranslatableException translatableException = (TranslatableException) ex;
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
index 0a65efc..bfb66f2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/iactn/InteractionContext.java
@@ -18,9 +18,6 @@ package org.apache.isis.applib.services.iactn;
 
 import javax.enterprise.context.RequestScoped;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -39,9 +36,6 @@ import org.apache.isis.applib.annotation.Programmatic;
 @RequestScoped
 public class InteractionContext {
 
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(InteractionContext.class);
-
     private Interaction interaction;
 
     /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
index eedaa5b..6ffc4fe 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCacheInternal.java
@@ -21,9 +21,6 @@ import java.util.concurrent.Callable;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -31,6 +28,8 @@ import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Maps;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * This service (API and implementation) provides a mechanism by which idempotent query results can be cached for the duration of an interaction.
  * Most commonly this allows otherwise &quot;naive&quot; - eg that makes a repository call many times within a loop - to
@@ -45,11 +44,9 @@ import org.apache.isis.commons.internal.collections._Maps;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
         )
-@RequestScoped
+@RequestScoped @Log4j2
 public class QueryResultsCacheInternal implements QueryResultsCache, WithTransactionScope {
 
-    private static final Logger LOG = LoggerFactory.getLogger(QueryResultsCacheInternal.class);
-
     private final Map<Key, Value<?>> cache = _Maps.newHashMap();
 
     @Programmatic
@@ -122,15 +119,15 @@ public class QueryResultsCacheInternal implements QueryResultsCache, WithTransac
 
     @Programmatic
     private <T> void put(final Key cacheKey, final T result) {
-        LOG.debug("PUT: {}", cacheKey);
+        log.debug("PUT: {}", cacheKey);
         cache.put(cacheKey, new Value<T>(result));
     }
 
     private static void logHitOrMiss(final Key cacheKey, final Value<?> cacheValue) {
-        if(!LOG.isDebugEnabled()) {
+        if(!log.isDebugEnabled()) {
             return;
         }
-        LOG.debug("{}: {}", (cacheValue != null ? "HIT" : "MISS"), cacheKey.toString());
+        log.debug("{}: {}", (cacheValue != null ? "HIT" : "MISS"), cacheKey.toString());
     }
 
     /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/routing/RoutingServiceDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/routing/RoutingServiceDefault.java
index 69a4235..28d314d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/routing/RoutingServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/routing/RoutingServiceDefault.java
@@ -18,9 +18,6 @@
  */
 package org.apache.isis.applib.services.routing;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -32,9 +29,6 @@ import org.apache.isis.applib.services.homepage.HomePageProviderService;
         )
 public class RoutingServiceDefault implements RoutingService {
 
-    @SuppressWarnings("unused")
-    private final static Logger LOG = LoggerFactory.getLogger(RoutingServiceDefault.class);
-
     @Programmatic
     @Override
     public boolean canRoute(final Object original) {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
index d19dd17..45d8bc6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/ObjectContracts.java
@@ -22,12 +22,11 @@ import java.util.Comparator;
 import java.util.Objects;
 import java.util.function.Function;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Provides fluent composition for Objects' equals, hashCode and toString.
  *
@@ -71,10 +70,9 @@ import org.apache.isis.commons.internal.base._NullSafe;
  * @since 2.0.0 (re-invented)
  *
  */
+@Log4j2
 public final class ObjectContracts {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectContracts.class);
-
     private ObjectContracts() {}
 
     public static <T> ToString<T> toString(String name, Function<T, ?> getter) {
@@ -199,8 +197,8 @@ public final class ObjectContracts {
     public static <T> boolean equals(T obj, Object other, String propertyNames) {
 
         if(obj==null && other==null) {
-            if(LOG.isWarnEnabled()) {
-                LOG.warn("potential misuse of <T> ObjectContracts::equals(T obj, Object other, "
+            if(log.isWarnEnabled()) {
+                log.warn("potential misuse of <T> ObjectContracts::equals(T obj, Object other, "
                         + "String propertyNames). First argument is not expected to be null!");
             }
             return true;
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI_Lifecycle.java b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI_Lifecycle.java
index 7e13f8e..408b15e 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI_Lifecycle.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/cdi/_CDI_Lifecycle.java
@@ -18,19 +18,15 @@
  */
 package org.apache.isis.commons.internal.cdi;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.functions._Functions.CheckedRunnable;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
-@RequiredArgsConstructor(staticName="of")
+@RequiredArgsConstructor(staticName="of") @Log4j2
 final class _CDI_Lifecycle implements AutoCloseable {
 
-    private static final Logger LOG = LoggerFactory.getLogger(_CDI_Lifecycle.class);
-    
     private final CheckedRunnable onClose;
     
     @Override
@@ -41,7 +37,7 @@ final class _CDI_Lifecycle implements AutoCloseable {
             val note = "This implementation expects the IocPlugin to provide a CDIProvider "
                     + "that creates CDI instances that implement AutoClosable";
             
-            LOG.warn("Failed to properly close the CDI container. Note: {}", note, e);
+            log.warn("Failed to properly close the CDI container. Note: {}", note, e);
         }
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataInputExtended.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataInputExtended.java
index 1d16316..9ce104b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataInputExtended.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataInputExtended.java
@@ -22,13 +22,11 @@ package org.apache.isis.core.commons.encoding;
 import java.io.IOException;
 import java.util.Arrays;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public class DebugDataInputExtended extends DataInputExtendedDecorator {
 
-    private static final Logger LOG = LoggerFactory.getLogger(DebugDataInputExtended.class);
-
     public DebugDataInputExtended(final DataInputExtended input) {
         super(input);
     }
@@ -36,22 +34,22 @@ public class DebugDataInputExtended extends DataInputExtendedDecorator {
     @Override
     public boolean readBoolean() throws IOException {
         final boolean b = super.readBoolean();
-        LOG.debug("boolean: {}", b);
+        log.debug("boolean: {}", b);
         return b;
     }
 
     @Override
     public byte readByte() throws IOException {
         final byte b = super.readByte();
-        LOG.debug("byte: {}", b);
+        log.debug("byte: {}", b);
         return b;
     }
 
     @Override
     public byte[] readBytes() throws IOException {
         final byte[] bs = super.readBytes();
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("bytes: {}", new String(bs));
+        if (log.isDebugEnabled()) {
+            log.debug("bytes: {}", new String(bs));
         }
         return bs;
     }
@@ -59,29 +57,29 @@ public class DebugDataInputExtended extends DataInputExtendedDecorator {
     @Override
     public int readInt() throws IOException {
         final int i = super.readInt();
-        LOG.debug("int: {}", i);
+        log.debug("int: {}", i);
         return i;
     }
 
     @Override
     public long readLong() throws IOException {
         final long l = super.readLong();
-        LOG.debug("long: {}", l);
+        log.debug("long: {}", l);
         return l;
     }
 
     @Override
     public String readUTF() throws IOException {
         final String string = super.readUTF();
-        LOG.debug("string: {}", string);
+        log.debug("string: {}", string);
         return string;
     }
 
     @Override
     public String[] readUTFs() throws IOException {
         final String[] strings = super.readUTFs();
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("list: {}", Arrays.toString(strings));
+        if (log.isDebugEnabled()) {
+            log.debug("list: {}", Arrays.toString(strings));
         }
         return strings;
     }
@@ -89,8 +87,8 @@ public class DebugDataInputExtended extends DataInputExtendedDecorator {
     @Override
     public <T> T readEncodable(final Class<T> encodableType) throws IOException {
         final T object = super.readEncodable(encodableType);
-        if (LOG.isDebugEnabled()) {
-            LOG.debug(">>> object");
+        if (log.isDebugEnabled()) {
+            log.debug(">>> object");
         }
         return object;
     }
@@ -98,7 +96,7 @@ public class DebugDataInputExtended extends DataInputExtendedDecorator {
     @Override
     public <T> T[] readEncodables(final Class<T> encodableType) throws IOException {
         final T[] objects = super.readEncodables(encodableType);
-        LOG.debug(">>> objects x{}", objects.length);
+        log.debug(">>> objects x{}", objects.length);
         return objects;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataOutputExtended.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataOutputExtended.java
index 7db8773..1360861 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataOutputExtended.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/DebugDataOutputExtended.java
@@ -21,72 +21,70 @@ package org.apache.isis.core.commons.encoding;
 
 import java.io.IOException;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public class DebugDataOutputExtended extends DataOutputExtendedDecorator {
 
-    private static final Logger LOG = LoggerFactory.getLogger(DebugDataOutputExtended.class);
-
     public DebugDataOutputExtended(final DataOutputExtended underlying) {
         super(underlying);
     }
 
     @Override
     public void writeBoolean(final boolean flag) throws IOException {
-        LOG.debug("boolean: {}", flag);
+        log.debug("boolean: {}", flag);
         super.writeBoolean(flag);
     }
 
     @Override
     public void writeBytes(final byte[] value) throws IOException {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("bytes: ({}) {}", value.length, new String(value));
+        if (log.isDebugEnabled()) {
+            log.debug("bytes: ({}) {}", value.length, new String(value));
         }
         super.writeBytes(value);
     }
 
     @Override
     public void writeByte(final int value) throws IOException {
-        LOG.debug("byte: {}", value);
+        log.debug("byte: {}", value);
         super.writeByte(value);
     }
 
     @Override
     public void writeInt(final int value) throws IOException {
-        LOG.debug("int: {}", value);
+        log.debug("int: {}", value);
         super.writeInt(value);
     }
 
     @Override
     public void writeLong(final long value) throws IOException {
-        LOG.debug("long: {}", value);
+        log.debug("long: {}", value);
         super.writeLong(value);
     }
 
     @Override
     public void writeEncodable(final Object object) throws IOException {
-        LOG.debug(">>> object: ({})", object);
+        log.debug(">>> object: ({})", object);
         super.writeEncodable(object);
     }
 
     @Override
     public void writeEncodables(final Object[] objects) throws IOException {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug(">>> objects x{}", objects.length);
+        if (log.isDebugEnabled()) {
+            log.debug(">>> objects x{}", objects.length);
         }
         super.writeEncodables(objects);
     }
 
     @Override
     public void writeUTF(final String str) throws IOException {
-        LOG.debug("string: {}", str);
+        log.debug("string: {}", str);
         super.writeUTF(str);
     }
 
     @Override
     public void writeUTFs(final String[] strings) throws IOException {
-        if (LOG.isDebugEnabled()) {
+        if (log.isDebugEnabled()) {
             final StringBuffer l = new StringBuffer();
             for (int i = 0; i < strings.length; i++) {
                 if (i > 0) {
@@ -94,7 +92,7 @@ public class DebugDataOutputExtended extends DataOutputExtendedDecorator {
                 }
                 l.append(strings[i]);
             }
-            LOG.debug("list: {}", l);
+            log.debug("list: {}", l);
         }
         super.writeUTFs(strings);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
index 974e95c..00dc769 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
@@ -31,11 +31,10 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.context._Context;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Typesafe writing and reading of fields, providing some level of integrity
  * checking of encoded messages.
@@ -50,10 +49,9 @@ import org.apache.isis.commons.internal.context._Context;
  * Conversely, the {@link #read(DataInputExtended)} reads the field type and
  * then the data for that field type.
  */
+@Log4j2
 public abstract class FieldType<T> {
 
-    private static Logger LOG = LoggerFactory.getLogger(FieldType.class);
-
     private static String LOG_INDENT = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ";
     private static final int NULL_BIT = 64; // 2 to the 6
 
@@ -68,13 +66,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Boolean value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeBoolean(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -85,12 +83,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final boolean value = inputStream.readBoolean();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -104,21 +102,21 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeBoolean(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -130,23 +128,23 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
                 final boolean[] values = new boolean[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readBoolean();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -157,13 +155,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Byte value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeByte(value.byteValue());
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -174,12 +172,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final byte value = inputStream.readByte();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -193,7 +191,7 @@ public abstract class FieldType<T> {
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 final int length = values.length;
                 outputStream.writeInt(length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("length:").append(length).append(" [BYTE ARRAY]"));
                 }
 
@@ -201,7 +199,7 @@ public abstract class FieldType<T> {
                 // we take advantage of optimization built into DataOutputStream
                 outputStream.write(values);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -212,7 +210,7 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     final StringBuilder msg = new StringBuilder().append("length:").append(length).append(" [BYTE ARRAY]");
                     log(this, msg);
                 }
@@ -221,7 +219,7 @@ public abstract class FieldType<T> {
                 readBytes(inputStream, bytes);
                 return bytes;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -238,13 +236,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Short value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeShort(value.shortValue());
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -255,12 +253,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final short value = inputStream.readShort();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -274,22 +272,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeShort(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -301,24 +299,24 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final short[] values = new short[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readShort();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -329,13 +327,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Integer value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(value.intValue());
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -346,12 +344,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int value = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -362,13 +360,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Integer value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeByte(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -379,12 +377,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int value = inputStream.readUnsignedByte();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -395,13 +393,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Integer value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeShort(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -412,12 +410,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int value = inputStream.readUnsignedShort();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -431,22 +429,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeInt(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -458,24 +456,24 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final int[] values = new int[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readInt();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -486,13 +484,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Long value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeLong(value.intValue());
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -503,12 +501,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final long value = inputStream.readLong();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -521,22 +519,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeLong(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -549,24 +547,24 @@ public abstract class FieldType<T> {
 
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final long[] values = new long[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readLong();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -577,13 +575,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Character value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeLong(value.charValue());
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -594,12 +592,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final char value = inputStream.readChar();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -614,22 +612,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeChar(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -641,24 +639,24 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final char[] values = new char[length];
                 for (int i = 0; i < values.length; i++) {
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                     values[i] = inputStream.readChar();
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -669,13 +667,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Float value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeFloat(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -686,12 +684,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final float value = inputStream.readFloat();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -705,22 +703,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeFloat(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -732,24 +730,24 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final float[] values = new float[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readFloat();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -760,13 +758,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Double value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeDouble(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -777,12 +775,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final double value = inputStream.readDouble();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -796,22 +794,22 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     outputStream.writeDouble(values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -823,24 +821,24 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
                 final double[] values = new double[length];
                 for (int i = 0; i < values.length; i++) {
                     values[i] = inputStream.readDouble();
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -851,13 +849,13 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final String value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeUTF(value);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -868,12 +866,12 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final String value = inputStream.readUTF();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(value));
                 }
                 return value;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -886,23 +884,23 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(values.length);
                 }
 
                 for (int i = 0; i < values.length; i++) {
                     // using FieldType to write out takes care of null handling
                     FieldType.STRING.write(output, values[i]);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -914,7 +912,7 @@ public abstract class FieldType<T> {
                 final StringBuilder buf = new StringBuilder();
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     buf.append("length: ").append(length);
                 }
 
@@ -922,17 +920,17 @@ public abstract class FieldType<T> {
                 for (int i = 0; i < values.length; i++) {
                     // using FieldType to read in takes care of null handling
                     values[i] = FieldType.STRING.read(input);
-                    if (LOG.isDebugEnabled()) {
+                    if (log.isDebugEnabled()) {
                         buf.append(i == 0 ? ": " : ", ");
                         buf.append(values[i]);
                     }
                 }
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, buf);
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -945,7 +943,7 @@ public abstract class FieldType<T> {
             try {
                 // write out class
                 final String className = encodable.getClass().getName();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(className));
                 }
                 output.writeUTF(className);
@@ -953,7 +951,7 @@ public abstract class FieldType<T> {
                 // recursively encode
                 encodable.encode(output);
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -964,7 +962,7 @@ public abstract class FieldType<T> {
             try {
                 // read in class name ...
                 final String className = input.readUTF();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append(className));
                 }
 
@@ -994,7 +992,7 @@ public abstract class FieldType<T> {
                 }
 
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1012,7 +1010,7 @@ public abstract class FieldType<T> {
             try {
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("length: ").append(values.length));
                 }
                 for (final Encodable encodable : values) {
@@ -1020,7 +1018,7 @@ public abstract class FieldType<T> {
                     FieldType.ENCODABLE.write(output, encodable);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1032,7 +1030,7 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("length: ").append(length));
                 }
 
@@ -1043,7 +1041,7 @@ public abstract class FieldType<T> {
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1059,7 +1057,7 @@ public abstract class FieldType<T> {
         @Override
         protected void doWrite(final DataOutputExtended output, final Serializable value) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("[SERIALIZABLE]"));
                 }
 
@@ -1068,7 +1066,7 @@ public abstract class FieldType<T> {
                 oos.writeObject(value);
                 oos.flush();
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1077,7 +1075,7 @@ public abstract class FieldType<T> {
         @Override
         protected Serializable doRead(final DataInputExtended input) throws IOException {
             try {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("[SERIALIZABLE]"));
                 }
 
@@ -1089,7 +1087,7 @@ public abstract class FieldType<T> {
                     throw new FailedToDeserializeException(ex);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1107,7 +1105,7 @@ public abstract class FieldType<T> {
             try {
                 final DataOutputStream outputStream = output.getDataOutputStream();
                 outputStream.writeInt(values.length);
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("length: ").append(values.length));
                 }
 
@@ -1116,7 +1114,7 @@ public abstract class FieldType<T> {
                     FieldType.SERIALIZABLE.write(output, value);
                 }
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1128,7 +1126,7 @@ public abstract class FieldType<T> {
             try {
                 final DataInputStream inputStream = input.getDataInputStream();
                 final int length = inputStream.readInt();
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     log(this, new StringBuilder().append("length: ").append(length));
                 }
 
@@ -1139,7 +1137,7 @@ public abstract class FieldType<T> {
                 }
                 return values;
             } finally {
-                if (LOG.isDebugEnabled()) {
+                if (log.isDebugEnabled()) {
                     unlog(this);
                 }
             }
@@ -1197,7 +1195,7 @@ public abstract class FieldType<T> {
                 throw new IllegalStateException("Mismatch in stream: expected " + this + " but got " + fieldType + " (" + fieldTypeIdx + ")");
             }
 
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only log if reading a null; otherwise actual value read
                 // logged later
                 log(this, new StringBuilder().append("(null)"));
@@ -1209,7 +1207,7 @@ public abstract class FieldType<T> {
                 return doRead(input);
             }
         } finally {
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only unlog if reading a null
                 unlog(this);
             }
@@ -1228,7 +1226,7 @@ public abstract class FieldType<T> {
                 throw new IllegalStateException("Mismatch in stream: expected " + this + " but got " + fieldType);
             }
 
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only log if reading a null; otherwise actual value read
                 // logged later
                 log(this, new StringBuilder().append("(null)"));
@@ -1241,7 +1239,7 @@ public abstract class FieldType<T> {
             }
 
         } finally {
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only unlog if reading a null
                 unlog(this);
             }
@@ -1261,7 +1259,7 @@ public abstract class FieldType<T> {
             final DataOutputStream outputStream = output.getDataOutputStream();
 
             outputStream.write(fieldTypeIdxAndNullability);
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only log if writing a null; otherwise actual value logged
                 // later
                 log(this, new StringBuilder().append("(null)"));
@@ -1271,7 +1269,7 @@ public abstract class FieldType<T> {
                 doWrite(output, value);
             }
         } finally {
-            if (isNull && LOG.isDebugEnabled()) {
+            if (isNull && log.isDebugEnabled()) {
                 // only unlog if writing a null
                 unlog(this);
             }
@@ -1306,7 +1304,7 @@ public abstract class FieldType<T> {
         }
         buf.insert(0, spaces(currentDebugLevel()));
         incrementDebugLevel();
-        LOG.debug(buf.toString());
+        log.debug(buf.toString());
     }
 
     private static void unlog(final FieldType<?> fieldType) {
@@ -1320,7 +1318,7 @@ public abstract class FieldType<T> {
         decrementDebugLevel();
         if (fieldType.isIndentingAndOutdenting()) {
             buf.insert(0, spaces(currentDebugLevel()));
-            LOG.debug(buf.toString());
+            log.debug(buf.toString());
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
index b41b683..ac34bf9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
@@ -39,8 +39,6 @@ import org.apache.isis.core.metamodel.util.EventUtil;
 public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
         CssClassFacet {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.class);
-
     public static Facet create(
             final List<ViewModelLayout> viewModelLayouts,
             final MetamodelEventService metamodelEventService,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index 4cf7226..623773e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@ -31,8 +31,6 @@ public class GridFacetDefault
 extends FacetAbstract
 implements GridFacet {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(GridFacetDefault.class);
-
     public static Class<? extends Facet> type() {
         return GridFacet.class;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index 5a52e38..fd8545b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -24,9 +24,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.function.Function;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -37,9 +34,11 @@ import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
 public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
 
-    private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaTitleAnnotation.class);
     private final List<TitleComponent> components;
 
     public static class TitleComponent {
@@ -152,7 +151,7 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
 
             return stringBuilder.toString().trim();
         } catch (final RuntimeException ex) {
-            LOG.warn("Title failure", ex);
+            log.warn("Title failure", ex);
             return "Failed Title";
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
index 97065bc..5d63dbf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
@@ -24,9 +24,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -35,9 +32,10 @@ import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements ImperativeFacet {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaTitleMethod.class);
+@Log4j2
+public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements ImperativeFacet {
 
     private final Method method;
     private final TranslationService translationService;
@@ -77,7 +75,7 @@ public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements Impe
             }
             return null;
         } catch (final RuntimeException ex) {
-            LOG.warn("title failure", ex);
+            log.warn("title failure", ex);
             return "Failed Title";
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 740580d..286f9ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -25,9 +25,6 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.LabelPosition;
@@ -117,9 +114,10 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
-public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib.layout.grid.Grid> implements GridSystemService<G> {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(GridSystemServiceAbstract.class);
+@Log4j2
+public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib.layout.grid.Grid> implements GridSystemService<G> {
 
     private final Class<G> gridImplementation;
     private final String tns;
@@ -171,15 +169,15 @@ public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib
                         grid, domainClass);
         if (valid) {
             overwriteFacets(grid, domainClass);
-            if(LOG.isDebugEnabled()) {
-                LOG.debug("Grid:\n\n{}\n\n", jaxbService.toXml(grid));
+            if(log.isDebugEnabled()) {
+                log.debug("Grid:\n\n{}\n\n", jaxbService.toXml(grid));
             }
         } else {
 
             if(_Context.isPrototyping()) {
                 messageService.warnUser("Grid metadata errors for " + grid.getDomainClass().getName() + "; check the error log");
             }
-            LOG.error("Grid metadata errors:\n\n{}\n\n", jaxbService.toXml(grid));
+            log.error("Grid metadata errors:\n\n{}\n\n", jaxbService.toXml(grid));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
index cf79edf..6e4568d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -26,9 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.command.CommandDtoProcessor;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
@@ -63,9 +60,6 @@ import org.apache.isis.schema.utils.CommonDtoUtils;
 
 class MetaModelExporter {
 
-    @SuppressWarnings("unused")
-    private final static Logger LOG = LoggerFactory.getLogger(MetaModelExporter.class);
-
     SpecificationLoader specificationLookup;
 
     public MetaModelExporter(final SpecificationLoader specificationLookup) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
index 0ee5c00..0e5dab3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
@@ -23,16 +23,14 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 
-public class ServiceInitializer {
+import lombok.extern.log4j.Log4j2;
 
-    private final static Logger LOG = LoggerFactory.getLogger(ServiceInitializer.class);
+@Log4j2
+public class ServiceInitializer {
 
     private final List<Object> services;
 
@@ -53,7 +51,7 @@ public class ServiceInitializer {
     public void validate() {
 
         for (final Object service : services) {
-            LOG.debug("checking for @PostConstruct and @PostDestroy methods on {}", service.getClass().getName());
+            log.debug("checking for @PostConstruct and @PostDestroy methods on {}", service.getClass().getName());
             final Method[] methods = service.getClass().getMethods();
 
             // @PostConstruct
@@ -111,8 +109,8 @@ public class ServiceInitializer {
     // -- postConstruct
 
     public void postConstruct() {
-        if(LOG.isInfoEnabled()) {
-            LOG.info("calling @PostConstruct on all domain services");
+        if(log.isInfoEnabled()) {
+            log.info("calling @PostConstruct on all domain services");
         }
 
         Exception firstExceptionIfAny = null;
@@ -120,8 +118,8 @@ public class ServiceInitializer {
             final Object service = entry.getKey();
             final Method method = entry.getValue();
 
-            if(LOG.isDebugEnabled()) {
-                LOG.debug(
+            if(log.isDebugEnabled()) {
+                log.debug(
                         "... calling @PostConstruct method: " + service.getClass().getName() + ": " + method.getName());
             }
 
@@ -135,7 +133,7 @@ public class ServiceInitializer {
                     MethodExtensions.invoke(method, service, new Object[] { props });
                 }
             } catch(Exception ex) {
-                LOG.error(String.format(
+                log.error(String.format(
                         "@PostConstruct on %s#%s: failed",
                         service.getClass().getName(), method.getName()),
                         ex);
@@ -154,22 +152,22 @@ public class ServiceInitializer {
     // -- preDestroy
 
     public void preDestroy() {
-        if(LOG.isInfoEnabled()) {
-            LOG.info("calling @PreDestroy on all domain services");
+        if(log.isInfoEnabled()) {
+            log.info("calling @PreDestroy on all domain services");
         }
         for (final Map.Entry<Object, Method> entry : preDestroyMethodsByService.entrySet()) {
             final Object service = entry.getKey();
             final Method method = entry.getValue();
 
-            if(LOG.isDebugEnabled()) {
-                LOG.debug("... calling @PreDestroy method: {}: {}", service.getClass().getName(), method.getName());
+            if(log.isDebugEnabled()) {
+                log.debug("... calling @PreDestroy method: {}: {}", service.getClass().getName(), method.getName());
             }
 
             try {
                 MethodExtensions.invoke(method, service);
             } catch(Exception ex) {
                 // do nothing
-                LOG.warn(String.format(
+                log.warn(String.format(
                         "@PreDestroy on %s#%s: failed, continuing anyway",
                         service.getClass().getName(), method.getName()));
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 2f716f3..fb678db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -68,8 +68,6 @@ import org.apache.isis.schema.cmd.v1.CommandDto;
 
 public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectAction {
 
-    //private final static Logger LOG = LoggerFactory.getLogger(ObjectActionDefault.class);
-
     public static ActionType getType(final String typeStr) {
         final ActionType type = ActionType.valueOf(typeStr);
         if (type == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/snapshot/XmlSnapshot.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/snapshot/XmlSnapshot.java
index f9117e4..00ed055 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/snapshot/XmlSnapshot.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/runtime/snapshot/XmlSnapshot.java
@@ -40,13 +40,6 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService.Snapshot;
 import org.apache.isis.applib.snapshot.SnapshottableWithInclusions;
@@ -65,6 +58,12 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Traverses object graph from specified root, so that an XML representation of
@@ -90,10 +89,9 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
  * // their &lt;tt&gt;Product&lt;/tt&gt;s
  * </pre>
  */
+@Log4j2
 public class XmlSnapshot implements Snapshot {
 
-    private static final Logger LOG = LoggerFactory.getLogger(XmlSnapshot.class);
-
     private final IsisSchema isisMetaModel;
 
     private final Place rootPlace;
@@ -133,8 +131,8 @@ public class XmlSnapshot implements Snapshot {
      */
     public XmlSnapshot(final ObjectAdapter rootAdapter, final XmlSchema schema) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug(".ctor({}{}{})", log("rootObj", rootAdapter), andlog("schema", schema), andlog("addOids", "" + true));
+        if (log.isDebugEnabled()) {
+            log.debug(".ctor({}{}{})", log("rootObj", rootAdapter), andlog("schema", schema), andlog("addOids", "" + true));
         }
 
         this.isisMetaModel = new IsisSchema();
@@ -155,7 +153,7 @@ public class XmlSnapshot implements Snapshot {
             this.rootPlace = appendXml(rootAdapter);
 
         } catch (final ParserConfigurationException e) {
-            LOG.error("unable to build snapshot", e);
+            log.error("unable to build snapshot", e);
             throw new IsisException(e);
         }
 
@@ -196,8 +194,8 @@ public class XmlSnapshot implements Snapshot {
      */
     private Place appendXml(final ObjectAdapter object) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml({})", log("obj", object));
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml({})", log("obj", object));
         }
 
         final String fullyQualifiedClassName = object.getSpecification().getFullIdentifier();
@@ -214,29 +212,29 @@ public class XmlSnapshot implements Snapshot {
         final Element element = place.getXmlElement();
         final Element xsElementElement = place.getXsdElement();
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(NO): add as element to XML doc");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(NO): add as element to XML doc");
         }
         getXmlDocument().appendChild(element);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(NO): add as xs:element to xs:schema of the XSD document");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(NO): add as xs:element to xs:schema of the XSD document");
         }
         getXsdElement().appendChild(xsElementElement);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(NO): set target name in XSD, derived from FQCN of obj");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(NO): set target name in XSD, derived from FQCN of obj");
         }
         schema.setTargetNamespace(getXsdDocument(), fullyQualifiedClassName);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(NO): set schema location file name to XSD, derived from FQCN of obj");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(NO): set schema location file name to XSD, derived from FQCN of obj");
         }
         final String schemaLocationFileName = fullyQualifiedClassName + ".xsd";
         schema.assignSchema(getXmlDocument(), fullyQualifiedClassName, schemaLocationFileName);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(NO): copy into snapshot obj");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(NO): copy into snapshot obj");
         }
         setXmlElement(element);
         setSchemaLocationFileName(schemaLocationFileName);
@@ -262,8 +260,8 @@ public class XmlSnapshot implements Snapshot {
      */
     private Element appendXml(final Place parentPlace, final ObjectAdapter childObject) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml({}{})", log("parentPlace", parentPlace), andlog("childObj", childObject));
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml({}{})", log("parentPlace", parentPlace), andlog("childObj", childObject));
         }
 
         final Element parentElement = parentPlace.getXmlElement();
@@ -273,20 +271,20 @@ public class XmlSnapshot implements Snapshot {
             throw new IllegalArgumentException("parent XML Element must have snapshot's XML document as its owner");
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(Pl, NO): invoking objectToElement() for {}", log("childObj", childObject));
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(Pl, NO): invoking objectToElement() for {}", log("childObj", childObject));
         }
         final Place childPlace = objectToElement(childObject);
         Element childElement = childPlace.getXmlElement();
         final Element childXsElement = childPlace.getXsdElement();
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(Pl, NO): invoking mergeTree of parent with child");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(Pl, NO): invoking mergeTree of parent with child");
         }
         childElement = mergeTree(parentElement, childElement);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXml(Pl, NO): adding XS Element to schema if required");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXml(Pl, NO): adding XS Element to schema if required");
         }
         schema.addXsElementIfNotPresent(parentXsElement, childXsElement);
 
@@ -295,9 +293,9 @@ public class XmlSnapshot implements Snapshot {
 
     private boolean appendXmlThenIncludeRemaining(final Place parentPlace, final ObjectAdapter referencedObject, final Vector fieldNames, final String annotation) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXmlThenIncludeRemaining(: {}{}{}{})", log("parentPlace", parentPlace), andlog("referencedObj", referencedObject), andlog("fieldNames", fieldNames), andlog("annotation", annotation));
-            LOG.debug("appendXmlThenIncludeRemaining(..): invoking appendXml(parentPlace, referencedObject)");
+        if (log.isDebugEnabled()) {
+            log.debug("appendXmlThenIncludeRemaining(: {}{}{}{})", log("parentPlace", parentPlace), andlog("referencedObj", referencedObject), andlog("fieldNames", fieldNames), andlog("annotation", annotation));
+            log.debug("appendXmlThenIncludeRemaining(..): invoking appendXml(parentPlace, referencedObject)");
         }
 
         final Element referencedElement = appendXml(parentPlace, referencedObject);
@@ -305,8 +303,8 @@ public class XmlSnapshot implements Snapshot {
 
         final boolean includedField = includeField(referencedPlace, fieldNames, annotation);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("appendXmlThenIncludeRemaining(..): invoked includeField(referencedPlace, fieldNames){}", andlog("returned", "" + includedField));
+        if (log.isDebugEnabled()) {
+            log.debug("appendXmlThenIncludeRemaining(..): invoked includeField(referencedPlace, fieldNames){}", andlog("returned", "" + includedField));
         }
 
         return includedField;
@@ -385,19 +383,19 @@ public class XmlSnapshot implements Snapshot {
         for (final StringTokenizer tok = new StringTokenizer(path, "/"); tok.hasMoreTokens();) {
             final String token = tok.nextToken();
 
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("include(..): {}", log("token", token));
+            if (log.isDebugEnabled()) {
+                log.debug("include(..): {}", log("token", token));
             }
             fieldNames.addElement(token);
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("include(..): {}", log("fieldNames", fieldNames));
+        if (log.isDebugEnabled()) {
+            log.debug("include(..): {}", log("fieldNames", fieldNames));
         }
 
         // navigate first field, from the root.
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("include(..): invoking includeField");
+        if (log.isDebugEnabled()) {
+            log.debug("include(..): invoking includeField");
         }
         includeField(rootPlace, fieldNames, annotation);
     }
@@ -409,8 +407,8 @@ public class XmlSnapshot implements Snapshot {
      */
     private boolean includeField(final Place place, final Vector fieldNames, final String annotation) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("includeField(: {}{}{})", log("place", place), andlog("fieldNames", fieldNames),andlog("annotation", annotation));
+        if (log.isDebugEnabled()) {
+            log.debug("includeField(: {}{}{})", log("place", place), andlog("fieldNames", fieldNames),andlog("annotation", annotation));
         }
 
         final ObjectAdapter object = place.getObject();
@@ -433,8 +431,8 @@ public class XmlSnapshot implements Snapshot {
         final String fieldName = (String) names.elementAt(0);
         names.removeElementAt(0);
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("includeField(Pl, Vec, Str):{}{}", log("processing field", fieldName), andlog("left", "" + names.size()));
+        if (log.isDebugEnabled()) {
+            log.debug("includeField(Pl, Vec, Str):{}{}", log("processing field", fieldName), andlog("left", "" + names.size()));
         }
 
         // locate the field in the object's class
@@ -445,8 +443,8 @@ public class XmlSnapshot implements Snapshot {
             // check first.
             field = nos.getAssociation(fieldName);
         } catch (final ObjectSpecificationException ex) {
-            if (LOG.isInfoEnabled()) {
-                LOG.info("includeField(Pl, Vec, Str): could not locate field, skipping");
+            if (log.isInfoEnabled()) {
+                log.info("includeField(Pl, Vec, Str): could not locate field, skipping");
             }
             return false;
         }
@@ -454,13 +452,13 @@ public class XmlSnapshot implements Snapshot {
         // locate the corresponding XML element
         // (the corresponding XSD element will later be attached to xmlElement
         // as its userData)
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("includeField(Pl, Vec, Str): locating corresponding XML element");
+        if (log.isDebugEnabled()) {
+            log.debug("includeField(Pl, Vec, Str): locating corresponding XML element");
         }
         final Vector xmlFieldElements = elementsUnder(xmlElement, field.getId());
         if (xmlFieldElements.size() != 1) {
-            if (LOG.isInfoEnabled()) {
-                LOG.info(
+            if (log.isInfoEnabled()) {
+                log.info(
                         "includeField(Pl, Vec, Str): could not locate {}",
                         log("field", field.getId()) +
                         andlog("xmlFieldElements.size", "" + xmlFieldElements.size()));
@@ -479,14 +477,14 @@ public class XmlSnapshot implements Snapshot {
         if (field instanceof OneToOneAssociation) {
             
             if (field.getSpecification().streamAssociations(Contributed.INCLUDED).limit(1).count() == 0L) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("includeField(Pl, Vec, Str): field is value; done");
+                if (log.isDebugEnabled()) {
+                    log.debug("includeField(Pl, Vec, Str): field is value; done");
                 }
                 return false;
             }
 
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("includeField(Pl, Vec, Str): field is 1->1");
+            if (log.isDebugEnabled()) {
+                log.debug("includeField(Pl, Vec, Str): field is 1->1");
             }
 
             final OneToOneAssociation oneToOneAssociation = ((OneToOneAssociation) field);
@@ -498,22 +496,22 @@ public class XmlSnapshot implements Snapshot {
             }
 
             final boolean appendedXml = appendXmlThenIncludeRemaining(fieldPlace, referencedObject, names, annotation);
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("includeField(Pl, Vec, Str): 1->1: invoked appendXmlThenIncludeRemaining for {}{}", log("referencedObj", referencedObject), andlog("returned", "" + appendedXml));
+            if (log.isDebugEnabled()) {
+                log.debug("includeField(Pl, Vec, Str): 1->1: invoked appendXmlThenIncludeRemaining for {}{}", log("referencedObj", referencedObject), andlog("returned", "" + appendedXml));
             }
 
             return appendedXml;
 
         } else if (field instanceof OneToManyAssociation) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("includeField(Pl, Vec, Str): field is 1->M");
+            if (log.isDebugEnabled()) {
+                log.debug("includeField(Pl, Vec, Str): field is 1->M");
             }
 
             final OneToManyAssociation oneToManyAssociation = (OneToManyAssociation) field;
             final ObjectAdapter collection = oneToManyAssociation.get(fieldPlace.getObject(), InteractionInitiatedBy.FRAMEWORK);
             
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("includeField(Pl, Vec, Str): 1->M: {}", log("collection.size", "" + CollectionFacet.Utils.size(collection)));
+            if (log.isDebugEnabled()) {
+                log.debug("includeField(Pl, Vec, Str): 1->M: {}", log("collection.size", "" + CollectionFacet.Utils.size(collection)));
             }
             
             final boolean[] allFieldsNavigated = {true}; // fast non-thread-safe value reference
@@ -522,13 +520,13 @@ public class XmlSnapshot implements Snapshot {
             .forEach(referencedObject->{
                 final boolean appendedXml = 
                         appendXmlThenIncludeRemaining(fieldPlace, referencedObject, names, annotation);
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("includeField(Pl, Vec, Str): 1->M: + invoked appendXmlThenIncludeRemaining for {}{}",log("referencedObj", referencedObject), andlog("returned", "" + appendedXml));
+                if (log.isDebugEnabled()) {
+                    log.debug("includeField(Pl, Vec, Str): 1->M: + invoked appendXmlThenIncludeRemaining for {}{}",log("referencedObj", referencedObject), andlog("returned", "" + appendedXml));
                 }
                 allFieldsNavigated[0] = allFieldsNavigated[0] && appendedXml;
             });
             
-            LOG.debug("includeField(Pl, Vec, Str): {}", log("returning", "" + allFieldsNavigated));
+            log.debug("includeField(Pl, Vec, Str): {}", log("returning", "" + allFieldsNavigated));
             return allFieldsNavigated[0];
         }
 
@@ -558,21 +556,21 @@ public class XmlSnapshot implements Snapshot {
      */
     private Element mergeTree(final Element parentElement, final Element childElement) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("mergeTree({}{})", log("parent", parentElement), andlog("child", childElement));
+        if (log.isDebugEnabled()) {
+            log.debug("mergeTree({}{})", log("parent", parentElement), andlog("child", childElement));
         }
 
         final String childElementOid = isisMetaModel.getAttribute(childElement, "oid");
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("mergeTree(El,El): {}", log("childOid", childElementOid));
+        if (log.isDebugEnabled()) {
+            log.debug("mergeTree(El,El): {}", log("childOid", childElementOid));
         }
         if (childElementOid != null) {
 
             // before we add the child element, check to see if it is already
             // there
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("mergeTree(El,El): check if child already there");
+            if (log.isDebugEnabled()) {
+                log.debug("mergeTree(El,El): check if child already there");
             }
             final Vector existingChildElements = elementsUnder(parentElement, childElement.getLocalName());
             for (final Enumeration childEnum = existingChildElements.elements(); childEnum.hasMoreElements();) {
@@ -583,8 +581,8 @@ public class XmlSnapshot implements Snapshot {
                     continue;
                 }
 
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("mergeTree(El,El): child already there; merging grandchildren");
+                if (log.isDebugEnabled()) {
+                    log.debug("mergeTree(El,El): child already there; merging grandchildren");
                 }
 
                 // match: transfer the children of the child (grandchildren) to
@@ -596,8 +594,8 @@ public class XmlSnapshot implements Snapshot {
                     final Element grandchildElement = (Element) grandchildEnum.nextElement();
                     childElement.removeChild(grandchildElement);
 
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("mergeTree(El,El): merging {}", log("grandchild", grandchildElement));
+                    if (log.isDebugEnabled()) {
+                        log.debug("mergeTree(El,El): merging {}", log("grandchild", grandchildElement));
                     }
 
                     mergeTree(existingChildElement, grandchildElement);
@@ -612,20 +610,20 @@ public class XmlSnapshot implements Snapshot {
 
     Place objectToElement(final ObjectAdapter adapter) {
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("objectToElement({})", log("object", adapter));
+        if (log.isDebugEnabled()) {
+            log.debug("objectToElement({})", log("object", adapter));
         }
 
         final ObjectSpecification nos = adapter.getSpecification();
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("objectToElement(NO): create element and isis:title");
+        if (log.isDebugEnabled()) {
+            log.debug("objectToElement(NO): create element and isis:title");
         }
         final Element element = schema.createElement(getXmlDocument(), nos.getShortIdentifier(), nos.getFullIdentifier(), nos.getSingularName(), nos.getPluralName());
         isisMetaModel.appendIsisTitle(element, adapter.titleString());
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("objectToElement(NO): create XS element for Isis class");
+        if (log.isDebugEnabled()) {
+            log.debug("objectToElement(NO): create XS element for Isis class");
         }
         final Element xsElement = schema.createXsElementForNofClass(getXsdDocument(), element, topLevelElementWritten, FacetUtil.getFacetsByType(nos));
 
@@ -639,15 +637,15 @@ public class XmlSnapshot implements Snapshot {
 
         final List<ObjectAssociation> fields = nos.streamAssociations(Contributed.INCLUDED)
                 .collect(Collectors.toList());
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("objectToElement(NO): processing fields");
+        if (log.isDebugEnabled()) {
+            log.debug("objectToElement(NO): processing fields");
         }
         eachField: for (int i = 0; i < fields.size(); i++) {
             final ObjectAssociation field = fields.get(i);
             final String fieldName = field.getId();
 
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("objectToElement(NO): {}", log("field", fieldName));
+            if (log.isDebugEnabled()) {
+                log.debug("objectToElement(NO): {}", log("field", fieldName));
             }
 
             // Skip field if we have seen the name already
@@ -664,7 +662,7 @@ public class XmlSnapshot implements Snapshot {
             // same name, ultimately breaking the XSD.
             for (int j = 0; j < i; j++) {
                 if (fieldName.equals(fields.get(i).getName())) {
-                    LOG.debug("objectToElement(NO): {} SKIPPED", log("field", fieldName));
+                    log.debug("objectToElement(NO): {} SKIPPED", log("field", fieldName));
                     continue eachField;
                 }
             }
@@ -679,8 +677,8 @@ public class XmlSnapshot implements Snapshot {
             Element xsdFieldElement = null;
 
             if (field.getSpecification().containsFacet(ValueFacet.class)) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("objectToElement(NO): {} is value", log("field", fieldName));
+                if (log.isDebugEnabled()) {
+                    log.debug("objectToElement(NO): {} is value", log("field", fieldName));
                 }
 
                 final ObjectSpecification fieldNos = field.getSpecification();
@@ -727,7 +725,7 @@ public class XmlSnapshot implements Snapshot {
                     }
 
                 } catch (final Exception ex) {
-                    LOG.warn("objectToElement(NO): {}: getField() threw exception - skipping XML generation", log("field", fieldName));
+                    log.warn("objectToElement(NO): {}: getField() threw exception - skipping XML generation", log("field", fieldName));
                 }
 
                 // XSD
@@ -735,8 +733,8 @@ public class XmlSnapshot implements Snapshot {
 
             } else if (field instanceof OneToOneAssociation) {
 
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("objectToElement(NO): {} is OneToOneAssociation", log("field", fieldName));
+                if (log.isDebugEnabled()) {
+                    log.debug("objectToElement(NO): {} is OneToOneAssociation", log("field", fieldName));
                 }
 
                 final OneToOneAssociation oneToOneAssociation = ((OneToOneAssociation) field);
@@ -762,7 +760,7 @@ public class XmlSnapshot implements Snapshot {
                     }
 
                 } catch (final Exception ex) {
-                    LOG.warn("objectToElement(NO): {}: getAssociation() threw exception - skipping XML generation", log("field", fieldName));
+                    log.warn("objectToElement(NO): {}: getAssociation() threw exception - skipping XML generation", log("field", fieldName));
                 }
 
                 // XSD
@@ -770,8 +768,8 @@ public class XmlSnapshot implements Snapshot {
 
             } else if (field instanceof OneToManyAssociation) {
 
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("objectToElement(NO): {} is OneToManyAssociation", log("field", fieldName));
+                if (log.isDebugEnabled()) {
+                    log.debug("objectToElement(NO): {} is OneToManyAssociation", log("field", fieldName));
                 }
 
                 final OneToManyAssociation oneToManyAssociation = (OneToManyAssociation) field;
@@ -790,15 +788,15 @@ public class XmlSnapshot implements Snapshot {
                     // XML
                     isisMetaModel.setIsisCollection(xmlCollectionElement, schema.getPrefix(), fullyQualifiedClassName, collection);
                 } catch (final Exception ex) {
-                    LOG.warn("objectToElement(NO): {}: get(obj) threw exception - skipping XML generation", log("field", fieldName));
+                    log.warn("objectToElement(NO): {}: get(obj) threw exception - skipping XML generation", log("field", fieldName));
                 }
 
                 // XSD
                 xsdFieldElement = schema.createXsElementForNofCollection(xsElement, xmlCollectionElement, oneToManyAssociation.getSpecification().getFullIdentifier(), FacetUtil.getFacetsByType(oneToManyAssociation));
 
             } else {
-                if (LOG.isInfoEnabled()) {
-                    LOG.info("objectToElement(NO): {} is unknown type; ignored", log("field", fieldName));
+                if (log.isInfoEnabled()) {
+                    log.info("objectToElement(NO): {} is unknown type; ignored", log("field", fieldName));
                 }
                 continue;
             }
@@ -808,15 +806,15 @@ public class XmlSnapshot implements Snapshot {
             }
 
             // XML
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("objectToElement(NO): invoking mergeTree for field");
+            if (log.isDebugEnabled()) {
+                log.debug("objectToElement(NO): invoking mergeTree for field");
             }
             xmlFieldElement = mergeTree(element, xmlFieldElement);
 
             // XSD
             if (xsdFieldElement != null) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("objectToElement(NO): adding XS element for field to schema");
+                if (log.isDebugEnabled()) {
+                    log.debug("objectToElement(NO): adding XS element for field to schema");
                 }
                 schema.addFieldXsElement(xsElement, xsdFieldElement);
             }
diff --git a/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java b/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
index 0d8ac52..cd1f967 100644
--- a/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
+++ b/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusCreateObjectCommand.java
@@ -20,17 +20,14 @@ package org.apache.isis.objectstore.jdo.datanucleus.persistence.commands;
 
 import javax.jdo.PersistenceManager;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 
-public class DataNucleusCreateObjectCommand extends AbstractDataNucleusObjectCommand implements CreateObjectCommand {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory
-            .getLogger(DataNucleusCreateObjectCommand.class);
+@Log4j2
+public class DataNucleusCreateObjectCommand extends AbstractDataNucleusObjectCommand implements CreateObjectCommand {
 
     public DataNucleusCreateObjectCommand(ObjectAdapter adapter, PersistenceManager persistenceManager) {
         super(adapter, persistenceManager);
@@ -39,8 +36,8 @@ public class DataNucleusCreateObjectCommand extends AbstractDataNucleusObjectCom
 
     @Override
     public void execute(final PersistenceCommandContext context) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("create object - executing command for: {}", onAdapter());
+        if (log.isDebugEnabled()) {
+            log.debug("create object - executing command for: {}", onAdapter());
         }
         final ObjectAdapter adapter = onAdapter();
         if(!adapter.isTransient()) {
diff --git a/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java b/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
index 34bda37..af83a05 100644
--- a/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
+++ b/core/plugins/jdo-common/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/commands/DataNucleusDeleteObjectCommand.java
@@ -20,16 +20,14 @@ package org.apache.isis.objectstore.jdo.datanucleus.persistence.commands;
 
 import javax.jdo.PersistenceManager;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 
-public class DataNucleusDeleteObjectCommand extends AbstractDataNucleusObjectCommand implements DestroyObjectCommand {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(DataNucleusDeleteObjectCommand.class);
+@Log4j2
+public class DataNucleusDeleteObjectCommand extends AbstractDataNucleusObjectCommand implements DestroyObjectCommand {
 
     public DataNucleusDeleteObjectCommand(ObjectAdapter adapter, PersistenceManager persistenceManager) {
         super(adapter, persistenceManager);
@@ -37,8 +35,8 @@ public class DataNucleusDeleteObjectCommand extends AbstractDataNucleusObjectCom
 
     @Override
     public void execute(final PersistenceCommandContext context) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("destroy object - executing command for {}", onAdapter());
+        if (log.isDebugEnabled()) {
+            log.debug("destroy object - executing command for {}", onAdapter());
         }
         getPersistenceManager().deletePersistent(onAdapter().getPojo());
     }
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
index e8517fe..d97628e 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
@@ -26,23 +26,20 @@ import java.sql.Statement;
 import java.util.Map;
 
 import org.apache.isis.commons.internal.base._Strings;
-
-import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.datanucleus.ClassLoaderResolver;
 import org.datanucleus.enhancer.EnhancementNucleusContextImpl;
 import org.datanucleus.metadata.AbstractClassMetaData;
 import org.datanucleus.metadata.MetaDataListener;
 import org.datanucleus.store.ConnectionEncryptionProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Implementation note: the methods in this class are <tt>protected</tt> to allow for easy subclassing.
  */
+@Log4j2
 public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, DataNucleusPropertiesAware {
 
-    private static final Logger LOG = LoggerFactory.getLogger(CreateSchemaObjectFromClassMetadata.class);
-
     // -- persistenceManagerFactory, properties
 
     private Map<String, String> properties;
@@ -70,7 +67,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
         final String password = getConnectionPassword();
 
         if(_Strings.isNullOrEmpty(driverName) || _Strings.isNullOrEmpty(url)) {
-            LOG.warn("Unable to create schema due to missing configuration javax.jdo.option.Connection*");
+            log.warn("Unable to create schema due to missing configuration javax.jdo.option.Connection*");
             return;
         }
 
@@ -85,7 +82,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
             exec(cmd, statement);
 
         } catch (SQLException e) {
-            LOG.warn("Unable to create schema", e);
+            log.warn("Unable to create schema", e);
 
         } finally {
             closeSafely(statement);
@@ -202,7 +199,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
                 }
                 catch (Exception e)
                 {
-                    LOG.warn("Error invoking decrypter class {}", decrypterName, e);
+                    log.warn("Error invoking decrypter class {}", decrypterName, e);
                 }
             }
         }
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
index dbf6bfe..82a386a 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java
@@ -34,8 +34,6 @@ import org.datanucleus.enhancer.EnhancementHelper;
  */
 public class DataNucleusLifeCycleHelper {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(DataNucleusLifeCycleHelper.class);
-
     public static void cleanUp(PersistenceManagerFactory persistenceManagerFactory) {
 
         try {
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index e84d71c..ebd9ed0 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -22,18 +22,16 @@ import java.util.List;
 
 import javax.jdo.JDOQLTypedQuery;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.jdosupport.IsisJdoSupport_v3_2;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 
-public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindAllInstancesProcessor.class);
+@Log4j2
+public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindAllInstances> {
 
     public PersistenceQueryFindAllInstancesProcessor(final PersistenceSession5 persistenceSession) {
         super(persistenceSession);
@@ -50,8 +48,8 @@ public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryP
         JDOQLTypedQuery<?> typesafeQuery = isisJdoSupport.newTypesafeQuery(cls);
         isisJdoSupport.disableMultivaluedFetch(typesafeQuery); // fetch optimization
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("allInstances(): class={}", specification.getFullIdentifier());
+        if (log.isDebugEnabled()) {
+            log.debug("allInstances(): class={}", specification.getFullIdentifier());
         }
         
         final List<?> pojos = isisJdoSupport.executeQuery(cls);
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index 3ac3d97..cf564ed 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -24,9 +24,6 @@ import java.util.Map;
 
 import javax.jdo.Query;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.jdosupport.IsisJdoSupport_v3_2;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -38,9 +35,10 @@ import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingA
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
 import org.apache.isis.objectstore.jdo.datanucleus.metamodel.JdoPropertyUtils;
 
-public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFindUsingApplibQueryProcessor.class);
+@Log4j2
+public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQueryProcessorAbstract<PersistenceQueryFindUsingApplibQueryDefault> {
 
     public PersistenceQueryFindUsingApplibQueryProcessor(final PersistenceSession5 persistenceSession) {
         super(persistenceSession);
@@ -86,8 +84,8 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
         final Query<?> jdoQuery = persistenceSession.newJdoQuery(cls, filter);
         isisJdoSupport.disableMultivaluedFetch(jdoQuery); // fetch optimization
         
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("{} # {} ( {} )", cls.getName(), queryName, filter);
+        if (log.isDebugEnabled()) {
+            log.debug("{} # {} ( {} )", cls.getName(), queryName, filter);
         }
 
         try {
@@ -120,8 +118,8 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
             jdoQuery.setRange(persistenceQuery.getStart(), persistenceQuery.getEnd());
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("{} # {} ( {} )", cls.getName(), queryName, argumentsByParameterName);
+        if (log.isDebugEnabled()) {
+            log.debug("{} # {} ( {} )", cls.getName(), queryName, argumentsByParameterName);
         }
 
         try {
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
index 0264ea5..f7871bc 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/QueryUtil.java
@@ -21,14 +21,12 @@ package org.apache.isis.objectstore.jdo.datanucleus.persistence.queries;
 import javax.jdo.PersistenceManager;
 import javax.jdo.Query;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
-public final class QueryUtil {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(QueryUtil.class);
+@Log4j2
+public final class QueryUtil {
 
     private QueryUtil() {}
 
@@ -45,7 +43,7 @@ public final class QueryUtil {
         appendWhere(buf, whereClause);
 
         final String queryString = buf.toString();
-        LOG.debug("creating query: {}", queryString);
+        log.debug("creating query: {}", queryString);
 
         final Query<?> jdoQuery = persistenceManager.newQuery(queryString);
 
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
index 3cd2f4e..4ed24ae 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/IsisWebAppContextListener.java
@@ -18,6 +18,9 @@
  */
 package org.apache.isis.core.webapp;
 
+import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
+import static org.apache.isis.commons.internal.resources._Resources.putContextPathIfPresent;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -27,16 +30,12 @@ import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.webapp.modules.WebModule;
 import org.apache.isis.core.webapp.modules.WebModuleContext;
 
-import static org.apache.isis.commons.internal.base._With.acceptIfPresent;
-import static org.apache.isis.commons.internal.resources._Resources.putContextPathIfPresent;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * 
@@ -53,10 +52,9 @@ import static org.apache.isis.commons.internal.resources._Resources.putContextPa
  */
 //@WebListener //[ahuber] to support Servlet 3.0 annotations @WebFilter, @WebListener or others 
 //with skinny war deployment requires additional configuration, so for now we disable this annotation
+@Log4j2
 public class IsisWebAppContextListener implements ServletContextListener {
     
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWebAppContextListener.class);
-    
     private final List<ServletContextListener> activeListeners = new ArrayList<>();
 
     // -- INTERFACE IMPLEMENTATION
@@ -66,7 +64,7 @@ public class IsisWebAppContextListener implements ServletContextListener {
 
         final ServletContext servletContext = event.getServletContext();
         
-        LOG.info("=== PHASE 1 === Setting up ServletContext parameters");
+        log.info("=== PHASE 1 === Setting up ServletContext parameters");
   
         //[ahuber] set the ServletContext initializing thread as preliminary default until overridden by
         // IsisWicketApplication#init() or others that better know what ClassLoader to use as application default.
@@ -86,7 +84,7 @@ public class IsisWebAppContextListener implements ServletContextListener {
                  .peek(module->module.prepare(webModuleContext)) // prepare context
                  .collect(Collectors.toList());
 
-        LOG.info("=== PHASE 2 === Initializing the ServletContext");
+        log.info("=== PHASE 2 === Initializing the ServletContext");
         
         webModules.stream()
         .filter(module->module.isApplicable(webModuleContext)) // filter those WebModules that are applicable
@@ -94,7 +92,7 @@ public class IsisWebAppContextListener implements ServletContextListener {
         
         activeListeners.forEach(listener->listener.contextInitialized(event));
         
-        LOG.info("=== DONE === ServletContext initialized.");
+        log.info("=== DONE === ServletContext initialized.");
     }
 //
 //    void addConfigurationResourcesForDeploymentType(
@@ -113,11 +111,11 @@ public class IsisWebAppContextListener implements ServletContextListener {
     // -- HELPER
     
     private void addListener(ServletContext context, WebModule module) {
-        LOG.info(String.format("Setup ServletContext, adding WebModule '%s'", module.getName()));
+        log.info(String.format("Setup ServletContext, adding WebModule '%s'", module.getName()));
         try {
             acceptIfPresent(module.init(context), activeListeners::add);
         } catch (ServletException e) {
-            LOG.error(String.format("Failed to add WebModule '%s' to the ServletContext.", module.getName()), e);
+            log.error(String.format("Failed to add WebModule '%s' to the ServletContext.", module.getName()), e);
         }  
     }
     
@@ -125,7 +123,7 @@ public class IsisWebAppContextListener implements ServletContextListener {
         try {
             listener.contextDestroyed(event);
         } catch (Exception e) {
-            LOG.error(String.format("Failed to shutdown WebListener '%s'.", listener.getClass().getName()), e);
+            log.error(String.format("Failed to shutdown WebListener '%s'.", listener.getClass().getName()), e);
         }
     }
 
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/content/ResourceServlet.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/content/ResourceServlet.java
index 939633d..c7986c1 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/content/ResourceServlet.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/content/ResourceServlet.java
@@ -34,9 +34,6 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.resources._Resources;
@@ -44,6 +41,8 @@ import org.apache.isis.core.commons.lang.InputStreamExtensions;
 import org.apache.isis.core.commons.lang.ResourceUtil;
 import org.apache.isis.core.commons.lang.StringExtensions;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Serves static web-resources by class-path or file-system lookup.
  * Also handles HTML-templates, where template's placeholders get replaced by their values.
@@ -54,9 +53,9 @@ import org.apache.isis.core.commons.lang.StringExtensions;
 //        )
 //[ahuber] to support Servlet 3.0 annotations @WebFilter, @WebListener or others 
 //with skinny war deployment requires additional configuration, so for now we disable this annotation
+@Log4j2
 public class ResourceServlet extends HttpServlet {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ResourceServlet.class);
     private static final long serialVersionUID = 1L;
     private ResourceServlet_HtmlTemplateVariables templateVariables;
 
@@ -85,14 +84,14 @@ public class ResourceServlet extends HttpServlet {
 
     private void processRequest(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
         final String servletPath = StringExtensions.stripLeadingSlash(request.getServletPath());
-        LOG.debug("request: {}", servletPath);
+        log.debug("request: {}", servletPath);
 
         final InputStream is = ifPresentElseGet(
                 ResourceUtil.getResourceAsStream(request), // try to load from file-system first 
                 ()->ResourceUtil.getResourceAsStream(servletPath)); // otherwise, try to load from class-path  
 
         if (is != null) {
-            LOG.debug("request: {} loaded from classpath", servletPath );
+            log.debug("request: {} loaded from classpath", servletPath );
 
             try {
                 writeContentType(request, response);
@@ -103,7 +102,7 @@ public class ResourceServlet extends HttpServlet {
             }
         }
 
-        LOG.warn("failed to load resource from classpath or file system: {}", servletPath);
+        log.warn("failed to load resource from classpath or file system: {}", servletPath);
     }
 
     private void processContent(
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/diagnostics/IsisLogOnExceptionFilter.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/diagnostics/IsisLogOnExceptionFilter.java
index e5e72eb..8e4b4a2 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/diagnostics/IsisLogOnExceptionFilter.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/diagnostics/IsisLogOnExceptionFilter.java
@@ -28,16 +28,14 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Simply logs the URL of any request that causes an exception to be thrown.
  */
+@Log4j2
 public class IsisLogOnExceptionFilter implements Filter {
 
-    private static final Logger LOG = LoggerFactory.getLogger(IsisLogOnExceptionFilter.class);
-
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
     }
@@ -73,6 +71,6 @@ public class IsisLogOnExceptionFilter implements Filter {
             buf.append('?').append(queryString);
         }
 
-        LOG.error("Request caused {}: {}", e.getClass().getName(), buf.toString(), e);
+        log.error("Request caused {}: {}", e.getClass().getName(), buf.toString(), e);
     }
 }
diff --git a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/routing/RedirectToDocsFilter.java b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/routing/RedirectToDocsFilter.java
index b9fb5ee..1ebd81a 100644
--- a/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/routing/RedirectToDocsFilter.java
+++ b/core/runtime-extensions/src/main/java/org/apache/isis/core/webapp/routing/RedirectToDocsFilter.java
@@ -29,8 +29,7 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * This filter attempts to ensure that would-be users of the framework are
@@ -47,10 +46,9 @@ import org.slf4j.LoggerFactory;
  * Only if the Accept header is set to application/json is the request allowed
  * to continue through.
  */
+@Log4j2
 public class RedirectToDocsFilter implements Filter {
 
-    private static final Logger LOG = LoggerFactory.getLogger(RedirectToDocsFilter.class);
-
     private static final String REDIRECT_TO_KEY = "redirectTo";
     private static final String REDIRECT_TO_DEFAULT = "/index.html";
 
@@ -65,7 +63,7 @@ public class RedirectToDocsFilter implements Filter {
         if (redirectTo == null) {
             redirectTo = REDIRECT_TO_DEFAULT;
         }
-        LOG.info("redirectToDocsFilter: redirectTo={}", redirectTo);
+        log.info("redirectToDocsFilter: redirectTo={}", redirectTo);
     }
 
     @Override
@@ -79,7 +77,7 @@ public class RedirectToDocsFilter implements Filter {
 
         // do nothing if not requesting "/"
         final String servletPath = httpServletRequest.getServletPath();
-        LOG.info("redirectToDocsFilter: servletPath: {}", servletPath);
+        log.info("redirectToDocsFilter: servletPath: {}", servletPath);
 
         if (!"/".equals(servletPath)) {
             chain.doFilter(request, response);
@@ -95,7 +93,7 @@ public class RedirectToDocsFilter implements Filter {
 
         // otherwise redirect
         final String redirect = combine(httpServletRequest.getContextPath(), redirectTo);
-        LOG.info("redirectToDocsFilter: redirecting to: {}", redirect);
+        log.info("redirectToDocsFilter: redirecting to: {}", redirect);
 
         httpServletResponse.sendRedirect(redirect);
     }
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
index d907099..7f9845d 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
@@ -28,9 +28,6 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.enterprise.context.RequestScoped;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -42,6 +39,8 @@ import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ProxyEnhanced;
 import org.apache.isis.core.plugins.codegen.ProxyFactory;
 
+import lombok.extern.log4j.Log4j2;
+
 //import javassist.util.proxy.MethodFilter;
 //import javassist.util.proxy.MethodHandler;
 //import javassist.util.proxy.ProxyFactory;
@@ -69,10 +68,9 @@ import org.apache.isis.core.plugins.codegen.ProxyFactory;
  * <b>Note</b>: there is one limitation to using proxies, namely that field-level injection into
  * request-scoped services is not (yet) supported.
  */
+@Log4j2
 public final class ServiceInstantiator {
 
-    private final static Logger LOG = LoggerFactory.getLogger(ServiceInstantiator.class);
-
     public ServiceInstantiator() {
     }
 
@@ -90,7 +88,7 @@ public final class ServiceInstantiator {
 
     private Class<?> loadClass(final String className) {
         try {
-            LOG.debug("loading class for service: {}", className);
+            log.debug("loading class for service: {}", className);
             return _Context.loadClassAndInitialize(className);
         } catch (final ClassNotFoundException ex) {
             throw new InitialisationException(String.format("Cannot find class '%s' for service", className));
@@ -214,8 +212,8 @@ public final class ServiceInstantiator {
         }
         final int numParams = postConstructMethod.getParameterTypes().length;
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("... calling @PostConstruct method: {}: {}", serviceClass.getName(), postConstructMethod.getName());
+        if(log.isDebugEnabled()) {
+            log.debug("... calling @PostConstruct method: {}: {}", serviceClass.getName(), postConstructMethod.getName());
         }
         // unlike shutdown, we don't swallow exceptions; would rather fail early
         if(numParams == 0) {
@@ -234,14 +232,14 @@ public final class ServiceInstantiator {
             return;
         }
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("... calling @PreDestroy method: {}: {}", serviceClass.getName(), preDestroyMethod.getName());
+        if(log.isDebugEnabled()) {
+            log.debug("... calling @PreDestroy method: {}: {}", serviceClass.getName(), preDestroyMethod.getName());
         }
         try {
             MethodExtensions.invoke(preDestroyMethod, service);
         } catch(Exception ex) {
             // do nothing
-            LOG.warn("... @PreDestroy method threw exception - continuing anyway", ex);
+            log.warn("... @PreDestroy method threw exception - continuing anyway", ex);
         }
     }
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
index 4d017c8..72151ac 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
@@ -18,9 +18,6 @@ package org.apache.isis.core.runtime.services.background;
 
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandExecutorService;
 import org.apache.isis.applib.services.command.CommandWithDto;
@@ -28,6 +25,8 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Intended to be used as a base class for executing queued up {@link Command background action}s.
  *
@@ -35,10 +34,9 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
  * This implementation uses the {@link #findBackgroundCommandsToExecute() hook method} so that it is
  * independent of the location where the actions have actually been persisted to.
  */
+@Log4j2
 public abstract class BackgroundCommandExecution extends CommandExecutionAbstract {
 
-    private final static Logger LOG = LoggerFactory.getLogger(BackgroundCommandExecution.class);
-
     /**
      * Defaults to the historical defaults * for running background commands.
      */
@@ -62,7 +60,7 @@ public abstract class BackgroundCommandExecution extends CommandExecutionAbstrac
             commands.addAll(findBackgroundCommandsToExecute());
         });
 
-        LOG.debug("Found {} to execute", commands.size());
+        log.debug("Found {} to execute", commands.size());
 
         for (final Command command : commands) {
             execute(transactionManager, (CommandWithDto) command);
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
index 2ac25e6..f82f327 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutionAbstract.java
@@ -25,8 +25,6 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
  */
 public abstract class CommandExecutionAbstract extends AbstractIsisSessionTemplate {
 
-    //private final static Logger LOG = LoggerFactory.getLogger(CommandExecutionAbstract.class);
-
     private final CommandExecutorService.SudoPolicy sudoPolicy;
 
     protected CommandExecutionAbstract(final CommandExecutorService.SudoPolicy sudoPolicy) {
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
index 895fb3a..140fc11 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/background/CommandExecutorServiceDefault.java
@@ -22,9 +22,6 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -71,10 +68,10 @@ import org.apache.isis.schema.common.v1.ValueWithTypeDto;
 import org.apache.isis.schema.utils.CommandDtoUtils;
 import org.apache.isis.schema.utils.CommonDtoUtils;
 
-@DomainService(nature = NatureOfService.DOMAIN)
-public class CommandExecutorServiceDefault implements CommandExecutorService {
+import lombok.extern.log4j.Log4j2;
 
-    private final static Logger LOG = LoggerFactory.getLogger(CommandExecutorServiceDefault.class);
+@DomainService(nature = NatureOfService.DOMAIN) @Log4j2
+public class CommandExecutorServiceDefault implements CommandExecutorService {
 
     @Override
     @Programmatic
@@ -134,7 +131,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
         org.apache.isis.applib.annotation.CommandExecuteIn executeIn = commandWithDto.getExecuteIn();
 
-        LOG.info("Executing: {} {} {} {}", executeIn, commandWithDto.getMemberIdentifier(), commandWithDto.getTimestamp(), commandWithDto.getUniqueId());
+        log.info("Executing: {} {} {} {}", executeIn, commandWithDto.getMemberIdentifier(), commandWithDto.getTimestamp(), commandWithDto.getUniqueId());
 
         RuntimeException exceptionIfAny = null;
 
@@ -219,7 +216,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
         } catch (RuntimeException ex) {
 
-            LOG.warn("Exception when executing : {} {}", executeIn, commandWithDto.getMemberIdentifier(), ex);
+            log.warn("Exception when executing : {} {}", executeIn, commandWithDto.getMemberIdentifier(), ex);
 
             exceptionIfAny = ex;
         }
@@ -229,7 +226,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             transactionService.nextTransaction(TransactionService.Policy.ALWAYS);
         } catch(RuntimeException ex) {
 
-            LOG.warn("Exception when committing : {} {}", executeIn, commandWithDto.getMemberIdentifier(), ex);
+            log.warn("Exception when committing : {} {}", executeIn, commandWithDto.getMemberIdentifier(), ex);
 
             if(exceptionIfAny == null) {
                 exceptionIfAny = ex;
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
index 852cdf8..2e5f69b 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/email/EmailServiceDefault.java
@@ -29,9 +29,6 @@ import org.apache.commons.mail.DefaultAuthenticator;
 import org.apache.commons.mail.EmailException;
 import org.apache.commons.mail.ImageHtmlEmail;
 import org.apache.commons.mail.resolver.DataSourceClassPathResolver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -39,6 +36,8 @@ import org.apache.isis.applib.services.email.EmailService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.config.IsisConfiguration;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * A service that sends email notifications when specific events occur
  */
@@ -46,11 +45,10 @@ import org.apache.isis.config.IsisConfiguration;
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
         )
+@Log4j2
 public class EmailServiceDefault implements EmailService {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOG = LoggerFactory.getLogger(EmailServiceDefault.class);
-
     public static class EmailServiceException extends RuntimeException {
         static final long serialVersionUID = 1L;
         public EmailServiceException(final EmailException cause) {
@@ -105,9 +103,9 @@ public class EmailServiceDefault implements EmailService {
         initialized = true;
 
         if (!isConfigured()) {
-            LOG.warn("NOT configured");
+            log.warn("NOT configured");
         } else {
-            LOG.debug("configured");
+            log.debug("configured");
         }
     }
 
@@ -244,7 +242,7 @@ public class EmailServiceDefault implements EmailService {
             email.send();
 
         } catch (EmailException ex) {
-            LOG.error("An error occurred while trying to send an email", ex);
+            log.error("An error occurred while trying to send an email", ex);
             final Boolean throwExceptionOnFail = isThrowExceptionOnFail();
             if (throwExceptionOnFail) {
                 throw new EmailServiceException(ex);
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoWriter.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoWriter.java
index 7fe89e1..f06cb9c 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoWriter.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/i18n/po/PoWriter.java
@@ -21,18 +21,16 @@ package org.apache.isis.core.runtime.services.i18n.po;
 import java.util.SortedMap;
 import java.util.SortedSet;
 
-import org.joda.time.LocalDateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.joda.time.LocalDateTime;
 
-class PoWriter extends PoAbstract {
+import lombok.extern.log4j.Log4j2;
 
-    public static Logger LOG = LoggerFactory.getLogger(PoWriter.class);
+@Log4j2
+class PoWriter extends PoAbstract {
 
     private static class Block {
         private final SortedSet<String> contexts = _Sets.newTreeSet();
@@ -89,7 +87,7 @@ class PoWriter extends PoAbstract {
         buf.append("\n# end of .pot file");
         buf.append("\n##############################################################################");
         buf.append("\n");
-        LOG.info(buf.toString());
+        log.info(buf.toString());
     }
 
     /**
diff --git a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
index 7d9437f..17439ba 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/core/runtime/services/userreg/EmailNotificationServiceDefault.java
@@ -50,7 +50,6 @@ import org.apache.isis.commons.internal.resources._Resources;
 public class EmailNotificationServiceDefault implements EmailNotificationService {
     
     private static final long serialVersionUID = 1L;
-    //private static final Logger LOG = LoggerFactory.getLogger(EmailNotificationServiceDefault.class);
 
     // -- constants
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisLocaleInitializer.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisLocaleInitializer.java
index 1c4eac4..222960f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisLocaleInitializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisLocaleInitializer.java
@@ -21,15 +21,13 @@ package org.apache.isis.core.runtime.system.internal;
 
 import java.util.Locale;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.runtime.system.SystemConstants;
 
-public class IsisLocaleInitializer {
+import lombok.extern.log4j.Log4j2;
 
-    public static final Logger LOG = LoggerFactory.getLogger(IsisLocaleInitializer.class);
+@Log4j2
+public class IsisLocaleInitializer {
 
     public void initLocale(final IsisConfiguration configuration) {
         final String localeSpec = configuration.getString(SystemConstants.LOCALE_KEY);
@@ -44,9 +42,9 @@ public class IsisLocaleInitializer {
                 locale = new Locale(language, country);
             }
             Locale.setDefault(locale);
-            LOG.info("locale set to {}", locale);
+            log.info("locale set to {}", locale);
         }
-        LOG.debug("locale is {}", Locale.getDefault());
+        log.debug("locale is {}", Locale.getDefault());
     }
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisTimeZoneInitializer.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisTimeZoneInitializer.java
index eeea489..edfd865 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisTimeZoneInitializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/internal/IsisTimeZoneInitializer.java
@@ -21,15 +21,13 @@ package org.apache.isis.core.runtime.system.internal;
 
 import java.util.TimeZone;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.config.ConfigurationConstants;
 import org.apache.isis.config.IsisConfiguration;
 
-public class IsisTimeZoneInitializer {
+import lombok.extern.log4j.Log4j2;
 
-    public static final Logger LOG = LoggerFactory.getLogger(IsisTimeZoneInitializer.class);
+@Log4j2
+public class IsisTimeZoneInitializer {
 
     public void initTimeZone(final IsisConfiguration configuration) {
         final String timeZoneSpec = configuration.getString(ConfigurationConstants.ROOT + "timezone");
@@ -37,9 +35,9 @@ public class IsisTimeZoneInitializer {
             TimeZone timeZone;
             timeZone = TimeZone.getTimeZone(timeZoneSpec);
             TimeZone.setDefault(timeZone);
-            LOG.info("time zone set to {}", timeZone);
+            log.info("time zone set to {}", timeZone);
         }
-        LOG.debug("time zone is {}", TimeZone.getDefault());
+        log.debug("time zone is {}", TimeZone.getDefault());
     }
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
index 8effca3..b43c150 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
@@ -21,9 +21,6 @@ package org.apache.isis.core.runtime.system.persistence;
 import java.util.Map;
 import java.util.function.Function;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.query.QueryFindAllInstances;
@@ -35,9 +32,10 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 
-public class PersistenceQueryFactory {
+import lombok.extern.log4j.Log4j2;
 
-    private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFactory.class);
+@Log4j2
+public class PersistenceQueryFactory {
 
     private final SpecificationLoader specificationLoader;
     private final Function<Object, ObjectAdapter> adapterProvider;
@@ -54,8 +52,8 @@ public class PersistenceQueryFactory {
      * {@link PersistenceQuery NOF-internal representation}.
      */
     final PersistenceQuery createPersistenceQueryFor(final Query<?> query, final QueryCardinality cardinality) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("createPersistenceQueryFor: {}", query.getDescription());
+        if (log.isDebugEnabled()) {
+            log.debug("createPersistenceQueryFor: {}", query.getDescription());
         }
         final ObjectSpecification noSpec = specFor(query);
         if (query instanceof QueryFindAllInstances) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
index cf0a360..ee7ffd1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectCreation.java
@@ -22,9 +22,6 @@ import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -39,6 +36,8 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.session.RuntimeContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * package private mixin for ObjectAdapterContext
  * <p>
@@ -46,14 +45,14 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
  * </p> 
  * @since 2.0.0-M2
  */
-@SuppressWarnings("unused")
+@Log4j2
 class ObjectAdapterContext_ObjectCreation {
     
-    
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectCreation.class);
     private final ObjectAdapterContext objectAdapterContext;
-    private final PersistenceSession persistenceSession;
-    private final SpecificationLoader specificationLoader;
+    @SuppressWarnings("unused")
+	private final PersistenceSession persistenceSession;
+    @SuppressWarnings("unused")
+	private final SpecificationLoader specificationLoader;
     private ServiceInjector serviceInjector;
     
     ObjectAdapterContext_ObjectCreation(
@@ -83,8 +82,8 @@ class ObjectAdapterContext_ObjectCreation {
     }
     
     private ObjectAdapter newInstance(ObjectSpecification spec, Variant variant, String memento) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("creating {} instance of {}", variant, spec);
+        if (log.isDebugEnabled()) {
+            log.debug("creating {} instance of {}", variant, spec);
         }
         final Object pojo;
 
@@ -144,8 +143,8 @@ class ObjectAdapterContext_ObjectCreation {
 
             // so, doing it this way is this simplest, least obscure.
 
-            if(LOG.isDebugEnabled()) {
-                LOG.debug("Skipping postEvent for creation of Command pojo");
+            if(log.isDebugEnabled()) {
+                log.debug("Skipping postEvent for creation of Command pojo");
             }
 
         } else {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index a1efe01..f87feee 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -25,9 +25,6 @@ import java.util.concurrent.CountDownLatch;
 
 import javax.enterprise.inject.Vetoed;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.WithTransactionScope;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -44,6 +41,8 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyO
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
+import lombok.extern.log4j.Log4j2;
+
 /**
  * Used by the {@link IsisTransactionManager} to captures a set of changes to be
  * applied.
@@ -56,7 +55,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
  * the {@link IsisTransactionManager} to ensure that the underlying persistence
  * mechanism (for example, the <tt>ObjectStore</tt>) is also committed.
  */
-@Vetoed
+@Vetoed @Log4j2
 public class IsisTransaction implements TransactionScopedComponent, Transaction {
 
     public static class Placeholder {
@@ -156,8 +155,6 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         }
     }
 
-    private static final Logger LOG = LoggerFactory.getLogger(IsisTransaction.class);
-
     // -- constructor, fields
 
     private final UUID interactionId;
@@ -195,7 +192,7 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
 
         this.state = State.IN_PROGRESS;
 
-        LOG.debug("new transaction {}", this);
+        log.debug("new transaction {}", this);
     }
 
     // -- transactionId
@@ -261,19 +258,19 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         if (command instanceof DestroyObjectCommand) {
             if (alreadyHasCreate(onObject)) {
                 removeCreate(onObject);
-                LOG.debug("ignored both create and destroy command {}", command);
+                log.debug("ignored both create and destroy command {}", command);
                 return;
             }
 
             if (alreadyHasDestroy(onObject)) {
-                if (LOG.isDebugEnabled()) {
-                    LOG.debug("ignored command {} as command already recorded", command );
+                if (log.isDebugEnabled()) {
+                    log.debug("ignored command {} as command already recorded", command );
                 }
                 return;
             }
         }
 
-        LOG.debug("add command {}", command);
+        log.debug("add command {}", command);
         persistenceCommands.add(command);
     }
 
@@ -321,7 +318,7 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         //
         // ensureThatState(getState().canFlush(), is(true), "state is: " + getState());
         //
-        LOG.debug("flush transaction {}", this);
+        log.debug("flush transaction {}", this);
 
         try {
             doFlush();
@@ -396,10 +393,10 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         assert getState().canCommit();
         assert abortCause == null;
 
-        LOG.debug("preCommit transaction {}", this);
+        log.debug("preCommit transaction {}", this);
 
         if (getState() == State.COMMITTED) {
-            LOG.info("already committed; ignoring");
+            log.info("already committed; ignoring");
             return;
         }
 
@@ -424,10 +421,10 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
         assert getState().canCommit();
         assert abortCause == null;
 
-        LOG.debug("postCommit transaction {}", this);
+        log.debug("postCommit transaction {}", this);
 
         if (getState() == State.COMMITTED) {
-            LOG.info("already committed; ignoring");
+            log.info("already committed; ignoring");
             return;
         }
 
@@ -442,7 +439,7 @@ public class IsisTransaction implements TransactionScopedComponent, Transaction
     final void markAsAborted() {
         assert getState().canAbort();
 
-        LOG.info("abort transaction {}", this);
+        log.info("abort transaction {}", this);
         setState(State.ABORTED);
     }
 
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index 293e259..e32a383 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -67,15 +67,14 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationSer
 //TODO deprecated non standard import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.PrettyPrinting;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.server.resources.serialization.SerializationStrategy;
-import org.apache.log4j.Logger;
 
-@Path("/objects")
-public class DomainObjectResourceServerside extends ResourceAbstract implements DomainObjectResource {
+import lombok.extern.log4j.Log4j2;
 
-    private final static Logger LOG = Logger.getLogger(DomainObjectResourceServerside.class);
+@Path("/objects") @Log4j2
+public class DomainObjectResourceServerside extends ResourceAbstract implements DomainObjectResource {
 
     public DomainObjectResourceServerside() {
-        LOG.debug("<init>");
+        log.debug("<init>");
     }
 
     // //////////////////////////////////////////////////////////
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
index 333498f..0f00755 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
@@ -22,34 +22,30 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
-import com.google.common.collect.Maps;
-
-import org.apache.wicket.Session;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.hint.HintStore;
+import org.apache.wicket.Session;
+
+import com.google.common.collect.Maps;
+
+import lombok.extern.log4j.Log4j2;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
         menuOrder = "" + Integer.MAX_VALUE
-        )
+        ) 
+@Log4j2
 public class HintStoreUsingWicketSession implements HintStore {
 
-    private static final long serialVersionUID = 1L;
-
-    private static final Logger LOG = LoggerFactory.getLogger(HintStoreUsingWicketSession.class);
-
     @Override
     public String get(final Bookmark bookmark, final String key) {
         final Map<String, String> hintsForBookmark = hintsFor(bookmark);
         final String value = hintsForBookmark.get(key);
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug(String.format("GET %s / %s returns %s", bookmark.toString(), key, value));
+        if(log.isDebugEnabled()) {
+            log.debug(String.format("GET %s / %s returns %s", bookmark.toString(), key, value));
         }
 
         return value;
@@ -59,8 +55,8 @@ public class HintStoreUsingWicketSession implements HintStore {
     public void set(final Bookmark bookmark, final String key, final String value) {
         final Map<String, String> hintsForBookmark = hintsFor(bookmark);
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug(String.format("SET %s / %s to %s", bookmark.toString(), key, value));
+        if(log.isDebugEnabled()) {
+            log.debug(String.format("SET %s / %s to %s", bookmark.toString(), key, value));
         }
 
         hintsForBookmark.put(key, value);
@@ -70,8 +66,8 @@ public class HintStoreUsingWicketSession implements HintStore {
     public void remove(final Bookmark bookmark, final String key) {
         final Map<String, String> hintsForBookmark = hintsFor(bookmark);
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug(String.format("REMOVE %s / %s", bookmark.toString(), key));
+        if(log.isDebugEnabled()) {
+            log.debug(String.format("REMOVE %s / %s", bookmark.toString(), key));
         }
 
         hintsForBookmark.remove(key);
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
index 4ce3f52..6df02f5 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/LocaleProviderWicket.java
@@ -22,13 +22,10 @@ import java.util.Locale;
 
 import javax.inject.Singleton;
 
+import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.wicket.Application;
 import org.apache.wicket.Session;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.services.i18n.LocaleProvider;
 
 
 /**
@@ -37,8 +34,6 @@ import org.apache.isis.applib.services.i18n.LocaleProvider;
 @Singleton
 public class LocaleProviderWicket implements LocaleProvider {
 
-    public static final Logger LOG = LoggerFactory.getLogger(LocaleProviderWicket.class);
-
     @Override
     public Locale getLocale() {
         // Request Cycle can be null, e.g. during the start of an application
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index df43b93..580d7cf 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -18,13 +18,11 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
 
+import org.apache.isis.core.runtime.memento.ObjectAdapterMemento;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
-import org.apache.isis.core.runtime.memento.ObjectAdapterMemento;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * For widgets that use a <tt>org.wicketstuff.select2.Select2Choice</tt>;
@@ -38,10 +36,9 @@ public interface ScalarModelWithPending extends Serializable {
 
     public ScalarModel getScalarModel();
 
+    @Log4j2
     static class Util {
 
-        private static final Logger LOG = LoggerFactory.getLogger(ScalarModelWithPending.Util.class);
-
         public static IModel<ObjectAdapterMemento> createModel(final ScalarModel model) {
             return createModel(model.asScalarModelWithPending());
         }
@@ -54,10 +51,10 @@ public interface ScalarModelWithPending extends Serializable {
                 @Override
                 public ObjectAdapterMemento getObject() {
                     if (owner.getPending() != null) {
-                        LOG.debug("pending not null: {}", owner.getPending().toString());
+                        log.debug("pending not null: {}", owner.getPending().toString());
                         return owner.getPending();
                     }
-                    LOG.debug("pending is null");
+                    log.debug("pending is null");
 
                     final ObjectAdapterMemento objectAdapterMemento = owner.getScalarModel().getObjectAdapterMemento();
                     owner.setPending(objectAdapterMemento);
@@ -67,7 +64,7 @@ public interface ScalarModelWithPending extends Serializable {
 
                 @Override
                 public void setObject(final ObjectAdapterMemento adapterMemento) {
-                    LOG.debug("setting to: {}", (adapterMemento!=null?adapterMemento.toString():null) );
+                    log.debug("setting to: {}", (adapterMemento!=null?adapterMemento.toString():null) );
                     owner.setPending(adapterMemento);
                     final ScalarModel ownerScalarModel = owner.getScalarModel();
                     if (ownerScalarModel != null) {
@@ -76,7 +73,7 @@ public interface ScalarModelWithPending extends Serializable {
                         } else {
                             final ObjectAdapterMemento ownerPending = owner.getPending();
                             if (ownerPending != null) {
-                                LOG.debug("setting to pending: {}", ownerPending.toString());
+                                log.debug("setting to pending: {}", ownerPending.toString());
                                 ownerScalarModel.setObject(
                                         ownerPending.getObjectAdapter());
                             }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index 46bb53e..5694e3f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -21,16 +21,6 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
 
 import java.util.List;
 
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Fragment;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.layout.component.ServiceActionLayoutData;
 import org.apache.isis.applib.layout.menubars.MenuBars;
 import org.apache.isis.applib.layout.menubars.MenuSection;
@@ -48,16 +38,23 @@ import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 import org.apache.isis.viewer.wicket.ui.util.Tooltips;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public final class ServiceActionUtil {
 
-    private final static Logger LOG = LoggerFactory.getLogger(ServiceActionUtil.class);
-
     private ServiceActionUtil(){}
 
     static void addLeafItem(
@@ -226,7 +223,7 @@ public final class ServiceActionUtil {
                     final ObjectAction objectAction = serviceAdapter.getSpecification()
                             .getObjectAction(actionLayoutData.getId());
                     if(objectAction == null) {
-                        LOG.warn("No such action {}", actionLayoutData.getId());
+                        log.warn("No such action {}", actionLayoutData.getId());
                         continue;
                     }
                     final ServiceAndAction serviceAndAction =
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupport.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupport.java
index 251bd6e..9980e2b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupport.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupport.java
@@ -20,15 +20,12 @@ package org.apache.isis.viewer.wicket.ui.components.widgets.themepicker;
 
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import de.agilecoders.wicket.core.settings.ThemeProvider;
+import lombok.val;
 
 /**
  * @since 2.0.0-M2
@@ -62,20 +59,20 @@ public interface IsisWicketThemeSupport {
     /*private*/ static IsisWicketThemeSupport createInstance() {
         
         
-        final IsisConfiguration configuration = IsisContext.getConfiguration();
+        val configuration = IsisContext.getConfiguration();
         
-        final String themeSupportClassName = configuration.getString(
+        val themeSupportClassName = configuration.getString(
                 THEME_SUPPORT_PROVIDER_KEY, THEME_SUPPORT_DEFAULT_CLASS.getName());
         
         try {
             
-            IsisWicketThemeSupport themeSupport = 
-                    (IsisWicketThemeSupport) InstanceUtil.createInstance(themeSupportClassName);
+            val themeSupport = (IsisWicketThemeSupport) InstanceUtil.createInstance(themeSupportClassName);
             return themeSupport;
             
         } catch (Exception e) {
-            final Logger LOG = LoggerFactory.getLogger(IsisWicketThemeSupport.class);
-            LOG.warn("Could not instantiate configured theme support class '{}', defaulting to '{}'",
+        	
+        	val log = org.apache.logging.log4j.LogManager.getLogger(IsisWicketThemeSupport.class);
+            log.warn("Could not instantiate configured theme support class '{}', defaulting to '{}'",
                     themeSupportClassName,
                     THEME_SUPPORT_DEFAULT_CLASS.getName());
         }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
index 877dcd3..241740f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/IsisWicketThemeSupportDefault.java
@@ -24,31 +24,28 @@ import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
 import de.agilecoders.wicket.core.settings.ITheme;
 import de.agilecoders.wicket.core.settings.ThemeProvider;
 import de.agilecoders.wicket.themes.markup.html.bootstrap.BootstrapThemeTheme;
 import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
 import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * @since 2.0.0-M2
  */
+@Log4j2
 public class IsisWicketThemeSupportDefault implements IsisWicketThemeSupport {
 
-    private static final Logger LOG = LoggerFactory.getLogger(IsisWicketThemeSupportDefault.class);
-    
     private static final BootswatchTheme BOOTSWATCH_THEME_DEFAULT = BootswatchTheme.Flatly;
     
     private final _Lazy<ThemeProvider> themeProvider = _Lazy.of(this::createThemeProvider); 
@@ -93,7 +90,7 @@ public class IsisWicketThemeSupportDefault implements IsisWicketThemeSupport {
             bootswatchTheme = BootswatchTheme.valueOf(themeName);
         } catch(Exception ex) {
             bootswatchTheme = BOOTSWATCH_THEME_DEFAULT;
-            LOG.warn("Did not recognise configured bootswatch theme '{}', defaulting to '{}'", 
+            log.warn("Did not recognise configured bootswatch theme '{}', defaulting to '{}'", 
                     themeName, 
                     bootswatchTheme);
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/ThemeChooser.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/ThemeChooser.java
index c40ec09..275cc31 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/ThemeChooser.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/themepicker/ThemeChooser.java
@@ -51,7 +51,6 @@ import de.agilecoders.wicket.themes.markup.html.vegibit.VegibitThemeProvider;
  */
 public class ThemeChooser extends Panel {
 
-    //private static final Logger LOG = LoggerFactory.getLogger(ThemeChooser.class);
     private static final long serialVersionUID = 1L;
 
     /**
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 18c5c25..739385b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -28,40 +28,6 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.RestartResponseAtInterceptPageException;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.devutils.debugbar.DebugBar;
-import org.apache.wicket.devutils.debugbar.IDebugBarContributor;
-import org.apache.wicket.devutils.debugbar.InspectorDebugPanel;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.markup.head.CssHeaderItem;
-import org.apache.wicket.markup.head.CssReferenceHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
-import org.apache.wicket.markup.head.PriorityHeaderItem;
-import org.apache.wicket.markup.head.filter.HeaderResponseContainer;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.panel.EmptyPanel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.protocol.http.ClientProperties;
-import org.apache.wicket.protocol.http.WebSession;
-import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.request.resource.PackageResource;
-import org.apache.wicket.request.resource.ResourceReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
@@ -96,6 +62,37 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.favicon.Favicon;
 import org.apache.isis.viewer.wicket.ui.errors.ExceptionModel;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
+import org.apache.wicket.RestartResponseAtInterceptPageException;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.devutils.debugbar.DebugBar;
+import org.apache.wicket.devutils.debugbar.IDebugBarContributor;
+import org.apache.wicket.devutils.debugbar.InspectorDebugPanel;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.CssReferenceHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
+import org.apache.wicket.markup.head.filter.HeaderResponseContainer;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.protocol.http.ClientProperties;
+import org.apache.wicket.protocol.http.WebSession;
+import org.apache.wicket.protocol.http.request.WebClientInfo;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.PackageResource;
+import org.apache.wicket.request.resource.ResourceReference;
 
 import de.agilecoders.wicket.core.Bootstrap;
 import de.agilecoders.wicket.core.markup.html.references.BootlintHeaderItem;
@@ -103,14 +100,14 @@ import de.agilecoders.wicket.core.markup.html.references.BootstrapJavaScriptRefe
 import de.agilecoders.wicket.core.settings.IBootstrapSettings;
 import de.agilecoders.wicket.core.settings.ITheme;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeCssReference;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Convenience adapter for {@link WebPage}s built up using {@link ComponentType}s.
  */
+@Log4j2
 public abstract class PageAbstract extends WebPage implements ActionPromptProvider {
 
-    private static Logger LOG = LoggerFactory.getLogger(PageAbstract.class);
-
     private static final long serialVersionUID = 1L;
     
     public static final ConfigPropertyEnum<DialogMode> CONFIG_DIALOG_MODE =
@@ -206,7 +203,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
 
         } catch(final RuntimeException ex) {
 
-            LOG.error("Failed to construct page, going back to sign in page", ex);
+            log.error("Failed to construct page, going back to sign in page", ex);
 
             // REVIEW: similar code in WebRequestCycleForIsis
             final Stream<ExceptionRecognizer> exceptionRecognizers = getServiceRegistry()
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index 1fb16f7..5381129 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -22,19 +22,6 @@ import java.util.Optional;
 import java.util.concurrent.Callable;
 import java.util.stream.Stream;
 
-import com.google.common.base.Throwables;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
@@ -68,16 +55,26 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOrClobPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
 import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+
+import com.google.common.base.Throwables;
 
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public final class FormExecutorDefault<M extends BookmarkableModel<ObjectAdapter> & ParentEntityModelProvider>
 implements FormExecutor {
 
     private static final long serialVersionUID = 1L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(FormExecutorDefault.class);
-
     protected final M model;
     protected final WicketViewerSettings settings;
     private final FormExecutorStrategy<M> formExecutorStrategy;
@@ -437,7 +434,7 @@ implements FormExecutor {
             }
         }
 
-        if(LOG.isDebugEnabled()) {
+        if(log.isDebugEnabled()) {
             debug(componentsToRedraw, componentsNotToRedraw);
         }
 
@@ -454,9 +451,9 @@ implements FormExecutor {
     }
 
     private void debug(final String title, final List<Component> list) {
-        LOG.debug(">>> {}:", title);
+        log.debug(">>> {}:", title);
         for (Component component : list) {
-            LOG.debug(
+            log.debug(
                     String.format("%30s: %s",
                             component.getClass().getSimpleName(),
                             component.getPath()));