Fixes to parser-filtering, first test now passes
diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
index ae57e63..0cb5fc9 100644
--- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
@@ -272,12 +272,17 @@
                 f = f.filterStartArray();
             }
             _itemFilter = f;
-            _headContext = _headContext.createChildArrayContext(f, true);
             if (f == TokenFilter.INCLUDE_ALL) {
+                _headContext = _headContext.createChildArrayContext(f, true);
                 return (_currToken = t);
             }
-            // but if we didn't figure it out yet, need to buffer possible events
-            return _nextTokenWithBuffering(_headContext);
+            _headContext = _headContext.createChildArrayContext(f, false);
+            
+            // Also: only need buffering if parent path to be included
+            if (_includePath) {
+                return _nextTokenWithBuffering(_headContext);
+            }
+            break;
 
         case ID_START_OBJECT:
             f = _itemFilter;
@@ -299,12 +304,18 @@
                 f = f.filterStartObject();
             }
             _itemFilter = f;
-            _headContext = _headContext.createChildObjectContext(f, true);
             if (f == TokenFilter.INCLUDE_ALL) {
+                _headContext = _headContext.createChildObjectContext(f, true);
                 return (_currToken = t);
             }
-            // but if we didn't figure it out yet, need to buffer possible events
-            return _nextTokenWithBuffering(_headContext);
+            _headContext = _headContext.createChildObjectContext(f, false);
+            // Also: only need buffering if parent path to be included
+            if (_includePath) {
+                return _nextTokenWithBuffering(_headContext);
+            }
+            // note: inclusion of surrounding Object handled separately via
+            // FIELD_NAME
+            break;
 
         case ID_END_ARRAY:
         case ID_END_OBJECT:
@@ -329,15 +340,21 @@
                 f = _headContext.setFieldName(name);
                 if (f == TokenFilter.INCLUDE_ALL) {
                     _itemFilter = f;
+                    // Minor twist here: if parent NOT included, may need to induce output of
+                    // surrounding START_OBJECT/END_OBJECT
+                    if (!_includePath && !_headContext.isStartHandled()) {
+                        t = _headContext.nextTokenToRead(); // returns START_OBJECT but also marks it handled
+                        _exposedContext = _headContext;
+                    }
                     return (_currToken = t);
                 }
-                if (f == null) { // filter out the value
+                if (f == null) {
                     delegate.nextToken();
                     delegate.skipChildren();
                     break;
                 }
                 f = f.includeProperty(name);
-                if (f == null) { // filter out the value
+                if (f == null) {
                     delegate.nextToken();
                     delegate.skipChildren();
                     break;
@@ -346,7 +363,10 @@
                 if (f == TokenFilter.INCLUDE_ALL) {
                     return (_currToken = t);
                 }
-                return _nextTokenWithBuffering(_headContext);
+                if (_includePath) {
+                    return _nextTokenWithBuffering(_headContext);
+                }
+                break;
             }
 
         default: // scalar value
@@ -399,12 +419,16 @@
                     f = f.filterStartArray();
                 }
                 _itemFilter = f;
-                _headContext = _headContext.createChildArrayContext(f, true);
                 if (f == TokenFilter.INCLUDE_ALL) {
+                    _headContext = _headContext.createChildArrayContext(f, true);
                     return (_currToken = t);
                 }
+                _headContext = _headContext.createChildArrayContext(f, false);
                 // but if we didn't figure it out yet, need to buffer possible events
-                return _nextTokenWithBuffering(_headContext);
+                if (_includePath) {
+                    return _nextTokenWithBuffering(_headContext);
+                }
+                continue main_loop;
 
             case ID_START_OBJECT:
                 f = _itemFilter;
@@ -426,12 +450,15 @@
                     f = f.filterStartObject();
                 }
                 _itemFilter = f;
-                _headContext = _headContext.createChildObjectContext(f, true);
                 if (f == TokenFilter.INCLUDE_ALL) {
+                    _headContext = _headContext.createChildObjectContext(f, true);
                     return (_currToken = t);
                 }
-                // but if we didn't figure it out yet, need to buffer possible events
-                return _nextTokenWithBuffering(_headContext);
+                _headContext = _headContext.createChildObjectContext(f, false);
+                if (_includePath) {
+                    return _nextTokenWithBuffering(_headContext);
+                }
+                continue main_loop;
 
             case ID_END_ARRAY:
             case ID_END_OBJECT:
@@ -472,8 +499,11 @@
                     if (f == TokenFilter.INCLUDE_ALL) {
                         return (_currToken = t);
                     }
+                    if (_includePath) {
+                        return _nextTokenWithBuffering(_headContext);
+                    }
                 }
-                return _nextTokenWithBuffering(_headContext);
+                continue main_loop;
 
             default: // scalar value
                 if (_itemFilter == TokenFilter.INCLUDE_ALL) {
@@ -491,7 +521,7 @@
     protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffRoot)
         throws IOException
     {
-        _exposedContext = _headContext;
+        _exposedContext = buffRoot;
 
         main_loop:
         while (true) {