 +        AxisAlignedBB bb=chunkRenderer.boundingBox;
 +        Minecraft.getMinecraft().nova.chunkUpdateListener.markChunkForUpdate((int) bb.minX,(int) bb.minY,(int) bb.minZ,(int) bb.maxX,(int) bb.maxY,(int) bb.maxZ);
 diff --git b/minecraft/client/renderer/chunk/RenderChunk.java a/minecraft/client/renderer/chunk/RenderChunk.java
-index ddb2ec5..37259e8 100644
+index ddb2ec5..3ffd730 100644
 --- b/minecraft/client/renderer/chunk/RenderChunk.java
 +++ a/minecraft/client/renderer/chunk/RenderChunk.java
-@@ -30,0 +31,5 @@ import net.minecraft.world.World;
+@@ -4,0 +5 @@ import java.nio.FloatBuffer;
++import java.nio.IntBuffer;
+@@ -30,0 +32,7 @@ import net.minecraft.world.World;
 +import com.continuum.nova.NovaNative;
 +import java.util.*;
 +import com.continuum.nova.chunks.IGeometryFilter;
 +import com.continuum.nova.chunks.CapturingVertexBuffer;
 +import com.continuum.nova.chunks.IndexList;
-@@ -44 +49 @@ public class RenderChunk
++import org.apache.logging.log4j.LogManager;
++import org.apache.logging.log4j.Logger;
+@@ -33,0 +42 @@ public class RenderChunk
++  Logger LOG = LogManager.getLogger(RenderChunk.class);
+@@ -44 +53 @@ public class RenderChunk
 -    private final VertexBuffer[] vertexBuffers = new VertexBuffer[BlockRenderLayer.values().length];
 +    private VertexBuffer[] vertexBuffers;
-@@ -51 +56,3 @@ public class RenderChunk
+@@ -51 +60,3 @@ public class RenderChunk
 -    private IBlockAccess field_189564_r;
 +    private IBlockAccess blockAccess;
 +    private Map<String, IGeometryFilter> filters;
 +    private Map<String, CapturingVertexBuffer> blockLayers= new HashMap<>();
-@@ -53 +60 @@ public class RenderChunk
+@@ -53 +64 @@ public class RenderChunk
 -    public RenderChunk(World p_i47120_1_, RenderGlobal p_i47120_2_, int p_i47120_3_)
 +    public RenderChunk(World world, RenderGlobal renderGlobal, int p_i47120_3_)
-@@ -54,0 +62,2 @@ public class RenderChunk
+@@ -54,0 +66,2 @@ public class RenderChunk
 +      this.filters=Minecraft.getMinecraft().nova.getFilterMap();
 +      vertexBuffers = new VertexBuffer[BlockRenderLayer.values().length];
-@@ -60,2 +69,2 @@ public class RenderChunk
+@@ -60,2 +73,2 @@ public class RenderChunk
 -        this.world = p_i47120_1_;
 -        this.renderGlobal = p_i47120_2_;
 +        this.world = world;
 +        this.renderGlobal = renderGlobal;
-@@ -64,3 +73,3 @@ public class RenderChunk
+@@ -64,3 +77,3 @@ public class RenderChunk
 -        if (OpenGlHelper.useVbo())
 -        {
 -            for (int j = 0; j < BlockRenderLayer.values().length; ++j)
 +      //  if (OpenGlHelper.useVbo())
 +      //  {
 +            for (int j = 0; j < vertexBuffers.length; ++j)
-@@ -70 +79,4 @@ public class RenderChunk
+@@ -70 +83,4 @@ public class RenderChunk
 -        }
 +            for(String layer:filters.keySet()){
 +              blockLayers.put(layer,new CapturingVertexBuffer(new BlockPos(0,0,0)));
 +            }
 +      //  }
-@@ -91 +103 @@ public class RenderChunk
+@@ -91 +107 @@ public class RenderChunk
 -    public void func_189562_a(int p_189562_1_, int p_189562_2_, int p_189562_3_)
 +    public void setPosition(int x, int y, int z)
-@@ -93 +105 @@ public class RenderChunk
+@@ -93 +109 @@ public class RenderChunk
 -        if (p_189562_1_ != this.position.getX() || p_189562_2_ != this.position.getY() || p_189562_3_ != this.position.getZ())
 +        if (x != this.position.getX() || y != this.position.getY() || z != this.position.getZ())
