diff --git a/Dockerfile b/Dockerfile
index e29d064d6b5e3eaafad16cd0da74d5ab9db3f8e4..1d2b0aa6ff4ad1548abfb3c16a5a76a2509afb21 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,11 @@
-FROM php:8.0-apache
+FROM php:8.1-apache
+    
+RUN apt-get update && apt-get upgrade -y
+RUN apt-get install -y libxml2-dev libpq-dev
+RUN docker-php-ext-install pgsql pdo pdo_pgsql && docker-php-ext-enable pgsql pdo pdo_pgsql
+RUN a2enmod rewrite && service apache2 restart
+RUN chown -R :www-data /var/www/html/
 
-RUN docker-php-ext-install pdo pdo_mysql
\ No newline at end of file
+WORKDIR /var
+
+EXPOSE 80
\ No newline at end of file
diff --git a/database/6-seed.sql b/database/6-seed.sql
index 75d29b1f268885ce1d4d9e2761e17b244d865042..36241df86b2e292f4b88fdba181e83692d30af87 100644
--- a/database/6-seed.sql
+++ b/database/6-seed.sql
@@ -29,8 +29,8 @@ END $$;
 -- Insert user data
 INSERT INTO users (user_name, username, user_email, user_hashedPass, isAdmin)
 VALUES
-    ('John Doe', 'john_doe', 'john@example.com', crypt('password_1', gen_salt('bf', 8)), 1),
-    ('Jane Smith', 'jane_smith', 'jane@example.com', crypt('password_2', gen_salt('bf', 8)), 0),
-    ('Admin User', 'admin_user', 'admin@example.com', crypt('password_3', gen_salt('bf', 8)), 1),
-    ('Alice Johnson', 'alice', 'alice@example.com', crypt('password_4', gen_salt('bf', 8)), 0),
-    ('Bob Williams', 'bob', 'bob@example.com', crypt('password_5', gen_salt('bf', 8)), 0);
+    ('John Doe', 'john_doe', 'john@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'true'),
+    ('Jane Smith', 'jane_smith', 'jane@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false'),
+    ('Admin User', 'admin_user', 'admin@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'true'),
+    ('Alice Johnson', 'alice', 'alice@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false'),
+    ('Bob Williams', 'bob', 'bob@example.com', '$2y$10$8sA2N5Sx/1zMQv2yrTDAaOFlbGWECrrgB68axL.hBb78NhQdyAqWm', 'false');
diff --git a/src/.htaccess b/src/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..122631ddccca95f9c7deb4126fa8f005bb799d5f
--- /dev/null
+++ b/src/.htaccess
@@ -0,0 +1,13 @@
+DirectoryIndex index.php
+
+RewriteEngine On
+
+RewriteBase /
+
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+
+RewriteRule ^(.*)$ index.php [QSA]
+
+php_value post_max_size 16M
+php_value upload_max_filesize 16M
\ No newline at end of file
diff --git a/styles/auth.css b/src/Client/auth.css
similarity index 100%
rename from styles/auth.css
rename to src/Client/auth.css
diff --git a/src/Client/components/navbar.php b/src/Client/components/navbar.php
index ec8dd2abb5c9159fc789683ffbc72588471a9771..d8b9f315cf42e553115cdee21afd786606fc9056 100644
--- a/src/Client/components/navbar.php
+++ b/src/Client/components/navbar.php
@@ -7,7 +7,7 @@
             <li><a href="/app/Views/history/history.php">History</a></li>
             <!-- Logout Button -->
             <li>
-                <form method="post" action="/app/router.php">
+                <form method="post" action="/logout">
                     <button type="submit" name="userAction" value="logout">Logout</button>
                 </form>
             </li>
diff --git a/styles/container.css b/src/Client/container.css
similarity index 100%
rename from styles/container.css
rename to src/Client/container.css
diff --git a/styles/dropdown.css b/src/Client/dropdown.css
similarity index 100%
rename from styles/dropdown.css
rename to src/Client/dropdown.css
diff --git a/styles/footer.css b/src/Client/footer.css
similarity index 100%
rename from styles/footer.css
rename to src/Client/footer.css
diff --git a/styles/form.css b/src/Client/form.css
similarity index 100%
rename from styles/form.css
rename to src/Client/form.css
diff --git a/styles/global.css b/src/Client/global.css
similarity index 100%
rename from styles/global.css
rename to src/Client/global.css
diff --git a/styles/navbar.css b/src/Client/navbar.css
similarity index 100%
rename from styles/navbar.css
rename to src/Client/navbar.css
diff --git a/src/Client/pages/event/create.php b/src/Client/pages/event/create.php
index b486caa397b265e68072d2f4b78ee48646346236..75b6a10b2118c919657b3faf07bebba8ccdc766d 100644
--- a/src/Client/pages/event/create.php
+++ b/src/Client/pages/event/create.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }    
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
diff --git a/src/Client/pages/event/update.php b/src/Client/pages/event/update.php
index 3d638008c04ae889ba49048259af52b843fa0c29..84f1251705869979df5035fc2a46c0a1d5aaa7d7 100644
--- a/src/Client/pages/event/update.php
+++ b/src/Client/pages/event/update.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
diff --git a/src/Client/pages/history/history.php b/src/Client/pages/history/history.php
index b2e02634119d3edb062c656a5cdf4a3e41ac6c9d..10b8f5740cda2ae192de1506f1c1c55f56cca2cf 100644
--- a/src/Client/pages/history/history.php
+++ b/src/Client/pages/history/history.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
diff --git a/src/Client/pages/home/home.php b/src/Client/pages/home/home.php
index 701666b3ed1ed21f2fa786cc27dd08f05d741bf5..1cd9d381a804b98e292ce9be199e106815df1614 100644
--- a/src/Client/pages/home/home.php
+++ b/src/Client/pages/home/home.php
@@ -1,22 +1,25 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
         // User is not authenticated; redirect to login page
-        header("Location: /app/Views/login/login.php");
+        header("Location: login");
         ob_end_flush();
     }
 
