Index: backend/GlobeGuru-backend/src/main/java/Change.java
===================================================================
--- backend/GlobeGuru-backend/src/main/java/Change.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
+++ backend/GlobeGuru-backend/src/main/java/Change.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
@@ -0,0 +1,44 @@
+public class Change {
+    private String attribute;
+    private String oldValue;
+    private String newValue;
+
+    public Change(String attribute, String oldValue, String newValue) {
+        this.attribute = attribute;
+        this.oldValue = oldValue;
+        this.newValue = newValue;
+    }
+
+    public String getAttribute() {
+        return attribute;
+    }
+
+    public void setAttribute(String attribute) {
+        this.attribute = attribute;
+    }
+
+    public String getOldValue() {
+        return oldValue;
+    }
+
+    public void setOldValue(String oldValue) {
+        this.oldValue = oldValue;
+    }
+
+    public String getNewValue() {
+        return newValue;
+    }
+
+    public void setNewValue(String newValue) {
+        this.newValue = newValue;
+    }
+
+    @Override
+    public String toString() {
+        return "Change{" +
+                "attribute='" + attribute + '\'' +
+                ", oldValue='" + oldValue + '\'' +
+                ", newValue='" + newValue + '\'' +
+                '}';
+    }
+}
Index: backend/GlobeGuru-backend/src/main/java/DatabaseUtil.java
===================================================================
--- backend/GlobeGuru-backend/src/main/java/DatabaseUtil.java	(revision 0a7426e6328fcef1465400625f79fcb91c6bcff6)
+++ backend/GlobeGuru-backend/src/main/java/DatabaseUtil.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
@@ -53,4 +53,13 @@
                              "price REAL," +
                              "FOREIGN KEY(optionId) REFERENCES options(id))"
+             );
+             PreparedStatement stmt5 = conn.prepareStatement(
+                     "CREATE TABLE IF NOT EXISTS changeLog(" +
+                             "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+                             "detail_id INTEGER NOT NULL," +
+                             "attribute TEXT NOT NULL," +
+                             "oldValue TEXT," +
+                             "newValue TEXT," +
+                             "FOREIGN KEY(detail_id) REFERENCES optionDetails(id))"
              )) {
 
@@ -59,4 +68,5 @@
             stmt3.executeUpdate();
             stmt4.executeUpdate();
+            stmt5.executeUpdate();
         }
     }
@@ -201,7 +211,4 @@
         }
     }
