Merge branch 'ESTUP2-668' into CAUSEWAY-3745
diff --git a/antora/components/refguide/modules/applib-svc/partials/_presentation-layer-spi.adoc b/antora/components/refguide/modules/applib-svc/partials/_presentation-layer-spi.adoc
index 214b6ce..73419d2 100644
--- a/antora/components/refguide/modules/applib-svc/partials/_presentation-layer-spi.adoc
+++ b/antora/components/refguide/modules/applib-svc/partials/_presentation-layer-spi.adoc
@@ -51,6 +51,13 @@
 
 
 
+|xref:refguide:applib:index/services/publishing/spi/PageRenderSubscriber.adoc[PageRenderSubscriber]
+|Hook to allow work to be performed before rendering the page.
+For example, this could be used for simple metric gathering.
+Or, it could be used to preload data in bulk to avoid N+1 problems.
+
+
+
 |xref:refguide:applib:index/services/routing/RoutingService.adoc[RoutingService]
 |Return an alternative object than that returned by an action.
 
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TemporalCharacteristicsProvider.java b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TemporalCharacteristicsProvider.java
index 88d5805..597597e 100644
--- a/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TemporalCharacteristicsProvider.java
+++ b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TemporalCharacteristicsProvider.java
@@ -18,15 +18,7 @@
  */
 package org.apache.causeway.applib.value.semantics;
 
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import lombok.val;
-
-public interface TemporalCharacteristicsProvider {
+public interface TemporalCharacteristicsProvider extends TimeZoneChoiceProvider {
 
     static enum TemporalCharacteristic {
 
@@ -70,27 +62,5 @@
 
     TemporalCharacteristic getTemporalCharacteristic();
     OffsetCharacteristic getOffsetCharacteristic();
-
-    /**
-     * For temporal value editing, provides the list of available time zones to choose from.
-     */
-    default List<ZoneId> getAvailableZoneIds() {
-        return ZoneId.getAvailableZoneIds().stream()
-            .sorted()
-            .map(ZoneId::of)
-            .collect(Collectors.toList());
-    }
-
-    /**
-     * For temporal value editing, provides the list of available offsets to choose from.
-     */
-    default List<ZoneOffset> getAvailableOffsets() {
-        val now = LocalDateTime.now();
-        return getAvailableZoneIds().stream()
-            .map(ZoneId::getRules)
-            .flatMap(zoneIdRules->zoneIdRules.getValidOffsets(now).stream())
-            .sorted()
-            .distinct()
-            .collect(Collectors.toList());
-    }
+    
 }
diff --git a/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TimeZoneChoiceProvider.java b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TimeZoneChoiceProvider.java
new file mode 100644
index 0000000..9109deb
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/causeway/applib/value/semantics/TimeZoneChoiceProvider.java
@@ -0,0 +1,68 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.applib.value.semantics;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import lombok.val;
+
+/**
+ * When implemented by a service {@link #getAvailableZoneIds()} 
+ * can be customized to limit the time-zone choices 
+ * as e.g. offered by the <i>Wicket Viewer<i> login page.
+ * 
+ * @since 2.1, 3.1
+ */
+public interface TimeZoneChoiceProvider {
+    
+    /**
+     * For temporal value editing, provides the list of available time zones to choose from.
+     */
+    default List<ZoneId> getAvailableZoneIds() {
+        return ZoneId.getAvailableZoneIds().stream()
+            .sorted()
+            .map(ZoneId::of)
+            .collect(Collectors.toList());
+    }
+
+    /**
+     * For temporal value editing, provides the list of available offsets to choose from.
+     */
+    default List<ZoneOffset> getAvailableOffsets() {
+        val now = LocalDateTime.now();
+        return getAvailableZoneIds().stream()
+            .map(ZoneId::getRules)
+            .flatMap(zoneIdRules->zoneIdRules.getValidOffsets(now).stream())
+            .sorted()
+            .distinct()
+            .collect(Collectors.toList());
+    }
+    
+    /**
+     * Returns the fallback implementation, which provides all ZoneIds known to the JVM.
+     */
+    static TimeZoneChoiceProvider fallback() {
+        return new TimeZoneChoiceProvider() {};
+    }
+    
+}
diff --git a/api/schema/pom.xml b/api/schema/pom.xml
index c4f76cd..46df398 100644
--- a/api/schema/pom.xml
+++ b/api/schema/pom.xml
@@ -114,7 +114,7 @@
 					<plugin>
 						<groupId>org.codehaus.mojo</groupId>
 						<artifactId>build-helper-maven-plugin</artifactId>
-						<version>3.5.0</version>
+						<version>3.6.0</version>
 						<executions>
 							<execution>
 								<id>add-source</id>
diff --git a/bom/pom.xml b/bom/pom.xml
index a217e81..7d787cb 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -87,9 +87,9 @@
         <!-- LIBRARY DEPENDENCIES -->
 
         <archunit.version>1.3.0</archunit.version>
-        <asciidoctorj.version>2.5.12</asciidoctorj.version>
+        <asciidoctorj.version>2.5.13</asciidoctorj.version>
         <asm.version>9.7</asm.version> <!-- keep in sync with org.eclipse.persistence:org.eclipse.persistence.asm -->
-        <approvaltests.version>24.0.0</approvaltests.version>
+        <approvaltests.version>24.1.0</approvaltests.version>
 
         <assertj-guava.version>3.25.3</assertj-guava.version>
 
@@ -182,7 +182,7 @@
         <summernote.version>0.8.20</summernote.version>
         <surefire-plugin.argLine>-Xmx384m</surefire-plugin.argLine>
         <surefire.useModulePath>false</surefire.useModulePath> <!-- disable module-path for testing, that is, put everything on the class-path -->
-        <swagger-core.version>2.2.21</swagger-core.version>
+        <swagger-core.version>2.2.22</swagger-core.version>
 
         <wicket.version>9.17.0</wicket.version>
         <wicket-bootstrap.version>6.0.5</wicket-bootstrap.version> <!-- de.agilecoders.wicket:wicket-bootstrap... -->
diff --git a/core/pom.xml b/core/pom.xml
index 7efdb3a..88009a6 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -176,7 +176,7 @@
 					<plugin>
 						<groupId>org.owasp</groupId>
 						<artifactId>dependency-check-maven</artifactId>
-						<version>9.1.0</version>
+						<version>9.2.0</version>
 						<executions>
 							<execution>
 								<id>owasp-aggregate</id>
diff --git a/starters/pom.xml b/starters/pom.xml
index 393bae6..5ca1cec 100644
--- a/starters/pom.xml
+++ b/starters/pom.xml
@@ -49,7 +49,7 @@
 		<maven.compiler.release>11</maven.compiler.release>
 
 		<spring-boot.version>2.7.18</spring-boot.version>
-		<approvaltests.version>24.0.0</approvaltests.version>
+		<approvaltests.version>24.1.0</approvaltests.version>
 
 		<!-- IMPORTANT: keep in sync with property defined in resteasy-spring-boot-starter -->
 		<resteasy.version>5.0.0.Final</resteasy.version>
diff --git a/valuetypes/asciidoc/builder/src/main/java/org/apache/causeway/valuetypes/asciidoc/builder/ast/SimpleTable.java b/valuetypes/asciidoc/builder/src/main/java/org/apache/causeway/valuetypes/asciidoc/builder/ast/SimpleTable.java
index a7762d4..e093a60 100644
--- a/valuetypes/asciidoc/builder/src/main/java/org/apache/causeway/valuetypes/asciidoc/builder/ast/SimpleTable.java
+++ b/valuetypes/asciidoc/builder/src/main/java/org/apache/causeway/valuetypes/asciidoc/builder/ast/SimpleTable.java
@@ -55,4 +55,9 @@
         setAttribute(GRID_ATTR, this.grid = grid, true);
     }
 
+    @Override
+    public void assignColumnWidths() {
+        // no-op
+    }
+
 }