-    require_once '../../Controllers/PembelianController.php';
-    require_once '../../Controllers/TicketController.php';
-    require_once '../../Controllers/UserController.php';
-    require_once '../../Controllers/EventController.php';
+    require_once (__DIR__.'/../../../Server/Controllers/PembelianController.php');
+    require_once (__DIR__.'/../../../Server/Controllers/TicketController.php');
+    require_once (__DIR__.'/../../../Server/Controllers/UserController.php');
+    require_once (__DIR__.'/../../../Server/Controllers/EventController.php');
 
     $eventController = new EventController();
     $pembelianController = new PembelianController();
     $ticketController = new TicketController();
-    $userController = new UserController();
+    $userController = new \Server\Controllers\UserController();
 
     // Handle search query
     $searchQuery = isset($_GET['search']) ? $_GET['search'] : '';
@@ -36,7 +39,7 @@
     $currentPage = $paginationData['page'];
     $maxPage = $paginationData['maxpage'];
 
-    $isAdmin = $userController->getUser($_SESSION['user_id'])['isAdmin'];
+    $isAdmin = $userController->getUser($_SESSION['user_id'])['isadmin'];
 ?>
 
 <!DOCTYPE html>
@@ -46,20 +49,20 @@
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>HOME • TICKET KU</title>
-    <link rel="stylesheet" type="text/css" href="/../../styles/global.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/form.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/footer.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/navbar.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/container.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/auth.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/dropdown.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/pagination.css">
-    <link rel="stylesheet" type="text/css" href="/../../styles/media.css">
+    <link rel="stylesheet" type="text/css" href="/../../global.css">
+    <link rel="stylesheet" type="text/css" href="/../../form.css">
+    <link rel="stylesheet" type="text/css" href="/../../footer.css">
+    <link rel="stylesheet" type="text/css" href="/../../navbar.css">
+    <link rel="stylesheet" type="text/css" href="/../../container.css">
+    <link rel="stylesheet" type="text/css" href="/../../auth.css">
+    <link rel="stylesheet" type="text/css" href="/../../dropdown.css">
+    <link rel="stylesheet" type="text/css" href="/../../pagination.css">
+    <link rel="stylesheet" type="text/css" href="/../../media.css">
 </head>
 
 <body>
 <!-- Navbar -->
