diff --git a/src/main/java/com/example/clientproject/data/events/Events.java b/src/main/java/com/example/clientproject/data/events/Events.java
new file mode 100644
index 0000000000000000000000000000000000000000..7dc57c980837ba6c566c30467b425dc4551099f5
--- /dev/null
+++ b/src/main/java/com/example/clientproject/data/events/Events.java
@@ -0,0 +1,23 @@
+package com.example.clientproject.data.events;
+
+import com.example.clientproject.data.logs.Logs;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * Entity object for events which trigger a log
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+public class Events {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long eventId;
+    private String eventName;
+}
diff --git a/src/main/java/com/example/clientproject/data/events/EventsRepo.java b/src/main/java/com/example/clientproject/data/events/EventsRepo.java
new file mode 100644
index 0000000000000000000000000000000000000000..69b5d3e7e6f63065aa47be3b3b4c22f9dc518445
--- /dev/null
+++ b/src/main/java/com/example/clientproject/data/events/EventsRepo.java
@@ -0,0 +1,19 @@
+package com.example.clientproject.data.events;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Optional;
+
+/**
+ * Repository for the "Events" Entity
+ */
+public interface EventsRepo extends JpaRepository<Events, Long> {
+    /**
+     * Find an event by its name
+     * @param name - the name to search by
+     * @return - the event as an optional
+     */
+    @Query("select e from Events e where e.eventName = ?1")
+    Optional<Events> findByEventName(String name);
+}
diff --git a/src/main/java/com/example/clientproject/data/logs/Logs.java b/src/main/java/com/example/clientproject/data/logs/Logs.java
new file mode 100644
index 0000000000000000000000000000000000000000..190fee8fbbb18c4ad103465226f9b7d8ea95c39b
--- /dev/null
+++ b/src/main/java/com/example/clientproject/data/logs/Logs.java
@@ -0,0 +1,43 @@
+package com.example.clientproject.data.logs;
+
+import com.example.clientproject.data.converters.TinyIntToBoolean;
+import com.example.clientproject.data.events.Events;
+import com.example.clientproject.data.users.Users;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+/**
+ * Entity object for logs
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+public class Logs {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long logId;
+    private String logDetails;
+    private String logDateTime;
+    @Convert(converter = TinyIntToBoolean.class)
+    private boolean logSuperAdmin;
+
+    @ManyToOne
+    @JoinColumn(name="User_Id", nullable=false)
+    private Users user;
+
+    @ManyToOne
+    @JoinColumn(name="Event_Id", nullable=false)
+    private Events event;
+
+    public Logs(String details, String dateTime, boolean superAdmin, Users aUser, Events aEvent) {
+        logDetails = details;
+        logDateTime = dateTime;
+        logSuperAdmin = superAdmin;
+        user = aUser;
+        event = aEvent;
+    }
+}
diff --git a/src/main/java/com/example/clientproject/data/logs/LogsRepo.java b/src/main/java/com/example/clientproject/data/logs/LogsRepo.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c5921939f46b8b1e27c720ec86bcebd05f78158
--- /dev/null
+++ b/src/main/java/com/example/clientproject/data/logs/LogsRepo.java
@@ -0,0 +1,43 @@
+package com.example.clientproject.data.logs;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+/**
+ * JPA Repo for the Logs entity
+ */
+public interface LogsRepo extends JpaRepository<Logs, Long> {
+    /**
+     * Find all the logs from a specific date time
+     * @param dateTime - the datetime to search by
+     * @return - list of logs from that date time
+     */
+    @Query("select l from Logs l where l.logDateTime like ?1")
+    List<Logs> findByDateTime(String dateTime);
+
+    /**
+     * Find all the logs for a specific event
+     * @param eventId - the id of the event to search by
+     * @return - a list of logs with that event
+     */
+    @Query("select l from Logs l where l.event.eventId = ?1")
+    List<Logs> findByEventId(long eventId);
+
+    /**
+     * Find all the logs for a specific user
+     * @param userId - the id of the user to search by
+     * @return - a list of all the logs for that user
+     */
+    @Query("select l from Logs l where l.user.userId = ?1")
+    List<Logs> findByUserId(long userId);
+
+    /**
+     * Find all the logs by a specific super admin status
+     * @param superAdminStatus - the status to search by
+     * @return - a list of the logs found
+     */
+    @Query("select l from Logs l where l.logSuperAdmin = ?1")
+    List<Logs> findBySuperAdminStatus(boolean superAdminStatus);
+}
diff --git a/src/main/java/com/example/clientproject/data/rewards/Rewards.java b/src/main/java/com/example/clientproject/data/rewards/Rewards.java
index e285c9d0cf3dffc600809af9c552c9b4c6abe58a..bb123c252868a48939da75d0899291b7d630b9f6 100644
--- a/src/main/java/com/example/clientproject/data/rewards/Rewards.java
+++ b/src/main/java/com/example/clientproject/data/rewards/Rewards.java
@@ -2,6 +2,7 @@ package com.example.clientproject.data.rewards;
 
 import com.example.clientproject.data.shops.Shops;
 import com.example.clientproject.data.stampBoards.StampBoards;
+import com.example.clientproject.data.twoFactorMethods.TwoFactorMethods;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -29,4 +30,7 @@ public class Rewards {
         rewardStampLocation = rewardLocation;
     }
 
+    @ManyToOne
+    @JoinColumn(name="Stamp_Board_Id", nullable=false)
+    private StampBoards stampBoards;
 }
diff --git a/src/main/java/com/example/clientproject/data/rewards/RewardsRepo.java b/src/main/java/com/example/clientproject/data/rewards/RewardsRepo.java
index e2c27b286bef940fbbd961298a625d6e2656734b..c1ab9c191a5068e3377af33ae003e574d668cf06 100644
--- a/src/main/java/com/example/clientproject/data/rewards/RewardsRepo.java
+++ b/src/main/java/com/example/clientproject/data/rewards/RewardsRepo.java
@@ -22,10 +22,19 @@ public interface RewardsRepo extends JpaRepository<StampBoards, Long> {
 
     /**
      * Find a Reward by the name
-     * @param rewardName - name of the Reward to find
+     * @param rewardId Id of reward to find
      * @return - Optional object containing the Reward found, if it's present
      */
     @Query("select r from Rewards r where r.rewardId = ?1")
-    Optional<Rewards> findByRewardName(String rewardName);
+    Optional<Rewards> findByRewardId(long rewardId);
+
+
+    /**
+     * Find a Reward by the name
+     * @param rewardId Id of reward to find
+     * @return - Optional Integer containing the reward, if it's present
+     */
+    @Query("select r.rewardStampLocation from Rewards r where r.rewardId = ?1")
+    Optional<Integer> getRewardValueFromId(long rewardId);
 
 }
