diff --git a/bin/minecraft/mods/mekanism/gui/GuiMetallurgicInfuser.png b/bin/minecraft/mods/mekanism/gui/GuiMetallurgicInfuser.png
index 1786db6f9..eef0bf162 100755
Binary files a/bin/minecraft/mods/mekanism/gui/GuiMetallurgicInfuser.png and b/bin/minecraft/mods/mekanism/gui/GuiMetallurgicInfuser.png differ
diff --git a/bin/minecraft/mods/mekanism/sound/SolarGenerator.ogg b/bin/minecraft/mods/mekanism/sound/SolarGenerator.ogg
new file mode 100644
index 000000000..179ea43cc
Binary files /dev/null and b/bin/minecraft/mods/mekanism/sound/SolarGenerator.ogg differ
diff --git a/src/minecraft/mekanism/client/IHasSound.java b/src/minecraft/mekanism/client/IHasSound.java
index a4dc8b3c2..5d68b77b1 100644
--- a/src/minecraft/mekanism/client/IHasSound.java
+++ b/src/minecraft/mekanism/client/IHasSound.java
@@ -16,4 +16,10 @@ public interface IHasSound
 	 * @return sound path
 	 */
 	public String getSoundPath();
+	
+	/**
+	 * Gets the multiplier to play this sound by.
+	 * @return sound multiplier
+	 */
+	public float getVolumeMultiplier();
 }
diff --git a/src/minecraft/mekanism/client/ItemRenderingHandler.java b/src/minecraft/mekanism/client/ItemRenderingHandler.java
index 026e2301d..4b124aa11 100644
--- a/src/minecraft/mekanism/client/ItemRenderingHandler.java
+++ b/src/minecraft/mekanism/client/ItemRenderingHandler.java
@@ -6,7 +6,9 @@ import mekanism.common.Mekanism;
 import mekanism.common.BlockMachine.MachineType;
 import mekanism.common.Tier.EnergyCubeTier;
 import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.model.ModelChest;
+import net.minecraft.client.renderer.EntityRenderer;
 import net.minecraft.client.renderer.RenderBlocks;
 import net.minecraft.client.renderer.Tessellator;
 import net.minecraft.item.ItemStack;
