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/04/02 10:46:42 UTC

[isis] branch 2033-IoC_spring updated: ISIS-2033: further fixes metamodel tests

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

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


The following commit(s) were added to refs/heads/2033-IoC_spring by this push:
     new 5d71204  ISIS-2033: further fixes metamodel tests
5d71204 is described below

commit 5d7120409ef529d5c0745d8eb715ea815db8267c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Apr 2 12:46:35 2019 +0200

    ISIS-2033: further fixes metamodel tests
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |   56 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java |   24 +-
 .../actions/ActionMethodsFacetFactoryTest.java     |    3 +-
 .../action/ActionAnnotationFacetFactoryTest.java   | 1066 +-------------------
 ...notationFacetFactoryTest_ActionInvocation.java} |    8 +-
 .../ActionAnnotationFacetFactoryTest_Command.java  |  296 ++++++
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |   45 +
 ...ctionAnnotationFacetFactoryTest_Invocation.java |  183 ++++
 ...ctionAnnotationFacetFactoryTest_Publishing.java |  283 ++++++
 ...ctionAnnotationFacetFactoryTest_RestrictTo.java |   82 ++
 ...ActionAnnotationFacetFactoryTest_Semantics.java |   84 ++
 .../ActionAnnotationFacetFactoryTest_TypeOf.java   |  150 +++
 .../CollectionFieldMethodsFacetFactoryTest.java    |    3 +-
 .../CollectionAnnotationFacetFactoryTest.java      |    3 +-
 ...stedAnnotationOnCollectionFacetFactoryTest.java |    3 +-
 .../ObjectDisabledMethodFacetFactoryTest.java      |    3 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |   15 +-
 .../DomainObjectLayoutFactoryTest.java             |    6 +-
 .../title/TitleFacetViaMethodsFactoryTest.java     |    3 +-
 .../ParameterAnnotationFacetFactoryTest.java       |    3 +-
 ...lableAnnotationOnParameterFacetFactoryTest.java |    3 +-
 ...RegExAnnotationOnParameterFacetFactoryTest.java |    3 +-
 .../PropertyMethodsFacetFactoryTest.java           |    3 +-
 .../MandatoryAnnotationFacetFactoryTest.java       |    3 +-
 ...sistedAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 .../PropertyAnnotationFacetFactoryTest.java        |    3 +-
 ...llableAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 .../RegExAnnotationOnPropertyFacetFactoryTest.java |    3 +-
 .../BigDecimalValueSemanticsProviderTest.java      |    3 +-
 .../value/BigIntValueSemanticsProviderTest.java    |    3 +-
 .../ServiceInjectorBuilder_forTesting.java         |    1 +
 .../ApplicationFeatureRepositoryDefaultTest.java   |    3 +-
 32 files changed, 1228 insertions(+), 1125 deletions(-)

diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index 6b1cf1b..5219611 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -35,6 +35,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import org.apache.isis.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.services.persistsession.ObjectAdapterService;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -55,41 +56,28 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    protected SpecificationLoader mockSpecificationLoader;
-    @Mock
-    protected ObjectAdapterService mockPersistenceSessionServiceInternal;
-    @Mock
-    protected MethodRemover mockMethodRemover;
-    @Mock
-    protected FacetHolder mockFacetHolder;
-    @Mock
-    protected ServiceInjector mockServiceInjector;
-    @Mock
-    protected ServiceRegistry mockServiceRegistry;
+    @Mock    protected SpecificationLoader mockSpecificationLoader;
+    @Mock    protected ObjectAdapterService mockPersistenceSessionServiceInternal;
+    @Mock    protected MethodRemover mockMethodRemover;
+    @Mock    protected FacetHolder mockFacetHolder;
+    @Mock    protected ServiceInjector mockServiceInjector;
+    @Mock    protected ServiceRegistry mockServiceRegistry;
     
-    @Mock
-    protected TranslationService mockTranslationService;
+    @Mock    protected TranslationService mockTranslationService;
 
-    @Mock
-    protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock    protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
 
     protected IdentifiedHolder facetHolder;
 
-    @Mock
-    protected ObjectSpecification mockOnType;
-    @Mock
-    protected ObjectSpecification mockObjSpec;
-    @Mock
-    protected OneToOneAssociation mockOneToOneAssociation;
-    @Mock
-    protected OneToManyAssociation mockOneToManyAssociation;
-    @Mock
-    protected OneToOneActionParameter mockOneToOneActionParameter;
-//    @Mock
-//    protected EventBusService mockEventBusService;
-    @Mock
-    protected ObjectAdapterProvider mockObjectAdapterProvider;
+    @Mock    protected ObjectSpecification mockOnType;
+    @Mock    protected ObjectSpecification mockObjSpec;
+    @Mock    protected OneToOneAssociation mockOneToOneAssociation;
+    @Mock    protected OneToManyAssociation mockOneToManyAssociation;
+    @Mock    protected OneToOneActionParameter mockOneToOneActionParameter;
+//    @Mock    protected EventBusService mockEventBusService;
+    @Mock    protected ObjectAdapterProvider mockObjectAdapterProvider;
+    
+    @Mock    protected MetamodelEventService mockMetamodelEventService;
     
     protected FacetedMethod facetedMethod;
     protected FacetedMethodParameter facetedMethodParameter;
