diff --git a/client/pizza_palace.py b/client/pizza_palace.py
index 25db1b42df5e30609a8265e7b3a128142b27c40b..f3ad1f2132e98e68b369c7da3debd2b7d38c7e14 100644
--- a/client/pizza_palace.py
+++ b/client/pizza_palace.py
@@ -1,46 +1,104 @@
-import json, requests
+import json, requests, logging
 from tkinter import messagebox, ttk
 from tkinter import *
 
 ## Init
 root = Tk()
 
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
 ## Global Variables
 connect_url = StringVar()
 
+cart_id = ""
+cart_key = ""
+
 ## Subroutines
 def get_endpoint(endpoint):
     return connect_url.get() + endpoint
 
-def submit(*args):
-    messagebox.showinfo("Not implemented", "Not just yet...")
+# Create frame
+def create_tab(title, padding="3 3 12 12", sticky=(N, W, E, S)):
+    frame = ttk.Frame(tab_control, padding=padding)
+    frame.grid(column=0, row=0, sticky=sticky)
+    frame.columnconfigure(0, weight=1)
+    frame.rowconfigure(0, weight=1)
+    tab_control.add(frame, text=title)
+    return frame
+
+# Configure grid for frame
+def configure_grid(frame):
+    for child in connect_frame.winfo_children():
+        child.grid_configure(padx=5, pady=5)
+
+# General connect fail function
+# Used when the server is unreachable or returns a non-200 response
+#  both in the initial connection attempt and in other screens
+#  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)
+    messagebox.showerror("Connection failed", "Could not connect to server")
+
+# Connection success fail function
+# Used when the server is reachable and all is ok
+#  in the initial connection attempt
+def connect_success():
+    logger.info("Successfully connected to " + connect_url.get())
+    connect_status_label.configure(text="Connected")
+    tab_control.select(order_frame)
+    messagebox.showinfo("OK!", "Successfully connected")
 
+# Connect function for the connect tab
 def connect(*args):
+    logger.info("Attempting to connect to " + connect_url.get())
     try:
-        res = requests.get(get_endpoint("/"))
-        if res.status_code == 200:
+        res = requests.get(get_endpoint("/status"))
+        if (res.status_code == 200):
             # Success
-            # TODO check for valid JSON response, possibly change to /status endpoint
-            messagebox.showinfo("OK!", "Successfully connected")
-            connect_status_label.configure(text="Connected")
-            # TODO focus on other tab
+            logger.debug("Got 200 response from server")
+            try:
+                res_json = json.loads(res.text)
+                if (res_json["status"] == 200 and res_json["message"] == "ok"):
+                    connect_success()
+                    return
+                else:
+                    logger.debug("Response from server did not contain OK")
+                    connect_fail()
+                    return
+            except:
+                logger.debug("Could not parse JSON response from server")
+                logger.debug(res.text)
+                connect_fail()
+                return
         else:
-            # Failure
-            # TODO failure message
-            pass
+            logger.debug("Got non-200 response from server")
+            connect_fail()
+            return
     except:
-        # Failure
-        # TODO failure message
-        pass
+        connect_fail()
+        return
+
+# Create new session
+def new_session(*arg):
+    
+    pass
+
+# Refresh order screen items
+def refresh_items(*args):
+    # TODO get /pizzas from server
+    pass
 
 ## Main program code
+# Window setup
 root.title("Pizza Palace")
 tab_control = ttk.Notebook(root)
 
-connect_frame = ttk.Frame(tab_control, padding="3 3 12 12")
-connect_frame.grid(column=0, row=0, sticky=(N, W, E, S))
-connect_frame.columnconfigure(0, weight=1)
-connect_frame.rowconfigure(0, weight=1)
+# Connect tab
+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)
@@ -54,15 +112,24 @@ 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))
 
-for child in connect_frame.winfo_children():
-    child.grid_configure(padx=5, pady=5)
+configure_grid(connect_frame)
 
 connect_submit_button.focus()
-connect_frame.bind("<Return>", submit)
+connect_frame.bind("<Return>", connect)
+
+# Order tab
+order_frame = create_tab("Order")
+# TODO order list
+
+# Cart tab
+cart_frame = create_tab("Cart")
+
+# Confirm tab
+confirm_frame = create_tab("Confirm")
 
-# TODO other tabs
 
-tab_control.add(connect_frame, text="Connect")
+# Pack
 tab_control.pack(expand=1, fill="both")
 
+# Main window loop
 root.mainloop()