@@ -50,6 +52,9 @@ public class ItemRenderingHandler implements IItemRenderer
 		}
 		else if(item.getItemDamage() == MachineType.ELECTRIC_CHEST.meta)
 		{
+			int performanceToFps = EntityRenderer.performanceToFps(Minecraft.getMinecraft().gameSettings.limitFramerate);
+			float partialTick = System.nanoTime() + (long)(1000000000 / performanceToFps);
+			
 			IElectricChest chest = (IElectricChest)item.getItem();
 			ModelChest electricChest = new ModelChest();
 			
@@ -59,7 +64,7 @@ public class ItemRenderingHandler implements IItemRenderer
             GL11.glScalef(1.0F, -1F, -1F);
 	    	GL11.glBindTexture(3553, FMLClientHandler.instance().getClient().renderEngine.getTexture("/mods/mekanism/render/ElectricChest.png"));
 	    	
-			float lidangle = chest.getPrevLidAngle(item) + (chest.getLidAngle(item) - chest.getPrevLidAngle(item)) * 1F;//partialTick;
+			float lidangle = chest.getPrevLidAngle(item) + (chest.getLidAngle(item) - chest.getPrevLidAngle(item)) * 1F;
 	        lidangle = 1.0F - lidangle;
 	        lidangle = 1.0F - lidangle * lidangle * lidangle;
 	        electricChest.chestLid.rotateAngleX = -((lidangle * 3.141593F) / 2.0F);
diff --git a/src/minecraft/mekanism/client/RenderDynamicTank.java b/src/minecraft/mekanism/client/RenderDynamicTank.java
index 28a954fca..ae627dd09 100644
--- a/src/minecraft/mekanism/client/RenderDynamicTank.java
+++ b/src/minecraft/mekanism/client/RenderDynamicTank.java
@@ -255,7 +255,7 @@ public class RenderDynamicTank extends TileEntitySpecialRenderer
 	
 	private int getStages(int height)
 	{
-		return (height-2)*100;
+		return (height-2)*1600;
 	}
 	
 	private double getX(int x)
diff --git a/src/minecraft/mekanism/client/Sound.java b/src/minecraft/mekanism/client/Sound.java
index 17e147e05..2ac5fa38e 100644
--- a/src/minecraft/mekanism/client/Sound.java
+++ b/src/minecraft/mekanism/client/Sound.java
@@ -137,10 +137,12 @@ public class Sound
 		{
 			if(entityplayer != null && tileEntity != null && entityplayer.worldObj == tileEntity.worldObj)
 			{
+				float multiplier = ((IHasSound)tileEntity).getVolumeMultiplier();
 		    	float volume = 0;
+		    	float masterVolume = Mekanism.audioHandler.masterVolume;
 		    	
-		        double distanceVolume = (entityplayer.getDistanceSq(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord)*0.008);
-		        volume = (float)(Math.max(Mekanism.audioHandler.masterVolume-distanceVolume, 0))*0.05F;
+		        double distance = entityplayer.getDistance(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord);
+		        volume = (float)Math.min(Math.max(masterVolume-((distance*.08F)*masterVolume), 0)*multiplier, 1);
 		
 		        if(Mekanism.audioHandler.soundSystem != null)
 		        {
diff --git a/src/minecraft/mekanism/common/BlockBasic.java b/src/minecraft/mekanism/common/BlockBasic.java
index 8b709cfaf..5106af728 100644
--- a/src/minecraft/mekanism/common/BlockBasic.java
+++ b/src/minecraft/mekanism/common/BlockBasic.java
@@ -1,5 +1,6 @@
 package mekanism.common;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import mekanism.client.ClientProxy;
@@ -177,6 +178,7 @@ public class BlockBasic extends Block
 				
 				if(!manageInventory(entityplayer, tileEntity))
 				{
+					PacketHandler.sendTileEntityPacketToClients(tileEntity, 0, tileEntity.getNetworkedData(new ArrayList()));
 					entityplayer.openGui(Mekanism.instance, 18, world, x, y, z);
 				}
 				else {
diff --git a/src/minecraft/mekanism/common/TileEntityBasicMachine.java b/src/minecraft/mekanism/common/TileEntityBasicMachine.java
index 6d2f6451c..4fe91e701 100644
--- a/src/minecraft/mekanism/common/TileEntityBasicMachine.java
+++ b/src/minecraft/mekanism/common/TileEntityBasicMachine.java
@@ -377,4 +377,10 @@ public abstract class TileEntityBasicMachine extends TileEntityElectricBlock imp
 	{
 		return soundURL;
 	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 1;
+	}
 }
diff --git a/src/minecraft/mekanism/common/TileEntityDynamicTank.java b/src/minecraft/mekanism/common/TileEntityDynamicTank.java
index e7cd54b12..c83a7d868 100644
--- a/src/minecraft/mekanism/common/TileEntityDynamicTank.java
+++ b/src/minecraft/mekanism/common/TileEntityDynamicTank.java
@@ -2,9 +2,7 @@ package mekanism.common;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import mekanism.api.Object3D;
 import mekanism.common.SynchronizedTankData.ValveData;
@@ -12,6 +10,7 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.AxisAlignedBB;
 import net.minecraftforge.common.ForgeDirection;
 import net.minecraftforge.liquids.LiquidContainerRegistry;
@@ -98,6 +97,16 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 			
 			if(!clientHasStructure || !isRendering)
 			{
+				for(ValveData data : valveViewing.keySet())
+				{
+					TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);
+					
+					if(tileEntity != null)
+					{
+						tileEntity.clientHasStructure = false;
+					}
+				}
+				
 				valveViewing.clear();
 			}
 		}
@@ -127,6 +136,12 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 				update();
 			}
 			
+			if(structure != null && isRendering && packetTick % 20 == 0)
+			{
+				sendStructure = true;
+				PacketHandler.sendTileEntityPacketToClients(this, 0, getNetworkedData(new ArrayList()));
+			}
+			
 			if(prevStructure != (structure != null))
 			{
 				if(structure != null && !structure.hasRenderer)
@@ -203,7 +218,7 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 								structure.liquidStored = null;
 							}
 							
-							PacketHandler.sendTileEntityPacketToClients(this, 50, getNetworkedData(new ArrayList()));
+							PacketHandler.sendTileEntityPacketToClients(this, 0, getNetworkedData(new ArrayList()));
 						}
 					}
 				}
@@ -262,7 +277,7 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 						}
 					}
 					
-					PacketHandler.sendTileEntityPacketToClients(this, 50, getNetworkedData(new ArrayList()));
+					PacketHandler.sendTileEntityPacketToClients(this, 0, getNetworkedData(new ArrayList()));
 				}
 			}
 		}