-    <?php include '../template/navbar.php';?>
+    <?php include (__DIR__.'/../../components/navbar.php');?>
 
     <div class="main-content">
         <div class="column">
@@ -67,19 +70,20 @@
                 <button onclick="openCreateEventPage()" id="createEventBtn" class="admin">Create Event</button>
             <?php endif; ?>
             <div class="row">
-                <input type="text" id="searchInput" placeholder="Search.." value="<?= htmlspecialchars($searchQuery)?>" style="width:250%;">
+                <input type="text" id="searchInput" placeholder="Search.." value="<?= isset($searchQuery) ? htmlspecialchars($searchQuery) : '' ?>" style="width:250%;">
                 <select name="sort" id="sortSelect" class="styled-select">
                     <option value="" <?= empty($sortKey) ? 'selected' : '' ?>>No Sorting</option>
                     <option value="name" <?= $sortKey === 'name' ? 'selected' : '' ?>>Sort by Name</option>
                     <option value="location" <?= $sortKey === 'location' ? 'selected' : '' ?>>Sort by Location</option>
                 </select>
                 <!-- Change input type to "text" for minimum stock -->
-                <input type="text" id="minStockInput" name="min_stock" placeholder="Min Stock" value="<?= htmlspecialchars($minStock) ?>">
+                <input type="text" id="minStockInput" name="min_stock" placeholder="Min Stock" value="<?= isset($minStock) ? htmlspecialchars($minStock) : 0 ?>"
+">
                 <button type="submit" id="search-button">Search</button>
             </div>
             
             <?php foreach ($events as $event) :    
-                include '../template/event.php';
+                include (__DIR__.'/../../components/event.php');
             endforeach;?>
 
             <div class="pagination">
@@ -112,7 +116,7 @@
         </div>
     </div>
     
