Index: src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -1,4 +1,5 @@
 package com.example.rezevirajmasa.demo.dto;
 
+import com.example.rezevirajmasa.demo.model.PreorderedItem;
 import com.example.rezevirajmasa.demo.model.Reservation;
 import com.example.rezevirajmasa.demo.model.Restaurant;
@@ -15,16 +16,15 @@
     private LocalDateTime reservationDateTime;
     private LocalDateTime checkInTime;
-    private Restaurant restaurant;
+    private Long restaurantId;
     private int partySize;
     private String status;
     private String specialRequests;
     private String paymentStatus;
-    private List<String> preOrderedItems;
-
+    private List<PreorderedItem> preOrderedItems;
 
     public ReservationDTO() {
     }
 
-    public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Restaurant restaurant, int partySize, String status, String specialRequests, String paymentStatus, List<String> preOrderedItems) {
+    public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Long restaurantId, int partySize, String status, String specialRequests, String paymentStatus, List<PreorderedItem> preOrderedItems) {
         this.reservationID = reservationID;
         this.userEmail = userEmail;
@@ -33,5 +33,5 @@
         this.reservationDateTime = reservationDateTime;
         this.checkInTime = checkInTime;
-        this.restaurant = restaurant;
+        this.reservationID = restaurantId;
         this.partySize = partySize;
         this.status = status;
@@ -48,5 +48,5 @@
         this.reservationDateTime = reservation.getReservationDateTime();
         this.checkInTime = reservation.getCheckInTime();
-        this.restaurant = reservation.getRestaurant();
+        this.restaurantId = reservation.getRestaurant().getRestaurantId();
         this.partySize = reservation.getPartySize();
         this.status = reservation.getStatus();
@@ -54,12 +54,4 @@
         this.paymentStatus = reservation.getPaymentStatus();
         this.preOrderedItems = reservation.getPreOrderedItems();
-    }
-
-    public List<String> getPreOrderedItems() {
-        return preOrderedItems;
-    }
-
-    public void setPreOrderedItems(List<String> preOrderedItems) {
-        this.preOrderedItems = preOrderedItems;
     }
 
@@ -112,10 +104,10 @@
     }
 
-    public Restaurant getRestaurant() {
-        return restaurant;
+    public Long getRestaurantId() {
+        return restaurantId;
     }
 
-    public void setRestaurant(Restaurant restaurant) {
-        this.restaurant = restaurant;
+    public void setRestaurantId(Long restaurantId) {
+        this.restaurantId = restaurantId;
     }
 
@@ -151,3 +143,11 @@
         this.paymentStatus = paymentStatus;
     }
+
+    public List<PreorderedItem> getPreOrderedItems() {
+        return preOrderedItems;
+    }
+
+    public void setPreOrderedItems(List<PreorderedItem> preOrderedItems) {
+        this.preOrderedItems = preOrderedItems;
+    }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/model/Menu.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Menu.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Menu.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -6,4 +6,6 @@
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 @Entity
@@ -13,31 +15,32 @@
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "MenuID")
+    @Column(name = "menu_id")
     private Long menuID;
 
     @ManyToOne
-    @JoinColumn(name = "RestaurantID", nullable = false)
+    @JoinColumn(name = "restaurant_id", nullable = false)
     @JsonIgnore
     private Restaurant restaurant;
 
-    @Column(name = "ItemName", length = 100)
+    @Column(name = "item_name", length = 100)
     private String itemName;
 
-    @Column(name = "Category", length = 50)
+    @Column(name = "category", length = 50)
     private String category;
 
-    @Column(name = "Price", precision = 8, scale = 2)
+    @Column(name = "price", precision = 8, scale = 2)
     private BigDecimal price;
 
-    @Column(name = "Description")
+    @Column(name = "description")
     private String description;
 