diff --git a/src/main/java/com/example/clientproject/data/users/Users.java b/src/main/java/com/example/clientproject/data/users/Users.java
index f5c48347b44bafc85413a54965026fa739ca0a3f..30316dab45ec4190ad2325474e00e9e909aabf4d 100644
--- a/src/main/java/com/example/clientproject/data/users/Users.java
+++ b/src/main/java/com/example/clientproject/data/users/Users.java
@@ -1,5 +1,6 @@
 package com.example.clientproject.data.users;
 
+import com.example.clientproject.data.logs.Logs;
 import com.example.clientproject.data.shops.Shops;
 import com.example.clientproject.data.userStampBoards.UserStampBoards;
 import com.example.clientproject.data.tags.Tags;
diff --git a/src/main/java/com/example/clientproject/service/LoggingService.java b/src/main/java/com/example/clientproject/service/LoggingService.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa453854b260c560b6cfa466c2f51a590796ebf5
--- /dev/null
+++ b/src/main/java/com/example/clientproject/service/LoggingService.java
@@ -0,0 +1,65 @@
+package com.example.clientproject.service;
+
+import com.example.clientproject.data.events.Events;
+import com.example.clientproject.data.logs.Logs;
+import com.example.clientproject.data.logs.LogsRepo;
+import com.example.clientproject.service.Utils.JWTUtils;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpSession;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * Service for all logging based methods
+ */
+@Service
+public class LoggingService {
+    LogsRepo logsRepo;
+    JWTUtils jwtUtils;
+
+    /**
+     * Constructor
+     * @param aLogsRepo - object of type LogsRepo
+     * @param aJWTUtils - object of type JWTUtils
+     */
+    public LoggingService(LogsRepo aLogsRepo, JWTUtils aJWTUtils) {
+        jwtUtils = aJWTUtils;
+        logsRepo = aLogsRepo;
+    }
+
+    /**
+     * Method for logging an event
+     * @param event - the event
+     * @param session - the session
+     * @param details - details of the event
+     */
+    public void logEvent(Events event, HttpSession session, String details) {
+        // Instantiate a flagging variable
+        boolean superAdminStatus;
+        // If the session attribute "superAdmin" doesn't exist (super admin not logged in)
+        if (session.getAttribute("superAdmin") == null) {
+            // Set the flag to false
+            superAdminStatus = false;
+        // Else
+        } else {
+            // Set the flag to the state of the session attribute
+            superAdminStatus = (boolean) session.getAttribute("superAdmin");
+        }
+
+        // Instantiate a DateTimeFormatter with the correct format
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        // Create a new Log object
+        Logs newLog = new Logs(
+                details,
+                LocalDateTime.now().format(formatter),
+                superAdminStatus,
+                jwtUtils.getLoggedInUserRow(session).get(),
+                event
+        );
+
+        // Save the new log
+        logsRepo.save(newLog);
+    }
+}
diff --git a/src/main/java/com/example/clientproject/service/Utils/JWTUtils.java b/src/main/java/com/example/clientproject/service/Utils/JWTUtils.java
index d306113a8480c918eac69b7ef4174fd44fea8149..fbfe4c7b5129cad9e9d647de706badee3c9ade66 100644
--- a/src/main/java/com/example/clientproject/service/Utils/JWTUtils.java
+++ b/src/main/java/com/example/clientproject/service/Utils/JWTUtils.java
@@ -1,5 +1,7 @@
 package com.example.clientproject.service.Utils;
 
+import com.example.clientproject.data.userPermissions.UserPermissions;
+import com.example.clientproject.data.userPermissions.UserPermissionsRepo;
 import com.example.clientproject.data.users.Users;
 import com.example.clientproject.data.users.UsersRepo;
 import io.jsonwebtoken.Claims;
@@ -23,9 +25,11 @@ import java.util.Optional;
 public class JWTUtils {
 
     private UsersRepo usersRepo;
+    private UserPermissionsRepo userPermRepo;
 
-    public JWTUtils(UsersRepo ausersRepo){
-        usersRepo = ausersRepo;
+    public JWTUtils(UsersRepo aUsersRepo, UserPermissionsRepo aUserPermsRepo){
+        usersRepo = aUsersRepo;
+        userPermRepo = aUserPermsRepo;
     }
 
     private String SECRET_KEY;
@@ -91,6 +95,14 @@ public class JWTUtils {
                 jwtTimeToLive // used to calculate expiration (claim = exp)
         );
 
+        List<UserPermissions> userPermList = userPermRepo.findByUserId(userId);
+        for (UserPermissions u: userPermList) {
+            if (u.getAdminType().getAdminTypeId() == 3) {
+                setSuperAdmin(session, true);
+                break;
+            }
+        }
+
         session.setAttribute("loginCredJWT", jwt);
         return jwt.toString();
     }
@@ -131,6 +143,14 @@ public class JWTUtils {
     }
 
     public void logOutUser(HttpSession session){
+        if ((boolean) session.getAttribute("superAdmin")) {
+            setSuperAdmin(session, false);
+        }
+
         session.removeAttribute("loginCredJWT");
     }
+
+    public void setSuperAdmin(HttpSession session, boolean status) {
+        session.setAttribute("superAdmin", status);
+    }
 }
diff --git a/src/main/java/com/example/clientproject/services/GetStampBoardIdFromRewardId.java b/src/main/java/com/example/clientproject/services/GetStampBoardIdFromRewardId.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec93834e30a2164233f9f6c89ad9e7f95c3ff08c
--- /dev/null
+++ b/src/main/java/com/example/clientproject/services/GetStampBoardIdFromRewardId.java
@@ -0,0 +1,29 @@
+package com.example.clientproject.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class GetStampBoardIdFromRewardId {
+    @Autowired
+    JdbcTemplate jdbc;
+
+    /**
+     * @param rewardId the rewardId of the stampBoardId you want to retrieve
+     */
+    public int getStampBoardId(Integer rewardId){
+        String query = "SELECT Stamp_Board_Id FROM rewards WHERE Reward_Id = " + rewardId + ";";
+        try{
+            List<Map<String, Object>> rs = jdbc.queryForList(query);
+
+            System.out.println((int) rs.get(0).get("Stamp_Board_Id"));
+            return (int) rs.get(0).get("Stamp_Board_Id");
+        }catch (Exception e){
+            return 0;
+        }
+    }
+}
diff --git a/src/main/java/com/example/clientproject/services/UserStampBoardRetriever.java b/src/main/java/com/example/clientproject/services/UserStampBoardService.java
similarity index 63%
rename from src/main/java/com/example/clientproject/services/UserStampBoardRetriever.java
rename to src/main/java/com/example/clientproject/services/UserStampBoardService.java
index b2232bb0be5ab5642a1763ca9bc362b78d009758..b5391f7c6b490d671c8852b9554256065941b1e5 100644
--- a/src/main/java/com/example/clientproject/services/UserStampBoardRetriever.java
+++ b/src/main/java/com/example/clientproject/services/UserStampBoardService.java
@@ -10,9 +10,10 @@ import org.springframework.stereotype.Service;
 import java.sql.ResultSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 @Service