@@ -113,9 +101,10 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
         // PRODUCTION
     	
     	MetaModelContext.preset(MetaModelContext.builder()
-        		.specificationLoader(mockSpecificationLoader)
+    			.configuration(_Config.getConfiguration())
+    			.specificationLoader(mockSpecificationLoader)
         		.serviceInjector(mockServiceInjector)
-        		.configuration(_Config.getConfiguration())
+        		.serviceRegistry(mockServiceRegistry)
         		.build());
         
         context.checking(new Expectations() {{
@@ -126,6 +115,9 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
             allowing(mockServiceRegistry).lookupService(AuthenticationSessionProvider.class);
             will(returnValue(Optional.of(mockAuthenticationSessionProvider)));
 
+            allowing(mockServiceRegistry).lookupServiceElseFail(MetamodelEventService.class);
+            will(returnValue(mockMetamodelEventService));
+            
 //            allowing(mockServicesInjector).lookupServiceElseFail(EventBusService.class);
 //            will(returnValue(mockEventBusService));
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 1b83e3b..1051889 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -23,18 +23,22 @@ import java.lang.reflect.Method;
 import java.util.List;
 
 import org.jmock.Expectations;
+import org.jmock.auto.Mock;
 import org.junit.Rule;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.config.internal._Config;
 import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.core.metamodel.services.persistsession.ObjectAdapterService;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -62,7 +66,10 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
         }
     }
 
+    @Mock    protected MetamodelEventService mockMetamodelEventService;
+    
     protected ObjectAdapterProvider mockObjectAdapterProvider;
+    protected ServiceRegistry mockServiceRegistry;
     protected ServiceInjector mockServiceInjector;
     protected TranslationService mockTranslationService;
     protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
@@ -97,11 +104,6 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
         
         _Context.clear();
         
-        MetaModelContext.preset(MetaModelContext.builder()
-        		.specificationLoader(mockSpecificationLoader)
-        		.serviceInjector(mockServiceInjector)
-        		.build());
-        
         // PRODUCTION
         
         facetHolder = new IdentifiedHolderImpl(
@@ -122,6 +124,7 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
         mockSpecificationLoader = context.mock(SpecificationLoader.class);
         
+        mockServiceRegistry = context.mock(ServiceRegistry.class);
         mockServiceInjector = context.mock(ServiceInjector.class);
         mockObjectAdapterProvider = context.mock(ObjectAdapterProvider.class);
         
@@ -129,7 +132,18 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
             allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
             will(returnValue(mockAuthenticationSession));
+            
+            allowing(mockServiceRegistry).lookupServiceElseFail(MetamodelEventService.class);
+            will(returnValue(mockMetamodelEventService));
+            
         }});
+        
+        MetaModelContext.preset(MetaModelContext.builder()
+        		.configuration(_Config.getConfiguration())
+        		.specificationLoader(mockSpecificationLoader)
+        		.serviceRegistry(mockServiceRegistry)
+        		.serviceInjector(mockServiceInjector)
+        		.build());
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index 33e196c..cb8f475 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -70,7 +70,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     private final ObjectSpecification stringSpec = new ObjectSpecificationStub("java.lang.String");
     private final ObjectSpecification customerSpec = new ObjectSpecificationStub("Customer");
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         
         // PRODUCTION
         
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index c95ed5c..bf3ba1c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -19,73 +19,27 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action;
 
-import static org.apache.isis.core.commons.matchers.IsisMatchers.classEqualTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 import java.lang.reflect.Method;
-import java.util.Collection;
 import java.util.UUID;
 
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.CommandExecuteIn;
-import org.apache.isis.applib.annotation.CommandPersistence;
-import org.apache.isis.applib.annotation.CommandReification;
-import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.core.metamodel.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
-import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotationAsConfigured;
-import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration;
-import org.apache.isis.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetAbstract;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault;
-import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetFromConfiguration;
-import org.apache.isis.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation;
-import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
-import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
-import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Test;
 
-@SuppressWarnings({"hiding", "serial"})
 public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
 
     ActionAnnotationFacetFactory facetFactory;
     Method actionMethod;
 
