diff --git a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
index 0818ad1a64a438457b4a1aaecdc7ebfce2dd6030..643b8e1c5ebbd89eabac768ea803564933ae94ed 100644
--- a/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
+++ b/frontend/core/src/com/game/tankwars/controller/LeaderboardController.java
@@ -3,17 +3,49 @@ package com.game.tankwars.controller;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Net;
 import com.badlogic.gdx.net.HttpRequestBuilder;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.ui.Button;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.Json;
 import com.game.tankwars.Callback;
 import com.game.tankwars.ConfigReader;
 import com.game.tankwars.ReceiverHandler;
+import com.game.tankwars.TankWarsGame;
 import com.game.tankwars.model.User;
+import com.game.tankwars.view.LeaderboardScreen;
+import com.game.tankwars.view.MainMenuScreen;
 
 public class LeaderboardController {
+
+    private final TankWarsGame tankWarsGame;
+    private final Button backButton;
+    private final LeaderboardScreen screen;
     Array<User> leaderboardUsers;
     private int retries = 0;
 
+    public LeaderboardController(final TankWarsGame tankWarsGame, Button backButton, LeaderboardScreen screen) {
+        this.tankWarsGame = tankWarsGame;
+        this.backButton = backButton;
+        this.screen = screen;
+
+        setEventListeners();
+        fetchLeaderboard();
+    }
+
+    private void setEventListeners() {
+        /*
+         * Transition back to main menu
+         */
+        backButton.addListener(new InputListener() {
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                tankWarsGame.setScreen(new MainMenuScreen(tankWarsGame));
+                return true;
+            }
+        });
+    }
+
     public void fetchLeaderboard() {
         // Create a new instance of the Callback interface to handle the response
         Callback callback = new Callback() {
@@ -32,9 +64,9 @@ public class LeaderboardController {
                 retries += 1;
             }
         };
+
         // Define the URL for the HTTP request
         String url = ConfigReader.getProperty("backend.url") + "/highscores";
-
         // Create a new HttpRequest using the HttpRequestBuilder class
         Net.HttpRequest httpRequest = new HttpRequestBuilder()
                 .newRequest()
diff --git a/frontend/core/src/com/game/tankwars/view/LeaderboardScreen.java b/frontend/core/src/com/game/tankwars/view/LeaderboardScreen.java
index 62ce0e20958fd1064fac48625f4d19ace99e470e..3176f29a231ebf171925e1cdda9214a1b4eac6a6 100644
--- a/frontend/core/src/com/game/tankwars/view/LeaderboardScreen.java
+++ b/frontend/core/src/com/game/tankwars/view/LeaderboardScreen.java
@@ -2,80 +2,139 @@ package com.game.tankwars.view;
 
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Screen;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.OrthographicCamera;
-import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.scenes.scene2d.Group;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.ui.Button;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
 import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
+import com.badlogic.gdx.utils.Align;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.ScreenUtils;
+import com.badlogic.gdx.utils.viewport.ExtendViewport;
+import com.game.tankwars.ResourceManager;
 import com.game.tankwars.TankWarsGame;
 import com.game.tankwars.controller.LeaderboardController;
 import com.game.tankwars.model.User;
 
-import java.awt.Label;
-
 public class LeaderboardScreen implements Screen {
 
-    final TankWarsGame tankWarsGame;
-    OrthographicCamera camera;
-    SpriteBatch batch;
-    private BitmapFont font;
-
-    //LibGDX have tables or something, should be investigated
-    Table table;
+    private final TankWarsGame tankWarsGame;
+    private Stage stage;
 
-    private Array<User> leaderboardUsers;
+    private Skin skin;
+    private Table boardTable;
     LeaderboardController leaderboardController;
 
 
 
     public LeaderboardScreen (final TankWarsGame tankWarsGame) {
         this.tankWarsGame = tankWarsGame;
-        camera = new OrthographicCamera();
-        batch = new SpriteBatch();
-        font = new BitmapFont();
-        font.getData().setScale(3f);
-        font.setColor(Color.BLACK);
-
-        leaderboardController = new LeaderboardController();
     }
 
     @Override
-    public void render(float delta) {
-        ScreenUtils.clear(255, 255, 255, 1);
-        int height = Gdx.graphics.getHeight() - 75;
-        batch.begin();
-        leaderboardUsers = leaderboardController.getLeaderboard();
+    public void show() {
+        stage = new Stage(new ExtendViewport(tankWarsGame.getViewportWidth(),
+                tankWarsGame.getViewportHeight()), new SpriteBatch());
+        Gdx.input.setInputProcessor(stage);
+
+        skin = ResourceManager.getInstance().loadAndGetMenuAssets();
+
+        Image background = new Image(skin.getDrawable("camo-background-portrait-blurred"));
+        Image logo = new Image(skin.getDrawable("logo"));
+        Drawable headerBox = skin.getDrawable("dark-menu-header");
+        Drawable boardBackground = skin.getDrawable("transparent-white-box");
+
+        Label leaderboardLabel = new Label("Leaderboard", skin.get("header", Label.LabelStyle.class));
+        Label userLabel = new Label("User", skin.get("header", Label.LabelStyle.class));
+        Label pointsLabel = new Label("Wins", skin.get("header", Label.LabelStyle.class));
+
+        Button backButton = new Button(skin.get("default", Button.ButtonStyle.class));
+
+        //--- Layout
+        float logoWidth = stage.getWidth() / 4f;
+        float headerPadding = backButton.getWidth() + 16;
+
+        Table headerTable = new Table();
+        headerTable.background(headerBox);
+        headerTable.add(backButton).padLeft(headerPadding - backButton.getWidth());
+        headerTable.add(logo).width(logoWidth).
+                height(logo.getHeight() / logo.getWidth() * logoWidth).expandX().padRight(headerPadding);
+        headerTable.add(leaderboardLabel).expandX().padRight(headerPadding);
+
+        boardTable = new Table();
+        boardTable.background(boardBackground);
+        boardTable.align(Align.top);
+        boardTable.row().expandX().padTop(4);
+        boardTable.add(userLabel);
+        boardTable.add(pointsLabel);
+        ScrollPane boardScrollPane = new ScrollPane(boardTable);
+
+        Table rootTable = new Table();
+        rootTable.setFillParent(true);
+        rootTable.add(headerTable).fillX().height(2 * stage.getHeight() / 7f).top();
+        rootTable.row().expand();
+        rootTable.add(boardScrollPane).width(2 * stage.getWidth() / 3f).fillY().padTop(16);
+
+        Group group = new Group();
+        group.setSize(stage.getWidth(), stage.getHeight());
+        background.setSize(stage.getWidth(), background.getHeight() / background.getWidth() * stage.getWidth());
+        background.setPosition(0, stage.getHeight() / 2f - background.getHeight() / 2f);
+        group.addActor(background);
+        group.addActor(rootTable);
+
+        stage.addActor(group);
+
+        leaderboardController = new LeaderboardController(tankWarsGame, backButton, this);
+    }
 
-        if (leaderboardUsers == null) {
-            font.draw(batch, "No connection", 50, height);
-        }
-        else if (leaderboardUsers.size > 0) {
-            for (User user : leaderboardUsers) {
-                font.draw(batch, user.username, (Gdx.graphics.getWidth() >> 1) - 300, height);
-                font.draw(batch, user.wins + "", (Gdx.graphics.getWidth() >> 1), height);
-                height = height - 75;
+    /**
+     * Adds users to leaderboard with username and number of wins.
+     * Displays "No connection" or "No users" in case there is no connection
+     * to the server or the array is empty.
+     *
+     * @param users Array of users to be included in the leaderboard
+     */
+    public void setLeaderBoard(Array<User> users) {
+        if (users == null) {
+            boardTable.row().expand().colspan(2);
+            Label noConnection = new Label("No connection", skin.get("default", Label.LabelStyle.class));
+            boardTable.add(noConnection);
+        } else if (users.size == 0) {
+            boardTable.row().expand().colspan(2);
+            Label noUsers = new Label("No users", skin.get("default", Label.LabelStyle.class));
+            boardTable.add(noUsers);
+        } else {
+            for (User user : users) {
+                boardTable.row().expandX();
+                Label username = new Label(user.username,  skin.get("default", Label.LabelStyle.class));
+                boardTable.add(username);
+                Label points = new Label(String.valueOf(user.wins),  skin.get("default", Label.LabelStyle.class));
+                boardTable.add(points);
             }
         }
-        else {
-            font.draw(batch, "No users", 50, height);
-        }
-        batch.end();
     }
 
     @Override
-    public void dispose() {
+    public void render(float delta) {
+        ScreenUtils.clear(0, 0, 0, 1);
 
+        stage.act(delta);
+        stage.draw();
     }
 
     @Override
-    public void show() {
-
+    public void dispose() {
+        stage.dispose();
     }
+
     @Override
     public void resize(int width, int height) {
-
+        stage.getViewport().update(width, height);
     }
 
     @Override
@@ -90,7 +149,7 @@ public class LeaderboardScreen implements Screen {
 
     @Override
     public void hide() {
-
+        dispose();
     }
 
 }