-public class UserStampBoardRetriever {
+public class UserStampBoardService {
 
     @Autowired
     JdbcTemplate jdbc;
@@ -29,7 +30,6 @@ public class UserStampBoardRetriever {
     public int getUserStampPos(int userID, int stampBoardID){
         String query = "SELECT User_Stamp_Position FROM user_stamp_boards WHERE User_Id = " + userID + " AND Stamp_Board_Id = " + stampBoardID + ";";
         try{
-            System.out.println(query);
             List<Map<String, Object>> rs = jdbc.queryForList(query);
 
             System.out.println((int) rs.get(0).get("User_Stamp_Position"));
@@ -39,4 +39,15 @@ public class UserStampBoardRetriever {
         }
 
     }
+
+    public void changeUserStampPosition(int userID, int incrementValue, int currentUserStampPos, int stampBoardId){
+        int newStampPos = currentUserStampPos + incrementValue;
+        String query = "UPDATE user_stamp_boards SET User_Stamp_Position = " + newStampPos + " WHERE User_Id = " + userID + " AND Stamp_Board_Id = " + stampBoardId + ";";
+        jdbc.execute(query);
+    }
+
+    public void createStampRecord(int userID, int stampPosition, int stampBoardId){
+        String query = "INSERT INTO user_stamp_boards (User_Id, Stamp_Board_Id, User_Stamp_Position) VALUES ("+userID+", "+stampBoardId+", "+ stampPosition +");";
+        jdbc.execute(query);
+    }
 }
diff --git a/src/main/java/com/example/clientproject/web/controllers/BusinessDetails.java b/src/main/java/com/example/clientproject/web/controllers/BusinessDetails.java
index dd560fe0c01ec38eee8c08d9d74847186395288f..57c894bd27d8a2fb0e0ca531bbea90f316a76a9b 100644
--- a/src/main/java/com/example/clientproject/web/controllers/BusinessDetails.java
+++ b/src/main/java/com/example/clientproject/web/controllers/BusinessDetails.java
@@ -7,13 +7,15 @@ import com.example.clientproject.data.socials.SocialsRepo;
 import com.example.clientproject.data.stampBoards.StampBoards;
 import com.example.clientproject.data.stampBoards.StampBoardsRepo;
 import com.example.clientproject.data.tags.Tags;
+import com.example.clientproject.data.userPermissions.UserPermissions;
+import com.example.clientproject.data.userPermissions.UserPermissionsRepo;
 import com.example.clientproject.data.userStampBoards.UserStampBoards;
 import com.example.clientproject.data.userStampBoards.UserStampBoardsRepo;
 import com.example.clientproject.data.users.Users;
 import com.example.clientproject.data.users.UsersRepo;
 import com.example.clientproject.service.Utils.JWTUtils;
 import com.example.clientproject.services.UserFavouriteTagSaver;
-import com.example.clientproject.services.UserStampBoardRetriever;
+import com.example.clientproject.services.UserStampBoardService;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -36,20 +38,24 @@ public class BusinessDetails {
 
     private JWTUtils jwtUtils;
 
-    private UserStampBoardRetriever userStampService;
+    private UserStampBoardService userStampService;
 
     private SocialsRepo socialsRepo;
 
+    UserPermissionsRepo userPermissionsRepo;
+
 
     public BusinessDetails(ShopsRepo aShopRepo, StampBoardsRepo aStampBoard,
-                           UsersRepo aUsersRepo, UserStampBoardRetriever aUserStampService,
-                           JWTUtils ajwtUtils, SocialsRepo aSocialsRepo){
+                           UsersRepo aUsersRepo, UserStampBoardService aUserStampService,
+                           JWTUtils ajwtUtils, SocialsRepo aSocialsRepo,
+                           UserPermissionsRepo upr){
         shopsRepo = aShopRepo;
         stampRepo = aStampBoard;
         usersRepo = aUsersRepo;
         jwtUtils = ajwtUtils;
         userStampService = aUserStampService;
         socialsRepo = aSocialsRepo;
+        userPermissionsRepo = upr;
     }
 
     @GetMapping("/businessDetails")
@@ -81,6 +87,20 @@ public class BusinessDetails {
 
         List<Socials> socialMedia = socialsRepo.findByShopId(shop.getShopId());
 
+        //gets users permission level for shop
+        long shopPermissionLevel = 0;
+        List<UserPermissions> userShops = userPermissionsRepo.findByUserId(jwtUtils.getLoggedInUserId(session).get());
+        //loops through userPermissions and saves it to variable to be passed into model
+        for (UserPermissions u : userShops) {
+            if (u.getShop().getShopId() == shop.getShopId()) {
+                shopPermissionLevel = u.getAdminType().getAdminTypeId();
+            }
+        }
+        //creates an object to pass into model
+        ArrayList <Integer> userShopPermissionOBJ = new ArrayList<>();
+        userShopPermissionOBJ.add((int) shopPermissionLevel);
+        model.addAttribute("userPermission", userShopPermissionOBJ);
+
 
         model.addAttribute("socials", socialMedia);
 
diff --git a/src/main/java/com/example/clientproject/web/restControllers/UpdateUserStampPosition.java b/src/main/java/com/example/clientproject/web/restControllers/UpdateUserStampPosition.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b517f939a069bce3e0c169b5bf43e4f81b3ba64
--- /dev/null
+++ b/src/main/java/com/example/clientproject/web/restControllers/UpdateUserStampPosition.java
@@ -0,0 +1,124 @@
+package com.example.clientproject.web.restControllers;
+
+import com.example.clientproject.data.rewards.Rewards;
+import com.example.clientproject.data.rewards.RewardsRepo;
+import com.example.clientproject.data.shops.Shops;
+import com.example.clientproject.data.shops.ShopsRepo;
+import com.example.clientproject.data.stampBoards.StampBoards;
+import com.example.clientproject.data.userPermissions.UserPermissions;
+import com.example.clientproject.data.userPermissions.UserPermissionsRepo;
+import com.example.clientproject.data.userStampBoards.UserStampBoards;
+import com.example.clientproject.data.users.Users;
+import com.example.clientproject.data.users.UsersRepo;
+import com.example.clientproject.service.Utils.JWTUtils;
+import com.example.clientproject.services.GetStampBoardIdFromRewardId;
+import com.example.clientproject.services.StampboardUpdater;
+import com.example.clientproject.services.UserStampBoardService;
+import com.example.clientproject.web.forms.UpdateStampboardForm;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+import java.nio.charset.Charset;
+import java.util.*;
+
+@RestController
+public class UpdateUserStampPosition {
+    JWTUtils jwtUtils;
+    UserStampBoardService userStampBoardService;
+    UserPermissionsRepo userPermissionsRepo;
+    RewardsRepo rewardsRepo;
+    UsersRepo usersRepo;
+    GetStampBoardIdFromRewardId getStampBoardIdFromRewardId;
+    ShopsRepo shopsRepo;
+
+    public UpdateUserStampPosition(JWTUtils jwt, UserStampBoardService usbs,
+                                   UserPermissionsRepo upr, RewardsRepo rr,
+                                   UsersRepo ur, GetStampBoardIdFromRewardId gsbifri,
+                                   ShopsRepo sr){ //need to add service for changing stamp pos
+        jwtUtils = jwt;
+        userStampBoardService = usbs;
+        userPermissionsRepo = upr;
+        rewardsRepo = rr;
+        usersRepo = ur;
+        getStampBoardIdFromRewardId = gsbifri;
+        shopsRepo = sr;
+    }
+
+    @PostMapping("/changeUserPos")
+    public void updateUserPos(@RequestParam(name="direction", required = true) String direction,
+                              @RequestParam(name="shopId", required = true) String shopId, HttpSession session) {
+        //will firstly check that user has permission to do action
+        //Optional<Users> user = jwtUtils.getLoggedInUserRow(session);
+        long shopPermissionLevel = 0;
+        int currentUserStampPos = 0;
+        long shopStampBoardId = 0;
+        int shopStampBoardSize = 0;
+        int shopIdConverted = Integer.parseInt(shopId);
+        List<UserPermissions> userShops = userPermissionsRepo.findByUserId(jwtUtils.getLoggedInUserId(session).get());
+        for (UserPermissions u : userShops) { //loops through userPermissions and saves it to variable to be checked
+            if (u.getShop().getShopId() == shopIdConverted) {
+                shopPermissionLevel = u.getAdminType().getAdminTypeId();
+                shopStampBoardId = u.getShop().getStampBoard().getStampBoardId();
+                shopStampBoardSize = u.getShop().getStampBoard().getStampBoardSize();
+            }
+        }
+        if(shopPermissionLevel > 1){//user has the correct level to add/subtract their own stampBoard place
+            currentUserStampPos = userStampBoardService.getUserStampPos(jwtUtils.getLoggedInUserId(session).get(), (int) shopStampBoardId );
+            Shops shop = shopsRepo.getById(Long.valueOf(shopId));
+            StampBoards stampBoard = shop.getStampBoard();
+            if(Objects.equals(direction, "subtract")){
+                if(currentUserStampPos != 0){
+                    userStampBoardService.changeUserStampPosition(jwtUtils.getLoggedInUserId(session).get(), -1, currentUserStampPos, (int) stampBoard.getStampBoardId());
+                }
+            } else if(Objects.equals(direction, "add")){
+                if(currentUserStampPos != shopStampBoardSize){
+                    userStampBoardService.changeUserStampPosition(jwtUtils.getLoggedInUserId(session).get(), 1, currentUserStampPos, (int) stampBoard.getStampBoardId());
+                    currentUserStampPos = userStampBoardService.getUserStampPos(jwtUtils.getLoggedInUserId(session).get(), (int) shopStampBoardId );
+                }
+                if(currentUserStampPos == 0){
+                    System.out.println("Attempting to create record for user");
+                    userStampBoardService.createStampRecord(jwtUtils.getLoggedInUserId(session).get(), 1, (int) shopStampBoardId);
+                }
+            }
+        }
+    }
+
+    @PostMapping("/reedeemReward")
+    public String reedeemStamps(@RequestParam(name="rewardId", required = true) int rewardId, HttpSession session){
+        Optional<Rewards> reward = rewardsRepo.findByRewardId(Long.valueOf(rewardId));
+        int stampBoardId = getStampBoardIdFromRewardId.getStampBoardId(rewardId);
+        Optional<Users> user = usersRepo.findById(Long.valueOf(jwtUtils.getLoggedInUserId(session).get()));
+        Set<UserStampBoards> userStampBoards = user.get().getUserStampBoards();
+        int userStampPos = 0;
+
+        boolean userIsLinkedToStampBoard = false;
+        for(UserStampBoards u : userStampBoards){
+            if(stampBoardId == u.getStampBoard().getStampBoardId()){
+                userStampPos = u.getUserStampPosition();
+                userIsLinkedToStampBoard = true;
+            }
+        }
+        if(userIsLinkedToStampBoard){
+            if(userStampPos >= reward.get().getRewardStampLocation()){
+                userStampBoardService.changeUserStampPosition(jwtUtils.getLoggedInUserId(session).get(), -reward.get().getRewardStampLocation(), userStampPos, stampBoardId);
+                //credit to www.programiz.com for code generator
+                String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//creates a string of all characters
+                StringBuilder sb = new StringBuilder();
+                Random random = new Random();
+                for(int i = 0; i < 8; i++) {
+                    int index = random.nextInt(alphabet.length());
+                    char randomChar = alphabet.charAt(index);
+                    sb.append(randomChar);
+                }
+                String code = sb.toString().toUpperCase();
+                return code;
+            }
+        } else {
+            System.out.println("User is not linked to stampboard they are trying to claim a reward from");
+        }
+
+        return "no";
+    }
+}
diff --git a/src/main/resources/database/Data Script/script.sql b/src/main/resources/database/Data Script/script.sql
index 513d9b5cd3c7017caa4a17ce23d0731f7023fef2..20f35b1c982ad09a23af68d69e90ad8d2a4239dd 100644
--- a/src/main/resources/database/Data Script/script.sql	
+++ b/src/main/resources/database/Data Script/script.sql	
@@ -1,13 +1,15 @@
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("randeep","ccovery","randeepccovery@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("kaela","ra","kaelara@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("kerra","oneypenny","kerraoneypenny@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("morag","za","moragza@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("waqas","ediego","waqasediego@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("kobe","hamsi","kobehamsi@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("mhairi","engblom","mhairiengblom@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("deanne","aqib","deanneaqib@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("kian","chesler","kianchesler@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("freddie","lachy","freddielachy@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
+# noinspection LossyEncodingForFile
+
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('randeep','ccovery','randeepccovery@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('kaela','ra','kaelara@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('kerra','oneypenny','kerraoneypenny@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('morag','za','moragza@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('waqas','ediego','waqasediego@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('kobe','hamsi','kobehamsi@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('mhairi','engblom','mhairiengblom@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('deanne','aqib','deanneaqib@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('kian','chesler','kianchesler@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('freddie','lachy','freddielachy@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (1,1,1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (2,1,1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (3,1,1);
@@ -19,76 +21,76 @@ INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (8,1,1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (9,1,1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (10,1,1);
 
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("keeganjack","hieb","keeganjackhieb@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",2);
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("faren","krosschell","farenkrosschell@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('keeganjack','hieb','keeganjackhieb@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',2);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('faren','krosschell','farenkrosschell@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (11,1,2);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (12,1,2);
 
-INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ("aimen","enifer","aimenenifer@email.com","$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK","testImage.png",1);
+INSERT INTO Users (User_First_Name, User_Last_Name, User_Email, User_Password, User_Profile_Picture, Two_Factor_Method_Id) VALUES ('aimen','enifer','aimenenifer@email.com','$2a$10$YnDtWkRyd3WfYb5CDHBNx.yfuWPW7dOg86NteaEAyaEmaRywfwueK','testImage.png',1);
 INSERT INTO User_Permissions (User_ID, Shop_ID, Admin_Type_Id) VALUES (13,1,3);
 
 
 
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",3,2);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",8,3);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",7,4);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("£5 off",10,5);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",6,6);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("£5 off",9,7);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",8,8);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",5,9);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",6,10);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",8,11);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("£5 off",3,12);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("5% off",3,13);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",8,14);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",9,15);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",3,16);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("2 for 1",9,17);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",8,18);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",8,19);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("10% off",7,20);
-INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,"#ff0000","stamp.png");
-INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ("5% off",3,21);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Hudson Group","","hudsongroup.com","21722","ge georgia","shopPic.png","shopBanner.png",1,2,2);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Wyman - Mertz","","wymanmertz.com","27121","ir iran islamic republic of","shopPic.png","shopBanner.png",0,3,4);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Sauer, Hoppe and Hartmann","","sauerhoppeandhartmann.com","12603","kp korea democratic peoples republic of","shopPic.png","shopBanner.png",1,4,2);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Flatley LLC","","flatleyllc.com","34968","tn tunisia","shopPic.png","shopBanner.png",1,5,6);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Johnson Inc","","johnsoninc.com","31198","gs south georgia and the south sandwich islands","shopPic.png","shopBanner.png",1,6,4);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Hills, Corkery and Maggio","","hillscorkeryandmaggio.com","16424","om oman","shopPic.png","shopBanner.png",0,7,7);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Dickinson Group","","dickinsongroup.com","26474","ga gabon","shopPic.png","shopBanner.png",1,8,6);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Balistreri LLC","","balistrerillc.com","38659","es spain","shopPic.png","shopBanner.png",1,9,2);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Gaylord, Ankunding and Stanton","","gaylordankundingandstanton.com","35281","ba bosnia and herzegovina","shopPic.png","shopBanner.png",1,10,7);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Hilpert Group","","hilpertgroup.com","3304","lv latvia","shopPic.png","shopBanner.png",0,11,7);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Kling - Bauch","","klingbauch.com","35570","re reunion","shopPic.png","shopBanner.png",1,12,4);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Larkin - King","","larkinking.com","7492","dk denmark","shopPic.png","shopBanner.png",1,13,4);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Muller, Ullrich and Kunze","","mullerullrichandkunze.com","6456","gw guineabissau","shopPic.png","shopBanner.png",0,14,6);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Friesen - Armstrong","","friesenarmstrong.com","29922","mw malawi","shopPic.png","shopBanner.png",0,15,3);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("McDermott Inc","","mcdermottinc.com","15319","gm gambia","shopPic.png","shopBanner.png",0,16,4);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Moen - Raynor","","moenraynor.com","9864","kg kyrgyzstan","shopPic.png","shopBanner.png",1,17,3);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Hilpert - Berge","","hilpertberge.com","11447","ar argentina","shopPic.png","shopBanner.png",0,18,3);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Padberg Inc","","padberginc.com","15997","kr korea republic of","shopPic.png","shopBanner.png",1,19,2);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Senger - Ryan","","sengerryan.com","25887","iq iraq","shopPic.png","shopBanner.png",0,20,3);
-INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ("Fay - Koepp","","faykoepp.com","13482","gf french guiana","shopPic.png","shopBanner.png",1,21,2);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',3,2);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',8,3);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',7,4);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('£5 off',10,5);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',6,6);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('£5 off',9,7);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',8,8);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',5,9);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',6,10);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',8,11);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('£5 off',3,12);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('5% off',3,13);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',8,14);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',9,15);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',3,16);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('2 for 1',9,17);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',8,18);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',8,19);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('10% off',7,20);
+INSERT INTO Stamp_Boards (Stamp_Board_Size, Stamp_Board_Colour, Stamp_Board_Icon) VALUES (10,'#ff0000','stamp.png');
+INSERT INTO Rewards (Reward_Name, Reward_Stamp_Location, Stamp_Board_Id) VALUES ('5% off',3,21);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Hudson Group','','hudsongroup.com','21722','ge georgia','shopPic.png','shopBanner.png',1,2,2);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Wyman - Mertz','','wymanmertz.com','27121','ir iran islamic republic of','shopPic.png','shopBanner.png',0,3,4);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Sauer, Hoppe and Hartmann','','sauerhoppeandhartmann.com','12603','kp korea democratic peoples republic of','shopPic.png','shopBanner.png',1,4,2);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Flatley LLC','','flatleyllc.com','34968','tn tunisia','shopPic.png','shopBanner.png',1,5,6);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Johnson Inc','','johnsoninc.com','31198','gs south georgia and the south sandwich islands','shopPic.png','shopBanner.png',1,6,4);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Hills, Corkery and Maggio','','hillscorkeryandmaggio.com','16424','om oman','shopPic.png','shopBanner.png',0,7,7);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Dickinson Group','','dickinsongroup.com','26474','ga gabon','shopPic.png','shopBanner.png',1,8,6);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Balistreri LLC','','balistrerillc.com','38659','es spain','shopPic.png','shopBanner.png',1,9,2);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Gaylord, Ankunding and Stanton','','gaylordankundingandstanton.com','35281','ba bosnia and herzegovina','shopPic.png','shopBanner.png',1,10,7);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Hilpert Group','','hilpertgroup.com','3304','lv latvia','shopPic.png','shopBanner.png',0,11,7);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Kling - Bauch','','klingbauch.com','35570','re reunion','shopPic.png','shopBanner.png',1,12,4);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Larkin - King','','larkinking.com','7492','dk denmark','shopPic.png','shopBanner.png',1,13,4);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Muller, Ullrich and Kunze','','mullerullrichandkunze.com','6456','gw guineabissau','shopPic.png','shopBanner.png',0,14,6);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Friesen - Armstrong','','friesenarmstrong.com','29922','mw malawi','shopPic.png','shopBanner.png',0,15,3);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('McDermott Inc','','mcdermottinc.com','15319','gm gambia','shopPic.png','shopBanner.png',0,16,4);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Moen - Raynor','','moenraynor.com','9864','kg kyrgyzstan','shopPic.png','shopBanner.png',1,17,3);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Hilpert - Berge','','hilpertberge.com','11447','ar argentina','shopPic.png','shopBanner.png',0,18,3);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Padberg Inc','','padberginc.com','15997','kr korea republic of','shopPic.png','shopBanner.png',1,19,2);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Senger - Ryan','','sengerryan.com','25887','iq iraq','shopPic.png','shopBanner.png',0,20,3);
+INSERT INTO Shops (Shop_Name, Shop_Description, Shop_Website, Shop_Earnings, Shop_Countries, Shop_Image, Shop_Banner, Shop_Active, Stamp_Board_Id, Category_Id) VALUES ('Fay - Koepp','','faykoepp.com','13482','gf french guiana','shopPic.png','shopBanner.png',1,21,2);
 INSERT INTO Shop_Tag_Links (Shop_Id, Tag_Id) VALUES (1,7);
 INSERT INTO Shop_Tag_Links (Shop_Id, Tag_Id) VALUES (2,10);
 INSERT INTO Shop_Tag_Links (Shop_Id, Tag_Id) VALUES (2,2);
