diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index 576dbfd2c2f1836fadcf374b1b571373550258ce..7b3186d40a308e25897d6b7ec13b94bd04fe25c8 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -978,7 +978,7 @@ void LLOcclusionCullingGroup::clearOcclusionState(U32 state, S32 mode)
 static LLFastTimer::DeclareTimer FTM_OCCLUSION_READBACK("Readback Occlusion");
 static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Occlusion Wait");
 
-BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera)
+BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera, const LLVector4a* bounds)
 {
 	if (camera->getOrigin().isExactlyZero())
 	{
@@ -989,7 +989,6 @@ BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera)
 	LLVector4a fudge;
 	fudge.splat(vel);
 
-	const LLVector4a* bounds = getBounds();
 	const LLVector4a& c = bounds[0];
 	LLVector4a r;
 	r.setAdd(bounds[1], fudge);
@@ -1125,12 +1124,23 @@ static LLFastTimer::DeclareTimer FTM_OCCLUSION_SET_BUFFER("Set Buffer");
 static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW_WATER("Draw Water");
 static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW("Draw");
 
-void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
+void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector3* region_agent)
 {
 	if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1)
 	{
+		//move mBounds to the agent space if necessary
+		LLVector4a bounds[2];
+		bounds[0] = mBounds[0];
+		bounds[1] = mBounds[1];
+		if(region_agent != NULL)
+		{
+			LLVector4a shift((*region_agent)[0], (*region_agent)[1], (*region_agent)[2]);
+			bounds[0].sub(shift);
+			bounds[1].sub(shift);
+		}
+
 		// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
-		if (earlyFail(camera))
+		if (earlyFail(camera, bounds))
 		{
 			LLFastTimer t(FTM_OCCLUSION_EARLY_FAIL);
 			setOcclusionState(LLOcclusionCullingGroup::DISCARD_QUERY);
@@ -1184,10 +1194,10 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
 						LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
 						llassert(shader);
 
-						shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, mBounds[0].getF32ptr());
-						shader->uniform3f(LLShaderMgr::BOX_SIZE, mBounds[1][0]+SG_OCCLUSION_FUDGE, 
-																 mBounds[1][1]+SG_OCCLUSION_FUDGE, 
-																 mBounds[1][2]+SG_OCCLUSION_FUDGE);
+						shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, bounds[0].getF32ptr());
+						shader->uniform3f(LLShaderMgr::BOX_SIZE, bounds[1][0]+SG_OCCLUSION_FUDGE, 
+																 bounds[1][1]+SG_OCCLUSION_FUDGE, 
+																 bounds[1][2]+SG_OCCLUSION_FUDGE);
 
 						if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
 						{
@@ -1201,7 +1211,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
 							}
 							else
 							{
-								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, bounds[0]));
 							}
 						}
 						else
@@ -1214,7 +1224,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
 							}
 							else
 							{
-								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, bounds[0]));
 							}
 						}
 
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index e210d8f47833147d9877afe155904e136bbf5cd0..980a67367c1ff5cfda400ec40c711ec2aa27542e 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -316,7 +316,7 @@ class LLOcclusionCullingGroup : public LLviewerOctreeGroup
 	void setOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
 	void clearOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
 	void checkOcclusion(); //read back last occlusion query (if any)
-	void doOcclusion(LLCamera* camera); //issue occlusion query
+	void doOcclusion(LLCamera* camera, const LLVector3* region_agent = NULL); //issue occlusion query
 	BOOL isOcclusionState(U32 state) const	{ return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }		
 	
 	BOOL needsUpdate();
@@ -332,7 +332,7 @@ class LLOcclusionCullingGroup : public LLviewerOctreeGroup
 	void releaseOcclusionQueryObjectNames();
 
 private:	
-	BOOL earlyFail(LLCamera* camera);
+	BOOL earlyFail(LLCamera* camera, const LLVector4a* bounds);
 
 protected:
 	U32         mOcclusionState[LLViewerCamera::NUM_CAMERAS];
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 7eeabcba2e779710f2fa026f380bdd9126ceebfd..60d78890b5f59f2807155ecd296d83e01d634582 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -494,7 +494,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera)
 
 	if(!mOccludedGroups.empty())
 	{
-		processOccluders(&camera);
+		processOccluders(&camera, &region_agent);
 		mOccludedGroups.clear();
 	}
 
@@ -505,26 +505,26 @@ void LLVOCachePartition::addOccluders(LLviewerOctreeGroup* gp)
 {
 	LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)gp;
 
-	const U32 MIN_WAIT_TIME = 16; //wait 16 frames to issue a new occlusion request
+	const U32 MIN_WAIT_TIME = 19; //wait 19 frames to issue a new occlusion request
 	U32 last_issued_time = group->getLastOcclusionIssuedTime();
-	if(gFrameCount > last_issued_time && gFrameCount < last_issued_time + MIN_WAIT_TIME)
+	if(!group->needsUpdate() && gFrameCount > last_issued_time && gFrameCount < last_issued_time + MIN_WAIT_TIME)
 	{
 		return;
 	}
 
-	if(group && !group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))
+	if(!group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))
 	{
 		group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
 		mOccludedGroups.insert(group);
 	}
 }
 
-void LLVOCachePartition::processOccluders(LLCamera* camera)
+void LLVOCachePartition::processOccluders(LLCamera* camera, const LLVector3* region_agent)
 {
 	for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter)
 	{
 		LLOcclusionCullingGroup* group = *iter;
-		group->doOcclusion(camera);
+		group->doOcclusion(camera, region_agent);
 		group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
 	}
 }
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 1aa58528db01b41ddcd053adc698b4ad353c9af4..bf75cafac5bd67c447b3691ba98d307a90c7bc0e 100755
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -161,7 +161,7 @@ class LLVOCachePartition : public LLViewerOctreePartition, public LLTrace::MemTr
 	static	LLTrace::MemStatHandle	sMemStat;
 
 private:	
-	void processOccluders(LLCamera* camera);
+	void processOccluders(LLCamera* camera, const LLVector3* region_agent);
 
 private:
 	std::set<LLOcclusionCullingGroup*> mOccludedGroups;