...

diff --git a/src/mapper/java/org/codehaus/jackson/map/DeserializationConfig.java b/src/mapper/java/org/codehaus/jackson/map/DeserializationConfig.java
index f87ab6c..5d455a6 100644
--- a/src/mapper/java/org/codehaus/jackson/map/DeserializationConfig.java
+++ b/src/mapper/java/org/codehaus/jackson/map/DeserializationConfig.java
@@ -179,6 +179,23 @@
          * @since 1.2
          */
          FAIL_ON_UNKNOWN_PROPERTIES(true)
+
+        // // // Structural changes
+
+        /**
+         * Feature that can be enabled to handle "wrapped" values
+         * (see {@link SerializationConfig.Feature#WRAP_ROOT_VALUE}
+         * for details).
+         * If enabled, value being deserialized must be a single-property
+         * JSON Object where the key name matches expected "root name"
+         * (determined using annotation, or if none, fallback which is
+         * the unqualified class name of the expected value)
+         *<p>
+         * Default setting is false, meaning root value is not wrapped.
+         *
+         * @since 1.3
+         */
+        ,WRAP_ROOT_VALUE(false)
 	            ;
 
         final boolean _defaultState;
diff --git a/src/mapper/java/org/codehaus/jackson/map/SerializationConfig.java b/src/mapper/java/org/codehaus/jackson/map/SerializationConfig.java
index ee7ce73..88a143e 100644
--- a/src/mapper/java/org/codehaus/jackson/map/SerializationConfig.java
+++ b/src/mapper/java/org/codehaus/jackson/map/SerializationConfig.java
@@ -136,6 +136,21 @@
          */
         ,USE_STATIC_TYPING(false)
 
+        /**
+         * Feature that can be enabled to make root value (usually JSON
+         * Object but can be any type) wrapped within a single property
+         * JSON object, where key as the "root name", as determined by
+         * annotation introspector (esp. for JAXB that uses
+         * <code>@XmlRootElement.name</code>) or fallback (non-qualified
+         * class name).
+         * Feature is mostly intended for JAXB compatibility.
+         *<p>
+         * Default setting is false, meaning root value is not wrapped.
+         *
+         * @since 1.3
+         */
+        ,WRAP_ROOT_VALUE(false)
+
         // // // Features for datatype-specific serialization
 
         /**
diff --git a/src/test/org/codehaus/jackson/io/TestIOContext.java b/src/test/org/codehaus/jackson/io/TestIOContext.java
new file mode 100644
index 0000000..353b955
--- /dev/null
+++ b/src/test/org/codehaus/jackson/io/TestIOContext.java
@@ -0,0 +1,94 @@
+package org.codehaus.jackson.io;
+
+import java.io.*;
+
+import org.codehaus.jackson.util.BufferRecycler;
+
+public class TestIOContext
+    extends main.BaseTest
+{
+    public void testAllocations() throws Exception
+    {
+        IOContext ctxt = new IOContext(new BufferRecycler(), "N/A", true);
+
+        /* I/O Read buffer */
+
+        // First succeeds:
+        assertNotNull(ctxt.allocReadIOBuffer());
+        // second fails
+        try {
+            ctxt.allocReadIOBuffer();
+        } catch (IllegalStateException e) {
+            verifyException(e, "second time");
+        }
+        // Also: can't succeed with different buffer
+        try {
+            ctxt.releaseReadIOBuffer(new byte[1]);
+        } catch (IllegalArgumentException e) {
+            verifyException(e, "not owned");
+        }
+        // but call with null is a NOP for convenience
+        ctxt.releaseReadIOBuffer(null);
+
+        /* I/O Write buffer */
+
+        assertNotNull(ctxt.allocWriteIOBuffer());
+        try {
+            ctxt.allocWriteIOBuffer();
+        } catch (IllegalStateException e) {
+            verifyException(e, "second time");
+        }
+        try {
+            ctxt.releaseWriteIOBuffer(new byte[1]);
+        } catch (IllegalArgumentException e) {
+            verifyException(e, "not owned");
+        }
+        ctxt.releaseWriteIOBuffer(null);
+
+        /* Token (read) buffer */
+
+        assertNotNull(ctxt.allocTokenBuffer());
+        try {
+            ctxt.allocTokenBuffer();
+        } catch (IllegalStateException e) {
+            verifyException(e, "second time");
+        }
+        try {
+            ctxt.releaseTokenBuffer(new char[1]);
+        } catch (IllegalArgumentException e) {
+            verifyException(e, "not owned");
+        }
+        ctxt.releaseTokenBuffer(null);
+
+        /* Concat (write?) buffer */
+
+        assertNotNull(ctxt.allocConcatBuffer());
+        try {
+            ctxt.allocConcatBuffer();
+        } catch (IllegalStateException e) {
+            verifyException(e, "second time");
+        }
+        try {
+            ctxt.releaseConcatBuffer(new char[1]);
+        } catch (IllegalArgumentException e) {
+            verifyException(e, "not owned");
+        }
+        ctxt.releaseConcatBuffer(null);
+
+        /* NameCopy (write?) buffer */
+
+        assertNotNull(ctxt.allocNameCopyBuffer(100));
+        try {
+            ctxt.allocNameCopyBuffer(100);
+        } catch (IllegalStateException e) {
+            verifyException(e, "second time");
+        }
+        try {
+            ctxt.releaseNameCopyBuffer(new char[1]);
+        } catch (IllegalArgumentException e) {
+            verifyException(e, "not owned");
+        }
+        ctxt.releaseNameCopyBuffer(null);
+    }
+}
+