@@ -379,6 +394,13 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 				}
 				
 				valveViewing.put(data, viewingTicks);
+				
+				TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);
+				
+				if(tileEntity != null)
+				{
+					tileEntity.clientHasStructure = true;
+				}
 			}
 		}
 	}
@@ -393,7 +415,7 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock
 				
 				if(tileEntity != null && tileEntity.isRendering)
 				{
-					PacketHandler.sendTileEntityPacketToClients(tileEntity, 50, tileEntity.getNetworkedData(new ArrayList()));
+					PacketHandler.sendTileEntityPacketToClients(tileEntity, 0, tileEntity.getNetworkedData(new ArrayList()));
 				}
 			}
 		}
diff --git a/src/minecraft/mekanism/common/TileEntityEnrichmentChamber.java b/src/minecraft/mekanism/common/TileEntityEnrichmentChamber.java
index 19688d56c..310407820 100644
--- a/src/minecraft/mekanism/common/TileEntityEnrichmentChamber.java
+++ b/src/minecraft/mekanism/common/TileEntityEnrichmentChamber.java
@@ -16,4 +16,10 @@ public class TileEntityEnrichmentChamber extends TileEntityElectricMachine
 	{
 		return Recipe.ENRICHMENT_CHAMBER.get();
 	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 0.3F;
+	}
 }
diff --git a/src/minecraft/mekanism/common/TileEntityFactory.java b/src/minecraft/mekanism/common/TileEntityFactory.java
index f102ebae9..383931de9 100644
--- a/src/minecraft/mekanism/common/TileEntityFactory.java
+++ b/src/minecraft/mekanism/common/TileEntityFactory.java
@@ -777,4 +777,10 @@ public class TileEntityFactory extends TileEntityElectricBlock implements IEnerg
 	{
 		return RecipeType.values()[recipeType].getSound();
 	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 1;
+	}
 }
diff --git a/src/minecraft/mekanism/common/TileEntityMetallurgicInfuser.java b/src/minecraft/mekanism/common/TileEntityMetallurgicInfuser.java
index 5c2b8ee08..c7d7bcf84 100644
--- a/src/minecraft/mekanism/common/TileEntityMetallurgicInfuser.java
+++ b/src/minecraft/mekanism/common/TileEntityMetallurgicInfuser.java
@@ -650,4 +650,10 @@ public class TileEntityMetallurgicInfuser extends TileEntityElectricBlock implem
 	{
 		return "MetallurgicInfuser.ogg";
 	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 1;
+	}
 }
diff --git a/src/minecraft/mekanism/generators/client/GuiWindTurbine.java b/src/minecraft/mekanism/generators/client/GuiWindTurbine.java
index e05d90546..784e89669 100644
--- a/src/minecraft/mekanism/generators/client/GuiWindTurbine.java
+++ b/src/minecraft/mekanism/generators/client/GuiWindTurbine.java
@@ -34,7 +34,7 @@ public class GuiWindTurbine extends GuiContainer
         fontRenderer.drawString(tileEntity.fullName, 45, 6, 0x404040);
         fontRenderer.drawString("Inventory", 8, (ySize - 96) + 2, 0x404040);
         fontRenderer.drawString(ElectricityDisplay.getDisplayShort(tileEntity.electricityStored, ElectricUnit.JOULES), 51, 26, 0x00CD00);
-        fontRenderer.drawString("Power: " + tileEntity.GENERATION_RATE*tileEntity.getMultiplier(), 51, 35, 0x00CD00);
+        fontRenderer.drawString("Power: " + tileEntity.GENERATION_RATE*tileEntity.getVolumeMultiplier(), 51, 35, 0x00CD00);
         fontRenderer.drawString(tileEntity.getVoltage() + "v", 51, 44, 0x00CD00);
         
         int size = 44;
@@ -65,6 +65,6 @@ public class GuiWindTurbine extends GuiContainer
         displayInt = tileEntity.getScaledEnergyLevel(52);
         drawTexturedModalRect(guiWidth + 165, guiHeight + 17 + 52 - displayInt, 176, 52 - displayInt, 4, displayInt);
         
-        drawTexturedModalRect(guiWidth + 20, guiHeight + 37, 176, (tileEntity.getMultiplier() > 0 ? 52 : 64), 12, 12);
+        drawTexturedModalRect(guiWidth + 20, guiHeight + 37, 176, (tileEntity.getVolumeMultiplier() > 0 ? 52 : 64), 12, 12);
     }
 }
