diff --git a/TODO.txt b/TODO.txt
index bef7066..85058af 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -9,7 +9,7 @@ deco			No		Stone - Smooth + stairs + slabs
 							Limestone
 							Slate
 							Basalt
-deco			No		Wood - Doors + fences
+deco			No		Wood - Doors
 							Hevea
 							Bamboo
 -------------------------------------------------------------------------------------------------------
diff --git a/src/java/mmm/deco/DFence.java b/src/java/mmm/deco/DFence.java
index 90ec1a4..da10b59 100644
--- a/src/java/mmm/deco/DFence.java
+++ b/src/java/mmm/deco/DFence.java
@@ -8,12 +8,13 @@ import mmm.utils.URegistry;
 public class DFence
 {
 	public final DFenceBlock BLOCK;
+	public final DFenceGate GATE;
 
 
 	public DFence( DWoodType woodType )
 	{
-		this.BLOCK = new DFenceBlock( woodType );
-		URegistry.addBlock( this.BLOCK );
+		URegistry.addBlock( this.BLOCK = new DFenceBlock( woodType ) );
+		URegistry.addBlock( this.GATE = new DFenceGate( woodType ) );
 	}
 
 }
diff --git a/src/java/mmm/deco/DFenceBlock.java b/src/java/mmm/deco/DFenceBlock.java
index 3a49df4..d33a321 100644
--- a/src/java/mmm/deco/DFenceBlock.java
+++ b/src/java/mmm/deco/DFenceBlock.java
@@ -35,7 +35,7 @@ public class DFenceBlock
 	@Override
 	public void registerRecipes( )
 	{
-		GameRegistry.addShapedRecipe( new ItemStack( this ) , //
+		GameRegistry.addShapedRecipe( new ItemStack( this , 3 ) , //
 				"PSP" , //
 				"PSP" , //
 				'P' , this.woodType.getPlanksBlock( ) , //
diff --git a/src/java/mmm/deco/DFenceGate.java b/src/java/mmm/deco/DFenceGate.java
new file mode 100644
index 0000000..928d4ba
--- /dev/null
+++ b/src/java/mmm/deco/DFenceGate.java
@@ -0,0 +1,64 @@
+package mmm.deco;
+
+
+import mmm.utils.I_URecipeRegistrar;
+import mmm.utils.I_UStateMapperProvider;
+import mmm.utils.URegistry;
+import mmm.utils.UStateMapper;
+import net.minecraft.block.BlockFenceGate;
+import net.minecraft.block.BlockPlanks;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.MapColor;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.renderer.block.statemap.IStateMapper;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fml.common.registry.GameRegistry;
+
+
+
+public class DFenceGate
+		extends BlockFenceGate
+		implements I_URecipeRegistrar , I_UStateMapperProvider
+{
+
+	private final DWoodType woodType;
+
+
+	public DFenceGate( DWoodType woodType )
+	{
+		super( BlockPlanks.EnumType.OAK );
+		this.woodType = woodType;
+		this.setHardness( 2.f );
+		this.setResistance( 5.f );
+		this.setSoundType( SoundType.WOOD );
+		this.setHarvestLevel( "axe" , 0 );
+		URegistry.setIdentifiers( this , "deco" , "fence" , "gate" , woodType.getSuffix( ) );
+	}
+
+
+	@Override
+	public MapColor getMapColor( IBlockState state )
+	{
+		return this.woodType.getMapColor( );
+	}
+
+
+	@Override
+	public void registerRecipes( )
+	{
+		GameRegistry.addShapedRecipe( new ItemStack( this ) , //
+				"SPS" , //
+				"SPS" , //
+				'P' , this.woodType.getPlanksBlock( ) , //
+				'S' , Items.STICK );
+	}
+
+
+	@Override
+	public IStateMapper getStateMapper( )
+	{
+		return UStateMapper.ignoreProperties( BlockFenceGate.POWERED );
+	}
+
+}
diff --git a/src/java/mmm/food/FMilkBucket.java b/src/java/mmm/food/FMilkBucket.java
index 3f8343e..8fe4045 100644
--- a/src/java/mmm/food/FMilkBucket.java
+++ b/src/java/mmm/food/FMilkBucket.java
@@ -1,7 +1,7 @@
 package mmm.food;
 
 
-import mmm.utils.I_UItemModelProvider;
+import mmm.utils.I_UItemModelProviderBasic;
 import mmm.utils.URegistry;
 import net.minecraft.client.renderer.block.model.ModelResourceLocation;
 import net.minecraft.creativetab.CreativeTabs;
@@ -12,7 +12,7 @@ import net.minecraft.item.Item;
 
 public class FMilkBucket
 		extends Item
-		implements I_UItemModelProvider
+		implements I_UItemModelProviderBasic
 {
 
 	public final FMilkType milkType;
diff --git a/src/java/mmm/utils/I_UItemModelProvider.java b/src/java/mmm/utils/I_UItemModelProvider.java
index 9a13403..cda3014 100644
--- a/src/java/mmm/utils/I_UItemModelProvider.java
+++ b/src/java/mmm/utils/I_UItemModelProvider.java
@@ -1,13 +1,10 @@
 package mmm.utils;
 
 
-import net.minecraft.client.renderer.block.model.ModelResourceLocation;
-
-
-
 public interface I_UItemModelProvider
+		extends I_URequiresClientPreInit
 {
 
-	public ModelResourceLocation getModelResourceLocation( );
+	// EMPTY
 
 }
diff --git a/src/java/mmm/utils/I_UItemModelProviderBasic.java b/src/java/mmm/utils/I_UItemModelProviderBasic.java
new file mode 100644
index 0000000..d911f5e
--- /dev/null
+++ b/src/java/mmm/utils/I_UItemModelProviderBasic.java
@@ -0,0 +1,17 @@
+package mmm.utils;
+
+
+import net.minecraft.client.renderer.block.model.ModelResourceLocation;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+
+
+public interface I_UItemModelProviderBasic
+		extends I_UItemModelProvider
+{
+
+	@SideOnly( Side.CLIENT )
+	public ModelResourceLocation getModelResourceLocation( );
+
+}
diff --git a/src/java/mmm/utils/I_UItemWithVariants.java b/src/java/mmm/utils/I_UItemWithVariants.java
new file mode 100644
index 0000000..ba64aaa
--- /dev/null
+++ b/src/java/mmm/utils/I_UItemWithVariants.java
@@ -0,0 +1,20 @@
+package mmm.utils;
+
+
+import net.minecraft.client.renderer.block.model.ModelResourceLocation;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+
+
+public interface I_UItemWithVariants
+		extends I_UItemModelProvider
+{
+
+	public int getVariantsCount( );
+
+
+	@SideOnly( Side.CLIENT )
+	public ModelResourceLocation getModelResourceLocation( int variant );
+
+}
diff --git a/src/java/mmm/utils/I_URequiresClientInit.java b/src/java/mmm/utils/I_URequiresClientInit.java
new file mode 100644
index 0000000..d1a786f
--- /dev/null
+++ b/src/java/mmm/utils/I_URequiresClientInit.java
@@ -0,0 +1,7 @@
+package mmm.utils;
+
+
+public interface I_URequiresClientInit
+{
+	// EMPTY
+}
diff --git a/src/java/mmm/utils/I_URequiresClientPreInit.java b/src/java/mmm/utils/I_URequiresClientPreInit.java
new file mode 100644
index 0000000..1e4b725
--- /dev/null
+++ b/src/java/mmm/utils/I_URequiresClientPreInit.java
@@ -0,0 +1,7 @@
+package mmm.utils;
+
+
+public interface I_URequiresClientPreInit
+{
+	// EMPTY
+}
diff --git a/src/java/mmm/utils/I_UStateMapperProvider.java b/src/java/mmm/utils/I_UStateMapperProvider.java
new file mode 100644
index 0000000..10fa9b8
--- /dev/null
+++ b/src/java/mmm/utils/I_UStateMapperProvider.java
@@ -0,0 +1,17 @@
+package mmm.utils;
+
+
+import net.minecraft.client.renderer.block.statemap.IStateMapper;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+
+
+public interface I_UStateMapperProvider
+		extends I_URequiresClientPreInit
+{
+
+	@SideOnly( Side.CLIENT )
+	IStateMapper getStateMapper( );
+
+}
diff --git a/src/java/mmm/utils/I_UTintedBlock.java b/src/java/mmm/utils/I_UTintedBlock.java
index 7d1c254..01788f7 100644
--- a/src/java/mmm/utils/I_UTintedBlock.java
+++ b/src/java/mmm/utils/I_UTintedBlock.java
@@ -9,6 +9,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
 
 /** For blocks that need to register a tint */
 public interface I_UTintedBlock
+		extends I_URequiresClientInit
 {
 
 	@SideOnly( Side.CLIENT )
diff --git a/src/java/mmm/utils/I_UTintedItem.java b/src/java/mmm/utils/I_UTintedItem.java
index 10473be..7aa8035 100644
--- a/src/java/mmm/utils/I_UTintedItem.java
+++ b/src/java/mmm/utils/I_UTintedItem.java
@@ -12,6 +12,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
  * to be tinted.
  */
 public interface I_UTintedItem
+		extends I_URequiresClientInit
 {
 
 	@SideOnly( Side.CLIENT )
diff --git a/src/java/mmm/utils/UBlockItemWithVariants.java b/src/java/mmm/utils/UBlockItemWithVariants.java
index e9756d3..c038e90 100644
--- a/src/java/mmm/utils/UBlockItemWithVariants.java
+++ b/src/java/mmm/utils/UBlockItemWithVariants.java
@@ -8,12 +8,12 @@ import net.minecraft.item.EnumDyeColor;
 import net.minecraft.item.ItemBlock;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.client.model.ModelLoader;
 
 
 
 public class UBlockItemWithVariants
 		extends ItemBlock
+		implements I_UItemWithVariants
 {
 	private final String[] baseName;
 	private String[] variants;
@@ -66,16 +66,8 @@ public class UBlockItemWithVariants
 			sbRegPath.append( this.baseName[ i ] );
 		}
 		this.setRegistryName( Mmm.ID , sbRegPath.toString( ) );
-		URegistry.addItem( this , false );
+		URegistry.addItem( this );
 
-		final int len = sbRegPath.length( );
-		final int nVariants = this.variants.length;
-		for ( int i = 0 ; i < nVariants ; i++ ) {
-			sbRegPath.setLength( len );
-			sbRegPath.append( '/' ).append( this.variants[ i ] );
-			ModelLoader.setCustomModelResourceLocation( this , i , new ModelResourceLocation( //
-					new ResourceLocation( Mmm.ID , sbRegPath.toString( ) ) , "inventory" ) );
-		}
 		return this;
 	}
 
@@ -94,4 +86,21 @@ public class UBlockItemWithVariants
 				+ EnumDyeColor.byMetadata( stack.getMetadata( ) ).getUnlocalizedName( );
 	}
 
+
+	@Override
+	public int getVariantsCount( )
+	{
+		return this.variants.length;
+	}
+
+
+	@Override
+	public ModelResourceLocation getModelResourceLocation( final int variant )
+	{
+		return new ModelResourceLocation( //
+				new ResourceLocation( Mmm.ID ,
+						this.getRegistryName( ).getResourcePath( ) + "/" + this.variants[ variant ] ) , //
+				"inventory" );
+	}
+
 }
diff --git a/src/java/mmm/utils/URegistry.java b/src/java/mmm/utils/URegistry.java
index c0a4a06..e38fdbb 100644
--- a/src/java/mmm/utils/URegistry.java
+++ b/src/java/mmm/utils/URegistry.java
@@ -6,7 +6,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 
 import mmm.Mmm;
 import net.minecraft.block.Block;
@@ -54,12 +53,12 @@ public class URegistry
 
 	private static final HashSet< I_URecipeRegistrar > RECIPE_REGISTRARS = new HashSet<>( );
 	private static final HashSet< I_UOreGenerationRegistrar > ORE_GEN_REGISTRARS = new HashSet<>( );
-	private static final HashMap< Item , Boolean > ITEMS = new HashMap< Item , Boolean >( );
+	private static final HashSet< Item > ITEMS = new HashSet< Item >( );
 	private static final HashSet< Block > BLOCKS = new HashSet< Block >( );
 
-	private static final ArrayList< Block > TINTED_BLOCKS = new ArrayList<>( );
-	private static final ArrayList< Block > TINTED_BLOCK_ITEMS = new ArrayList<>( );
-	private static final ArrayList< Item > TINTED_ITEMS = new ArrayList<>( );
+	private static final ArrayList< Block > BLOCKS_CLIENT_PREINIT = new ArrayList<>( );
+	private static final ArrayList< Block > BLOCKS_CLIENT_INIT = new ArrayList<>( );
+	private static final ArrayList< Item > ITEMS_CLIENT_INIT = new ArrayList<>( );
 
 	private static final HashMap< Item , Object > FUELS = new HashMap<>( );
 	private static final FuelHandler FUEL_HANDLER = new FuelHandler( );
@@ -102,35 +101,17 @@ public class URegistry
 
 	public static void addItem( final Item item )
 	{
-		URegistry.addItem( item , true );
-	}
-
-
-	public static void addItem( final Item item , final boolean registerModel )
-	{
-		if ( URegistry.ITEMS.put( item , registerModel ) == null ) {
+		if ( URegistry.ITEMS.add( item ) ) {
 			GameRegistry.register( item );
-			if ( item instanceof I_UTintedItem ) {
-				URegistry.TINTED_ITEMS.add( item );
-			}
 			URegistry.addRecipeRegistrar( item );
+			if ( item instanceof I_URequiresClientInit ) {
+				URegistry.ITEMS_CLIENT_INIT.add( item );
+			}
 		}
 	}
 
 
 	public static Item addBlock( final Block block )
-	{
-		return URegistry.addBlock( block , true );
-	}
-
-
-	public static Item addBlock( final Block block , final Item blockItem )
-	{
-		return URegistry.addBlock( block , blockItem , true );
-	}
-
-
-	public static Item addBlock( final Block block , final boolean registerItemModel )
 	{
 		Item item;
 		if ( block instanceof I_UColoredBlock ) {
@@ -139,29 +120,28 @@ public class URegistry
 			item = new ItemBlock( block );
 		}
 		item.setRegistryName( block.getRegistryName( ) );
-		return URegistry.addBlock( block , item , registerItemModel );
+		return URegistry.addBlock( block , item );
 	}
 
 
-	public static Item addBlock( final Block block , final Item blockItem , final boolean registerItemModel )
+	public static Item addBlock( final Block block , final Item blockItem )
 	{
 		if ( URegistry.BLOCKS.add( block ) ) {
 			GameRegistry.register( block );
-			if ( block instanceof I_UTintedBlock ) {
-				URegistry.TINTED_BLOCKS.add( block );
-			}
-			if ( block instanceof I_UTintedItem ) {
-				URegistry.TINTED_BLOCK_ITEMS.add( block );
-			}
-
 			URegistry.addRecipeRegistrar( block );
 			URegistry.addOreGenerationRegistrar( block );
 			if ( block instanceof I_UTrapBlock ) {
 				UTrapBlocks.INSTANCE.register( (I_UTrapBlock) block );
 			}
+			if ( block instanceof I_URequiresClientPreInit ) {
+				URegistry.BLOCKS_CLIENT_PREINIT.add( block );
+			}
+			if ( block instanceof I_URequiresClientInit ) {
+				URegistry.BLOCKS_CLIENT_INIT.add( block );
+			}
 
 			if ( blockItem != null ) {
-				URegistry.addItem( blockItem , registerItemModel );
+				URegistry.addItem( blockItem );
 			}
 		}
 		return blockItem;
@@ -231,19 +211,34 @@ public class URegistry
 	@SideOnly( Side.CLIENT )
 	public static void preInitClient( )
 	{
-		// Register item models
-		for ( final Map.Entry< Item , Boolean > entry : URegistry.ITEMS.entrySet( ) ) {
-			if ( !entry.getValue( ) ) {
+		for ( final Item item : URegistry.ITEMS ) {
+			// Automatic model location unless there's a provider
+			if ( ! ( item instanceof I_UItemModelProvider ) ) {
+				final ModelResourceLocation location = new ModelResourceLocation( item.getRegistryName( ) ,
+						"inventory" );
+				ModelLoader.setCustomModelResourceLocation( item , 0 , location );
+			}
+
+			if ( ! ( item instanceof I_URequiresClientPreInit ) ) {
 				continue;
 			}
-			final Item item = entry.getKey( );
-			ModelResourceLocation location;
-			if ( item instanceof I_UItemModelProvider ) {
-				location = ( (I_UItemModelProvider) item ).getModelResourceLocation( );
-			} else {
-				location = new ModelResourceLocation( item.getRegistryName( ) , "inventory" );
+
+			// Item models
+			if ( item instanceof I_UItemModelProviderBasic ) {
+				ModelLoader.setCustomModelResourceLocation( item , 0 ,
+						( (I_UItemModelProviderBasic) item ).getModelResourceLocation( ) );
+			} else if ( item instanceof I_UItemWithVariants ) {
+				final I_UItemWithVariants iwv = (I_UItemWithVariants) item;
+				for ( int i = 0 ; i < iwv.getVariantsCount( ) ; i++ ) {
+					ModelLoader.setCustomModelResourceLocation( item , i , iwv.getModelResourceLocation( i ) );
+				}
+			}
+		}
+
+		for ( final Block block : URegistry.BLOCKS_CLIENT_PREINIT ) {
+			if ( block instanceof I_UStateMapperProvider ) {
+				ModelLoader.setCustomStateMapper( block , ( (I_UStateMapperProvider) block ).getStateMapper( ) );
 			}
-			ModelLoader.setCustomModelResourceLocation( item , 0 , location );
 		}
 	}
 
@@ -254,19 +249,23 @@ public class URegistry
 		final BlockColors blockColors = Minecraft.getMinecraft( ).getBlockColors( );
 		final ItemColors itemColors = Minecraft.getMinecraft( ).getItemColors( );
 
-		// Register tinted blocks
-		for ( final Block tintedBlock : URegistry.TINTED_BLOCKS ) {
-			blockColors.registerBlockColorHandler( ( (I_UTintedBlock) tintedBlock ).getBlockTint( ) , tintedBlock );
+		for ( final Block block : URegistry.BLOCKS_CLIENT_INIT ) {
+			// Register tinted blocks
+			if ( block instanceof I_UTintedBlock ) {
+				blockColors.registerBlockColorHandler( ( (I_UTintedBlock) block ).getBlockTint( ) , block );
+			}
+
+			// Register tinted block items
+			if ( block instanceof I_UTintedItem ) {
+				itemColors.registerItemColorHandler( ( (I_UTintedItem) block ).getItemTint( ) , block );
+			}
 		}
 
-		// Register tinted block items
-		for ( final Block tintedBlock : URegistry.TINTED_BLOCK_ITEMS ) {
-			itemColors.registerItemColorHandler( ( (I_UTintedItem) tintedBlock ).getItemTint( ) , tintedBlock );
-		}
-
-		// Register tinted items
-		for ( final Item tintedItem : URegistry.TINTED_ITEMS ) {
-			itemColors.registerItemColorHandler( ( (I_UTintedItem) tintedItem ).getItemTint( ) , tintedItem );
+		for ( final Item item : URegistry.ITEMS_CLIENT_INIT ) {
+			// Register tinted items
+			if ( item instanceof I_UTintedItem ) {
+				itemColors.registerItemColorHandler( ( (I_UTintedItem) item ).getItemTint( ) , item );
+			}
 		}
 	}
 }
diff --git a/src/java/mmm/utils/UStateMapper.java b/src/java/mmm/utils/UStateMapper.java
new file mode 100644
index 0000000..0c1fda2
--- /dev/null
+++ b/src/java/mmm/utils/UStateMapper.java
@@ -0,0 +1,22 @@
+package mmm.utils;
+
+
+import net.minecraft.block.properties.IProperty;
+import net.minecraft.client.renderer.block.statemap.IStateMapper;
+import net.minecraft.client.renderer.block.statemap.StateMap;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+
+
+public class UStateMapper
+{
+
+	@SideOnly( Side.CLIENT )
+	public static IStateMapper ignoreProperties( final IProperty< ? >... properties )
+	{
+		System.err.println( "\n\nLOLWUT\n\n" );
+		return new StateMap.Builder( ).ignore( properties ).build( );
+	}
+
+}
diff --git a/src/resources/assets/mmm/blockstates/deco/fence/gate/bamboo.json b/src/resources/assets/mmm/blockstates/deco/fence/gate/bamboo.json
new file mode 100644
index 0000000..6942a03
--- /dev/null
+++ b/src/resources/assets/mmm/blockstates/deco/fence/gate/bamboo.json
@@ -0,0 +1,20 @@
+{
+    "variants": {
+        "facing=south,in_wall=false,open=false": { "model": "mmm:deco/fence/bamboo/gate_closed", "uvlock": true },
+        "facing=west,in_wall=false,open=false":  { "model": "mmm:deco/fence/bamboo/gate_closed", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=false,open=false": { "model": "mmm:deco/fence/bamboo/gate_closed", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=false,open=false":  { "model": "mmm:deco/fence/bamboo/gate_closed", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=false,open=true": { "model": "mmm:deco/fence/bamboo/gate_open", "uvlock": true },
+        "facing=west,in_wall=false,open=true":  { "model": "mmm:deco/fence/bamboo/gate_open", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=false,open=true": { "model": "mmm:deco/fence/bamboo/gate_open", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=false,open=true":  { "model": "mmm:deco/fence/bamboo/gate_open", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=true,open=false": { "model": "mmm:deco/fence/bamboo/wall_closed", "uvlock": true },
+        "facing=west,in_wall=true,open=false":  { "model": "mmm:deco/fence/bamboo/wall_closed", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=true,open=false": { "model": "mmm:deco/fence/bamboo/wall_closed", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=true,open=false":  { "model": "mmm:deco/fence/bamboo/wall_closed", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=true,open=true": { "model": "mmm:deco/fence/bamboo/wall_open", "uvlock": true },
+        "facing=west,in_wall=true,open=true":  { "model": "mmm:deco/fence/bamboo/wall_open", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=true,open=true": { "model": "mmm:deco/fence/bamboo/wall_open", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=true,open=true":  { "model": "mmm:deco/fence/bamboo/wall_open", "uvlock": true, "y": 270 }
+    }
+}
diff --git a/src/resources/assets/mmm/blockstates/deco/fence/gate/hevea.json b/src/resources/assets/mmm/blockstates/deco/fence/gate/hevea.json
new file mode 100644
index 0000000..9491454
--- /dev/null
+++ b/src/resources/assets/mmm/blockstates/deco/fence/gate/hevea.json
@@ -0,0 +1,20 @@
+{
+    "variants": {
+        "facing=south,in_wall=false,open=false": { "model": "mmm:deco/fence/hevea/gate_closed", "uvlock": true },
+        "facing=west,in_wall=false,open=false":  { "model": "mmm:deco/fence/hevea/gate_closed", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=false,open=false": { "model": "mmm:deco/fence/hevea/gate_closed", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=false,open=false":  { "model": "mmm:deco/fence/hevea/gate_closed", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=false,open=true": { "model": "mmm:deco/fence/hevea/gate_open", "uvlock": true },
+        "facing=west,in_wall=false,open=true":  { "model": "mmm:deco/fence/hevea/gate_open", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=false,open=true": { "model": "mmm:deco/fence/hevea/gate_open", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=false,open=true":  { "model": "mmm:deco/fence/hevea/gate_open", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=true,open=false": { "model": "mmm:deco/fence/hevea/wall_closed", "uvlock": true },
+        "facing=west,in_wall=true,open=false":  { "model": "mmm:deco/fence/hevea/wall_closed", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=true,open=false": { "model": "mmm:deco/fence/hevea/wall_closed", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=true,open=false":  { "model": "mmm:deco/fence/hevea/wall_closed", "uvlock": true, "y": 270 },
+        "facing=south,in_wall=true,open=true": { "model": "mmm:deco/fence/hevea/wall_open", "uvlock": true },
+        "facing=west,in_wall=true,open=true":  { "model": "mmm:deco/fence/hevea/wall_open", "uvlock": true, "y": 90 },
+        "facing=north,in_wall=true,open=true": { "model": "mmm:deco/fence/hevea/wall_open", "uvlock": true, "y": 180 },
+        "facing=east,in_wall=true,open=true":  { "model": "mmm:deco/fence/hevea/wall_open", "uvlock": true, "y": 270 }
+    }
+}
diff --git a/src/resources/assets/mmm/lang/en_US.lang b/src/resources/assets/mmm/lang/en_US.lang
index 649515a..63ab107 100644
--- a/src/resources/assets/mmm/lang/en_US.lang
+++ b/src/resources/assets/mmm/lang/en_US.lang
@@ -179,6 +179,7 @@ tile.mmm.deco.throne.oak.red.name=Oak Throne (Red)
 tile.mmm.deco.throne.oak.silver.name=Oak Throne (Silver)
 tile.mmm.deco.throne.oak.white.name=Oak Throne (White)
 tile.mmm.deco.throne.oak.yellow.name=Oak Throne (Yellow)
+
 tile.mmm.deco.throne.birch.black.name=Birch Throne (Black)
 tile.mmm.deco.throne.birch.blue.name=Birch Throne (Blue)
 tile.mmm.deco.throne.birch.brown.name=Birch Throne (Brown)
@@ -195,6 +196,7 @@ tile.mmm.deco.throne.birch.red.name=Birch Throne (Red)
 tile.mmm.deco.throne.birch.silver.name=Birch Throne (Silver)
 tile.mmm.deco.throne.birch.white.name=Birch Throne (White)
 tile.mmm.deco.throne.birch.yellow.name=Birch Throne (Yellow)
+
 tile.mmm.deco.throne.spruce.black.name=Spruce Throne (Black)
 tile.mmm.deco.throne.spruce.blue.name=Spruce Throne (Blue)
 tile.mmm.deco.throne.spruce.brown.name=Spruce Throne (Brown)
@@ -211,6 +213,7 @@ tile.mmm.deco.throne.spruce.red.name=Spruce Throne (Red)
 tile.mmm.deco.throne.spruce.silver.name=Spruce Throne (Silver)
 tile.mmm.deco.throne.spruce.white.name=Spruce Throne (White)
 tile.mmm.deco.throne.spruce.yellow.name=Spruce Throne (Yellow)
+
 tile.mmm.deco.throne.jungle.black.name=Jungle Wood Throne (Black)
 tile.mmm.deco.throne.jungle.blue.name=Jungle Wood Throne (Blue)
 tile.mmm.deco.throne.jungle.brown.name=Jungle Wood Throne (Brown)
@@ -227,6 +230,7 @@ tile.mmm.deco.throne.jungle.red.name=Jungle Wood Throne (Red)
 tile.mmm.deco.throne.jungle.silver.name=Jungle Wood Throne (Silver)
 tile.mmm.deco.throne.jungle.white.name=Jungle Wood Throne (White)
 tile.mmm.deco.throne.jungle.yellow.name=Jungle Wood Throne (Yellow)
+
 tile.mmm.deco.throne.dark_oak.black.name=Dark Oak Throne (Black)
 tile.mmm.deco.throne.dark_oak.blue.name=Dark Oak Throne (Blue)
 tile.mmm.deco.throne.dark_oak.brown.name=Dark Oak Throne (Brown)
@@ -243,6 +247,7 @@ tile.mmm.deco.throne.dark_oak.red.name=Dark Oak Throne (Red)
 tile.mmm.deco.throne.dark_oak.silver.name=Dark Oak Throne (Silver)
 tile.mmm.deco.throne.dark_oak.white.name=Dark Oak Throne (White)
 tile.mmm.deco.throne.dark_oak.yellow.name=Dark Oak Throne (Yellow)
+
 tile.mmm.deco.throne.acacia.black.name=Acacia Throne (Black)
 tile.mmm.deco.throne.acacia.blue.name=Acacia Throne (Blue)
 tile.mmm.deco.throne.acacia.brown.name=Acacia Throne (Brown)
@@ -259,6 +264,7 @@ tile.mmm.deco.throne.acacia.red.name=Acacia Throne (Red)
 tile.mmm.deco.throne.acacia.silver.name=Acacia Throne (Silver)
 tile.mmm.deco.throne.acacia.white.name=Acacia Throne (White)
 tile.mmm.deco.throne.acacia.yellow.name=Acacia Throne (Yellow)
+
 tile.mmm.deco.throne.bamboo.black.name=Bamboo Throne (Black)
 tile.mmm.deco.throne.bamboo.blue.name=Bamboo Throne (Blue)
 tile.mmm.deco.throne.bamboo.brown.name=Bamboo Throne (Brown)
@@ -275,6 +281,7 @@ tile.mmm.deco.throne.bamboo.red.name=Bamboo Throne (Red)
 tile.mmm.deco.throne.bamboo.silver.name=Bamboo Throne (Silver)
 tile.mmm.deco.throne.bamboo.white.name=Bamboo Throne (White)
 tile.mmm.deco.throne.bamboo.yellow.name=Bamboo Throne (Yellow)
+
 tile.mmm.deco.throne.hevea.black.name=Hevea Throne (Black)
 tile.mmm.deco.throne.hevea.blue.name=Hevea Throne (Blue)
 tile.mmm.deco.throne.hevea.brown.name=Hevea Throne (Brown)
@@ -293,4 +300,6 @@ tile.mmm.deco.throne.hevea.white.name=Hevea Throne (White)
 tile.mmm.deco.throne.hevea.yellow.name=Hevea Throne (Yellow)
 
 tile.mmm.deco.fence.hevea.name=Hevea Fence
+tile.mmm.deco.fence.gate.hevea.name=Hevea Fence Gate
 tile.mmm.deco.fence.bamboo.name=Bamboo Fence
+tile.mmm.deco.fence.gate.bamboo.name=Bamboo Fence Gate
diff --git a/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_closed.json b/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_closed.json
new file mode 100644
index 0000000..3d04005
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_closed.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/fence_gate_closed",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/bamboo"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_open.json b/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_open.json
new file mode 100644
index 0000000..17a8524
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/bamboo/gate_open.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/fence_gate_open",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/bamboo"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_closed.json b/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_closed.json
new file mode 100644
index 0000000..5c551c4
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_closed.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/wall_gate_closed",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/bamboo"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_open.json b/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_open.json
new file mode 100644
index 0000000..7ffa5a9
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/bamboo/wall_open.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/wall_gate_open",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/bamboo"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_closed.json b/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_closed.json
new file mode 100644
index 0000000..cbd5814
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_closed.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/fence_gate_closed",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/hevea"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_open.json b/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_open.json
new file mode 100644
index 0000000..758a0e6
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/hevea/gate_open.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/fence_gate_open",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/hevea"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_closed.json b/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_closed.json
new file mode 100644
index 0000000..ca4be00
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_closed.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/wall_gate_closed",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/hevea"
+    }
+}
diff --git a/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_open.json b/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_open.json
new file mode 100644
index 0000000..ddfbcab
--- /dev/null
+++ b/src/resources/assets/mmm/models/block/deco/fence/hevea/wall_open.json
@@ -0,0 +1,6 @@
+{
+    "parent": "minecraft:block/wall_gate_open",
+    "textures": {
+        "texture": "mmm:blocks/materials/planks/hevea"
+    }
+}
diff --git a/src/resources/assets/mmm/models/item/deco/fence/gate/bamboo.json b/src/resources/assets/mmm/models/item/deco/fence/gate/bamboo.json
new file mode 100644
index 0000000..82501e0
--- /dev/null
+++ b/src/resources/assets/mmm/models/item/deco/fence/gate/bamboo.json
@@ -0,0 +1,3 @@
+{
+    "parent": "mmm:block/deco/fence/bamboo/gate_closed"
+}
diff --git a/src/resources/assets/mmm/models/item/deco/fence/gate/hevea.json b/src/resources/assets/mmm/models/item/deco/fence/gate/hevea.json
new file mode 100644
index 0000000..7971d17
--- /dev/null
+++ b/src/resources/assets/mmm/models/item/deco/fence/gate/hevea.json
@@ -0,0 +1,3 @@
+{
+    "parent": "mmm:block/deco/fence/hevea/gate_closed"
+}