diff --git a/src/main/java/Team5.Smarttowns/Data/Towns.db b/src/main/java/Team5.Smarttowns/Data/Towns.db
deleted file mode 100644
index 2532550d9acf4d8abc21a6e6ed89629908b72a3e..0000000000000000000000000000000000000000
Binary files a/src/main/java/Team5.Smarttowns/Data/Towns.db and /dev/null differ
diff --git a/src/main/java/Team5/SmartTowns/Data/QRCodes.java b/src/main/java/Team5/SmartTowns/Data/QRCodes.java
deleted file mode 100644
index ef350eb418b959e1069ee51d061471448c3b7457..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Data/QRCodes.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package Team5.SmartTowns.Data;
-
-public class QRCodes {
-}
diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java b/src/main/java/Team5/SmartTowns/Data/trailsRepository.java
deleted file mode 100644
index 52d8dc39b9bda0a7390f06afca8769a5fd0607a9..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//Holds trails data repository
-package Team5.SmartTowns.Data;
-
-import java.util.List;
-
-public interface trailsRepository {
-    List<trail> getAllTrails();
-}
diff --git a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java b/src/main/java/Team5/SmartTowns/Towns/TownStorage.java
deleted file mode 100644
index d2d99ea992086630324fa131ad5bb410acd3c425..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package Team5.SmartTowns.Towns;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TownStorage {
-    private List<Towns> townList;
-    private static TownStorage singleton;
-
-    TownStorage() {
-        townList = new ArrayList<>();
-        townList.addAll(
-          List.of(
-                  new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"),
-                  new Towns("Risca",02,2,34,"/images/RiscaBanner.jpg"),
-                  new Towns("Penarth",03,5,0,"/images/PenarthBanner.jpg"),
-                  new Towns("Penarth",03,5,50,"/images/PenarthBanner.jpg"),
-                  new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"),
-                  new Towns("Risca",02,2,90,"/images/RiscaBanner.jpg"),
-                  new Towns("Penarth",03,5,100,"/images/PenarthBanner.jpg")
-
-
-
-          )
-
-        );
-
-    }
-    public static TownStorage getInstance() {
-        if (singleton == null) {
-            singleton = new TownStorage();
-
-        }
-        return singleton;
-    }
-
-    public List<Towns> getTownList() {
-        return townList;
-    }
-
-
-
-
-}
diff --git a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java b/src/main/java/Team5/SmartTowns/data/DatabaseController.java
similarity index 76%
rename from src/main/java/Team5/SmartTowns/Data/DatabaseController.java
rename to src/main/java/Team5/SmartTowns/data/DatabaseController.java
index 6c6b60ed7193d71db2d97022c9141c6b0951d608..77853b538d790d9db467f39967884f7887941343 100644
--- a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java
+++ b/src/main/java/Team5/SmartTowns/data/DatabaseController.java
@@ -1,7 +1,5 @@
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
-import Team5.SmartTowns.users.User;
-import Team5.SmartTowns.users.UserRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -11,17 +9,19 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.*;
+
 @Controller
 public class DatabaseController {
+
     @Autowired
-    private locationRepository locationRepository;
+    private LocationRepository locationRepository;
     @Autowired
-    private trailsRepository trailsRepository;
+    private TrailsRepository trailsRepository;
 
     @GetMapping("/trailList")
     public ModelAndView trailList() {
         ModelAndView mav1 = new ModelAndView("towns/trailsData");
-        List<trail> trail = trailsRepository.getAllTrails();
+        List<Trail> trail = trailsRepository.getAllTrails();
         mav1.addObject("trails", trail);
         return mav1;
     }
diff --git a/src/main/java/Team5/SmartTowns/Data/Location.java b/src/main/java/Team5/SmartTowns/data/Location.java
similarity index 97%
rename from src/main/java/Team5/SmartTowns/Data/Location.java
rename to src/main/java/Team5/SmartTowns/data/Location.java
index 01ba2932c6b7d0a6201aa8128161bf7ad8b27526..c733d9b9a487ea290b0dfcab6618c0134dd438f5 100644
--- a/src/main/java/Team5/SmartTowns/Data/Location.java
+++ b/src/main/java/Team5/SmartTowns/data/Location.java
@@ -1,5 +1,5 @@
 //Holds variable data for the locations table (landmarks)
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepository.java b/src/main/java/Team5/SmartTowns/data/LocationRepository.java
similarity index 67%
rename from src/main/java/Team5/SmartTowns/Data/locationRepository.java
rename to src/main/java/Team5/SmartTowns/data/LocationRepository.java
index 822a18cb860654694734c7f591cbb5b216eb8a39..a8c8ca81722933a480cefabacd8a863ff2b2524b 100644
--- a/src/main/java/Team5/SmartTowns/Data/locationRepository.java
+++ b/src/main/java/Team5/SmartTowns/data/LocationRepository.java
@@ -1,12 +1,11 @@
 //Holds locations data repository (landmarks)
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import java.util.List;
 
 
-public interface locationRepository {
+public interface LocationRepository {
     List<Location> getAllLocation();
     void addLocation(Location loc);
 
-
 }
diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java
similarity index 90%
rename from src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java
rename to src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java
index a5e79d4442d540f5dba67ee7f2b6217984044ebb..e9c23c1510241f1b4934dff0434bcaecdf1a0ed1 100644
--- a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java
+++ b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java
@@ -1,5 +1,5 @@
 //Implements the locations repository using JDBC
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
@@ -8,11 +8,11 @@ import org.springframework.stereotype.Repository;
 import java.util.List;
 
 @Repository
-public class locationRepositoryJDBC implements locationRepository {
+public class LocationRepositoryJDBC implements LocationRepository {
     private JdbcTemplate jdbc;
     private RowMapper<Location> locationMapper;
 
-    public locationRepositoryJDBC(JdbcTemplate aJdbc) {
+    public LocationRepositoryJDBC(JdbcTemplate aJdbc) {
         this.jdbc = aJdbc;
         setlocationMapper();
     }
diff --git a/src/main/java/Team5/SmartTowns/Data/MockUser.java b/src/main/java/Team5/SmartTowns/data/MockUser.java
similarity index 71%
rename from src/main/java/Team5/SmartTowns/Data/MockUser.java
rename to src/main/java/Team5/SmartTowns/data/MockUser.java
index 48748a17a4ac6fe230ee7f12119d5c71ab73839a..344dbbd77e6aeba32c362c4955c87464125ab0e4 100644
--- a/src/main/java/Team5/SmartTowns/Data/MockUser.java
+++ b/src/main/java/Team5/SmartTowns/data/MockUser.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
@@ -8,8 +8,8 @@ import java.util.List;
 public class MockUser {
 
     private JdbcTemplate jdbc;
-    private RowMapper<trail> trailMapper;
-    public List<trail> getAllTrails(){
+    private RowMapper<Trail> trailMapper;
+    public List<Trail> getAllTrails(){
         String sql= "SELECT * FROM trails";
         return jdbc.query(sql, trailMapper);
     }
diff --git a/src/main/java/Team5/SmartTowns/data/QRCodes.java b/src/main/java/Team5/SmartTowns/data/QRCodes.java
new file mode 100644
index 0000000000000000000000000000000000000000..28ebf97c96d884a6629208ce8ce58505334b63b6
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/QRCodes.java
@@ -0,0 +1,4 @@
+package Team5.SmartTowns.data;
+
+public class QRCodes {
+}
diff --git a/src/main/java/Team5/SmartTowns/Data/trail.java b/src/main/java/Team5/SmartTowns/data/Trail.java
similarity index 77%
rename from src/main/java/Team5/SmartTowns/Data/trail.java
rename to src/main/java/Team5/SmartTowns/data/Trail.java
index 86e78b96712ecf7a5756edbf20a4bae35839ca70..1a44d9270405a05ce9d8f97b3ddd2a43cc6b9653 100644
--- a/src/main/java/Team5/SmartTowns/Data/trail.java
+++ b/src/main/java/Team5/SmartTowns/data/Trail.java
@@ -1,12 +1,12 @@
 //Holds variable data for the trails table
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 
 @Data
 @AllArgsConstructor
-public class trail {
+public class Trail {
     private int trailsId;
     private String name;
 }
diff --git a/src/main/java/Team5/SmartTowns/data/TrailsRepository.java b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..d25e6fd62efdfdb4d743c829eeab5ddfeb5119d0
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java
@@ -0,0 +1,8 @@
+//Holds trails data repository
+package Team5.SmartTowns.data;
+
+import java.util.List;
+
+public interface TrailsRepository {
+    List<Trail> getAllTrails();
+}
diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
similarity index 66%
rename from src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java
rename to src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
index 58aa84a95b00b8f8b5d7f97d240e04f405d2ac3b..3acf61c405688ac7a40536bafd38f4a0a92bfaec 100644
--- a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java
+++ b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
@@ -1,5 +1,5 @@
 //Implements the trails repository using JDBC
-package Team5.SmartTowns.Data;
+package Team5.SmartTowns.data;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
@@ -8,20 +8,20 @@ import org.springframework.stereotype.Repository;
 import java.util.List;
 
 @Repository
-public class trailsRepositoryJDBC implements trailsRepository{
+public class TrailsRepositoryJDBC implements TrailsRepository {
     private JdbcTemplate jdbc;
-    private RowMapper<trail> trailMapper;
-        public trailsRepositoryJDBC(JdbcTemplate aJdbc){
+    private RowMapper<Trail> trailMapper;
+        public TrailsRepositoryJDBC(JdbcTemplate aJdbc){
         this.jdbc = aJdbc;
         settrailsMapper();
     }
     private void settrailsMapper(){
-        trailMapper = (rs, i) -> new trail(
+        trailMapper = (rs, i) -> new Trail(
                 rs.getInt("trailID"),
                 rs.getString("name")
         );
     }
-    public List<trail> getAllTrails(){
+    public List<Trail> getAllTrails(){
         String sql= "SELECT * FROM trails";
         return jdbc.query(sql, trailMapper);
     }
diff --git a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
similarity index 93%
rename from src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java
rename to src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
index f1c7b5fc264d29d3b0179b558d3df6b7e8bdc974..6974c1e997c5b2dd6d7396f44ea0cbe4565331c7 100644
--- a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java
+++ b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
@@ -1,8 +1,6 @@
-package Team5.SmartTowns.Landmarks;
+package Team5.SmartTowns.landmarks;
 
-import Team5.SmartTowns.trails.Trail;
 import jakarta.validation.constraints.Email;
-import jakarta.validation.constraints.Min;
 import jakarta.validation.constraints.NotEmpty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
similarity index 91%
rename from src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java
rename to src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
index a94feef88935a8d3ca71f6326bdb8f44cda6dd0e..630740b580a1e81c91838b8b97c20c0d90132167 100644
--- a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java
+++ b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
@@ -1,7 +1,7 @@
-package Team5.SmartTowns.Landmarks;
+package Team5.SmartTowns.landmarks;
 
-import Team5.SmartTowns.Data.Location;
-import Team5.SmartTowns.Data.locationRepository;
+import Team5.SmartTowns.data.Location;
+import Team5.SmartTowns.data.LocationRepository;
 import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -26,7 +26,7 @@ public class LandmarksController {
     }
 
     @Autowired
-    private locationRepository locationRepository;
+    private LocationRepository locationRepository;
     @PostMapping("/landmarkSub")
     public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) {
 
diff --git a/src/main/java/Team5/SmartTowns/rewards/Badge.java b/src/main/java/Team5/SmartTowns/rewards/Badge.java
index 25c231e14e3f0afdd4ecfc2d6e9f352925224097..976238804f5686bfd77e2bd028f7cc79ecf18698 100644
--- a/src/main/java/Team5/SmartTowns/rewards/Badge.java
+++ b/src/main/java/Team5/SmartTowns/rewards/Badge.java
@@ -1,51 +1,26 @@
 /*AUTHOR: Gabriel Copat*/
 package Team5.SmartTowns.rewards;
 
-import lombok.Data;
+import lombok.Getter;
 
-import java.io.File;
-import java.util.Objects;
 
-@Data
-public class Badge {
+@Getter
+public class Badge extends Reward {
     /* Badges can be earned by completing certain goals.
      * They are displayed in the user profile page
      *
      * For example, one might earn a badge after visiting 20 locations */
+    static final String DEFAULT_IMAGE = "0.png";
 
-    int id;
-    String name;
-    String description;
-    String imgPath;
     int difficulty; //1-5
 
     public Badge(int id, String name, String description, int difficulty) {
-        this.id = id;
-        this.name = name;
-        this.description = description;
+        super(id, name, description);
         this.difficulty = difficulty;
-        imgPath = findImagePath();
-    }
-
-    private String findImagePath(){
-        /* Finds the image in the Path folder, if image is not found assigns default image */
-        String imgPath = "images/rewards/badges/" + id + ".jpg";
-        String notFoundPath = "/images/rewards/badges/0.png";
-
-        File imgFile = new File("src/main/resources/static/" + imgPath);
-        return imgFile.exists() ? imgPath : notFoundPath;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        Badge badge = (Badge) o;
-        return id == badge.id && Objects.equals(name, badge.name);
     }
 
     @Override
-    public int hashCode() {
-        return Objects.hash(id, name);
+    public String getImgFolder() {
+        return "badges";
     }
 }
diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java
deleted file mode 100644
index 56b1019cbe016a7c687b5ac83973679e8f498eef..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//Holds locations data repository
-package Team5.SmartTowns.rewards;
-
-import java.util.List;
-
-public interface BadgesRepository {
-    List<Badge> getAllBadges();
-}
-
diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java
deleted file mode 100644
index 7c22061e894a633bf9c047f69f575daf9366b493..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//Implements the locations repository using JDBC
-package Team5.SmartTowns.rewards;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public class BadgesRepositoryJDBC implements BadgesRepository {
-    private JdbcTemplate jdbc;
-    private RowMapper<Badge> badgeMapper;
-
-    public BadgesRepositoryJDBC(JdbcTemplate aJdbc) {
-        this.jdbc = aJdbc;
-        setBadgeMapper();
-    }
-    private void setBadgeMapper(){
-        badgeMapper = (rs, i) -> new Badge(
-                rs.getInt("badgeID"),
-                rs.getString("name"),
-                rs.getString("description"),
-                rs.getInt("difficulty")
-        );
-    }
-
-    @Override
-    public List<Badge> getAllBadges(){
-        String sql= "SELECT * FROM badges";
-        return jdbc.query(sql, badgeMapper);
-    }
-}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Pack.java b/src/main/java/Team5/SmartTowns/rewards/Pack.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef7fe7409f6e4fdfee3494a0dc932981df2c6907
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/Pack.java
@@ -0,0 +1,28 @@
+package Team5.SmartTowns.rewards;
+
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class Pack extends Reward{
+
+    int progression; //0-100%;
+
+    public Pack(int id, String name, String description) {
+        super(id, name, description);
+        displayImg = super.findImagePath();
+    }
+
+    public void setProgression(List<Sticker> packStickers, List<Sticker> userStickers){
+        /* Takes in a list with all stickers in the pack and a list with all userStickers from the pack
+        *  These lists are taken from database in the Controllers via SQL query*/
+        int totalAmount = packStickers.size();
+        int hasAmount = userStickers.size();
+        progression = (int) ((totalAmount/hasAmount) * 100);
+    }
+    @Override
+    public String getImgFolder() {
+        return "packs";
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Reward.java b/src/main/java/Team5/SmartTowns/rewards/Reward.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a2d9145817a6e6935e5cc7dca283c47c491ee53
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/Reward.java
@@ -0,0 +1,37 @@
+package Team5.SmartTowns.rewards;
+
+import lombok.Getter;
+
+import java.io.File;
+
+@Getter
+public abstract class Reward {
+    /* Abstract class for all rewards */
+
+    int id;
+    String displayImg; //Path to the image file
+    String name;
+    String description;
+
+    public Reward(int id, String name, String description) {
+        //Default constructor
+        this.id = id;
+        this.name = name;
+        this.description = description;
+    }
+
+    public abstract String getImgFolder();
+    /*Returns folder in which images are located*/
+
+    public String getDefaultImg(){
+        /*Returns the name of the default image to be used in case no image is found*/
+        return "0.png";
+    }
+    public String findImagePath(){
+        /* Finds the image in the Path folder, if image is not found assigns default image */
+        String imgPath = "images/rewards/" + getImgFolder() + "/" + id + ".png";
+        String notFoundPath = "images/rewards/" + getImgFolder() + "/" + getDefaultImg();
+        File imgFile = new File("src/main/resources/static/" + imgPath);
+        return imgFile.exists() ? imgPath : notFoundPath;
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java b/src/main/java/Team5/SmartTowns/rewards/RewardsController.java
deleted file mode 100644
index af9d33cba34dd12ac6aa5ca1e54320b8124af9d4..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package Team5.SmartTowns.rewards;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class RewardsController {
-}
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..51bde7f297613873b38b0eec939f58d9c1dc1acd
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java
@@ -0,0 +1,18 @@
+//Holds locations data repository
+package Team5.SmartTowns.rewards;
+
+import java.util.List;
+
+public interface RewardsRepository {
+    List<Sticker> getAllStickers();
+
+    List<Sticker> getAllStickersFromPack(int packID);
+
+    List<Sticker> getAllStickersFromUser(int userID);
+
+    List<Pack> getAllPacks();
+
+    Pack findPackByID(int id);
+
+}
+
diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java
new file mode 100644
index 0000000000000000000000000000000000000000..65eaa9843ec3af33e994ea34ed8d219ce712ffaf
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java
@@ -0,0 +1,73 @@
+//Implements the locations repository using JDBC
+package Team5.SmartTowns.rewards;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class RewardsRepositoryJDBC implements RewardsRepository {
+    private final JdbcTemplate jdbc;
+    private RowMapper<Badge> badgeMapper;
+    private RowMapper<Sticker> stickerMapper;
+    private RowMapper<Pack> packMapper;
+
+    public RewardsRepositoryJDBC(JdbcTemplate aJdbc) {
+        this.jdbc = aJdbc;
+        setStickerMapper();
+        setPackMapper();
+    }
+
+    private void setStickerMapper(){
+        stickerMapper = (rs, i) -> new Sticker(
+                rs.getInt("packID"),
+                rs.getInt("stickerID"),
+                rs.getString("name"),
+                rs.getString("description"),
+                rs.getInt("rarity")
+        );
+    }
+    private void setPackMapper(){
+        packMapper = (rs, i) -> new Pack(
+                rs.getInt("id"),
+                rs.getString("name"),
+                rs.getString("description")
+        );
+    }
+
+    @Override
+    public List<Sticker> getAllStickers(){
+        String sql= "SELECT * FROM stickers";
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public List<Pack> getAllPacks() {
+        String sql= "SELECT * FROM packs";
+        return jdbc.query(sql, packMapper);
+    }
+
+    @Override
+    public List<Sticker> getAllStickersFromPack(int packID){
+        String sql= "SELECT * FROM stickers WHERE packID="+packID;
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public List<Sticker> getAllStickersFromUser(int userID) {
+        /* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */
+        String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " +
+                "ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " +
+                "WHERE stickerprogress.userID="+userID;
+        return jdbc.query(sql, stickerMapper);
+    }
+
+    @Override
+    public Pack findPackByID(int id){
+        String sql= "SELECT * FROM packs WHERE id="+id;
+        List<Pack> result = jdbc.query(sql, packMapper);
+        return result.isEmpty() ? null : result.get(0);
+    }
+}
diff --git a/src/main/java/Team5/SmartTowns/rewards/Sticker.java b/src/main/java/Team5/SmartTowns/rewards/Sticker.java
index 4fa498c61e7d5748e7d6dcfc26c7c6442dfd8cc4..7e5315c651bea73aa31572856710b21bbc25457b 100644
--- a/src/main/java/Team5/SmartTowns/rewards/Sticker.java
+++ b/src/main/java/Team5/SmartTowns/rewards/Sticker.java
@@ -1,37 +1,29 @@
 /*AUTHOR: Gabriel Copat*/
 package Team5.SmartTowns.rewards;
 
-import lombok.Data;
+import lombok.Getter;
 
-import java.io.File;
-import java.util.Objects;
 
-@Data
-public class Sticker {
-    /* Stickers are trade-able rewards, they vary in rarity and are earned at random */
+@Getter
+public class Sticker extends Reward{
+    /* Stickers are randomly earned rewards from a specific pack */
+
+    final int rarity; //1-5
+    final int packID;
 
-    int id;
-    String name;
-    String description;
-    String imgPath;
-    int rarity; //1-5
     boolean hasSticker;
 
-    public Sticker(int id, String name, String description, int rarity) {
-        this.id = id;
-        this.name = name;
-        this.description = description;
+
+    public Sticker(int packID, int id, String name, String description, int rarity) {
+        super(id, name, description);
         this.rarity = rarity;
-        imgPath = findImagePath();
+        this.packID = packID;
+        displayImg = super.findImagePath();
     }
 
-    private String findImagePath(){
-        /* Finds the image in the Path folder, if image is not found assigns default image */
-        String imgPath = "images/rewards/stickers/" + id + ".jpg";
-        String notFoundPath = "images/rewards/stickers/0.png";
-
-        File imgFile = new File("src/main/resources/static/" + imgPath);
-        return imgFile.exists() ? imgPath : notFoundPath;
+    @Override
+    public String getImgFolder() {
+        return "stickers/" + getPackID();
     }
 
     public boolean hasSticker(){
@@ -41,21 +33,7 @@ public class Sticker {
         this.hasSticker = hasSticker;
     }
     public String getVisibility(){
-        return hasSticker? "" : "grayedOut";
-    }
-
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        Sticker sticker = (Sticker) o;
-        return id == sticker.id && Objects.equals(name, sticker.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, name);
+        return hasSticker ? "gotSticker" : "grayedSticker";
     }
 }
 
diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java
deleted file mode 100644
index 869c2d07353a7aa090fb7fee79b2d44feacd9b12..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//Holds locations data repository
-package Team5.SmartTowns.rewards;
-
-import java.util.List;
-
-public interface StickersRepository {
-    List<Sticker> getAllStickers();
-}
-
diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java
deleted file mode 100644
index 64df71bc3da3eff327377798185111aee3be7867..0000000000000000000000000000000000000000
--- a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//Implements the locations repository using JDBC
-package Team5.SmartTowns.rewards;
-
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public class StickersRepositoryJDBC implements StickersRepository {
-    private JdbcTemplate jdbc;
-    private RowMapper<Sticker> stickerMapper;
-
-    public StickersRepositoryJDBC(JdbcTemplate aJdbc) {
-        this.jdbc = aJdbc;
-        setStickerMapper();
-    }
-    private void setStickerMapper(){
-        stickerMapper = (rs, i) -> new Sticker(
-                rs.getInt("stickerID"),
-                rs.getString("name"),
-                rs.getString("description"),
-                rs.getInt("rarity")
-        );
-    }
-
-    @Override
-    public List<Sticker> getAllStickers(){
-        String sql= "SELECT * FROM stickers";
-        return jdbc.query(sql, stickerMapper);
-    }
-}
diff --git a/src/main/java/Team5/SmartTowns/Towns/TownController.java b/src/main/java/Team5/SmartTowns/towns/TownController.java
similarity index 94%
rename from src/main/java/Team5/SmartTowns/Towns/TownController.java
rename to src/main/java/Team5/SmartTowns/towns/TownController.java
index aa15a341da7fe2ef346f5278ae1a55faaa3136fc..9063712be2de660379c504bb064254367dcaa3d8 100644
--- a/src/main/java/Team5/SmartTowns/Towns/TownController.java
+++ b/src/main/java/Team5/SmartTowns/towns/TownController.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Towns;
+package Team5.SmartTowns.towns;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
diff --git a/src/main/java/Team5/SmartTowns/towns/TownStorage.java b/src/main/java/Team5/SmartTowns/towns/TownStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..988a20223b33d27fbccab94007a1efb6e3088bbb
--- /dev/null
+++ b/src/main/java/Team5/SmartTowns/towns/TownStorage.java
@@ -0,0 +1,44 @@
+package Team5.SmartTowns.towns;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TownStorage {
+    private List<Towns> townList;
+    private static TownStorage singleton;
+
+    TownStorage() {
+        townList = new ArrayList<>();
+        townList.addAll(
+          List.of(
+                  new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"),
+                  new Towns("Risca",02,2,34,"/images/banners/RiscaBanner.jpg"),
+                  new Towns("Penarth",03,5,0,"/images/banners/PenarthBanner.jpg"),
+                  new Towns("Penarth",03,5,50,"/images/banners/PenarthBanner.jpg"),
+                  new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"),
+                  new Towns("Risca",02,2,90,"/images/banners/RiscaBanner.jpg"),
+                  new Towns("Penarth",03,5,100,"/images/banners/PenarthBanner.jpg")
+
+
+
+          )
+
+        );
+
+    }
+    public static TownStorage getInstance() {
+        if (singleton == null) {
+            singleton = new TownStorage();
+
+        }
+        return singleton;
+    }
+
+    public List<Towns> getTownList() {
+        return townList;
+    }
+
+
+
+
+}
diff --git a/src/main/java/Team5/SmartTowns/Towns/Towns.java b/src/main/java/Team5/SmartTowns/towns/Towns.java
similarity index 97%
rename from src/main/java/Team5/SmartTowns/Towns/Towns.java
rename to src/main/java/Team5/SmartTowns/towns/Towns.java
index a1b103f7abf6aa4379d877c645185f2c522a25ba..ebe6fd4797c205ace803727026e64837a2af93e6 100644
--- a/src/main/java/Team5/SmartTowns/Towns/Towns.java
+++ b/src/main/java/Team5/SmartTowns/towns/Towns.java
@@ -1,4 +1,4 @@
-package Team5.SmartTowns.Towns;
+package Team5.SmartTowns.towns;
 
 import lombok.Data;
 
diff --git a/src/main/java/Team5/SmartTowns/trails/TrailsController.java b/src/main/java/Team5/SmartTowns/trails/TrailsController.java
index 004fdabd4e836fb7e4110f8d3f63bad76fb8b3d4..c6472019b4e17f3ff6aa4c60188ad524bfc10010 100644
--- a/src/main/java/Team5/SmartTowns/trails/TrailsController.java
+++ b/src/main/java/Team5/SmartTowns/trails/TrailsController.java
@@ -1,7 +1,7 @@
 package Team5.SmartTowns.trails;
 
 
-import Team5.SmartTowns.Landmarks.Landmarks;
+import Team5.SmartTowns.landmarks.Landmarks;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
@@ -11,7 +11,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-import static Team5.SmartTowns.Landmarks.Landmarks.landmarksDragonstrail;
+import static Team5.SmartTowns.landmarks.Landmarks.landmarksDragonstrail;
 
 //import static Team5.SmartTowns.Landmarks.Landmarks.landmarksDragonstrail;
 
diff --git a/src/main/java/Team5/SmartTowns/users/User.java b/src/main/java/Team5/SmartTowns/users/User.java
index 1e13ad566cc794c429ee93bdcac0dd22acce5b5d..4ef65c3b288f9433e37d60e8e984b869f3a8d53e 100644
--- a/src/main/java/Team5/SmartTowns/users/User.java
+++ b/src/main/java/Team5/SmartTowns/users/User.java
@@ -17,7 +17,6 @@ public class User {
     String name;
     String imgPath;
     int dragonProgress;
-    Map<Badge, Integer> badgeProgress = new HashMap<>(); // Demonstrates the progress towards a specific badge (0-100)
     Map<Sticker, Boolean> hasStickers = new HashMap<>(); // True if User has sticker (key)
     Map<Integer, Boolean> dragonstaleLandmarkIDs = new HashMap<>(); // Storing the IDs of the landmarks associated with Dragonstale, as well as if the user has visited it before (boolean)
 
@@ -26,7 +25,12 @@ public class User {
         this.email = email;
         this.name = name;
         this.dragonProgress = dragonProgress;
-//        this.dragonstaleLandmarkIDs = dragonstaleLandmarkIDs;
+        imgPath = findImagePath();
+    }
+    public User(int id, String email, String name) {
+        this.id = id;
+        this.email = email;
+        this.name = name;
         imgPath = findImagePath();
     }
 
diff --git a/src/main/java/Team5/SmartTowns/users/UserController.java b/src/main/java/Team5/SmartTowns/users/UserController.java
index d635c8a401d85ef6d930142882d69b5528f38fd7..989d13b7161f783dc75bdcb9dbf379808b1584e4 100644
--- a/src/main/java/Team5/SmartTowns/users/UserController.java
+++ b/src/main/java/Team5/SmartTowns/users/UserController.java
@@ -1,10 +1,9 @@
 package Team5.SmartTowns.users;
 
 
-import Team5.SmartTowns.rewards.Badge;
-import Team5.SmartTowns.rewards.BadgesRepository;
+import Team5.SmartTowns.rewards.Pack;
+import Team5.SmartTowns.rewards.RewardsRepository;
 import Team5.SmartTowns.rewards.Sticker;
-import Team5.SmartTowns.rewards.StickersRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.servlet.ModelAndView;
 
 import java.util.List;
-import java.util.Map;
 
 @Controller
 public class UserController {
@@ -20,13 +18,11 @@ public class UserController {
     @Autowired
     private UserRepository userRepository;
     @Autowired
-    private BadgesRepository badgesRepository;
-    @Autowired
-    private StickersRepository stickersRepository;
+    private RewardsRepository rewardsRepository;
 
     @GetMapping("/login")
     public ModelAndView getLoginPage() {
-        ModelAndView mav = new ModelAndView("rewards/login");
+        ModelAndView mav = new ModelAndView("users/login");
 //        List<User> users = userRepository.getAllUsers();
 //        mav.addObject("users", users);
         return mav;
@@ -42,21 +38,52 @@ public class UserController {
 
     @GetMapping("/user/{id}")
     public ModelAndView getUserPage(@PathVariable int id) {
-        ModelAndView mav = new ModelAndView("rewards/userProfile");
-        List<Badge> badges = badgesRepository.getAllBadges(); /*DEPRECATED FOR THE MOMENT*/
-        mav.addObject("badges", badges);
-        List<Sticker> allStickers = stickersRepository.getAllStickers();
-        List<User> users = userRepository.getAllUsers();
-        Map<Long, Boolean> userStickers = userRepository.getStickers(id);
+        ModelAndView mav = new ModelAndView("users/userProfile");
+        List<Pack> allPacks = rewardsRepository.getAllPacks();
+        mav.addObject("user", userRepository.getUserById(id));
+        mav.addObject("packs", allPacks);
 
-        for (Long stickerID : userStickers.keySet()) { //Finds and updates visibility of stickers based on what the user has
-            allStickers.stream()
-                    .filter(sticker -> sticker.getId()==stickerID)
-                    .findFirst().ifPresent(sticker -> sticker.setVisibility(userStickers.get(stickerID)));
-        }
+        mav.addAllObjects(getPackInfo(id, 1).getModelMap());
 
-        mav.addObject("user", userRepository.getUser(id));
-        mav.addObject("stickers", allStickers);
         return mav;
     }
+
+    @GetMapping("/packInfo/{userID}/{packID}")
+    public ModelAndView getPackInfo(@PathVariable int userID, @PathVariable int packID) {
+        /* Displays on page the stickers present in the pack and colour the ones the
+        *  user has acquired */
+
+        ModelAndView mav = new ModelAndView("users/userFrags :: stickersBox");
+        List<Sticker> allStickers = rewardsRepository.getAllStickersFromPack(packID);
+        List<Long> userStickers = userRepository.getUserStickersFromPack(userID, packID);
+
+
+
+        mav.addObject("stickers", setStickerVisibility(allStickers, userStickers));
+        mav.addObject("progress", getPackProgress(allStickers));
+        mav.addObject("selectedPack", rewardsRepository.findPackByID(packID));
+        return mav;
+    }
+
+    public int getPackProgress(List<Sticker> userStickers){
+        /* Returns the % of completion of given userStickers */
+        double progress = 0;
+        if (!userStickers.isEmpty()) {
+            progress = userStickers.stream().filter(Sticker::hasSticker).count();
+            progress = progress / userStickers.size();
+            progress = Math.round(progress * 100);
+        }
+        return (int) progress;
+    }
+
+    public List<Sticker> setStickerVisibility(List<Sticker> displayedStickers, List<Long> userStickers){
+        /* Makes displayedStickers which are present in userStickers visible */
+        for (Long stickerID : userStickers) {
+            displayedStickers.stream()
+                    .filter(sticker -> sticker.getId()==stickerID) //Tries to find matching id from the two lists
+                    .findFirst().ifPresent(sticker -> sticker.setVisibility(true));
+        }
+        return displayedStickers;
+    }
+
 }
diff --git a/src/main/java/Team5/SmartTowns/users/UserRepository.java b/src/main/java/Team5/SmartTowns/users/UserRepository.java
index c6cca35048256beb897a69a9bf67a6087d836e28..f0f01269786128dd9afaa8d3becd5b3ada4944fa 100644
--- a/src/main/java/Team5/SmartTowns/users/UserRepository.java
+++ b/src/main/java/Team5/SmartTowns/users/UserRepository.java
@@ -2,13 +2,10 @@
 package Team5.SmartTowns.users;
 
 import java.util.List;
-import java.util.Map;
 
 public interface UserRepository {
     List<User> getAllUsers();
-//    Map<Long, Integer> getBadgeProgress(int id);
-    Map<Long, Boolean> getStickers(int id);
-//    Map<Integer, Boolean> getTest(int id);
-//    Map<Long, Boolean> getDTCompletion(int id);
-    User getUser(int id);
+    List<Long> getUserStickersFromPack(int userID, int packID);
+    User getUserById(int userID);
+    boolean unlockSticker(int userID, int packID, int stickerID);
 }
diff --git a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
index 93b0cf5de2a9c533be5bda7e17b24cd0585dec3c..8b46fc3a568455e91c180b66fc91b65f20d20c81 100644
--- a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
+++ b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java
@@ -7,7 +7,6 @@ import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 @Repository
 public class UserRepositoryJDBC implements UserRepository{
@@ -21,10 +20,9 @@ public class UserRepositoryJDBC implements UserRepository{
 
     private void setUserMapper(){
         userMapper = (rs, i) -> new User(
-                rs.getInt("userID"),
+                rs.getInt("id"),
                 rs.getString("email"),
-                rs.getString("name"),
-                rs.getInt("dragonProgress")
+                rs.getString("name")
         );
     }
 
@@ -36,44 +34,23 @@ public class UserRepositoryJDBC implements UserRepository{
 
 
     @Override
-    public User getUser(int id){
-        String sql= "SELECT * FROM users WHERE userID="+id;
+    public User getUserById(int userID){
+        String sql= "SELECT * FROM users WHERE id="+userID;
         List<User> result = jdbc.query(sql, userMapper);
-        return result.get(0);
+        return result.isEmpty() ? null : result.get(0);
     }
 
     @Override
-    public Map<Long, Boolean> getStickers(int id){
-        String sql = "SELECT stickerID, hasSticker FROM stickerprogress WHERE userID=" + id;
-        List<Map<String, Object>> query = jdbc.queryForList(sql);
-        Map<Long, Boolean> progress = new HashMap<>();
-        for (Map<String, Object> result : query) {
-            progress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker"));
-        }
-        return progress;
+    public List<Long> getUserStickersFromPack(int userID, int packID) {
+        String sql = "SELECT stickerID FROM stickerprogress WHERE (userID, packID)= (" + userID + "," + packID + ")";
+        return jdbc.queryForList(sql, Long.class);
     }
 
-//    @Override
-//    public Map<Long, Boolean> getDTCompletion(int id){
-//        //Using prepared statement to prevent SQL injections
-//        String sql = "SELECT userid, qrCodeSCAN FROM testuser WHERE userID= ?";
-//        List<Map<String, Object>> dtQuery = jdbc.queryForList(sql, id);
-//        Map<Long, Boolean> dtProgress = new HashMap<>();
-//        for (Map<String, Object> result : dtQuery) {
-//            dtProgress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker"));
-//        }
-//        return dtProgress;
-//    }
-
-
-//    @Override
-//    public Map<Long, Integer> getBadgeProgress(int id){
-//        String sql = "SELECT badgeID, progress FROM badgeprogress WHERE userID=" + id;
-//        List<Map<String, Object>> query = jdbc.queryForList(sql);
-//        Map<Long, Integer> progress = new HashMap<>();
-//        for (Map<String, Object> result : query) {
-//            progress.put((Long)result.get("badgeID"), (int)result.get("progress"));
-//        }
-//        return progress;
-//    }
+    @Override
+    public boolean unlockSticker(int userID, int packID, int stickerID){
+        String sql = "INSERT INTO stickerprogress (userID, packID, stickerID) VALUES (" +
+                userID + ", " + packID + "," + stickerID + ")";
+        jdbc.update(sql);
+        return true;
+    }
 }
diff --git a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java
similarity index 55%
rename from src/main/java/Team5/SmartTowns/Webpages/WebpageController.java
rename to src/main/java/Team5/SmartTowns/webpages/WebpageController.java
index 37a30366e5335d1870c202d1a49b4a5d2bca474d..7cb5243f41e420e1640d5419fb39524df543761d 100644
--- a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java
+++ b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java
@@ -1,10 +1,7 @@
-package Team5.SmartTowns.Webpages;
+package Team5.SmartTowns.webpages;
 
 
-import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.stereotype.Controller;
 @Controller
@@ -26,20 +23,4 @@ public class WebpageController {
         ModelAndView modelAndView = new ModelAndView("Towns/risca");
         return modelAndView;
     }
-
-//    @GetMapping("/home")
-//    public ModelAndView getHome(){
-//        ModelAndView modelAndView = new ModelAndView("Towns/home/homePage");
-//        return modelAndView;
-//    }
-
-
-    @RequestMapping(value="/test_ajax_frag", method=RequestMethod.POST)
-    public String sendHtmlFragment(Model map) {
-        //map.addAttribute("foo", "bar");
-        return "fragments/temp_frags.html :: trailInfo2";
-    }
-
-
-
 }
diff --git a/src/main/resources/QRCodeScanner.html b/src/main/resources/QRCodeScanner.html
deleted file mode 100644
index 11da0658b1421e28159c97fc5abae82030ff3630..0000000000000000000000000000000000000000
--- a/src/main/resources/QRCodeScanner.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>QR Camera</title>
-</head>
-<body>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 40fefacad3c479dd900e3952793535612f2ed229..830f9672f0c4bb7c103027a2470d87fb15d259cd 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -1,6 +1,6 @@
 delete from users;
-insert into users (email, name, dragonProgress) value ('hannah@gmail.com', 'Hannah', '90');
-insert into users (userID, email, name, dragonProgress) value ('2', 'nigel@gmail.com', 'Nigel', '40');
+insert into users (email, name) value ('hannah@gmail.com', 'Hannah');
+insert into users (email, name) value ('nigel@gmail.com', 'Nigel');
 
 delete from trails;
 insert into trails ( Name) value ( 'Caerphilly Coffee Trail');
@@ -32,26 +32,32 @@ insert into locations ( locationName , locationEmail,locationDescription,locatio
 
 insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (19, 'The Esplanade','','Location description here','Penarth',0301);
 insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (20, 'The Old Swimming Baths','','Location description here','Penarth',0301);
-delete from badges;
-insert into badges (name, description, difficulty) value ('TownConnoisseur', 'You know the town very well!', '2');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownMaster', 'You visited the town 7 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
 
-delete from stickers;
-insert into stickers (name, description, rarity) value ('TownConnoisseur', 'You know the town very well!', '2');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownMaster', 'You visited the town 7 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
-insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1');
 
-delete from badgeprogress;
-insert into badgeprogress (userID, badgeID, progress) value ('1', '1', '40');
-insert into badgeprogress (userID, badgeID, progress) value ('1', '2', '70');
-insert into badgeprogress (userID, badgeID, progress) value ('2', '2', '70');
+delete from packs;
+insert into packs (name, description) value ('Wales Football Team', 'Pack of Welsh Football Players in the National Team');
+insert into packs (name, description) value ('Wales Rugby Team', 'Pack of Welsh Rugby Players in the National Team');
+insert into packs (name, description) value ('Welsh Heritage', 'Pack About Welsh Heritage');
+
+delete from stickers;
+insert into stickers (packID, stickerID, name, description, rarity) value (1, 1, 'wayne_hennessey', 'Wales Football Team Player', '2');
+insert into stickers (packID, stickerID, name, description, rarity) value (1, 2, 'neco_williams', 'Wales Football Team Player', '2');
+insert into stickers (packID, stickerID, name, description, rarity) value (1, 3, 'joe_morrell', 'Wales Football Team Player', '2');
+insert into stickers (packID, stickerID, name, description, rarity) value (1, 4, 'ethan_ampadu', 'Wales Football Team Player', '2');
+insert into stickers (packID, stickerID, name, description, rarity) value (1, 5, 'connor_roberts', 'Wales Football Team Player', '2');
+insert into stickers (packID, stickerID, name, description, rarity) value (2, 1, 'Taine_Basham', 'Wales Rugby Team Player', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (2, 2, 'Adam Beard', 'Wales Rugby Team Player', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (2, 3, 'Elliot Dee', 'Wales Rugby Team Player', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (2, 4, 'Corey Domachowski', 'Wales Rugby Team Player', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (2, 5, 'Ryan Elias', 'Wales Rugby Team Player', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (3, 1, 'Welsh Lady', 'Welsh Heritage', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (3, 2, 'Welsh Outline', 'Welsh Heritage', '1');
+insert into stickers (packID, stickerID, name, description, rarity) value (3, 3, 'Welsh Spoon', 'Welsh Heritage', '1');
 
 delete from stickerprogress;
-insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '1', true);
-insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '3', true);
-insert into stickerprogress (userID, stickerID, hasSticker) value ('2', '2', true);
+insert into stickerprogress (userID, packID, stickerID) value (1, 1, 1);
+insert into stickerprogress (userID, packID, stickerID) value (1, 1, 2);
+insert into stickerprogress (userID, packID, stickerID) value (1, 1, 3);
+insert into stickerprogress (userID, packID, stickerID) value (1, 1, 5);
+insert into stickerprogress (userID, packID, stickerID) value (1, 2, 1);
+insert into stickerprogress (userID, packID, stickerID) value (1, 2, 3);
\ No newline at end of file
diff --git a/src/main/resources/index.html b/src/main/resources/index.html
deleted file mode 100644
index 489349d1b63d75904028b48ddd4eb36d29f63650..0000000000000000000000000000000000000000
--- a/src/main/resources/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Home Page</title>
-</head>
-<body>
-<h1>Welcome to the home page</h1>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index 44b983453ce1552774bb0a8529fffb3d18ce4276..b5908000f5460b1c03f7531b5615a19f9c5e5d01 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -17,45 +17,48 @@ create table if not exists locations
     locationTrailID varchar(128)
 )   engine=InnoDB;
 
+
 drop table if exists users;
+drop table if exists stickers;
+drop table if exists packs;
+drop table if exists stickerProgress;
+
 create table if not exists users
 (
-    userID bigint auto_increment primary key,
+    id bigint auto_increment primary key,
     email varchar(128),
-    name varchar(128),
+    name varchar(30),
     dragonProgress int,
     dragonsLandmarkIDs longtext
 ) engine=InnoDB;
 
-drop table if exists badges;
-create table if not exists badges
+
+create table if not exists packs
 (
-    badgeID bigint auto_increment primary key,
-    name varchar(128),
-    description varchar(128),
-    difficulty bigint
+    id bigint auto_increment primary key,
+    name varchar(20),
+    description text
 ) engine=InnoDB;
 
-drop table if exists stickers;
 create table if not exists stickers
 (
-    stickerID bigint auto_increment primary key,
-    name varchar(128),
-    description varchar(128),
-    rarity bigint
-) engine=InnoDB;
+    id bigint auto_increment primary key,
+    packID bigint,
+    FOREIGN KEY (packID) REFERENCES packs(id)
+        ON DELETE CASCADE
+        ON UPDATE RESTRICT,
+    stickerID bigint, /*STICKER ID NUMBER WITHIN ITS OWN PACK*/
+    name varchar(30),
+    description text,
+    rarity tinyint
 
-drop table if exists badgeProgress;
-create table if not exists badgeProgress
-(
-    userID bigint,
-    badgeID bigint,
-    progress int /*0-100*/
 ) engine=InnoDB;
 
 create table if not exists stickerProgress
 (
+    id bigint auto_increment primary key,
     userID bigint,
-    stickerID bigint,
-    hasSticker boolean /*Has sticker or not*/
-) engine=InnoDB;
\ No newline at end of file
+    packID bigint,
+    stickerID bigint
+
+) engine=InnoDB;
diff --git a/src/main/resources/static/css/userProfile.css b/src/main/resources/static/css/userProfile.css
index 8ceb77b4e82d8c44f9aefdcf9c1f54493771e668..878ab054fc53828cb76726775109ca7d3f4bcc80 100644
--- a/src/main/resources/static/css/userProfile.css
+++ b/src/main/resources/static/css/userProfile.css
@@ -37,13 +37,21 @@
         & p { line-height: 1.1; color: white;}
     }
 }
-
+html{
+    height: 100%;
+    @media only screen and (min-device-width: 1500px) {
+        height: auto;
+    }
+}
 body {
     background: linear-gradient(135deg, #f7e8fd, #9914d1);
-    height: 100svh;
+    height: 100%;
     display: flex;
     flex-direction: column;
     justify-content: space-evenly;
+    @media only screen and (min-device-width: 1500px) {
+        height: auto;
+    }
 }
 main {
     background: linear-gradient(to bottom, #1e1e1e 10%, darkgoldenrod 50%, #1e1e1e 90%);
@@ -55,8 +63,16 @@ main {
     margin-top: 6em;
     padding-inline: 1vw;
     box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh max(1vw, 1em);
-
-
+    transition: all linear 2s;
+    overflow-y: scroll;
+    height: 90%;
+    @media only screen and (min-device-width: 1500px) {
+        padding-inline: 20%;
+        overflow: visible;
+    }
+}
+.rewards {
+    position: relative;
 }
 .userInfo {
     display: flex;
@@ -81,15 +97,16 @@ main {
         box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh 1vw -1vw;
     }
 }
-#badgesBar::-webkit-scrollbar {
+#packsBar::-webkit-scrollbar {
     display: none;
     -ms-scrollbar-darkshadow-color: transparent;
 }
-#badgesBar {
+#packsBar {
+    position: static;
     display: grid;
     grid-template-areas:
         "header"
-        "badges";
+        "packs";
     overflow-x: scroll;
     overflow-y: hidden;
     color: white;
@@ -110,31 +127,54 @@ main {
         height: 1.2em;
 
     }
-    & #allBadgesContainer {
+    & #allPacksContainer {
         margin-top: 3svh;
-        grid-area: badges;
-        height: 10svh;
-        align-content: center;
+        grid-area: packs;
+        height: 12svh;
+        width: 100%;
         display: flex;
+        justify-content: space-between;
         @media only screen and (min-device-width: 501px) {
             height: 20vw;
             margin-top: 6vw;
         }
     }
-    & .badgeImg {
+    & .packContainer{
+        position: relative;
+        height: 12svh;
+        width: 20vw;
+        display: flex;
+        flex-direction: column;
+        text-align: center;
+        justify-content: center;
+        overflow: visible;
+    }
+
+    & .packImg {
+        position: relative;
         margin-inline: 3vw;
         height: 8svh;
+        /*width: 25%;*/
         z-index: 50;
         @media only screen and (min-device-width: 501px) {
             height: 15vw;
         }
         transition: 0.3s ease-out 100ms;
     }
-    & .badgeImg:hover {
+    & .packImg:hover {
         /*box-shadow: 0 0 20px 10px #bbbb00;*/
         transform: scale(1.5,1.5);
 
     }
+    & .packName {
+        height: 4svh;
+        display: flex;
+        justify-content: center;
+        font-size: 2em;
+        overflow: hidden;
+        align-items: flex-end;
+
+    }
 }
 
 #stickersBox {
@@ -145,6 +185,7 @@ main {
     /* border-bottom-right-radius: 2vw; */
     /*background: linear-gradient(to bottom, darkgoldenrod, transparent 90%);*/
     margin-top: -1%;
+    height: 500px;
     & h2 {
         font-size: 4em;
         text-align: center;
@@ -360,4 +401,8 @@ header .footerButton:hover {
     font-size: 0.6em;
     opacity: 0;
     transition: 0.5s ease-in-out 1ms;
+}
+
+.rewards {
+    transition: 1s ease-in-out 1ms;
 }
\ No newline at end of file
diff --git a/src/main/resources/static/css/userProfile2.css b/src/main/resources/static/css/userProfile2.css
new file mode 100644
index 0000000000000000000000000000000000000000..0728cbc6e973473051420fd817d243d5d484c489
--- /dev/null
+++ b/src/main/resources/static/css/userProfile2.css
@@ -0,0 +1,309 @@
+/* AUTHOR: Gabriel Copat*/
+@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap');
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+
+    /*COLOUR PALETTE*/
+    @media (prefers-color-scheme: dark) {
+        --primary-darker: hsl(272, 100%, 10%);
+        --primary-dark: hsl(271, 100%, 20%);
+        --primary-colour: hsl(271, 100%, 30%);
+        --primary-light: hsl(271, 100%, 40%);
+        --primary-lighter: hsl(271, 100%, 50%);
+
+        --secondary-colour: hsl(12, 81%, 46%);
+        --accent-colour: hsl(12, 82%, 32%);
+        --accent-border: hsl(12, 81%, 25%);
+
+        --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em;
+
+        color: white;
+
+    }
+    @media (prefers-color-scheme: light) {
+        --primary-darker: hsl(272, 100%, 10%);
+        --primary-dark: hsl(271, 100%, 20%);
+        --primary-colour: hsl(271, 100%, 30%);
+        --primary-light: hsl(271, 100%, 40%);
+        --primary-lighter: hsl(271, 100%, 50%);
+
+        --secondary-colour: hsl(12, 81%, 46%);
+        --accent-colour: hsl(12, 82%, 32%);
+        --accent-border: hsl(12, 81%, 25%);
+
+        --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em;
+
+        color: white;
+
+
+    }
+}
+
+
+
+/* DEFAULT CSS MADE FOR SCREEN SIZES WIDTHS
+    BETWEEN 320px and 640px:*/
+
+body {
+    background: linear-gradient(to bottom right,
+    var(--primary-darker),
+    var(--primary-dark),
+    var(--primary-darker));
+
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-content: center;
+
+    position: fixed;
+    width: 100vw;
+    height: 100svh;
+}
+
+.grayedSticker {
+    filter: grayscale(1);
+}
+.gotSticker {
+    filter: drop-shadow(0 0 10px yellow);
+}
+
+
+html {
+    position: fixed;
+    width: 100vw;
+    height: 100svh;
+}
+main {
+    width: 90%;
+    height: 95%;
+    background: linear-gradient(to bottom left, #1f1f1f, #1e1e1e, #1f1f1f);
+    overflow-x: hidden;
+    overflow-y: scroll;
+    margin-inline: auto;
+
+    display: flex;
+    flex-direction: column;
+    align-content: flex-start;
+    align-items: center;
+    border-radius: 5vw;
+}
+.userContainer {
+    width: 90%;
+    padding-block: 2em;
+    margin-block: 1em;
+    border-radius: 5vw;
+    display: flex;
+    flex-direction: row-reverse;
+    /*align-items: center;*/
+    justify-content: space-evenly;
+
+    row-gap: 1svh;
+
+    & h1 {
+        font-size: 5em;
+        text-align: center;
+        text-shadow: black 0 0.2em 0.5em;
+        letter-spacing: 0.1em;
+        width: 40vw;
+        max-height: 40vw;
+        /*border-bottom: black solid 3px;*/
+        padding-inline: 5%;
+        padding-block: 2%;
+        border-radius: 35%;
+        /*box-shadow: var(--accent-shadow);*/
+        /*background: var(--accent-border);*/
+        align-self: center;
+        text-wrap: normal;
+    }
+    & #userPicture {
+        border-radius: 100%;
+        box-shadow: var(--accent-shadow);
+        overflow: hidden;
+    }
+
+}
+
+
+.rewards {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    overflow: visible;
+    width: 100%;
+}
+#packsBar {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-evenly;
+    text-align: center;
+    width: 100%;
+    & h2 {
+        font-size: 4em;
+        letter-spacing: 0.1em;
+        border-bottom: 10px solid darkred;
+        margin-inline: 5%;
+    }
+
+}
+#allPacksContainer {
+    padding-top: 3em;
+    display: flex;
+    overflow-x: scroll;
+    padding-inline: 20%;
+    justify-content: space-between;
+    border-bottom: 10px solid rgba(139, 0, 0, 0.5);
+    margin-bottom: 2em;
+    & .packName {
+        font-size: 2em;
+        height: 2.4em;
+        overflow: hidden;
+        padding-bottom: 1em;
+        display: flex;
+        justify-content: center;
+        align-content: flex-start;
+
+    }
+    & .packImg {
+        transition: 0.5s ease-in-out 1ms;
+        border-radius: 20%;
+    }
+}
+.packImg:hover {
+    transform: scale(1.5, 1.5)
+}
+.progressionContainer {
+    display: flex;
+    flex-direction: column;
+    height: 18svh;
+    & h1 {
+        font-size: 4em;
+        width: 100%;
+        font-family: 'MedievalSharp', cursive;
+        text-align: center;
+        overflow-x: scroll;
+        overflow-y: hidden;
+    }
+    & .progImgContainer {
+        position: relative;
+        margin-inline: auto;
+        & .progImg {
+            height: 14svh;
+            /*width: 16svh;*/
+            border-radius: 20%;
+        }
+        & .progImgFill {
+            position: absolute;
+            overflow: hidden;
+            width: 50%;
+        }
+        & .progImgOutline {
+            opacity: 0.1;
+            filter: grayscale(1);
+        }
+        & .progText {
+            font-family: Consolas, serif;
+            opacity: 0.5;
+            -webkit-text-stroke: 1px black;
+            position: absolute;
+            text-align: center;
+            width: 16svh;
+            left:50%;
+            transform: translate(-50%, 150%);
+            font-size: 3em;
+        }
+
+    }
+
+}
+
+#stickersBox {
+    width: 100%;
+}
+.stickersContainer {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+    margin-top: 2em;
+    row-gap: 2em;
+    height: 100%;
+
+}
+.stickerImg {
+    height: 17em;
+    margin: 1.5em;
+}
+/*}*/
+
+@media only screen
+and (min-device-width: 320px)
+and (max-device-width: 640px) {
+    #userPicture {
+        width: 30vw;
+        height: 30vw;
+        border: solid #989898 0.8em;
+    }
+    .packImg {
+        height: 10svh;
+        width: 15em;
+        padding-inline: 1em;
+        margin-inline: 1em;
+    }
+    #allPacksContainer::-webkit-scrollbar {
+        display: none;
+        -ms-scrollbar-darkshadow-color: transparent;
+    }
+}
+
+@media only screen
+and (min-device-width: 1000px) {
+    #userPicture {
+        width: 200px;
+        height: 200px;
+        border: solid #989898 10px;
+    }
+    #allPacksContainer {
+        padding:0;
+        margin-block: 50px;
+        width: 100%;
+        height: 100%;
+        overflow: visible;
+        border: 5px solid rgba(139, 0, 0, 0.5);
+        justify-content: space-evenly;
+    }
+    .packImg {
+        height: 100px;
+        width: 125px;
+        padding-inline: 1em;
+        margin-inline: 3em;
+    }
+    .packImg:hover{
+        transform: scale(2,2);
+    }
+    .packImg:hover ~ .packName{
+        visibility: visible;
+        opacity: 1;
+    }
+    & .packName {
+        position: absolute;
+        visibility: hidden;
+        text-align: center;
+        left: 50%;
+        transform: translate(-50%);
+        opacity: 0;
+        transition: opacity 1s;
+    }
+    #packsBar {
+        /*height: 250px;*/
+        & h2 {
+            display: none;
+        }
+    }
+    .progressionContainer {
+        height: 20svh;
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/static/images/LinkedIn.jpg b/src/main/resources/static/images/LinkedIn.jpg
deleted file mode 100644
index 6bf094d20c89883756ec5a105ec2cea1f9eeaf76..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/LinkedIn.jpg and /dev/null differ
diff --git "a/src/main/resources/static/images/Twitter-Log\320\276.png" "b/src/main/resources/static/images/Twitter-Log\320\276.png"
deleted file mode 100644
index c475939bfacb4be3559aab3d58a9a5eadf036afb..0000000000000000000000000000000000000000
Binary files "a/src/main/resources/static/images/Twitter-Log\320\276.png" and /dev/null differ
diff --git a/src/main/resources/static/images/badges.png b/src/main/resources/static/images/badges.png
deleted file mode 100644
index 57e379c719f5fe28ba827d7007be9637cfd9ff73..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/badges.png and /dev/null differ
diff --git a/src/main/resources/static/images/CaerphillyCastle.jpg b/src/main/resources/static/images/banners/CaerphillyCastle.jpg
similarity index 100%
rename from src/main/resources/static/images/CaerphillyCastle.jpg
rename to src/main/resources/static/images/banners/CaerphillyCastle.jpg
diff --git a/src/main/resources/static/images/PenarthBanner.jpg b/src/main/resources/static/images/banners/PenarthBanner.jpg
similarity index 100%
rename from src/main/resources/static/images/PenarthBanner.jpg
rename to src/main/resources/static/images/banners/PenarthBanner.jpg
diff --git a/src/main/resources/static/images/RiscaBanner.jpg b/src/main/resources/static/images/banners/RiscaBanner.jpg
similarity index 100%
rename from src/main/resources/static/images/RiscaBanner.jpg
rename to src/main/resources/static/images/banners/RiscaBanner.jpg
diff --git a/src/main/resources/static/images/Facebook.png b/src/main/resources/static/images/icons/Facebook.png
similarity index 100%
rename from src/main/resources/static/images/Facebook.png
rename to src/main/resources/static/images/icons/Facebook.png
diff --git a/src/main/resources/static/images/Instagram.jpg b/src/main/resources/static/images/icons/Instagram.jpg
similarity index 100%
rename from src/main/resources/static/images/Instagram.jpg
rename to src/main/resources/static/images/icons/Instagram.jpg
diff --git a/src/main/resources/static/images/Linkedin.png b/src/main/resources/static/images/icons/Linkedin.png
similarity index 100%
rename from src/main/resources/static/images/Linkedin.png
rename to src/main/resources/static/images/icons/Linkedin.png
diff --git a/src/main/resources/static/images/Twitter.jpg b/src/main/resources/static/images/icons/Twitter.jpg
similarity index 100%
rename from src/main/resources/static/images/Twitter.jpg
rename to src/main/resources/static/images/icons/Twitter.jpg
diff --git a/src/main/resources/static/images/VZTA.png b/src/main/resources/static/images/icons/VZTA.png
similarity index 100%
rename from src/main/resources/static/images/VZTA.png
rename to src/main/resources/static/images/icons/VZTA.png
diff --git a/src/main/resources/static/images/rewards/packs/0.png b/src/main/resources/static/images/rewards/packs/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/0.png differ
diff --git a/src/main/resources/static/images/rewards/packs/1.png b/src/main/resources/static/images/rewards/packs/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/1.png differ
diff --git a/src/main/resources/static/images/rewards/packs/2.png b/src/main/resources/static/images/rewards/packs/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..49e1ffc1ddad8ce3d6806f388f4dd70cd59c233e
Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/2.png differ
diff --git a/src/main/resources/static/images/rewards/dragonFilled.png b/src/main/resources/static/images/rewards/packs/3.png
similarity index 100%
rename from src/main/resources/static/images/rewards/dragonFilled.png
rename to src/main/resources/static/images/rewards/packs/3.png
diff --git a/src/main/resources/static/images/rewards/stickers/1/1.png b/src/main/resources/static/images/rewards/stickers/1/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..82eda396931e573eb4885e99348a6da6af12dd3d
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/2.png b/src/main/resources/static/images/rewards/stickers/1/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3a83c4dc354c66e76318159bf406a82720c1a83
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/3.png b/src/main/resources/static/images/rewards/stickers/1/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..197da770196d927d3321f17c6fa2b05846a3e589
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/3.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/4.png b/src/main/resources/static/images/rewards/stickers/1/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..824de21bcd8a979419585b88f68b892337905285
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/4.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/1/5.png b/src/main/resources/static/images/rewards/stickers/1/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea442315db144974ad10319936a3f66976b7fc7f
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/5.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/1.png b/src/main/resources/static/images/rewards/stickers/2/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9db9fe209598c122fac00f272b9a0dac20925b06
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/2.png b/src/main/resources/static/images/rewards/stickers/2/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..8235ea3febeeeae29076d810dc0a989df02c7b3a
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/3.png b/src/main/resources/static/images/rewards/stickers/2/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..81f9ca020c4596076834fdbebb6ca2d51a3b5a35
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/3.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/4.png b/src/main/resources/static/images/rewards/stickers/2/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..43a57a6f9d580bd669eb7bc88b1cd56fb43b5c3c
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/4.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/2/5.png b/src/main/resources/static/images/rewards/stickers/2/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..8926f0b96019ca755895a071a34e7368533ff23d
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/5.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/1.png b/src/main/resources/static/images/rewards/stickers/3/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d759091a2ffb55680062749f999a238a6ae9c26e
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/1.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/2.png b/src/main/resources/static/images/rewards/stickers/3/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d03b83e1e071ab15c4f9fed3a6cb6df597ffb1a
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/2.png differ
diff --git a/src/main/resources/static/images/rewards/stickers/3/3.png b/src/main/resources/static/images/rewards/stickers/3/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..db70b88cd891c33fcbb3ef5c2b3bcfc8ba6cefb9
Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/3.png differ
diff --git a/src/main/resources/static/images/stats.png b/src/main/resources/static/images/stats.png
deleted file mode 100644
index 39904f1cfc911df01306fb85ab78b015e7d0386c..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/stats.png and /dev/null differ
diff --git a/src/main/resources/static/images/trails.jpg b/src/main/resources/static/images/trails.jpg
deleted file mode 100644
index 20481a4f8a914ae8b272f490e2006dd0afaa5a2b..0000000000000000000000000000000000000000
Binary files a/src/main/resources/static/images/trails.jpg and /dev/null differ
diff --git a/src/main/resources/static/scripts/login.js b/src/main/resources/static/scripts/login.js
index 929b8b61e7a6f0f71a97937b2bdf2fcd83a5ce4f..38ef327134aa8ae03ddc44ddf796b2df139fc3bb 100644
--- a/src/main/resources/static/scripts/login.js
+++ b/src/main/resources/static/scripts/login.js
@@ -46,4 +46,6 @@ function validateForm(){
         return false;
     }
     //TODO SERVER SIDE VALIDATION AND CHECK AGAINST USERS DB TABLE
-}
\ No newline at end of file
+}
+
+
diff --git a/src/main/resources/static/scripts/userPage.js b/src/main/resources/static/scripts/userPage.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c1d5069ad652b854abf6b8cb460d7ebf89d696f
--- /dev/null
+++ b/src/main/resources/static/scripts/userPage.js
@@ -0,0 +1,11 @@
+function updatePack(userid, packid) {
+    /* Updates the trail being shown on screen to the one requested by ID */
+    $.get("/packInfo/" + userid + "/" + packid).done(function (fragment) {
+        let packRewardsWrapper = $("#packRewardsWrapper");
+
+        packRewardsWrapper.fadeTo("slow", 0, function () {
+            packRewardsWrapper.html(fragment)
+            packRewardsWrapper.fadeTo("slow", 1);
+        })
+    });
+}
\ No newline at end of file
diff --git a/src/main/resources/static/test.html b/src/main/resources/static/test.html
deleted file mode 100644
index 98a5d8ce3c443e9b3c9e183848b038b11f2df7de..0000000000000000000000000000000000000000
--- a/src/main/resources/static/test.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>asdasd</title>
-</head>
-<body>
-sadasdasdasd
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/static/users.html b/src/main/resources/static/users.html
deleted file mode 100644
index 566549bdf8fae810809c1a81066000687cb338f6..0000000000000000000000000000000000000000
--- a/src/main/resources/static/users.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/allTrails/allTrails.html b/src/main/resources/templates/allTrails/allTrails.html
index 746762b68f64b62190bf71e102edf0ff309772d9..d29d1ad91cf459383b4681678742ed0a2cacbcd6 100644
--- a/src/main/resources/templates/allTrails/allTrails.html
+++ b/src/main/resources/templates/allTrails/allTrails.html
@@ -10,7 +10,7 @@
 </head>
 <body>
 
-<header th:replace="~{/towns/Templating.html :: header}"></header>
+<header th:replace="~{/fragments/Templating.html :: header}"></header>
 
 <main>
     <section id="allTrailsBar" class="centerFlex">
@@ -31,7 +31,7 @@
     </section>
 
 </main>
-<footer th:insert="~{/towns/Templating.html :: footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html :: footer}"></footer>
 
 
 <script type="text/javascript" th:src="@{scripts/allTrails.js}"></script>
diff --git a/src/main/resources/templates/towns/Templating.html b/src/main/resources/templates/fragments/Templating.html
similarity index 74%
rename from src/main/resources/templates/towns/Templating.html
rename to src/main/resources/templates/fragments/Templating.html
index 1313b325bb3027665a9242b8fcd6d9db707af4e7..871e541bd8767e721d139cedfa8dd193b5212987 100644
--- a/src/main/resources/templates/towns/Templating.html
+++ b/src/main/resources/templates/fragments/Templating.html
@@ -2,7 +2,7 @@
 <link rel="stylesheet" href="../../static/css/templatingstyle.css">
 <header class="headerBar" th:fragment="header">
     <div class="Logo">
-        <img src="/images/VZTA.png" height="97" width="400" alt="VZTA Logo"/>
+        <img src="/images/icons/VZTA.png" height="97" width="400" alt="VZTA Logo"/>
     </div>
     <nav class="navBar">
         <ul>
@@ -41,10 +41,10 @@
         <div class="centerFooter">
                         <span class="footerText">
                             <h3>Follow Us</h3>
-                            <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a>
-                            <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a>
-                            <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a>
-                            <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br>
+                            <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a>
+                            <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a>
+                            <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/icons/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a>
+                            <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/icons/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br>
                         </span>
         </div>
         <div class="copyright" style="text-align: left">
diff --git a/src/main/resources/templates/fragments/temp_frags.html b/src/main/resources/templates/fragments/temp_frags.html
deleted file mode 100644
index 03efad3ee73e973e0faf7401b7d3b0de2e1578e4..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/fragments/temp_frags.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<header th:fragment="header" class="headerBlock">
-    <h1 class="headerTitle">SMART-TOWNS</h1>
-    <div class="headerBanner">
-        <img src="images/trails.jpg" alt="Trails" class="bannerBack">
-<!--        <div class="bannerText">-->
-            <h1 class="bigTitle">Smart Town Trails</h1>
-            <h2 class="smallTitle">Information about trails for your town</h2>
-<!--        </div>-->
-    </div>
-</header>
-<footer th:fragment="footer">
-    <ul class="footerBar">
-        <li class="footerButton">Home</li>
-        <li class="footerButton">About</li>
-        <li class="footerButton">Map</li>
-        <li class="footerButton">Facilities</li>
-        <li class="footerButton">Search</li>
-    </ul>
-</footer>
-
-<article class="trailInfo" th:fragment="trailInfo2">
-    <h1 class="titleH1" th:text="${trail.name}">Trail Info</h1>
-</article>
\ No newline at end of file
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html
deleted file mode 100644
index 47b1dc1353c7c96bcb3409f54558ff18c4da6cf4..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/home.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <title>Website Web</title>
-    <link rel="stylesheet" th:href="@{css/style.css}">
-    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
-</head>
-
-<body>
-    <header th:replace="fragments/temp_frags.html :: header"></header>
-    <main>
-        <div class="trailList">
-            <ul class="ulHeader">
-                <li onclick="selectTrail('trail1', this)" class="liHeader" id="trail1" >Trail 1</li>
-                <li onclick="selectTrail('trail2', this)" class="liHeader selected" id="trail2" >Trail 2</li>
-                <li onclick="selectTrail('trail3', this)" class="liHeader" id="trail3" >Trail 3</li>
-                <li onclick="updateOutput()" class="liHeader" id="trail4" >Trail 4</li>
-            </ul>
-        </div>
-
-      <section class="mainBlock">
-        <article class="trailStats">
-            <h1 class="titleH1">Trail Stats</h1>
-            <img src="../static/images/stats.png" alt="Stats" class="stats">
-            <div class="textStats">
-                <p><b>Explored:</b> 60%</p>
-                <p><b>Landmarks Visited:</b> 3/5</p>
-                <p><b>Shops Visited:</b> 6/10</p>
-            </div>
-        </article>
-        <article id="trailInfoBox" class="trailInfo"></article>
-        <article class="badgesBlock">
-            <h1 class="titleH1">Badges</h1>
-            <div class="badgesList">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-                <img src="../static/images/badges.png" alt="Badge" class="badgeImg">
-            </div>
-            
-          </article>  
-      </section>
-    </main>
-
-    <footer th:replace="fragments/temp_frags.html :: footer"></footer>
-    <script src="https://code.jquery.com/jquery-1.9.1.js"></script>
-    <script type="text/javascript" th:src="@{scripts/gabScripts.js}"></script>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/Landmarks/LandmarkFormTh.html b/src/main/resources/templates/landmarks/LandmarkFormTh.html
similarity index 94%
rename from src/main/resources/templates/Landmarks/LandmarkFormTh.html
rename to src/main/resources/templates/landmarks/LandmarkFormTh.html
index b77bb90ece04cc582bc5fa5ea369bd8ba45e864b..0f7879d8277ad1012ffefaae75fc49d70b6932ca 100644
--- a/src/main/resources/templates/Landmarks/LandmarkFormTh.html
+++ b/src/main/resources/templates/landmarks/LandmarkFormTh.html
@@ -10,7 +10,7 @@
 
 </head>
 <body>
-<header th:insert="~{/towns/Templating.html :: header}"></header>
+<header th:insert="~{/fragments/Templating.html :: header}"></header>
 <hr style="height:20px; visibility:hidden;" />
 <H2 id="landmarkFormTitle"> Interested in joining our trails? Sign up Here! </H2>
 <main>
@@ -60,6 +60,6 @@
 </main>
 
 
-<footer th:insert="~{/towns/Templating.html :: footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html :: footer}"></footer>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/rewards/userProfile.html b/src/main/resources/templates/rewards/userProfile.html
deleted file mode 100644
index a193bf7614603637614dd0cfdc0974fdd8c44767..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/rewards/userProfile.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title>
-    <link rel="stylesheet" th:href="@{/css/userProfile.css}">
-<!--    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">-->
-</head>
-<body>
-
-<header>
-    <ul class="footerBar">
-        <li class="footerButton"><b>Home</b></li>
-        <li class="footerButton"><b>About</b></li>
-        <li class="footerButton"><b>Map</b></li>
-        <li class="footerButton"><b>Facilities</b></li>
-        <li class="footerButton"><b>Log In</b></li>
-    </ul>
-</header>
-
-<main>
-    <!--PICTURE - DATA - BADGES -->
-    <div class="userInfo">
-        <img th:src="@{${user.getImgPath()}}"
-             th:alt="${user.getName()}"
-             id="userPicture"
-        >
-        <h1 th:text="${user.getName()}"></h1>
-        <!--TODO add some progression info here?-->
-    </div>
-    <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom-->
-        <article id="badgesBar">
-            <h2>Your Badges: </h2> <!--Shows first earned badges, followed by greyed out badges-->
-            <div id="allBadgesContainer"  class="centerFlex">
-                <img class="badgeImg"  th:each="badge : ${badges}" th:src="@{'..' + ${badge.getImgPath()}}"
-                     th:id="'img' + ${badge.getId()}" th:alt="${badge.getName()}" >
-            </div>
-        </article>
-        <article class="dragonProgression">
-            <h1>The Dragon's Tale</h1>
-            <div class="dragonContainer">
-                <div class="dragonFill" th:style="'width:'+ ${user.getDragonProgress()} + '%;'">
-                    <img th:src="@{/images/rewards/dragonFilled.png}"
-                         alt="Filled Dragon" id="FilledDragon" class="dragonImg">
-                </div>
-                <div class="dragonOut">
-                    <img th:src="@{/images/rewards/dragonOutline.png}"
-                         alt="Outline Dragon" id="OutlineDragon" class="dragonImg">
-                </div>
-            </div>
-            <h2 th:text="${user.getDragonProgress()} + '%'"></h2>
-        </article>
-        <article id="stickersBox"> <!--Need a controller to show earned stickers -->
-            <h2> STICKERS! </h2>
-            <div class="stickersContainer">
-                <img th:class="'stickerImg ' + ${sticker.getVisibility()}"  th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getImgPath()}}"
-                     th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" >
-            </div>
-        </article>
-    </section>
-
-
-</main>
-
-<footer>
-
-</footer>
-
-
-<script>
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/caerphilly.html b/src/main/resources/templates/towns/caerphilly.html
index 912da813737475d83dfc3af4c0ff4010189ec7f5..11d4aabb9ef479d9e67bc5c19419ec0f9c47d3eb 100644
--- a/src/main/resources/templates/towns/caerphilly.html
+++ b/src/main/resources/templates/towns/caerphilly.html
@@ -171,7 +171,7 @@
     <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">
 </head>
 <body>
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
     <div class="container">
         <h1 class="townName"> Welcome to the town of Caerphilly.</h1>
@@ -215,7 +215,7 @@
 
     </div>
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/home/homePage.html b/src/main/resources/templates/towns/home/homePage.html
index 2cdc1e854fba95f89dd2da702bbeb6d5011ed5d8..ec489ae7d334997390462ef1ffbe0d3ceaf5c828 100644
--- a/src/main/resources/templates/towns/home/homePage.html
+++ b/src/main/resources/templates/towns/home/homePage.html
@@ -8,7 +8,7 @@
 </head>
 <body>
 
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
   <div class="gridContainer1">
       <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1>
@@ -56,7 +56,7 @@ rough % outline;
   </div>
 
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 
 </body>
 </html>
diff --git a/src/main/resources/templates/towns/home/homePageOld.html b/src/main/resources/templates/towns/home/homePageOld.html
index bf35e662607a4b2a101aeef83f3a05a65fd50ad2..ce51066c3313d03de40e19be1b1bf951bcc9b6b7 100644
--- a/src/main/resources/templates/towns/home/homePageOld.html
+++ b/src/main/resources/templates/towns/home/homePageOld.html
@@ -9,7 +9,7 @@
 </head>
 <body>
 
-<header th:insert="~{/towns/Templating.html::header}"></header>
+<header th:insert="~{/fragments/Templating.html::header}"></header>
 <main>
 <div class="gridContainer1">
     <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1>
@@ -60,7 +60,7 @@
 
 
 </main>
-<footer th:insert="~{/towns/Templating.html::footer}"></footer>
+<footer th:insert="~{/fragments/Templating.html::footer}"></footer>
 
 </body>
 </html>
diff --git a/src/main/resources/templates/towns/templates.server/Templating.html b/src/main/resources/templates/towns/templates.server/Templating.html
deleted file mode 100644
index 14343a76ea3cc2974dbdd50cc7bd3ade124adc17..0000000000000000000000000000000000000000
--- a/src/main/resources/templates/towns/templates.server/Templating.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<header class="headerBar th:fragment="header">
-
-            <div class="Logo">
-                <img th:src="@{images/VZTA.png}" alt="VZTA Logo">
-            </div>
-            <nav class="navBar">
-                <ul>
-                    <li>Home</li>
-                    <li>FAQs</li>
-                    <li>Contact us</li>
-                </ul>
-                <label class="work">Who  we Work with:</label>
-                    <select>
-                        <ul>
-                            <option value="localauthorities">Local Authorities</option>
-                            <option value="towns">Towns</option>
-                            <option value="businesses">Businesses</option>
-                            <option value="consumers">Consumers</option>
-                        </ul>
-                    </select>
-            </nav>
-        </header>
-
-        <div class="footerBar" th:fragment="footer">
-            <div class="containerFooter">
-                <div class="leftFooter">
-                    <h3>VZTA</h3>
-                    Near Me Now LTD
-                    <br>Britania House
-                    <br>Caerphilly Business Park
-                    <br>Caerphilly
-                    <br>CF83 3GG
-                </div>
-                <div class="rightFooter">
-                    <h3>Connect with us</h3>
-                    <p>Be the first to know about updates by joining out Community page</p>
-                    (C) VZTA 2022<br>
-                    Policy Terms and Conditions
-                </div>
-                    <div class="centerFooter">
-                        <span class="footerText">
-                            <h3>Follow Us</h3>
-                            <a th:href=="https://www.facebook.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Facebook.png}" alt="Facebook Logo" class="picture">
-                            <a th:href=="https://www.twitter.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Twitter-Logo.png}" alt="X (formally Twitter) Logo" class="picture">
-                            <a th:href=="https://www.instagram.com/vztasmarttowns/" class="icon"></a><img th:src="@{images/Instagram.jpg}" alt="Instagram Logo" class="picture">
-                            <a th:href=="https://'www.linkin.com/company/vztasmarttowns/" class="icon"></a><img th:src="@{images/LinkedIn.jpg}" alt="Linkedin Logo" class="picture"> <br>
-                        </span>
-                        </div>
-                            <div class="copyright" style="text-align: left">
-
-                            </div>
-                    </div>
-            </div>
-</div>
-<style>
-    /* Header */
-    .headerBar {
-        border-bottom: 2px rgb(230, 230, 230) solid;
-        margin-bottom: 20px;
-        display: flex;
-        background: blueviolet;
-    }
-    /* Navbar Links */
-    .navBar {
-        margin-top: 50px;
-        margin-left: auto;
-        margin-right:20px;
-        text-align: right;
-    }
-    .work{
-        color: rgb(255, 255, 255);
-    }
-    .navBar ul {
-        list-style: none;
-        display: flex;
-        margin-left: 100px;
-    }
-    .navBar a {
-        border-left: 2px rgb(185, 185, 185) solid;
-        padding: 10px 40px;
-        text-decoration: none;
-        color:rgb(87, 86, 86);
-        white-space: nowrap;
-        overflow: hidden;
-        float: right;
-    }
-    .navBar a:hover {
-        background-color: rgb(209, 209, 209);
-    }
-    .navBar li{
-        margin-left: 10px;
-        margin-right: 10px;
-        color: rgb(255, 255, 255);
-    }
-    .navListLast {
-        border-right: 2px rgb(185, 185, 185) solid;
-        margin-right:40px;
-    }
-
-    /* Navbar Logo */
-    .Logo {
-        margin-left:10px;
-        padding: 20px;
-        width: fit-content;
-    }
-    .Logo img {
-        width: 120px;
-        margin-left:15px;
-    }
-
-    /* Footer */
-    footer {
-        margin-top:20px;
-        display: flex;
-        justify-content: center;
-    }
-    .footerBar{
-        border-top: 2px rgb(230, 230, 230) solid;
-        text-align: left;
-        display: flex;
-        background: blueviolet;
-        color: rgb(255, 255, 255);
-        padding-left: 30px;
-    }
-    .footerBar ul {
-        list-style: none;
-        display: flex;
-    }
-    .copyright{
-        text-align: left;
-        display: flex;
-    }
-    .containerFooter{
-        display: flex;
-        flex-direction: row;
-    }
-    .leftFooter{
-        flex:1;
-        color: rgb(255, 255,255);
-    }
-    .centerFooter{
-        flex: 1;
-        color: rgb(255, 255,255);
-    }
-    .rightFooter{
-        flex:1;
-        color: rgb(255, 255, 255);
-    }
-</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/towns/trails/dragonstale/index.html b/src/main/resources/templates/towns/trails/dragonstale/index.html
index 80aa32934673ddca22af19a7f7772a378ce9c774..7cf5948e993116ac247cf9c8aaac3d1ece2e8762 100644
--- a/src/main/resources/templates/towns/trails/dragonstale/index.html
+++ b/src/main/resources/templates/towns/trails/dragonstale/index.html
@@ -8,7 +8,7 @@
     <script src="./node_modules/html5-qrcode/html5-qrcode.min.js"></script>
 </head>
     <body>
-        <header th:insert="towns/Templating.html :: header"></header>
+        <header th:insert="fragments/Templating.html :: header"></header>
 
         <!-- As this predefined trail will be accessible from multiple different towns, this thymeleaf element will display the town the user is currently trying to access and display it accordingly.   <span th:text="${townName}">  -->
         <div class="centre">
@@ -49,7 +49,7 @@
             <button type="button" id="begin">Click here!</button>
         </div>
 
-        <div th:insert="towns/Templating.html :: footer"></div>
+        <div th:insert="fragments/Templating.html :: footer"></div>
 
         <script>
 
diff --git a/src/main/resources/templates/rewards/login.html b/src/main/resources/templates/users/login.html
similarity index 100%
rename from src/main/resources/templates/rewards/login.html
rename to src/main/resources/templates/users/login.html
diff --git a/src/main/resources/templates/users/userFrags.html b/src/main/resources/templates/users/userFrags.html
new file mode 100644
index 0000000000000000000000000000000000000000..5b5e8201f805bdcbed9234da8c39d6a4b79e94f7
--- /dev/null
+++ b/src/main/resources/templates/users/userFrags.html
@@ -0,0 +1,28 @@
+<!-- @thymesVar id="sticker" type="Team5.SmartTowns.rewards.Sticker" -->
+<!-- @thymesVar id="user" type="Team5.SmartTowns.users.User" -->
+<!-- @thymesVar id="selectedPack" type="Team5.SmartTowns.rewards.Pack" -->
+<div th:fragment="stickersBox" id="packRewardsWrapper">
+  <article class="progressionContainer">
+    <h1 th:text="${selectedPack.getName()}"></h1>
+    <div class="progImgContainer">
+      <div class="progImgFill" th:style="'width:'+ ${progress} + '%;'">
+        <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}"
+             alt="Filled Dragon" id="FilledDragon" class="progImg">
+      </div>
+      <div class="progText">
+        <p th:text="${progress} + '%'"></p>
+      </div>
+      <div class="progImgOutline">
+        <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}"
+             alt="Outline Dragon" id="OutlineDragon" class="progImg">
+      </div>
+    </div>
+  </article>
+
+  <article id="stickersBox">
+    <div class="stickersContainer">
+      <img th:class="'stickerImg ' + ${sticker.getVisibility()}"  th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getDisplayImg()}}"
+           th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" >
+    </div>
+  </article>
+</div>
\ No newline at end of file
diff --git a/src/main/resources/templates/users/userProfile.html b/src/main/resources/templates/users/userProfile.html
new file mode 100644
index 0000000000000000000000000000000000000000..3e865175760bc4b0aa11c9b54aade5d312ac55b5
--- /dev/null
+++ b/src/main/resources/templates/users/userProfile.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title>
+    <link rel="stylesheet" th:href="@{/css/userProfile2.css}">
+    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+<!--    <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">-->
+</head>
+<body>
+
+<!--<header>-->
+<!--    <ul class="footerBar">-->
+<!--        <li class="footerButton"><b>Home</b></li>-->
+<!--        <li class="footerButton"><b>About</b></li>-->
+<!--        <li class="footerButton"><b>Map</b></li>-->
+<!--        <li class="footerButton"><b>Facilities</b></li>-->
+<!--        <li class="footerButton"><b>Log In</b></li>-->
+<!--    </ul>-->
+<!--</header>-->
+
+<main>
+    <!--PICTURE - DATA - BADGES -->
+    <div class="userContainer">
+        <h1 th:text="${user.getName()}"></h1>
+        <img th:src="@{${user.getImgPath()}}"
+             th:alt="${user.getName()}"
+             id="userPicture"
+        >
+
+        <!--TODO add some progression info here?-->
+    </div>
+    <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom-->
+        <article id="packsBar">
+            <h2>Packs</h2>
+             <!--Shows first earned badges, followed by greyed out badges-->
+            <div id="allPacksContainer"  class="centerFlex">
+                <div th:each="pack : ${packs}"  class="packContainer">
+                    <img class="packImg"   th:src="@{'../' + ${pack.getDisplayImg()}}"
+                         th:id="'packImg' + ${pack.getId()}" th:alt="${pack.getName()}"
+                         th:onclick="'updatePack(' + ${user.getId()} +',' + ${pack.getId()} +');'">
+                    <h4 class="packName" th:text="${pack.getName()}"></h4>
+                </div>
+            </div>
+        </article>
+        <article th:replace="~{users/userFrags.html::stickersBox}" id="stickersBox"></article>
+    </section>
+
+
+</main>
+
+<footer>
+
+</footer>
+<script type="text/javascript" th:src="@{../scripts/userPage.js}"></script>
+
+<script>
+</script>
+</body>
+</html>
\ No newline at end of file