-@@ -96,2 +108,2 @@ public class RenderChunk
+@@ -96,2 +112,2 @@ public class RenderChunk
 -            this.position.set(p_189562_1_, p_189562_2_, p_189562_3_);
 -            this.boundingBox = new AxisAlignedBB((double)p_189562_1_, (double)p_189562_2_, (double)p_189562_3_, (double)(p_189562_1_ + 16), (double)(p_189562_2_ + 16), (double)(p_189562_3_ + 16));
 +            this.position.set(x, y, z);
 +            this.boundingBox = new AxisAlignedBB((double)x, (double)y, (double)z, (double)(x + 16), (double)(y + 16), (double)(z + 16));
-@@ -118,0 +131,24 @@ public class RenderChunk
+@@ -118,0 +135,27 @@ public class RenderChunk
 +    private Optional<NovaNative.mc_chunk_render_object> makeMeshForBuffer(CapturingVertexBuffer capturingVertexBuffer) {
 +        List<Integer> vertexData = new ArrayList<>();
 +        IndexList indices = new IndexList();
 +        NovaNative.mc_chunk_render_object chunk_render_object = new NovaNative.mc_chunk_render_object();
-+
-+        vertexData.addAll(capturingVertexBuffer.getData());
-+
++        IntBuffer dat=capturingVertexBuffer.getRawData();
++       //vertexData.addAll(capturingVertexBuffer.getData());
++        int dat_len=dat.limit();
 +        int offset = indices.size();
-+        for(int i = 0; i < vertexData.size()/7 / 4; i++) {
++        for(int i = 0; i <dat_len/7 / 4; i++) {
 +            indices.addIndicesForFace(offset, 0);
 +
 +            offset += 4;
 +        }
 +
-+        if(vertexData.isEmpty()) {
++        if(capturingVertexBuffer.isEmpty()) {
++        /*  if(dat_len>0){
++LOG.error("Wrong DAT ELN:"+dat_len);
++}*/
 +            return Optional.empty();
 +        }
 +
-+        chunk_render_object.setVertex_data(vertexData);
++        chunk_render_object.setVertex_data(dat);
 +        chunk_render_object.setIndices(indices);
 +        chunk_render_object.format = NovaNative.NovaVertexFormat.POS_UV_LIGHTMAPUV_NORMAL_TANGENT.ordinal();
 +
 +        return Optional.of(chunk_render_object);
 +    }
-@@ -124,2 +160,2 @@ public class RenderChunk
+@@ -124,2 +167,2 @@ public class RenderChunk
 -        BlockPos blockpos = this.position;
 -        BlockPos blockpos1 = blockpos.add(15, 15, 15);
 +        BlockPos minPos = this.position;
 +        BlockPos maxPos = minPos.add(15, 15, 15);
-@@ -142,2 +178,7 @@ public class RenderChunk
+@@ -142,2 +185,7 @@ public class RenderChunk
 -        VisGraph lvt_9_1_ = new VisGraph();
 -        HashSet lvt_10_1_ = Sets.newHashSet();
 +        VisGraph visGraph = new VisGraph();

+                this.blockLayers.put(entry.getKey(),new CapturingVertexBuffer(minPos));
+                this.preRenderBlocks(this.blockLayers.get(entry.getKey()), minPos);
+            }
@@ -145 +186,2 @@ public class RenderChunk
-        if (!this.field_189564_r.extendedLevelsInChunkCache())
+        }
+        if (!this.blockAccess.extendedLevelsInChunkCache())
@@ -151 +193 @@ public class RenderChunk
-            for (BlockPos.MutableBlockPos blockpos$mutableblockpos : BlockPos.getAllInBoxMutable(blockpos, blockpos1))
+            for (BlockPos.MutableBlockPos mutablePos : BlockPos.getAllInBoxMutable(minPos, maxPos))
@@ -153 +195 @@ public class RenderChunk
-                IBlockState iblockstate = this.field_189564_r.getBlockState(blockpos$mutableblockpos);
+                IBlockState iblockstate = this.blockAccess.getBlockState(mutablePos);
@@ -158 +200 @@ public class RenderChunk
-                    lvt_9_1_.setOpaqueCube(blockpos$mutableblockpos);
+                    visGraph.setOpaqueCube(mutablePos);
@@ -163 +205 @@ public class RenderChunk
-                    TileEntity tileentity = this.field_189564_r.getTileEntity(new BlockPos(blockpos$mutableblockpos));
+                    TileEntity tileEntity = this.blockAccess.getTileEntity(new BlockPos(mutablePos));
@@ -165 +207 @@ public class RenderChunk
-                    if (tileentity != null)
+                    if (tileEntity != null)
@@ -167 +209 @@ public class RenderChunk
-                        TileEntitySpecialRenderer<TileEntity> tileentityspecialrenderer = TileEntityRendererDispatcher.instance.<TileEntity>getSpecialRenderer(tileentity);
+                        TileEntitySpecialRenderer<TileEntity> tileEntityRenderer = TileEntityRendererDispatcher.instance.<TileEntity>getSpecialRenderer(tileEntity);
@@ -169 +211 @@ public class RenderChunk
-                        if (tileentityspecialrenderer != null)
+                        if (tileEntityRenderer != null)
@@ -171 +213 @@ public class RenderChunk
-                            compiledchunk.addTileEntity(tileentity);
+                            compiledchunk.addTileEntity(tileEntity);
@@ -173 +215 @@ public class RenderChunk
-                            if (tileentityspecialrenderer.isGlobalRenderer(tileentity))
+                            if (tileEntityRenderer.isGlobalRenderer(tileEntity))
@@ -175 +217 @@ public class RenderChunk
-                                lvt_10_1_.add(tileentity);
+                                hashSet.add(tileEntity);
@@ -185,0 +228,5 @@ public class RenderChunk
+                    for(Map.Entry<String, IGeometryFilter> entry : filters.entrySet()) {
+                        if(entry.getValue().matches(block.getDefaultState())) {
+                            blockrendererdispatcher.renderBlock(iblockstate, mutablePos, this.blockAccess, this.blockLayers.get(entry.getKey()));
+                        }
+                    }
@@ -188 +235 @@ public class RenderChunk
-                    if (!compiledchunk.isLayerStarted(blockrenderlayer1))
+                    /*if (!compiledchunk.isLayerStarted(blockrenderlayer1))
@@ -191,2 +238,2 @@ public class RenderChunk
-                        this.preRenderBlocks(vertexbuffer, blockpos);
-                    }
+                        this.preRenderBlocks(vertexbuffer, minPos);
+                    }*/
@@ -194 +241 @@ public class RenderChunk
-                    aboolean[j] |= blockrendererdispatcher.renderBlock(iblockstate, blockpos$mutableblockpos, this.field_189564_r, vertexbuffer);
+                    //aboolean[j] |= blockrendererdispatcher.renderBlock(iblockstate, mutablePos, this.blockAccess, vertexbuffer);
@@ -196,0 +244,18 @@ public class RenderChunk
+            for(Map.Entry<String, CapturingVertexBuffer> entry : blockLayers.entrySet()) {
+              //entry.getValue().finishDrawing();
+              CapturingVertexBuffer b=entry.getValue();

+              });
+
+                  }
@@ -198 +270 @@ public class RenderChunk
-            for (BlockRenderLayer blockrenderlayer : BlockRenderLayer.values())
+          /*  for (BlockRenderLayer blockrenderlayer : BlockRenderLayer.values())
@@ -209,0 +282 @@ public class RenderChunk
+            */
@@ -212 +285 @@ public class RenderChunk
-        compiledchunk.setVisibility(lvt_9_1_.computeVisibility());
+        compiledchunk.setVisibility(visGraph.computeVisibility());
@@ -217 +290 @@ public class RenderChunk
-            Set<TileEntity> set = Sets.newHashSet(lvt_10_1_);
+            Set<TileEntity> set = Sets.newHashSet(hashSet);
@@ -220 +293 @@ public class RenderChunk
-            set1.removeAll(lvt_10_1_);
+            set1.removeAll(hashSet);
@@ -222 +295 @@ public class RenderChunk
-            this.setTileEntities.addAll(lvt_10_1_);
+            this.setTileEntities.addAll(hashSet);
@@ -263 +336 @@ public class RenderChunk
-            this.func_189563_q();
+            this.initBlockAccess();
@@ -274 +347 @@ public class RenderChunk
-    private void func_189563_q()
+    private void initBlockAccess()
@@ -277 +350 @@ public class RenderChunk
-        this.field_189564_r = new ChunkCache(this.world, this.position.add(-1, -1, -1), this.position.add(16, 16, 16), 1);
+        this.blockAccess = new ChunkCache(this.world, this.position.add(-1, -1, -1), this.position.add(16, 16, 16), 1);
diff --git b/minecraft/client/renderer/chunk/VboChunkFactory.java a/minecraft/client/renderer/chunk/VboChunkFactory.java
