diff --git a/.$FlightmanERD.drawio.bkp b/.$FlightmanERD.drawio.bkp
new file mode 100644
index 0000000..5c51d9b
--- /dev/null
+++ b/.$FlightmanERD.drawio.bkp
@@ -0,0 +1 @@
+7V1rc+MoFv01rtr9kC69LX9MMp3pqknPdvVjZ+ZTClvE1ka2PBLuJPPrFyQh2QHHwhLWA6pS3RbWy5zD4XLvBSb27frl1wRsV5/jAEYTywheJvYvE8uyPcPF/5GS17zENG0vL1kmYVCUVQXfwn9gUWgUpbswgOnBiSiOIxRuDwsX8WYDF+igDCRJ/Hx42mMcHT51C5aQKfi2ABFb+kcYoFVe6rtGVf4JhssVfbJpFN+sAT25KEhXIIifD4rgC7qLN6h4xS8wWYMN3CD8zWeQPMFk4n5cIUR+6fXEusN/j+TsD8s4XkYQbMP0wyJe4+JFik+5ewTrMCL1vHejm+JG+HH2x4l9m8Qxyj+tX25hRMCiMOTvdHfk27IeEnLfGhfMX/76jpwdelh8+fH95fnXT+vfH68K7H+CaFfUb1E36JVW+PMqRPDbFizI8TNm1cS+WaF1hI9M/DGJd5sAkmcY+Ch9gmixKg4ewyj6VtwI7FBcFN3GUZzgok28wd/cbGESriGCCXlGuFkW901REj9Beu4EU3fhw/lj+Q0F38YlxY+ACYIvR2vHLOscNw4Y40cmr/iU4oKrqVNwoGgYHuXEc8WyKeXSao9hLqUeKGizLG9eoYE/FIAIgOMOB5y57zquIQsct3fQOMOBJvDmnutdCBqnLjKOLGTs4SDjW3Pbk4YMo2gXxeb26ufr/ZOBNp+e7f+iz5+XX6bzK4vB5iaOn0gNvYUI981b8hGBOSnCNQQSVBgjNkECmxcIhBuYFJW7iKMIbNMwOz0vWYVRcA9e4x2iN6JHGLQXGHzNbZEc8ud7fLOUwoxvTmEmX4MoXG7w5wWuevLEmwSm+F3uQYoYzpglegxUHECPoleaLdRO42ie5XPQKw211tGr0bIobPinoxBEX7EBCDbLDMFDgEgtB0m8/Q6SJURFwTYOSf1+/AlzE8w40rzIadmPc2/wH/65t8YHd+LiF7jFx2Z1jP/I6Qm6jTe4jWG+kEdBDNszJNDdoHhbPCeCj/Q1kqIyyed5jBC26I7B+i7LT2NdYGvXhNaWhSzbm335Dd/o7jcRgGP8gx+jzKBehUEAN3krJYMAUIHOwZMLQlnxbxF52zZrgmLXBmUPBVcQhOJmVa0I3w1EuAFsAII3RFBSBtnyPc8Hm7UqdylMHvA1t9bk2giz4c7v//lO/v1xfz8ph0t9YgFV5PzcmzTvaO/zK703NHFl0OSN/bPfdu1WaVPrdu3yJvrTcP6xVq9Bcr363Umjr5+cv69Ms8ZgUXcA53QA3gU7gCPYTrldQO/a/Wn1P8FdpfT/SF34DNbz3AxXrxNozBYFu4GZ7gbkdAOzzrsB2sxHMhI4QWDdF5ilY6IC/DEir6S7AmGyjLkr4Aqc0h2BIbEjqO3sk+YRMtmOoJd9QE0ElFR8PrCs4K8hiIjcW5nWZ6LfQ6RPKnzrVBiznnM7u5kWdFmCziPRZU17g1X0HrbyQ5u+no02U1Ldj6DMynsKAXrY7NZzknVkLFYg+Zdr/PuNTd87Ipwh903JoZzem4bFsEULfjuC73cv+M3i9Z0Z8CeoqkXeNNh4/Ra8rnENPqQIoB1+qjGP40gVjRchx5hFnj/gY2XgLvPwpUcZoZOuChWfUmKdTLqaSnPE1Mg0HW8XLRBtMeunbvQl7cpkU3EGGnR/n7pCXXa7KtwXEWZTZ1QNszSlysvkaONt19rri8eWE5NVqAcQGKSJ9wCXzLviY8u6a4YcZimpqhWfNtJ9R1y8SxbwAYQJaRpVxGV8o7Sm5FBO4znpl1rj29H4SyZV8V+ZTbccssaXVNUaz8mEDDD3lVV4AWqMWeGPZNopPX1OqsRfNF3qCLqsm24gIn+CrUqp/JG6YN10hfNmTZZXGbPMNyaHgjqv9Cw5uTrffRaV1Wyg1jeVP2tW3EhVnh2mBZBAuEvgAwrX5LWL/xRReeFJcCqpvE6Vlaby3adO0TuPROXPyo8dp8rbbMAl89gkSYiL1NR54QxZhXTeZsM4Wufb0flyoaoOdX5UKbIlV7XOmzbrj9vs1g/gJwgjgs0DmRWRKua3ESCIeko/1SFYaUrPWXnywko/ZUf3PWzpdRvyVMkY7JG64AVhI/B6aMv3DurWRF2AC2MWdX7KEWvf/UjzxdcHPfFhn30BfAS7CE0kTIe4st+s7lw70Oo4dnMl50Oq50PU66YFgnR9mQ/BCbSOaT6EpedDlFXBBknpIrS8IZlKUyEEWKJef67HaLLEv/upEAMdob1PVC31nEhpJvWPYZKiDcjGaCNelKQpPcas8dz9WzgLlCmp8Sf2fnlH9o9q/CWnQvCxtRphe1GNP1H/73B31BrP/92snyXT+AiMVeLbZMeYJZ7rs6yxr50KCi/Biq+/S9SsucRzsW2W/dyvOItbu/pPSPJ7tS0u8G/vdoEWy467tytc8eouK1ifGoLqfj5Vat3uAlzx9EQ3afLuzLqW92bhl37pu1cfgLELvMfaZHANwkhBaRdghXrarie3SdN2mqLUnbaPaW6b19rUtuFrOxtZ2YI0zZaoUNaAF+CHcirvaxe8LJW3jGnHKu8PyAd/shX79XPaxq7yPjvsBkGQwDR9eFTRjBeghnoCr3QSpVyBt72uBb5ZeKVnAt9azuTwBZ4de1OBT5UUeGmJkiMQeJ0oKU3gqau0O4Ef7IKi73NVS7zP5kpSiV/gh+KbK7fYnAA7lFN5ms+nVb59lZ85Hav8bLBbA7zPVa3yM9YDV6p8iNSTeAFqqCfxOplGlsTb9JLuJH5MyTQznUxTVgXrgaMC/0+4XcQBVEzgdUbN0bqxZtpVI03hXatjhbdm4/LVVGzVKm+VW8vvrTwUwr1tX7KNHXsIdlu6LsIGBYVdZ9FIE3Ya3O9sQTmLM4jvYUuv3ZBby6MZ0lzWI3XBDrkzWV/E63XW0IpQq5XFWnsHeXviLi2BZvgzWM2pzqCRJe6OWVPcpVnt5nRMKTQVV7XNbk7ZJJoEPoMkSB/WYQTpitBjt9xFOKGc5c7a7df5hp5HCTGUdUPlrxA6NWq6XMpdXto3zVXumfm4vkvzXq4Pyn1j1jAf6PKg7/JWD8FY25rdUbl3qLewHmhDWig3Cmu2YuTAlV5kBCCq9JdcDJQfMWyEbL/GX37t2h+7rtMNnzjCPs5V4lrkhnLi7jXTAK3uR9X9ksuA8lcTa5a33C95L3mq9X3Kek4yfc/l/QHMfyoo8QL8UE7jp0r7amRqfO2FQOWJ/Jj21iyJqkWeE/mMAArRLstqDeLdPFJm72QBWqin7XqVZ1na7nau7WNa5Xna2jLPw9d2Nhc9ijdLRcVd2hrPwxd302bV/TEir/SwjgMYHaWFspFyh+6BLBoot0xZKm7aSq/mKhIqt+trQV+C5abNivmYwuUVe3W/bdpsKHRfjkncPEtpU2ZrzcaUUbBL1wEXab1B5wF1k5ofoxiyVVzV2m86bNTlQPsVDa2LcEQ9sff05ERpYt95fN30rEbo9kzsvfqD7dGLPWdzrUOxp/s5KLS8iAhB1FN6p5kWaKXvdZTddMYUZq/IqqXedNhAewoBelgAIpToVTGRF6DGmEWev7O0jrXzuVFf9vsRbeejO6Bo+1n7oh8BYEQKz//dbIAmE/gkfs6X+x6VwrfJDPUEXk91kyfwfucCP6Dpbmc1Y19NgaejQ8aCjyMt8O8yY8wCzxcpd8ogD4MlpFFurKOreBlvQPSxKn2TpVSdcx9nAJPC/0GEXotEK7BDMS5aoXVUfAtfQvTn3ue/COQf3OLol5eCAdnBKz0g+5D8uX+wdxU5rC7Ljqrrguskydj68WvOQ1x0F5KKyk7IcsKqU9Zg80pL985imVWQLY13yQK+V8d0LSpEO77jXUZhchMI9h7CEjWBJPn9Jzx4EwkLUrFpGpdgB0XabIB0AaM0qPmrjhk1kbb6hbPfLc5NWnQdnPNW3yLMDgsz90S7ZzCbg4W5E+GmBvJJnE2nV0BbNMmXE66DIEqPGnvKpkmbxmGatGnU3aVj1sLo7AiISu/BIrKCVUn34aRJWwYbZiFp0ne9XKb/3KXFSgoLxdXaHWr1ZKRlGUenrhzPku4dEaStNibAlJdDXPebcLvunL6EZC1H6b1a5PYEnadIWw7rZB9fT+CctYHLOHsCh/W7E7Nc9wNiPFGvH+DkW3zW47k6017rj+fK3Lr2hb5hQoVC3bg5vHmvFietYkzzXiv26hxJi5MXcaIHV2m+qwhVlIu4Wg2zLgbeC/A98m31At0P5ji5Fz1s+bUR0PNdK2TZqYuZ5is6z1WEG+qJPG31WuTbF/nO57la1pgmP1Vc1SJvWWxULhP5AKYLFUVegBvqiTx9jyHkTnacSlP6dU9nxpn9yoG03G6SpgqUDSGUL5RP1z49jPopslbP6MFaelmOfXFv7ZXf6xuupnRRSdGJ7PKyrFydZVXTFiiZPiCnvMvPsuqdwXauU949K8FqnLa7y0ZHCyXWfnlhtihozSsdnRVxGIh3BN375d1mKXQ9c9m4OhZb1QUbi6Wyr6prXoAe6um85zLQdzin0RIdnAf/Odt9c45PgaVc3TG9X9vjQ/uT9ob02aW4PsDr3glFv1rd+Uuc24N0dGpPD0enTjEp6K7uBXSxqIqy+Tu0TGDWUMnX5dLuhhPuBsupaYdITAL0dC5/zV7Mq9+L9cbf4PFz+Xtnapzrb/DOSuMfp+HJ2Sma6LB2NghTRT0jtOFW1APvBUSGuuK9QPfOBs6G1L2czFUXg5KtWvUtzt7Rp73MvUO+NVeDADXUU3mf1QGt8i2pfPdZgD6rBD1s6XUR8OsPr0ev8T6bE5BZ9qr6kwW4oZ7IT20Geu1PluBPpoJ/2p/stZ5BeKY/mb4y9Sdb/j4DT19ArSu5/mSfzZEJQlzD2p98yp9s1zVC5KWv+UpvwSDiuixpPiB3ss+GekblTvbrT/4Zv9HJBoaIDGt3sjBV1LNBfb1Pg7ReoHt3sj+gfRpqIODXRmD0mk/twrear6yjoT43lBN522D7+95ON7zcRLTCf9HiXDRqaZx2NMwKk+3yc9G4u5rwMou8iLTIOf6wRFm15AXECjugkvf3LqZfXKUZGa7xCbgKX/LLiu/pjX6kZLvf/Gb4ZfP7HT4DF+899w1zcfNGh0TDRkD8BN/oEEeamIE/EYtwAaLr4os1VrqM+8+rEMFvWIzIM58TsD1oDxmdniBarPZkkDamoh3k7/RHIQaVuXpizxlBNwLHwvAkGRhc3vCMR1m8uYnjJ9w3aOqcRR2/X8Th2aWyiHOXrZWdauK0QhxOIuxFmWOyhq886lyHCRloauq01F3JIw8+TGKCXWU443pYfY4DSM74Pw==
\ No newline at end of file
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..dc3affc
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
diff --git a/perf/FlightmanERD.drawio b/perf/FlightmanERD.drawio
new file mode 100644
index 0000000..79d9191
--- /dev/null
+++ b/perf/FlightmanERD.drawio
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/perf/FlightmanSchema.sql b/perf/FlightmanSchema.sql
new file mode 100644
index 0000000..90460ef
--- /dev/null
+++ b/perf/FlightmanSchema.sql
@@ -0,0 +1,192 @@
+create extension if not exists "uuid-ossp";
+
+-- User Tables --
+
+drop table if exists address_country cascade;
+
+create table address_country(
+ address_country_id serial,
+ country_name varchar(50) unique not null,
+ constraint pk_address_country primary key (address_country_id)
+);
+
+drop table if exists address_city cascade;
+
+create table address_city(
+ address_city_id serial,
+ address_country_id int not null,
+ city_name varchar(50) not null,
+ constraint pk_address_city primary key (address_city_id),
+ constraint fk_address_city_address_country foreign key (address_country_id) references address_country
+);
+
+drop table if exists user_diet cascade;
+
+create table user_diet(
+ diet_id serial,
+ diet_name varchar(50) unique not null,
+ constraint pk_user_diet primary key (diet_id)
+);
+
+drop table if exists users cascade;
+
+create table users(
+ user_id uuid default uuid_generate_v4(),
+ first_name varchar(50) not null,
+ last_name varchar(50) not null,
+ phone_number varchar(50) unique not null,
+ email varchar(50) unique not null,
+ passport_number varchar(50) unique not null,
+ address_fl varchar(50) not null,
+ address_sl varchar(50) not null,
+ address_country_id int not null,
+ address_city_id int not null,
+ address_zipcode int not null,
+ diet_id int,
+ diet_comments varchar(250),
+ rewards_miles int,
+ constraint pk_users primary key (user_id),
+ constraint fk_users_address_country foreign key (address_country_id) references address_country,
+ constraint fk_users_address_city foreign key (address_city_id) references address_city,
+ constraint fk_users_diet foreign key (diet_id) references user_diet
+);
+
+-- Airport Tables --
+
+drop table if exists airports cascade;
+
+create table airports(
+ airport_id uuid default uuid_generate_v4(),
+ airport_name varchar(50) not null,
+ airport_abv_name varchar(5) not null,
+ latitude double precision not null,
+ longitude double precision not null,
+ constraint pk_airports primary key (airport_id)
+);
+
+-- Flight Tables --
+
+drop table if exists flight_model cascade;
+
+create table flight_model(
+ flight_model_id serial,
+ flight_manufacturer_name varchar(50) not null,
+ flight_model_number varchar(50) not null,
+ seat_capacity int not null,
+ -- for the sake of simplicity we assume that all flights are perfect grids
+ -- where each col coresponds to a letter e.g. (col0 -> A, col1 -> B,...etc)
+ seat_row_count int not null,
+ seat_col_count int not null,
+ constraint pk_flight_model primary key (flight_model_id)
+);
+
+drop table if exists meals cascade;
+
+create table meals(
+ meal_id serial,
+ meal_name varchar(50) not null,
+ meal_desc varchar(250) not null,
+ constraint pk_meals primary key (meal_id)
+);
+
+drop table if exists flights cascade;
+
+create table flights(
+ flight_id uuid default uuid_generate_v4(),
+ source_airport_id uuid,
+ dest_airport_id uuid,
+ flight_model_id int,
+ departure_time time not null,
+ est_arrival_time time not null,
+ num_available_seats int not null,
+ delay_time time,
+ constraint pk_flights primary key (flight_id),
+ constraint fk_flights_source_airport foreign key (source_airport_id) references airports(airport_id),
+ constraint fk_flights_dest_airport foreign key (dest_airport_id) references airports(airport_id),
+ constraint fk_flights_flight_model foreign key (flight_model_id) references flight_model
+);
+
+drop table if exists flight_meals cascade;
+
+create table flight_meals(
+ flight_id uuid,
+ meal_id int,
+ constraint pk_flight_meals primary key (flight_id,meal_id),
+ constraint fk_flight_meals_flights foreign key (flight_id) references flights,
+ constraint fk_flight_meals_meals foreign key (meal_id) references meals
+);
+
+-- Booking Tables --
+
+drop table if exists luggage_status cascade;
+
+create table luggage_status(
+ luggage_status_id serial,
+ luggage_status varchar(50),
+ constraint pk_luggage_status primary key (luggage_status_id)
+);
+
+drop table if exists luggage cascade;
+
+create table luggage(
+ luggage_id uuid default uuid_generate_v4(),
+ booking_id uuid not null,
+ luggage_status_id int not null,
+ constraint pk_luggage primary key (luggage_id),
+ constraint fk_luggage_bookings foreign key (booking_id) references bookings,
+ constraint fk_luggage_status foreign key (luggage_status_id) references luggage_status
+);
+
+drop table if exists bookings cascade;
+
+create table bookings(
+ user_id uuid,
+ booking_id uuid default uuid_generate_v4(),
+ flight_id uuid,
+ meal_id int,
+ seat_number varchar(3) not null,
+ payment_status bool not null,
+ constraint pk_bookings primary key (user_id,booking_id,flight_id),
+ constraint fk_bookings_users foreign key (user_id) references users,
+ constraint fk_bookings_flights foreign key (flight_id) references flights
+);
+
+-------------------------------- POPULATE TABLES --------------------------------
+
+-- User Tables --
+insert into address_country(country_name) values ('United States'),('Nigeria'),('India'),('South Africa');
+insert into address_city(address_country_id,city_name) values(1,'New York'), (2,'Lagos'),(3,'Hyderabad'),(4,'Johannesburg');
+insert into user_diet(diet_name) values ('Vegan'),('Vegiterian'),('No restrictions');
+insert into users(first_name,last_name,phone_number,email,passport_number,address_fl,address_sl,
+ address_country_id,address_city_id,address_zipcode,
+ diet_id,diet_comments,rewards_miles)
+ values ('John','Smith','+123456723423910','abc@gmail.com','A123115678','12 E 345 ST','APT 123',1,1,12345,1,'none',0),
+ ('Jane','Doe','+1234435678910','abcd@gmail.com','A1232345678','12 E 345 ST','APT 123',1,1,12345,1,'none',0),
+ ('Adekunle','Gold','+1284027134910','abcde@gmail.com','A12321678','12 E 345 ST','APT 123',2,3,12345,2,'No nuts',0),
+ ('Musa','Yaradua','+23423452403910','abcdef@gmail.com','A1124435678','12 E 345 ST','APT 123',3,3,12345,3,'Only onions',0);
+insert into airports(airport_name,airport_abv_name,latitude,longitude)
+ values ('John F. Kennedy International Airport','JFK',40.6413,-73.7781),
+ ('Murtala Mohammed International Airport','MM2',6.5844,3.3333),
+ ('Hyderabad International Airport','GMR',17.2403,78.4294);
+insert into flight_model(flight_manufacturer_name,flight_model_number,seat_capacity,seat_row_count,seat_col_count)
+ values ('boeing','737e',300,60,5),
+ ('aml','723e',600,60,10),
+ ('escrow','565f',100,25,4);
+insert into meals(meal_name,meal_desc)
+ values ('Egba','Meal1'),
+ ('Pounded Yam','Meal2'),
+ ('Suya','Meal3');
+-- insert into flights(source_airport_id,dest_airport_id,flight_model_id,departure_time,est_arrival_time,num_available_seats,delay_time)
+-- values ();
+insert into flight_meals(flight_id,meal_id)
+ select f.flight_id, ms.meal_id
+ from flights as f
+ cross join meals as ms;
+insert into luggage_status(luggage_status)
+ values ('Checked In'),('In Transit'),('Arrived at Final Destination'),('Claimed');
+-- insert into bookings(user_id,flight_id,meal_id,seat_number,payment_status)
+-- values ();
+select * from luggage_status
+
+
+