diff --git a/release-notes/CREDITS b/release-notes/CREDITS
index 4d1bea8..d4b30f5 100644
--- a/release-notes/CREDITS
+++ b/release-notes/CREDITS
@@ -871,3 +871,7 @@
   * Reported [JACKSON-778], provided test case: Incorrect detection of generic
     types with TypeReference
    [1.9.5]
+
+Christopher Brown:
+  * Reported [JACKSON-796]: Problems with byte[] conversion to/from JsonNode.
+   [1.9.5]
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 9eb8efd..7dd58cc 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -20,6 +20,8 @@
   * [JACKSON-779]: Problems with multi-byte UTF-8 chars in JSON comments
    (reported by Alexander K)
   * [JACKSON-789]: Add support for 'java.nio.charset.Charset'
+  * [JACKSON-796]: Problems with byte[] conversion to/from JsonNode.
+   (reported by Christopher B)
 
 ------------------------------------------------------------------------
 === History: ===
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
index 41b2164..eabb1d6 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
@@ -253,7 +253,19 @@
             return deserializeObject(jp, ctxt, nodeFactory);
 
         case VALUE_EMBEDDED_OBJECT:
-            return nodeFactory.POJONode(jp.getEmbeddedObject());
+            // [JACKSON-796]
+            {
+                Object ob = jp.getEmbeddedObject();
+                if (ob == null) { // should this occur?
+                    return nodeFactory.nullNode();
+                }
+                Class<?> type = ob.getClass();
+                if (type == byte[].class) { // most common special case
+                    return nodeFactory.binaryNode((byte[]) ob);
+                }
+                // any other special handling needed?
+                return nodeFactory.POJONode(ob);
+            }
 
         case VALUE_STRING:
             return nodeFactory.textNode(jp.getText());
diff --git a/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java b/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
index 1ce062e..198f0b4 100644
--- a/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
+++ b/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
@@ -17,6 +17,12 @@
 
     final byte[] _data;
 
+    /* 
+    /**********************************************************
+    /* Construction
+    /**********************************************************
+     */
+    
     public BinaryNode(byte[] data)
     {
         _data = data;
@@ -54,6 +60,12 @@
         return new BinaryNode(data, offset, length);
     }
 
+    /* 
+    /**********************************************************
+    /* General type coercions
+    /**********************************************************
+     */
+    
     @Override
     public JsonToken asToken() {
         /* No distinct type; could use one for textual values,
@@ -83,6 +95,12 @@
         return Base64Variants.getDefaultVariant().encode(_data, false);
     }
 
+    /*
+    /**********************************************************
+    /* Public API, serialization
+    /**********************************************************
+     */
+    
     @Override
     public final void serialize(JsonGenerator jg, SerializerProvider provider)
         throws IOException, JsonProcessingException
diff --git a/src/mapper/java/org/codehaus/jackson/node/POJONode.java b/src/mapper/java/org/codehaus/jackson/node/POJONode.java
index f6fbe6e..4f45a67 100644
--- a/src/mapper/java/org/codehaus/jackson/node/POJONode.java
+++ b/src/mapper/java/org/codehaus/jackson/node/POJONode.java
@@ -28,6 +28,16 @@
     @Override
     public boolean isPojo() { return true; }
 
+    @Override
+    public byte[] getBinaryValue()
+        throws IOException
+    {
+        if (_value instanceof byte[]) {
+            return (byte[]) _value;
+        }
+        return super.getBinaryValue();
+    }
+    
     /* 
     /**********************************************************
     /* General type coercions
diff --git a/src/test/org/codehaus/jackson/node/TestConversions.java b/src/test/org/codehaus/jackson/node/TestConversions.java
index c288a81..c2f1414 100644
--- a/src/test/org/codehaus/jackson/node/TestConversions.java
+++ b/src/test/org/codehaus/jackson/node/TestConversions.java
@@ -150,29 +150,33 @@
         Assert.assertArrayEquals(inputData, result.data);
     }
 
-    public void testEmbeddedObject() throws Exception
+    public void testBinaryData() throws Exception
     {
         ObjectMapper mapper = new ObjectMapper();
         TokenBuffer buf = new TokenBuffer(mapper);
-        buf.writeObject(new byte[0]);
+        buf.writeObject(new byte[3]);
         JsonNode node = mapper.readTree(buf.asParser());
-        assertTrue(node.isPojo());
-        assertEquals(byte[].class, ((POJONode) node).getPojo().getClass());
+//        assertTrue(node.isBinary());
+        byte[] data = node.getBinaryValue();
+        assertNotNull(data);
+        assertEquals(3, data.length);
     }
 
+    private final Object MARKER = new Object();
+    
     public void testEmbeddedObjectInArray() throws Exception
     {
         ObjectMapper mapper = new ObjectMapper();
         TokenBuffer buf = new TokenBuffer(mapper);
         buf.writeStartArray();
-        buf.writeObject(new byte[0]);
+        buf.writeObject(MARKER);
         buf.writeEndArray();
         JsonNode node = mapper.readTree(buf.asParser());
         assertTrue(node.isArray());
         assertEquals(1, node.size());
         JsonNode n = node.get(0);
         assertTrue(n.isPojo());
-        assertEquals(byte[].class, ((POJONode) n).getPojo().getClass());
+        assertSame(MARKER, ((POJONode) n).getPojo());
     }
 
     public void testEmbeddedObjectInObject() throws Exception
@@ -181,14 +185,14 @@
         TokenBuffer buf = new TokenBuffer(mapper);
         buf.writeStartObject();
         buf.writeFieldName("pojo");
-        buf.writeObject(new byte[0]);
+        buf.writeObject(MARKER);
         buf.writeEndObject();
         JsonNode node = mapper.readTree(buf.asParser());
         assertTrue(node.isObject());
         assertEquals(1, node.size());
         JsonNode n = node.get("pojo");
         assertTrue(n.isPojo());
-        assertEquals(byte[].class, ((POJONode) n).getPojo().getClass());
+        assertSame(MARKER, ((POJONode) n).getPojo());
     }
 }
 
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java b/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java
new file mode 100644
index 0000000..8745c9b
--- /dev/null
+++ b/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java
@@ -0,0 +1,36 @@
+package org.codehaus.jackson.smile;
+
+import org.junit.Assert;
+
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.*;
+import org.codehaus.jackson.node.*;
+
+public class TestSmileAsTree extends SmileTestBase
+{
+    public void testSimple() throws Exception
+    {
+         // create the serialized JSON with byte array
+         ObjectMapper mapper = new ObjectMapper(new SmileFactory());
+    
+         ObjectNode top1 = mapper.createObjectNode();
+         ObjectNode foo1 = top1.putObject("foo");
+         foo1.put("bar", "baz");
+         final String TEXT =  "Caf\u00e9 1\u20ac";
+         final byte[] TEXT_BYTES =  TEXT.getBytes("UTF-8");
+         foo1.put("dat", TEXT_BYTES);
+    
+         byte[] doc = mapper.writeValueAsBytes(top1);
+         // now, deserialize
+         JsonNode top2 = mapper.readValue(doc, JsonNode.class);
+         JsonNode foo2 = top2.get("foo");
+         assertEquals("baz", foo2.get("bar").getTextValue());
+    
+         JsonNode datNode = foo2.get("dat");
+         if (!datNode.isBinary()) {
+             fail("Expected binary node; got "+datNode.getClass().getName());
+         }
+         byte[] bytes = datNode.getBinaryValue();
+         Assert.assertArrayEquals(TEXT_BYTES, bytes);
+     }
+}
