diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java
new file mode 100644
index 0000000000..5c9a5b5d2d
--- /dev/null
+++ b/src/main/java/net/minecraft/server/EntitySilverfish.java
@@ -0,0 +1,128 @@
+package net.minecraft.server;
+
+public class EntitySilverfish extends EntityMonster {
+
+    private int a;
+
+    public EntitySilverfish(World world) {
+        super(world);
+        this.texture = "/mob/silverfish.png";
+        this.b(0.3F, 0.7F);
+        this.aU = 0.6F;
+        this.damage = 1; // CraftBukkit - 0 -> 1, temporary fix for Silverfish base damage.
+    }
+
+    protected boolean e_() {
+        return false;
+    }
+
+    protected Entity findTarget() {
+        double d0 = 8.0D;
+
+        return this.world.findNearbyPlayer(this, d0);
+    }
+
+    protected String h() {
+        return "mob.spider";
+    }
+
+    protected String i() {
+        return "mob.spider";
+    }
+
+    protected String j() {
+        return "mob.spiderdeath";
+    }
+
+    public boolean damageEntity(DamageSource damagesource, int i) {
+        if (this.a <= 0 && damagesource instanceof EntityDamageSource) {
+            this.a = 20;
+        }
+
+        return super.damageEntity(damagesource, i);
+    }
+
+    protected void a(Entity entity, float f) {
+        if (this.attackTicks <= 0 && f < 1.2F && entity.boundingBox.e > this.boundingBox.b && entity.boundingBox.b < this.boundingBox.e) {
+            this.attackTicks = 20;
+            entity.damageEntity(DamageSource.mobAttack(this), this.damage);
+        }
+    }
+
+    public void b(NBTTagCompound nbttagcompound) {
+        super.b(nbttagcompound);
+    }
+
+    public void a(NBTTagCompound nbttagcompound) {
+        super.a(nbttagcompound);
+    }
+
+    protected int k() {
+        return 0;
+    }
+
+    public void s_() {
+        this.U = this.yaw;
+        super.s_();
+    }
+
+    protected void c_() {
+        super.c_();
+        if (!this.world.isStatic) {
+            int i;
+            int j;
+            int k;
+            int l;
+
+            if (this.a > 0) {
+                --this.a;
+                if (this.a == 0) {
+                    i = MathHelper.floor(this.locX);
+                    j = MathHelper.floor(this.locY);
+                    k = MathHelper.floor(this.locZ);
+                    boolean flag = false;
+
+                    for (l = 0; !flag && l <= 5 && l >= -5; l = l <= 0 ? 1 - l : 0 - l) {
+                        for (int i1 = 0; !flag && i1 <= 10 && i1 >= -10; i1 = i1 <= 0 ? 1 - i1 : 0 - i1) {
+                            for (int j1 = 0; !flag && j1 <= 10 && j1 >= -10; j1 = j1 <= 0 ? 1 - j1 : 0 - j1) {
+                                int k1 = this.world.getTypeId(i + i1, j + l, k + j1);
+
+                                if (k1 == Block.MONSTER_EGGS.id) {
+                                    this.world.e(2001, i + i1, j + l, k + j1, Block.MONSTER_EGGS.id + this.world.getData(i + i1, j + l, k + j1) * 256);
+                                    this.world.setTypeId(i + i1, j + l, k + j1, 0);
+                                    Block.MONSTER_EGGS.postBreak(this.world, i + i1, j + l, k + j1, 0);
+                                    if (this.random.nextBoolean()) {
+                                        flag = true;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (this.target == null && !this.B()) {
+                i = MathHelper.floor(this.locX);
+                j = MathHelper.floor(this.locY + 0.5D);
+                k = MathHelper.floor(this.locZ);
+                int l1 = this.random.nextInt(6);
+
+                l = this.world.getTypeId(i + PistonBlockTextures.b[l1], j + PistonBlockTextures.c[l1], k + PistonBlockTextures.d[l1]);
+                if (BlockMonsterEggs.c(l)) {
+                    this.world.setTypeIdAndData(i + PistonBlockTextures.b[l1], j + PistonBlockTextures.c[l1], k + PistonBlockTextures.d[l1], Block.MONSTER_EGGS.id, BlockMonsterEggs.d(l));
+                    this.ab();
+                    this.die();
+                } else {
+                    this.A();
+                }
+            } else if (this.target != null && !this.B()) {
+                this.target = null;
+            }
+        }
+    }
+
+    protected float a(int i, int j, int k) {
+        return this.world.getTypeId(i, j - 1, k) == Block.STONE.id ? 10.0F : super.a(i, j, k);
+    }
+}