diff --git a/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java b/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a3a3c78926200f9e65ad8007296b08030160a0c
--- /dev/null
+++ b/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java
@@ -0,0 +1,33 @@
+package pizzeria.ingredients;
+
+public class ChicagoPizzaIngredientFactory 
+	implements PizzaIngredientFactory 
+{
+
+	public Dough createDough() {
+		return new ThickCrustDough();
+	}
+
+	public Sauce createSauce() {
+		return new PlumTomatoSauce();
+	}
+
+	public Cheese createCheese() {
+		return new MozzarellaCheese();
+	}
+
+	public Veggies[] createVeggies() {
+		Veggies veggies[] = { new BlackOlives(), 
+		                      new Spinach(), 
+		                      new Eggplant() };
+		return veggies;
+	}
+
+	public Pepperoni createPepperoni() {
+		return new SlicedPepperoni();
+	}
+
+	public Clams createClam() {
+		return new FrozenClams();
+	}
+}
diff --git a/src/pizzeria/ingredients/NYPizzaIngredientFactory.java b/src/pizzeria/ingredients/NYPizzaIngredientFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e1e8fc25686759624b3597f91162ea700c8fe8e
--- /dev/null
+++ b/src/pizzeria/ingredients/NYPizzaIngredientFactory.java
@@ -0,0 +1,29 @@
+package pizzeria.ingredients;
+
+public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
+ 
+	public Dough createDough() {
+		return new ThinCrustDough();
+	}
+ 
+	public Sauce createSauce() {
+		return new MarinaraSauce();
+	}
+ 
+	public Cheese createCheese() {
+		return new ReggianoCheese();
+	}
+ 
+	public Veggies[] createVeggies() {
+		Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
+		return veggies;
+	}
+ 
+	public Pepperoni createPepperoni() {
+		return new SlicedPepperoni();
+	}
+
+	public Clams createClam() {
+		return new FreshClams();
+	}
+}
diff --git a/src/pizzeria/ingredients/PizzaIngredientFactory.java b/src/pizzeria/ingredients/PizzaIngredientFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1240c16e0dd2aa5723498a9415fc12a15d854ee
--- /dev/null
+++ b/src/pizzeria/ingredients/PizzaIngredientFactory.java
@@ -0,0 +1,12 @@
+package pizzeria.ingredients;
+
+public interface PizzaIngredientFactory {
+ 
+	public Dough createDough();
+	public Sauce createSauce();
+	public Cheese createCheese();
+	public Veggies[] createVeggies();
+	public Pepperoni createPepperoni();
+	public Clams createClam();
+ 
+}
diff --git a/src/pizzeria/pizza/CheesePizza.java b/src/pizzeria/pizza/CheesePizza.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d2bd8fffedd606c4a00bf33e7a14b31261c7253
--- /dev/null
+++ b/src/pizzeria/pizza/CheesePizza.java
@@ -0,0 +1,17 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class CheesePizza extends Pizza {
+ 
+	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+	}
+}
diff --git a/src/pizzeria/pizza/ChicagoStyleCheesePizza.java b/src/pizzeria/pizza/ChicagoStyleCheesePizza.java
deleted file mode 100644
index c37121ca49b2d12575e045b1a07ef4883620067c..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/ChicagoStyleCheesePizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleCheesePizza extends Pizza {
-
-	public ChicagoStyleCheesePizza() { 
-		name = "Chicago Style Deep Dish Cheese Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStyleClamPizza.java b/src/pizzeria/pizza/ChicagoStyleClamPizza.java
deleted file mode 100644
index c5bae9661bb8c43b51b35ef38663724afabf6e42..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/ChicagoStyleClamPizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleClamPizza extends Pizza {
-	public ChicagoStyleClamPizza() {
-		name = "Chicago Style Clam Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Frozen Clams from Chesapeake Bay");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java b/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java
deleted file mode 100644
index ae37b1f5dac81aa072440510223015b387141680..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStylePepperoniPizza extends Pizza {
-	public ChicagoStylePepperoniPizza() {
-		name = "Chicago Style Pepperoni Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Black Olives");
-		toppings.add("Spinach");
-		toppings.add("Eggplant");
-		toppings.add("Sliced Pepperoni");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java b/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java
deleted file mode 100644
index 546b1688bf40591c46782802746c5ae45ec4f27d..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleVeggiePizza extends Pizza {
-	public ChicagoStyleVeggiePizza() {
-		name = "Chicago Deep Dish Veggie Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Black Olives");
-		toppings.add("Spinach");
-		toppings.add("Eggplant");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ClamPizza.java b/src/pizzeria/pizza/ClamPizza.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ab93ea334f907e9ee6f1a3c6ef2e8854d5fd0f1
--- /dev/null
+++ b/src/pizzeria/pizza/ClamPizza.java
@@ -0,0 +1,18 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class ClamPizza extends Pizza {
+ 
+	public ClamPizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+		clam = ingredientFactory.createClam();
+	}
+}
diff --git a/src/pizzeria/pizza/NYStyleCheesePizza.java b/src/pizzeria/pizza/NYStyleCheesePizza.java
deleted file mode 100644
index ac5055d672f008a25675b3d6ed2dbe10cfdfa11f..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/NYStyleCheesePizza.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleCheesePizza extends Pizza {
-
-	public NYStyleCheesePizza() { 
-		name = "NY Style Sauce and Cheese Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStyleClamPizza.java b/src/pizzeria/pizza/NYStyleClamPizza.java
deleted file mode 100644
index b6635b049990cbf728718dc73020e4ab2af40031..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/NYStyleClamPizza.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleClamPizza extends Pizza {
-
-	public NYStyleClamPizza() {
-		name = "NY Style Clam Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Fresh Clams from Long Island Sound");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStylePepperoniPizza.java b/src/pizzeria/pizza/NYStylePepperoniPizza.java
deleted file mode 100644
index f036f6813cb76c16df31b40cee8cefda6d14522d..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/NYStylePepperoniPizza.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStylePepperoniPizza extends Pizza {
-
-	public NYStylePepperoniPizza() {
-		name = "NY Style Pepperoni Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Sliced Pepperoni");
-		toppings.add("Garlic");
-		toppings.add("Onion");
-		toppings.add("Mushrooms");
-		toppings.add("Red Pepper");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStyleVeggiePizza.java b/src/pizzeria/pizza/NYStyleVeggiePizza.java
deleted file mode 100644
index e3d5247ab4104f2b4efde93b248872fc5342d0c2..0000000000000000000000000000000000000000
--- a/src/pizzeria/pizza/NYStyleVeggiePizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleVeggiePizza extends Pizza {
-
-	public NYStyleVeggiePizza() {
-		name = "NY Style Veggie Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Garlic");
-		toppings.add("Onion");
-		toppings.add("Mushrooms");
-		toppings.add("Red Pepper");
-	}
-}
diff --git a/src/pizzeria/ingredients/PepperoniPizza.java b/src/pizzeria/pizza/PepperoniPizza.java
similarity index 81%
rename from src/pizzeria/ingredients/PepperoniPizza.java
rename to src/pizzeria/pizza/PepperoniPizza.java
index 9345487cefee2590b91409284901679e7265fbd9..aace5f558a91f7c4484cb107bd442548f93f36e6 100644
--- a/src/pizzeria/ingredients/PepperoniPizza.java
+++ b/src/pizzeria/pizza/PepperoniPizza.java
@@ -1,4 +1,6 @@
-package pizzeria.ingredients;
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
 
 public class PepperoniPizza extends Pizza {
  
@@ -6,7 +8,7 @@ public class PepperoniPizza extends Pizza {
 		this.ingredientFactory = ingredientFactory;
 	}
  
-	void prepare() {
+	public void prepare() {
 		System.out.println("Preparing " + name);
 		dough = ingredientFactory.createDough();
 		sauce = ingredientFactory.createSauce();
diff --git a/src/pizzeria/pizza/Pizza.java b/src/pizzeria/pizza/Pizza.java
index 191fc04ede4cf637bce0cf41d31c6f17b220269e..e23062acb1de101ea994aef794cfbd18d1612f57 100644
--- a/src/pizzeria/pizza/Pizza.java
+++ b/src/pizzeria/pizza/Pizza.java
@@ -1,50 +1,73 @@
 package pizzeria.pizza;
 
-import java.util.ArrayList;
+import pizzeria.ingredients.PizzaIngredientFactory;
+import pizzeria.ingredients.*;
 
 public abstract class Pizza {
+	PizzaIngredientFactory ingredientFactory;
 	String name;
-	String dough;
-	String sauce;
-	ArrayList<String> toppings = new ArrayList<String>();
- 
-	public void prepare() {
-		System.out.println("Preparing " + name);
-		System.out.println("Tossing dough...");
-		System.out.println("Adding sauce...");
-		System.out.println("Adding toppings: ");
-		for (int i = 0; i < toppings.size(); i++) {
-			System.out.println("   " + toppings.get(i));
-		}
-	}
-  
+
+	Dough dough;
+	Sauce sauce;
+	Veggies veggies[];
+	Cheese cheese;
+	Pepperoni pepperoni;
+	Clams clam;
+
+	public abstract void prepare();
+
 	public void bake() {
 		System.out.println("Bake for 25 minutes at 350");
 	}
- 
+
 	public void cut() {
 		System.out.println("Cutting the pizza into diagonal slices");
 	}
-  
+
 	public void box() {
 		System.out.println("Place pizza in official PizzaStore box");
 	}
- 
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
 	public String getName() {
 		return name;
 	}
 
 	public String toString() {
-		StringBuffer display = new StringBuffer();
-		display.append("---- " + name + " ----\n");
-		display.append(dough + "\n");
-		display.append(sauce + "\n");
-		for (int i = 0; i < toppings.size(); i++) {
-			display.append((String )toppings.get(i) + "\n");
+		StringBuffer result = new StringBuffer();
+		result.append("---- " + name + " ----\n");
+		if (dough != null) {
+			result.append(dough);
+			result.append("\n");
+		}
+		if (sauce != null) {
+			result.append(sauce);
+			result.append("\n");
+		}
+		if (cheese != null) {
+			result.append(cheese);
+			result.append("\n");
 		}
-		return display.toString();
+		if (veggies != null) {
+			for (int i = 0; i < veggies.length; i++) {
+				result.append(veggies[i]);
+				if (i < veggies.length-1) {
+					result.append(", ");
+				}
+			}
+			result.append("\n");
+		}
+		if (clam != null) {
+			result.append(clam);
+			result.append("\n");
+		}
+		if (pepperoni != null) {
+			result.append(pepperoni);
+			result.append("\n");
+		}
+		return result.toString();
 	}
 }
-
- 
- 
diff --git a/src/pizzeria/pizza/VeggiePizza.java b/src/pizzeria/pizza/VeggiePizza.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf65a936b0b13ff91b72e22350f9cfe4f4bfff33
--- /dev/null
+++ b/src/pizzeria/pizza/VeggiePizza.java
@@ -0,0 +1,18 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class VeggiePizza extends Pizza {
+ 
+	public VeggiePizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+		veggies = ingredientFactory.createVeggies();
+	}
+}
diff --git a/src/pizzeria/store/ChicagoPizzaStore.java b/src/pizzeria/store/ChicagoPizzaStore.java
index b3518a91b6cac78aa29f3564238b9a772c5ad1fc..6b1a7e639d371e01a618e69c5106891eef919116 100644
--- a/src/pizzeria/store/ChicagoPizzaStore.java
+++ b/src/pizzeria/store/ChicagoPizzaStore.java
@@ -1,18 +1,37 @@
 package pizzeria.store;
 
+import pizzeria.ingredients.ChicagoPizzaIngredientFactory;
+import pizzeria.ingredients.PizzaIngredientFactory;
 import pizzeria.pizza.*;
 
 public class ChicagoPizzaStore extends PizzaStore {
 
-	Pizza createPizza(String item) {
-        	if (item.equals("cheese")) {
-            		return new ChicagoStyleCheesePizza();
-        	} else if (item.equals("veggie")) {
-        	    	return new ChicagoStyleVeggiePizza();
-        	} else if (item.equals("clam")) {
-        	    	return new ChicagoStyleClamPizza();
-        	} else if (item.equals("pepperoni")) {
-            		return new ChicagoStylePepperoniPizza();
-        	} else return null;
+	protected Pizza createPizza(String item) {
+		Pizza pizza = null;
+		PizzaIngredientFactory ingredientFactory =
+		new ChicagoPizzaIngredientFactory();
+
+		if (item.equals("cheese")) {
+
+			pizza = new CheesePizza(ingredientFactory);
+			pizza.setName("Chicago Style Cheese Pizza");
+
+		} else if (item.equals("veggie")) {
+
+			pizza = new VeggiePizza(ingredientFactory);
+			pizza.setName("Chicago Style Veggie Pizza");
+
+		} else if (item.equals("clam")) {
+
+			pizza = new ClamPizza(ingredientFactory);
+			pizza.setName("Chicago Style Clam Pizza");
+
+		} else if (item.equals("pepperoni")) {
+
+			pizza = new PepperoniPizza(ingredientFactory);
+			pizza.setName("Chicago Style Pepperoni Pizza");
+
+		}
+		return pizza;
 	}
 }
diff --git a/src/pizzeria/store/NYPizzaStore.java b/src/pizzeria/store/NYPizzaStore.java
index 301ffcb1dd85e5cfd683a9aaefd951c97925a036..f20a415fcf1f17449f715592aa630543c25d56e4 100644
--- a/src/pizzeria/store/NYPizzaStore.java
+++ b/src/pizzeria/store/NYPizzaStore.java
@@ -1,19 +1,37 @@
 package pizzeria.store;
 
+import pizzeria.ingredients.NYPizzaIngredientFactory;
+import pizzeria.ingredients.PizzaIngredientFactory;
 import pizzeria.pizza.*;
 
 public class NYPizzaStore extends PizzaStore {
-
-	Pizza createPizza(String item) {
+ 
+	protected Pizza createPizza(String item) {
+		Pizza pizza = null;
+		PizzaIngredientFactory ingredientFactory =
+			new NYPizzaIngredientFactory();
+ 
 		if (item.equals("cheese")) {
-			return new NYStyleCheesePizza();
+  
+			pizza = new CheesePizza(ingredientFactory);
+			pizza.setName("New York Style Cheese Pizza");
+  
 		} else if (item.equals("veggie")) {
-			return new NYStyleVeggiePizza();
+ 
+			pizza = new VeggiePizza(ingredientFactory);
+			pizza.setName("New York Style Veggie Pizza");
+ 
 		} else if (item.equals("clam")) {
-			return new NYStyleClamPizza();
+ 
+			pizza = new ClamPizza(ingredientFactory);
+			pizza.setName("New York Style Clam Pizza");
+ 
 		} else if (item.equals("pepperoni")) {
-			return new NYStylePepperoniPizza();
-		} else return null;
+
+			pizza = new PepperoniPizza(ingredientFactory);
+			pizza.setName("New York Style Pepperoni Pizza");
+ 
+		} 
+		return pizza;
 	}
-	
 }
diff --git a/src/pizzeria/store/PizzaStore.java b/src/pizzeria/store/PizzaStore.java
index c6833293e0798421f275c548a5a2bafe2c68d708..9fbd59435cb05260970b01b3f08aa00c41d457d3 100644
--- a/src/pizzeria/store/PizzaStore.java
+++ b/src/pizzeria/store/PizzaStore.java
@@ -4,9 +4,9 @@ import pizzeria.pizza.Pizza;
 
 public abstract class PizzaStore {
  
-	abstract Pizza createPizza(String item);
+	protected abstract Pizza createPizza(String item);
  
-	public final Pizza orderPizza(String type) {
+	public Pizza orderPizza(String type) {
 		Pizza pizza = createPizza(type);
 		System.out.println("--- Making a " + pizza.getName() + " ---");
 		pizza.prepare();