-    @Column(name = "DietaryInformation", columnDefinition = "JSONB")
-    private String dietaryInformation;
+    @OneToMany(mappedBy = "menu", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
+    private List<MenuTag> tags = new ArrayList<>();
 
     public Menu() {
     }
 
-    public Menu(Restaurant restaurant, String itemName, String category, BigDecimal price, String description, String dietaryInformation) {
+    public Menu(Long menuID, Restaurant restaurant, String itemName, String category, BigDecimal price, String description, List<MenuTag> tags) {
+        this.menuID = menuID;
         this.restaurant = restaurant;
         this.itemName = itemName;
@@ -45,5 +48,5 @@
         this.price = price;
         this.description = description;
-        this.dietaryInformation = dietaryInformation;
+        this.tags = tags;
     }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
+++ src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import jakarta.persistence.*;
+import lombok.Data;
+
+@Entity
+@Table(name = "menu_tags")
+@Data
+public class MenuTag {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "menu_id", nullable = false)
+    @JsonIgnore
+    private Menu menu;
+
+    @Column(name = "tag_name", nullable = false)
+    private String tagName;
+
+    @Column(name = "tag_value", nullable = false)
+    private String tagValue;
+
+    public MenuTag() {}
+
+    public MenuTag(Menu menu, String tagName, String tagValue) {
+        this.menu = menu;
+        this.tagName = tagName;
+        this.tagValue = tagValue;
+    }
+}
+
Index: src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
+++ src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Entity
+@Table(name = "reservation_preordered_items")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class PreorderedItem {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    private String name;
+
+    private Integer quantity;
+
+    private BigDecimal price;
+
+    @JsonIgnore
+    @ManyToOne
+    @JoinColumn(name = "reservation_id", nullable = false)
+    private Reservation reservation;
+}
Index: src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -26,5 +26,5 @@
     @ManyToOne
     @JoinColumn(name = "UserID")
-    @JsonManagedReference
+    @JsonBackReference(value = "user-reservations")
     private User user;
 
@@ -57,8 +57,10 @@
     private LocalDateTime checkOutTime;
 
-    @ElementCollection
-    @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
-    @Column(name = "item")
-    private List<String> preOrderedItems = new ArrayList<>();
+//    @ElementCollection
+//    @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
+//    @Column(name = "item")
+//    private List<String> preOrderedItems = new ArrayList<>();
+    @OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true)
+    private List<PreorderedItem> preOrderedItems = new ArrayList<>();
 
     @Column(name = "PaymentStatus", length = 20, nullable = false, columnDefinition = "VARCHAR default 'Unpaid'")
Index: src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -41,5 +41,5 @@
     private BigDecimal rating;
 
-    @JsonIgnore
+    @JsonManagedReference
     @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private List<TableEntity> tablesList;
Index: src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -29,5 +29,5 @@
 
     @JsonBackReference
-    @ManyToOne(fetch = FetchType.EAGER)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "RestaurantID")
     private Restaurant restaurant;
Index: src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -11,5 +11,5 @@
 
 public interface ReservationService {
-    public Reservation makeReservationRest(ReservationDTO reservation, User user);
+    public Reservation makeReservationRest(ReservationDTO reservation, User user, Restaurant restaurant);
     public List<Reservation> listAll();
     public Reservation updateReservation(Long reservationId, ReservationDTO reservationDTO, User user);
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -26,7 +26,9 @@
 
 import javax.swing.text.html.Option;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -55,5 +57,5 @@
 
     @Override
-    public Reservation makeReservationRest(ReservationDTO reservationDTO, User user) {
+    public Reservation makeReservationRest(ReservationDTO reservationDTO, User user, Restaurant restaurant) {
         Reservation reservation = new Reservation();
 
@@ -92,10 +94,22 @@
             reservation.setPaymentStatus(reservationDTO.getPaymentStatus() != null ? reservationDTO.getPaymentStatus() : "Unpaid");
             reservation.setUser(user);
-            reservation.setPreOrderedItems(reservationDTO.getPreOrderedItems());
-            reservation.setRestaurant(reservationDTO.getRestaurant());
+
+            List<PreorderedItem> preOrderedItems = new ArrayList<>();
+
+            for (PreorderedItem dtoItem : reservationDTO.getPreOrderedItems()) {
+                PreorderedItem item = new PreorderedItem();
+                item.setName(dtoItem.getName());
+                item.setQuantity(dtoItem.getQuantity());
+                item.setPrice(dtoItem.getPrice());
+                item.setReservation(reservation);
+
+                preOrderedItems.add(item);
+            }
+
+            reservation.setPreOrderedItems(preOrderedItems);
+            reservation.setRestaurant(restaurant);
             reservation.setCheckInTime(reservationDTO.getReservationDateTime().plusHours(1));
             reservation.setReservationDateTime(LocalDateTime.now());
             reservation.setCheckOutTime(reservationDTO.getReservationDateTime().plusHours(3));
-            reservation.setRestaurant(reservationDTO.getRestaurant());
 
             return reservationRepository.save(reservation);
Index: src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -181,7 +181,8 @@
 
     @PostMapping("/api/reservations")
-    public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation) {
-        User user = userService.findByMail(reservation.getUserEmail());
-        Reservation savedReservation = reservationService.makeReservationRest(reservation, user);
+    public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation){
+    User user = userService.findByMail(reservation.getUserEmail());
+    Restaurant restaurant = restaurantService.findByIdRestaurant(reservation.getRestaurantId());
+        Reservation savedReservation = reservationService.makeReservationRest(reservation, user, restaurant);
 
         return new ResponseEntity<>(savedReservation, HttpStatus.CREATED);
@@ -227,5 +228,5 @@
                                                        @PathVariable String email) {
         User user = userService.findByMail(email);
-
+        Restaurant restaurant = restaurantService.findByIdRestaurant(reservationDTO.getRestaurantId());
         if (!reservationDTO.getReservationID().equals(reservationId)) {
             return ResponseEntity.badRequest().build();
