Index: GTP/trunk/App/Demos/Vis/CHC_revisited/RenderTraverser.cpp
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/RenderTraverser.cpp	(revision 2771)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/RenderTraverser.cpp	(revision 2772)
@@ -128,14 +128,11 @@
 
 	OcclusionQuery *query = mQueryHandler.RequestQuery();
-	query->Reset();
-	query->AddNode(node);
+
+	query->SetNode(node);
 
 	query->BeginQuery();
 
 	if (wasVisible)
-	{
-		node->SetAssumedVisibleFrameId(mFrameId + 10);
 		++ mStats.mNumPreviouslyVisibleNodeQueries;
-	}
 
 	// if this node is a previous visible leaf:
Index: GTP/trunk/App/Demos/Vis/CHC_revisited/Bvh.h
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/Bvh.h	(revision 2771)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/Bvh.h	(revision 2772)
@@ -345,17 +345,8 @@
 	*/
 	virtual ~BvhInterior() { if (mBack) delete mBack; if (mFront) delete mFront;}
-	/** Returns split axis of this interior node.
-	*/
-	//inline int GetAxis() { return (int)mAxis; }
-	/** Returns position of the split axis.
-	*/
-	//inline float GetPosition() {return (float)mPosition;}
 
 
 protected:
 
-	/// the position of the split plane
-	//float mPosition;
-	
 	BvhNode *mBack;
 	BvhNode *mFront;
Index: GTP/trunk/App/Demos/Vis/CHC_revisited/OcclusionQuery.h
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/OcclusionQuery.h	(revision 2765)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/OcclusionQuery.h	(revision 2772)
@@ -31,5 +31,5 @@
 	
 	unsigned int GetQueryId() const;
-	/** Returns the first added node.
+	/** Returns the first node of the multiquery
 	*/
 	inline BvhNode *GetFrontNode() const { return mNodes[0]; }
@@ -40,6 +40,9 @@
 	*/
 	inline void AddNode(BvhNode *node) { mNodes.push_back(node); }
+	/** Convenience method that sets up a single node query.
+	*/
+	inline void SetNode(BvhNode *node) { Reset(); AddNode(node); }
 
-
+	
 protected:
 
@@ -47,14 +50,12 @@
 	
 	
-	////////////
+	///////
 	//-- members
 
-	float mPFail;
+	//float mPFail;
 	/// all nodes that are tested with the same query
 	BvhNodeContainer mNodes; 
 	// the query associated with this test
 	unsigned int mQueryId;
-	/// type of the query
-	bool mIsVisibleQuery;
 };
 
Index: GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.h
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.h	(revision 2771)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.h	(revision 2772)
@@ -26,4 +26,7 @@
 
 	void IssueMultiQueries();
+	/** Handles the result of an occlusion query.
+	*/
+	void HandleQueryResult(OcclusionQuery *query);
 
 
Index: GTP/trunk/App/Demos/Vis/CHC_revisited/common.cpp
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/common.cpp	(revision 2764)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/common.cpp	(revision 2772)
@@ -59,5 +59,5 @@
 
 
-void Randomize(const unsigned int seed)
+void Randomize(unsigned int seed)
 {
 	srand(seed);
Index: GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp
===================================================================
--- GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp	(revision 2771)
+++ GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp	(revision 2772)
@@ -10,4 +10,34 @@
 CHCPlusPlusTraverser::CHCPlusPlusTraverser()
 {
+}
+
+
+void CHCPlusPlusTraverser::HandleQueryResult(OcclusionQuery *query)
+{
+	// wait until result available
+	int visiblePixels = query->GetQueryResult();
+
+	int visible = visiblePixels > mVisibilityThreshold;
+
+	BvhNode *node = query->GetFrontNode();
+
+	if (visible)
+	{
+		// node was previously invisible
+		if (!node->IsVisible())
+			node->SetAssumedVisibleFrameId(mFrameId + mAssumedVisibleFrames);
+		else
+			// randomize first invokation
+			node->SetAssumedVisibleFrameId(mFrameId + Random(mAssumedVisibleFrames + 1));
+
+		mBvh->MakeParentsVisible(node);
+		TraverseNode(node);
+	}
+	else
+	{
+		++ mStats.mNumQueryCulledNodes;
+	}
+
+	node->SetVisible(visible);
 }
 
@@ -35,19 +65,5 @@
 			mQueryQueue.pop();
 
-			// wait until result available
-			int visiblePixels = query->GetQueryResult();
-
-			if (visiblePixels > mVisibilityThreshold)
-			{
-				BvhNode *node = query->GetFrontNode();
-
-				node->SetVisible(true);
-				mBvh->MakeParentsVisible(node);
-				TraverseNode(node);
-			}
-			else
-			{
-				++ mStats.mNumQueryCulledNodes;
-			}
+			HandleQueryResult(query);
 		}	
 
@@ -78,5 +94,4 @@
 					// identify nodes that we cannot skip queries for
 					const bool testFeasible = (!wasVisible || (node->IsVirtualLeaf() && (node->GetAssumedVisibleFrameId() <= mFrameId)));
-						 
 
 					// update node's visited flag
@@ -86,7 +101,4 @@
 					if (testFeasible)
 					{
-						// reset node's visibility classification 
-						node->SetVisible(false);
-
 						if (!wasVisible)
 						{
@@ -129,4 +141,5 @@
 	}
 
+
 	//////////////
 	//-- issue remaining previously visible node queries
@@ -146,18 +159,5 @@
 		mQueryQueue.pop();
 
-		// wait until result available
-		int visiblePixels = query->GetQueryResult();
-
-		if (visiblePixels > mVisibilityThreshold)
-		{
-			BvhNode *node = query->GetFrontNode();
-
-			node->SetVisible(true);
-			mBvh->MakeParentsVisible(node);
-		}
-		else
-		{
-			++ mStats.mNumQueryCulledNodes;
-		}
+		HandleQueryResult(query);
 	}
 }