diff --git a/src/minecraft/mekanism/generators/common/TileEntityGenerator.java b/src/minecraft/mekanism/generators/common/TileEntityGenerator.java
index 2b7ed2dcf..cc698498d 100644
--- a/src/minecraft/mekanism/generators/common/TileEntityGenerator.java
+++ b/src/minecraft/mekanism/generators/common/TileEntityGenerator.java
@@ -77,10 +77,7 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem
 		
 		if(worldObj.isRemote)
 		{
-			if(!(this instanceof TileEntitySolarGenerator))
-			{
-				Mekanism.proxy.registerSound(this);
-			}
+			Mekanism.proxy.registerSound(this);
 		}
 		
 		if(!worldObj.isRemote)
@@ -349,6 +346,12 @@ public abstract class TileEntityGenerator extends TileEntityElectricBlock implem
 	@Override
 	public String getSoundPath()
 	{
-		return fullName.replace(" ", "").replace("-","") + ".ogg";
+		return fullName.replace(" ", "").replace("-","").replace("Advanced", "") + ".ogg";
+	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 1;
 	}
 }
diff --git a/src/minecraft/mekanism/generators/common/TileEntitySolarGenerator.java b/src/minecraft/mekanism/generators/common/TileEntitySolarGenerator.java
index 2ba71d7a5..afa20a1ef 100644
--- a/src/minecraft/mekanism/generators/common/TileEntitySolarGenerator.java
+++ b/src/minecraft/mekanism/generators/common/TileEntitySolarGenerator.java
@@ -4,9 +4,11 @@ import ic2.api.item.IElectricItem;
 
 import java.util.ArrayList;
 
+import mekanism.api.Object3D;
 import mekanism.common.ChargeUtils;
 import mekanism.generators.common.BlockGenerator.GeneratorType;
 import micdoodle8.mods.galacticraft.API.ISolarLevel;
+import net.minecraft.block.Block;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.common.ForgeDirection;
 import universalelectricity.core.item.IItemElectric;
@@ -43,6 +45,12 @@ public class TileEntitySolarGenerator extends TileEntityGenerator
 		return new int[] {0};
 	}
 	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 0.05F;
+	}
+	
 	@Override
 	public int getSizeInventorySide(ForgeDirection side)
 	{
@@ -72,15 +80,29 @@ public class TileEntitySolarGenerator extends TileEntityGenerator
 				seesSun = false;
 			}
 			
-			if(worldObj.getBlockId(xCoord, yCoord+1, zCoord) == MekanismGenerators.generatorID && worldObj.getBlockMetadata(xCoord, yCoord+1, zCoord) == GeneratorType.SOLAR_GENERATOR.meta)
+			for(int y = yCoord+1; y < 256; y++)
 			{
-				seesSun = false;
+				Object3D obj = new Object3D(xCoord, y, zCoord);
+				Block block = Block.blocksList[obj.getBlockId(worldObj)];
+				
+				if(block != null)
+				{
+					if(block.isOpaqueCube() || block.blockID == MekanismGenerators.generatorID && obj.getMetadata(worldObj) == GeneratorType.SOLAR_GENERATOR.meta)
+					{
+						seesSun = false;
+						break;
+					}
+				}
+			}
+			
+			if(canOperate())
+			{
+				setActive(true);
+				setEnergy(electricityStored + getEnvironmentBoost());
+			}
+			else {
+				setActive(false);
 			}
-		}
-		
-		if(canOperate())
-		{
-			setEnergy(electricityStored + getEnvironmentBoost());
 		}
 	}
 	
diff --git a/src/minecraft/mekanism/generators/common/TileEntityWindTurbine.java b/src/minecraft/mekanism/generators/common/TileEntityWindTurbine.java
index 4b636739e..9e688b7f0 100644
--- a/src/minecraft/mekanism/generators/common/TileEntityWindTurbine.java
+++ b/src/minecraft/mekanism/generators/common/TileEntityWindTurbine.java
@@ -47,6 +47,12 @@ public class TileEntityWindTurbine extends TileEntityGenerator implements IBound
 	{
 		return worldObj.canBlockSeeTheSky(xCoord, yCoord+4, zCoord) ? (((float)yCoord+4)/(float)256)*8 : 0;
 	}
+	
+	@Override
+	public float getVolumeMultiplier()
+	{
+		return 1.5F;
+	}
 
 	@Override
 	public String[] getMethodNames()