-    @Mock
-    ObjectSpecification mockTypeSpec;
-    @Mock
-    ObjectSpecification mockReturnTypeSpec;
+    @Mock ObjectSpecification mockTypeSpec;
+    @Mock ObjectSpecification mockReturnTypeSpec;
 
     void expectRemoveMethod(final Method actionMethod) {
         context.checking(new Expectations() {{
@@ -124,7 +78,8 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         actionMethod = findMethod(Customer.class, "someAction");
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
     }
@@ -146,1019 +101,6 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         
     }
 
-    public static class Invocation extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void withPostsActionInvokedEvent() {
-
-            class Customer {
-
-				class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> { }
-
-                @Action(domainEvent = SomeActionInvokedDomainEvent.class)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
-            expectRemoveMethod(actionMethod);
-
-            _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processInvocation(processMethodContext);
-
-            // then
-            final ActionDomainEventFacet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetAbstract);
-            final ActionDomainEventFacetAbstract domainEventFacetImpl = (ActionDomainEventFacetAbstract) domainEventFacet;
-            assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-
-            final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
-            Assert.assertNotNull(invocationFacet);
-            Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
-            final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
-            assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-        }
-
-        @Test
-        public void withActionInteractionEvent() {
-
-            class Customer {
-
-                class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> { }
-
-                @Action(domainEvent = SomeActionInvokedDomainEvent.class)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
-            expectRemoveMethod(actionMethod);
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processInvocation(processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation);
-            final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = 
-            		(ActionDomainEventFacetForActionAnnotation) domainEventFacet;
-            assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-
-            final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
-            Assert.assertNotNull(invocationFacet);
-            
-            Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
-            final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = 
-            		(ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
-            assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-        }
- 
-        @Test
-        public void withActionDomainEvent() {
-
-            class Customer {
-
-                class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> {
-                }
-
-                @Action(domainEvent= SomeActionInvokedDomainEvent.class)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
-            expectRemoveMethod(actionMethod);
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processInvocation(processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation);
-            final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = (ActionDomainEventFacetForActionAnnotation) domainEventFacet;
-            assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-
-            final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
-            Assert.assertNotNull(invocationFacet);
-            Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
-            final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
-            assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
-        }
-
-        @Test
-        public void withDefaultEvent() {
-
-            class Customer {
-                @SuppressWarnings("unused")
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // expect
-            allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
-            expectRemoveMethod(actionMethod);
-
-            _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processInvocation(processMethodContext);
-
-            // then
-            final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
-            Assert.assertNotNull(domainEventFacet);
-            Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetDefault);
-            final ActionDomainEventFacetDefault domainEventFacetImpl = (ActionDomainEventFacetDefault) domainEventFacet;
-            assertThat(domainEventFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class));
-
-            final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
-            Assert.assertNotNull(invocationFacet);
-            Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromDefault);
-            final ActionInvocationFacetForDomainEventFromDefault invocationFacetImpl = (ActionInvocationFacetForDomainEventFromDefault) invocationFacet;
-            assertThat(invocationFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class));
-        }
-    }
-
-    public static class Hidden extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void withAnnotation() {
-
-            class Customer {
-                @Action(hidden = Where.REFERENCES_PARENT)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processHidden(processMethodContext);
-
-            // then
-            final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class);
-            Assert.assertNotNull(hiddenFacet);
-            assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT));
-
-            final Facet hiddenFacetImpl = facetedMethod.getFacet(HiddenFacetForActionAnnotation.class);
-            Assert.assertNotNull(hiddenFacetImpl);
-            Assert.assertTrue(hiddenFacet == hiddenFacetImpl);
-        }
-
-    }
-
-    public static class RestrictTo extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void whenRestrictedToPrototyping() {
-
-            class Customer {
-                @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.PROTOTYPING)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processRestrictTo(processMethodContext);
-
-            // then
-            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
-            Assert.assertNotNull(facet);
-        }
-
-        @Test
-        public void whenRestrictedToNoRestriction() {
-
-            class Customer {
-                @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.NO_RESTRICTIONS)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processRestrictTo(processMethodContext);
-
-            // then
-            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void whenNotPresent() {
-
-            class Customer {
-                @SuppressWarnings("unused")
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(
-            		cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processRestrictTo(processMethodContext);
-
-            // then
-            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
-            assertNull(facet);
-        }
-
-    }
-
-    public static class Semantics extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void whenSafe() {
-
-            class Customer {
-                @Action(semantics = SemanticsOf.SAFE)
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processSemantics(processMethodContext);
-
-            // then
-            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
-            Assert.assertNotNull(facet);
-            assertThat(facet.value(), is(SemanticsOf.SAFE));
-        }
-
-        @Test
-        public void whenNotSpecified() {
-
-            class Customer {
-                @Action()
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processSemantics(processMethodContext);
-
-            // then
-            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
-            Assert.assertNotNull(facet);
-            assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT));
-        }
-
-        @Test
-        public void whenNoAnnotation() {
-
-            class Customer {
-                @SuppressWarnings("unused")
-                public void someAction() {
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processSemantics(processMethodContext);
-
-            // then
-            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
-            Assert.assertNotNull(facet);
-            assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT));
-        }
-
-    }
-
-    public static class Command extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void givenHasTransactionId_thenIgnored() {
-            // given
-            final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(SomeTransactionalId.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNull(facet);
-
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
-
-            // given
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
-
-            // given
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNotNull(facet);
-            assert(facet instanceof  CommandFacetFromConfiguration);
-            final CommandFacetFromConfiguration facetImpl = (CommandFacetFromConfiguration) facet;
-            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.PERSISTED));
-            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.FOREGROUND));
-        }
-
-        @Test(expected=IllegalStateException.class)
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
-
-            // given
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToNone_thenNone() {
-
-            // given
-            allowingCommandConfigurationToReturn("none");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
-
-            // given
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            allowingCommandConfigurationToReturn("all");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNotNull(facet);
-            assert(facet instanceof CommandFacetFromConfiguration);
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
-
-            class Customer {
-                @Action(
-                        command = CommandReification.AS_CONFIGURED
-                )
-                public void someAction() {
-                }
-            }
-
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
-
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        command = CommandReification.AS_CONFIGURED,
-                        commandPersistence = CommandPersistence.IF_HINTED,
-                        commandExecuteIn = CommandExecuteIn.BACKGROUND
-                )
-                public void someAction() {
-                }
-            }
-
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNotNull(facet);
-            final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
-            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED));
-            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.BACKGROUND));
-        }
-
-        @Test(expected=IllegalStateException.class)
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
-
-            class Customer {
-                @Action(
-                        command = CommandReification.AS_CONFIGURED
-                )
-                public void someAction() {
-                }
-            }
-
-            allowingCommandConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToNone_thenNone() {
-
-            class Customer {
-                @Action(
-                        command = CommandReification.AS_CONFIGURED
-                )
-                public void someAction() {
-                }
-            }
-
-            allowingCommandConfigurationToReturn("none");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        command = CommandReification.AS_CONFIGURED,
-                        commandPersistence = CommandPersistence.IF_HINTED,
-                        commandExecuteIn = CommandExecuteIn.BACKGROUND
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            allowingCommandConfigurationToReturn("all");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNotNull(facet);
-            final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
-            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED));
-            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.BACKGROUND));
-        }
-
-        @Test
-        public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        command = CommandReification.ENABLED
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            // even though configuration is disabled
-            allowingCommandConfigurationToReturn("none");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNotNull(facet);
-            assertTrue(facet instanceof CommandFacetForActionAnnotation);
-        }
-
-        @Test
-        public void given_disabled_irrespectiveOfConfiguration_thenNone() {
-
-            // given
-            class Customer {
-                @Action(
-                        command = CommandReification.DISABLED
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            // even though configuration is disabled
-            allowingCommandConfigurationToReturn("none");
-
-            // when
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertNull(facet);
-        }
-
-
-    }
-
-    public static class Publishing extends ActionAnnotationFacetFactoryTest {
-
-        @Test
-        public void givenHasTransactionId_thenIgnored() {
-
-            final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
-
-            facetFactory.processPublishing(new ProcessMethodContext(SomeTransactionalId.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-
-            expectNoMethodsRemoved();
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
-
-            // given
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
-
-            // given
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNotNull(facet);
-            final PublishedActionFacetFromConfiguration facetImpl = (PublishedActionFacetFromConfiguration) facet;
-        }
-
-        @Test(expected=IllegalStateException.class)
-        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
-
-            // given
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToNone_thenNone() {
-
-            // given
-            allowingPublishingConfigurationToReturn("none");
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-
-            expectNoMethodsRemoved();
-
-        }
-
-        @Test
-        public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
-
-            // given
-            final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
-
-            allowingPublishingConfigurationToReturn("all");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
-                    actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNotNull(facet);
-            assertTrue(facet instanceof PublishedActionFacetFromConfiguration);
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
-
-            class Customer {
-                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
-                public void someAction() {
-                }
-            }
-
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
-
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-
-            expectNoMethodsRemoved();
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED
-                )
-                public void someAction() {
-                }
-            }
-
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNotNull(facet);
-            final PublishedActionFacetForActionAnnotation facetImpl = (PublishedActionFacetForActionAnnotation) facet;
-
-            expectNoMethodsRemoved();
-        }
-
-        @Test(expected=IllegalStateException.class)
-        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
-
-            class Customer {
-                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
-                public void someAction() {
-                }
-            }
-
-            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToNone_thenNone() {
-
-            class Customer {
-                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
-                public void someAction() {
-                }
-            }
-
-            allowingPublishingConfigurationToReturn("none");
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-
-            expectNoMethodsRemoved();
-
-        }
-
-        @Test
-        public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            allowingPublishingConfigurationToReturn("all");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNotNull(facet);
-            assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
-
-            expectNoMethodsRemoved();
-        }
-
-        @Test
-        public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
-
-            // given
-            class Customer {
-                @Action(
-                        publishing = org.apache.isis.applib.annotation.Publishing.ENABLED
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            // even though configuration is disabled
-            allowingPublishingConfigurationToReturn("none");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNotNull(facet);
-            assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
-        }
-
-        @Test
-        public void given_disabled_irrespectiveOfConfiguration_thenNone() {
-
-            // given
-            class Customer {
-                @Action(
-                        publishing = org.apache.isis.applib.annotation.Publishing.DISABLED
-                )
-                public void someAction() {
-                }
-            }
-            final Method actionMethod = findMethod(Customer.class, "someAction");
-
-            // even though configuration is disabled
-            allowingPublishingConfigurationToReturn("none");
-
-            // when
-            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
-
-            // then
-            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
-            assertNull(facet);
-        }
-
-    }
-
-    public static class TypeOf extends ActionAnnotationFacetFactoryTest {
-
-
-        @Test
-        public void whenDeprecatedTypeOfAnnotationOnActionNotReturningCollection() {
-
-            class Customer {
-                @SuppressWarnings("unused")
-                public Customer someAction() {
-                    return null;
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processTypeOf(processMethodContext);
-
-            // then
-            final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
-            Assert.assertNull(facet);
-        }
-
-        @Test
-        public void whenActionAnnotationOnActionReturningCollection() {
-
-            class Order {
-            }
-            class Customer {
-                @SuppressWarnings("rawtypes")
-                @Action(typeOf = Order.class)
-                public Collection someAction() {
-                    return null;
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processTypeOf(processMethodContext);
-
-            // then
-            final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
-            Assert.assertNotNull(facet);
-            Assert.assertTrue(facet instanceof TypeOfFacetForActionAnnotation);
-            assertThat(facet.value(), classEqualTo(Order.class));
-        }
-
-        @Test
-        public void whenActionAnnotationOnActionNotReturningCollection() {
-
-            class Order {
-            }
-            class Customer {
-                @Action(typeOf = Order.class)
-                public Customer someAction() {
-                    return null;
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processTypeOf(processMethodContext);
-
-            // then
-            final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
-            Assert.assertNull(facet);
-        }
-
-        @Test
-        public void whenInferFromType() {
-
-            class Order {
-            }
-            class Customer {
-                @SuppressWarnings("unused")
-                public Order[] someAction() {
-                    return null;
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processTypeOf(processMethodContext);
-
-            // then
-            final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
-            Assert.assertNotNull(facet);
-            Assert.assertTrue(facet instanceof TypeOfFacetInferredFromArray);
-            assertThat(facet.value(), classEqualTo(Order.class));
-        }
-
-        @Test
-        public void whenInferFromGenerics() {
-
-            class Order {
-            }
-            class Customer {
-                @SuppressWarnings("unused")
-                public Collection<Order> someAction() {
-                    return null;
-                }
-            }
-
-            // given
-            final Class<?> cls = Customer.class;
-            actionMethod = findMethod(cls, "someAction");
-
-            // when
-            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
-            facetFactory.processTypeOf(processMethodContext);
-
-            // then
-            final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
-            Assert.assertNotNull(facet);
-            Assert.assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
-            assertThat(facet.value(), classEqualTo(Order.class));
-        }
-
-    }
-
     void allowingCommandConfigurationToReturn(final String value) {
         _Config.put("isis.services.command.actions", value);
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
similarity index 97%
rename from core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
index d4ac3d7..464284b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.actions.action;
 
 import java.lang.reflect.Method;
 
+import org.apache.isis.core.metamodel.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
@@ -36,16 +37,21 @@ import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParam
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.testspec.ObjectSpecificationStub;
 
-public class ActionAnnotationFacetFactoryTest_actionInvocation extends AbstractFacetFactoryTest {
+public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractFacetFactoryTest {
 
     private final ObjectSpecification voidSpec = new ObjectSpecificationStub("VOID");
     private final ObjectSpecification stringSpec = new ObjectSpecificationStub("java.lang.String");
     private final ObjectSpecification customerSpec = new ObjectSpecificationStub("Customer");
     private ActionAnnotationFacetFactory facetFactory;
 
+    @Override
     public void setUp() throws Exception {
         super.setUp();
         this.facetFactory =  new ActionAnnotationFacetFactory();
+        
+        System.out.println("setup " + MetaModelContext.current().getSpecificationLoader());
+        
+        
     }
 
     public void testActionInvocationFacetIsInstalledAndMethodRemoved() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Command.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Command.java
new file mode 100644
index 0000000..28e28b0
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Command.java
@@ -0,0 +1,296 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CommandExecuteIn;
+import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.ActionAnnotationFacetFactoryTest.SomeTransactionalId;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotationAsConfigured;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_Command extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void givenHasTransactionId_thenIgnored() {
+        // given
+        final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(SomeTransactionalId.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNull(facet);
+
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+        // given
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+        // given
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNotNull(facet);
+        assert(facet instanceof  CommandFacetFromConfiguration);
+        final CommandFacetFromConfiguration facetImpl = (CommandFacetFromConfiguration) facet;
+        assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.PERSISTED));
+        assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.FOREGROUND));
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+        // given
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToNone_thenNone() {
+
+        // given
+        allowingCommandConfigurationToReturn("none");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
+
+        // given
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        allowingCommandConfigurationToReturn("all");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNotNull(facet);
+        assert(facet instanceof CommandFacetFromConfiguration);
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+        class Customer {
+            @Action(
+                    command = CommandReification.AS_CONFIGURED
+            )
+            public void someAction() {
+            }
+        }
+
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
+
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    command = CommandReification.AS_CONFIGURED,
+                    commandPersistence = CommandPersistence.IF_HINTED,
+                    commandExecuteIn = CommandExecuteIn.BACKGROUND
+            )
+            public void someAction() {
+            }
+        }
+
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNotNull(facet);
+        final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
+        assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED));
+        assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.BACKGROUND));
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+        class Customer {
+            @Action(
+                    command = CommandReification.AS_CONFIGURED
+            )
+            public void someAction() {
+            }
+        }
+
+        allowingCommandConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToNone_thenNone() {
+
+        class Customer {
+            @Action(
+                    command = CommandReification.AS_CONFIGURED
+            )
+            public void someAction() {
+            }
+        }
+
+        allowingCommandConfigurationToReturn("none");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    command = CommandReification.AS_CONFIGURED,
+                    commandPersistence = CommandPersistence.IF_HINTED,
+                    commandExecuteIn = CommandExecuteIn.BACKGROUND
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        allowingCommandConfigurationToReturn("all");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNotNull(facet);
+        final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
+        assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.CommandPersistence.IF_HINTED));
+        assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.CommandExecuteIn.BACKGROUND));
+    }
+
+    @Test
+    public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    command = CommandReification.ENABLED
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        // even though configuration is disabled
+        allowingCommandConfigurationToReturn("none");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof CommandFacetForActionAnnotation);
+    }
+
+    @Test
+    public void given_disabled_irrespectiveOfConfiguration_thenNone() {
+
+        // given
+        class Customer {
+            @Action(
+                    command = CommandReification.DISABLED
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        // even though configuration is disabled
+        allowingCommandConfigurationToReturn("none");
+
+        // when
+        facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+        assertNull(facet);
+    }
+
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java
new file mode 100644
index 0000000..ff00a99
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java
@@ -0,0 +1,45 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_Hidden extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void withAnnotation() {
+
+        class Customer {
+            @Action(hidden = Where.REFERENCES_PARENT)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processHidden(processMethodContext);
+
+        // then
+        final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class);
+        Assert.assertNotNull(hiddenFacet);
+        assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT));
+
+        final Facet hiddenFacetImpl = facetedMethod.getFacet(HiddenFacetForActionAnnotation.class);
+        Assert.assertNotNull(hiddenFacetImpl);
+        Assert.assertTrue(hiddenFacet == hiddenFacetImpl);
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java
new file mode 100644
index 0000000..43e85ba
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java
@@ -0,0 +1,183 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.apache.isis.core.commons.matchers.IsisMatchers.classEqualTo;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.config.internal._Config;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetAbstract;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_Invocation extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void withPostsActionInvokedEvent() {
+
+        class Customer {
+
+			class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> { }
+
+            @Action(domainEvent = SomeActionInvokedDomainEvent.class)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // expect
+        allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
+        expectRemoveMethod(actionMethod);
+
+        _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processInvocation(processMethodContext);
+
+        // then
+        final ActionDomainEventFacet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
+        Assert.assertNotNull(domainEventFacet);
+        Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetAbstract);
+        final ActionDomainEventFacetAbstract domainEventFacetImpl = (ActionDomainEventFacetAbstract) domainEventFacet;
+        assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+
+        final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        Assert.assertNotNull(invocationFacet);
+        Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
+        final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
+        assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+    }
+
+    @Test
+    public void withActionInteractionEvent() {
+
+        class Customer {
+
+            class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> { }
+
+            @Action(domainEvent = SomeActionInvokedDomainEvent.class)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // expect
+        allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
+        expectRemoveMethod(actionMethod);
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processInvocation(processMethodContext);
+
+        // then
+        final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
+        Assert.assertNotNull(domainEventFacet);
+        Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation);
+        final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = 
+        		(ActionDomainEventFacetForActionAnnotation) domainEventFacet;
+        assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+
+        final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        Assert.assertNotNull(invocationFacet);
+        
+        Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
+        final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = 
+        		(ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
+        assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+    }
+
+    @Test
+    public void withActionDomainEvent() {
+
+        class Customer {
+
+            class SomeActionInvokedDomainEvent extends ActionDomainEvent<Customer> {
+            }
+
+            @Action(domainEvent= SomeActionInvokedDomainEvent.class)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // expect
+        allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
+        expectRemoveMethod(actionMethod);
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processInvocation(processMethodContext);
+
+        // then
+        final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
+        Assert.assertNotNull(domainEventFacet);
+        Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation);
+        final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = (ActionDomainEventFacetForActionAnnotation) domainEventFacet;
+        assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+
+        final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        Assert.assertNotNull(invocationFacet);
+        Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation);
+        final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet;
+        assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class));
+    }
+
+    @Test
+    public void withDefaultEvent() {
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // expect
+        allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
+        expectRemoveMethod(actionMethod);
+
+        _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processInvocation(processMethodContext);
+
+        // then
+        final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class);
+        Assert.assertNotNull(domainEventFacet);
+        Assert.assertTrue(domainEventFacet instanceof ActionDomainEventFacetDefault);
+        final ActionDomainEventFacetDefault domainEventFacetImpl = (ActionDomainEventFacetDefault) domainEventFacet;
+        assertThat(domainEventFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class));
+
+        final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        Assert.assertNotNull(invocationFacet);
+        Assert.assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromDefault);
+        final ActionInvocationFacetForDomainEventFromDefault invocationFacetImpl = (ActionInvocationFacetForDomainEventFromDefault) invocationFacet;
+        assertThat(invocationFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class));
+    }
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Publishing.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Publishing.java
new file mode 100644
index 0000000..c7eee75
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Publishing.java
@@ -0,0 +1,283 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.ActionAnnotationFacetFactoryTest.SomeTransactionalId;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_Publishing extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void givenHasTransactionId_thenIgnored() {
+
+        final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
+
+        facetFactory.processPublishing(new ProcessMethodContext(SomeTransactionalId.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+
+        expectNoMethodsRemoved();
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+        // given
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+        // given
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNotNull(facet);
+        final PublishedActionFacetFromConfiguration facetImpl = (PublishedActionFacetFromConfiguration) facet;
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+        // given
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToNone_thenNone() {
+
+        // given
+        allowingPublishingConfigurationToReturn("none");
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+
+        expectNoMethodsRemoved();
+
+    }
+
+    @Test
+    public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
+
+        // given
+        final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction");
+
+        allowingPublishingConfigurationToReturn("all");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(ActionAnnotationFacetFactoryTest.Customer.class, null,
+                actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof PublishedActionFacetFromConfiguration);
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+        class Customer {
+            @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+            public void someAction() {
+            }
+        }
+
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {});
+
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+
+        expectNoMethodsRemoved();
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED
+            )
+            public void someAction() {
+            }
+        }
+
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {});
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNotNull(facet);
+        final PublishedActionFacetForActionAnnotation facetImpl = (PublishedActionFacetForActionAnnotation) facet;
+
+        expectNoMethodsRemoved();
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+        class Customer {
+            @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+            public void someAction() {
+            }
+        }
+
+        allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToNone_thenNone() {
+
+        class Customer {
+            @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+            public void someAction() {
+            }
+        }
+
+        allowingPublishingConfigurationToReturn("none");
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+
+        expectNoMethodsRemoved();
+
+    }
+
+    @Test
+    public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        allowingPublishingConfigurationToReturn("all");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
+
+        expectNoMethodsRemoved();
+    }
+
+    @Test
+    public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
+
+        // given
+        class Customer {
+            @Action(
+                    publishing = org.apache.isis.applib.annotation.Publishing.ENABLED
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        // even though configuration is disabled
+        allowingPublishingConfigurationToReturn("none");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
+    }
+
+    @Test
+    public void given_disabled_irrespectiveOfConfiguration_thenNone() {
+
+        // given
+        class Customer {
+            @Action(
+                    publishing = org.apache.isis.applib.annotation.Publishing.DISABLED
+            )
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        // even though configuration is disabled
+        allowingPublishingConfigurationToReturn("none");
+
+        // when
+        facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod));
+
+        // then
+        final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+        assertNull(facet);
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java
new file mode 100644
index 0000000..4bef588
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java
@@ -0,0 +1,82 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.junit.Assert.assertNull;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_RestrictTo extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void whenRestrictedToPrototyping() {
+
+        class Customer {
+            @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.PROTOTYPING)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processRestrictTo(processMethodContext);
+
+        // then
+        final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+        Assert.assertNotNull(facet);
+    }
+
+    @Test
+    public void whenRestrictedToNoRestriction() {
+
+        class Customer {
+            @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.NO_RESTRICTIONS)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processRestrictTo(processMethodContext);
+
+        // then
+        final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+        assertNull(facet);
+    }
+
+    @Test
+    public void whenNotPresent() {
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        		cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processRestrictTo(processMethodContext);
+
+        // then
+        final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+        assertNull(facet);
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java
new file mode 100644
index 0000000..030ceee
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java
@@ -0,0 +1,84 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_Semantics extends ActionAnnotationFacetFactoryTest {
+
+    @Test
+    public void whenSafe() {
+
+        class Customer {
+            @Action(semantics = SemanticsOf.SAFE)
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processSemantics(processMethodContext);
+
+        // then
+        final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        Assert.assertNotNull(facet);
+        assertThat(facet.value(), is(SemanticsOf.SAFE));
+    }
+
+    @Test
+    public void whenNotSpecified() {
+
+        class Customer {
+            @Action()
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processSemantics(processMethodContext);
+
+        // then
+        final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        Assert.assertNotNull(facet);
+        assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT));
+    }
+
+    @Test
+    public void whenNoAnnotation() {
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processSemantics(processMethodContext);
+
+        // then
+        final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        Assert.assertNotNull(facet);
+        assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT));
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java
new file mode 100644
index 0000000..400c509
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java
@@ -0,0 +1,150 @@
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import static org.apache.isis.core.commons.matchers.IsisMatchers.classEqualTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.Collection;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
+import org.apache.isis.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ActionAnnotationFacetFactoryTest_TypeOf extends ActionAnnotationFacetFactoryTest {
+
+
+    @Test
+    public void whenDeprecatedTypeOfAnnotationOnActionNotReturningCollection() {
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public Customer someAction() {
+                return null;
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processTypeOf(processMethodContext);
+
+        // then
+        final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        Assert.assertNull(facet);
+    }
+
+    @Test
+    public void whenActionAnnotationOnActionReturningCollection() {
+
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("rawtypes")
+            @Action(typeOf = Order.class)
+            public Collection someAction() {
+                return null;
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processTypeOf(processMethodContext);
+
+        // then
+        final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        Assert.assertNotNull(facet);
+        Assert.assertTrue(facet instanceof TypeOfFacetForActionAnnotation);
+        assertThat(facet.value(), classEqualTo(Order.class));
+    }
+
+    @Test
+    public void whenActionAnnotationOnActionNotReturningCollection() {
+
+        class Order {
+        }
+        class Customer {
+            @Action(typeOf = Order.class)
+            public Customer someAction() {
+                return null;
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processTypeOf(processMethodContext);
+
+        // then
+        final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        Assert.assertNull(facet);
+    }
+
+    @Test
+    public void whenInferFromType() {
+
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Order[] someAction() {
+                return null;
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processTypeOf(processMethodContext);
+
+        // then
+        final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        Assert.assertNotNull(facet);
+        Assert.assertTrue(facet instanceof TypeOfFacetInferredFromArray);
+        assertThat(facet.value(), classEqualTo(Order.class));
+    }
+
+    @Test
+    public void whenInferFromGenerics() {
+
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Collection<Order> someAction() {
+                return null;
+            }
+        }
+
+        // given
+        final Class<?> cls = Customer.class;
+        actionMethod = findMethod(cls, "someAction");
+
+        // when
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, actionMethod, mockMethodRemover, facetedMethod);
+        facetFactory.processTypeOf(processMethodContext);
+
+        // then
+        final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        Assert.assertNotNull(facet);
+        Assert.assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
+        assertThat(facet.value(), classEqualTo(Order.class));
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
index 1b9ebe9..af1d4ea 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
@@ -67,7 +67,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     private ObjectSpecification mockSpecification;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
 
         // expecting
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
index 5a20a48..4b8856a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java
@@ -98,7 +98,8 @@ public class CollectionAnnotationFacetFactoryTest extends AbstractFacetFactoryJU
         facetFactory = new CollectionAnnotationFacetFactory();
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
index cc6ad70..a9a5232 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/NotPersistedAnnotationOnCollectionFacetFactoryTest.java
@@ -33,7 +33,8 @@ public class NotPersistedAnnotationOnCollectionFacetFactoryTest extends Abstract
 
     private CollectionAnnotationFacetFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
         facetFactory = new CollectionAnnotationFacetFactory();
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
index f30ab2d..72ce102 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
@@ -36,7 +36,8 @@ public class ObjectDisabledMethodFacetFactoryTest extends AbstractFacetFactoryTe
 
     private DisabledObjectFacetViaMethodFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
         facetFactory = new DisabledObjectFacetViaMethodFactory();
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 346460e..8b00147 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -70,7 +70,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         facetFactory = new DomainObjectAnnotationFacetFactory();
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
     }
@@ -418,7 +419,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         class CustomerWithDomainObjectButNoAutoCompleteRepository {
         }
 
-        @Before
+        @Override
+		@Before
         public void setUp() throws Exception {
             super.setUp();
             
@@ -515,7 +517,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         class CustomerWithDomainObjectButNoBounded {
         }
 
-        @Before
+        @Override
+		@Before
         public void setUp() throws Exception {
             super.setUp();
             ignoringConfiguration();
@@ -704,7 +707,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         class CustomerWithDomainObjectButNoObjectType {
         }
 
-        @Before
+        @Override
+		@Before
         public void setUp() throws Exception {
             super.setUp();
             ignoringConfiguration();
@@ -777,7 +781,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
         class CustomerWithDomainObjectButNoNature {
         }
 
-        @Before
+        @Override
+		@Before
         public void setUp() throws Exception {
             super.setUp();
             ignoringConfiguration();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index f294875..a1b3726 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -61,7 +61,8 @@ public class DomainObjectLayoutFactoryTest extends AbstractFacetFactoryJUnit4Tes
         facetFactory = new DomainObjectLayoutFacetFactory();
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
         super.tearDown();
@@ -198,7 +199,8 @@ public class DomainObjectLayoutFactoryTest extends AbstractFacetFactoryJUnit4Tes
                 _Config.clear();
             }
 
-            @Before
+            @Override
+			@Before
             public void setUp() throws Exception {
                 _Config.clear();
                 super.setUp();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
index 487c52d..f46f4a2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
@@ -38,7 +38,8 @@ public class TitleFacetViaMethodsFactoryTest extends AbstractFacetFactoryTest {
 
     private TitleFacetViaMethodsFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
 
         facetFactory = new TitleFacetViaMethodsFactory();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
index 193a679..e079f85 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
@@ -79,7 +79,8 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
         facetFactory = new ParameterAnnotationFacetFactory();
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java
index c3a4c38..e91e960 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java
@@ -36,7 +36,8 @@ public class ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest
 
     private ParameterAnnotationFacetFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
         facetFactory = new ParameterAnnotationFacetFactory();
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
index 6e31584..e1ae1a2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
@@ -35,7 +35,8 @@ public class RegExAnnotationOnParameterFacetFactoryTest extends AbstractFacetFac
 
     private ParameterAnnotationFacetFactory facetFactory;
 
-    @Before
+    @Override
+	@Before
     public void setUp() throws Exception {
         super.setUp();
         facetFactory = new ParameterAnnotationFacetFactory();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
index 292f804..a3a70ff 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
@@ -79,7 +79,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     private ObjectSpecification mockSpecification;
     
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
 
         // expecting
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java
index d982b2f..d616d08 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java
@@ -34,7 +34,8 @@ public class MandatoryAnnotationFacetFactoryTest extends AbstractFacetFactoryTes
 
     private PropertyAnnotationFacetFactory facetFactory;
 
-    @Before
+    @Override
+	@Before
     public void setUp() throws Exception {
         super.setUp();
         facetFactory = new PropertyAnnotationFacetFactory();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
index 816dc16..5244c28 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/NotPersistedAnnotationOnPropertyFacetFactoryTest.java
@@ -33,7 +33,8 @@ public class NotPersistedAnnotationOnPropertyFacetFactoryTest extends AbstractFa
 
     private PropertyAnnotationFacetFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
         facetFactory = new PropertyAnnotationFacetFactory();
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index 41f04fb..dd70966 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -116,7 +116,8 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
         facetFactory = new PropertyAnnotationFacetFactory();
     }
 
-    @After
+    @Override
+	@After
     public void tearDown() throws Exception {
         facetFactory = null;
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java
index bc7f36b..d8bef70 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java
@@ -36,7 +36,8 @@ public class PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest e
 
     private PropertyAnnotationFacetFactory facetFactory;
 
-    public void setUp() throws Exception {
+    @Override
+	public void setUp() throws Exception {
         super.setUp();
         facetFactory = new PropertyAnnotationFacetFactory();
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java
index dbc81e7..6479610 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java
@@ -35,7 +35,8 @@ public class RegExAnnotationOnPropertyFacetFactoryTest extends AbstractFacetFact
 
     private PropertyAnnotationFacetFactory facetFactory;
 
-    @Before
+    @Override
+	@Before
     public void setUp() throws Exception {
         super.setUp();
         facetFactory = new PropertyAnnotationFacetFactory();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
index 774bade..ed60daa 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
@@ -39,7 +39,8 @@ public class BigDecimalValueSemanticsProviderTest extends ValueSemanticsProvider
     private BigDecimal bigDecimal;
     private FacetHolder holder;
 
-    @Before
+    @Override
+	@Before
     public void setUp() throws Exception {
         super.setUp();
         
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
index 27fcdf8..9a9760f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
@@ -38,7 +38,8 @@ public class BigIntValueSemanticsProviderTest extends ValueSemanticsProviderAbst
     private BigInteger bigInt;
     private FacetHolder holder;
 
-    @Before
+    @Override
+	@Before
     public void setUp() throws Exception {
         super.setUp();
         bigInt = new BigInteger("132199");
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceInjectorBuilder_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceInjectorBuilder_forTesting.java
index e28e999..5036df2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceInjectorBuilder_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceInjectorBuilder_forTesting.java
@@ -30,6 +30,7 @@ import lombok.val;
 /**
  * @deprecated Only introduced to support existing tests, don't use for new tests
  */
+@Deprecated
 @RequiredArgsConstructor(staticName="of")
 public class ServiceInjectorBuilder_forTesting {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index 9dbe449..b376ba7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -260,7 +260,8 @@ public class ApplicationFeatureRepositoryDefaultTest {
 
     public static class AddClassParent extends ApplicationFeatureRepositoryDefaultTest {
 
-        @Before
+        @Override
+		@Before
         public void setUp() throws Exception {
             super.setUp();