Minor clean up for filtering
diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java
index 47224c4..9424552 100644
--- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java
@@ -160,9 +160,6 @@
             delegate.writeStartArray();
         } else {
             _filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
-            if (_itemFilter != null) {
-                _filterContext.markNeedsCloseCheck();
-            }
         }
     }
         
@@ -192,9 +189,6 @@
             delegate.writeStartArray(size);
         } else {
             _filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
-            if (_itemFilter != null) {
-                _filterContext.markNeedsCloseCheck();
-            }
         }
     }
     
@@ -235,9 +229,6 @@
             delegate.writeStartObject();
         } else { // filter out
             _filterContext = _filterContext.createChildObjectContext(state, false);
-            if (state != null) {
-                _filterContext.markNeedsCloseCheck();
-            }
         }
     }
     
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 18750d1..78e4ff5 100644
--- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
@@ -73,6 +73,13 @@
     protected TokenFilterContext _filterContext;
 
     /**
+     * When parent tokens are buffered (during checking whether child tokens included),
+     * we need to keep a reference back to the context closest to root that is yet to
+     * be exposed.
+     */
+    protected TokenFilterContext _replayContext;
+    
+    /**
      * State that applies to the item within container, used where applicable.
      * Specifically used to pass inclusion state between property name and
      * property, and also used for array elements.
@@ -81,7 +88,7 @@
     
     /**
      * Number of tokens for which {@link TokenFilter#INCLUDE_ALL}
-     * has been returned
+     * has been returned.
      */
     protected int _matchCount;
 
diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java
index 1843691..f214312 100644
--- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java
+++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java
@@ -46,23 +46,18 @@
     protected TokenFilter _filter;
 
     /**
-     * Flag that indicates that start token has been written, so
-     * that matching close token needs to be written as well,
-     * regardless of inclusion status.
+     * Flag that indicates that start token has been read/written,
+     * so that matching close token needs to be read/written as well
+     * when context is getting closed.
      */
-    protected boolean _startWritten;
-
-    /**
-     * Flag that indicates that when context is closed, a call needs
-     * to be made to {@link TokenFilter}
-     */
-    protected boolean _needCloseCheck;
+    protected boolean _startHandled;
 
     /**
      * Flag that indicates that the current name of this context
-     * still needs to be written, if path from root is desired.
+     * still needs to be read/written, if path from root down to
+     * included leaf is to be exposed.
      */
-    protected boolean _needToWriteName;
+    protected boolean _needToHandleName;
     
     /*
     /**********************************************************
@@ -78,9 +73,8 @@
         _parent = parent;
         _filter = filter;
         _index = -1;
-        _startWritten = startWritten;
-        _needToWriteName = false;
-        _needCloseCheck = false;
+        _startHandled = startWritten;
+        _needToHandleName = false;
     }
 
     protected TokenFilterContext reset(int type,
@@ -90,9 +84,8 @@
         _filter = filter;
         _index = -1;
         _currentName = null;
-        _startWritten = startWritten;
-        _needToWriteName = false;
-        _needCloseCheck = false;
+        _startHandled = startWritten;
+        _needToHandleName = false;
         return this;
     }
 
@@ -132,7 +125,7 @@
     
     public TokenFilter setFieldName(String name) throws JsonProcessingException {
         _currentName = name;
-        _needToWriteName = true;
+        _needToHandleName = true;
         return _filter;
     }
 
@@ -165,13 +158,13 @@
         if (_parent != null) {
             _parent._writePath(gen);
         }
-        if (_startWritten) {
+        if (_startHandled) {
             // even if Object started, need to start leaf-level name
-            if (_needToWriteName) {
+            if (_needToHandleName) {
                 gen.writeFieldName(_currentName);
             }
         } else {
-            _startWritten = true;
+            _startHandled = true;
             if (_type == TYPE_OBJECT) {
                 gen.writeStartObject();
                 gen.writeFieldName(_currentName); // we know name must be written
@@ -192,16 +185,16 @@
         if ((_filter == null) || (_filter == TokenFilter.INCLUDE_ALL)) {
             return;
         }
-        if (_startWritten) {
+        if (_startHandled) {
             // even if Object started, need to start leaf-level name
-            if (_needToWriteName) {
+            if (_needToHandleName) {
                 gen.writeFieldName(_currentName);
             }
         } else {
-            _startWritten = true;
+            _startHandled = true;
             if (_type == TYPE_OBJECT) {
                 gen.writeStartObject();
-                if (_needToWriteName) {
+                if (_needToHandleName) {
                     gen.writeFieldName(_currentName);
                 }
             } else if (_type == TYPE_ARRAY) {
@@ -219,19 +212,19 @@
         if (_parent != null) {
             _parent._writePath(gen);
         }
-        if (_startWritten) {
+        if (_startHandled) {
             // even if Object started, need to start leaf-level name
-            if (_needToWriteName) {
-                _needToWriteName = false; // at parent must explicitly clear
+            if (_needToHandleName) {
+                _needToHandleName = false; // at parent must explicitly clear
                 gen.writeFieldName(_currentName);
             }
         } else {
-            _startWritten = true;
+            _startHandled = true;
             if (_type == TYPE_OBJECT) {
 //System.err.println(" write object start, field '"+_currentName+"'");                
                 gen.writeStartObject();
-                if (_needToWriteName) {
-                    _needToWriteName = false; // at parent must explicitly clear
+                if (_needToHandleName) {
+                    _needToHandleName = false; // at parent must explicitly clear
                     gen.writeFieldName(_currentName);
                 }
             } else if (_type == TYPE_ARRAY) {
@@ -264,12 +257,10 @@
 
     public TokenFilter getFilterState() { return _filter; }
 
-    public void markNeedsCloseCheck() { _needCloseCheck = true; }
-
     public final TokenFilterContext closeArray(JsonGenerator gen) throws IOException
     {
 //System.err.println("closeArray, started? "+_startWritten+"; filter = "+_filter);        
-        if (_startWritten) {
+        if (_startHandled) {
             gen.writeEndArray();
         }
         if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) {
@@ -280,7 +271,7 @@
     
     public final TokenFilterContext closeObject(JsonGenerator gen) throws IOException
     {
-        if (_startWritten) {
+        if (_startHandled) {
             gen.writeEndObject();
         }
         if ((_filter != null) && (_filter != TokenFilter.INCLUDE_ALL)) {