diff --git a/prisma/migrations/20240511164426_init/migration.sql b/prisma/migrations/20240512163859_init/migration.sql
similarity index 100%
rename from prisma/migrations/20240511164426_init/migration.sql
rename to prisma/migrations/20240512163859_init/migration.sql
diff --git a/src/app/ZoneManager.ts b/src/app/ZoneManager.ts
index 101ee14..74836fd 100644
--- a/src/app/ZoneManager.ts
+++ b/src/app/ZoneManager.ts
@@ -8,29 +8,16 @@ interface ILoadedZone {
 }
 
 class ZoneManager {
-    private static instance: ZoneManager;
     private loadedZones: ILoadedZone[] = [];
 
-    private constructor() {}
-
-    // Singleton instance getter
-    public static getInstance(): ZoneManager {
-        if (!ZoneManager.instance) {
-            ZoneManager.instance = new ZoneManager();
-        }
-        return ZoneManager.instance;
-    }
-
     // Method to initialize zone loading
     public async boot() {
-        const zoneRepository = new ZoneRepository();
-
-        if (!await zoneRepository.getById(1)) {
+        if (!await ZoneRepository.getById(1)) {
             const zoneService = new ZoneService();
             await zoneService.createDemoZone();
         }
 
-        const zones = await zoneRepository.getAll();
+        const zones = await ZoneRepository.getAll();
 
         for (const zone of zones) {
             this.loadZone(zone);
@@ -62,6 +49,22 @@ class ZoneManager {
             return loadedZone.zone;
         });
     }
+
+    public addCharacterToZone(zoneId: number, character: Character) {
+        const loadedZone = this.loadedZones.find((loadedZone) => {
+            return loadedZone.zone.id === zoneId;
+        });
+        if (loadedZone) {
+            loadedZone.characters.push(character);
+        }
+    }
+
+    public getCharactersInZone(zoneId: number): Character[] {
+        const loadedZone = this.loadedZones.find((loadedZone) => {
+            return loadedZone.zone.id === zoneId;
+        });
+        return loadedZone ? loadedZone.characters : [];
+    }
 }
 
-export default ZoneManager;
+export default new ZoneManager;
diff --git a/src/app/events/character.zone.load.ts b/src/app/events/character.zone.load.ts
index 0b16d11..2e988f7 100644
--- a/src/app/events/character.zone.load.ts
+++ b/src/app/events/character.zone.load.ts
@@ -1,7 +1,29 @@
 import { Socket, Server } from "socket.io";
+import ZoneRepository from "../repositories/zone.repository";
+import ZoneManager from "../ZoneManager";
 
-export default function characterZoneLoad(socket: Socket, io: Server) {
-    socket.on('character:map:load', (data) => {
-        console.log(`---User ${socket.id} has requested map.`);
-    });
+interface IZoneLoad {
+    zoneId?: number;
 }
+
+/**
+ * @TODO: Implement zone loading, check if zone id is given or else load current character zone
+ *
+ * Handle character zone load event
+ * @param socket
+ * @param io
+ */
+export default function characterZoneLoad(socket: Socket, io: Server) {
+    socket.on('character:zone:load', async (data: IZoneLoad) => {
+        console.log(`---User ${socket.id} has requested zone.`);
+
+        const zone = await ZoneRepository.getById(1);
+
+        // zoneManager.addCharacterToZone(1, socket.user.id)
+
+        io.to(socket.id).emit('character:zone:load', {
+            success: true,
+            data: zone
+        });
+    });
+}
\ No newline at end of file
diff --git a/src/app/events/character.zone.load_players.ts b/src/app/events/character.zone.load_players.ts
new file mode 100644
index 0000000..b91b439
--- /dev/null
+++ b/src/app/events/character.zone.load_players.ts
@@ -0,0 +1,25 @@
+import { Socket, Server } from "socket.io";
+import ZoneRepository from "../repositories/zone.repository";
+import ZoneManager from "../ZoneManager";
+
+interface IZoneLoadPlayers {
+    zoneId: number;
+}
+
+/**
+ * @TODO: Implement zone loading, check if zone id is given or else load current character zone
+ *
+ * Handle character zone load event
+ * @param socket
+ * @param io
+ */
+export default function characterZoneLoad(socket: Socket, io: Server) {
+    socket.on('character:zone:load:players', async (data: IZoneLoadPlayers) => {
+        console.log(`---User ${socket.id} has requested zone players for zone.` + data.zoneId);
+
+        io.to(socket.id).emit('character:zone:load:players', {
+            success: true,
+            data: ZoneManager.getCharactersInZone(data.zoneId)
+        });
+    });
+}
\ No newline at end of file
diff --git a/src/app/repositories/character.repository.ts b/src/app/repositories/character.repository.ts
index 4900060..325528d 100644
--- a/src/app/repositories/character.repository.ts
+++ b/src/app/repositories/character.repository.ts
@@ -15,6 +15,24 @@ class CharacterRepository {
             throw new Error(`Failed to get character by user ID: ${error.message}`);
         }
     }
+
+    async create(userId: number, name: string): Promise<Character | null> {
+        try {
+            return await prisma.character.create({
+                data: {
+                    userId,
+                    name,
+                    position_x: 0,
+                    position_y: 0,
+                    rotation: 0,
+                    zoneId: 1,
+                },
+            });
+        } catch (error: any) {
+            // Handle error
+            throw new Error(`Failed to create character: ${error.message}`);
+        }
+    }
 }
 