-    <?php include '../template/footer.php';?>
+    <?php include (__DIR__.'/../../components/footer.php');?>
 
     <script defer>
         function toggleMenu() {
@@ -142,7 +146,7 @@
                 const sortKey = document.getElementById('sortSelect').value;
 
                 // Construct the URL with search, min_stock, and sort parameters
-                const url = `/app/Views/home/home.php?search=${encodeURIComponent(searchQuery)}&min_stock=${encodeURIComponent(minStock)}&sort=${encodeURIComponent(sortKey)}`;
+                const url = `/home?search=${encodeURIComponent(searchQuery)}&min_stock=${encodeURIComponent(minStock)}&sort=${encodeURIComponent(sortKey)}`;
 
                 // Redirect to the updated URL
                 window.location.href = url;
diff --git a/src/Client/pages/login/login.php b/src/Client/pages/login/login.php
index 2ca035a560f262411451a7f910311c690fa21fdb..017eba77ce35f882a7c4bf9b1cbf47ab1f9522d4 100644
--- a/src/Client/pages/login/login.php
+++ b/src/Client/pages/login/login.php
@@ -1,37 +1,40 @@
 <?php
+if (session_status() == PHP_SESSION_NONE) {
+    // If a session is not already started, start a new one
     session_start();
+}
 ?>
 <!DOCTYPE html>
 <html lang="en">
 
-    <head>
-        <title>Login • TICKET KU</title>
-        <meta charset="UTF-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
-        <link rel="stylesheet" type="text/css" href="../../../styles/auth.css">
-    </head>
+<head>
+    <title>Login • TICKET KU</title>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
+    <link rel="stylesheet" type="text/css" href="../../auth.css">
+</head>
 
-    <body>
-        <div class="login-container">
-            <h1>Login</h1>
-            <form id="loginForm" method="post" action="../../router.php">
-                <!-- Aslinya email atau username bisa(?) -->
-                <label for="email">Email or Username</label>
-                <input type="text" id="identifier" name="loginIdentifier" required>
-                
-                <label for="password">Password</label>
-                <input type="password" id="password" name="loginPassword" required>
+<body>
+    <div class="login-container">
+        <h1>Login</h1>
+        <form id="loginForm" method="post" action="login">
+            <!-- Aslinya email atau username bisa(?) -->
+            <label for="email">Email or Username</label>
+            <input type="text" id="identifier" name="loginIdentifier" required>
+            
+            <label for="password">Password</label>
+            <input type="password" id="password" name="loginPassword" required>
 
-                <?php
-                // Check if there is an error message in the session
-                if (isset($_SESSION['message'])) {
-                    echo '<p>' . $_SESSION['message'] . '</p>';
-                    unset($_SESSION['message']); // Remove the error message from the session
-                }
-                ?>
-                <button type="submit" name="userAction" value="login">Login</button>
-            </form>
-            <p>Don't have an account? <a href="register.php">Register</a></p>
-        </div>
-    </body>
-</html>
\ No newline at end of file
+            <?php
+            // Check if there is an error message in the session
+            if (isset($_SESSION['message'])) {
+                echo '<p>' . $_SESSION['message'] . '</p>';
+                unset($_SESSION['message']); // Remove the error message from the session
+            }
+            ?>
+            <button type="submit" name="userAction" value="login">Login</button>
+        </form>
+        <p>Don't have an account? <a href="register">Register</a></p>
+    </div>
+</body>
+</html>
diff --git a/src/Client/pages/login/register.php b/src/Client/pages/login/register.php
index bdd3a0966d3145b309d50affbab88467c515ea29..660b237cd1d8bd7427fe0e40d4941d6492bc5095 100644
--- a/src/Client/pages/login/register.php
+++ b/src/Client/pages/login/register.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
 ?>
 <!DOCTYPE html>
 <html lang="en">
@@ -8,13 +11,13 @@
         <title>Register • TICKET KU</title>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
-        <link rel="stylesheet" type="text/css" href="../../../styles/auth.css">
+        <link rel="stylesheet" type="text/css" href="../../auth.css">
     </head>
 
     <body>
         <div class="register-container">
             <h1>Register</h1>
-            <form id="registerForm" method="post" action="../../router.php">
+            <form id="registerForm" method="post" action="register">
                 <label for="userName">Name</label>
                 <input type="text" id="userName" name="userName" required>
 
@@ -41,7 +44,7 @@
 
                 <button type="submit" name="userAction" value="createUser">Register</button>
             </form>
-            <p>Already have an account? <a href="login.php">Login</a></p>
+            <p>Already have an account? <a href="login">Login</a></p>
         </div>
     </body>
 </html>
\ No newline at end of file
diff --git a/src/Client/pages/pembelian/pembelian.php b/src/Client/pages/pembelian/pembelian.php
index 00d8ce4560b65c3e8d7c566cda67c1ad52ecbfbc..e8b2cfad7daad63cfd7b0bac446709cd840bc7c6 100644
--- a/src/Client/pages/pembelian/pembelian.php
+++ b/src/Client/pages/pembelian/pembelian.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
diff --git a/src/Client/pages/profile/view_profile.php b/src/Client/pages/profile/view_profile.php
index 2eab3bcced344f665141e7c4879a072fa6607f73..7c3c492596ce2e88bac20d1e174093508d4ecf5c 100644
--- a/src/Client/pages/profile/view_profile.php
+++ b/src/Client/pages/profile/view_profile.php
@@ -1,5 +1,8 @@
 <?php
-    session_start();
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
     ob_start();
     if (!isset($_SESSION["user_id"])) {
         echo "here";
diff --git a/styles/pagination.css b/src/Client/pagination.css
similarity index 100%
rename from styles/pagination.css
rename to src/Client/pagination.css
diff --git a/src/Server/Controllers/EventController.php b/src/Server/Controllers/EventController.php
index 21dd49f3bc080f8c3967dc42a85bd96d772f0ebd..0e5c9be2ce8f9e58f260092527fa55aa20a80549 100644
--- a/src/Server/Controllers/EventController.php
+++ b/src/Server/Controllers/EventController.php
@@ -1,8 +1,7 @@
 <?php
-// app/Controllers/EventController.php
 
 ob_start();
-require_once(__DIR__ . '/../../Models/Event.php');
+include(__DIR__ . '../../Models/Event.php');
 require_once(__DIR__ . '/TicketController.php');
 
 
@@ -10,7 +9,7 @@ class EventController {
     private $eventModel;
 
     public function __construct() {
-        $this->eventModel = new EventModel();
+        $this->eventModel = new \Server\Models\EventModel();
     }
 
     public function createEvent($event_name, $stock, $event_price, $event_date, $event_location, $gambar, $vid){
diff --git a/src/Server/Controllers/HomeController.php b/src/Server/Controllers/HomeController.php
new file mode 100644
index 0000000000000000000000000000000000000000..edb1b11791f9ff6066ce07cc2a7fc8906eccbc2d
--- /dev/null
+++ b/src/Server/Controllers/HomeController.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Server\Controllers;
+
+class HomeController {
+    public function __construct(){}
+    public function home()
+    {
+        include (__DIR__.'/../../Client/pages/home/home.php');
+    }
+}
\ No newline at end of file
diff --git a/src/Server/Controllers/PembelianController.php b/src/Server/Controllers/PembelianController.php
index 9f5526def638e8436eec7807ffeff1778b9b542e..5f5701d1ca0c89316e0a11613fe54f96c3b84971 100644
--- a/src/Server/Controllers/PembelianController.php
+++ b/src/Server/Controllers/PembelianController.php
@@ -10,11 +10,10 @@ class PembelianController {
     
     
     public function __construct() {
-        $this->pembelianModel = new PembelianModel();
+        $this->pembelianModel = new \Server\Models\PembelianModel();
     }
 
     public function createPembelian($ticketId, $userId, $createdTime) {
-        $pembelianModel = new PembelianModel();
         return $this->pembelianModel->createPembelian($ticketId, $userId, $createdTime);
     }
 
diff --git a/src/Server/Controllers/TicketController.php b/src/Server/Controllers/TicketController.php
index 962586f10ebe910073345edf0e57faa66d2b421c..8d2944d1caebee23162052f5944727596ac0f275 100644
--- a/src/Server/Controllers/TicketController.php
+++ b/src/Server/Controllers/TicketController.php
@@ -8,7 +8,7 @@ class TicketController {
     private $ticketModel;
 
     public function __construct() {
-        $this->ticketModel = new TicketModel();
+        $this->ticketModel = new \Server\Models\TicketModel();
     }
 
     public function createTicket($name, $eventId) {
diff --git a/src/Server/Controllers/UserController.php b/src/Server/Controllers/UserController.php
index 3ae2e6c4c5ede827e7bf481525c9e222bda0eafd..6bf0731f73c13ca45eca90d6520f1afe6bcb44b4 100644
--- a/src/Server/Controllers/UserController.php
+++ b/src/Server/Controllers/UserController.php
@@ -1,14 +1,15 @@
 <?php
-// app/controllers/userController.php
-ob_start();
-require_once(__DIR__ . '/../Models/User.php');
+
+namespace Server\Controllers;
+
+include (__DIR__.'/../Models/User.php');
 
 
 class UserController {
     private $userModel;
 
     public function __construct() {
-        $this->userModel = new UserModel();
+        $this->userModel = new \Server\Models\UserModel();
     }
 
     public function createUser($name, $username, $email, $hashedPass, $isAdmin) {
@@ -32,8 +33,15 @@ class UserController {
     }
     
     public function registerUser($name, $username, $email, $password, $isAdmin) {
-        return $this->createUser($name, $username, $email, password_hash($password,PASSWORD_DEFAULT), $isAdmin);
+        $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
+    
+        if ($hashedPassword === false) {
+            return ['success' => false, 'message' => 'Password hashing failed'];
+        }
+    
+        return $this->createUser($name, $username, $email, $hashedPassword, $isAdmin);
     }
+    
 
     public function loginByEmail($email,$password) {
         $user = $this->userModel->getUserByEmail($email);
@@ -45,18 +53,6 @@ class UserController {
             return "wrong credentials";
         }
     }
-
-    public function loginByUsername($username,$password) {
-        $user = $this->userModel->getUserByUsername($username);
-        if ($user !== false && password_verify($password, $user['user_hashedPass'])) {
-            session_start();
-            $_SESSION["user_id"] = $user['user_ID'];
-            return "success";
-        } else {
-            session_start();
-            return "wrong credentials";
-        }
-    }
     
     public function logout() {
         session_start();
@@ -72,6 +68,90 @@ class UserController {
     public function editProfile($user_id, $name, $username, $email) {
         return $this->userModel->editProfile($user_id, $name, $username, $email);
     }
+
+    public function loginview() {
+        if (session_status() == PHP_SESSION_NONE) {
+            // If a session is not already started, start a new one
+            session_start();
+        }
+        // Check if the user is already logged in, redirect to home if true
+        if (isset($_SESSION['user_id'])) {
+            header("Location: /home");
+            ob_end_flush();
+            exit();
+        }
+
+        include (__DIR__.'/../../Client/pages/login/login.php');
+    }
+
+    public function login() {
+        // Check if the required parameters are set in the POST request
+        if (isset($_POST['loginIdentifier']) && isset($_POST['loginPassword'])) {
+            $emailOrUsername = $_POST['loginIdentifier'];
+            $password = $_POST['loginPassword'];
+    
+            if (filter_var($emailOrUsername, FILTER_VALIDATE_EMAIL)) {
+                $user = $this->userModel->getUserByEmail($emailOrUsername);
+            } else {
+                $user = $this->userModel->getUserByUsername($emailOrUsername);
+            }
+    
+            if ($user !== false) {
+                if (password_verify($password, $user['user_hashedpass'])) {
+                    session_start();
+                    $_SESSION["user_id"] = $user['user_id'];
+                    header("Location: /home");
+                    ob_end_flush();
+                    exit();
+                } else {
+                    session_start();
+                    $_SESSION['message'] = "Wrong Password";
+                    header("Location: /login");
+                    ob_end_flush();
+                    exit();
+                }
+            } else {
+                session_start();
+                $_SESSION['message'] = "Wrong credentials";
+                header("Location: /login");
+                ob_end_flush();
+                exit();
+            }
+        } else {
+            // Handle missing parameters
+            session_start();
+            $_SESSION['message'] = "Missing login parameters";
+            header("Location: /login");
+            ob_end_flush();
+            exit();
+        }
+    }    
+
+    public function registerview() {
+        include (__DIR__."/../../Client/pages/login/register.php");
+    }
+
+    public function register() {
+        $userName = $_POST['userName'];
+        $userUsername = $_POST['userUsername'];
+        $userEmail = $_POST['userEmail'];
+        $userPassword = $_POST['userPassword'];
+        $isAdmin = isset($_POST['isAdmin']) ? 1 : 0;
+        $response = $this->registerUser($userName,$userUsername,$userEmail,$userPassword,$isAdmin);
+
+        $success = $response['success'];
+        if($success){
+            session_start();
+            $_SESSION['message'] = "You have successfully registered. Please log in";
+            header("Location:login");
+            ob_end_flush();
+        } else {
+            session_start();
+            $_SESSION['error_message'] = $response['message'];
+            header("Location:register");
+            ob_end_flush();
+        }
+    }
     
     public function handleRequest() {
         if (isset($_POST['userAction'])) {
diff --git a/src/Server/Models/Event.php b/src/Server/Models/Event.php
index a9c3285e659d0735b7aafcf35d06c8893318edd4..85a902113d132e4f336c19aa5caa940d90963c53 100644
--- a/src/Server/Models/Event.php
+++ b/src/Server/Models/Event.php
@@ -146,38 +146,31 @@ class EventModel extends Model {
 
     public function searchEvents($searchQuery, $sortKey, $minStock) {
         try {
-            $sql = "SELECT * FROM events WHERE 1";
-
-            if (!empty($searchQuery)) {
-                $sql .= " AND (LOWER(event_name) LIKE CONCAT('%', :query, '%') OR LOWER(event_location) LIKE CONCAT('%', :query, '%'))";
-            }
-
-            if ($minStock !== null) {
-                $sql .= " AND event_stock >= :minStock";
+            if ($minStock == null) {
+                $minStock = 0;
             }
-
-            if ($sortKey === 'name') {
-                $sql .= " ORDER BY event_name ASC";
-            } elseif ($sortKey === 'location') {
-                $sql .= " ORDER BY event_location ASC";
+    
+            $stmt = "SELECT * FROM events 
+                     WHERE (LOWER(event_name) LIKE LOWER(?) OR LOWER(event_location) LIKE LOWER(?)) 
+                     AND event_stock >= ?";
+    
+            if (!empty($sortKey)) {
+                $stmt .= " ORDER BY ";
+    
+                if ($sortKey === 'name') {
+                    $stmt .= "event_name ASC";
+                } elseif ($sortKey === 'location') {
+                    $stmt .= "event_location ASC";
+                } 
             }
-
-            $stmt = $this->database->prepare($sql);
-
-            if (!empty($searchQuery)) {
-                $lowerSearchQuery = strtolower("%" . $searchQuery . "%");
-                $stmt->bindParam(':query', $lowerSearchQuery, PDO::PARAM_STR);
-            }
-
-            if ($minStock !== null) {
-                $stmt->bindParam(':minStock', $minStock, PDO::PARAM_INT);
-            }
-
-            $stmt->execute();
-
-            return $stmt->fetchAll(PDO::FETCH_ASSOC);
+    
+            $query = $this->database->prepare($stmt);
+            $query->execute(array('%'.$searchQuery.'%', '%'.$searchQuery.'%', $minStock));
+    
+            return $query->fetchAll(PDO::FETCH_ASSOC);
         } catch (PDOException $e) {
             throw new Exception("Error searching events: " . $e->getMessage());
         }
     }
+    
 }
diff --git a/src/Server/Models/User.php b/src/Server/Models/User.php
index 43d1dc9d132c4d9fb2d9c41e58246d66eb30a63b..818b24b9f3bd2248e51ebeac3aeb12b429a078d6 100644
--- a/src/Server/Models/User.php
+++ b/src/Server/Models/User.php
@@ -4,6 +4,9 @@ namespace Server\Models;
 
 use PDO;
 
+include (__DIR__."/Model.php");
+
+
 class UserModel extends Model {
     public function createUser($name, $username, $email, $hashedPass, $isAdmin) {
         $response = [
diff --git a/src/Server/Router/Router.php b/src/Server/Router/Router.php
index c6d4249373602c3d6de945a5a89ea4071d82de03..7849f64bc71a714ec681b609040178f0203db7c3 100644
--- a/src/Server/Router/Router.php
+++ b/src/Server/Router/Router.php
@@ -39,16 +39,23 @@ class Router {
             }
         }
 
-        if(is_string($callback)) {
+        if (is_string($callback)) {
             $parts = explode('@', $callback);
-            if(is_array($parts)) {
-                    $className = array_shift($parts);
+            if (is_array($parts)) {
+                $className = array_shift($parts);
+                $method = array_shift($parts);
+        
+                // Check if the class exists before creating an instance
+                if (class_exists($className)) {
                     $handler = new $className;
-                
-                    $method = array_shift($parts);
-                    $callback = [$handler, $method];
+        
+                    // Check if the method exists before setting the callback
+                    if (method_exists($handler, $method)) {
+                        $callback = [$handler, $method];
+                    }
                 }
-        }
+            }
+        }        
     
         if(!$callback) {
             include 'Client/pages/Errors/NotFound.php';
diff --git a/src/Server/web.php b/src/Server/web.php
index 773e259ec4f4f6120347bfcf9c1b5223e3e84b66..d3dbe64a0333eb86605abd2ca487bc32fc95b9e7 100644
--- a/src/Server/web.php
+++ b/src/Server/web.php
@@ -2,43 +2,54 @@
 
 declare(strict_types=1);
 
-namespace Server;
-
-include "Router/Router.php";
-include "Controllers/UserController.php";
-include "Controllers/EventsController.php";
+include (__DIR__."/Router/Router.php");
+include (__DIR__."/Controllers/UserController.php");
+include (__DIR__."/Controllers/EventController.php");
+include (__DIR__."/Controllers/HomeController.php");
 
 $router = new \Server\Router\Router();
 
-function checkLoggedIn() {
-    session_start();
-    if (!isset($_SESSION['user_id'])) {
-        header('Location: /login'); // Redirect to the login page if not logged in
-        exit();
+function checkLoggedIn(): bool {
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
     }
+    return isset($_SESSION['user_id']);
 }
 
 $router->get('/', function() {
     header('Location: /home');
-    
+    exit();
 });
 
+// Routes for HomeController
+$router->get('/home', [new \Server\Controllers\HomeController(),'home']);
+
 // Routes for UserController
-$router->get('/register', [checkLoggedIn, \Server\Controllers\UserController::class, 'registerview']);
-$router->post('/register', [checkLoggedIn, \Server\Controllers\UserController::class, 'register']);
-$router->post('/register/search-email', [checkLoggedIn, \Server\Controllers\UserController::class, 'findEmail']);
-$router->post('/register/search-username', [checkLoggedIn, \Server\Controllers\UserController::class, 'findByUsername']);
-$router->get('/login', [\Server\Controllers\UserController::class, 'loginview']);
-$router->post('/login', [\Server\Controllers\UserController::class, 'login']);
-$router->post('/logout', [checkLoggedIn, \Server\Controllers\UserController::class, 'logout']);
-$router->post('/profile', [checkLoggedIn, \Server\Controllers\UserController::class, 'viewProfile']);
-$router->post('/profile/edit', [checkLoggedIn, \Server\Controllers\UserController::class, 'editProfile']);
+$router->get('/register', [new \Server\Controllers\UserController(), 'registerview']);
+$router->post('/register', [new \Server\Controllers\UserController(), 'register']);
+$router->post('/register/search-email', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'findEmail']]);
+$router->post('/register/search-username', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'findByUsername']]);
+$router->get('/login', [new \Server\Controllers\UserController(), 'loginview']);
+$router->post('/login', [new \Server\Controllers\UserController(), 'login']);
+$router->post('/logout', function() {
+    // No need to checkLoggedIn() here, as users can access this even if not logged in
+    if (session_status() == PHP_SESSION_NONE) {
+        // If a session is not already started, start a new one
+        session_start();
+    }
+    session_destroy();
+    header('Location: /login');
+    exit();
+});
+$router->post('/profile', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'viewProfile']]);
+$router->post('/profile/edit', [checkLoggedIn(), [new \Server\Controllers\UserController(), 'editProfile']]);
 
 // Routes for EventsController
-$router->get('/events', [checkLoggedIn, \Server\Controllers\EventsController::class, 'eventList10view']);
-$router->post('/events/create', [checkLoggedIn, \Server\Controllers\EventsController::class, 'createEvent']);
-$router->post('/events/update', [checkLoggedIn, \Server\Controllers\EventsController::class, 'updateEvent']);
-$router->post('/events/delete', [checkLoggedIn, \Server\Controllers\EventsController::class, 'deleteEvent']);
-$router->get('/events/search', [checkLoggedIn, \Server\Controllers\EventsController::class, 'searchview']);
+// $router->get('/events', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'eventList10view']]);
+// $router->post('/events/create', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'createEvent']]);
+// $router->post('/events/update', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'updateEvent']]);
+// $router->post('/events/delete', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'deleteEvent']]);
+// $router->get('/events/search', [checkLoggedIn(), [new \Server\Controllers\EventController(), 'searchview']]);
 
 $router->run();
diff --git a/src/index.php b/src/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6f970c24bd5e2e3475cc2b39d935ed8bb2f456e
--- /dev/null
+++ b/src/index.php
@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+if (session_status() == PHP_SESSION_NONE) {
+    // If a session is not already started, start a new one
+    session_start();
+}
+
+include 'Server/web.php';
+
+?>