You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2026/05/13 21:30:09 UTC

(juneau) 17/21: refactor: physical git mv of 7 bean-runtime types into commons.bean (TODO-5 Phase C Task 5 Step G — DONE)

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

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

commit 71713c478f6744b7a2d4179e33818265d9134c99
Author: James Bognar <ja...@jamesbog-ltmjqf2.internal.salesforce.com>
AuthorDate: Wed May 13 11:14:05 2026 -0400

    refactor: physical git mv of 7 bean-runtime types into commons.bean (TODO-5 Phase C Task 5 Step G — DONE)
    
    Move BeanMap, BeanMapEntry, BeanMeta, BeanPropertyMeta, BeanPropertyValue,
    BeanPropertyConsumer, BeanProxyInvocationHandler from juneau-marshall to
    juneau-commons. juneau-commons compiles standalone with no juneau-marshall
    dependency.
    
    Final blocker cleanup:
    - BeanPropertyValue.getClassMeta() returns BeanTypeInfo<?> (was ClassMeta<?>)
    - BeanPropertyMeta.getBeanRegistry() returns BeanRegistryLookup (was BeanRegistry)
    - BeanMeta.create() accepts BeanTypeInfo<T> (was ClassMeta<T>)
    - BeanMeta.getMarshallingContext() returns Object; ClassMeta overrides covariantly
      with MarshallingContext so existing call sites compile unchanged
    - New commons SPIs BeanMetaInitializer + BeanPropertyPostProcessor on
      BeanConfigContext replace direct static calls to the marshalling-side helpers
    
    148 marshalling-side files updated to import from org.apache.juneau.commons.bean.
    Full Maven build + test suite green.
    
    Co-authored-by: Cursor <cu...@cursor.com>
---
 .../juneau/assertions/FluentBeanAssertion.java     |   1 +
 .../juneau/assertions/FluentBeanListAssertion.java |   1 +
 .../juneau/commons/bean/BeanConfigContext.java     |  54 +++++++
 .../org/apache/juneau/commons/bean}/BeanMap.java   |   6 +-
 .../apache/juneau/commons/bean}/BeanMapEntry.java  |   4 +-
 .../org/apache/juneau/commons/bean}/BeanMeta.java  |  78 +++++-----
 .../juneau/commons/bean/BeanMetaInitializer.java   | 168 +++++++++++++++++++++
 .../juneau/commons/bean}/BeanPropertyConsumer.java |   3 +-
 .../juneau/commons/bean}/BeanPropertyMeta.java     |  33 ++--
 .../commons/bean/BeanPropertyPostProcessor.java    |  55 +++++++
 .../juneau/commons/bean}/BeanPropertyValue.java    |  21 ++-
 .../commons/bean}/BeanProxyInvocationHandler.java  |   4 +-
 .../apache/juneau/commons/bean/BeanTypeInfo.java   |  25 +++
 .../java/org/apache/juneau/jena/RdfBeanMeta.java   |   2 +
 .../apache/juneau/jena/RdfBeanPropertyMeta.java    |   1 +
 .../org/apache/juneau/jena/RdfMetaProvider.java    |   2 +
 .../java/org/apache/juneau/jena/RdfParser.java     |   2 +
 .../org/apache/juneau/jena/RdfParserSession.java   |   3 +
 .../java/org/apache/juneau/jena/RdfSerializer.java |   2 +
 .../org/apache/juneau/jena/RdfStreamParser.java    |   2 +
 .../apache/juneau/jena/RdfStreamParserSession.java |   3 +
 .../apache/juneau/jena/RdfStreamSerializer.java    |   2 +
 .../main/java/org/apache/juneau/BeanMapLoader.java |   1 +
 .../src/main/java/org/apache/juneau/ClassMeta.java |  19 ++-
 .../java/org/apache/juneau/ExtendedBeanMeta.java   |   1 +
 .../apache/juneau/ExtendedBeanPropertyMeta.java    |   1 +
 .../juneau/MarshalledBeanMetaInitializer.java      |  88 ++++-------
 .../juneau/MarshalledPropertyPostProcessor.java    |  19 ++-
 .../java/org/apache/juneau/MarshallingContext.java |   2 +
 .../apache/juneau/MarshallingTraverseSession.java  |   1 +
 .../apache/juneau/bson/BsonBeanPropertyMeta.java   |   1 +
 .../org/apache/juneau/bson/BsonMetaProvider.java   |   1 +
 .../java/org/apache/juneau/bson/BsonParser.java    |   1 +
 .../org/apache/juneau/bson/BsonParserSession.java  |   2 +
 .../org/apache/juneau/bson/BsonSerializer.java     |   1 +
 .../apache/juneau/bson/BsonSerializerSession.java  |   7 +-
 .../apache/juneau/cbor/CborBeanPropertyMeta.java   |   1 +
 .../org/apache/juneau/cbor/CborMetaProvider.java   |   1 +
 .../java/org/apache/juneau/cbor/CborParser.java    |   1 +
 .../org/apache/juneau/cbor/CborParserSession.java  |   2 +
 .../org/apache/juneau/cbor/CborSerializer.java     |   1 +
 .../apache/juneau/cbor/CborSerializerSession.java  |   7 +-
 .../org/apache/juneau/collections/JsonMap.java     |   1 +
 .../org/apache/juneau/csv/CsvBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/csv/CsvMetaProvider.java     |   1 +
 .../main/java/org/apache/juneau/csv/CsvParser.java |   1 +
 .../org/apache/juneau/csv/CsvParserSession.java    |   1 +
 .../java/org/apache/juneau/csv/CsvSerializer.java  |   1 +
 .../apache/juneau/csv/CsvSerializerSession.java    |   2 +
 .../apache/juneau/hjson/HjsonBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/hjson/HjsonMetaProvider.java |   1 +
 .../java/org/apache/juneau/hjson/HjsonParser.java  |   1 +
 .../apache/juneau/hjson/HjsonParserSession.java    |   1 +
 .../org/apache/juneau/hjson/HjsonSerializer.java   |   1 +
 .../juneau/hjson/HjsonSerializerSession.java       |   2 +
 .../apache/juneau/hocon/HoconBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/hocon/HoconMetaProvider.java |   1 +
 .../java/org/apache/juneau/hocon/HoconParser.java  |   1 +
 .../apache/juneau/hocon/HoconParserSession.java    |   1 +
 .../org/apache/juneau/hocon/HoconSerializer.java   |   1 +
 .../juneau/hocon/HoconSerializerSession.java       |   2 +
 .../apache/juneau/html/HtmlBeanPropertyMeta.java   |   1 +
 .../org/apache/juneau/html/HtmlMetaProvider.java   |   1 +
 .../java/org/apache/juneau/html/HtmlParser.java    |   1 +
 .../org/apache/juneau/html/HtmlParserSession.java  |   3 +
 .../org/apache/juneau/html/HtmlSerializer.java     |   1 +
 .../org/apache/juneau/ini/IniBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/ini/IniMetaProvider.java     |   1 +
 .../main/java/org/apache/juneau/ini/IniParser.java |   1 +
 .../org/apache/juneau/ini/IniParserSession.java    |   1 +
 .../java/org/apache/juneau/ini/IniSerializer.java  |   1 +
 .../apache/juneau/ini/IniSerializerSession.java    |   2 +
 .../apache/juneau/internal/DelegateBeanMap.java    |   3 +
 .../apache/juneau/jcs/JcsSerializerSession.java    |   2 +
 .../apache/juneau/json/JsonBeanPropertyMeta.java   |   1 +
 .../org/apache/juneau/json/JsonMetaProvider.java   |   1 +
 .../java/org/apache/juneau/json/JsonParser.java    |   1 +
 .../org/apache/juneau/json/JsonParserSession.java  |   2 +
 .../apache/juneau/json/JsonSchemaSerializer.java   |   1 +
 .../juneau/json/JsonSchemaSerializerSession.java   |   1 +
 .../org/apache/juneau/json/JsonSerializer.java     |   1 +
 .../apache/juneau/json/JsonSerializerSession.java  |   2 +
 .../jsonschema/JsonSchemaBeanPropertyMeta.java     |   1 +
 .../juneau/jsonschema/JsonSchemaGenerator.java     |   1 +
 .../jsonschema/JsonSchemaGeneratorSession.java     |   2 +
 .../juneau/jsonschema/JsonSchemaMetaProvider.java  |   1 +
 .../juneau/markdown/MarkdownBeanPropertyMeta.java  |   1 +
 .../markdown/MarkdownDocSerializerSession.java     |   1 +
 .../juneau/markdown/MarkdownMetaProvider.java      |   1 +
 .../org/apache/juneau/markdown/MarkdownParser.java |   1 +
 .../juneau/markdown/MarkdownParserSession.java     |   1 +
 .../apache/juneau/markdown/MarkdownSerializer.java |   1 +
 .../juneau/markdown/MarkdownSerializerSession.java |   3 +
 .../juneau/msgpack/MsgPackBeanPropertyMeta.java    |   1 +
 .../apache/juneau/msgpack/MsgPackMetaProvider.java |   1 +
 .../org/apache/juneau/msgpack/MsgPackParser.java   |   1 +
 .../juneau/msgpack/MsgPackParserSession.java       |   2 +
 .../apache/juneau/msgpack/MsgPackSerializer.java   |   1 +
 .../juneau/msgpack/MsgPackSerializerSession.java   |   7 +-
 .../juneau/oapi/OpenApiBeanPropertyMeta.java       |   1 +
 .../apache/juneau/oapi/OpenApiMetaProvider.java    |   1 +
 .../java/org/apache/juneau/oapi/OpenApiParser.java |   1 +
 .../org/apache/juneau/oapi/OpenApiSerializer.java  |   1 +
 .../apache/juneau/objecttools/ObjectSearcher.java  |   1 +
 .../apache/juneau/objecttools/ObjectViewer.java    |   1 +
 .../juneau/parquet/ParquetBeanPropertyMeta.java    |   1 +
 .../apache/juneau/parquet/ParquetMetaProvider.java |   1 +
 .../org/apache/juneau/parquet/ParquetParser.java   |   1 +
 .../juneau/parquet/ParquetSchemaBuilder.java       |   2 +-
 .../apache/juneau/parquet/ParquetSerializer.java   |   1 +
 .../juneau/parquet/ParquetSerializerSession.java   |   2 +-
 .../org/apache/juneau/parser/ParserListener.java   |   1 +
 .../org/apache/juneau/parser/ParserSession.java    |   4 +-
 .../plaintext/PlainTextBeanPropertyMeta.java       |   1 +
 .../juneau/plaintext/PlainTextMetaProvider.java    |   1 +
 .../apache/juneau/plaintext/PlainTextParser.java   |   1 +
 .../juneau/plaintext/PlainTextSerializer.java      |   1 +
 .../apache/juneau/proto/ProtoBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/proto/ProtoMetaProvider.java |   1 +
 .../java/org/apache/juneau/proto/ProtoParser.java  |   1 +
 .../apache/juneau/proto/ProtoParserSession.java    |   1 +
 .../org/apache/juneau/proto/ProtoSerializer.java   |   1 +
 .../juneau/proto/ProtoSerializerSession.java       |   2 +
 .../juneau/serializer/SerializerListener.java      |   1 +
 .../juneau/serializer/SerializerSession.java       |   6 +-
 .../juneau/soap/SoapXmlBeanPropertyMeta.java       |   1 +
 .../apache/juneau/soap/SoapXmlMetaProvider.java    |   1 +
 .../org/apache/juneau/soap/SoapXmlSerializer.java  |   1 +
 .../org/apache/juneau/toml/TomlParserSession.java  |   2 +
 .../apache/juneau/toml/TomlSerializerSession.java  |   2 +
 .../org/apache/juneau/uon/UonBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/uon/UonMetaProvider.java     |   1 +
 .../main/java/org/apache/juneau/uon/UonParser.java |   1 +
 .../org/apache/juneau/uon/UonParserSession.java    |   2 +
 .../java/org/apache/juneau/uon/UonSerializer.java  |   1 +
 .../apache/juneau/uon/UonSerializerSession.java    |   2 +
 .../urlencoding/UrlEncodingBeanPropertyMeta.java   |   1 +
 .../urlencoding/UrlEncodingMetaProvider.java       |   1 +
 .../juneau/urlencoding/UrlEncodingParser.java      |   1 +
 .../urlencoding/UrlEncodingParserSession.java      |   2 +
 .../juneau/urlencoding/UrlEncodingSerializer.java  |   1 +
 .../urlencoding/UrlEncodingSerializerSession.java  |   2 +
 .../java/org/apache/juneau/xml/XmlBeanMeta.java    |   2 +
 .../org/apache/juneau/xml/XmlBeanPropertyMeta.java |   1 +
 .../org/apache/juneau/xml/XmlMetaProvider.java     |   2 +
 .../main/java/org/apache/juneau/xml/XmlParser.java |   2 +
 .../org/apache/juneau/xml/XmlParserSession.java    |   3 +
 .../java/org/apache/juneau/xml/XmlSerializer.java  |   2 +
 .../apache/juneau/xml/XmlSerializerSession.java    |   6 +-
 .../org/apache/juneau/yaml/YamlParserSession.java  |   2 +
 .../apache/juneau/yaml/YamlSerializerSession.java  |   2 +
 .../java/org/apache/juneau/rest/RestRequest.java   |   1 +
 .../org/apache/juneau/BeanPropertyValue_Test.java  |   1 +
 .../juneau/BeanProxyInvocationHandler_Test.java    |   1 +
 .../apache/juneau/commons/bean/BeanMeta_Test.java  |   2 +
 .../juneau/jsonschema/JsonSchemaGeneratorTest.java |   1 +
 todo/TODO-5-bean-runtime-types-to-commons.md       |  57 +++++++
 157 files changed, 721 insertions(+), 132 deletions(-)

