diff --git a/client/pizza_palace.py b/client/pizza_palace.py
index 7727120ed98107d6b29f36126ffa0d5a81f3e45e..c593f955e06e2c5f38541de53b611a20d54e25a3 100644
--- a/client/pizza_palace.py
+++ b/client/pizza_palace.py
@@ -2,6 +2,9 @@ import json, requests, logging
 from tkinter import messagebox, ttk
 from tkinter import *
 
+## Server URL
+server_url = "http://localhost:5000"
+
 ## Init
 root = Tk()
 
@@ -23,6 +26,14 @@ orderpage_items = []
 def get_endpoint(endpoint):
     return connect_url.get() + endpoint
 
+def validate_int(input):
+    try:
+        unused = int(input)
+        return True
+    except:
+        return False
+validate_int_command = (root.register(validate_int), "%P")
+
 # Create frame
 def create_tab(title, padding="3 3 12 12", sticky=(N, W, E, S)):
     frame = ttk.Frame(tab_control, padding=padding)
@@ -34,7 +45,7 @@ def create_tab(title, padding="3 3 12 12", sticky=(N, W, E, S)):
 
 # Configure grid for frame
 def configure_grid(frame):
-    for child in connect_frame.winfo_children():
+    for child in frame.winfo_children():
         child.grid_configure(padx=5, pady=5)
 
 # General connect fail function
@@ -43,15 +54,15 @@ def configure_grid(frame):
 #  where a server request is made
 def connect_fail():
     logger.error("Connection Failed")
-    connect_status_label.configure(text="Connection failed")
-    tab_control.select(connect_frame)
+    #connect_status_label.configure(text="Connection failed")
+    #tab_control.select(connect_frame)
     messagebox.showerror("Connection failed", "Could not connect to server")
 
 # Request session fail function
 def request_session_fail():
     logger.error("Request session failed")
-    connect_status_label.configure(text="Request session failed")
-    tab_control.select(connect_frame)
+    #connect_status_label.configure(text="Request session failed")
+    #tab_control.select(connect_frame)
     messagebox.showerror("Request session failed", "Could not request session")
 
 # Connection success function
@@ -59,7 +70,7 @@ def request_session_fail():
 #  in the initial connection attempt
 def connect_success():
     logger.info("Successfully connected to " + connect_url.get())
-    connect_status_label.configure(text="Connected")
+    #connect_status_label.configure(text="Connected")
     tab_control.select(order_frame)
     messagebox.showinfo("OK!", "Successfully connected")
 
@@ -77,6 +88,7 @@ def connect(*args):
                     # Request session
                     logger.debug("Got OK response from server")
                     if (new_session()):
+                        refresh_order_items()
                         connect_success()
                         return
                     request_session_fail()
@@ -124,43 +136,64 @@ def refresh_items():
         return False
 
 def order_item(item, people, stuffed_crust):
-    pass
+    item_dict = {}
+    for pizza in pizzas:
+        if pizza["id"] == item:
+            item_dict = pizza
+            break
+    if item_dict == {}:
+        messagebox.showerror("Error", "Could not find pizza")
+        return
+    res = requests.post(get_endpoint("/cart/add"), json={"cart_id": cart_id, "cart_key": cart_key, "pizza_id": item, "people": people, "stuffed_crust": stuffed_crust})
+    if (res.status_code == 200):
+        res_json = res.json()
+        if (res_json != None and res_json["status"] == 200):
+            messagebox.showinfo("OK!", "Successfully added to cart")
+        else:
+            connect_fail()
+    else:
+        connect_fail()
 
 class OrderItem():
-    def __init__(self, pizza_dict, col):
-        self.id = pizza_dict.id
-        self.col = col
-        self.label1 = ttk.Label(order_frame, text=pizza_dict.name)
-        self.label1.grid(column=col, row=1, sticky=(W, E))
-        self.label2 = ttk.Label(order_frame, text="£%.2f" % pizza_dict.costpp)
-        self.label2.grid(column=col, row=2, sticky=(W, E))
-        # TODO number of people
-        self.quantity = IntVar(value=1)
-        # self.quant_entry = ttk.Spinbox(order_frame, from=1, to=99)
-        # TODO stuffed crust
-        self.stuffed_crust = BooleanVar()
+    def __init__(self, pizza_dict, row):
+        global order_frame
+        print(pizza_dict)
+        self.id = pizza_dict["id"]
+        self.row = row
+        self.label1 = ttk.Label(order_frame, text=pizza_dict["name"])
+        self.label1.grid(column=1, row=row, sticky=(W, E))
+        self.label2 = ttk.Label(order_frame, text="£%.2f" % pizza_dict["cost_pp"])
+        self.label2.grid(column=2, row=row, sticky=(W, E))
+        self.quantity = StringVar(value=1)
+        self.quant_entry = ttk.Spinbox(order_frame, from_=1, to=99, textvariable=self.quantity, validate="focusout", validatecommand=validate_int_command)
+        self.quant_entry.grid(column=3, row=row, sticky=(W, E))
+        self.stuffed_crust = BooleanVar(value=False)
+        self.stuffed_entry = ttk.Checkbutton(order_frame, variable=self.stuffed_crust)
+        self.stuffed_entry.grid(column=4, row=row, sticky=(W, E))
         self.order_butt = ttk.Button(order_frame, text="Order", command=self.order)