diff --git a/src/main/resources/database/WeekFourERD.png b/src/main/resources/database/WeekFourERD.png
new file mode 100644
index 0000000000000000000000000000000000000000..7247c10a046662acc5b072479ae00e84b30652e2
Binary files /dev/null and b/src/main/resources/database/WeekFourERD.png differ
diff --git a/src/main/resources/database/schema.sql b/src/main/resources/database/schema.sql
index c7736a3642b0816130bf6b9e4ac6353037abd22a..3d7f0735aed3f3845ab1764376e4d115af7d8b35 100644
--- a/src/main/resources/database/schema.sql
+++ b/src/main/resources/database/schema.sql
@@ -255,6 +255,41 @@ CREATE TABLE IF NOT EXISTS `mydb`.`Socials` (
                                                 
     ENGINE = InnoDB;
 
+
+-- -----------------------------------------------------
+-- Table `mydb`.`Events`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `mydb`.`Events` (
+    `Event_Id` INT NOT NULL AUTO_INCREMENT,
+    `Event_Name` VARCHAR(45) NOT NULL,
+    PRIMARY KEY(`Event_Id`))
+ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `mydb`.`Logs`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `mydb`.`Logs` (
+    `Log_Id` INT NOT NULL AUTO_INCREMENT,
+    `Event_Id` INT NOT NULL,
+    `User_Id` INT NOT NULL,
+    `Log_Details` VARCHAR(150) NOT NULL,
+    `Log_Date_Time` DATETIME NOT NULL,
+    `Log_Super_Admin` TINYINT NOT NULL,
+    PRIMARY KEY(`Log_Id`, `Event_Id`, `User_Id`),
+    CONSTRAINT `fk_Events1`
+        FOREIGN KEY (`Event_Id`)
+            REFERENCES `mydb`.`Events` (`Event_Id`)
+            ON UPDATE NO ACTION
+            ON DELETE NO ACTION,
+    CONSTRAINT `fk_Users1`
+        FOREIGN KEY (`User_Id`)
+            REFERENCES `mydb`.`Users` (`User_Id`)
+            ON UPDATE NO ACTION
+            ON DELETE NO ACTION
+    )
+ENGINE = InnoDB;
+
     
 
 INSERT INTO two_factor_methods (`Two_Factor_Method_Id`, `Two_Factor_Method_Name`) VALUES (1, 'None');
@@ -295,3 +330,16 @@ INSERT INTO Tags (Tag_Name) VALUES ('beauty');
 INSERT INTO Tags (Tag_Name) VALUES ('eco-friendly');
 INSERT INTO Tags (Tag_Name) VALUES ('decorations');
 INSERT INTO Tags (Tag_Name) VALUES ('photography');
+
+INSERT INTO Events (Event_Name) VALUES ('New Account Created');
+INSERT INTO Events (Event_Name) VALUES ('Failed Login');
+INSERT INTO Events (Event_Name) VALUES ('Successful Login');
+INSERT INTO Events (Event_Name) VALUES ('User Details Changed');
+INSERT INTO Events (Event_Name) VALUES ('User Removed');
+INSERT INTO Events (Event_Name) VALUES ('New Shop');
+INSERT INTO Events (Event_Name) VALUES ('Deleted Shop');
+INSERT INTO Events (Event_Name) VALUES ('New Favourite Business');
+INSERT INTO Events (Event_Name) VALUES ('New Shop User');
+INSERT INTO Events (Event_Name) VALUES ('Shop Details Changed');
+INSERT INTO Events (Event_Name) VALUES ('Shop Activity Toggled');
+INSERT INTO Events (Event_Name) VALUES ('Image Inserted');
\ No newline at end of file
diff --git a/src/main/resources/static/css/viewShop.css b/src/main/resources/static/css/viewShop.css
index c7a22395bfae22da772326ab5d3ede32c8ac2498..a42ee8bb8ec07fa002f15ac0ed2a4942acc82f29 100644
--- a/src/main/resources/static/css/viewShop.css
+++ b/src/main/resources/static/css/viewShop.css
@@ -183,3 +183,49 @@ img.stamp{
   align-items: center;
   position: relative;
 }
+
+.change-stamp-progress-container{
+  position: absolute;
+  display: flex;
+  flex-direction: column;
+  top: 70%;
+  right: 3%;
+  width: 10px;
+}
+
+.reward-box{
+  width: inherit;
+
+}
+
+.text-align-center{
+  text-align: center;
+}
+
+.inherit-width{
+  width: inherit;
+}
+
+.reward-claim-title{
+  font-weight: bold;
+  font-size: 40px;
+}
+
+.big-margin-top{
+  margin-top: 70px;
+}
+
+.reward-claim-code{
+  color: black;
+  font-weight: bold;
+  font-size: 60px;
+}
+
+.custom-modal-card-body{
+  background-color: #fff;
+  flex-grow: 1;
+  flex-shrink: 1;
+  padding: 20px;
+  height: 400px;
+  border-radius: 0px 0px 10px 10px;
+}
diff --git a/src/main/resources/static/js/selectCategories.js b/src/main/resources/static/js/selectCategories.js
index 7c3a3ebad97dcbff9665c58ecb306781e6839090..285dbe05020044f8bc20386366806c70c1cdbec0 100644
--- a/src/main/resources/static/js/selectCategories.js
+++ b/src/main/resources/static/js/selectCategories.js
@@ -40,9 +40,9 @@ function submitCategories(listSize){
                 status.innerHTML = "There was an error try again later.";
             }
         };