diff --git a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
index e57f146..59e8c37 100644
--- a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
+++ b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
@@ -18,72 +18,80 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-import org.apache.causeway.core.metamodel.spec.feature.*;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
 public final class TypeNames {
 
-    public static String objectTypeFieldNameFor(
+    public String objectTypeFieldNameFor(
             final ObjectSpecification objectSpecification) {
         return sanitized(objectSpecification.getLogicalTypeName());
     }
 
-    public static String objectTypeNameFor(
+    public String objectTypeNameFor(
             final ObjectSpecification objectSpecification,
             final SchemaType schemaType) {
         return schemaType.name().toLowerCase() + "__" + sanitized(objectSpecification.getLogicalTypeName());
     }
 
-    public static String metaTypeNameFor(
+    public String metaTypeNameFor(
             final ObjectSpecification objectSpecification,
             final SchemaType schemaType) {
         return objectTypeNameFor(objectSpecification, schemaType) + "__gqlv_meta";
     }
 
-    public static String inputTypeNameFor(
+    public String inputTypeNameFor(
             final ObjectSpecification objectSpecification,
             final SchemaType schemaType) {
         return objectTypeNameFor(objectSpecification, schemaType) + "__gqlv_input";
     }
 
-    public static String enumTypeNameFor(
+    public String enumTypeNameFor(
             final ObjectSpecification objectSpec,
             final SchemaType schemaType) {
         return objectTypeNameFor(objectSpec, schemaType) + "__gqlv_enum";
     }
 
-    public static String actionTypeNameFor(
+    public String actionTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() + "__gqlv_action";
     }
 
-    public static String actionInvokeTypeNameFor(
+    public String actionInvokeTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() + "__gqlv_action_invoke";
     }
 
-    public static String actionParamsTypeNameFor(
+    public String actionParamsTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() + "__gqlv_action_params";
     }
 
-    public static String actionArgsTypeNameFor(
+    public String actionArgsTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() + "__gqlv_action_args";
     }
 
-    public static String actionParamTypeNameFor(
+    public String actionParamTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectActionParameter oap,
             final SchemaType schemaType) {
@@ -91,36 +99,55 @@
         return objectTypeNameFor(owningType, schemaType) + "__" + objectFeature.asciiId() + "__" + oap.asciiId() + "__gqlv_action_parameter";
     }
 
-    public static String propertyTypeNameFor(
+    public String propertyTypeNameFor(
             final ObjectSpecification owningType,
             final OneToOneAssociation otoa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + otoa.asciiId() + "__gqlv_property";
     }
 
-    public static String propertyLobTypeNameFor(
+    public String propertyLobTypeNameFor(
             final ObjectSpecification owningType,
             final OneToOneAssociation otoa,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + otoa.asciiId() + "__gqlv_property_lob";
     }
 
-    public static String collectionTypeNameFor(
+    public String collectionTypeNameFor(
             final ObjectSpecification owningType,
             final OneToManyAssociation otma,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + otma.asciiId() + "__gqlv_collection";
     }
 
-    public static String memberTypeNameFor(
+    public String memberTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectMember objectMember,
             final SchemaType schemaType) {
         return objectTypeNameFor(owningType, schemaType) + "__" + objectMember.asciiId() + "__gqlv_member";
     }
 
-    private static String sanitized(final String name) {
-        return name.replace('.', '_').replace("#", "__").replace("()","");
+    // -- HELPER
+    
+    String sanitized(final String name) {
+        var result = name.replace('.', '_').replace("#", "__").replace("()", "");
+        result = hyphenedToCamelCase(result);
+        return result;    
+    }
+
+    /**
+     * Converts e.g. {@code a-b} to {@code aB}.
+     * Which allows namespaces that contain a hyphen like 
+     * {@code university.calc.calculator-hyphenated} to be referenced from QraphQL via
+     * {@code university.calc.calculatorHyphenated} say. 
+     */
+    private String hyphenedToCamelCase(String string) {
+      final int hyphenStart = string.indexOf("-");
+      return hyphenStart > 0
+        ? string.substring(0,hyphenStart) + Arrays.stream(string.substring(hyphenStart + 1).split("-"))
+              .map(word -> Character.toUpperCase(word.charAt(0)) + word.substring(1))
+              .collect(Collectors.joining())
+        : string;
     }
 
 }
diff --git a/viewers/graphql/model/src/test/java/org/apache/causeway/viewer/graphql/model/domain/TypeNamesTest.java b/viewers/graphql/model/src/test/java/org/apache/causeway/viewer/graphql/model/domain/TypeNamesTest.java
new file mode 100644
index 0000000..c575f4c
--- /dev/null
+++ b/viewers/graphql/model/src/test/java/org/apache/causeway/viewer/graphql/model/domain/TypeNamesTest.java
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.graphql.model.domain;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class TypeNamesTest {
+
+    @Test
+    void typeNameSanitized() {
+        assertEquals("a", TypeNames.sanitized("a")); // identity operation
+        assertEquals("aB", TypeNames.sanitized("aB")); // identity operation
+        assertEquals("Ab", TypeNames.sanitized("Ab")); // identity operation
+        
+        assertEquals("aB_Cd", TypeNames.sanitized("aB.Cd"));
+        assertEquals("a_b_cD", TypeNames.sanitized("a.b.c-d"));
+        assertEquals("aB_c_d", TypeNames.sanitized("a-b.c.d"));
+    }
+
+}
diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/CalculatorNameVariant.java b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/CalculatorNameVariant.java
new file mode 100644
index 0000000..e339867
--- /dev/null
+++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/domain/calc/CalculatorNameVariant.java
@@ -0,0 +1,195 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.graphql.viewer.test.domain.calc;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.URL;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZonedDateTime;
+import java.util.Locale;
+import java.util.UUID;
+
+import javax.annotation.Priority;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.causeway.applib.annotation.Action;
+import org.apache.causeway.applib.annotation.DomainService;
+import org.apache.causeway.applib.annotation.Optionality;
+import org.apache.causeway.applib.annotation.Parameter;
+import org.apache.causeway.applib.annotation.PriorityPrecedence;
+import org.apache.causeway.applib.annotation.SemanticsOf;
+
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+
+@Named("university.calc.calculator-hyphenated")
+@DomainService
+@Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class CalculatorNameVariant {
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public byte addBytes(final byte x, final byte y) {
+        return (byte)(x+y);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public int addByteWrappers(final Byte x, @Parameter(optionality = Optionality.OPTIONAL) final Byte y) {
+        return y != null ? x+y : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public short addShorts(final short x, final short y) {
+        return (short)(x+y);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public Short addShortWrappers(final Short x, @Parameter(optionality = Optionality.OPTIONAL) final Short y) {
+        return y != null ? (short)(x+y) : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public int addIntegers(final int x, final int y) {
+        return x+y;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public int addIntegerWrappers(final Integer x, @Parameter(optionality = Optionality.OPTIONAL) final Integer y) {
+        return y != null ? x+y : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public double addDoubles(final double x, final double y) {
+        return x+y;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public Double addDoubleWrappers(final Double x, @Parameter(optionality = Optionality.OPTIONAL) final Double y) {
+        return y != null ? x+y : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public float addFloats(final float x, final float y) {
+        return x+y;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public Float addFloatWrappers(final Float x, @Parameter(optionality = Optionality.OPTIONAL) final Float y) {
+        return y != null ? (float)(x+y) : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public BigInteger addBigIntegers(final BigInteger x, @Parameter(optionality = Optionality.OPTIONAL) final BigInteger y) {
+        return y != null ? x.add(y) : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public BigDecimal addBigDecimals(final BigDecimal x, @Parameter(optionality = Optionality.OPTIONAL) final BigDecimal y) {
+        return y != null ? x.add(y) : x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public LocalDate jdk8LocalPlusDays(final LocalDate date, final int numDays) {
+        return date.plusDays(numDays);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public OffsetDateTime jdk8OffsetPlusDaysAndHoursAndMinutes(final OffsetDateTime dateTime, final int numDays, final int numHours, final int numMinutes) {
+        return dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public ZonedDateTime jdk8ZonedPlusDaysAndHoursAndMinutes(final ZonedDateTime dateTime, final int numDays, final int numHours, final int numMinutes) {
+        return dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public OffsetTime jdk8OffsetPlusHoursAndMinutes(final OffsetTime time, final int numHours, final int numMinutes) {
+        return time.plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public LocalTime jdk8LocalPlusHoursAndMinutes(final LocalTime time, final int numHours, final int numMinutes) {
+        return time.plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public org.joda.time.LocalDate jodaLocalPlusDays(final org.joda.time.LocalDate date, final int numDays) {
+        return date.plusDays(numDays);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public org.joda.time.DateTime jodaPlusDaysAndHoursAndMinutes(final org.joda.time.DateTime dateTime, final int numDays, final int numHours, final int numMinutes) {
+        return dateTime.plusDays(numDays).plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public org.joda.time.LocalTime jodaLocalPlusHoursAndMinutes(final org.joda.time.LocalTime time, final int numHours, final int numMinutes) {
+        return time.plusHours(numHours).plusMinutes(numMinutes);
+    }
+
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public boolean and(final boolean x, final boolean y) {
+        return x & y;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public boolean or(final boolean x, final boolean y) {
+        return x | y;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public boolean not(final boolean x) {
+        return !x;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public Month nextMonth(final Month month) {
+        return month.nextMonth();
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public String concat(final String prefix, @Parameter(optionality = Optionality.OPTIONAL) final String suffix) {
+        return prefix + suffix;
+    }
+
+    @Action(semantics = SemanticsOf.SAFE)
+    public UUID someUuid() {
+        return UUID.fromString("91be0d2d-1752-4962-ad2c-89a7ef73a656");
+    }
+
+    @SneakyThrows
+    @Action(semantics = SemanticsOf.SAFE)
+    public URL someUrl() {
+        return new URL("https://causeway.apache.org");
+    }
+
+    @SneakyThrows
+    @Action(semantics = SemanticsOf.SAFE)
+    public Locale someLocale() {
+        return Locale.UK;
+    }
+
+}
diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated._.gql b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated._.gql
new file mode 100644
index 0000000..f070bff
--- /dev/null
+++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated._.gql
@@ -0,0 +1,11 @@
+{
+  rich {
+    university_calc_calculatorHyphenated {
+      addDoubles {
+        invoke(x: 1.1, y: 2.2) {
+          results
+        }
+      }
+    }
+  }
+}
diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated.approved.json b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated.approved.json
new file mode 100644
index 0000000..a545970
--- /dev/null
+++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.each.hyphenated.approved.json
@@ -0,0 +1,13 @@
+{
+  "data" : {
+    "rich" : {
+      "university_calc_calculatorHyphenated" : {
+        "addDoubles" : {
+          "invoke" : {
+            "results" : 3.3000000000000003
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.java b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.java
new file mode 100644
index 0000000..4df33ed
--- /dev/null
+++ b/viewers/graphql/test/src/test/java/org/apache/causeway/viewer/graphql/viewer/test/e2e/calc/CalculatorNameVariant_IntegTest.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.graphql.viewer.test.e2e.calc;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import org.apache.causeway.viewer.graphql.viewer.test.e2e.Abstract_IntegTest;
+
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.TestFactory;
+
+
+//NOT USING @Transactional since we are running server within same transaction otherwise
+@Order(30)
+public class CalculatorNameVariant_IntegTest extends Abstract_IntegTest {
+
+    @Override
+    @TestFactory
+    public Iterable<DynamicTest> each() throws IOException, URISyntaxException {
+        return super.each();
+    }
+
+}
diff --git a/viewers/graphql/test/src/test/resources/schema.gql b/viewers/graphql/test/src/test/resources/schema.gql
index e16867c..b81e3f9 100644
--- a/viewers/graphql/test/src/test/resources/schema.gql
+++ b/viewers/graphql/test/src/test/resources/schema.gql
@@ -113,6 +113,7 @@
   university_admin_AdminMenu: rich__university_admin_AdminMenu
   university_calc_Calculator: rich__university_calc_Calculator
   university_calc_I18nCalculator: rich__university_calc_I18nCalculator
+  university_calc_calculatorHyphenated: rich__university_calc_calculatorHyphenated
   university_dept_Department(object: rich__university_dept_Department__gqlv_input): rich__university_dept_Department
   university_dept_Departments: rich__university_dept_Departments
   university_dept_DeptHead(object: rich__university_dept_DeptHead__gqlv_input): rich__university_dept_DeptHead
@@ -164,6 +165,7 @@
   university_admin_AdminMenu: simple__university_admin_AdminMenu
   university_calc_Calculator: simple__university_calc_Calculator
   university_calc_I18nCalculator: simple__university_calc_I18nCalculator
+  university_calc_calculatorHyphenated: simple__university_calc_calculatorHyphenated
   university_dept_Department(object: simple__university_dept_Department__gqlv_input): simple__university_dept_Department
   university_dept_Departments: simple__university_dept_Departments
   university_dept_DeptHead(object: simple__university_dept_DeptHead__gqlv_input): simple__university_dept_DeptHead
@@ -225,6 +227,7 @@
   university_admin_AdminMenu: rich__university_admin_AdminMenu
   university_calc_Calculator: rich__university_calc_Calculator
   university_calc_I18nCalculator: rich__university_calc_I18nCalculator
+  university_calc_calculatorHyphenated: rich__university_calc_calculatorHyphenated
   university_dept_Department(object: rich__university_dept_Department__gqlv_input): rich__university_dept_Department
   university_dept_Departments: rich__university_dept_Departments
   university_dept_DeptHead(object: rich__university_dept_DeptHead__gqlv_input): rich__university_dept_DeptHead
@@ -3400,6 +3403,1222 @@
   a2: rich__university_calc_I18nCalculator__concat__a2__gqlv_action_parameter
 }
 
+type rich__university_calc_calculatorHyphenated {
+  "Add Big Decimals"
+  addBigDecimals: rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action
+  "Add Big Integers"
+  addBigIntegers: rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action
+  "Add Byte Wrappers"
+  addByteWrappers: rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action
+  "Add Bytes"
+  addBytes: rich__university_calc_calculatorHyphenated__addBytes__gqlv_action
+  "Add Double Wrappers"
+  addDoubleWrappers: rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action
+  "Add Doubles"
+  addDoubles: rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action
+  "Add Float Wrappers"
+  addFloatWrappers: rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action
+  "Add Floats"
+  addFloats: rich__university_calc_calculatorHyphenated__addFloats__gqlv_action
+  "Add Integer Wrappers"
+  addIntegerWrappers: rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action
+  "Add Integers"
+  addIntegers: rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action
+  "Add Short Wrappers"
+  addShortWrappers: rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action
+  "Add Shorts"
+  addShorts: rich__university_calc_calculatorHyphenated__addShorts__gqlv_action
+  "And"
+  and: rich__university_calc_calculatorHyphenated__and__gqlv_action
+  "Concat"
+  concat: rich__university_calc_calculatorHyphenated__concat__gqlv_action
+  "Jdk 8 Local Plus Days"
+  jdk8LocalPlusDays: rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action
+  "Jdk 8 Local Plus Hours And Minutes"
+  jdk8LocalPlusHoursAndMinutes: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action
+  "Jdk 8 Offset Plus Days And Hours And Minutes"
+  jdk8OffsetPlusDaysAndHoursAndMinutes: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action
+  "Jdk 8 Offset Plus Hours And Minutes"
+  jdk8OffsetPlusHoursAndMinutes: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action
+  "Jdk 8 Zoned Plus Days And Hours And Minutes"
+  jdk8ZonedPlusDaysAndHoursAndMinutes: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action
+  "Joda Local Plus Days"
+  jodaLocalPlusDays: rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action
+  "Joda Local Plus Hours And Minutes"
+  jodaLocalPlusHoursAndMinutes: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action
+  "Joda Plus Days And Hours And Minutes"
+  jodaPlusDaysAndHoursAndMinutes: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action
+  "Next Month"
+  nextMonth: rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action
+  "Not"
+  not: rich__university_calc_calculatorHyphenated__not__gqlv_action
+  "Or"
+  or: rich__university_calc_calculatorHyphenated__or__gqlv_action
+  "Some Locale"
+  someLocale: rich__university_calc_calculatorHyphenated__someLocale__gqlv_action
+  "Some Url"
+  someUrl: rich__university_calc_calculatorHyphenated__someUrl__gqlv_action
+  "Some Uuid"
+  someUuid: rich__university_calc_calculatorHyphenated__someUuid__gqlv_action
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: String!, y: String): rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_params
+  validate(x: String, y: String): String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_args {
+  x: String
+  y: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addBigDecimals__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addBigDecimals__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigDecimals__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: String, y: String): String
+  hidden(x: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: String!, y: String): rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_params
+  validate(x: String, y: String): String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_args {
+  x: String
+  y: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addBigIntegers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addBigIntegers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBigIntegers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: String, y: String): String
+  hidden(x: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Byte!, y: Byte): rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_params
+  validate(x: Byte, y: Byte): String
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_args {
+  x: Byte
+  y: Byte
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_args
+  results: Int
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addByteWrappers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addByteWrappers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Byte): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addByteWrappers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Byte, y: Byte): String
+  hidden(x: Byte): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Byte!, y: Byte!): rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_params
+  validate(x: Byte, y: Byte): String
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_args {
+  x: Byte
+  y: Byte
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_args
+  results: Byte
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addBytes__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addBytes__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Byte): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addBytes__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Byte, y: Byte): String
+  hidden(x: Byte): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float): rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_args {
+  x: Float
+  y: Float
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_args
+  results: Float
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addDoubleWrappers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addDoubleWrappers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubleWrappers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float!): rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_args {
+  x: Float
+  y: Float
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_args
+  results: Float
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addDoubles__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addDoubles__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addDoubles__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float): rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_args {
+  x: Float
+  y: Float
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_args
+  results: Float
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addFloatWrappers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addFloatWrappers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloatWrappers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Float!, y: Float!): rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_params
+  validate(x: Float, y: Float): String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_args {
+  x: Float
+  y: Float
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_args
+  results: Float
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addFloats__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addFloats__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addFloats__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Float, y: Float): String
+  hidden(x: Float): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Int!, y: Int): rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_params
+  validate(x: Int, y: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_args {
+  x: Int
+  y: Int
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_args
+  results: Int
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addIntegerWrappers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addIntegerWrappers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Int): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegerWrappers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Int, y: Int): String
+  hidden(x: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Int!, y: Int!): rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_params
+  validate(x: Int, y: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_args {
+  x: Int
+  y: Int
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_args
+  results: Int
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addIntegers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addIntegers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Int): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addIntegers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Int, y: Int): String
+  hidden(x: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Short!, y: Short): rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_params
+  validate(x: Short, y: Short): String
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_args {
+  x: Short
+  y: Short
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_args
+  results: Short
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addShortWrappers__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addShortWrappers__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Short): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShortWrappers__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Short, y: Short): String
+  hidden(x: Short): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Short!, y: Short!): rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_params
+  validate(x: Short, y: Short): String
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_args {
+  x: Short
+  y: Short
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_args
+  results: Short
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__addShorts__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__addShorts__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Short): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__addShorts__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Short, y: Short): String
+  hidden(x: Short): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__and__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Boolean!, y: Boolean!): rich__university_calc_calculatorHyphenated__and__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__and__gqlv_action_params
+  validate(x: Boolean, y: Boolean): String
+}
+
+type rich__university_calc_calculatorHyphenated__and__gqlv_action_args {
+  x: Boolean
+  y: Boolean
+}
+
+type rich__university_calc_calculatorHyphenated__and__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__and__gqlv_action_args
+  results: Boolean
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__and__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__and__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__and__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__and__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Boolean): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__and__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Boolean, y: Boolean): String
+  hidden(x: Boolean): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__concat__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(prefix: String!, suffix: String): rich__university_calc_calculatorHyphenated__concat__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__concat__gqlv_action_params
+  validate(prefix: String, suffix: String): String
+}
+
+type rich__university_calc_calculatorHyphenated__concat__gqlv_action_args {
+  prefix: String
+  suffix: String
+}
+
+type rich__university_calc_calculatorHyphenated__concat__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__concat__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__concat__gqlv_action_params {
+  "Prefix"
+  prefix: rich__university_calc_calculatorHyphenated__concat__prefix__gqlv_action_parameter
+  "Suffix"
+  suffix: rich__university_calc_calculatorHyphenated__concat__suffix__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__concat__prefix__gqlv_action_parameter {
+  datatype: String
+  disabled(prefix: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__concat__suffix__gqlv_action_parameter {
+  datatype: String
+  disabled(prefix: String, suffix: String): String
+  hidden(prefix: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__date__gqlv_action_parameter {
+  datatype: String
+  disabled(date: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(date: String!, numDays: Int!): rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_params
+  validate(date: String, numDays: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_args {
+  date: String
+  numDays: Int
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__gqlv_action_params {
+  "Date"
+  date: rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__date__gqlv_action_parameter
+  "Num Days"
+  numDays: rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__numDays__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusDays__numDays__gqlv_action_parameter {
+  datatype: String
+  disabled(date: String, numDays: Int): String
+  hidden(date: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(numHours: Int!, numMinutes: Int!, time: String!): rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_params
+  validate(numHours: Int, numMinutes: Int, time: String): String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_args {
+  numHours: Int
+  numMinutes: Int
+  time: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__gqlv_action_params {
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__numMinutes__gqlv_action_parameter
+  "Time"
+  time: rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__time__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, time: String): String
+  hidden(time: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, numMinutes: Int, time: String): String
+  hidden(numHours: Int, time: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8LocalPlusHoursAndMinutes__time__gqlv_action_parameter {
+  datatype: String
+  disabled(time: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: DateTime): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(dateTime: DateTime!, numDays: Int!, numHours: Int!, numMinutes: Int!): rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_params
+  validate(dateTime: DateTime, numDays: Int, numHours: Int, numMinutes: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_args {
+  dateTime: DateTime
+  numDays: Int
+  numHours: Int
+  numMinutes: Int
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_args
+  results: DateTime
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__gqlv_action_params {
+  "Date Time"
+  dateTime: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter
+  "Num Days"
+  numDays: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: DateTime, numDays: Int): String
+  hidden(dateTime: DateTime): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: DateTime, numDays: Int, numHours: Int): String
+  hidden(dateTime: DateTime, numDays: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: DateTime, numDays: Int, numHours: Int, numMinutes: Int): String
+  hidden(dateTime: DateTime, numDays: Int, numHours: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(numHours: Int!, numMinutes: Int!, time: Time!): rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_params
+  validate(numHours: Int, numMinutes: Int, time: Time): String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_args {
+  numHours: Int
+  numMinutes: Int
+  time: Time
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_args
+  results: Time
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__gqlv_action_params {
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__numMinutes__gqlv_action_parameter
+  "Time"
+  time: rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__time__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, time: Time): String
+  hidden(time: Time): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, numMinutes: Int, time: Time): String
+  hidden(numHours: Int, time: Time): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8OffsetPlusHoursAndMinutes__time__gqlv_action_parameter {
+  datatype: String
+  disabled(time: Time): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(dateTime: String!, numDays: Int!, numHours: Int!, numMinutes: Int!): rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_params
+  validate(dateTime: String, numDays: Int, numHours: Int, numMinutes: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_args {
+  dateTime: String
+  numDays: Int
+  numHours: Int
+  numMinutes: Int
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__gqlv_action_params {
+  "Date Time"
+  dateTime: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter
+  "Num Days"
+  numDays: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int): String
+  hidden(dateTime: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int, numHours: Int): String
+  hidden(dateTime: String, numDays: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jdk8ZonedPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int, numHours: Int, numMinutes: Int): String
+  hidden(dateTime: String, numDays: Int, numHours: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__date__gqlv_action_parameter {
+  datatype: String
+  disabled(date: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(date: String!, numDays: Int!): rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_params
+  validate(date: String, numDays: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_args {
+  date: String
+  numDays: Int
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__gqlv_action_params {
+  "Date"
+  date: rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__date__gqlv_action_parameter
+  "Num Days"
+  numDays: rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__numDays__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusDays__numDays__gqlv_action_parameter {
+  datatype: String
+  disabled(date: String, numDays: Int): String
+  hidden(date: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(numHours: Int!, numMinutes: Int!, time: String!): rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_params
+  validate(numHours: Int, numMinutes: Int, time: String): String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_args {
+  numHours: Int
+  numMinutes: Int
+  time: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__gqlv_action_params {
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__numMinutes__gqlv_action_parameter
+  "Time"
+  time: rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__time__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, time: String): String
+  hidden(time: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(numHours: Int, numMinutes: Int, time: String): String
+  hidden(numHours: Int, time: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaLocalPlusHoursAndMinutes__time__gqlv_action_parameter {
+  datatype: String
+  disabled(time: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(dateTime: String!, numDays: Int!, numHours: Int!, numMinutes: Int!): rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_params
+  validate(dateTime: String, numDays: Int, numHours: Int, numMinutes: Int): String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_args {
+  dateTime: String
+  numDays: Int
+  numHours: Int
+  numMinutes: Int
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_args
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__gqlv_action_params {
+  "Date Time"
+  dateTime: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__dateTime__gqlv_action_parameter
+  "Num Days"
+  numDays: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter
+  "Num Hours"
+  numHours: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter
+  "Num Minutes"
+  numMinutes: rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numDays__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int): String
+  hidden(dateTime: String): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numHours__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int, numHours: Int): String
+  hidden(dateTime: String, numDays: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__jodaPlusDaysAndHoursAndMinutes__numMinutes__gqlv_action_parameter {
+  datatype: String
+  disabled(dateTime: String, numDays: Int, numHours: Int, numMinutes: Int): String
+  hidden(dateTime: String, numDays: Int, numHours: Int): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(month: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum!): rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_params
+  validate(month: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum): String
+}
+
+type rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_args {
+  month: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum
+}
+
+type rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_args
+  results: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__nextMonth__gqlv_action_params {
+  "Month"
+  month: rich__university_calc_calculatorHyphenated__nextMonth__month__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__nextMonth__month__gqlv_action_parameter {
+  choices: [rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum]
+  datatype: String
+  disabled(month: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__not__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Boolean!): rich__university_calc_calculatorHyphenated__not__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__not__gqlv_action_params
+  validate(x: Boolean): String
+}
+
+type rich__university_calc_calculatorHyphenated__not__gqlv_action_args {
+  x: Boolean
+}
+
+type rich__university_calc_calculatorHyphenated__not__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__not__gqlv_action_args
+  results: Boolean
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__not__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__not__x__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__not__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Boolean): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__or__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke(x: Boolean!, y: Boolean!): rich__university_calc_calculatorHyphenated__or__gqlv_action_invoke
+  "Parameters of this action"
+  params: rich__university_calc_calculatorHyphenated__or__gqlv_action_params
+  validate(x: Boolean, y: Boolean): String
+}
+
+type rich__university_calc_calculatorHyphenated__or__gqlv_action_args {
+  x: Boolean
+  y: Boolean
+}
+
+type rich__university_calc_calculatorHyphenated__or__gqlv_action_invoke {
+  "Arguments used to invoke this action"
+  args: rich__university_calc_calculatorHyphenated__or__gqlv_action_args
+  results: Boolean
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__or__gqlv_action_params {
+  "X"
+  x: rich__university_calc_calculatorHyphenated__or__x__gqlv_action_parameter
+  "Y"
+  y: rich__university_calc_calculatorHyphenated__or__y__gqlv_action_parameter
+}
+
+type rich__university_calc_calculatorHyphenated__or__x__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Boolean): String
+  hidden: Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__or__y__gqlv_action_parameter {
+  datatype: String
+  disabled(x: Boolean, y: Boolean): String
+  hidden(x: Boolean): Boolean
+  validity: String
+}
+
+type rich__university_calc_calculatorHyphenated__someLocale__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke: rich__university_calc_calculatorHyphenated__someLocale__gqlv_action_invoke
+  validate: String
+}
+
+type rich__university_calc_calculatorHyphenated__someLocale__gqlv_action_invoke {
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__someUrl__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke: rich__university_calc_calculatorHyphenated__someUrl__gqlv_action_invoke
+  validate: String
+}
+
+type rich__university_calc_calculatorHyphenated__someUrl__gqlv_action_invoke {
+  results: String
+  target: String
+}
+
+type rich__university_calc_calculatorHyphenated__someUuid__gqlv_action {
+  disabled: String
+  hidden: Boolean
+  invoke: rich__university_calc_calculatorHyphenated__someUuid__gqlv_action_invoke
+  validate: String
+}
+
+type rich__university_calc_calculatorHyphenated__someUuid__gqlv_action_invoke {
+  results: UUID
+  target: String
+}
+
 "University department specializing in a field of study"
 type rich__university_dept_Department {
   "Object metadata"
@@ -4896,6 +6115,65 @@
   concat(a1: String!, a2: String!): String
 }
 
+type simple__university_calc_calculatorHyphenated {
+  "Add Big Decimals"
+  addBigDecimals(x: String!, y: String): String
+  "Add Big Integers"
+  addBigIntegers(x: String!, y: String): String
+  "Add Byte Wrappers"
+  addByteWrappers(x: Byte!, y: Byte): Int
+  "Add Bytes"
+  addBytes(x: Byte!, y: Byte!): Byte
+  "Add Double Wrappers"
+  addDoubleWrappers(x: Float!, y: Float): Float
+  "Add Doubles"
+  addDoubles(x: Float!, y: Float!): Float
+  "Add Float Wrappers"
+  addFloatWrappers(x: Float!, y: Float): Float
+  "Add Floats"
+  addFloats(x: Float!, y: Float!): Float
+  "Add Integer Wrappers"
+  addIntegerWrappers(x: Int!, y: Int): Int
+  "Add Integers"
+  addIntegers(x: Int!, y: Int!): Int
+  "Add Short Wrappers"
+  addShortWrappers(x: Short!, y: Short): Short
+  "Add Shorts"
+  addShorts(x: Short!, y: Short!): Short
+  "And"
+  and(x: Boolean!, y: Boolean!): Boolean
+  "Concat"
+  concat(prefix: String!, suffix: String): String
+  "Jdk 8 Local Plus Days"
+  jdk8LocalPlusDays(date: String!, numDays: Int!): String
+  "Jdk 8 Local Plus Hours And Minutes"
+  jdk8LocalPlusHoursAndMinutes(numHours: Int!, numMinutes: Int!, time: String!): String
+  "Jdk 8 Offset Plus Days And Hours And Minutes"
+  jdk8OffsetPlusDaysAndHoursAndMinutes(dateTime: DateTime!, numDays: Int!, numHours: Int!, numMinutes: Int!): DateTime
+  "Jdk 8 Offset Plus Hours And Minutes"
+  jdk8OffsetPlusHoursAndMinutes(numHours: Int!, numMinutes: Int!, time: Time!): Time
+  "Jdk 8 Zoned Plus Days And Hours And Minutes"
+  jdk8ZonedPlusDaysAndHoursAndMinutes(dateTime: String!, numDays: Int!, numHours: Int!, numMinutes: Int!): String
+  "Joda Local Plus Days"
+  jodaLocalPlusDays(date: String!, numDays: Int!): String
+  "Joda Local Plus Hours And Minutes"
+  jodaLocalPlusHoursAndMinutes(numHours: Int!, numMinutes: Int!, time: String!): String
+  "Joda Plus Days And Hours And Minutes"
+  jodaPlusDaysAndHoursAndMinutes(dateTime: String!, numDays: Int!, numHours: Int!, numMinutes: Int!): String
+  "Next Month"
+  nextMonth(month: rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum!): rich__org_apache_causeway_viewer_graphql_viewer_test_domain_calc_Month__gqlv_enum
+  "Not"
+  not(x: Boolean!): Boolean
+  "Or"
+  or(x: Boolean!, y: Boolean!): Boolean
+  "Some Locale"
+  someLocale: String
+  "Some Url"
+  someUrl: String
+  "Some Uuid"
+  someUuid: UUID
+}
+
 "University department specializing in a field of study"
 type simple__university_dept_Department {
   "Object metadata"
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/login/SignInPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
index 3cecaef..e779191 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/login/SignInPanelAbstract.java
@@ -37,9 +37,9 @@
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.cookies.CookieUtils;
 
+import org.apache.causeway.applib.value.semantics.TimeZoneChoiceProvider;
 import org.apache.causeway.commons.internal.base._Strings;
 import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
-import org.apache.causeway.core.metamodel.valuesemantics.temporal.ZonedDateTimeValueSemantics;
 import org.apache.causeway.viewer.wicket.ui.util.Wkt;
 
 import lombok.Getter;
@@ -266,7 +266,7 @@
 
             add(Wkt.dropDownChoice("timezone",
                     new PropertyModel<ZoneId>(SignInPanelAbstract.this, "timezone"),
-                    new ZonedDateTimeValueSemantics().getAvailableZoneIds())
+                    getTimeZoneChoiceProvider().getAvailableZoneIds())
                 .setRequired(true)
                 .setMarkupId(TIME_ZONE_SELECT));
 
@@ -309,6 +309,11 @@
             }
         }
 
+        private TimeZoneChoiceProvider getTimeZoneChoiceProvider() {
+            return getMetaModelContext().getServiceRegistry().lookupService(TimeZoneChoiceProvider.class)
+                    .orElseGet(TimeZoneChoiceProvider::fallback);
+        }
+        
     }
 
     /**