-
-
-
     public static List<Option> poolOptionDetails(int id) throws SQLException{
         String sql = "SELECT * FROM optionDetails WHERE optionId = ?";
@@ -283,5 +290,5 @@
     }
     public static int saveOptionToDatabase(Option option) {
-        String sql = "INSERT INTO options (link, imgSrc, hotelName, country, dateRange,numberOfPeople, isPriceChanged, newPrice) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
+        String sql = "INSERT INTO options (link, imgSrc, hotelName, country, dateRange,numberOfPeople) VALUES (?, ?, ?, ?, ?, ?)";
         int id = 0;
         try (Connection conn = DriverManager.getConnection("jdbc:sqlite:globe_guru.db");
@@ -293,6 +300,4 @@
             stmt.setString(5, option.getDateRange());
             stmt.setInt(6,option.getNumPeople());
-            stmt.setBoolean(7, option.isPriceChanged());
-            stmt.setFloat(8, option.getNewPrice());
             stmt.executeUpdate();
             try(ResultSet genKey = stmt.getGeneratedKeys()){
@@ -331,71 +336,55 @@
         }
     }
-
     public static void updateOptionDetails(int detail_id, String type, String board, String amenities, float price) {
-        String sql = "UPDATE optionDetails SET ";
-
-        List<String> updates = new ArrayList<>();
-        if (type != null && !type.isEmpty()) updates.add("type = '" + type + "'");
-        if (board != null && !board.isEmpty()) updates.add("board = '" + board + "'");
-        if (amenities != null && !amenities.isEmpty()) updates.add("amenities = '" + amenities + "'");
-        updates.add("price = " + price);
-
-        sql += String.join(", ", updates);
-        sql += " WHERE id = " + detail_id;
-
-        try (Connection conn = getConnection();
-             PreparedStatement stmt = conn.prepareStatement(sql)) {
-            stmt.executeUpdate();
+        try (Connection conn = getConnection()) {
+            String selectSql = "SELECT * FROM optionDetails WHERE id = ?";
+            PreparedStatement selectStmt = conn.prepareStatement(selectSql);
+            selectStmt.setInt(1, detail_id);
+            ResultSet rs = selectStmt.executeQuery();
+
+            if (rs.next()) {
+                String oldType = rs.getString("type");
+                String oldBoard = rs.getString("board");
+                String oldAmenities = rs.getString("amenities");
+                float oldPrice = rs.getFloat("price");
+
+                insertChangeLog(detail_id, "type", oldType, type);
+                insertChangeLog(detail_id, "board", oldBoard, board);
+                insertChangeLog(detail_id, "amenities", oldAmenities, amenities);
+                insertChangeLog(detail_id, "price", String.valueOf(oldPrice), String.valueOf(price));
+            }
+
+            String sql = "UPDATE optionDetails SET ";
+            List<String> updates = new ArrayList<>();
+            if (type != null && !type.isEmpty()) updates.add("type = '" + type + "'");
+            if (board != null && !board.isEmpty()) updates.add("board = '" + board + "'");
+            if (amenities != null && !amenities.isEmpty()) updates.add("amenities = '" + amenities + "'");
+            if (price > 0) updates.add("price = " + price);
+
+            sql += String.join(", ", updates);
+            sql += " WHERE id = " + detail_id;
+
+            try (PreparedStatement stmt = conn.prepareStatement(sql)) {
+                stmt.executeUpdate();
+            }
         } catch (SQLException e) {
             e.printStackTrace();
         }
     }
-
-    public static void updateOptionInDatabase(Option option) {
-        String sql = "UPDATE options SET link = ?, imgSrc = ?, hotelName = ?, country = ?, price = ?, dateRange = ?, isPriceChanged = ?, newPrice = ? WHERE id = ?";
-        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:globe_guru.db");
-             PreparedStatement stmt = conn.prepareStatement(sql)) {
-            stmt.setString(1, option.getLink());
-            stmt.setString(2, option.getImgSrc());
-            stmt.setString(3, option.getHotelName());
-            stmt.setString(4, option.getCountry());
-            stmt.setFloat(5, option.getPrice());
-            stmt.setString(6, option.getDateRange());
-            stmt.setBoolean(7, option.isPriceChanged());
-            stmt.setFloat(8, option.getNewPrice());
-            stmt.setInt(9, option.getId());
-            stmt.executeUpdate();
-        } catch (SQLException e) {
-            e.printStackTrace();
-        }
-    }
-    public static Option findOption(Option option) {
-        String sql = "SELECT * FROM options WHERE id = ?";
-        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:globe_guru.db");
-             PreparedStatement stmt = conn.prepareStatement(sql)) {
-            stmt.setInt(1, option.getId());
-            try (ResultSet rs = stmt.executeQuery()) {
-                if (rs.next()) {
-                    Option existingOption = new Option();
-                    existingOption.setId(rs.getInt("id"));
-                    existingOption.setLink(rs.getString("link"));
-                    existingOption.setImgSrc(rs.getString("imgSrc"));
-                    existingOption.setHotelName(rs.getString("hotelName"));
-                    existingOption.setCountry(rs.getString("country"));
-                    existingOption.setPrice(rs.getFloat("price"));
-                    existingOption.setDateRange(rs.getString("dateRange"));
-                    existingOption.setPriceChanged(rs.getBoolean("isPriceChanged"));
-                    existingOption.setNewPrice(rs.getInt("newPrice"));
-                    existingOption.setNumPeople(rs.getInt("numberOfPeople"));
-                    return existingOption;
-                }
-            }
-        } catch (SQLException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-
+    private static void insertChangeLog(int detail_id, String attribute, String oldValue, String newValue) {
+        if (!oldValue.equals(newValue)) {
+            String sql = "INSERT INTO changeLog (detail_id, attribute, oldValue, newValue) VALUES (?, ?, ?, ?)";
+            try (Connection conn = getConnection();
+                 PreparedStatement stmt = conn.prepareStatement(sql)) {
+                stmt.setInt(1, detail_id);
+                stmt.setString(2, attribute);
+                stmt.setString(3, oldValue);
+                stmt.setString(4, newValue);
+                stmt.executeUpdate();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+    }
     public static int getCurrentOptionsCount() throws SQLException {
         String sql = "SELECT COUNT(*) AS optionsCount FROM options";
Index: backend/GlobeGuru-backend/src/main/java/Option.java
===================================================================
--- backend/GlobeGuru-backend/src/main/java/Option.java	(revision 0a7426e6328fcef1465400625f79fcb91c6bcff6)
+++ backend/GlobeGuru-backend/src/main/java/Option.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
@@ -1,2 +1,4 @@
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 
@@ -12,13 +14,10 @@
     private String board;
     private String amenities;
+    private int numPeople;
+    private String dateRange;
+    private List<Change> changes = new ArrayList<>();
 
-    private int numPeople;
-    //Price changing
-    private float newPrice = 0;
-    private boolean isPriceChanged = false;
-    private String dateRange;
-    // Constructor
-    public Option(){
-        price = 0;
+    public String getDateRange() {
+        return dateRange;
     }
 
@@ -31,10 +30,14 @@
     }
 
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
     public void setDetail_id(int detail_id) {
         this.detail_id = detail_id;
-    }
-
-    public String getDateRange() {
-        return dateRange;
     }
 
@@ -63,7 +66,12 @@
     }
 
-    public boolean isEmpty(){
-        return (hotelName == null || country == null || link == null || imgSrc == null);
+    public int getNumPeople() {
+        return numPeople;
     }
+
+    public void setNumPeople(int numPeople) {
+        this.numPeople = numPeople;
+    }
+
     public String getHotelName() {
         return hotelName;
@@ -98,24 +106,24 @@
     }
 
+    public String getImgSrc() {
+        return imgSrc;
+    }
+
     public void setImgSrc(String imgSrc) {
         this.imgSrc = imgSrc;
     }
 
-    public String getImgSrc() {
-        return imgSrc;
+    public void addChange(String attribute, String oldValue, String newValue) {
+        this.changes.add(new Change(attribute, oldValue, newValue));
     }
 
-    public int getNumPeople() {
-        return numPeople;
-    }
-
-    public void setNumPeople(int numPeople) {
-        this.numPeople = numPeople;
+    public List<Change> getChanges() {
+        return changes;
     }
 
     @Override
     public boolean equals(Object obj) {
-        if(this==obj) return true;
-        if(obj == null || getClass() != obj.getClass()) return false;
+        if (this == obj) return true;
+        if (obj == null || getClass() != obj.getClass()) return false;
         Option option = (Option) obj;
         return Float.compare(option.price, price) == 0
@@ -127,42 +135,28 @@
     @Override
     public int hashCode() {
-        return Objects.hash(hotelName,country,price,link);
+        return Objects.hash(hotelName, country, price, link);
     }
 
-    public int getId() {
-        return id;
-    }
-
-    public void setId(int id) {
-        this.id = id;
-    }
-
-    //debug
     @Override
     public String toString() {
         return "Option{" +
-                "id='" + id + '\'' +
-                "dateRange='" + dateRange + '\'' +
-                "hotelName='" + hotelName + '\'' +
+                "id=" + id +
+                ", dateRange='" + dateRange + '\'' +
+                ", hotelName='" + hotelName + '\'' +
                 ", country='" + country + '\'' +
-                ", price='" + price + '\'' +
+                ", price=" + price +
                 ", link='" + link + '\'' +
-                ", image='" + imgSrc +
+                ", imgSrc='" + imgSrc + '\'' +
+                ", type='" + type + '\'' +
+                ", board='" + board + '\'' +
+                ", amenities='" + amenities + '\'' +
+                ", numPeople=" + numPeople +
+                ", changes=" + changes +
                 '}';
     }
 
-    public void setPriceChanged(boolean a){
-        isPriceChanged = a;
-    }
-    public void setNewPrice(float a){
-        newPrice = a;
-    }
-
-    public boolean isPriceChanged() {
-        return isPriceChanged;
-    }
-
-    public float getNewPrice() {
-        return newPrice;
+    public boolean isEmpty() {
+        return (link.isEmpty() || country.isEmpty() || hotelName.isEmpty());
     }
 }
+
Index: backend/GlobeGuru-backend/src/main/java/Scraper.java
===================================================================
--- backend/GlobeGuru-backend/src/main/java/Scraper.java	(revision 0a7426e6328fcef1465400625f79fcb91c6bcff6)
+++ backend/GlobeGuru-backend/src/main/java/Scraper.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
@@ -14,10 +14,8 @@
 
     private List<String> urls;
-    private ConcurrentLinkedQueue<Option> optionsQueue;
     private CountDownLatch latch;
 
     public Scraper() {
         urls = new ArrayList<>();
-        this.optionsQueue = new ConcurrentLinkedQueue<>();
         ObjectMapper mapper = new ObjectMapper();
         try {
@@ -44,5 +42,5 @@
         System.out.println("Scraper has started ");
         for (String url : urls) {
-            new ScraperThread(url, optionsQueue, latch).start();
+            new ScraperThread(url, latch).start();
         }
         return null;
Index: backend/GlobeGuru-backend/src/main/java/ScraperThread.java
===================================================================
--- backend/GlobeGuru-backend/src/main/java/ScraperThread.java	(revision 0a7426e6328fcef1465400625f79fcb91c6bcff6)
+++ backend/GlobeGuru-backend/src/main/java/ScraperThread.java	(revision df7f3908d4d04d0a62480f95b6d163db19795365)
@@ -29,13 +29,9 @@
 public class ScraperThread extends Thread {
     private String url;
-    private ConcurrentLinkedQueue<Option> uniqueOptions;
     private CountDownLatch latch;
-    private Set<Option> optionSet;
-
-    public ScraperThread(String url, ConcurrentLinkedQueue<Option> optionsQueue, CountDownLatch latch) {
+
+    public ScraperThread(String url, CountDownLatch latch) {
         this.url = url;
-        this.uniqueOptions = optionsQueue;
         this.latch = latch;
-        this.optionSet = new HashSet<>();
     }
 
@@ -86,19 +82,9 @@
                     for (Element div : childDivs) {
                         String data = div.outerHtml();
-                        Option option = optionParser(data,numPeople);
+                        Option option = optionParser(data, numPeople);
                         if (option != null) {
-                            Option existingOption = DatabaseUtil.findOption(option);
-                            if (existingOption != null) {
-                                if (existingOption.equals(option)) {
-                                    option.setPriceChanged(true);
-                                    option.setNewPrice(option.getPrice());
-                                }
-                                DatabaseUtil.updateOptionInDatabase(option);
-                            } else if (optionSet.add(option)) {
-                                uniqueOptions.add(option);
-                                option.setId(DatabaseUtil.saveOptionToDatabase(option));
-                                scrapeOptionInfo(option);
-                                System.out.println("Parsed " + option);
-                            }
+                            option.setId(DatabaseUtil.saveOptionToDatabase(option));
+                            scrapeOptionInfo(option);
+                            System.out.println("Parsed " + option);
                         }
                     }
@@ -115,17 +101,12 @@
                     for (Element div : childDivs) {
                         String data = div.outerHtml();
-                        Option newOption = optionParser(data,numPeople);
+                        Option newOption = optionParser(data, numPeople);
                         if (newOption != null) {
-                            if (optionSet.add(newOption)) {
-                                uniqueOptions.add(newOption);
-
-                                newOption.setId(DatabaseUtil.saveOptionToDatabase(newOption));
-                                scrapeOptionInfo(newOption);
-                                System.out.println("Parsed " + newOption);
-                            }
-                        }
-                    }
-
-        } else {
+                            newOption.setId(DatabaseUtil.saveOptionToDatabase(newOption));
+                            scrapeOptionInfo(newOption);
+                            System.out.println("Parsed " + newOption);
+                        }
+                    }
+                } else {
                     System.out.println("Parent div not found");
                 }
@@ -134,4 +115,5 @@
                 System.out.println("URL not recognized for parsing.");
         }
+
     }
     private void scrapeOptionInfo(Option option) {