-export default new CharacterService;
\ No newline at end of file
+export default new CharacterRepository;
\ No newline at end of file
diff --git a/src/app/repositories/zone.repository.ts b/src/app/repositories/zone.repository.ts
index 8b07d19..402529a 100644
--- a/src/app/repositories/zone.repository.ts
+++ b/src/app/repositories/zone.repository.ts
@@ -50,4 +50,4 @@ class ZoneRepository {
     }
 }
 
-export default ZoneRepository;
\ No newline at end of file
+export default new ZoneRepository;
\ No newline at end of file
diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts
index 3bcde63..9d5d4f1 100644
--- a/src/app/services/user.service.ts
+++ b/src/app/services/user.service.ts
@@ -1,5 +1,6 @@
 import bcrypt from "bcryptjs";
 import UserRepository from "../repositories/user.repository";
+import CharacterRepository from "../repositories/character.repository";
 
 class UserService {
     async login(username: string, password: string): Promise<boolean | any> {
@@ -23,7 +24,12 @@ class UserService {
         }
 
         const hashedPassword = await bcrypt.hash(password, 10);
-        return await UserRepository.create(username, hashedPassword);
+        const newUser = await UserRepository.create(username, hashedPassword);
+
+        // @TODO: Create a new character for the user
+        const newCharacter = await CharacterRepository.create(newUser.id, newUser.username);
+
+        return newUser
     }
 }
 
diff --git a/src/app/services/zone.service.ts b/src/app/services/zone.service.ts
index 3343398..22ad5c3 100644
--- a/src/app/services/zone.service.ts
+++ b/src/app/services/zone.service.ts
@@ -5,8 +5,7 @@ class ZoneService
 {
     async createDemoZone(): Promise<boolean>
     {
-        const zoneRepo = new ZoneRepository();
-        await zoneRepo.create("Demo Zone", 10, 10, [
+        await ZoneRepository.create("Demo Zone", 10, 10, [
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
             [0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
diff --git a/src/server.ts b/src/server.ts
index 89b03ea..c2d0128 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -55,8 +55,7 @@ export class Server
         await api.addAuthRoutes(this.app);
 
         // Load zone manager
-        const zoneManager = ZoneManager.getInstance();
-        await zoneManager.boot();
+        await ZoneManager.boot();
 
         // Listen for socket connections
         this.io.on('connection', this.handleConnection.bind(this));
@@ -68,7 +67,7 @@ export class Server
      * @private
      */
     private async handleConnection(socket: Socket) {
-        const eventsPath = path.join(__dirname, 'events');
+        const eventsPath = path.join(__dirname, 'app', 'events');
         try {
             const files: string[] = await fs.promises.readdir(eventsPath);
             for (const file of files) {