diff --git a/apiv3methods.js b/apiv3methods.js
index f135f4d..d87b067 100644
--- a/apiv3methods.js
+++ b/apiv3methods.js
@@ -46,6 +46,39 @@
 }
 
 /**
+ * BatchAvailabilityLookup method
+ * https://developers.google.com/maps-booking/reference/rest-api-v3/batchavailabilitylookup-method
+ * @param {string} requestBody - HTTP request body
+ * @return {string} HTTP response body
+ */
+function BatchAvailabilityLookup(requestBody) {
+  // BatchAvailabilityLookupRequest
+  // const req = JSON.parse(requestBody);
+  // TO-DO: validate req, e.g.
+  //   (req.slot_time !== null && req.merchant_id !== null)
+  // TO-DO: add code to verify availability for all requested slots.
+  // ...
+  // BatchAvailabilityLookupResponse
+  // e.g
+  // var resp = {
+  //   slot_time_availability: [
+  //     {
+  //       slot_time: {
+  //         service_id: 5,
+  //         start_sec: 50010430,
+  //         duration_sec: 3600,
+  //         availability_tag: ...
+  //       }
+  //     }
+  //   ]
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
+}
+
+/**
  * CheckAvailability method
  * https://developers.google.com/maps-booking/reference/rest-api-v3/checkavailability-method
  * @param {string} requestBody - HTTP request body
@@ -53,21 +86,24 @@
  */
 function CheckAvailability(requestBody) {
   // CheckAvailabilityRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g.
   //   (req.slot !== null && req.slot.merchant_id !== null)
   // TO-DO: add code to verify the provided slot availability
   // ...
   // CheckAvailabilityResponse
-  var resp = {
-    slot: req.slot,
-    count_available: 1,
-    duration_requirement: 'DURATION_REQUIREMENT_UNSPECIFIED'
-    // TO-DO: populate proper values and other fields, such as
-    // availability_update
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   slot: req.slot,
+  //   count_available: 1,
+  //   duration_requirement: 'DURATION_REQUIREMENT_UNSPECIFIED'
+  //   // TO-DO: populate proper values and other fields, such as
+  //   // availability_update
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -78,22 +114,24 @@
  */
 function CreateBooking(requestBody) {
   // CreateBookingRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g. (req.user_information !== null)
   // TO-DO: add code to create a booking
   // ...
   // CreateBookingResponse
-  var resp = {
-    booking: {
-      booking_id: '1234',
-      slot: req.slot,
-      user_information: {user_id: req.user_information.user_id},
-      payment_information: req.payment_information,
-      status: 'CONFIRMED'
-    }
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   booking: {
+  //     booking_id: '1234',
+  //     slot: req.slot,
+  //     user_information: {user_id: req.user_information.user_id},
+  //     payment_information: req.payment_information,
+  //     status: 'CONFIRMED'
+  //   }
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -104,17 +142,20 @@
  */
 function UpdateBooking(requestBody) {
   // UpdateBookingRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g.
   //   (req.booking !== null && req.booking.booking_id !== null)
   // TO-DO: add code to update the provided booking
   // ...
   // UpdateBookingResponse
-  var resp = {
-    booking: {booking_id: req.booking.booking_id, status: req.booking.status}
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   booking: {booking_id: req.booking.booking_id, status: req.booking.status}
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -125,17 +166,20 @@
  */
 function GetBookingStatus(requestBody) {
   // GetBookingStatusRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g. (req.booking_id !== null)
   // TO-DO: add code to retrieve the booking status
   // ...
   // GetBookingStatusResponse
-  var resp = {
-    booking_id: req.booking_id,
-    booking_status: 'BOOKING_STATUS_UNSPECIFIED'
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   booking_id: req.booking_id,
+  //   booking_status: 'BOOKING_STATUS_UNSPECIFIED'
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -146,15 +190,18 @@
  */
 function ListBookings(requestBody) {
   // ListBookingsRequest
-  const req = JSON.parse(requestBody);
-  console.log(`ListBookings() for user_id: ${req.user_id}`);
+  // const req = JSON.parse(requestBody);
+  // console.log(`ListBookings() for user_id: ${req.user_id}`);
   // TO-DO: validate req, e.g. (req.user_id !== null)
   // TO-DO: add code to fetch all bookings for the user_id
   // ...
   // ListBookingsResponse
-  var resp = {bookings: [{}]};
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {bookings: [{}]};
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 
@@ -166,23 +213,27 @@
  */
 function CheckOrderFulfillability(requestBody) {
   // CheckOrderFulfillabilityRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g. (req.merchant_id !== null)
   // TO-DO: add code to validate individual items and calculate the total price
   // ...
   // CheckOrderFulfillabilityResponse
-  var resp = {
-    fulfillability: {
-      result: 'CAN_FULFILL',
-      item_fulfillability: [{}]  // individual item fullfilability
-    },
-    fees_and_taxes: {
-      price_micros: 1000000,  // total price in micros, e.g. 1USD = 1000000
-      currency_code: 'USD'
-    }
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   fulfillability: {
+  //     result: 'CAN_FULFILL',
+  //     item_fulfillability: [{}]  // individual item fullfilability
+  //   },
+  //   fees_and_taxes: {
+  //     price_micros: 1000000,  // total price in micros, e.g. 1USD = 1000000
+  //     currency_code: 'USD'
+  //   }
+  // };
+  // const responseBody = JSON.stringify(resp);
+
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -193,21 +244,24 @@
  */
 function CreateOrder(requestBody) {
   // CreateOrderRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g. (req.user_information !== null)
   // TO-DO: check for req.idempotency_token uniqueness
   // TO-DO: create and process the order
   // ...
   // CreateOrderResponse
-  var resp = {
-    order: {
-      order_id: '123',  // new order id
-      merchant_id: req.order.mercant_id,
-      item: [{}]  // populate individual LineItems, etc.
-    }
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   order: {
+  //     order_id: '123',  // new order id
+  //     merchant_id: req.order.mercant_id,
+  //     item: [{}]  // populate individual LineItems, etc.
+  //   }
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
 /**
@@ -218,27 +272,156 @@
  */
 function ListOrders(requestBody) {
   // ListOrdersRequest
-  const req = JSON.parse(requestBody);
+  // const req = JSON.parse(requestBody);
   // TO-DO: validate req, e.g. if ("user_id" in req || "order_ids" in req)
   // TO-DO: fetch orders for req.user_id or a list of req.order_ids
   // ...
   // ListOrdersResponse
-  var resp = {
-    order: [{}]  // populate all orders for the user_id or order_ids
-  };
-  const responseBody = JSON.stringify(resp);
-  return responseBody;
+  // e.g
+  // var resp = {
+  //   order: [{}]  // populate all orders for the user_id or order_ids
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
 }
 
+/**
+ * BatchGetWaitEstimates method (Waitlist Implementation only)
+ * https://developers.google.com/maps-booking/reference/rest-api-v3/waitlists/batchgetwaitestimates-method
+ * @param {string} requestBody - HTTP request body
+ * @return {string} HTTP response body
+ */
+function BatchGetWaitEstimates(requestBody) {
+  // BatchGetWaitEstimatesRequest
+  // const req = JSON.parse(requestBody);
+  // TO-DO: validate req, e.g. if ("merchant_id" in req || "service_id" in req
+  // || "party_size" in req) TO-DO: fetch wait estimates for the relavent
+  // merchant, service id, and party size.
+  // ...
+  // BatchGetWaitEstimatesResponse
+  // e.g
+  // var resp = {
+  //   waitlist_status: 'OPEN',
+  //   wait_estimate: [
+  //     {
+  //       party_size: 5,
+  //       wait_length: {
+  //         parties_ahead_count: 5,
+  //         estimated_seat_time_range: {
+  //           start_seconds: 123456,
+  //           end_seconds: 123456
+  //         }
+  //       },
+  //       waitlist_confirmation_mode: 'WAITLIST_CONFIRMATION_MODE_SYNCHRONOUS'
+  //     }
+  //   ]
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
+}
+
+/**
+ * CreateWaitlistEntry method (Waitlist Implementation only)
+ * https://developers.google.com/maps-booking/reference/rest-api-v3/waitlists/createwaitlistentry-method
+ * @param {string} requestBody - HTTP request body
+ * @return {string} HTTP response body
+ */
+function CreateWaitlistEntry(requestBody) {
+  // BatchGetWaitEstimatesRequest
+  // const req = JSON.parse(requestBody);
+  // TO-DO: validate req, e.g. if ("merchant_id" in req || "service_id" in req
+  // || "party_size" in req) TO-DO: create waitlist entry using data provided in
+  // request (merchant_id, service_id, )
+  // ...
+  // CreateWaitlistEntryResponse
+  // e.g
+  // var resp = {
+  //    waitlist_entry_id: '1234', //if waitlist was created successfully
+  //    waitlist_business_logic_failure: { // if waitlist entry creation failed
+  //     cause: 'EXISTING_WAITLIST_ENTRY',
+  //     description: 'lorem impsum'
+  //    }
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
+}
+
+/**
+ * GetWaitlistEntry method (Waitlist Implementation only)
+ * https://developers.google.com/maps-booking/reference/rest-api-v3/waitlists/getwaitlistentry-method
+ * @param {string} requestBody - HTTP request body
+ * @return {string} HTTP response body
+ */
+function GetWaitlistEntry(requestBody) {
+  // GetWaitlistEntryRequest
+  // const req = JSON.parse(requestBody);
+  // TO-DO: validate req, e.g. if ("waitlist_entry_id" in req)
+  // TO-DO: fetch wait list entry status from your system.
+  // ...
+  // GetWaitlistEntryResponse
+  // e.g
+  // var resp = {
+  //    waitlist_entry: {
+  //     waitlist_entry_state: 'CANCELED',
+  //     waitlist_entry_state_times: {
+  //       created_time_seconds: ,
+  //       canceled_time_seconds:
+  //       ...
+  //     },
+  //     wait_estimate: {
+  //       party_size: 5,
+  //       ...
+  //     }
+  //    }
+  // };
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
+}
+
+/**
+ * DeleteWaitlistEntry method (Waitlist Implementation only)
+ * https://developers.google.com/maps-booking/reference/rest-api-v3/waitlists/deletewaitlistentry-method
+ * @param {string} requestBody - HTTP request body
+ * @return {string} HTTP response body
+ */
+function DeleteWaitlistEntry(requestBody) {
+  // DeleteWaitlistEntryRequest
+  // const req = JSON.parse(requestBody);
+  // TO-DO: validate req, e.g. if ("waitlist_entry_id" in req)
+  // TO-DO: delete waitlist with relevant waitlist_entry_id
+  // ...
+  // empty response once deleted.
+  // e.g
+  // var resp = {
+  // }
+  // const responseBody = JSON.stringify(resp);
+  // return responseBody;
+
+  throw new Error('Not implemented yet');
+}
 
 module.exports.HealthCheck = HealthCheck;
 // Booking-flow Booking Server methods
+module.exports.BatchAvailabilityLookup = BatchAvailabilityLookup;
 module.exports.CheckAvailability = CheckAvailability;
 module.exports.CreateBooking = CreateBooking;
-module.exports.UpdateBooking = UpdateBooking;
 module.exports.GetBookingStatus = GetBookingStatus;
 module.exports.ListBookings = ListBookings;
+module.exports.UpdateBooking = UpdateBooking;
 // Order-based Booking Server methods
 module.exports.CheckOrderFulfillability = CheckOrderFulfillability;
 module.exports.CreateOrder = CreateOrder;
 module.exports.ListOrders = ListOrders;
+// Waitlist-based Server methods
+module.exports.BatchGetWaitEstimates = BatchGetWaitEstimates;
+module.exports.CreateWaitlistEntry = CreateWaitlistEntry;
+module.exports.DeleteWaitlistEntry = DeleteWaitlistEntry;
+module.exports.GetWaitlistEntry = GetWaitlistEntry;
\ No newline at end of file
diff --git a/bookingserver.js b/bookingserver.js
index 51d2f42..0a40ddc 100644
--- a/bookingserver.js
+++ b/bookingserver.js
@@ -117,6 +117,16 @@
         } else if (method === 'POST') {
           switch (path) {
             // POST /v3/CheckAvailability/
+            case '/v3/batchavailabilitylookup':
+              try {
+                responseBody = apiv3.BatchAvailabilityLookup(requestBody);
+              } catch (e) {
+                // TO-DO: add a specific error handling if necessary
+                httpCode = 500;  // Internal Server Error
+                console.log(`Error: ${e}`);
+              }
+              break;
+            // POST /v3/CheckAvailability/
             case '/v3/checkavailability':
               try {
                 responseBody = apiv3.CheckAvailability(requestBody);
@@ -199,6 +209,50 @@
                 console.log(`Error: ${e}`);
               }
               break;
+            // POST /v3/BatchGetWaitEstimates/
+            // (this method is only for Waitlist functionality)
+            case '/v3/batchgetwaitestimates':
+              try {
+                responseBody = apiv3.BatchGetWaitEstimates(requestBody);
+              } catch (e) {
+                // TO-DO: add a specific error handling if necessary
+                httpCode = 500;  // Internal Server Error
+                console.log(`Error: ${e}`);
+              }
+              break;
+            // POST /v3/CreateWaitlistEntry/
+            // (this method is only for Waitlist functionality)
+            case '/v3/createwaitlistentry':
+              try {
+                responseBody = apiv3.CreateWaitlistEntry(requestBody);
+              } catch (e) {
+                // TO-DO: add a specific error handling if necessary
+                httpCode = 500;  // Internal Server Error
+                console.log(`Error: ${e}`);
+              }
+              break;
+            // POST /v3/GetWaitlistEntry/
+            // (this method is only for Waitlist functionality)
+            case '/v3/getwaitlistentry':
+              try {
+                responseBody = apiv3.GetWaitlistEntry(requestBody);
+              } catch (e) {
+                // TO-DO: add a specific error handling if necessary
+                httpCode = 500;  // Internal Server Error
+                console.log(`Error: ${e}`);
+              }
+              break;
+            // POST /v3/DeleteWaitlistEntry/
+            // (this method is only for Waitlist functionality)
+            case '/v3/deletewaitlistentry':
+              try {
+                responseBody = apiv3.DeleteWaitlistEntry(requestBody);
+              } catch (e) {
+                // TO-DO: add a specific error handling if necessary
+                httpCode = 500;  // Internal Server Error
+                console.log(`Error: ${e}`);
+              }
+              break;
             // some unknown request
             default:
               httpCode = 400;  // Bad Request
@@ -216,4 +270,4 @@
 
 server.listen(port, hostname, () => {
   console.log(`Booking Server is running at ${hostname}:${port}`);
-});
+});
\ No newline at end of file