-        xhttp.onerror = function () {
-            status.innerHTML = "There was an error. Please try again later.";
-        }
+            xhttp.onerror = function () {
+                status.innerHTML = "There was an error. Please try again later.";
+            }
         xhttp.send(params);
         return false;
     }
diff --git a/src/main/resources/static/js/viewShop.js b/src/main/resources/static/js/viewShop.js
index 2f409ca8c5920d0905bc479634ff03c6a037347e..3d7fc0ecf7bc079d4003e3de184fcf3b2585a771 100644
--- a/src/main/resources/static/js/viewShop.js
+++ b/src/main/resources/static/js/viewShop.js
@@ -1,5 +1,6 @@
 var currentPage = 1;
 
+
 function pageNav(direction){
     //this checks that current page will not go to 0 if "direction" = -1 / left
     if (direction === -1){ //"-1" = left
@@ -26,6 +27,55 @@ function pageNav(direction){
     }
 }
 
-function toBusinessWebsite(URL){
-    window.location.href = URL;
+
+function changeUserStampPos(increment, shopId){
+    if (increment === "subtract"){ //take away a stamp position from user
+        params = 'direction=subtract';
+    } else if(increment === "add"){ //add a stamp to user
+        params = 'direction=add';
+    } else {
+        return null;
+    }
+    params = params + '&shopId=' + shopId;
+    var xhttp = new XMLHttpRequest();
+    xhttp.open("POST", '/changeUserPos', true); // true is asynchronous
+    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+    xhttp.onload = function () {
+        if (xhttp.readyState === 4 && xhttp.status === 200) {
+            console.log(xhttp.responseText);
+            window.location.reload(true);
+        }
+    }
+    xhttp.onerror = function () {
+        alert("There was an error. Database has not been updated.");
+    }
+    xhttp.send(params);
+    return false;
 }
+
+function claimReward(rewardId){
+    params = 'rewardId=' + rewardId;
+    var xhttp = new XMLHttpRequest();
+    xhttp.open("POST", '/reedeemReward', true); // true is asynchronous
+    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+    xhttp.onload = function () {
+        if (xhttp.readyState === 4 && xhttp.status === 200) {
+            console.log(xhttp.responseText);
+            var modal = document.getElementById("rewardModal");
+            var code = document.getElementById("reward-code");
+            code.innerText = xhttp.responseText;
+            modal.classList.add("is-active");
+        }
+    }
+    xhttp.onerror = function () {
+        alert("There was an error. Database has not been updated.");
+    }
+    xhttp.send(params);
+    return false;
+}
+
+
+function closeModal(){
+    window.location.reload(true);
+}
+
diff --git a/src/main/resources/templates/admin.html b/src/main/resources/templates/admin.html
index 6aaaf60a8010fc1fe5378e0396e77ec33ad5c48a..cfc658cfbe0a3986cbf7a6114559e9eea3f1bd64 100644
--- a/src/main/resources/templates/admin.html
+++ b/src/main/resources/templates/admin.html
@@ -45,7 +45,7 @@
 				<p>Shop Rewards</p>
 			</div>
 		</div>
-		<div class="sidebar closed" id="side_shop_select">
+		<div class="sidebar closed" id="side_shop_select" th:if="${highestPerm > 1 || linkedShop}">
 			<th:block th:each="category: ${adminOfByCategory.entrySet()}">
 				<div class="shop-tab-container">
 					<div class="shop-tab shop-category"  onclick="this.parentElement.classList.toggle('open')">
diff --git a/src/main/resources/templates/fragments/reward_card.html b/src/main/resources/templates/fragments/reward_card.html
index 27ef83f54948571b38a5e01e451811513ebc4623..a2f3babb3870c6b54886f70e289cf72e3083ab62 100644
--- a/src/main/resources/templates/fragments/reward_card.html
+++ b/src/main/resources/templates/fragments/reward_card.html
@@ -28,7 +28,7 @@
                 <p th:text="${reward_amount_obtained} + '/' + ${total_reward_amount}"></p>
             </div>
             <div class="level-right">
-                <a th:href="'businessDetails?shopId=' + ${shop.getShopId()}">
+                <a th:href="'businessDetails?shopId=' + ${shopId}">
                 <button class="button is-rounded">
                     Explore
                     <span class="icon is-small is-left ml-1">
diff --git a/src/main/resources/templates/shopDetails.html b/src/main/resources/templates/shopDetails.html
index bbf527a15eb0928dc20d4c22b512e7ce0d9c5abb..19c9fe0c8f7085081f7141f981840b6ffd31bfab 100644
--- a/src/main/resources/templates/shopDetails.html
+++ b/src/main/resources/templates/shopDetails.html
@@ -41,7 +41,7 @@
           <div th:each="reward : ${stampBoard.rewards}" class="reward is-fullwidth">
             <p class="reward-text" th:text="${reward.rewardName}"></p>
             <button th:unless="${UserStampPos[0]>=reward.rewardStampLocation}" class="button is-small buttonRewardNotReady">Cannot afford</button>
-            <button th:if="${UserStampPos[0]>=reward.rewardStampLocation}" class="button is-small buttonRewardisReady">Click to claim!</button>
+            <button th:if="${UserStampPos[0]>=reward.rewardStampLocation}" class="button is-small buttonRewardisReady" th:onclick="claimReward([[${reward.rewardId}]])">Click to claim!</button>
             <progress class="progress is-small marginBottom7px is-success" th:value="${UserStampPos[0]}" th:max="${reward.rewardStampLocation}"></progress>
             <!-- TH:STYLE HAS NOT BEEN SET SO EXPECT AN ERROR -->
             <p class="stampProgressText" th:unless="${UserStampPos[0]>=reward.rewardStampLocation}" th:text="${reward.rewardStampLocation - UserStampPos[0]} + ' away from reward'"/>
@@ -75,7 +75,7 @@
                   </div>
                 </div>
 
-                <div th:if="${@loadSocials.getSocial(socials, 'facebook' != '')}" class="control">
+                <div th:if="${@loadSocials.getSocial(socials, 'facebook') != ''}" class="control">
                   <div class="tags has-addons">
                     <span class="tag is-large is-grey">
                       <span class="icon-text">
@@ -110,7 +110,7 @@
                         </span>
                       </span>
                     </span>
-                    <a th:href="'https://twitter.com/' + ${@loadSocials.getSocial(socials, 'instagram')}"><span class="tag is-large is-danger mousePointerWhenHovered">Instagram</span></a>
+                    <a th:href="'https://instagram.com/' + ${@loadSocials.getSocial(socials, 'instagram')}"><span class="tag is-large is-danger mousePointerWhenHovered">Instagram</span></a>
                   </div>
                 </div>
 
@@ -133,5 +133,24 @@
       <!-- <img th:src="${shop.shopImage}" alt=""> -->
       <!-- <h1 th:text="${stampBoard.stampBoardSize}"></h1> -->
     </div>
+    <div class="change-stamp-progress-container" th:if="${userPermission[0] > 1}">
+        <button class="button is-rounded is-info" th:onclick="changeUserStampPos('add', [[${shop.getShopId}]])">+</button>
+        <button class="button is-rounded is-info" th:onclick="changeUserStampPos('subtract', [[${shop.getShopId}]])">-</button>
+    </div>
+    <div class="modal" id="rewardModal">
+      <div class="modal-background"></div>
+      <div class="modal-card">
+        <header class="modal-card-head text-align-center">
+          <p class="modal-card-title reward-claim-title">Claim your reward!</p>
+          <button class="delete" aria-label="close" onclick="closeModal()"></button>
+        </header>
+        <section class="custom-modal-card-body">
+          <div class="inherit-width text-align-center big-margin-top">reward code:</div>
+          <div class="inherit-width text-align-center reward-claim-code" id="reward-code">XKMSTVZ</div>
+
+        </section>
+      </div>
+    </div>
+    <span th:value="${shop.getShopId}" id="shopId"/>
 </body>
 </html>
diff --git a/src/test/resources/schema-test-h2.sql b/src/test/resources/schema-test-h2.sql
index a1344bb0431691788e75d4dcff4331aa471ff961..6abe29dfee8e62efcc21ebc2f3e58652e19193df 100644
--- a/src/test/resources/schema-test-h2.sql
+++ b/src/test/resources/schema-test-h2.sql
@@ -265,6 +265,40 @@ CREATE TABLE IF NOT EXISTS `User_Stamp_Boards` (
 ENGINE = InnoDB;
 
 
+-- -----------------------------------------------------
+-- Table `Events`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Events` (
+                                               `Event_Id` INT NOT NULL AUTO_INCREMENT,
+                                               `Event_Name` VARCHAR(45) NOT NULL,
+                                               PRIMARY KEY(`Event_Id`))
+    ENGINE = InnoDB;
+
+
+-- -----------------------------------------------------
+-- Table `Logs`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Logs` (
+                                             `Log_Id` INT NOT NULL AUTO_INCREMENT,
+                                             `Event_Id` INT NOT NULL,
+                                             `User_Id` INT NOT NULL,
+                                             `Log_Details` VARCHAR(150),
+                                             `Log_Date_Time` DATETIME NOT NULL,
+                                             `Log_Super_Admin` TINYINT NOT NULL,
+                                             PRIMARY KEY(`Log_Id`, `Event_Id`, `User_Id`),
+                                             CONSTRAINT `fk_Events1`
+                                                 FOREIGN KEY (`Event_Id`)
+                                                     REFERENCES `Events` (`Event_Id`)
+                                                     ON UPDATE NO ACTION
+                                                     ON DELETE NO ACTION,
+                                             CONSTRAINT `fk_Users1`
+                                                 FOREIGN KEY (`User_Id`)
+                                                     REFERENCES `Users` (`User_Id`)
+                                                     ON UPDATE NO ACTION
+                                                     ON DELETE NO ACTION
+)
+    ENGINE = InnoDB;
+
 INSERT INTO two_factor_methods (`Two_Factor_Method_Id`, `Two_Factor_Method_Name`) VALUES (1, 'None');
 INSERT INTO two_factor_methods (`Two_Factor_Method_Id`, `Two_Factor_Method_Name`) VALUES (2, 'GAuth');
 
@@ -284,4 +318,35 @@ INSERT INTO Admin_Types (Admin_Type_Id, Admin_Type_Name) VALUES (1,'User');
 INSERT INTO Admin_Types (Admin_Type_Id, Admin_Type_Name) VALUES (2,'Business Admin');
 INSERT INTO Admin_Types (Admin_Type_Id, Admin_Type_Name) VALUES (3,'Super Admin');
 
-INSERT INTO Tags (Tag_Name) VALUES ('Football');
\ No newline at end of file
+INSERT INTO Tags (Tag_Name) VALUES ('football');
+INSERT INTO Tags (Tag_Name) VALUES ('fashion');
+INSERT INTO Tags (Tag_Name) VALUES ('electronics');
+INSERT INTO Tags (Tag_Name) VALUES ('coffee');
+INSERT INTO Tags (Tag_Name) VALUES ('art');
+INSERT INTO Tags (Tag_Name) VALUES ('pets');
+INSERT INTO Tags (Tag_Name) VALUES ('clothes');
+INSERT INTO Tags (Tag_Name) VALUES ('designer');
+INSERT INTO Tags (Tag_Name) VALUES ('groceries');
+INSERT INTO Tags (Tag_Name) VALUES ('cars');
+INSERT INTO Tags (Tag_Name) VALUES ('hiking');
+INSERT INTO Tags (Tag_Name) VALUES ('cooking');
+INSERT INTO Tags (Tag_Name) VALUES ('furniture');
+INSERT INTO Tags (Tag_Name) VALUES ('gaming');
+INSERT INTO Tags (Tag_Name) VALUES ('travelling');
+INSERT INTO Tags (Tag_Name) VALUES ('beauty');
+INSERT INTO Tags (Tag_Name) VALUES ('eco-friendly');
+INSERT INTO Tags (Tag_Name) VALUES ('decorations');
+INSERT INTO Tags (Tag_Name) VALUES ('photography');
+
+INSERT INTO Events (Event_Name) VALUES ('New Account Created');
+INSERT INTO Events (Event_Name) VALUES ('Failed Login');
+INSERT INTO Events (Event_Name) VALUES ('Successful Login');
+INSERT INTO Events (Event_Name) VALUES ('User Details Changed');
+INSERT INTO Events (Event_Name) VALUES ('User Removed');
+INSERT INTO Events (Event_Name) VALUES ('New Shop');
+INSERT INTO Events (Event_Name) VALUES ('Deleted Shop');
+INSERT INTO Events (Event_Name) VALUES ('New Favourite Business');
+INSERT INTO Events (Event_Name) VALUES ('New Shop User');
+INSERT INTO Events (Event_Name) VALUES ('Shop Details Changed');
+INSERT INTO Events (Event_Name) VALUES ('Shop Activity Toggled');
+INSERT INTO Events (Event_Name) VALUES ('Image Inserted');
\ No newline at end of file