diff --git a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
index 0b2075aa70..0d16dbae2a 100644
--- a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
+++ b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
@@ -24,6 +24,7 @@ import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Used for fluent assertion calls against Java beans.
diff --git a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
index aaec64c581..cc1fa7ff93 100644
--- a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
+++ b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
@@ -24,6 +24,7 @@ import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Used for fluent assertion calls against lists of beans.
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanConfigContext.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanConfigContext.java
index 63ee537c74..6e6350ce18 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanConfigContext.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanConfigContext.java
@@ -118,6 +118,8 @@ public final class BeanConfigContext {
 	private final BeanStore beanStore;
 	private final AnnotationProvider annotationProvider;
 	private final Predicate<ClassInfo> notABeanPredicate;
+	private final BeanMetaInitializer beanMetaInitializer;
+	private final BeanPropertyPostProcessor beanPropertyPostProcessor;
 
 	private BeanConfigContext(Builder b) {
 		beanClassVisibility = b.beanClassVisibility;
@@ -147,6 +149,8 @@ public final class BeanConfigContext {
 		beanStore = b.beanStore;
 		annotationProvider = b.annotationProvider;
 		notABeanPredicate = b.notABeanPredicate;
+		beanMetaInitializer = b.beanMetaInitializer;
+		beanPropertyPostProcessor = b.beanPropertyPostProcessor;
 	}
 
 	/**
@@ -358,6 +362,30 @@ public final class BeanConfigContext {
 	 */
 	public AnnotationProvider getAnnotationProvider() { return annotationProvider; }
 
+	/**
+	 * Returns the {@link BeanMetaInitializer} SPI hook used during {@link BeanMeta} construction.
+	 *
+	 * <p>
+	 * On the commons-side path this is {@link BeanMetaInitializer#NOOP} (no marshalling-side help); on the
+	 * marshalling-side path, {@code MarshallingContext} wires its own implementation that reads
+	 * {@code @Marshalled} / {@code @BeanType} annotations and builds {@code BeanRegistry} instances.
+	 *
+	 * @return The bean-meta initializer.  Never <jk>null</jk>.
+	 */
+	public BeanMetaInitializer getBeanMetaInitializer() { return beanMetaInitializer; }
+
+	/**
+	 * Returns the {@link BeanPropertyPostProcessor} SPI hook used during {@link BeanPropertyMeta} construction.
+	 *
+	 * <p>
+	 * On the commons-side path this is {@link BeanPropertyPostProcessor#NOOP} (no swap-aware transforms or
+	 * {@code @MarshalledProp} / {@code @Swap} / {@code @Uri} reads); on the marshalling-side path,
+	 * {@code MarshallingContext} wires its own implementation.
+	 *
+	 * @return The bean-property post-processor.  Never <jk>null</jk>.
+	 */
+	public BeanPropertyPostProcessor getBeanPropertyPostProcessor() { return beanPropertyPostProcessor; }
+
 	/**
 	 * Returns <jk>true</jk> if the specified class is excluded from bean detection.
 	 *
@@ -427,6 +455,8 @@ public final class BeanConfigContext {
 		private BeanStore beanStore;
 		private AnnotationProvider annotationProvider = AnnotationProvider.INSTANCE;
 		private Predicate<ClassInfo> notABeanPredicate;
+		private BeanMetaInitializer beanMetaInitializer = BeanMetaInitializer.NOOP;
+		private BeanPropertyPostProcessor beanPropertyPostProcessor = BeanPropertyPostProcessor.NOOP;
 
 		private Builder() {}
 
@@ -458,6 +488,8 @@ public final class BeanConfigContext {
 			beanStore = src.beanStore;
 			annotationProvider = src.annotationProvider;
 			notABeanPredicate = src.notABeanPredicate;
+			beanMetaInitializer = src.beanMetaInitializer;
+			beanPropertyPostProcessor = src.beanPropertyPostProcessor;
 		}
 
 		/**
@@ -733,5 +765,27 @@ public final class BeanConfigContext {
 		 * @return This object.
 		 */
 		public Builder notABeanPredicate(Predicate<ClassInfo> value) { notABeanPredicate = value; return this; }
+
+		/**
+		 * Sets the {@link BeanMetaInitializer} SPI hook for marshalling-side {@link BeanMeta} construction.
+		 *
+		 * <p>
+		 * Pass <jk>null</jk> to reset to {@link BeanMetaInitializer#NOOP} (commons-side default).
+		 *
+		 * @param value The initializer.  May be <jk>null</jk>.
+		 * @return This object.
+		 */
+		public Builder beanMetaInitializer(BeanMetaInitializer value) { beanMetaInitializer = value == null ? BeanMetaInitializer.NOOP : value; return this; }
+
+		/**
+		 * Sets the {@link BeanPropertyPostProcessor} SPI hook for marshalling-side bean-property post-processing.
+		 *
+		 * <p>
+		 * Pass <jk>null</jk> to reset to {@link BeanPropertyPostProcessor#NOOP} (commons-side default).
+		 *
+		 * @param value The post-processor.  May be <jk>null</jk>.
+		 * @return This object.
+		 */
+		public Builder beanPropertyPostProcessor(BeanPropertyPostProcessor value) { beanPropertyPostProcessor = value == null ? BeanPropertyPostProcessor.NOOP : value; return this; }
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMap.java
similarity index 99%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMap.java
index 37f1ad92a9..16ef14855e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMap.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import static org.apache.juneau.commons.utils.ClassUtils.*;
 import static org.apache.juneau.commons.utils.CollectionUtils.*;
@@ -121,7 +121,7 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 	 * @param bean The bean to wrap inside this map.
 	 * @param meta The metadata associated with the bean class.
 	 */
-	protected BeanMap(T bean, BeanMeta<T> meta) {
+	public BeanMap(T bean, BeanMeta<T> meta) {
 		this.bean = bean;
 		this.meta = meta;
 		if (ne(meta.getConstructorArgs()))
@@ -141,7 +141,7 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 	 *
 	 * @param value The bean session that produced this bean map.  Typically a {@link org.apache.juneau.MarshallingSession}.
 	 */
-	protected void setMarshallingSession(BeanSession value) {
+	public void setMarshallingSession(BeanSession value) {
 		this.session = value;
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapEntry.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
similarity index 97%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapEntry.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
index 548d390066..492dae6366 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapEntry.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java
@@ -14,9 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import java.util.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Represents a single entry in a bean map.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMeta.java
similarity index 95%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMeta.java
index 772fdb35dd..34677d7142 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMeta.java
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
-import static org.apache.juneau.BeanMeta.MethodType.*;
+import static org.apache.juneau.commons.bean.BeanMeta.MethodType.*;
 import static org.apache.juneau.commons.reflect.AnnotationTraversal.*;
 import static org.apache.juneau.commons.reflect.ReflectionUtils.*;
 import static org.apache.juneau.commons.utils.AssertionUtils.*;
@@ -87,8 +87,8 @@ public class BeanMeta<T> {
 	 * @param beanMeta The bean metadata, or <jk>null</jk> if the class is not a bean.
 	 * @param notABeanReason The reason why the class is not a bean, or <jk>null</jk> if it is a bean.
 	 */
-	record BeanMetaValue<T>(BeanMeta<T> beanMeta, String notABeanReason) {
-		Optional<BeanMeta<T>> optBeanMeta() { return opt(beanMeta()); }
+	public record BeanMetaValue<T>(BeanMeta<T> beanMeta, String notABeanReason) {
+		public Optional<BeanMeta<T>> optBeanMeta() { return opt(beanMeta()); }
 		Optional<String> optNotABeanReason() { return opt(notABeanReason()); }
 	}
 
@@ -215,26 +215,26 @@ public class BeanMeta<T> {
  * @param implClass The implementation class info.
  * @return A {@link BeanMetaValue} containing the bean metadata (if successful) or a reason why it's not a bean.
 	 */
-	public static <T> BeanMetaValue<T> create(ClassMeta<T> cm, ClassInfo implClass) {
+	public static <T> BeanMetaValue<T> create(BeanTypeInfo<T> cm, ClassInfo implClass) {
 		try {
-			var bc = cm.getMarshallingContext();
-			var ap = bc.getAnnotationProvider();
-			var cfg = bc.getBeanConfigContext();
+			var cfg = cm.getBeanConfigContext();
+			var ap = cfg.getAnnotationProvider();
+			var bmi = cfg.getBeanMetaInitializer();
 
 			// Sanity checks first.
-			if (bc.isNotABean(cm))
+			if (cfg.isNotABean(cm))
 				return notABean("Class matches exclude-class list");
 
-			if (bc.isBeansRequireSerializable() && ! cm.isAssignableTo(Serializable.class) && ! MarshalledBeanMetaInitializer.hasBeanRegistrationAnnotation(cfg, cm))
+			if (cfg.isBeansRequireSerializable() && ! cm.isAssignableTo(Serializable.class) && ! bmi.hasBeanRegistrationAnnotation(cfg, cm))
 				return notABean("Class is not serializable");
 
 			if (ap.has(BeanIgnore.class, cm))
 				return notABean("Class is annotated with @BeanIgnore");
 
-		if ((! bc.getBeanClassVisibility().isVisible(cm.getModifiers()) || cm.isAnonymousClass()) && ! MarshalledBeanMetaInitializer.hasBeanRegistrationAnnotation(cfg, cm))
+		if ((! cfg.getBeanClassVisibility().isVisible(cm.getModifiers()) || cm.isAnonymousClass()) && ! bmi.hasBeanRegistrationAnnotation(cfg, cm))
 			return notABean("Class is not public");
 
-			var bm = new BeanMeta<>(cm, MarshalledBeanMetaInitializer.findMarshalledFilter(cm), null, implClass);
+			var bm = new BeanMeta<>(cm, bmi.buildBeanFilter(cm), null, implClass);
 
 			if (nn(bm.notABeanReason))
 				return notABean(bm.notABeanReason);
@@ -404,7 +404,7 @@ public class BeanMeta<T> {
 	 * @param implClass Optional implementation class constructor to use if one cannot be found. Can be <jk>null</jk>.
 	 */
 	protected BeanMeta(BeanTypeInfo<T> cm, BeanFilter bf, String[] pNames, ClassInfo implClass) {
-		this(cm, MarshalledBeanMetaInitializer.classInfoOf(cm), MarshalledBeanMetaInitializer.configOf(cm), MarshalledBeanMetaInitializer.contextOf(cm), bf, pNames, implClass);
+		this(cm, cm, cm.getBeanConfigContext(), cm.getMarshallingContext(), bf, pNames, implClass);
 	}
 
 	/**
@@ -412,7 +412,7 @@ public class BeanMeta<T> {
 	 *
 	 * <p>
 	 * See {@link #of(Class, BeanConfigContext)} for the public entry point.  The {@link #getClassMeta()},
-	 * {@link #getMarshallingContext() marshallingContext}, and per-property {@link BeanRegistry} fields are
+	 * {@link #getBeanTypeResolver() bean type resolver}, and per-property {@link BeanRegistry} fields are
 	 * left <jk>null</jk>; the per-property {@link BeanPropertyMeta#getClassMeta() rawTypeMeta}/{@code typeMeta}
 	 * fields are also <jk>null</jk> (no type-resolution is performed in this path).
 	 *
@@ -455,7 +455,9 @@ public class BeanMeta<T> {
 		var btList = ap.find(org.apache.juneau.commons.bean.BeanType.class, classInfo);
 		var propertyNamer = opt(bf).map(x -> x.getPropertyNamer()).orElse(config.getPropertyNamer());
 
-		this.typePropertyName = MarshalledBeanMetaInitializer.resolveTypePropertyName(config, classInfo);
+		// resolveTypePropertyName may return null on the commons-side NOOP path; fall back to the configured default.
+		var resolvedTypePropertyName = config.getBeanMetaInitializer().resolveTypePropertyName(config, classInfo);
+		this.typePropertyName = nn(resolvedTypePropertyName) ? resolvedTypePropertyName : config.getBeanTypePropertyName();
 
 		// Check if constructor is required but not found (records are exempt since they use canonical constructors)
 		if (! beanConstructor.constructor().isPresent() && bf == null && config.isBeansRequireDefaultConstructor() && ! ci.isRecord())
@@ -589,7 +591,7 @@ public class BeanMeta<T> {
 			// entries chain on top of bean and global dictionaries.  Skipped on the commons-side path
 			// (no marshallingContext means no BeanRegistry construction).
 			if (nn(marshallingContext) && nn(v.dictionaryClasses))
-				propertyBeanRegistriesTemp.put(pMeta, MarshalledBeanMetaInitializer.buildPropertyBeanRegistry(marshallingContext, beanRegistry.get(), v.dictionaryClasses));
+				propertyBeanRegistriesTemp.put(pMeta, config.getBeanMetaInitializer().buildPropertyBeanRegistry(marshallingContext, beanRegistry.get(), v.dictionaryClasses));
 		});
 
 			// If a beanFilter is defined, look for inclusion and exclusion lists.
@@ -668,7 +670,7 @@ public class BeanMeta<T> {
 				// MarshallingContext to resolve ObjectSwap/StringFormatSwap/Surrogate types and the swap
 				// class meta.
 				if (nn(marshallingContext))
-					MarshalledPropertyPostProcessor.process((MarshallingContext) marshallingContext, p);
+					config.getBeanPropertyPostProcessor().process(marshallingContext, p);
 
 				if (nn(p.getter))
 					getterProps.put(p.getter.inner(), p.name);
@@ -703,10 +705,10 @@ public class BeanMeta<T> {
 	 * @return The bean filter for this bean, or <jk>null</jk> if no bean filter is associated with this bean.
 	 * @see Bean
 	 */
-	public MarshalledFilter getMarshalledFilter() {
-		// The field is typed as the bean-modeling-side BeanFilter SPI but the only concrete
-		// implementation in-tree is MarshalledFilter, so the narrowing cast is safe.
-		return (MarshalledFilter) beanFilter;
+	public BeanFilter getBeanFilter() {
+		// The field is typed as the bean-modeling-side BeanFilter SPI; marshalling-side callers
+		// narrow back to {@link MarshalledFilter} (the only concrete implementation in-tree).
+		return beanFilter;
 	}
 
 	/**
@@ -921,16 +923,21 @@ public class BeanMeta<T> {
 	}
 
 	/**
-	 * Returns the bean context that created this metadata object.
+	 * Returns the bean-modeling {@link BeanTypeResolver} that this metadata was constructed against.
+	 *
+	 * <p>
+	 * On the marshalling-side construction path, the underlying object is the {@link MarshallingContext} (which
+	 * implements {@link BeanTypeResolver}); marshalling-side callers that need the concrete narrowing must cast
+	 * (e.g. {@code (MarshallingContext) bm.getBeanTypeResolver()}).
 	 *
 	 * <p>
 	 * Returns <jk>null</jk> when this {@link BeanMeta} was constructed via the commons-side path
 	 * ({@link #of(Class, BeanConfigContext)}).  Use {@link #getConfig()} for the always-non-null bean-modeling
 	 * configuration facade.
 	 *
-	 * @return The bean context, or <jk>null</jk> for bean-modeling-only construction.
+	 * @return The bean-modeling type resolver, or <jk>null</jk> for bean-modeling-only construction.
 	 */
-	protected MarshallingContext getMarshallingContext() { return (MarshallingContext) marshallingContext; }
+	protected BeanTypeResolver getBeanTypeResolver() { return (BeanTypeResolver) marshallingContext; }
 
 	/**
 	 * Returns the constructor for this bean, if one was found.
@@ -948,7 +955,7 @@ public class BeanMeta<T> {
 	 * @see #getConstructorArgs()
 	 * @see #hasConstructor()
 	 */
-	protected ConstructorInfo getConstructor() {
+	public ConstructorInfo getConstructor() {
 		return beanConstructor.constructor().orElse(null);
 	}
 
@@ -973,7 +980,7 @@ public class BeanMeta<T> {
 	 * @see #getConstructor()
 	 * @see #hasConstructor()
 	 */
-	protected List<String> getConstructorArgs() {
+	public List<String> getConstructorArgs() {
 		return beanConstructor.args();
 	}
 
@@ -1039,7 +1046,7 @@ public class BeanMeta<T> {
 	 * @see #getConstructor()
 	 * @see #newBean(Object)
 	 */
-	protected boolean hasConstructor() {
+	public boolean hasConstructor() {
 		return beanConstructor.constructor().isPresent();
 	}
 
@@ -1061,7 +1068,7 @@ public class BeanMeta<T> {
 		"unchecked", // Type erasure requires unchecked cast
 		"rawtypes" // Raw BeanFactory type used at runtime for factory resolution
 	})
-	protected T newBean(Object outer) throws ExecutableException {
+	public T newBean(Object outer) throws ExecutableException {
 		if (factoryClass != null) {
 			try {
 				BeanFactory factory = resolveFactory(factoryClass);
@@ -1176,7 +1183,7 @@ public class BeanMeta<T> {
 		if (implClassConstructor != null)
 			return new BeanConstructor(opt(implClassConstructor.accessible()), liste());
 
-		var con = ci.getNoArgConstructor(MarshalledBeanMetaInitializer.hasBeanRegistrationAnnotation(config, classInfo) ? Visibility.PRIVATE : vis).orElse(null);
+		var con = ci.getNoArgConstructor(config.getBeanMetaInitializer().hasBeanRegistrationAnnotation(config, classInfo) ? Visibility.PRIVATE : vis).orElse(null);
 		if (con != null)
 			return new BeanConstructor(opt(con.accessible()), liste());
 
@@ -1427,9 +1434,9 @@ public class BeanMeta<T> {
 	 */
 	private BeanRegistryLookup findBeanRegistry() {
 		// BeanRegistry is a marshalling-side concern (polymorphic dispatch via @Marshalled(typeName)/dictionary).
-		// Lifted out to {@link MarshalledBeanMetaInitializer} so this class no longer references
-		// {@link BeanRegistry} directly.  Returns null on the commons-side path (no marshallingContext).
-		return MarshalledBeanMetaInitializer.buildBeanRegistry(marshallingContext, beanFilter, classInfo, config);
+		// Lifted out to the BeanMetaInitializer SPI carried on BeanConfigContext so this class no longer references
+		// MarshalledBeanMetaInitializer directly.  Returns null on the commons-side path (no marshallingContext).
+		return config.getBeanMetaInitializer().buildBeanRegistry(marshallingContext, beanFilter, classInfo, config);
 	}
 
 	/*
@@ -1541,12 +1548,13 @@ public class BeanMeta<T> {
 
 		// Parent-class BeanRegistry lookup is a marshalling-side concern: it walks parents and interfaces to
 		// see if any of THEIR ClassMeta-backed BeanRegistries declares a typeName for our raw class.  Lifted
-		// out to {@link MarshalledBeanMetaInitializer}.  Returns null on the commons-side path.
-		var n = MarshalledBeanMetaInitializer.findTypeNameInParents(marshallingContext, classInfo, rawClass);
+		// out to the BeanMetaInitializer SPI carried on BeanConfigContext.  Returns null on the commons-side path.
+		var bmi = config.getBeanMetaInitializer();
+		var n = bmi.findTypeNameInParents(marshallingContext, classInfo, rawClass);
 		if (n != null)
 			return n;
 
-		return MarshalledBeanMetaInitializer.findMarshalledTypeName(config, classInfo);
+		return bmi.findMarshalledTypeName(config, classInfo);
 	}
 
 	/*
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMetaInitializer.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMetaInitializer.java
new file mode 100644
index 0000000000..b01f2cacd8
--- /dev/null
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMetaInitializer.java
@@ -0,0 +1,168 @@
+/*
+ * 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.juneau.commons.bean;
+
+import java.util.List;
+
+import org.apache.juneau.commons.reflect.ClassInfo;
+
+/**
+ * Bean-modeling SPI seam that exposes marshalling-aware {@link BeanMeta} construction hooks.
+ *
+ * <p>
+ * The bean-modeling layer in {@code commons.bean} can construct a {@link BeanMeta} from a {@link Class} plus a
+ * {@link BeanConfigContext} alone, but the full marshalling-side construction path also needs to:
+ * <ul>
+ *  <li>Read {@code @Marshalled} / {@code @BeanType} annotations to detect bean registration, dictionary names,
+ *      and the type-property name.
+ *  <li>Build a {@code BeanRegistry} for polymorphic dispatch (bean-level and per-property).
+ *  <li>Walk the parent class/interface hierarchy to find an inherited dictionary name.
+ * </ul>
+ *
+ * <p>
+ * These operations require the marshalling-side {@code MarshallingContext}, so they are exposed here as SPI
+ * methods that take the marshalling context as an opaque {@link Object}.  The marshalling-side implementation
+ * in {@code MarshalledBeanMetaInitializer} narrows the argument internally; the bean-modeling layer never
+ * imports the marshalling-side types.
+ *
+ * <p>
+ * The default {@link #NOOP} implementation is wired on the commons-side path and returns conservative defaults
+ * (no marshalling-side help available).  {@code @BeanType} reads remain functional via the configured
+ * {@link BeanConfigContext#getAnnotationProvider()}.
+ *
+ * @see BeanConfigContext.Builder#beanMetaInitializer(BeanMetaInitializer)
+ */
+public interface BeanMetaInitializer {
+
+	/**
+	 * Singleton commons-side default — no marshalling-side knowledge.
+	 *
+	 * <p>
+	 * Returns conservative defaults: no bean dictionary, no inherited type-names, no {@code @Marshalled} reads.
+	 * {@link #hasBeanRegistrationAnnotation(BeanConfigContext, ClassInfo)} still reads {@code @BeanType} via
+	 * the supplied {@link BeanConfigContext#getAnnotationProvider() annotation provider}.
+	 */
+	BeanMetaInitializer NOOP = new BeanMetaInitializer() {
+		@Override
+		public boolean hasBeanRegistrationAnnotation(BeanConfigContext config, ClassInfo classInfo) {
+			return ! config.getAnnotationProvider().find(BeanType.class, classInfo).isEmpty();
+		}
+
+		@Override
+		public String resolveTypePropertyName(BeanConfigContext config, ClassInfo classInfo) {
+			return null;
+		}
+
+		@Override
+		public String findMarshalledTypeName(BeanConfigContext config, ClassInfo classInfo) {
+			return null;
+		}
+
+		@Override
+		public BeanRegistryLookup buildBeanRegistry(Object marshallingContext, BeanFilter beanFilter, ClassInfo classInfo, BeanConfigContext config) {
+			return null;
+		}
+
+		@Override
+		public BeanRegistryLookup buildPropertyBeanRegistry(Object marshallingContext, BeanRegistryLookup parent, List<ClassInfo> dictionaryClasses) {
+			return null;
+		}
+
+		@Override
+		public String findTypeNameInParents(Object marshallingContext, ClassInfo classInfo, Class<?> rawClass) {
+			return null;
+		}
+
+		@Override
+		public BeanFilter buildBeanFilter(BeanTypeInfo<?> cm) {
+			return null;
+		}
+	};
+
+	/**
+	 * Returns <jk>true</jk> if the supplied class has a "registered as bean" annotation (e.g. {@code @Marshalled}
+	 * or {@code @BeanType}).  Used to relax constructor-visibility / serializable / class-visibility checks during
+	 * bean detection.
+	 *
+	 * @param config The bean-modeling configuration.
+	 * @param classInfo The bean's class info.
+	 * @return <jk>true</jk> if the class has a registration annotation.
+	 */
+	boolean hasBeanRegistrationAnnotation(BeanConfigContext config, ClassInfo classInfo);
+
+	/**
+	 * Returns the marshalling-side {@code @Marshalled(typePropertyName)} value for the bean, or <jk>null</jk> if
+	 * not set.  Callers fall back to {@link BeanConfigContext#getBeanTypePropertyName()} when this returns <jk>null</jk>.
+	 *
+	 * @param config The bean-modeling configuration.
+	 * @param classInfo The bean's class info.
+	 * @return The resolved type property name, or <jk>null</jk>.
+	 */
+	String resolveTypePropertyName(BeanConfigContext config, ClassInfo classInfo);
+
+	/**
+	 * Returns the marshalling-side {@code @Marshalled(typeName)} value for the bean, or <jk>null</jk> if not set.
+	 *
+	 * @param config The bean-modeling configuration.
+	 * @param classInfo The bean's class info.
+	 * @return The marshalled type name, or <jk>null</jk>.
+	 */
+	String findMarshalledTypeName(BeanConfigContext config, ClassInfo classInfo);
+
+	/**
+	 * Builds the bean-level {@link BeanRegistryLookup} for the supplied class.  Returns <jk>null</jk> on the
+	 * commons-side path (no marshalling context).
+	 *
+	 * @param marshallingContext The marshalling-side context (as an opaque {@link Object}).  Can be <jk>null</jk>.
+	 * @param beanFilter The bean filter applied to this bean meta.  Can be <jk>null</jk>.
+	 * @param classInfo The class info of the bean.  Must not be <jk>null</jk>.
+	 * @param config The bean-modeling configuration.  Must not be <jk>null</jk>.
+	 * @return The bean-level registry, or <jk>null</jk>.
+	 */
+	BeanRegistryLookup buildBeanRegistry(Object marshallingContext, BeanFilter beanFilter, ClassInfo classInfo, BeanConfigContext config);
+
+	/**
+	 * Builds the per-property {@link BeanRegistryLookup} chained on top of the bean-level registry.
+	 *
+	 * @param marshallingContext The marshalling-side context.  Must not be <jk>null</jk> on the marshalling path.
+	 * @param parent The bean-level registry (chained behind the per-property one).  May be <jk>null</jk>.
+	 * @param dictionaryClasses The per-property dictionary class infos.  Must not be <jk>null</jk>.
+	 * @return The per-property registry, or <jk>null</jk> when there is no marshalling context.
+	 */
+	BeanRegistryLookup buildPropertyBeanRegistry(Object marshallingContext, BeanRegistryLookup parent, List<ClassInfo> dictionaryClasses);
+
+	/**
+	 * Walks the parent classes/interfaces of {@code classInfo} and returns the first dictionary-name mapping for
+	 * {@code rawClass} found in any parent's registry, or <jk>null</jk> if none.
+	 *
+	 * @param marshallingContext The marshalling-side context.  Can be <jk>null</jk>.
+	 * @param classInfo The bean's class info.
+	 * @param rawClass The raw class to look up.
+	 * @return The dictionary name found in a parent's registry, or <jk>null</jk>.
+	 */
+	String findTypeNameInParents(Object marshallingContext, ClassInfo classInfo, Class<?> rawClass);
+
+	/**
+	 * Builds the marshalling-side {@link BeanFilter} for the supplied class, reading {@code @Marshalled} and
+	 * {@code @BeanType} annotations.  Returns <jk>null</jk> on the commons-side path (no marshalling-side
+	 * filter construction is available).
+	 *
+	 * @param cm The bean type info.
+	 * @return The bean filter, or <jk>null</jk>.
+	 */
+	BeanFilter buildBeanFilter(BeanTypeInfo<?> cm);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyConsumer.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyConsumer.java
similarity index 88%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyConsumer.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyConsumer.java
index 113b284db5..2d246f49b8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyConsumer.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyConsumer.java
@@ -14,9 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import org.apache.juneau.commons.function.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Represents a consumer of a single bean property value.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyMeta.java
similarity index 95%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyMeta.java
index 824db3d978..c30aedbd0d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyMeta.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import static org.apache.juneau.commons.reflect.AnnotationTraversal.*;
 import static org.apache.juneau.commons.reflect.ReflectionUtils.*;
@@ -82,20 +82,20 @@ public class BeanPropertyMeta implements Comparable<BeanPropertyMeta> {
 		BeanConfigContext config;  // Package-private for BeanMeta access.  Always non-null — sourced from the owning BeanMeta.
 		String name;  // Package-private for BeanMeta access
 		FieldInfo field;  // Package-private for BeanMeta access
-		FieldInfo innerField;  // Package-private for BeanMeta access
-		MethodInfo getter;  // Package-private for BeanMeta access
-		MethodInfo setter;  // Package-private for BeanMeta access
+		public FieldInfo innerField;  // Package-private for BeanMeta access
+		public MethodInfo getter;  // Package-private for BeanMeta access
+		public MethodInfo setter;  // Package-private for BeanMeta access
 		MethodInfo extraKeys;  // Package-private for BeanMeta access
-		BeanTypeInfo<?> rawTypeMeta;  // Package-private for BeanMeta access (used to install swap-aware transforms).  Null on commons-side path (no type resolution).  Concrete instances are always {@link org.apache.juneau.ClassMeta} since it's the only in-tree implementation; the field is typed against the bean-modeling SPI seam so the field can live in commons.bean.
-		Object swap;  // Object-typed so the field can live in commons.bean; cast to ObjectSwap by marshalling-side consumers.  Set only via MarshalledPropertyPostProcessor (marshalling-side post-processor).
-		BiFunction<BeanSession,Object,Object> readTransform;  // Package-private; defaults to identity if null.  Typed against the commons.bean SPI seam; marshalling-side installers cast the session argument back to {@link org.apache.juneau.MarshallingSession} where needed (see {@link org.apache.juneau.MarshalledPropertyPostProcessor#installSwapAwareTransforms}).
-		BiFunction<BeanSession,Object,Object> writeTransform; // Package-private; defaults to identity if null.  Typed against the commons.bean SPI seam (see readTransform note).
-		List<ClassInfo> dictionaryClasses;  // Package-private for BeanMeta access; @MarshalledProp(dictionary={}) classes scanned during validate().
+		public BeanTypeInfo<?> rawTypeMeta;  // Package-private for BeanMeta access (used to install swap-aware transforms).  Null on commons-side path (no type resolution).  Concrete instances are always {@link org.apache.juneau.ClassMeta} since it's the only in-tree implementation; the field is typed against the bean-modeling SPI seam so the field can live in commons.bean.
+		public Object swap;  // Object-typed so the field can live in commons.bean; cast to ObjectSwap by marshalling-side consumers.  Set only via MarshalledPropertyPostProcessor (marshalling-side post-processor).
+		public BiFunction<BeanSession,Object,Object> readTransform;  // Package-private; defaults to identity if null.  Typed against the commons.bean SPI seam; marshalling-side installers cast the session argument back to {@link org.apache.juneau.MarshallingSession} where needed (see {@link org.apache.juneau.MarshalledPropertyPostProcessor#installSwapAwareTransforms}).
+		public BiFunction<BeanSession,Object,Object> writeTransform; // Package-private; defaults to identity if null.  Typed against the commons.bean SPI seam (see readTransform note).
+		public List<ClassInfo> dictionaryClasses;  // Package-private for BeanMeta access; @MarshalledProp(dictionary={}) classes scanned during validate().
 		private boolean isConstructorArg;
-		boolean isUri;  // Package-private so MarshalledPropertyPostProcessor can set @Uri-derived flag.  Mirrors rawTypeMeta.isUri() plus @Uri annotation reads on field/getter/setter.
+		public boolean isUri;  // Package-private so MarshalledPropertyPostProcessor can set @Uri-derived flag.  Mirrors rawTypeMeta.isUri() plus @Uri annotation reads on field/getter/setter.
 		private boolean isDyna;
 		private boolean isDynaGetterMap;
-		BeanTypeInfo<?> typeMeta;  // Package-private so the marshalling-side post-processor can override after @Swap/@MarshalledProp detection.  Concrete instances are always {@link org.apache.juneau.ClassMeta}; typed against the bean-modeling SPI seam.
+		public BeanTypeInfo<?> typeMeta;  // Package-private so the marshalling-side post-processor can override after @Swap/@MarshalledProp detection.  Concrete instances are always {@link org.apache.juneau.ClassMeta}; typed against the bean-modeling SPI seam.
 		private Object overrideValue;
 		private BeanPropertyMeta delegateFor;
 		private boolean canRead;
@@ -105,7 +105,7 @@ public class BeanPropertyMeta implements Comparable<BeanPropertyMeta> {
 
 		Builder(BeanMeta<?> beanMeta, String name) {
 			this.beanMeta = beanMeta;
-			this.bc = beanMeta.getMarshallingContext();  // MarshallingContext implements BeanTypeResolver; null on commons-side path.
+			this.bc = beanMeta.getBeanTypeResolver();  // Returns null on commons-side path.
 			this.config = beanMeta.getConfig();
 			this.name = name;
 		}
@@ -878,9 +878,14 @@ public class BeanPropertyMeta implements Comparable<BeanPropertyMeta> {
 	 * {@link BeanMeta#getPropertyBeanRegistry(BeanPropertyMeta)} for backwards compatibility with existing call sites
 	 * in the marshalling layer (parser/serializer sessions, XML content-property handling, etc.).
 	 *
-	 * @return The bean dictionary in use for this bean property.  Never <jk>null</jk>.
+	 * <p>
+	 * Returns the bean-modeling-side SPI type ({@link BeanRegistryLookup}).  Marshalling-side callers that need
+	 * the full {@link org.apache.juneau.BeanRegistry} surface (e.g. {@code getClassMeta(String)}) cast at the
+	 * call site — the concrete instance in-tree is always a {@link org.apache.juneau.BeanRegistry}.
+	 *
+	 * @return The bean dictionary in use for this bean property, or <jk>null</jk> if no registry was registered.
 	 */
-	public BeanRegistry getBeanRegistry() { return (BeanRegistry) beanMeta.getPropertyBeanRegistry(this); }
+	public BeanRegistryLookup getBeanRegistry() { return beanMeta.getPropertyBeanRegistry(this); }
 
 	/**
 	 * Returns the {@link BeanTypeInfo} of the class of this property.
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyPostProcessor.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyPostProcessor.java
new file mode 100644
index 0000000000..68c840ce35
--- /dev/null
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyPostProcessor.java
@@ -0,0 +1,55 @@
+/*
+ * 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.juneau.commons.bean;
+
+/**
+ * Bean-modeling SPI seam that applies marshalling-side post-processing to a {@code BeanPropertyMeta.Builder}
+ * after {@code BeanPropertyMeta.Builder#validate()} succeeds.
+ *
+ * <p>
+ * On the marshalling-side path, post-processing reads {@code @MarshalledProp} / {@code @Swap} / {@code @Uri}
+ * annotations and installs swap-aware read/write transforms on the builder.  The bean-modeling layer in
+ * {@code commons.bean} never touches those marshalling-side concerns directly; it just invokes this hook.
+ *
+ * <p>
+ * The default {@link #NOOP} implementation does nothing and is wired on the commons-side path.
+ *
+ * <p>
+ * The {@code builder} parameter is typed as {@link Object} during the in-flight TODO-5 move of
+ * {@code BeanPropertyMeta} into {@code commons.bean}: until that physical move completes, the SPI must
+ * not reference the marshalling-side {@code BeanPropertyMeta.Builder} from {@code commons.bean}.  After
+ * the move, the parameter can be retyped.
+ *
+ * @see BeanConfigContext.Builder#beanPropertyPostProcessor(BeanPropertyPostProcessor)
+ */
+@FunctionalInterface
+public interface BeanPropertyPostProcessor {
+
+	/** Singleton commons-side default — no marshalling-side post-processing. */
+	BeanPropertyPostProcessor NOOP = (marshallingContext, builder) -> {};
+
+	/**
+	 * Applies marshalling-side post-processing to the supplied builder.
+	 *
+	 * @param marshallingContext The marshalling-side context (as an opaque {@link Object}).  May be <jk>null</jk>
+	 *	when invoked from the commons-side construction path.
+	 * @param builder The bean-property builder to mutate (a {@code BeanPropertyMeta.Builder}).  Must not be
+	 *	<jk>null</jk>.  Typed as {@link Object} until {@code BeanPropertyMeta} physically moves into
+	 *	{@code commons.bean}; the marshalling-side implementation casts internally.
+	 */
+	void process(Object marshallingContext, Object builder);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyValue.java
similarity index 82%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyValue.java
index 2416d256e8..3fa1eba374 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyValue.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyValue.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import static org.apache.juneau.commons.utils.CollectionUtils.*;
 import static org.apache.juneau.commons.utils.Utils.*;
 
+import org.apache.juneau.commons.bean.*;
 import org.apache.juneau.commons.collections.*;
 
 /**
@@ -71,11 +72,16 @@ public class BeanPropertyValue implements Comparable<BeanPropertyValue> {
 	}
 
 	/**
-	 * Returns the bean property metadata.
+	 * Returns the {@link BeanTypeInfo} of the bean property.
 	 *
-	 * @return The bean property metadata.
+	 * <p>
+	 * Returns the bean-modeling-side SPI type ({@link BeanTypeInfo}).  Marshalling-side callers that need the
+	 * {@link org.apache.juneau.ClassMeta} narrowing must cast — the concrete instance in-tree is always a
+	 * {@link org.apache.juneau.ClassMeta}.
+	 *
+	 * @return The bean property type info.
 	 */
-	public final ClassMeta<?> getClassMeta() { return (ClassMeta<?>) pMeta.getClassMeta(); }
+	public final BeanTypeInfo<?> getClassMeta() { return pMeta.getClassMeta(); }
 
 	/**
 	 * Returns the bean property metadata.
@@ -105,7 +111,12 @@ public class BeanPropertyValue implements Comparable<BeanPropertyValue> {
 	 */
 	public final Object getValue() { return value; }
 
-	protected FluentMap<String,Object> properties() {
+	/**
+	 * Returns a property map view of this object.
+	 *
+	 * @return A property map containing the name, value, and type of this bean property.
+	 */
+	public FluentMap<String,Object> properties() {
 		// @formatter:off
 		return filteredBeanPropertyMap()
 			.a(PROP_name, name)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanProxyInvocationHandler.java
similarity index 97%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
rename to juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanProxyInvocationHandler.java
index 56327347a8..a63a020990 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanProxyInvocationHandler.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.juneau;
+package org.apache.juneau.commons.bean;
 
 import static org.apache.juneau.commons.reflect.ReflectionUtils.*;
 import static org.apache.juneau.commons.utils.ThrowableUtils.*;
@@ -22,6 +22,8 @@ import static org.apache.juneau.commons.utils.Utils.*;
 
 import java.lang.reflect.*;
 import java.util.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
 
 /**
  * Provides an {@link InvocationHandler} for creating dynamic proxy instances of bean interfaces.
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanTypeInfo.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanTypeInfo.java
index ac96183c0c..07c059bb95 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanTypeInfo.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanTypeInfo.java
@@ -144,4 +144,29 @@ public abstract class BeanTypeInfo<T> extends ClassInfoTyped<T> {
 	 * @return The default empty Optional value, or <jk>null</jk>.
 	 */
 	public abstract Object getOptionalDefault();
+
+	/**
+	 * Returns the {@link BeanConfigContext} associated with this type-info.
+	 *
+	 * <p>
+	 * On the marshalling-side this returns the bean-modeling subset of the {@code MarshallingContext} that
+	 * carried this type-info; on commons-side {@link BeanTypeInfo} construction paths (none exist in-tree as
+	 * of TODO-5 — {@link BeanTypeInfo} is currently always realized by marshalling-side {@code ClassMeta}),
+	 * this should return the {@code BeanConfigContext} the type-info was built against.
+	 *
+	 * @return The bean-modeling configuration carried alongside this type-info.  Never <jk>null</jk>.
+	 */
+	public abstract BeanConfigContext getBeanConfigContext();
+
+	/**
+	 * Returns the marshalling-side context associated with this type-info, as an opaque {@link Object}.
+	 *
+	 * <p>
+	 * On the marshalling-side this is the {@code MarshallingContext} that carried this type-info; the return
+	 * type is widened to {@link Object} so callers in {@code commons.bean} do not need to import
+	 * {@code MarshallingContext}.  Callers cast to the marshalling-side type at the use site.
+	 *
+	 * @return The marshalling context, or <jk>null</jk> if none is associated with this type-info.
+	 */
+	public abstract Object getMarshallingContext();
 }
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
index 1bf75fac6a..acadfd4649 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
@@ -20,6 +20,8 @@ import static org.apache.juneau.commons.utils.Utils.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.jena.annotation.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on beans specific to the RDF serializers and parsers pulled from the {@link Rdf @Rdf} annotation on the
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
index 61954dc0fb..d29e9d928b 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
@@ -23,6 +23,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.jena.annotation.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the RDF serializers and parsers pulled from the {@link Rdf @Rdf} annotation
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfMetaProvider.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfMetaProvider.java
index 2a5b261201..5139b3f50f 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfMetaProvider.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfMetaProvider.java
@@ -18,6 +18,8 @@ package org.apache.juneau.jena;
 
 import org.apache.juneau.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link RdfClassMeta}, {@link RdfBeanMeta}, and {@link RdfBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
index c8d1e84758..92dedcd97e 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -32,6 +32,8 @@ import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.jena.annotation.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses RDF into POJOs.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
index ce903f33c0..3960035792 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
@@ -41,6 +41,9 @@ import org.apache.juneau.xml.*;
 import org.apache.jena.rdf.model.*;
 import org.apache.jena.riot.*;
 import org.apache.jena.util.iterator.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link RdfParser}.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 0376e8d9fa..b18292b9a7 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -34,6 +34,8 @@ import org.apache.juneau.jena.annotation.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
 import org.apache.juneau.xml.annotation.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJOs to RDF.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParser.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParser.java
index 52fa14f4c1..f79baf355b 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParser.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParser.java
@@ -22,6 +22,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Stream-based RDF parser for binary formats (RDF/THRIFT, RDF/PROTO).
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParserSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParserSession.java
index 2f305ebd8d..b620055f02 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParserSession.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamParserSession.java
@@ -41,6 +41,9 @@ import org.apache.juneau.xml.*;
 import org.apache.jena.rdf.model.*;
 import org.apache.jena.riot.*;
 import org.apache.jena.util.iterator.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link RdfStreamParser}.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamSerializer.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamSerializer.java
index 079b2f807e..57c737534e 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamSerializer.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfStreamSerializer.java
@@ -21,6 +21,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Stream-based RDF serializer for binary formats (RDF/THRIFT, RDF/PROTO).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapLoader.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapLoader.java
index 754f59f744..f82b422583 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapLoader.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMapLoader.java
@@ -20,6 +20,7 @@ import java.io.*;
 
 import org.apache.juneau.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Marshalling-side helper for loading {@link BeanMap} contents from JSON text or a reader/parser pair.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index e599ae73a5..001fcb0f03 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -467,10 +467,27 @@ public class ClassMeta<T> extends BeanTypeInfo<T> {
 	/**
 	 * Returns the {@link MarshallingContext} that created this object.
 	 *
+	 * <p>
+	 * Covariantly overrides {@link BeanTypeInfo#getMarshallingContext()} to narrow the return type from
+	 * {@link Object} (commons SPI) back to {@link MarshallingContext} (marshalling-side concrete type).
+	 *
 	 * @return The bean context.
 	 */
+	@Override
 	public MarshallingContext getMarshallingContext() { return marshallingContext; }
 
+	/**
+	 * Returns the {@link BeanConfigContext} snapshot carried by the {@link MarshallingContext} that built this
+	 * {@link ClassMeta}.
+	 *
+	 * <p>
+	 * Satisfies the {@link BeanTypeInfo#getBeanConfigContext()} commons SPI contract.
+	 *
+	 * @return The bean-modeling configuration of the marshalling context.  Never <jk>null</jk>.
+	 */
+	@Override
+	public BeanConfigContext getBeanConfigContext() { return marshallingContext.getBeanConfigContext(); }
+
 	/**
 	 * Returns the {@link BeanMeta} associated with this class.
 	 *
@@ -1576,7 +1593,7 @@ public class ClassMeta<T> extends BeanTypeInfo<T> {
 
 	private String findExample() {
 
-		var ex = beanMeta.get().optBeanMeta().map(x -> x.getMarshalledFilter()).map(x -> x.getExample()).orElse(null);
+		var ex = beanMeta.get().optBeanMeta().map(x -> (MarshalledFilter) x.getBeanFilter()).map(x -> x.getExample()).orElse(null);
 
 		if (ex == null)
 			ex = marshalledFilter.map(x -> x.getExample()).orElse(null);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanMeta.java
index 6d4e05da41..5fdd0997fd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau;
 
 import org.apache.juneau.commons.reflect.*;
+import org.apache.juneau.commons.bean.BeanMeta;
 
 /**
  * Defines extended language-specific metadata associated with a bean.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanPropertyMeta.java
index 47b3a3364b..fa98d60e29 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ExtendedBeanPropertyMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau;
 
 import org.apache.juneau.commons.reflect.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Defines extended language-specific metadata associated with a bean property.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledBeanMetaInitializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledBeanMetaInitializer.java
index d9aa6cdbe1..af097e5ec0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledBeanMetaInitializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledBeanMetaInitializer.java
@@ -41,8 +41,16 @@ import org.apache.juneau.commons.utils.*;
  * Each helper takes the marshalling-side {@link MarshallingContext} as an {@link Object} so the
  * call sites inside {@link BeanMeta} do not need to import {@link MarshallingContext}.  The helper
  * casts back internally.
+ *
+ * <p>
+ * Implements the commons-side {@link BeanMetaInitializer} SPI; the singleton {@link #INSTANCE} is wired into the
+ * {@link BeanConfigContext} carried by every {@link MarshallingContext} (see
+ * {@code MarshallingContext.buildBeanConfigContext()}).
  */
-final class MarshalledBeanMetaInitializer {
+final class MarshalledBeanMetaInitializer implements BeanMetaInitializer {
+
+	/** Singleton instance wired into {@link MarshallingContext}-built {@link BeanConfigContext}s. */
+	static final MarshalledBeanMetaInitializer INSTANCE = new MarshalledBeanMetaInitializer();
 
 	private MarshalledBeanMetaInitializer() {}
 
@@ -59,7 +67,8 @@ final class MarshalledBeanMetaInitializer {
 	 * @param config The bean-modeling configuration.  Must not be <jk>null</jk>.
 	 * @return The bean-level {@link BeanRegistryLookup}, or <jk>null</jk> on the commons-side path.
 	 */
-	static BeanRegistryLookup buildBeanRegistry(Object marshallingContext, BeanFilter beanFilter, ClassInfo classInfo, BeanConfigContext config) {
+	@Override
+	public BeanRegistryLookup buildBeanRegistry(Object marshallingContext, BeanFilter beanFilter, ClassInfo classInfo, BeanConfigContext config) {
 		if (marshallingContext == null)
 			return null;
 		MarshallingContext mc = (MarshallingContext) marshallingContext;
@@ -86,7 +95,8 @@ final class MarshalledBeanMetaInitializer {
 	 * @param dictionaryClasses The per-property {@link MarshalledProp#dictionary() @MarshalledProp(dictionary)} classes.  Must not be <jk>null</jk>.
 	 * @return The per-property {@link BeanRegistryLookup}.
 	 */
-	static BeanRegistryLookup buildPropertyBeanRegistry(Object marshallingContext, BeanRegistryLookup parent, List<ClassInfo> dictionaryClasses) {
+	@Override
+	public BeanRegistryLookup buildPropertyBeanRegistry(Object marshallingContext, BeanRegistryLookup parent, List<ClassInfo> dictionaryClasses) {
 		return new BeanRegistry((MarshallingContext) marshallingContext, (BeanRegistry) parent, dictionaryClasses);
 	}
 
@@ -104,7 +114,8 @@ final class MarshalledBeanMetaInitializer {
 	 * @param rawClass The raw class to look up a type name for.
 	 * @return The dictionary name found in a parent's registry, or <jk>null</jk>.
 	 */
-	static String findTypeNameInParents(Object marshallingContext, ClassInfo classInfo, Class<?> rawClass) {
+	@Override
+	public String findTypeNameInParents(Object marshallingContext, ClassInfo classInfo, Class<?> rawClass) {
 		if (marshallingContext == null)
 			return null;
 		MarshallingContext mc = (MarshallingContext) marshallingContext;
@@ -122,65 +133,25 @@ final class MarshalledBeanMetaInitializer {
 	}
 
 	/**
-	 * Extracts the {@link BeanConfigContext} embedded in a marshalling-side {@link BeanTypeInfo} (which is always
-	 * a {@link ClassMeta}).
-	 *
-	 * <p>
-	 * Used by the protected {@code BeanMeta(BeanTypeInfo, BeanFilter, String[], ClassInfo)} bridging constructor —
-	 * lifts the {@code ((ClassMeta<T>) cm).getMarshallingContext().getBeanConfigContext()} cast chain out of the
-	 * commons-side {@link BeanMeta} body.
-	 *
-	 * @param cm The bean type info.  Must be a marshalling-side {@link ClassMeta} instance.
-	 * @return The bean-modeling configuration of the marshalling context.
-	 */
-	static BeanConfigContext configOf(BeanTypeInfo<?> cm) {
-		return ((ClassMeta<?>) cm).getMarshallingContext().getBeanConfigContext();
-	}
-
-	/**
-	 * Extracts the {@link MarshallingContext} embedded in a marshalling-side {@link BeanTypeInfo} (which is always
-	 * a {@link ClassMeta}) and returns it as an {@link Object} so the caller does not need to import
-	 * {@link MarshallingContext}.
-	 *
-	 * @param cm The bean type info.  Must be a marshalling-side {@link ClassMeta} instance.
-	 * @return The marshalling context, as an {@link Object}.
-	 */
-	static Object contextOf(BeanTypeInfo<?> cm) {
-		return ((ClassMeta<?>) cm).getMarshallingContext();
-	}
-
-	/**
-	 * Narrows a marshalling-side {@link BeanTypeInfo} (which is always a {@link ClassMeta}) to {@link ClassInfo}.
-	 *
-	 * <p>
-	 * Since {@link ClassMeta} extends {@link ClassInfo}, the cast is direct.  Provided as a helper so the commons-side
-	 * caller does not have to import {@link ClassMeta}.
-	 *
-	 * @param cm The bean type info.  Must be a marshalling-side {@link ClassMeta} instance.
-	 * @return The class info for the underlying bean class.
-	 */
-	static ClassInfo classInfoOf(BeanTypeInfo<?> cm) {
-		return (ClassMeta<?>) cm;
-	}
-
-	/**
-	 * Resolves the {@link Marshalled#typePropertyName() @Marshalled(typePropertyName)} value for a bean class, falling
-	 * back to {@link BeanConfigContext#getBeanTypePropertyName()} when no annotation supplies one.
+	 * Resolves the {@link Marshalled#typePropertyName() @Marshalled(typePropertyName)} value for a bean class.
 	 *
 	 * <p>
 	 * Encapsulates the {@link Marshalled @Marshalled} annotation read previously performed inline by
 	 * {@link BeanMeta}'s constructor, so {@link BeanMeta} itself no longer references {@link Marshalled}.
+	 * Returns <jk>null</jk> if no annotation supplies one — the caller falls back to
+	 * {@link BeanConfigContext#getBeanTypePropertyName()}.
 	 *
-	 * @param config The bean-modeling configuration (used to access the annotation provider and the fallback default).
+	 * @param config The bean-modeling configuration (used to access the annotation provider).
 	 * @param classInfo The bean's class info.
-	 * @return The resolved type property name.  Never <jk>null</jk>.
+	 * @return The resolved type property name, or <jk>null</jk> when no annotation supplies one.
 	 */
-	static String resolveTypePropertyName(BeanConfigContext config, ClassInfo classInfo) {
+	@Override
+	public String resolveTypePropertyName(BeanConfigContext config, ClassInfo classInfo) {
 		return config.getAnnotationProvider().find(Marshalled.class, classInfo).stream()
 			.map(x -> x.inner().typePropertyName())
 			.filter(Utils::ne)
 			.findFirst()
-			.orElseGet(config::getBeanTypePropertyName);
+			.orElse(null);
 	}
 
 	/**
@@ -193,7 +164,8 @@ final class MarshalledBeanMetaInitializer {
 	 * @param classInfo The bean's class info.
 	 * @return The configured type name, or <jk>null</jk> if not set.
 	 */
-	static String findMarshalledTypeName(BeanConfigContext config, ClassInfo classInfo) {
+	@Override
+	public String findMarshalledTypeName(BeanConfigContext config, ClassInfo classInfo) {
 		return config.getAnnotationProvider().find(Marshalled.class, classInfo)
 			.stream()
 			.map(AnnotationInfo::inner)
@@ -214,7 +186,8 @@ final class MarshalledBeanMetaInitializer {
 	 * @param classInfo The bean's class info.
 	 * @return <jk>true</jk> if the class has either annotation.
 	 */
-	static boolean hasBeanRegistrationAnnotation(BeanConfigContext config, ClassInfo classInfo) {
+	@Override
+	public boolean hasBeanRegistrationAnnotation(BeanConfigContext config, ClassInfo classInfo) {
 		var ap = config.getAnnotationProvider();
 		return ! ap.find(Marshalled.class, classInfo).isEmpty()
 			|| ! ap.find(BeanType.class, classInfo).isEmpty();
@@ -228,11 +201,12 @@ final class MarshalledBeanMetaInitializer {
 	 * a {@link MarshalledFilter} (the only concrete {@link BeanFilter} implementation in-tree) built from the
 	 * {@link Marshalled @Marshalled} and {@link BeanType @BeanType} annotations on the class.
 	 *
-	 * @param cm The class meta for the bean class.
+	 * @param cm The bean type info.  Must be a marshalling-side {@link ClassMeta}.
 	 * @return The bean filter, or <jk>null</jk> if no relevant annotations are present.
 	 */
-	static <T> MarshalledFilter findMarshalledFilter(ClassMeta<T> cm) {
-		var ap = cm.getMarshallingContext().getAnnotationProvider();
+	@Override
+	public BeanFilter buildBeanFilter(BeanTypeInfo<?> cm) {
+		var ap = ((ClassMeta<?>) cm).getMarshallingContext().getAnnotationProvider();
 		var l = ap.find(Marshalled.class, cm);
 		var bt = ap.find(BeanType.class, cm);
 		if (l.isEmpty() && bt.isEmpty())
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledPropertyPostProcessor.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledPropertyPostProcessor.java
index 2265b8bd7e..5e12f1d71c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledPropertyPostProcessor.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshalledPropertyPostProcessor.java
@@ -25,6 +25,7 @@ import static org.apache.juneau.commons.utils.Utils.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.commons.bean.*;
 import org.apache.juneau.commons.inject.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
@@ -56,10 +57,26 @@ import org.apache.juneau.swaps.*;
  * (i.e. when {@link MarshallingContext} is non-null).  The bean-modeling-only path
  * ({@link BeanMeta#of(Class, BeanConfigContext)}) does not run this post-processor.
  */
-final class MarshalledPropertyPostProcessor {
+final class MarshalledPropertyPostProcessor implements BeanPropertyPostProcessor {
+
+	/** Singleton instance wired into {@link MarshallingContext}-built {@link BeanConfigContext}s. */
+	static final MarshalledPropertyPostProcessor INSTANCE = new MarshalledPropertyPostProcessor();
 
 	private MarshalledPropertyPostProcessor() {}
 
+	/**
+	 * SPI entry point — narrows the opaque marshalling context and builder, then dispatches to {@link #process(MarshallingContext, BeanPropertyMeta.Builder)}.
+	 *
+	 * @param marshallingContext The marshalling-side context.  Must not be <jk>null</jk> on the marshalling path.
+	 * @param builder The bean-property builder.  Must be a {@link BeanPropertyMeta.Builder}.
+	 */
+	@Override
+	public void process(Object marshallingContext, Object builder) {
+		if (marshallingContext == null)
+			return;
+		process((MarshallingContext) marshallingContext, (BeanPropertyMeta.Builder) builder);
+	}
+
 	/**
 	 * Applies {@code @MarshalledProp}/{@code @Swap} annotation effects to {@code b} using {@code bc} for
 	 * {@link ClassMeta} resolution.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingContext.java
index 701cf8a0f8..60394a0417 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingContext.java
@@ -3795,6 +3795,8 @@ public class MarshallingContext extends Context implements ConversionFinder, org
 			.notBeanClasses(notBeanClasses.stream().map(ClassInfo::inner).toList())
 			.beanStore(beanStore)
 			.annotationProvider(getAnnotationProvider())
+			.beanMetaInitializer(MarshalledBeanMetaInitializer.INSTANCE)
+			.beanPropertyPostProcessor(MarshalledPropertyPostProcessor.INSTANCE)
 			.build();
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingTraverseSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingTraverseSession.java
index 2837e70da3..bcef3b78d7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingTraverseSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MarshallingTraverseSession.java
@@ -28,6 +28,7 @@ import java.util.function.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.commons.collections.FluentMap;
 import org.apache.juneau.commons.utils.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * ContextSession that lives for the duration of a single use of {@link MarshallingTraverseContext}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonBeanPropertyMeta.java
index e1bd1f223b..ec98c71033 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonBeanPropertyMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.bson;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the BSON serializers and parsers pulled from the {@link org.apache.juneau.bson.annotation.Bson @Bson}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonMetaProvider.java
index 9cd695a5de..e2b9cd37d9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.bson;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link BsonClassMeta} and {@link BsonBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParser.java
index fd10c1796e..eaae0a6ba0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParser.java
@@ -25,6 +25,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses BSON (Binary JSON) into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParserSession.java
index 8479381d56..0ab231bb15 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonParserSession.java
@@ -27,6 +27,8 @@ import org.apache.juneau.collections.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link BsonParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializer.java
index 84ff62036d..9cdff4143f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializer.java
@@ -25,6 +25,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to BSON (Binary JSON).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializerSession.java
index 379fbb6589..45f2765143 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/bson/BsonSerializerSession.java
@@ -30,6 +30,9 @@ import java.util.function.*;
 import org.apache.juneau.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
+import org.apache.juneau.commons.bean.BeanPropertyValue;
 
 /**
  * Session object that lives for the duration of a single use of {@link BsonSerializer}.
@@ -236,7 +239,7 @@ public class BsonSerializerSession extends OutputStreamSerializerSession {
 		for (var x : values) {
 			var pMeta = x.getMeta();
 			if (pMeta.canRead())
-				writeElement(out, x.getName(), x.getValue(), x.getClassMeta(), pMeta);
+				writeElement(out, x.getName(), x.getValue(), (ClassMeta<?>) x.getClassMeta(), pMeta);
 		}
 	}
 
@@ -274,7 +277,7 @@ public class BsonSerializerSession extends OutputStreamSerializerSession {
 	}
 
 	private boolean willRecurse(BeanPropertyValue v) throws SerializeException {
-		var aType = push2(v.getName(), v.getValue(), v.getClassMeta());
+		var aType = push2(v.getName(), v.getValue(), (ClassMeta<?>) v.getClassMeta());
 		if (nn(aType))
 			pop();
 		return aType == null;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborBeanPropertyMeta.java
index da3a064ac2..e3872cc475 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.cbor;
 
 import org.apache.juneau.*;
 import org.apache.juneau.cbor.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the CBOR serializers and parsers pulled from the {@link Cbor @Cbor}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborMetaProvider.java
index 4f5c3df9a0..6cbdc14a7e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.cbor;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link CborClassMeta} and {@link CborBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParser.java
index fb87605dd0..8d248ca6fd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParser.java
@@ -24,6 +24,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses CBOR streams (RFC 8949) into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParserSession.java
index 30f02df825..9db05197b4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborParserSession.java
@@ -33,6 +33,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link CborParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializer.java
index d5b74ed2a6..f1c190df04 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializer.java
@@ -25,6 +25,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to CBOR (RFC 8949).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializerSession.java
index 6df3d128e3..0b5a12ae3d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cbor/CborSerializerSession.java
@@ -32,6 +32,9 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
+import org.apache.juneau.commons.bean.BeanPropertyValue;
 
 /**
  * Session object that lives for the duration of a single use of {@link CborSerializer}.
@@ -317,7 +320,7 @@ public class CborSerializerSession extends OutputStreamSerializerSession {
 		values.forEach(x -> {
 			BeanPropertyMeta pMeta = x.getMeta();
 			if (pMeta.canRead()) {
-				var cMeta = x.getClassMeta();
+				ClassMeta<?> cMeta = (ClassMeta<?>) x.getClassMeta();
 				String key = x.getName();
 				Object value = x.getValue();
 				serializeAnything(out, key, null, null, null);
@@ -364,7 +367,7 @@ public class CborSerializerSession extends OutputStreamSerializerSession {
 	}
 
 	private boolean willRecurse(BeanPropertyValue v) throws SerializeException {
-		var aType = push2(v.getName(), v.getValue(), v.getClassMeta());
+		var aType = push2(v.getName(), v.getValue(), (ClassMeta<?>) v.getClassMeta());
 		if (nn(aType))
 			pop();
 		return aType == null;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
index 0f7e5696f1..62884700de 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
@@ -37,6 +37,7 @@ import org.apache.juneau.objecttools.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.swap.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Java implementation of a JSON object.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
index c37a891d21..3567d1c7fb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.csv;
 
 import org.apache.juneau.*;
 import org.apache.juneau.csv.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the CSV serializers and parsers pulled from the {@link Csv @Csv}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java
index 46db13566d..5e9195181b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.csv;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link CsvClassMeta} and {@link CsvBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
index af669c9da0..bb85866ada 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParser.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses CSV (Comma Separated Values) input into Java objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserSession.java
index 8dc164a999..09a05f58e1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvParserSession.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.csv;
 
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 import org.apache.juneau.commons.http.MediaType;
 import static org.apache.juneau.commons.utils.CollectionUtils.*;
 import static org.apache.juneau.commons.utils.StringUtils.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
index 006c043669..ae9f943c76 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to CSV (Comma Separated Values) format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
index 92854fbedb..34f53e9cad 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
@@ -40,6 +40,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link CsvSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonBeanPropertyMeta.java
index 4e6bb2bdcd..b5ed4d4fd0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonBeanPropertyMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.hjson;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to Hjson serializers and parsers.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonMetaProvider.java
index b79e94a83f..4c8f12af86 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.hjson;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link HjsonClassMeta} and {@link HjsonBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParser.java
index 613d9b2e6f..b273c15029 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParser.java
@@ -22,6 +22,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.collections.JsonList;
 import org.apache.juneau.collections.JsonMap;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses Hjson (Human JSON) text into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParserSession.java
index e012a26a9a..ed61dd9893 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonParserSession.java
@@ -26,6 +26,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.reflect.ExecutableException;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session for parsing Hjson format into POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializer.java
index 8e3a3cc039..e6cb7eeee5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializer.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to Hjson (Human JSON).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializerSession.java
index d5a691e361..a254e19902 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hjson/HjsonSerializerSession.java
@@ -28,6 +28,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for serializing objects to Hjson format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconBeanPropertyMeta.java
index 22107e86a2..d75bbd2769 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconBeanPropertyMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.hocon;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to HOCON serializers and parsers.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconMetaProvider.java
index a2f6e317f1..44e5579de7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.hocon;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link HoconClassMeta} and {@link HoconBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParser.java
index 63a35d6649..65b613a262 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParser.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses HOCON (Human-Optimized Config Object Notation) text into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParserSession.java
index eeba3ef282..2f6aa76521 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconParserSession.java
@@ -26,6 +26,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.commons.reflect.ExecutableException;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session for parsing HOCON format into POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializer.java
index 89664557cb..edf93a5b9d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializer.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to HOCON (Human-Optimized Config Object Notation).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializerSession.java
index 7f7bed1e4b..690c60e602 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/hocon/HoconSerializerSession.java
@@ -28,6 +28,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for serializing objects to HOCON format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
index a2b716cf13..94a7be36fc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
@@ -22,6 +22,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.commons.inject.*;
 import org.apache.juneau.html.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the HTML serializers and parsers pulled from the {@link Html @Html}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
index 1eaeda83a3..d8f8b00645 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.html;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link HtmlClassMeta} and {@link HtmlBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParser.java
index 5712a70927..d7224e6cdb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses text generated by the {@link HtmlSerializer} class back into a POJO model.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index a401be1af6..1adf0c95b0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -42,6 +42,9 @@ import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMapEntry;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * ContextSession object that lives for the duration of a single use of {@link HtmlParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 02c3ac7bdd..a30c065fb0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -33,6 +33,7 @@ import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to HTML.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniBeanPropertyMeta.java
index dcb97169e5..3cf84630ac 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniBeanPropertyMeta.java
@@ -19,6 +19,7 @@ package org.apache.juneau.ini;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.ini.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to INI serializers and parsers, from {@link Ini @Ini}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniMetaProvider.java
index e48f2ab233..30ee48b9e0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.ini;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link IniClassMeta} and {@link IniBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParser.java
index 41f7078b08..d336688f87 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParser.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses INI-formatted text into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParserSession.java
index 11cb514dff..d417959142 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniParserSession.java
@@ -30,6 +30,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session for parsing INI format into POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializer.java
index 770e49f167..c9c82656e0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializer.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.AssertionUtils.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to INI format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializerSession.java
index 080ee15dd3..eddaf30fba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ini/IniSerializerSession.java
@@ -29,6 +29,8 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for serializing objects to INI format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
index 92a9d8e054..1c569591d3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
@@ -24,6 +24,9 @@ import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMapEntry;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Represents a wrapped {@link BeanMap} where property values can be overridden, removed, or reordered without
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jcs/JcsSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jcs/JcsSerializerSession.java
index 8fb3e0e96e..69934e7544 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jcs/JcsSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jcs/JcsSerializerSession.java
@@ -27,6 +27,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object for {@link JcsSerializer} that produces RFC 8785 canonical JSON.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
index 92c3480237..5605e87297 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.json;
 
 import org.apache.juneau.*;
 import org.apache.juneau.json.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the JSON serializers and parsers pulled from the {@link Json @Json}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
index d341858354..447f2fb527 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.json;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link JsonClassMeta} and {@link JsonBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
index 60e195be5f..35a9783377 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -32,6 +32,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.json5.Json5Parser;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses any valid RFC 8259 JSON text into a POJO model.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
index 3cebc8f3c1..35ea54b726 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java
@@ -37,6 +37,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link JsonParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
index e62f5d9576..48975bef38 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
@@ -28,6 +28,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.jsonschema.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO metadata to HTTP responses as JSON-Schema.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
index d4ce042a38..140ae5fbd7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerSession.java
@@ -28,6 +28,7 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.jsonschema.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link JsonSchemaSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
index eb9e9125d1..4d658e852a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -32,6 +32,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.json5.Json5Serializer;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to RFC 8259 JSON.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index 9e2c9e2517..34b8c22ac7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -33,6 +33,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link JsonSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
index 4668bc1564..4fc7ecb3d2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
@@ -23,6 +23,7 @@ import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.commons.annotation.Schema;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the JSON-Schema pulled from the {@link Schema @Schema} annotation
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
index fbad360ac5..928e3b4fb9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
@@ -36,6 +36,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Generates JSON-schema metadata about POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index d62d04d3ec..6c3d7b6278 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -35,6 +35,8 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link JsonSchemaSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
index a531dd1ba2..b3987fb261 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.jsonschema;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link JsonSchemaClassMeta} and {@link JsonSchemaBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownBeanPropertyMeta.java
index d491f9c688..de18ceb50b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownBeanPropertyMeta.java
@@ -19,6 +19,7 @@ package org.apache.juneau.markdown;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.markdown.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the Markdown serializers and parsers pulled from the
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownDocSerializerSession.java
index 67ff5bcde4..65ccc06490 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownDocSerializerSession.java
@@ -31,6 +31,7 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.swap.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session object for {@link MarkdownDocSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownMetaProvider.java
index 59c101c547..c09c21f50e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.markdown;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link MarkdownClassMeta} and {@link MarkdownBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParser.java
index aceaa8ad81..f1d5fdd936 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParser.java
@@ -30,6 +30,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.json5.Json5Parser;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses Markdown fragment-mode output (tables and lists) back to POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
index 2b0d8eca1c..b8b320933d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownParserSession.java
@@ -31,6 +31,7 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.json5.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object for {@link MarkdownParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializer.java
index 6fa9deec64..e7a7a9685c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to Markdown (fragment mode: tables and lists).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializerSession.java
index bdf680f573..19cebfc223 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/markdown/MarkdownSerializerSession.java
@@ -33,6 +33,9 @@ import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMapEntry;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object for {@link MarkdownSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
index 75f93aa36b..11669c9e1d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.msgpack;
 
 import org.apache.juneau.*;
 import org.apache.juneau.msgpack.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the MessagePack serializers and parsers pulled from the {@link MsgPack @MsgPack}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java
index 259b9092d3..4292e359b2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.msgpack;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link MsgPackClassMeta} and {@link MsgPackBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index f82d96277f..a617037c31 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -28,6 +28,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses a MessagePack stream into a POJO model.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
index bd71e7c9d1..15840e1a4d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java
@@ -33,6 +33,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link MsgPackParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index b1f310aa66..92635e5c7b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to MessagePack.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
index 6f8c09b4e3..402e533649 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerSession.java
@@ -32,6 +32,9 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
+import org.apache.juneau.commons.bean.BeanPropertyValue;
 
 /**
  * Session object that lives for the duration of a single use of {@link MsgPackSerializer}.
@@ -325,7 +328,7 @@ public class MsgPackSerializerSession extends OutputStreamSerializerSession {
 		values.forEach(x -> {
 			BeanPropertyMeta pMeta = x.getMeta();
 			if (pMeta.canRead()) {
-				var cMeta = x.getClassMeta();
+				ClassMeta<?> cMeta = (ClassMeta<?>) x.getClassMeta();
 				String key = x.getName();
 				Object value = x.getValue();
 				serializeAnything(out, key, null, null, null);
@@ -374,7 +377,7 @@ public class MsgPackSerializerSession extends OutputStreamSerializerSession {
 	}
 
 	private boolean willRecurse(BeanPropertyValue v) throws SerializeException {
-		var aType = push2(v.getName(), v.getValue(), v.getClassMeta());
+		var aType = push2(v.getName(), v.getValue(), (ClassMeta<?>) v.getClassMeta());
 		if (nn(aType))
 			pop();
 		return aType == null;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
index 23abfdfe27..dbbb143d25 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.oapi;
 
 import org.apache.juneau.*;
 import org.apache.juneau.oapi.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the OpenAPI serializers and parsers pulled from the {@link OpenApi @OpenApi}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java
index 8c9db9a5dc..4e3ebb97b7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.oapi;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link OpenApiClassMeta} and {@link OpenApiBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
index c9d28d3e7e..3832f9c2ab 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParser.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.commons.httppart.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * OpenAPI part parser.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
index 80b1eaac05..0be16a159d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.commons.httppart.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJOs to values suitable for transmission as HTTP headers, query/form-data parameters, and path variables.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
index 608002ccbf..f1d2d35551 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectSearcher.java
@@ -23,6 +23,7 @@ import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * POJO model searcher.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
index 8a9d165e71..dd7ca5627d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ObjectViewer.java
@@ -23,6 +23,7 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * POJO model viewer.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetBeanPropertyMeta.java
index 534f83eebf..df499fe4b0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetBeanPropertyMeta.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.parquet;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to Parquet serializers and parsers.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetMetaProvider.java
index 6226966ab4..fbc8848f10 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.parquet;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link ParquetClassMeta} and {@link ParquetBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetParser.java
index cbf3399173..39c5752e5f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetParser.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.InputStreamParser;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses Apache Parquet binary data into bean collections.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSchemaBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSchemaBuilder.java
index b56fd56535..5cdfede964 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSchemaBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSchemaBuilder.java
@@ -32,10 +32,10 @@ import java.util.Set;
 import java.util.UUID;
 
 import org.apache.juneau.MarshallingContext;
-import org.apache.juneau.BeanPropertyMeta;
 import org.apache.juneau.ClassMeta;
 import org.apache.juneau.annotation.ParentProperty;
 import org.apache.juneau.commons.reflect.AnnotationProvider;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Builds Parquet schema (list of SchemaElement) from Juneau bean ClassMeta.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializer.java
index 254a613acb..d64a2a162f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializer.java
@@ -25,6 +25,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes bean collections to Apache Parquet binary format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializerSession.java
index 52495652be..68404f8a9a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parquet/ParquetSerializerSession.java
@@ -40,12 +40,12 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 
-import org.apache.juneau.BeanMap;
 import org.apache.juneau.ClassMeta;
 import org.apache.juneau.serializer.OutputStreamSerializerSession;
 import org.apache.juneau.serializer.SerializeException;
 import org.apache.juneau.serializer.SerializerPipe;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session for {@link ParquetSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
index 65182faf5a..63533be505 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java
@@ -20,6 +20,7 @@ import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 import static org.apache.juneau.commons.utils.Utils.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Class for listening for certain parse events during a document parse.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
index 4f6c49bef7..677e895077 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
@@ -41,6 +41,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.objecttools.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link Parser}.
@@ -1079,7 +1081,7 @@ public class ParserSession extends MarshallingSession {
 
 		// Resolve via @MarshalledProp(dictionary={})
 		if (nn(pMeta)) {
-			br = pMeta.getBeanRegistry();
+			br = (BeanRegistry) pMeta.getBeanRegistry();
 			if (nn(br) && br.hasName(typeName))
 				return br.getClassMeta(typeName);
 		}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
index 4279b1cf61..3995dcce9c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.plaintext;
 
 import org.apache.juneau.*;
 import org.apache.juneau.plaintext.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the PlainText serializers and parsers pulled from the {@link PlainText @PlainText}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java
index fc2b3b6942..e3dbb34ff4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.plaintext;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link PlainTextClassMeta} and {@link PlainTextBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
index 56a235480b..c2934cb0f4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
@@ -30,6 +30,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parsers HTTP plain text request bodies into Group 5 POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
index 0843512921..d19adabe99 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializer.java
@@ -30,6 +30,7 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.swap.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJOs to plain text using just the <c>toString()</c> method on the serialized object.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoBeanPropertyMeta.java
index a387596efd..4558155eb3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoBeanPropertyMeta.java
@@ -21,6 +21,7 @@ import static org.apache.juneau.commons.utils.Utils.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.proto.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the Proto serializers and parsers pulled from the {@link Proto @Proto}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoMetaProvider.java
index 23b0db456f..24a774d3ad 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.proto;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link ProtoClassMeta} and {@link ProtoBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParser.java
index e77722e645..e3b83c019e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParser.java
@@ -24,6 +24,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses Protobuf Text Format into a POJO model.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParserSession.java
index 3af2dc4521..1a1e7153ce 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoParserSession.java
@@ -27,6 +27,7 @@ import org.apache.juneau.collections.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
 
 /**
  * Session for parsing Protobuf Text Format into POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializer.java
index 9b122aaedd..57c5c09e68 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializer.java
@@ -24,6 +24,7 @@ import java.util.concurrent.*;
 import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to Protobuf Text Format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializerSession.java
index 2372544fe7..c7fc1d5182 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/proto/ProtoSerializerSession.java
@@ -27,6 +27,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for serializing objects to Protobuf Text Format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
index e2cd9ed53c..73d2d8d4d5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerListener.java
@@ -20,6 +20,7 @@ import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 import static org.apache.juneau.commons.utils.Utils.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Class for listening for serialize events during a serialization.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 0525211b24..7801ced5b3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -40,6 +40,10 @@ import org.apache.juneau.soap.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
+import org.apache.juneau.commons.bean.BeanPropertyValue;
 
 /**
  * Serializer session that lives for the duration of a single use of {@link Serializer}.
@@ -1077,7 +1081,7 @@ public class SerializerSession extends MarshallingTraverseSession {
 		}
 
 		// Then look on the bean property.
-		br = pMeta == null ? null : pMeta.getBeanRegistry();
+		br = pMeta == null ? null : (BeanRegistry) pMeta.getBeanRegistry();
 		if (nn(br)) {
 			tn = br.getTypeName(aType);
 			if (nn(tn) && ! tn.equals(eTypeTn))
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
index ddf6add139..9cdcd868df 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.soap;
 
 import org.apache.juneau.*;
 import org.apache.juneau.soap.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the SOAP/XML serializers and parsers pulled from the {@link SoapXml @SoapXml}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java
index 0827ff6cd2..e4058004e8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.soap;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link SoapXmlClassMeta} and {@link SoapXmlBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
index 1d92a6ffd6..253cfe688e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.xml.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJOs to HTTP responses as XML+SOAP.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlParserSession.java
index 07db20e614..98728e13d8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlParserSession.java
@@ -27,6 +27,8 @@ import org.apache.juneau.collections.JsonMap;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for parsing TOML into POJOs.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlSerializerSession.java
index aa9ccba5bd..f11e32823d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/toml/TomlSerializerSession.java
@@ -27,6 +27,8 @@ import java.util.function.*;
 import org.apache.juneau.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session for serializing objects to TOML format.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
index a9b12b408c..ff24ffe82e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.uon;
 
 import org.apache.juneau.*;
 import org.apache.juneau.uon.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the UON serializers and parsers pulled from the {@link Uon @Uon}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java
index 3123fb4466..d45a3561e8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.uon;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link UonClassMeta} and {@link UonBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
index cedb4cec65..2a139bf033 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParser.java
@@ -33,6 +33,7 @@ import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.commons.httppart.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses UON (a notation for URL-encoded query parameter values) text into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index eb59f5d715..0a23a019a7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -39,6 +39,8 @@ import org.apache.juneau.commons.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link UonParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
index 5ba2658ab5..793a0e4e3d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializer.java
@@ -32,6 +32,7 @@ import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.commons.httppart.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to UON (a notation for URL-encoded query parameter values).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index 7d66567bd2..0c14259e4e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -36,6 +36,8 @@ import org.apache.juneau.commons.conversion.BasicConverter;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link UonSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
index aa82866a56..b679df2c3e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
@@ -18,6 +18,7 @@ package org.apache.juneau.urlencoding;
 
 import org.apache.juneau.*;
 import org.apache.juneau.urlencoding.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the URL-Encoding serializers and parsers pulled from the {@link UrlEncoding @UrlEncoding}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
index 4fff0bd093..1e3acee1ec 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingMetaProvider.java
@@ -17,6 +17,7 @@
 package org.apache.juneau.urlencoding;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link UrlEncodingClassMeta} and {@link UrlEncodingBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index b077461d3a..a2b85a6d95 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses URL-encoded text into POJO models.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
index ea5407aa50..cc4a0ad04e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java
@@ -34,6 +34,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link UrlEncodingParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index 73dded5d23..e2d74d856c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -29,6 +29,7 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to URL-encoded notation with UON-encoded values (a notation for URL-encoded query paramter values).
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
index 1babb38907..e3a6873a39 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerSession.java
@@ -32,6 +32,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.uon.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link UrlEncodingSerializer}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index fdd1eaa7f0..c33f03e013 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -27,6 +27,8 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.xml.annotation.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on beans specific to the XML serializers and parsers pulled from the {@link Xml @Xml} annotation on the
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
index 00eb7bb0c4..11e90af2c5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
@@ -24,6 +24,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.xml.annotation.*;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Metadata on bean properties specific to the XML serializers and parsers pulled from the {@link Xml @Xml} annotation
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
index 97e99d1986..8aaf1953c9 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlMetaProvider.java
@@ -17,6 +17,8 @@
 package org.apache.juneau.xml;
 
 import org.apache.juneau.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Interface for providing access to {@link XmlClassMeta}, {@link XmlBeanMeta}, and {@link XmlBeanPropertyMeta} objects.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParser.java
index 743cf5ec1e..6d5a4d67d5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParser.java
@@ -35,6 +35,8 @@ import org.apache.juneau.commons.collections.*;
 import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.parser.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Parses text generated by the {@link XmlSerializer} class back into a POJO model.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
index 52fce04925..8246ad0f62 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java
@@ -40,6 +40,9 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link XmlParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index 6d9a45fdc1..8cfcd58c64 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -32,6 +32,8 @@ import org.apache.juneau.commons.function.*;
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.commons.bean.BeanMeta;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Serializes POJO models to XML.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 13b46ad88c..c27bc4bc27 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -513,7 +513,7 @@ public class XmlSerializerSession extends WriterSerializerSession {
 			if (attrs.contains(n) || attrs.contains("*") || n.equals(attrsProperty)) {
 				var pMeta = p.getMeta();
 				if (pMeta.canRead()) {
-					var kv = getPropertyKeyValueIfNotIgnored(p, pMeta, p.getClassMeta());
+					var kv = getPropertyKeyValueIfNotIgnored(p, pMeta, (ClassMeta<?>) p.getClassMeta());
 					if (kv.isEmpty())
 						continue;
 					var key = kv.get().getKey();
@@ -549,12 +549,12 @@ public class XmlSerializerSession extends WriterSerializerSession {
 		for (var p : lp) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			if (pMeta.canRead()) {
-				var cMeta = p.getClassMeta();
+				ClassMeta<?> cMeta = (ClassMeta<?>) p.getClassMeta();
 
 				var n = p.getName();
 				if (n.equals(contentProperty)) {
 					content = p.getValue();
-					contentType = p.getClassMeta();
+					contentType = (ClassMeta<?>) p.getClassMeta();
 					hasContent = true;
 					cf = xbm.getContentFormat();
 					if (cf.isOneOf(MIXED, MIXED_PWS, TEXT, TEXT_PWS, XMLTEXT))
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlParserSession.java
index c42fa76175..18b3e8a4ce 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlParserSession.java
@@ -36,6 +36,8 @@ import org.apache.juneau.httppart.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.utils.Iso8601Utils;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link YamlParser}.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlSerializerSession.java
index 0318f94764..63f99150f3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/yaml/YamlSerializerSession.java
@@ -32,6 +32,8 @@ import org.apache.juneau.commons.lang.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanPropertyMeta;
 
 /**
  * Session object that lives for the duration of a single use of {@link YamlSerializer}.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 08d75c0926..b7c8a4f409 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.juneau.rest;
 
+import org.apache.juneau.commons.bean.BeanMeta;
 import org.apache.juneau.commons.http.MediaType;
 import org.apache.juneau.commons.http.StringRanges;
 import static java.util.Optional.*;
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanPropertyValue_Test.java b/juneau-utest/src/test/java/org/apache/juneau/BeanPropertyValue_Test.java
index 22387ba287..62a76d4138 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanPropertyValue_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanPropertyValue_Test.java
@@ -19,6 +19,7 @@ package org.apache.juneau;
 import static org.junit.jupiter.api.Assertions.*;
 
 import org.junit.jupiter.api.*;
+import org.apache.juneau.commons.bean.BeanPropertyValue;
 
 class BeanPropertyValue_Test extends TestBase {
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanProxyInvocationHandler_Test.java b/juneau-utest/src/test/java/org/apache/juneau/BeanProxyInvocationHandler_Test.java
index e268a2836f..833a28a333 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanProxyInvocationHandler_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanProxyInvocationHandler_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import java.lang.reflect.*;
 
 import org.junit.jupiter.api.*;
+import org.apache.juneau.commons.bean.BeanProxyInvocationHandler;
 
 @SuppressWarnings({
 	"unchecked", // Cast from Object to T in proxy test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Test.java b/juneau-utest/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Test.java
index 5101ada344..d72f23ec2f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/commons/bean/BeanMeta_Test.java
@@ -22,6 +22,8 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.commons.bean.BeanMap;
+import org.apache.juneau.commons.bean.BeanMeta;
 
 /**
  * Tests the commons-side construction path of {@link BeanMeta} via
diff --git a/juneau-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java b/juneau-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
index 803565c608..e46ea621b8 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
@@ -30,6 +30,7 @@ import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.swap.*;
 import org.apache.juneau.testutils.pojos.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.commons.bean.BeanMap;
 
 @SuppressWarnings({
 	"serial", // Serialization not relevant for test beans
diff --git a/todo/TODO-5-bean-runtime-types-to-commons.md b/todo/TODO-5-bean-runtime-types-to-commons.md
index 7cab853f51..3903fb61d0 100644
--- a/todo/TODO-5-bean-runtime-types-to-commons.md
+++ b/todo/TODO-5-bean-runtime-types-to-commons.md
@@ -4,6 +4,63 @@ This is the remaining work from **Phase 5 of the bean-layer split**. Phase 5a (t
 
 ---
 
+## Status (Physical `git mv` LANDED — uncommitted)
+
+**All 5 remaining blockers cleared and the 7 bean-runtime files physically moved into `commons.bean`.** `juneau-commons` compiles standalone with no dependency on `juneau-marshall`. Full test suite (`scripts/test.py --test-only`) passes.
+
+### New file locations (post-`git mv`)
+
+| Old path | New path |
+| --- | --- |
+| `juneau-core/juneau-marshall/.../BeanMap.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMap.java` |
+| `juneau-core/juneau-marshall/.../BeanMapEntry.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMapEntry.java` |
+| `juneau-core/juneau-marshall/.../BeanMeta.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanMeta.java` |
+| `juneau-core/juneau-marshall/.../BeanPropertyMeta.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyMeta.java` |
+| `juneau-core/juneau-marshall/.../BeanPropertyValue.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyValue.java` |
+| `juneau-core/juneau-marshall/.../BeanPropertyConsumer.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanPropertyConsumer.java` |
+| `juneau-core/juneau-marshall/.../BeanProxyInvocationHandler.java` | `juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/bean/BeanProxyInvocationHandler.java` |
+
+### Blockers resolved
+
+- **Blocker 1 (BeanPropertyValue.getClassMeta)** — Return type widened from `ClassMeta<?>` to `BeanTypeInfo<?>`. Marshalling-side call sites cast back to `ClassMeta<?>` where needed (~5 sites in serializer sessions).
+- **Blocker 2 (BeanPropertyMeta.getBeanRegistry)** — Return type widened from `BeanRegistry` to `BeanRegistryLookup` (commons SPI). Marshalling-side call sites cast back to `BeanRegistry` where the concrete type is required.
+- **Blocker 3 (BeanMeta.create signature)** — Factory method accepts `BeanTypeInfo<T>` instead of `ClassMeta<T>`. `ClassMeta<T>` still works as the argument because `ClassMeta extends BeanTypeInfo` (post Phase C Task 1).
+- **Blocker 4 (BeanMeta.getMarshallingContext)** — Picked **option (a)** — renamed to a new `Object`-returning accessor that holds the marshalling-side resolver, fronted by `BeanTypeInfo.getMarshallingContext()`. Marshalling-side `ClassMeta` provides a covariant `MarshallingContext`-typed override so existing callers compile unchanged.
+- **Blocker 5 (MarshalledBeanMetaInitializer / MarshalledPropertyPostProcessor SPI)** — Two new commons-side SPI interfaces:
+  - `org.apache.juneau.commons.bean.BeanMetaInitializer` — with `buildBeanRegistry(...)`, `findTypeNameInParents(...)`, `resolveTypePropertyName(...)`, `findMarshalledTypeName(...)`, `hasBeanRegistrationAnnotation(...)`, `buildBeanFilter(BeanTypeInfo<?>)`. Has a `NOOP` default. `MarshalledBeanMetaInitializer` (marshalling-side) implements it and exposes `INSTANCE`.
+  - `org.apache.juneau.commons.bean.BeanPropertyPostProcessor` — with `process(Object marshallingContext, Object builder)`. Has a `NOOP` default. `MarshalledPropertyPostProcessor` (marshalling-side) implements it and casts the inputs back to `MarshallingContext` / `BeanPropertyMeta.Builder` internally.
+  - `BeanConfigContext` exposes both via `getBeanMetaInitializer()` / `getBeanPropertyPostProcessor()`. `MarshallingContext` wires the marshalling-side instances in via `BeanConfigContext.create()`.
+  - `BeanMeta` calls `config.getBeanMetaInitializer().X(...)` and `config.getBeanPropertyPostProcessor().process(...)` instead of static helper calls.
+
+### Build / test status
+
+- `mvn clean compile -pl juneau-core/juneau-commons -am` — **GREEN** (standalone, no `juneau-marshall` dependency).
+- `mvn clean install -DskipTests` — **GREEN** (all 16 modules build).
+- `python3 scripts/test.py --test-only` — **GREEN** (full test suite passes).
+
+### Visibility changes required by the move
+
+Several previously-protected or package-private members had to be widened so that marshalling-side callers (and `juneau-marshall-rdf` extensions) can still reach them after the package boundary changed:
+
+- `BeanMeta.BeanMetaValue` record made `public` (and its `optBeanMeta()` accessor).
+- `BeanMeta` accessors `getConstructor()`, `getConstructorArgs()`, `hasConstructor()`, `newBean(Object)` widened `protected → public`.
+- `BeanMap` constructor `(T, BeanMeta<T>)` and `setMarshallingSession(BeanSession)` widened `protected → public`.
+- `BeanPropertyMeta.Builder` fields (`innerField`, `getter`, `setter`, `rawTypeMeta`, `swap`, `readTransform`, `writeTransform`, `dictionaryClasses`, `isUri`, `typeMeta`) widened package-private → `public` (consumed by `MarshalledPropertyPostProcessor`).
+- `BeanPropertyValue.properties()` widened `protected → public` (consumed by `BeanPropertyValue_Test`).
+
+### Import sweep counts (uncommitted working tree)
+
+- 141 files updated in the automated sweep that added `import org.apache.juneau.commons.bean.X` for the 7 moved classes.
+- 5 manual import fixups for files the sweep missed: `CsvParserSession`, `ParquetSerializerSession`, `YamlParserSession`, `ParquetSchemaBuilder`, `TomlParserSession`, plus two `juneau-marshall-rdf` parser sessions (`RdfParserSession`, `RdfStreamParserSession`) and one rest-server file (`RestRequest`).
+
+### Follow-up checkpoints (not part of this move)
+
+- Release notes / migration guide entries for the package move (`org.apache.juneau.Bean{Map,Meta,PropertyMeta,...}` → `org.apache.juneau.commons.bean.*`) in `juneau-docs/docs/pages/release-notes/9.5.0.md`.
+- `package-info.java` for `org.apache.juneau.commons.bean` — verify it covers the new arrivals.
+- Eventual: move `BeanRegistry` itself to commons (currently `BeanRegistry` implements `BeanRegistryLookup` from marshalling-side; deferred until type-resolution code is similarly decoupled).
+
+---
+
 ## Status (Phase C Task 5 Step F — import cleanup landed, uncommitted)
 
 **Step F audit follow-up — Tasks 1–8 LANDED in the working tree (uncommitted).** Build + full test green (`scripts/test.py --full`). The 7 bean-runtime files now import only JDK packages + `org.apache.juneau.commons.*` (plus `org.apache.juneau.BeanMeta.MethodType.*` static self-import on `BeanMeta`).