-        self.order_butt.grid(column=col, row=4, sticky=(W, E))
+        self.order_butt.grid(column=5, row=row, sticky=(W, E))
+    def destroy(self):
+        self.label1.destroy()
+        self.label2.destroy()
+        self.quant_entry.destroy()
+        self.stuffed_entry.destroy()
+        self.order_butt.destroy()
     def order(self):
-        order_item(self.id, self.quantity.get(), self.stuffed_crust.get())
+        if (validate_int(self.quantity.get())):
+            order_item(self.id, int(self.quantity.get()), self.stuffed_crust.get())
 
 def refresh_order_items(*args):
     global order_frame
     if(refresh_items()):
         # Remove all items
         for op_item in orderpage_items:
-            for op_childitem in op_item:
-                op_childitem.destroy()
-                del op_childitem
+            op_item.destroy()
             del op_item
-        col = 1
+        row = 2
         for pizza in pizzas:
-            piz_label1 = ttk.Label(order_frame, text=pizza.name)
-            piz_label1.grid(column=col, row=1, sticky=(W, E))
-            piz_label2 = ttk.Label(order_frame, text="£%.2f" % pizza.costpp)
-            piz_label2.grid(column=col, row=2, sticky=(W, E))
-            piz_orderbutton = ttk.Button(order_frame, text="Order", command=lambda: order_item())
-
+            orderpage_items.append(OrderItem(pizza, row))
+            row += 1
+    configure_grid(order_frame)
 
 ## Main program code
 # Window setup
@@ -168,28 +201,41 @@ root.title("Pizza Palace")
 tab_control = ttk.Notebook(root)
 
 # Connect tab
-connect_frame = create_tab("Connect")
+#connect_frame = create_tab("Connect")
+
+#connect_url_label = ttk.Label(connect_frame, text="Server URL:")
+#connect_url_field = ttk.Entry(connect_frame, width=20, textvariable=connect_url)
+#connect_url_label.grid(column=1, row=1, sticky=(W, E))
+#connect_url_field.grid(column=2, row=1, sticky=(W, E))
+#connect_url.set("http://localhost:5000")
 
-connect_url_label = ttk.Label(connect_frame, text="Server URL:")
-connect_url_field = ttk.Entry(connect_frame, width=20, textvariable=connect_url)
-connect_url_label.grid(column=1, row=1, sticky=(W, E))
-connect_url_field.grid(column=2, row=1, sticky=(W, E))
-connect_url.set("http://localhost:5000")
+connect_url.set(server_url)
 
-connect_status_label = ttk.Label(connect_frame, text="Not connected")
-connect_status_label.grid(column=1, row=2, sticky=(W, E))
+#connect_status_label = ttk.Label(connect_frame, text="Not connected")
+#connect_status_label.grid(column=1, row=2, sticky=(W, E))
 
-connect_submit_button = ttk.Button(connect_frame, text="Go!", command=connect)
-connect_submit_button.grid(column=1, row=3, sticky=(W, E))
+#connect_submit_button = ttk.Button(connect_frame, text="Go!", command=connect)
+#connect_submit_button.grid(column=1, row=3, sticky=(W, E))
 
-configure_grid(connect_frame)
+#configure_grid(connect_frame)
 
-connect_submit_button.focus()
-connect_frame.bind("<Return>", connect)
+#connect_submit_button.focus()
+#connect_frame.bind("<Return>", connect)
 
 # Order tab
 order_frame = create_tab("Order")
-refresh_order_items()
+order_label_1 = ttk.Label(order_frame, text="Name")
+order_label_1.grid(column=1, row=1, sticky=(W, E))
+order_label_2 = ttk.Label(order_frame, text="Cost")
+order_label_2.grid(column=2, row=1, sticky=(W, E))
+order_label_3 = ttk.Label(order_frame, text="Number of People")
+order_label_3.grid(column=3, row=1, sticky=(W, E))
+order_label_4 = ttk.Label(order_frame, text="Stuffed Crust?")
+order_label_4.grid(column=4, row=1, sticky=(W, E))
+order_label_5 = ttk.Label(order_frame, text="Order")
+order_label_5.grid(column=5, row=1, sticky=(W, E))
+
+configure_grid(order_frame)
 
 # Cart tab
 cart_frame = create_tab("Cart")
@@ -197,9 +243,11 @@ cart_frame = create_tab("Cart")
 # Confirm tab
 confirm_frame = create_tab("Confirm")
 
-
 # Pack
 tab_control.pack(expand=1, fill="both")
 
+# Connect
+connect()
+
 # Main window loop
-root.mainloop()
+root.mainloop()
\ No newline at end of file