diff --git a/public/css/navbar.css b/public/css/navbar.css
index 993c2db8f2c03e7132920c45b53f47b0c10a3fe8..80e33119d93bfe21a66a9f6985e9ee4d67081b66 100644
--- a/public/css/navbar.css
+++ b/public/css/navbar.css
@@ -128,6 +128,10 @@ li {
   display: none;
 }
 
+.logo {
+  font-weight: bolder;
+}
+
 @media screen and (max-width: 800px) {
   .mobile-view {
     display: flex;
diff --git a/src/App.php b/src/App.php
index c3ecd1adab5aece3fc2716109213b3568bad381c..c6d9097fede08d91b4dd48b05c57c3d248867a23 100644
--- a/src/App.php
+++ b/src/App.php
@@ -7,6 +7,7 @@ use app\base\BaseController;
 use app\controllers\CreateFilmController;
 use app\controllers\LoginController;
 use app\controllers\MainController;
+use app\controllers\ProfileController;
 use app\controllers\ReviewController;
 use app\controllers\RegisterController;
 use app\controllers\UpdateFilmController;
@@ -36,5 +37,6 @@ class App
     $this->router->addRoute('/register', RegisterController::class);
     $this->router->addRoute('/add-film', CreateFilmController::class);
     $this->router->addRoute('/update-film', UpdateFilmController::class);
+    $this->router->addRoute('/profile', ProfileController::class);
   }
 }
diff --git a/src/base/BaseController.php b/src/base/BaseController.php
index d976e3a2b42d5a94a2b626184ccbb5ae6b90bea9..86d3848bee8974a5d09272ec6a52954c4b4429a5 100644
--- a/src/base/BaseController.php
+++ b/src/base/BaseController.php
@@ -48,8 +48,12 @@ abstract class BaseController
     include_once __DIR__ . "/../../views/{$layout}.php";
   }
 
-  protected static function redirect($url, $statusCode = 303)
+  protected static function redirect($url, $data = [], $statusCode = 303)
   {
-    header('Location: ' . $url, true, $statusCode);
+    $params = "";
+    foreach ($data as $key => $value) {
+      $params .= "$key=$value&";
+    }
+    header('Location: ' . $url . "?" . $params, true, $statusCode);
   }
 }
diff --git a/src/controllers/CreateFilmController.php b/src/controllers/CreateFilmController.php
index dbd98255fc8530d4fe5fc053d1c3ba48e52178d1..560fad08f5d468ea55dcbde05498f9018aab9c04 100644
--- a/src/controllers/CreateFilmController.php
+++ b/src/controllers/CreateFilmController.php
@@ -40,7 +40,7 @@ class CreateFilmController extends BaseController
   {
     if (!isset($_SESSION['role']) or $_SESSION['role'] != 'admin') {
       // TODO: make error controller
-      parent::redirect("/error", 401);
+      parent::redirect("/error", [], 401);
       return;
     }
     parent::render($urlParams, "create_film", "layouts/base");
diff --git a/src/controllers/ProfileController.php b/src/controllers/ProfileController.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc9f2daff2c8a7fc1e2ac74d5372934161fc1a55
--- /dev/null
+++ b/src/controllers/ProfileController.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace app\controllers;
+
+use app\base\BaseController;
+use app\exceptions\BadRequestException;
+use app\models\UserModel;
+use app\Request;
+use app\services\UserService;
+use Exception;
+
+class ProfileController extends BaseController
+{
+  public function __construct()
+  {
+    parent::__construct(UserService::getInstance());
+  }
+
+  protected function get($urlParams)
+  {
+
+    $user = $this->service->getById($_SESSION['user_id']);
+    $data = [];
+    $data['email'] = $user->email;
+    $data['username'] = $user->username;
+    parent::render($data, "profile", "layouts/base");
+  }
+
+  protected function post($urlParams)
+  {
+    try {
+      $user = $this->service->getById($_SESSION['user_id']);
+      $old_pass = $user->password;
+
+      // Get data
+      $email = $_POST['email'];
+      $username = $_POST['username'];
+      $password = $_POST['password'] ? $_POST['password'] : $old_pass;
+      $confirm_password = $_POST['confirm-password'] ? $_POST['confirm-password'] : $old_pass;
+
+      if ($this->service->isEmailExist($email) and $user->email != $email) {
+        throw new BadRequestException("Email Already Exists!");
+      }
+
+      if ($this->service->isUsernameExist($username) and $user->username != $username) {
+        throw new BadRequestException("Username Already Exists!");
+      }
+
+      if ($password != $confirm_password) {
+        throw new BadRequestException("Password does not match!");
+      }
+
+      $user
+        ->set('email', $email)
+        ->set('username', $username)
+        ->set('password', $_POST['password'] ? password_hash($password, PASSWORD_DEFAULT) : $password);
+
+      // Call service
+      $response = $this->service->update($user);
+      echo $response;
+      $msg = "";
+
+      $_SESSION['username'] = $username;
+      $msg = "Successfully updated profile!";
+
+      // Render response
+      parent::redirect("/", ["Msg" => $msg]);
+    } catch (Exception $e) {
+      $msg = $e->getMessage();
+      parent::render(["errorMsg" => $msg], "profile", "layouts/base");
+    }
+  }
+}
diff --git a/src/controllers/UpdateFilmController.php b/src/controllers/UpdateFilmController.php
index 5d82e550aa5830092957aceab14f3631e5d5c95c..31af038d5f9e5aba008f47890fb36399e59e442c 100644
--- a/src/controllers/UpdateFilmController.php
+++ b/src/controllers/UpdateFilmController.php
@@ -46,10 +46,17 @@ class UpdateFilmController extends BaseController
       return;
     }
 
