diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
index 537a479ad5..7342179d6b 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
@@ -16,6 +16,7 @@ import net.minecraft.server.TileEntityBrewingStand;
 import net.minecraft.server.TileEntityDispenser;
 import net.minecraft.server.TileEntityFurnace;
 
+import org.apache.commons.lang.Validate;
 import org.bukkit.entity.HumanEntity;
 import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.inventory.Inventory;
@@ -88,6 +89,7 @@ public class CraftInventory implements Inventory {
     }
 
     public boolean contains(Material material) {
+        Validate.notNull(material, "Material cannot be null");
         return contains(material.getId());
     }
 
@@ -104,16 +106,21 @@ public class CraftInventory implements Inventory {
     }
 
     public boolean contains(int materialId, int amount) {
-        int amt = 0;
+        if (amount <= 0) {
+            return true;
+        }
         for (ItemStack item : getContents()) {
             if (item != null && item.getTypeId() == materialId) {
-                amt += item.getAmount();
+                if ((amount -= item.getAmount()) <= 0) {
+                    return true;
+                }
             }
         }
-        return amt >= amount;
+        return false;
     }
 
     public boolean contains(Material material, int amount) {
+        Validate.notNull(material, "Material cannot be null");
         return contains(material.getId(), amount);
     }
 
@@ -121,13 +128,30 @@ public class CraftInventory implements Inventory {
         if (item == null) {
             return false;
         }
-        int amt = 0;
+        if (amount <= 0) {
+            return true;
+        }
         for (ItemStack i : getContents()) {
-            if (item.equals(i)) {
-                amt += item.getAmount();
+            if (item.equals(i) && --amount <= 0) {
+                return true;
             }
         }
-        return amt >= amount;
+        return false;
+    }
+
+    public boolean containsAtLeast(ItemStack item, int amount) {
+        if (item == null) {
+            return false;
+        }
+        if (amount <= 0) {
+            return true;
+        }
+        for (ItemStack i : getContents()) {
+            if (i != null && item.getTypeId() == i.getTypeId() && item.getDurability() == i.getDurability() && item.getEnchantments().equals(i.getEnchantments()) && (amount -= i.getAmount()) <= 0) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public HashMap<Integer, ItemStack> all(int materialId) {
@@ -144,6 +168,7 @@ public class CraftInventory implements Inventory {
     }
 
     public HashMap<Integer, ItemStack> all(Material material) {
+        Validate.notNull(material, "Material cannot be null");
         return all(material.getId());
     }
 
@@ -172,6 +197,7 @@ public class CraftInventory implements Inventory {
     }
 
     public int first(Material material) {
+        Validate.notNull(material, "Material cannot be null");
         return first(material.getId());
     }
 
@@ -179,7 +205,7 @@ public class CraftInventory implements Inventory {
         return first(item, true);
     }
 
-    public int first(ItemStack item, boolean withAmount) {
+    private int first(ItemStack item, boolean withAmount) {
         if (item == null) {
             return -1;
         }
@@ -224,10 +250,11 @@ public class CraftInventory implements Inventory {
     }
 
     public int firstPartial(Material material) {
+        Validate.notNull(material, "Material cannot be null");
         return firstPartial(material.getId());
     }
 
-    public int firstPartial(ItemStack item) {
+    private int firstPartial(ItemStack item) {
         ItemStack[] inventory = getContents();
         ItemStack filteredItem = CraftItemStack.asCraftCopy(item);
         if (item == null) {
@@ -243,6 +270,7 @@ public class CraftInventory implements Inventory {
     }
 
     public HashMap<Integer, ItemStack> addItem(ItemStack... items) {
+        Validate.noNullElements(items, "Item cannot be null");
         HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
 
         /* TODO: some optimization
@@ -302,6 +330,7 @@ public class CraftInventory implements Inventory {
     }
 
     public HashMap<Integer, ItemStack> removeItem(ItemStack... items) {
+        Validate.notNull(items, "Items cannot be null");
         HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
 
         // TODO: optimization
@@ -357,6 +386,7 @@ public class CraftInventory implements Inventory {
     }
 
     public void remove(Material material) {
+        Validate.notNull(material, "Material cannot be null");
         remove(material.getId());
     }