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 2020/04/09 18:35:46 UTC

[juneau] branch master updated: Replace SERIALIZER_trimNullProperties with SERIALIZER_keepNullProperties.

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


The following commit(s) were added to refs/heads/master by this push:
     new 300bf06  Replace SERIALIZER_trimNullProperties with SERIALIZER_keepNullProperties.
300bf06 is described below

commit 300bf06f1c82d9984a00c1463ebd41d5c2149d29
Author: JamesBognar <ja...@apache.org>
AuthorDate: Thu Apr 9 14:35:27 2020 -0400

    Replace SERIALIZER_trimNullProperties with
    SERIALIZER_keepNullProperties.
---
 .../test/java/org/apache/juneau/BeanMapTest.java   |  6 +-
 .../java/org/apache/juneau/DynaBeanComboTest.java  |  2 +-
 .../juneau/SerializerPropertiesComboTest.java      | 33 +++++++++++
 .../a/rttests/RoundTripLargeObjectsTest.java       | 18 +++---
 .../org/apache/juneau/a/rttests/RoundTripTest.java | 38 ++++++------
 .../java/org/apache/juneau/html/CommonTest.java    |  6 +-
 .../java/org/apache/juneau/jena/CommonTest.java    |  4 +-
 .../java/org/apache/juneau/json/CommonTest.java    |  6 +-
 .../test/java/org/apache/juneau/json/JsonTest.java |  6 +-
 .../juneau/serializer/ReaderObjectComboTest.java   |  2 +-
 .../serializer/SerializerConfigAnnotationTest.java | 12 ++--
 .../org/apache/juneau/testutils/TestUtils.java     |  4 +-
 .../juneau/transforms/BeanDictionaryComboTest.java |  2 +-
 .../apache/juneau/transforms/BuilderComboTest.java |  2 +-
 .../transforms/ByteArrayBase64SwapComboTest.java   |  2 +-
 .../java/org/apache/juneau/uon/Common_UonTest.java |  4 +-
 .../juneau/urlencoding/Common_UrlEncodingTest.java |  4 +-
 .../java/org/apache/juneau/xml/CommonTest.java     |  4 +-
 .../java/org/apache/juneau/xml/XmlContentTest.java |  8 +--
 .../test/java/org/apache/juneau/xml/XmlTest.java   |  8 +--
 .../apache/juneau/jena/RdfSerializerBuilder.java   | 16 ++++-
 .../apache/juneau/jena/RdfSerializerSession.java   |  4 +-
 .../src/main/java/org/apache/juneau/BeanMap.java   | 12 ++--
 .../apache/juneau/csv/CsvSerializerBuilder.java    | 16 ++++-
 .../juneau/html/HtmlDocSerializerBuilder.java      | 16 ++++-
 .../juneau/html/HtmlSchemaSerializerBuilder.java   | 16 ++++-
 .../apache/juneau/html/HtmlSerializerBuilder.java  | 16 ++++-
 .../apache/juneau/html/HtmlSerializerSession.java  |  2 +-
 .../html/HtmlStrippedDocSerializerBuilder.java     | 16 ++++-
 .../apache/juneau/jso/JsoSerializerBuilder.java    | 16 ++++-
 .../juneau/json/JsonSchemaSerializerBuilder.java   |  2 +-
 .../apache/juneau/json/JsonSerializerBuilder.java  | 16 ++++-
 .../apache/juneau/json/JsonSerializerSession.java  |  2 +-
 .../juneau/json/SimpleJsonSerializerBuilder.java   | 16 ++++-
 .../juneau/msgpack/MsgPackSerializerBuilder.java   | 16 ++++-
 .../juneau/msgpack/MsgPackSerializerSession.java   |  8 +--
 .../juneau/oapi/OpenApiSerializerBuilder.java      | 16 ++++-
 .../juneau/oapi/OpenApiSerializerSession.java      |  2 +-
 .../plaintext/PlainTextSerializerBuilder.java      | 16 ++++-
 .../serializer/OutputStreamSerializerBuilder.java  | 16 ++++-
 .../org/apache/juneau/serializer/Serializer.java   | 69 +++++++++++++++++++---
 .../juneau/serializer/SerializerBuilder.java       | 41 +++++++++++++
 .../juneau/serializer/SerializerGroupBuilder.java  | 37 ++++++++++++
 .../juneau/serializer/SerializerSession.java       | 14 ++---
 .../juneau/serializer/WriterSerializerBuilder.java | 16 ++++-
 .../serializer/annotation/SerializerConfig.java    | 32 ++++++++++
 .../annotation/SerializerConfigApply.java          |  3 +
 .../juneau/soap/SoapXmlSerializerBuilder.java      | 16 ++++-
 .../apache/juneau/uon/UonSerializerBuilder.java    | 16 ++++-
 .../apache/juneau/uon/UonSerializerSession.java    |  2 +-
 .../urlencoding/UrlEncodingSerializerBuilder.java  | 16 ++++-
 .../urlencoding/UrlEncodingSerializerSession.java  |  2 +-
 .../apache/juneau/xml/XmlSerializerBuilder.java    | 16 ++++-
 .../apache/juneau/xml/XmlSerializerSession.java    |  6 +-
 .../examples/core/xml/XmlConfigurationExample.java |  2 +-
 .../org/apache/juneau/examples/rest/TestUtils.java |  4 +-
 .../apache/juneau/rest/client2/RestClientTest.java | 41 +++++++++++--
 .../juneau/rest/client2/RestClientBuilder.java     | 39 ++++++++++++
 .../apache/juneau/rest/mock2/MockRestClient.java   | 16 ++++-
 59 files changed, 649 insertions(+), 150 deletions(-)

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
index 707dd43..2aa5732 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
@@ -2068,16 +2068,16 @@ public class BeanMapTest {
 		Z z = new Z();
 		BeanMap<Z> bm = BeanContext.DEFAULT.createSession().toBeanMap(z);
 
-		Iterator i = bm.getValues(true).iterator();
+		Iterator i = bm.getValues(false).iterator();
 		assertFalse(i.hasNext());
 
 		z.b = "";
-		i = bm.getValues(true).iterator();
+		i = bm.getValues(false).iterator();
 		assertTrue(i.hasNext());
 		i.next();
 		assertFalse(i.hasNext());
 
-		i = bm.getValues(false).iterator();
+		i = bm.getValues(true).iterator();
 		assertTrue(i.hasNext());
 		i.next();
 		assertTrue(i.hasNext());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/DynaBeanComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/DynaBeanComboTest.java
index 25aff7f..45a7677 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/DynaBeanComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/DynaBeanComboTest.java
@@ -251,7 +251,7 @@ public class DynaBeanComboTest extends ComboRoundTripTest {
 
 	@Override
 	protected Serializer applySettings(Serializer s) throws Exception {
-		return s.builder().trimNullProperties(false).build();
+		return s.builder().keepNullProperties().build();
 	}
 
 	@Override
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
index 0fe0272..03467d8 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
@@ -48,6 +48,10 @@ public class SerializerPropertiesComboTest extends ComboRoundTripTest {
 		public OMap f2 = OMap.of();
 	}
 
+	public static class T7 {
+		public String f;
+	}
+
 	@Parameterized.Parameters
 	public static Collection<Object[]> getParameters() {
 		return Arrays.asList(new Object[][] {
@@ -254,6 +258,35 @@ public class SerializerPropertiesComboTest extends ComboRoundTripTest {
 				)
 				.properties(OMap.of(SERIALIZER_trimEmptyMaps, true))
 			},
+			{ 	/* 7 */
+				new ComboInput<>(
+					"SERIALIZER_keepNullProperties",
+					T7.class,
+					new T7(),
+					/* Json */		"{f:null}",
+					/* JsonT */		"{f:null}",
+					/* JsonR */		"{\n\tf: null\n}",
+					/* Xml */		"<object><f _type='null'/></object>",
+					/* XmlT */		"<object><f t='null'/></object>",
+					/* XmlR */		"<object>\n\t<f _type='null'/>\n</object>\n",
+					/* XmlNs */		"<object><f _type='null'/></object>",
+					/* Html */		"<table><tr><td>f</td><td><null/></td></tr></table>",
+					/* HtmlT */		"<table><tr><td>f</td><td><null/></td></tr></table>",
+					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td><null/></td>\n\t</tr>\n</table>\n",
+					/* Uon */		"(f=null)",
+					/* UonT */		"(f=null)",
+					/* UonR */		"(\n\tf=null\n)",
+					/* UrlEnc */	"f=null",
+					/* UrlEncT */	"f=null",
+					/* UrlEncR */	"f=null",
+					/* MsgPack */	"81A166C0",
+					/* MsgPackT */	"81A166C0",
+					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:f rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Description>\n</rdf:RDF>\n",
+					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:f rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Description>\n</rdf:RDF>\n",
+					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:f rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n  </rdf:Description>\n</rdf:RDF>\n"
+				)
+				.properties(OMap.of(SERIALIZER_keepNullProperties, true))
+			},
 		});
 	}
 
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
index af718ef..cfc5e3a 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
@@ -49,55 +49,55 @@ public class RoundTripLargeObjectsTest extends RoundTripTest {
 			// Full round-trip testing
 			{ /* 0 */
 				"Json DEFAULT",
-				JsonSerializer.create().trimNullProperties(false),
+				JsonSerializer.create().keepNullProperties(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 1 */
 				"SimpleJson DEFAULT",
-				JsonSerializer.create().ssq().trimNullProperties(false),
+				JsonSerializer.create().ssq().keepNullProperties(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 2 */
 				"Json DEFAULT_SQ",
-				JsonSerializer.create().ssq().trimNullProperties(false),
+				JsonSerializer.create().ssq().keepNullProperties(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 3 */
 				"Xml DEFAULT w/namespaces,validation",
-				XmlSerializer.create().sq().ns().trimNullProperties(false).addNamespaceUrisToRoot().useWhitespace(),
+				XmlSerializer.create().sq().ns().keepNullProperties().addNamespaceUrisToRoot().useWhitespace(),
 				XmlParser.create(),
 				CHECK_XML_WHITESPACE | VALIDATE_XML
 			},
 			{ /* 4 */
 				"Xml DEFAULT wo/namespaces,validation",
-				XmlSerializer.create().sq().trimNullProperties(false),
+				XmlSerializer.create().sq().keepNullProperties(),
 				XmlParser.create(),
 				CHECK_XML_WHITESPACE
 			},
 			{ /* 5 */
 				"Html",
-				HtmlSerializer.create().trimNullProperties(false),
+				HtmlSerializer.create().keepNullProperties(),
 				HtmlParser.create(),
 				CHECK_XML_WHITESPACE
 			},
 			{ /* 6 */
 				"UrlEncoding",
-				UrlEncodingSerializer.create().trimNullProperties(false),
+				UrlEncodingSerializer.create().keepNullProperties(),
 				UrlEncodingParser.create(),
 				0
 			},
 			{ /* 7 */
 				"Uon",
-				UonSerializer.create().trimNullProperties(false),
+				UonSerializer.create().keepNullProperties(),
 				UonParser.create(),
 				0
 			},
 			{ /* 8 */
 				"MsgPack",
-				MsgPackSerializer.create().trimNullProperties(false),
+				MsgPackSerializer.create().keepNullProperties(),
 				MsgPackParser.create(),
 				0
 			},
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
index 0974ec4..1362570 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
@@ -50,43 +50,43 @@ public abstract class RoundTripTest {
 			// Full round-trip testing
 			{ /* 0 */
 				"Json - default",
-				JsonSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				JsonSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 1 */
 				"Json - lax",
-				JsonSerializer.create().ssq().trimNullProperties(false).addBeanTypes().addRootType(),
+				JsonSerializer.create().ssq().keepNullProperties().addBeanTypes().addRootType(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 2 */
 				"Json - lax, readable",
-				JsonSerializer.create().ssq().ws().trimNullProperties(false).addBeanTypes().addRootType(),
+				JsonSerializer.create().ssq().ws().keepNullProperties().addBeanTypes().addRootType(),
 				JsonParser.create(),
 				0
 			},
 			{ /* 3 */
 				"Xml - namespaces, validation, readable",
-				XmlSerializer.create().ns().sq().trimNullProperties(false).addNamespaceUrisToRoot().useWhitespace().addBeanTypes().addRootType(),
+				XmlSerializer.create().ns().sq().keepNullProperties().addNamespaceUrisToRoot().useWhitespace().addBeanTypes().addRootType(),
 				XmlParser.create(),
 				CHECK_XML_WHITESPACE | VALIDATE_XML
 			},
 			{ /* 4 */
 				"Xml - no namespaces, validation",
-				XmlSerializer.create().sq().trimNullProperties(false).addBeanTypes().addRootType(),
+				XmlSerializer.create().sq().keepNullProperties().addBeanTypes().addRootType(),
 				XmlParser.create(),
 				CHECK_XML_WHITESPACE
 			},
 			{ /* 5 */
 				"Html - default",
-				HtmlSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				HtmlSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				HtmlParser.create(),
 				CHECK_XML_WHITESPACE
 			},
 			{ /* 6 */
 				"Html - readable",
-				HtmlSerializer.create().sq().ws().trimNullProperties(false).addBeanTypes().addRootType(),
+				HtmlSerializer.create().sq().ws().keepNullProperties().addBeanTypes().addRootType(),
 				HtmlParser.create(),
 				CHECK_XML_WHITESPACE
 			},
@@ -98,31 +98,31 @@ public abstract class RoundTripTest {
 			},
 			{ /* 8 */
 				"Uon - default",
-				UonSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				UonSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				UonParser.create(),
 				0
 			},
 			{ /* 9 */
 				"Uon - readable",
-				UonSerializer.create().ws().trimNullProperties(false).addBeanTypes().addRootType(),
+				UonSerializer.create().ws().keepNullProperties().addBeanTypes().addRootType(),
 				UonParser.create(),
 				0
 			},
 			{ /* 10 */
 				"Uon - encoded",
-				UonSerializer.create().encoding().trimNullProperties(false).addBeanTypes().addRootType(),
+				UonSerializer.create().encoding().keepNullProperties().addBeanTypes().addRootType(),
 				UonParser.create().decoding(),
 				0
 			},
 			{ /* 11 */
 				"UrlEncoding - default",
-				UrlEncodingSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				UrlEncodingSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				UrlEncodingParser.create(),
 				0
 			},
 			{ /* 12 */
 				"UrlEncoding - readable",
-				UrlEncodingSerializer.create().ws().trimNullProperties(false).addBeanTypes().addRootType(),
+				UrlEncodingSerializer.create().ws().keepNullProperties().addBeanTypes().addRootType(),
 				UrlEncodingParser.create(),
 				0
 			},
@@ -134,37 +134,37 @@ public abstract class RoundTripTest {
 			},
 			{ /* 14 */
 				"Rdf.Xml",
-				RdfXmlSerializer.create().trimNullProperties(false).addLiteralTypes().addBeanTypes().addRootType(),
+				RdfXmlSerializer.create().keepNullProperties().addLiteralTypes().addBeanTypes().addRootType(),
 				RdfXmlParser.create(),
 				0
 			},
 			{ /* 15 */
 				"Rdf.XmlAbbrev",
-				RdfXmlAbbrevSerializer.create().trimNullProperties(false).addLiteralTypes().addBeanTypes().addRootType(),
+				RdfXmlAbbrevSerializer.create().keepNullProperties().addLiteralTypes().addBeanTypes().addRootType(),
 				RdfXmlParser.create(),
 				0
 			},
 			{ /* 16 */
 				"Rdf.Turtle",
-				TurtleSerializer.create().trimNullProperties(false).addLiteralTypes().addBeanTypes().addRootType(),
+				TurtleSerializer.create().keepNullProperties().addLiteralTypes().addBeanTypes().addRootType(),
 				TurtleParser.create(),
 				0
 			},
 			{ /* 17 */
 				"Rdf.NTriple",
-				NTripleSerializer.create().trimNullProperties(false).addLiteralTypes().addBeanTypes().addRootType(),
+				NTripleSerializer.create().keepNullProperties().addLiteralTypes().addBeanTypes().addRootType(),
 				NTripleParser.create(),
 				0
 			},
 			{ /* 18 */
 				"Rdf.N3",
-				N3Serializer.create().trimNullProperties(false).addLiteralTypes().addBeanTypes().addRootType(),
+				N3Serializer.create().keepNullProperties().addLiteralTypes().addBeanTypes().addRootType(),
 				N3Parser.create(),
 				0
 			},
 			{ /* 19 */
 				"MsgPack",
-				MsgPackSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				MsgPackSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				MsgPackParser.create(),
 				0
 			},
@@ -172,7 +172,7 @@ public abstract class RoundTripTest {
 			// Validation testing only
 			{ /* 20 */
 				"Json schema",
-				JsonSchemaSerializer.create().trimNullProperties(false).addBeanTypes().addRootType(),
+				JsonSchemaSerializer.create().keepNullProperties().addBeanTypes().addRootType(),
 				null,
 				RETURN_ORIGINAL_OBJECT
 			},
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
index cf3df4c..d72fb00 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -36,13 +36,13 @@ public class CommonTest {
 		HtmlParser p = HtmlParser.DEFAULT;
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>s1</td><td><null/></td></tr><tr><td>s2</td><td>s2</td></tr></table>", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>s2</td><td>s2</td></tr></table>", r);
 		t2 = p.parse(r, A.class);
@@ -439,7 +439,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testBasicBean() throws Exception {
-		WriterSerializer s = HtmlSerializer.create().sq().trimNullProperties(false).sortProperties().addKeyValueTableHeaders().build();
+		WriterSerializer s = HtmlSerializer.create().sq().keepNullProperties().sortProperties().addKeyValueTableHeaders().build();
 
 		J a = new J();
 		a.setF1("J");
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
index 799f700..f7a9275 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -50,13 +50,13 @@ public class CommonTest {
 		RdfParser p = RdfXmlParser.DEFAULT;
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("<rdf:Description><jp:s1 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><jp:s2>s2</jp:s2></rdf:Description>", strip(r));
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("<rdf:Description><jp:s2>s2</jp:s2></rdf:Description>", strip(r));
 		t2 = p.parse(r, A.class);
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
index f931230..7579b26 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/CommonTest.java
@@ -35,13 +35,13 @@ public class CommonTest {
 		JsonParser p = JsonParser.DEFAULT;
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("{s1:null,s2:'s2'}", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("{s2:'s2'}", r);
 		t2 = p.parse(r, A.class);
@@ -316,7 +316,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testBasicBean() throws Exception {
-		JsonSerializer s = JsonSerializer.create().ssq().trimNullProperties(false).sortProperties().build();
+		JsonSerializer s = JsonSerializer.create().ssq().keepNullProperties().sortProperties().build();
 
 		J a = new J();
 		a.setF1("J");
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
index 8da607a..3385b1b 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/json/JsonTest.java
@@ -33,8 +33,8 @@ public class JsonTest {
 		Map<String,Object> m = new LinkedHashMap<>();
 		List<Object> l = new LinkedList<>();
 
-		WriterSerializer s1 = JsonSerializer.create().ssq().trimNullProperties(false).build();
-		WriterSerializer s2 = JsonSerializer.create().simple().trimNullProperties(false).build();
+		WriterSerializer s1 = JsonSerializer.create().ssq().keepNullProperties().build();
+		WriterSerializer s2 = JsonSerializer.create().simple().keepNullProperties().build();
 		String r;
 
 		// Null keys and values
@@ -109,7 +109,7 @@ public class JsonTest {
 	//====================================================================================================
 	@Test
 	public void testBackslashesInStrings() throws Exception {
-		JsonSerializer s = JsonSerializer.create().simple().trimNullProperties(false).build();
+		JsonSerializer s = JsonSerializer.create().simple().keepNullProperties().build();
 		String r, r2;
 
 		// [\\]
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/ReaderObjectComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/ReaderObjectComboTest.java
index 8ad4677..f58dd38 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/ReaderObjectComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/ReaderObjectComboTest.java
@@ -338,7 +338,7 @@ public class ReaderObjectComboTest extends ComboSerializeTest {
 
 	@Override
 	protected Serializer applySettings(Serializer s) throws Exception {
-		return s.builder().trimNullProperties(false).build();
+		return s.builder().keepNullProperties().build();
 	}
 
 	public static class BeanWithReaderField {
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
index bb824f4..7b89bba 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
@@ -86,7 +86,7 @@ public class SerializerConfigAnnotationTest {
 		check("true", x.isSortMaps());
 		check("true", x.isTrimEmptyCollections());
 		check("true", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("true", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
@@ -106,7 +106,7 @@ public class SerializerConfigAnnotationTest {
 		check("true", x.isSortMaps());
 		check("true", x.isTrimEmptyCollections());
 		check("true", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("true", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
@@ -134,7 +134,7 @@ public class SerializerConfigAnnotationTest {
 		check("false", x.isSortMaps());
 		check("false", x.isTrimEmptyCollections());
 		check("false", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("false", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
@@ -154,7 +154,7 @@ public class SerializerConfigAnnotationTest {
 		check("false", x.isSortMaps());
 		check("false", x.isTrimEmptyCollections());
 		check("false", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("false", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
@@ -181,7 +181,7 @@ public class SerializerConfigAnnotationTest {
 		check("false", x.isSortMaps());
 		check("false", x.isTrimEmptyCollections());
 		check("false", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("false", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
@@ -201,7 +201,7 @@ public class SerializerConfigAnnotationTest {
 		check("false", x.isSortMaps());
 		check("false", x.isTrimEmptyCollections());
 		check("false", x.isTrimEmptyMaps());
-		check("true", x.isTrimNullProperties());
+		check("false", x.isKeepNullProperties());
 		check("false", x.isTrimStrings());
 		check("{absoluteAuthority:'/',absoluteContextRoot:'/',absolutePathInfo:'/',absolutePathInfoParent:'/',absoluteServletPath:'/',absoluteServletPathParent:'/',rootRelativeContextRoot:'/',rootRelativePathInfo:'/',rootRelativePathInfoParent:'/',rootRelativeServletPath:'/',rootRelativeServletPathParent:'/'}", x.getUriContext());
 		check("RESOURCE", x.getUriRelativity());
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/testutils/TestUtils.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/testutils/TestUtils.java
index 76f1487..a2fd5a2 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/testutils/TestUtils.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/testutils/TestUtils.java
@@ -37,7 +37,7 @@ public class TestUtils {
 
 	private static JsonSerializer js = JsonSerializer.create()
 		.ssq()
-		.trimNullProperties(false)
+		.keepNullProperties()
 		.addBeanTypes().addRootType()
 		.build();
 
@@ -45,7 +45,7 @@ public class TestUtils {
 		.ssq()
 		.sortCollections()
 		.sortMaps()
-		.trimNullProperties(false)
+		.keepNullProperties()
 		.addBeanTypes().addRootType()
 		.build();
 
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BeanDictionaryComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BeanDictionaryComboTest.java
index aacf72a..34a9a06 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BeanDictionaryComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BeanDictionaryComboTest.java
@@ -856,7 +856,7 @@ public class BeanDictionaryComboTest extends ComboRoundTripTest {
 
 	@Override
 	protected Serializer applySettings(Serializer s) throws Exception {
-		return s.builder().trimNullProperties(false).build();
+		return s.builder().keepNullProperties().build();
 	}
 
 	@Override
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BuilderComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BuilderComboTest.java
index 9e3b905..4963da7 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BuilderComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/BuilderComboTest.java
@@ -250,7 +250,7 @@ public class BuilderComboTest extends ComboRoundTripTest {
 
 	@Override
 	protected Serializer applySettings(Serializer s) throws Exception {
-		return s.builder().trimNullProperties(false).build();
+		return s.builder().keepNullProperties().build();
 	}
 
 	@Override
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
index 2d49601..2bd6de9 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64SwapComboTest.java
@@ -417,7 +417,7 @@ public class ByteArrayBase64SwapComboTest extends ComboRoundTripTest {
 
 	@Override
 	protected Serializer applySettings(Serializer s) throws Exception {
-		return s.builder().pojoSwaps(ByteArraySwap.Base64.class).trimNullProperties(false).build();
+		return s.builder().pojoSwaps(ByteArraySwap.Base64.class).keepNullProperties().build();
 	}
 
 	@Override
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
index 227bff5..063f76e 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/uon/Common_UonTest.java
@@ -36,13 +36,13 @@ public class Common_UonTest {
 		UonSerializerBuilder s = UonSerializer.create().encoding();
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("(s1=null,s2=s2)", r);
 		t2 = pe.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("(s2=s2)", r);
 		t2 = p.parse(r, A.class);
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
index f67f025..b4aef7c 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
@@ -35,13 +35,13 @@ public class Common_UrlEncodingTest {
 		UrlEncodingSerializerBuilder s = UrlEncodingSerializer.create();
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("s1=null&s2=s2", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("s2=s2", r);
 		t2 = p.parse(r, A.class);
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
index 007b804..2cdca2a 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -39,13 +39,13 @@ public class CommonTest {
 		XmlParser p = XmlParser.DEFAULT;
 		A t1 = A.create(), t2;
 
-		s.trimNullProperties(false);
+		s.keepNullProperties();
 		String r = s.build().serialize(t1);
 		assertEquals("<object><s1 _type='null'/><s2>s2</s2></object>", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
-		s.trimNullProperties(true);
+		s.keepNullProperties(false);
 		r = s.build().serialize(t1);
 		assertEquals("<object><s2>s2</s2></object>", r);
 		t2 = p.parse(r, A.class);
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlContentTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlContentTest.java
index 9b5dcbf..0aac523 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlContentTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -31,8 +31,8 @@ public class XmlContentTest {
 	@Test
 	public void testContentFormat() throws Exception {
 		A t = A.newInstance(), t2;
-		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ.builder().trimNullProperties(false).build(),
-			s2 = XmlSerializer.create().sq().ws().enableNamespaces(false).trimNullProperties(false).build();
+		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ.builder().keepNullProperties().build(),
+			s2 = XmlSerializer.create().sq().ws().enableNamespaces(false).keepNullProperties().build();
 		XmlParser p = XmlParser.DEFAULT;
 		WriterSerializerSession session;
 		String r;
@@ -139,8 +139,8 @@ public class XmlContentTest {
 	@Test
 	public void testXmlMixed() throws Exception {
 		B t = B.newInstance(), t2;
-		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ.builder().trimNullProperties(false).build(),
-			s2 = XmlSerializer.create().sq().ws().enableNamespaces(false).trimNullProperties(false).build();
+		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ.builder().keepNullProperties().build(),
+			s2 = XmlSerializer.create().sq().ws().enableNamespaces(false).keepNullProperties().build();
 		XmlParser p = XmlParser.DEFAULT;
 		WriterSerializerSession session;
 		String r;
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
index 2f177be..f3ff02c 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/xml/XmlTest.java
@@ -77,12 +77,12 @@ public class XmlTest {
 			+"</object>\n";
 
 		OMap m = (OMap) XmlParser.DEFAULT.parse(xml1, Object.class);
-		String json2 = JsonSerializer.create().simple().ws().trimNullProperties(false).build().serialize(m);
+		String json2 = JsonSerializer.create().simple().ws().keepNullProperties().build().serialize(m);
 		assertEquals(json1, json2);
 
 		m = (OMap) JsonParser.DEFAULT.parse(json1, Object.class);
 		String xml2 = XmlSerializer.create().sq().ws()
-			.trimNullProperties(false)
+			.keepNullProperties()
 			.build()
 			.serialize(m);
 		assertEquals(xml1, xml2);
@@ -136,7 +136,7 @@ public class XmlTest {
 		String r = XmlSerializer.create().ns().sq().ws()
 			.addNamespaceUrisToRoot()
 			.defaultNamespace("http://www.apache.org")
-			.trimNullProperties(false)
+			.keepNullProperties()
 			.build()
 			.serialize(m);
 		assertEquals(xml1, r);
@@ -358,7 +358,7 @@ public class XmlTest {
 		String r = null;
 		r = s.build().serialize(t);
 		assertEquals("<object f1='1' f2='2' f3='3'/>", r);
-		s.enableNamespaces(true).addNamespaceUrisToRoot().autoDetectNamespaces(true).trimNullProperties(false);
+		s.enableNamespaces(true).addNamespaceUrisToRoot().autoDetectNamespaces(true).keepNullProperties();
 		t.f1 = 4; t.f2 = 5; t.f3 = 6;
 		r = s.build().serialize(t);
 		assertEquals("<object xmlns='http://www.apache.org/2013/Juneau' xmlns:bar='http://bar' xmlns:foo='http://foo' xmlns:baz='http://baz' bar:f1='4' foo:f2='5' baz:f3='6'/>", r);
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index fcedc7a..ec9040a 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -1690,13 +1690,25 @@ public class RdfSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public RdfSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public RdfSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public RdfSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public RdfSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1750,7 +1762,7 @@ public class RdfSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public RdfSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index ca86dd0..9f1a715 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -196,7 +196,7 @@ public final class RdfSerializerSession extends WriterSerializerSession {
 
 		if (o == null || sType.isChar() && ((Character)o).charValue() == 0) {
 			if (bpm != null) {
-				if (! isTrimNullProperties()) {
+				if (isKeepNullProperties()) {
 					n = m.createResource(RDF_NIL);
 				}
 			} else {
@@ -310,7 +310,7 @@ public final class RdfSerializerSession extends WriterSerializerSession {
 	}
 
 	private void serializeBeanMap(BeanMap<?> m, Resource r, String typeName) throws IOException, SerializeException {
-		List<BeanPropertyValue> l = m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null);
+		List<BeanPropertyValue> l = m.getValues(isKeepNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null);
 		Collections.reverse(l);
 		for (BeanPropertyValue bpv : l) {
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
index 04e02ec..d623756 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
@@ -464,16 +464,16 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 	 * <p>
 	 * This allows a snapshot of all values to be grabbed from a bean in one call.
 	 *
-	 * @param ignoreNulls
-	 * 	Don't return properties whose values are null.
+	 * @param keepNulls
+	 * 	Also return properties whose values are null.
 	 * @param prependVals
 	 * 	Additional bean property values to prepended to this list.
 	 * 	Any <jk>null</jk> values in this list will be ignored.
 	 * @return The list of all bean property values.
 	 */
-	public List<BeanPropertyValue> getValues(final boolean ignoreNulls, BeanPropertyValue...prependVals) {
+	public List<BeanPropertyValue> getValues(boolean keepNulls, BeanPropertyValue...prependVals) {
 		Collection<BeanPropertyMeta> properties = getProperties();
-		int capacity = (ignoreNulls && properties.size() > 10) ? 10 : properties.size() + prependVals.length;
+		int capacity = ((! keepNulls) && properties.size() > 10) ? 10 : properties.size() + prependVals.length;
 		List<BeanPropertyValue> l = new ArrayList<>(capacity);
 		for (BeanPropertyValue v : prependVals)
 			if (v != null)
@@ -486,13 +486,13 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 						if (dynaMap != null) {
 							for (String pName : bpm.getDynaMap(bean).keySet()) {
 								Object val = bpm.get(this, pName);
-								if (val != null || ! ignoreNulls)
+								if (val != null || keepNulls)
 									l.add(new BeanPropertyValue(bpm, pName, val, null));
 							}
 						}
 					} else {
 						Object val = bpm.get(this, null);
-						if (val != null || ! ignoreNulls)
+						if (val != null || keepNulls)
 							l.add(new BeanPropertyValue(bpm, bpm.getName(), val, null));
 					}
 				} catch (Error e) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
index da5c437..edaa35e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerBuilder.java
@@ -811,13 +811,25 @@ public class CsvSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public CsvSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public CsvSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public CsvSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public CsvSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -871,7 +883,7 @@ public class CsvSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public CsvSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
index 90d7708..87ae567 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerBuilder.java
@@ -1337,13 +1337,25 @@ public class HtmlDocSerializerBuilder extends HtmlStrippedDocSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlDocSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public HtmlDocSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public HtmlDocSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public HtmlDocSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1397,7 +1409,7 @@ public class HtmlDocSerializerBuilder extends HtmlStrippedDocSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlDocSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
index 487fb6f..bc3ea60 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSchemaSerializerBuilder.java
@@ -1052,13 +1052,25 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlSchemaSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public HtmlSchemaSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public HtmlSchemaSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public HtmlSchemaSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1112,7 +1124,7 @@ public class HtmlSchemaSerializerBuilder extends HtmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlSchemaSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
index 4338bb7..20b2d8b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerBuilder.java
@@ -985,13 +985,25 @@ public class HtmlSerializerBuilder extends XmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public HtmlSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public HtmlSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public HtmlSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1045,7 +1057,7 @@ public class HtmlSerializerBuilder extends XmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 84d8b27..e617660 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -476,7 +476,7 @@ public class HtmlSerializerSession extends XmlSerializerSession {
 			out.ie(i+1).eTag("tr").nl(i+1);
 		}
 
-		for (BeanPropertyValue p : m.getValues(isTrimNullProperties())) {
+		for (BeanPropertyValue p : m.getValues(isKeepNullProperties())) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
index 0e3d93b..a58259a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlStrippedDocSerializerBuilder.java
@@ -811,13 +811,25 @@ public class HtmlStrippedDocSerializerBuilder extends HtmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlStrippedDocSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public HtmlStrippedDocSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public HtmlStrippedDocSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public HtmlStrippedDocSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -871,7 +883,7 @@ public class HtmlStrippedDocSerializerBuilder extends HtmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public HtmlStrippedDocSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
index 127e699..ef90fc2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoSerializerBuilder.java
@@ -810,13 +810,25 @@ public class JsoSerializerBuilder extends OutputStreamSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public JsoSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public JsoSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public JsoSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public JsoSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -870,7 +882,7 @@ public class JsoSerializerBuilder extends OutputStreamSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public JsoSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
index 6366b3c..e728f99 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSchemaSerializerBuilder.java
@@ -473,7 +473,7 @@ public class JsonSchemaSerializerBuilder extends JsonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* SerializerBuilder */
+	@Deprecated @Override /* SerializerBuilder */
 	public JsonSchemaSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
index c84fb11..e25b230 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonSerializerBuilder.java
@@ -907,13 +907,25 @@ public class JsonSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public JsonSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public JsonSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public JsonSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public JsonSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -967,7 +979,7 @@ public class JsonSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public JsonSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
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 3327eb4..8e9acf1 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
@@ -204,7 +204,7 @@ public class JsonSerializerSession extends WriterSerializerSession {
 		out.append('{');
 
 		boolean addComma = false;
-		for (BeanPropertyValue p : m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
+		for (BeanPropertyValue p : m.getValues(isKeepNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			if (pMeta.canRead()) {
 				ClassMeta<?> cMeta = p.getClassMeta();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializerBuilder.java
index 4f39417..e563835 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonSerializerBuilder.java
@@ -810,13 +810,25 @@ public class SimpleJsonSerializerBuilder extends JsonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public SimpleJsonSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public SimpleJsonSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public SimpleJsonSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public SimpleJsonSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -870,7 +882,7 @@ public class SimpleJsonSerializerBuilder extends JsonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public SimpleJsonSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
index 17a79ec..14548bb 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerBuilder.java
@@ -810,13 +810,25 @@ public class MsgPackSerializerBuilder extends OutputStreamSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public MsgPackSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public MsgPackSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public MsgPackSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public MsgPackSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -870,7 +882,7 @@ public class MsgPackSerializerBuilder extends OutputStreamSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public MsgPackSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
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 a6e38f0..898c0f2 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
@@ -171,14 +171,14 @@ public final class MsgPackSerializerSession extends OutputStreamSerializerSessio
 
 	private void serializeBeanMap(MsgPackOutputStream out, final BeanMap<?> m, String typeName) throws IOException, SerializeException {
 
-		List<BeanPropertyValue> values = m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null);
+		List<BeanPropertyValue> values = m.getValues(isKeepNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null);
 
 		int size = values.size();
 		for (BeanPropertyValue p : values) {
 			if (p.getThrown() != null)
 				size--;
 			// Must handle the case where recursion occurs and property is not serialized.
-			if (isTrimNullProperties() && willRecurse(p))
+			if ((! isKeepNullProperties()) && willRecurse(p))
 				size--;
 		}
 
@@ -193,7 +193,7 @@ public final class MsgPackSerializerSession extends OutputStreamSerializerSessio
 				Throwable t = p.getThrown();
 				if (t != null) {
 					onBeanGetterException(pMeta, t);
-				} else if (isTrimNullProperties() && willRecurse(p)) {
+				} else if ((! isKeepNullProperties()) && willRecurse(p)) {
 					/* Ignored */
 				} else {
 					serializeAnything(out, key, null, null, null);
@@ -202,7 +202,7 @@ public final class MsgPackSerializerSession extends OutputStreamSerializerSessio
 			}
 		}
 	}
-	
+
 	private boolean willRecurse(BeanPropertyValue v) throws SerializeException {
 		ClassMeta<?> aType = push2(v.getName(), v.getValue(), v.getClassMeta());
 		 if (aType != null)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
index fab35d1..2da8131 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerBuilder.java
@@ -811,13 +811,25 @@ public class OpenApiSerializerBuilder extends UonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public OpenApiSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public OpenApiSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public OpenApiSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public OpenApiSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -871,7 +883,7 @@ public class OpenApiSerializerBuilder extends UonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public OpenApiSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
index 0115419..8d7453d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
@@ -221,7 +221,7 @@ public class OpenApiSerializerSession extends UonSerializerSession {
 			s = DEFAULT_SCHEMA;
 		OMap m = new OMap();
 		if (type.isBean()) {
-			for (BeanPropertyValue p : toBeanMap(o).getValues(isTrimNullProperties())) {
+			for (BeanPropertyValue p : toBeanMap(o).getValues(isKeepNullProperties())) {
 				if (p.getMeta().canRead()) {
 					Throwable t = p.getThrown();
 					if (t == null)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
index e360e5f..132682e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextSerializerBuilder.java
@@ -811,13 +811,25 @@ public class PlainTextSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public PlainTextSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public PlainTextSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public PlainTextSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public PlainTextSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -871,7 +883,7 @@ public class PlainTextSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public PlainTextSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
index 7783027..5926481 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/OutputStreamSerializerBuilder.java
@@ -849,13 +849,25 @@ public class OutputStreamSerializerBuilder extends SerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public OutputStreamSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public OutputStreamSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public OutputStreamSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public OutputStreamSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -909,7 +921,7 @@ public class OutputStreamSerializerBuilder extends SerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public OutputStreamSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
index 10e866d..a00159d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -247,6 +247,57 @@ public abstract class Serializer extends BeanTraverseContext {
 	public static final String SERIALIZER_listener = PREFIX + ".listener.c";
 
 	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <h5 class='section'>Property:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li><b>ID:</b>  {@link org.apache.juneau.serializer.Serializer#SERIALIZER_keepNullProperties SERIALIZER_keepNullProperties}
+	 * 	<li><b>Name:</b>  <js>"Serializer.keepNullProperties.b"</js>
+	 * 	<li><b>Data type:</b>  <jk>boolean</jk>
+	 * 	<li><b>System property:</b>  <c>Serializer.keepNullProperties</c>
+	 * 	<li><b>Environment variable:</b>  <c>SERIALIZER_KEEPNULLPROPERTIES</c>
+	 * 	<li><b>Default:</b>  <jk>false</jk>
+	 * 	<li><b>Session property:</b>  <jk>false</jk>
+	 * 	<li><b>Annotations:</b>
+	 * 		<ul>
+	 * 			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig#keepNullProperties()}
+	 * 		</ul>
+	 * 	<li><b>Methods:</b>
+	 * 		<ul>
+	 * 			<li class='jm'>{@link org.apache.juneau.serializer.SerializerBuilder#keepNullProperties()}
+	 * 			<li class='jm'>{@link org.apache.juneau.serializer.SerializerBuilder#keepNullProperties(boolean)}
+	 * 		</ul>
+	 * </ul>
+	 *
+	 * <h5 class='section'>Description:</h5>
+	 * <p>
+	 * If <jk>true</jk>, null bean values will be serialized to the output.
+	 *
+	 * <p>
+	 * Note that not enabling this setting has the following effects on parsing:
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Map entries with <jk>null</jk> values will be lost.
+	 * </ul>
+	 *
+	 * <h5 class='section'>Example:</h5>
+	 * <p class='bcode w800'>
+	 * 	<jc>// Create a serializer that serializes null properties.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.keepNullProperties(<jk>true</jk>)
+	 * 		.build();
+	 *
+	 * 	<jc>// Same, but use property.</jc>
+	 * 	WriterSerializer s = JsonSerializer
+	 * 		.<jsm>create</jsm>()
+	 * 		.set(<jsf>SERIALIZER_keepNullProperties</jsf>, <jk>true</jk>)
+	 * 		.build();
+	 * </p>
+	 */
+	public static final String SERIALIZER_keepNullProperties = PREFIX + ".keepNullProperties.b";
+
+	/**
 	 * Configuration property:  Sort arrays and collections alphabetically.
 	 *
 	 * <h5 class='section'>Property:</h5>
@@ -495,7 +546,9 @@ public abstract class Serializer extends BeanTraverseContext {
 	 * 		.set(<jsf>SERIALIZER_trimNullProperties</jsf>, <jk>false</jk>)
 	 * 		.build();
 	 * </p>
+	 * @deprecated Use {@link #SERIALIZER_keepNullProperties}
 	 */
+	@Deprecated
 	public static final String SERIALIZER_trimNullProperties = PREFIX + ".trimNullProperties.b";
 
 	/**
@@ -744,7 +797,7 @@ public abstract class Serializer extends BeanTraverseContext {
 
 	private final boolean
 		addBeanTypes,
-		trimNullProperties,
+		keepNullProperties,
 		trimEmptyCollections,
 		trimEmptyMaps,
 		trimStrings,
@@ -790,7 +843,7 @@ public abstract class Serializer extends BeanTraverseContext {
 		super(ps);
 
 		addBeanTypes = getBooleanProperty(SERIALIZER_addBeanTypes, false);
-		trimNullProperties = getBooleanProperty(SERIALIZER_trimNullProperties, true);
+		keepNullProperties = getBooleanProperty(SERIALIZER_keepNullProperties, ! getBooleanProperty(SERIALIZER_trimNullProperties, true));
 		trimEmptyCollections = getBooleanProperty(SERIALIZER_trimEmptyCollections, false);
 		trimEmptyMaps = getBooleanProperty(SERIALIZER_trimEmptyMaps, false);
 		trimStrings = getBooleanProperty(SERIALIZER_trimStrings, false);
@@ -1055,14 +1108,14 @@ public abstract class Serializer extends BeanTraverseContext {
 	}
 
 	/**
-	 * Configuration property:  Trim null bean property values.
+	 * Configuration property:  Don't trim null bean property values.
 	 *
-	 * @see #SERIALIZER_trimNullProperties
+	 * @see #SERIALIZER_keepNullProperties
 	 * @return
-	 * 	<jk>true</jk> if null bean values are not serialized to the output.
+	 * 	<jk>true</jk> if null bean values are serialized to the output.
 	 */
-	protected final boolean isTrimNullProperties() {
-		return trimNullProperties;
+	protected final boolean isKeepNullProperties() {
+		return keepNullProperties;
 	}
 
 	/**
@@ -1118,7 +1171,7 @@ public abstract class Serializer extends BeanTraverseContext {
 		return super.toMap()
 			.a("Serializer", new DefaultFilteringOMap()
 				.a("addBeanTypes", addBeanTypes)
-				.a("trimNullProperties", trimNullProperties)
+				.a("keepNullProperties", keepNullProperties)
 				.a("trimEmptyCollections", trimEmptyCollections)
 				.a("trimEmptyMaps", trimEmptyMaps)
 				.a("trimStrings", trimStrings)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index 9f0b9db..76e6557 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -126,6 +126,43 @@ public class SerializerBuilder extends BeanTraverseBuilder {
 	}
 
 	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * If <jk>true</jk>, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	@ConfigurationProperty
+	public SerializerBuilder keepNullProperties(boolean value) {
+		return set(SERIALIZER_keepNullProperties, value);
+	}
+
+	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * When enabled, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@ConfigurationProperty
+	public SerializerBuilder keepNullProperties() {
+		return set(SERIALIZER_keepNullProperties, true);
+	}
+
+	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -306,7 +343,9 @@ public class SerializerBuilder extends BeanTraverseBuilder {
 	 * 	The new value for this property.
 	 * 	<br>The default is <jk>true</jk>.
 	 * @return This object (for method chaining).
+	 * @deprecated Use {@link #keepNullProperties(boolean)}
 	 */
+	@Deprecated
 	@ConfigurationProperty
 	public SerializerBuilder trimNullProperties(boolean value) {
 		return set(SERIALIZER_trimNullProperties, value);
@@ -323,7 +362,9 @@ public class SerializerBuilder extends BeanTraverseBuilder {
 	 * </ul>
 	 *
 	 * @return This object (for method chaining).
+	 * @deprecated Use {@link #keepNullProperties()}
 	 */
+	@Deprecated
 	@ConfigurationProperty
 	public SerializerBuilder dontTrimNullProperties() {
 		return set(SERIALIZER_trimNullProperties, false);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
index ef91bb1..640137a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerGroupBuilder.java
@@ -207,6 +207,41 @@ public class SerializerGroupBuilder extends BeanTraverseBuilder {
 	}
 
 	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * If <jk>true</jk>, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroupBuilder keepNullProperties(boolean value) {
+		return set(SERIALIZER_keepNullProperties, value);
+	}
+
+	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * When enabled, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroupBuilder keepNullProperties() {
+		return set(SERIALIZER_keepNullProperties, true);
+	}
+
+	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -372,7 +407,9 @@ public class SerializerGroupBuilder extends BeanTraverseBuilder {
 	 * 	The new value for this property.
 	 * 	<br>The default is <jk>true</jk>.
 	 * @return This object (for method chaining).
+	 * @deprecated Use {@link #keepNullProperties(boolean)}
 	 */
+	@Deprecated
 	public SerializerGroupBuilder trimNullProperties(boolean value) {
 		return set(SERIALIZER_trimNullProperties, value);
 	}
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 19fc8a2..cdc7bf9 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
@@ -327,7 +327,7 @@ public abstract class SerializerSession extends BeanTraverseSession {
 	 */
 	public final boolean canIgnoreValue(ClassMeta<?> cm, String attrName, Object value) throws SerializeException {
 
-		if (isTrimNullProperties() && value == null)
+		if (value == null && ! isKeepNullProperties())
 			return true;
 
 		if (value == null)
@@ -355,7 +355,7 @@ public abstract class SerializerSession extends BeanTraverseSession {
 		}
 
 		try {
-			if (isTrimNullProperties() && (willRecurse(attrName, value, cm) || willExceedDepth()))
+			if ((! isKeepNullProperties()) && (willRecurse(attrName, value, cm) || willExceedDepth()))
 				return true;
 		} catch (BeanRecursionException e) {
 			throw new SerializeException(e);
@@ -753,14 +753,14 @@ public abstract class SerializerSession extends BeanTraverseSession {
 	}
 
 	/**
-	 * Configuration property:  Trim null bean property values.
+	 * Configuration property:  Don't trim null bean property values.
 	 *
-	 * @see Serializer#SERIALIZER_trimNullProperties
+	 * @see Serializer#SERIALIZER_keepNullProperties
 	 * @return
-	 * 	<jk>true</jk> if null bean values are not serialized to the output.
+	 * 	<jk>true</jk> if null bean values are serialized to the output.
 	 */
-	protected final boolean isTrimNullProperties() {
-		return ctx.isTrimNullProperties();
+	protected final boolean isKeepNullProperties() {
+		return ctx.isKeepNullProperties();
 	}
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
index a957233..1cf054d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/WriterSerializerBuilder.java
@@ -964,13 +964,25 @@ public class WriterSerializerBuilder extends SerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public WriterSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public WriterSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public WriterSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public WriterSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1024,7 +1036,7 @@ public class WriterSerializerBuilder extends SerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public WriterSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
index f3975d6..1af9aa1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
@@ -147,6 +147,36 @@ public @interface SerializerConfig {
 	String addRootType() default "";
 
 	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * If <js>"true"</js>, null bean values will be serialized to the output.
+	 *
+	 * <p>
+	 * Note that not enabling this setting has the following effects on parsing:
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Map entries with <jk>null</jk> values will be lost.
+	 * </ul>
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Possible values:
+	 * 		<ul>
+	 * 			<li><js>"true"</js>
+	 * 			<li><js>"false"</js> (default)
+	 * 		</ul>
+	 * 	<li>
+	 * 		Supports {@doc DefaultSvlVariables} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 */
+	String keepNullProperties() default "";
+
+	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -299,7 +329,9 @@ public @interface SerializerConfig {
 	 * <ul class='seealso'>
 	 * 	<li class='jf'>{@link Serializer#SERIALIZER_trimNullProperties}
 	 * </ul>
+	 * @deprecated Use {@link #keepNullProperties()}
 	 */
+	@Deprecated
 	String trimNullProperties() default "";
 
 	/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigApply.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigApply.java
index 8460e9d..9b0718a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigApply.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigApply.java
@@ -38,6 +38,7 @@ public class SerializerConfigApply extends ConfigApply<SerializerConfig> {
 		super(c, r);
 	}
 
+	@SuppressWarnings("deprecation")
 	@Override
 	public void apply(AnnotationInfo<SerializerConfig> ai, PropertyStoreBuilder psb) {
 		SerializerConfig a = ai.getAnnotation();
@@ -45,6 +46,8 @@ public class SerializerConfigApply extends ConfigApply<SerializerConfig> {
 			psb.set(SERIALIZER_addBeanTypes, bool(a.addBeanTypes()));
 		if (! a.addRootType().isEmpty())
 			psb.set(SERIALIZER_addRootType, bool(a.addRootType()));
+		if (! a.keepNullProperties().isEmpty())
+			psb.set(SERIALIZER_keepNullProperties, bool(a.keepNullProperties()));
 		if (a.listener() != SerializerListener.Null.class)
 			psb.set(SERIALIZER_listener, a.listener());
 		if (! a.sortCollections().isEmpty())
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
index b5b6be3..1ef2500 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlSerializerBuilder.java
@@ -831,13 +831,25 @@ public class SoapXmlSerializerBuilder extends XmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public SoapXmlSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public SoapXmlSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public SoapXmlSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public SoapXmlSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -891,7 +903,7 @@ public class SoapXmlSerializerBuilder extends XmlSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public SoapXmlSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
index 6444d0f..e5070ee 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerBuilder.java
@@ -908,13 +908,25 @@ public class UonSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public UonSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public UonSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public UonSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public UonSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -968,7 +980,7 @@ public class UonSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public UonSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
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 040d994..507aa32 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
@@ -211,7 +211,7 @@ public class UonSerializerSession extends WriterSerializerSession implements Htt
 
 		boolean addComma = false;
 
-		for (BeanPropertyValue p : m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
+		for (BeanPropertyValue p : m.getValues(isKeepNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			if (pMeta.canRead()) {
 				ClassMeta<?> cMeta = p.getClassMeta();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
index 1d7ea35..4394277 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerBuilder.java
@@ -852,13 +852,25 @@ public class UrlEncodingSerializerBuilder extends UonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public UrlEncodingSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public UrlEncodingSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public UrlEncodingSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public UrlEncodingSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -912,7 +924,7 @@ public class UrlEncodingSerializerBuilder extends UonSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public UrlEncodingSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
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 02333f5..5767ebf 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
@@ -215,7 +215,7 @@ public class UrlEncodingSerializerSession extends UonSerializerSession {
 	private SerializerWriter serializeBeanMap(UonWriter out, BeanMap<?> m, String typeName) throws IOException, SerializeException {
 		boolean addAmp = false;
 
-		for (BeanPropertyValue p : m.getValues(isTrimNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
+		for (BeanPropertyValue p : m.getValues(isKeepNullProperties(), typeName != null ? createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			if (pMeta.canRead()) {
 				ClassMeta<?> cMeta = p.getClassMeta();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
index fddd963..f38555d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerBuilder.java
@@ -1042,13 +1042,25 @@ public class XmlSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public XmlSerializerBuilder dontTrimNullProperties() {
 		super.dontTrimNullProperties();
 		return this;
 	}
 
 	@Override /* GENERATED - SerializerBuilder */
+	public XmlSerializerBuilder keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
+	public XmlSerializerBuilder keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - SerializerBuilder */
 	public XmlSerializerBuilder listener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) {
 		super.listener(value);
 		return this;
@@ -1102,7 +1114,7 @@ public class XmlSerializerBuilder extends WriterSerializerBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - SerializerBuilder */
+	@Deprecated @Override /* GENERATED - SerializerBuilder */
 	public XmlSerializerBuilder trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;
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 36e0864..3595a5f 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
@@ -207,7 +207,7 @@ public class XmlSerializerSession extends WriterSerializerSession {
 					findNsfMappings(o2);
 			}
 			if (bm != null) {
-				for (BeanPropertyValue p : bm.getValues(isTrimNullProperties())) {
+				for (BeanPropertyValue p : bm.getValues(isKeepNullProperties())) {
 
 					Namespace ns = getXmlBeanPropertyMeta(p.getMeta()).getNamespace();
 					if (ns != null && ns.uri != null)
@@ -547,7 +547,7 @@ public class XmlSerializerSession extends WriterSerializerSession {
 		boolean hasChildren = false;
 		BeanMeta<?> bm = m.getMeta();
 
-		List<BeanPropertyValue> lp = m.getValues(isTrimNullProperties());
+		List<BeanPropertyValue> lp = m.getValues(isKeepNullProperties());
 
 		XmlBeanMeta xbm = getXmlBeanMeta(bm);
 
@@ -587,7 +587,7 @@ public class XmlSerializerSession extends WriterSerializerSession {
 					} else if (n.equals(attrsProperty)) {
 						if (value instanceof BeanMap) {
 							BeanMap<?> bm2 = (BeanMap)value;
-							for (BeanPropertyValue p2 : bm2.getValues(true)) {
+							for (BeanPropertyValue p2 : bm2.getValues(false)) {
 								String key2 = p2.getName();
 								Object value2 = p2.getValue();
 								Throwable t2 = p2.getThrown();
diff --git a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
index dd22e92..2b0d06b 100644
--- a/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
+++ b/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java
@@ -70,7 +70,7 @@ public class XmlConfigurationExample {
 
 		//Produces
 		//<object><id>a</id></object>
-		String nullescaped = XmlSerializer.create().trimNullProperties(true).build().serialize(nPojo);
+		String nullescaped = XmlSerializer.create().keepNullProperties(false).build().serialize(nPojo);
 		// the output will have trimmed null properties.
 		System.out.println(nullescaped);
 
diff --git a/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java b/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
index 3a12445..836c3ff 100644
--- a/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
+++ b/juneau-examples/juneau-examples-rest-jetty-ftest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
@@ -36,14 +36,14 @@ public class TestUtils {
 
 	private static JsonSerializer js = JsonSerializer.create()
 		.ssq()
-		.trimNullProperties(false)
+		.keepNullProperties()
 		.build();
 
 	private static JsonSerializer jsSorted = JsonSerializer.create()
 		.ssq()
 		.sortCollections()
 		.sortMaps()
-		.trimNullProperties(false)
+		.keepNullProperties()
 		.build();
 
 
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
index 9aa5ce4..4651a5f 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
@@ -2415,10 +2415,43 @@ public class RestClientTest {
 
 	}
 
-//	@Test
-//	public void l20_serializer_trimNullPropertiesBoolean() throws Exception { fail(); }
-////	public RestClientBuilder trimNullProperties(boolean value) {
-//
+	public static class L20 {
+		public String f;
+	}
+
+	@Test
+	public void l20_serializer_trimNullPropertiesBoolean() throws Exception {
+		L20 x = new L20();
+
+		MockRestClient
+			.create(A.class)
+			.simpleJson()
+			.keepNullProperties()
+			.build()
+			.post("/echoBody", x)
+			.run()
+			.getBody().assertValue("{f:null}");
+
+		MockRestClient
+			.create(A.class)
+			.simpleJson()
+			.keepNullProperties(true)
+			.build()
+			.post("/echoBody", x)
+			.run()
+			.getBody().assertValue("{f:null}");
+
+		MockRestClient
+			.create(A.class)
+			.simpleJson()
+			.keepNullProperties(false)
+			.build()
+			.post("/echoBody", x)
+			.run()
+			.getBody().assertValue("{}");
+	}
+//	public RestClientBuilder trimNullProperties(boolean value) {
+
 //	@Test
 //	public void l21_serializer_trimStringsSBoolean() throws Exception { fail(); }
 ////	public RestClientBuilder trimStringsS(boolean value) {
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
index 95edbfc..81bc1ec 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
@@ -2082,6 +2082,43 @@ public class RestClientBuilder extends BeanContextBuilder {
 	}
 
 	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * If <jk>true</jk>, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The default is <jk>false</jk>.
+	 * @return This object (for method chaining).
+	 */
+	@ConfigurationProperty
+	public RestClientBuilder keepNullProperties(boolean value) {
+		return set(SERIALIZER_keepNullProperties, value);
+	}
+
+	/**
+	 * Configuration property:  Don't trim null bean property values.
+	 *
+	 * <p>
+	 * When enabled, null bean values will be serialized to the output.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+	 * </ul>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@ConfigurationProperty
+	public RestClientBuilder keepNullProperties() {
+		return set(SERIALIZER_keepNullProperties, true);
+	}
+
+	/**
 	 * Configuration property:  Serializer listener.
 	 *
 	 * <p>
@@ -2282,7 +2319,9 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	The new value for this property.
 	 * 	<br>The default is <jk>true</jk>.
 	 * @return This object (for method chaining).
+	 * @deprecated Use {@link #keepNullProperties(boolean)}
 	 */
+	@Deprecated
 	@ConfigurationProperty
 	public RestClientBuilder trimNullProperties(boolean value) {
 		return set(SERIALIZER_trimNullProperties, value);
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java
index dd9d1ad..5641b38 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java
@@ -1155,7 +1155,7 @@ public class MockRestClient extends RestClientBuilder {
 
 	@Override /* GENERATED - RestClientBuilder */
 	@SuppressWarnings("unchecked")
-	public MockRestClient interceptors(java.lang.Class<? extends org.apache.juneau.rest.client2.RestCallInterceptor>...values) throws Exception {
+	public MockRestClient interceptors(java.lang.Class<? extends org.apache.juneau.rest.client2.RestCallInterceptor>...values) throws Exception{
 		super.interceptors(values);
 		return this;
 	}
@@ -1185,6 +1185,18 @@ public class MockRestClient extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
+	public MockRestClient keepNullProperties() {
+		super.keepNullProperties();
+		return this;
+	}
+
+	@Override /* GENERATED - RestClientBuilder */
+	public MockRestClient keepNullProperties(boolean value) {
+		super.keepNullProperties(value);
+		return this;
+	}
+
+	@Override /* GENERATED - RestClientBuilder */
 	public MockRestClient leakDetection() {
 		super.leakDetection();
 		return this;
@@ -1510,7 +1522,7 @@ public class MockRestClient extends RestClientBuilder {
 		return this;
 	}
 
-	@Override /* GENERATED - RestClientBuilder */
+	@Deprecated @Override /* GENERATED - RestClientBuilder */
 	public MockRestClient trimNullProperties(boolean value) {
 		super.trimNullProperties(value);
 		return this;