-    $film_id = $urlParams['film-id'];
+    $film_id = $urlParams['film_id'];
     $film = $this->service->getById($film_id);
-
-    parent::render($film, "update_film", "layouts/base");
+    $data = [];
+    $data['title'] = $film->title;
+    $data['released_year'] = $film->released_year;
+    $data['director'] = $film->director;
+    $data['description'] = $film->description;
+    $data['cast'] = $film->cast;
+    $data['genre'] = $film->genre;
+
+    parent::render($data, "update_film", "layouts/base");
   }
 
   protected function post($urlParams)
@@ -59,20 +66,22 @@ class UpdateFilmController extends BaseController
       return;
     }
     try {
-      $film_id = $urlParams['film-id'];
+      $film_id = $urlParams['film_id'];
       $film = $this->service->getById($film_id);
 
       // Get data
-      $film['title'] = $_POST['title'];
-      $film['released_year'] = $_POST['released-year'];
-      $film['director'] = $_POST['director'];
-      $film['description'] = $_POST['description'];
-      $film['cast'] = $_POST['cast'];
-      $film['genre'] = $_POST['genre'];
+      $data = [];
+      $data['film_id'] = $film->film_id;
+      $data['title'] = $_POST['title'];
+      $data['released_year'] = $_POST['released-year'];
+      $data['director'] = $_POST['director'];
+      $data['description'] = $_POST['description'];
+      $data['cast'] = $_POST['cast'];
+      $data['genre'] = $_POST['genre'];
 
       // Check if file is valid
       if ($_FILES['image-path']['error'] == UPLOAD_ERR_NO_FILE) {
-        $image_path = $film['image_path'];
+        $data['image_path'] = $film->image_path;
       } else {
         if ($_FILES['image-path']['error'] == UPLOAD_ERR_OK) {
           $image_tmp = $_FILES['image-path']['tmp_name'];
@@ -89,7 +98,7 @@ class UpdateFilmController extends BaseController
       }
 
       if ($_FILES['trailer-path']['error'] == UPLOAD_ERR_NO_FILE) {
-        $trailer_path = $film['trailer_path'];
+        $data['trailer_path'] = $film->trailer_path;
       } else {
         if ($_FILES['trailer-path']['error'] == UPLOAD_ERR_OK) {
           $trailer_tmp = $_FILES['trailer-path']['tmp_name'];
@@ -107,15 +116,14 @@ class UpdateFilmController extends BaseController
 
       // Call service
       $filmModel = new FilmModel();
-      $filmModel->constructFromArray($film);
+      $filmModel->constructFromArray($data);
       $response = $this->service->update($filmModel);
       if ($response) {
-        var_dump($response);
         $msg = "Successfully updated film!";
       }
 
       // Render response
-      parent::render(["Msg" => $msg], "home", "layouts/base");
+      parent::redirect("/", ["Msg" => $msg]);
     } catch (Exception $e) {
       $msg = $e->getMessage();
       parent::render(["errorMsg" => $msg], "create_film", "layouts/base");
diff --git a/src/services/FilmService.php b/src/services/FilmService.php
index e90743a9f2249f0a63dfdbe1b040d5c560f41155..de99aad9df6d7704dae16e2220d3b9415e262e69 100644
--- a/src/services/FilmService.php
+++ b/src/services/FilmService.php
@@ -59,7 +59,15 @@ class FilmService extends BaseService
 
   public function getById($film_id)
   {
-    return $this->repository->getById($film_id);
+    $film = $this->repository->getById($film_id);
+
+    if ($film) {
+      $filmModel = new filmModel();
+      $filmModel->constructFromArray($film);
+      return $filmModel;
+    }
+
+    return null;
   }
 
   public function update($film)
diff --git a/src/services/UserService.php b/src/services/UserService.php
index d9f4ad9e299982db81b784fb81c62f0000c82df8..f3dccab139ba0b3adac590fee428c3b641dbba8f 100644
--- a/src/services/UserService.php
+++ b/src/services/UserService.php
@@ -119,7 +119,11 @@ class UserService extends BaseService
   {
     // $user = (new UserModel())->set('nama', $nama)->set('username', $username)->set('email', $email)->set('password', password_hash($password, PASSWORD_DEFAULT));
     $user = new UserModel();
-    $user->set('email', $email)->set('username', $username)->set('password', password_hash($password, PASSWORD_DEFAULT))->set('role', $role);
+    $user
+      ->set('email', $email)
+      ->set('username', $username)
+      ->set('password', password_hash($password, PASSWORD_DEFAULT))
+      ->set('role', $role);
 
     $id = $this->repository->insert($user, array(
       'email' => PDO::PARAM_STR,
@@ -187,4 +191,15 @@ class UserService extends BaseService
 
     return null;
   }
+
+  public function update($user)
+  {
+    $arrParams = [];
+    $arrParams['user_id'] = PDO::PARAM_INT;
+    $arrParams['email'] = PDO::PARAM_STR;
+    $arrParams['username'] = PDO::PARAM_STR;
+    $arrParams['password'] = PDO::PARAM_STR;
+    $arrParams['role'] = PDO::PARAM_STR;
+    $this->repository->update($user, $arrParams);
+  }
 }
diff --git a/views/layouts/base.php b/views/layouts/base.php
index caa409e20d0892183c530de0cc1abc17e988d3de..e602316656d6b08fb73725225dc16efd44d1da87 100644
--- a/views/layouts/base.php
+++ b/views/layouts/base.php
@@ -10,6 +10,9 @@
   <link rel="preconnect" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
   <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap" rel="stylesheet">
+  <link rel="preconnect" href="https://fonts.googleapis.com">
+  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+  <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
   <!-- <link rel="stylesheet" href="public/css/lib.css">
   <link rel="stylesheet" href="public/css/shared.css">
   <link rel="stylesheet" href="public/css/home.css"> -->
@@ -27,7 +30,7 @@
     <ul class='nav-links'>
       <div class='menu'>
         <li class='menu-item'><a href='/'>Home</a></li>
-        <li class='menu-item'><a href='/film'>Films</a></li>
+        <li class='menu-item'><a href='/add-film'>Films</a></li>
 
         <?php
 
@@ -42,11 +45,11 @@
           }
         } else {
           $username = $_SESSION['username'];
-          echo "<p class='profile'><a href='/'> <img src='/public/assets/person.svg'></img> <span>username</span></a></p>";
+          echo "<p class='profile'><a href='/profile'> <img src='/public/assets/person.svg'></img> <span>$username</span></a></p>";
           echo "<button class='logout-button'><a href='/logout'>Logout</a></button>";
         }
         ?>
-        
+
       </div>
     </ul>
     <!-- <div class='mobile-view'>
diff --git a/views/profile.php b/views/profile.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb53e08e0138c42802480eb46e067fc52939963e
--- /dev/null
+++ b/views/profile.php
@@ -0,0 +1,31 @@
+<div class="form-container">
+  <h2 class="header-title">Profile</h2>
+  <p class="error-msg"><?php if (isset($errorMsg)) {
+                          echo "$errorMsg";
+                        } ?></p>
+  <form class="form" method="post" enctype="multipart/form-data">
+    <div class="form-group">
+      <label for="email">Email</label>
+      <br>
+      <input class="input" type="text" id="email" name="email" value="<?= $email ?>" required>
+    </div>
+    <div class="form-group">
+      <label for="username">Username</label>
+      <br>
+      <input class="input" type="text" id="username" name="username" value="<?= $username ?>" required>
+    </div>
+    <div class="form-group">
+      <label for="password">Password</label>
+      <br>
+      <input class="input" type="password" id="password" name="password">
+    </div>
+    <div class="form-group">
+      <label for="confirm-password">Confirm Password</label>
+      <br>
+      <input class="input" type="password" id="confirm-password" name="confirm-password">
+    </div>
+    <div class="form-group">
+      <button class="button" ctype="submit">Add</button>
+    </div>
+  </form>
+</div>
\ No newline at end of file