diff --git a/src/events/disconnect.ts b/src/events/disconnect.ts
index ea650a7..3b5a13a 100644
--- a/src/events/disconnect.ts
+++ b/src/events/disconnect.ts
@@ -1,6 +1,5 @@
 import { Server } from 'socket.io'
 import { TSocket } from '../utilities/types'
-import ZoneManager from '../managers/zoneManager'
 import CharacterManager from '../managers/characterManager'
 
 export default function (socket: TSocket, io: Server) {
diff --git a/src/events/gameMaster/assetManager/object/list.ts b/src/events/gameMaster/assetManager/object/list.ts
index 61890f0..860119d 100644
--- a/src/events/gameMaster/assetManager/object/list.ts
+++ b/src/events/gameMaster/assetManager/object/list.ts
@@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types'
 import { Object } from '@prisma/client'
 import ObjectRepository from '../../../../repositories/objectRepository'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 interface IPayload {}
 
@@ -13,10 +14,11 @@ interface IPayload {}
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:object:list', async (data: any, callback: (response: Object[]) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
-      return
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return callback([])
+
+    if (character.role !== 'gm') {
+      return callback([])
     }
 
     // get all objects
diff --git a/src/events/gameMaster/assetManager/object/remove.ts b/src/events/gameMaster/assetManager/object/remove.ts
index a267b68..77299b2 100644
--- a/src/events/gameMaster/assetManager/object/remove.ts
+++ b/src/events/gameMaster/assetManager/object/remove.ts
@@ -4,6 +4,7 @@ import path from 'path'
 import fs from 'fs'
 import prisma from '../../../../utilities/prisma'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 interface IPayload {
   object: string
@@ -16,9 +17,11 @@ interface IPayload {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:object:remove', async (data: IPayload, callback: (response: boolean) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      return
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return callback(false)
+
+    if (character.role !== 'gm') {
+      return callback(false)
     }
 
     try {
diff --git a/src/events/gameMaster/assetManager/object/update.ts b/src/events/gameMaster/assetManager/object/update.ts
index e054ea2..156f68d 100644
--- a/src/events/gameMaster/assetManager/object/update.ts
+++ b/src/events/gameMaster/assetManager/object/update.ts
@@ -2,6 +2,7 @@ import { Server } from 'socket.io'
 import { TSocket } from '../../../../utilities/types'
 import prisma from '../../../../utilities/prisma'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 type Payload = {
   id: string
@@ -22,9 +23,11 @@ type Payload = {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:object:update', async (data: Payload, callback: (success: boolean) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      return
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return callback(false)
+
+    if (character.role !== 'gm') {
+      return callback(false)
     }
 
     try {
diff --git a/src/events/gameMaster/assetManager/object/upload.ts b/src/events/gameMaster/assetManager/object/upload.ts
index f1ccb55..4309d29 100644
--- a/src/events/gameMaster/assetManager/object/upload.ts
+++ b/src/events/gameMaster/assetManager/object/upload.ts
@@ -7,6 +7,7 @@ import prisma from '../../../../utilities/prisma'
 import sharp from 'sharp'
 import logger from '../../../../utilities/logger'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 interface IObjectData {
   [key: string]: Buffer
@@ -24,12 +25,12 @@ export default class ObjectUploadEvent {
 
   private async handleObjectUpload(data: IObjectData, callback: (response: boolean) => void): Promise<void> {
     try {
-      const character = CharacterManager.getCharacterFromSocket(this.socket);
-      if (character?.role !== 'gm') {
-        callback(false)
-        return
-      }
+      const character = await characterRepository.getById(this.socket.characterId as number);
+      if (!character) return callback(false)
 
+      if (character.role !== 'gm') {
+        return callback(false)
+      }
       const public_folder = path.join(process.cwd(), 'public', 'objects')
 
       // Ensure the folder exists
diff --git a/src/events/gameMaster/assetManager/sprite/create.ts b/src/events/gameMaster/assetManager/sprite/create.ts
index 699a3a3..a849707 100644
--- a/src/events/gameMaster/assetManager/sprite/create.ts
+++ b/src/events/gameMaster/assetManager/sprite/create.ts
@@ -4,6 +4,7 @@ import path from 'path'
 import fs from 'fs/promises'
 import prisma from '../../../../utilities/prisma'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 /**
  * Handle game master new sprite event
@@ -13,13 +14,11 @@ import CharacterManager from '../../../../managers/characterManager'
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:sprite:create', async (data: undefined, callback: (response: boolean) => void) => {
     try {
-      if (!socket.characterId) return
-      const character = CharacterManager.getCharacterFromSocket(socket);
-      if(!character) return
+      const character = await characterRepository.getById(socket.characterId as number);
+      if (!character) return callback(false)
 
       if (character.role !== 'gm') {
-        callback(false)
-        return
+        return callback(false)
       }
 
       const public_folder = path.join(process.cwd(), 'public', 'sprites')
diff --git a/src/events/gameMaster/assetManager/sprite/delete.ts b/src/events/gameMaster/assetManager/sprite/delete.ts
index 7b84289..9ddf02c 100644
--- a/src/events/gameMaster/assetManager/sprite/delete.ts
+++ b/src/events/gameMaster/assetManager/sprite/delete.ts
@@ -27,8 +27,7 @@ export default class GMSpriteDeleteEvent {
   private async handleSpriteDelete(data: Payload, callback: (response: boolean) => void): Promise<void> {
     const character = CharacterManager.getCharacterFromSocket(this.socket);
     if (character?.role !== 'gm') {
-      callback(false)
-      return
+      return callback(false)
     }
 
     try {
diff --git a/src/events/gameMaster/assetManager/sprite/list.ts b/src/events/gameMaster/assetManager/sprite/list.ts
index 08222f4..cf24eb7 100644
--- a/src/events/gameMaster/assetManager/sprite/list.ts
+++ b/src/events/gameMaster/assetManager/sprite/list.ts
@@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types'
 import { Sprite } from '@prisma/client'
 import SpriteRepository from '../../../../repositories/spriteRepository'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 interface IPayload {}
 
@@ -13,10 +14,11 @@ interface IPayload {}
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:sprite:list', async (data: any, callback: (response: Sprite[]) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
-      return
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return callback([])
+
+    if (character.role !== 'gm') {
+      return callback([])
     }
 
     // get all sprites
diff --git a/src/events/gameMaster/assetManager/sprite/update.ts b/src/events/gameMaster/assetManager/sprite/update.ts
index 0cca8bc..b3c1615 100644
--- a/src/events/gameMaster/assetManager/sprite/update.ts
+++ b/src/events/gameMaster/assetManager/sprite/update.ts
@@ -31,8 +31,7 @@ export default function (socket: TSocket, io: Server) {
   socket.on('gm:sprite:update', async (data: Payload, callback: (success: boolean) => void) => {
     const character = CharacterManager.getCharacterFromSocket(socket);
     if (character?.role !== 'gm') {
-      callback(false)
-      return
+      return callback(false)
     }
 
     try {
diff --git a/src/events/gameMaster/assetManager/tile/delete.ts b/src/events/gameMaster/assetManager/tile/delete.ts
index 3c2e450..08aafad 100644
--- a/src/events/gameMaster/assetManager/tile/delete.ts
+++ b/src/events/gameMaster/assetManager/tile/delete.ts
@@ -5,6 +5,7 @@ import { TSocket } from '../../../../utilities/types'
 import prisma from '../../../../utilities/prisma'
 import logger from '../../../../utilities/logger'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 type Payload = {
   id: string
@@ -25,9 +26,10 @@ export default class GMTileDeleteEvent {
   }
 
   private async handleTileDelete(data: Payload, callback: (response: boolean) => void): Promise<void> {
-    const character = CharacterManager.getCharacterFromSocket(this.socket);
-    if (character?.role !== 'gm') {
-      callback(false)
+    const character = await characterRepository.getById(this.socket.characterId as number);
+    if (!character) return callback(false)
+
+    if (character.role !== 'gm') {
       return
     }
 
diff --git a/src/events/gameMaster/assetManager/tile/list.ts b/src/events/gameMaster/assetManager/tile/list.ts
index 84c6974..5b8cce0 100644
--- a/src/events/gameMaster/assetManager/tile/list.ts
+++ b/src/events/gameMaster/assetManager/tile/list.ts
@@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types'
 import { Tile } from '@prisma/client'
 import TileRepository from '../../../../repositories/tileRepository'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 interface IPayload {}
 
@@ -13,9 +14,10 @@ interface IPayload {}
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:tile:list', async (data: any, callback: (response: Tile[]) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+
+    if (character.role !== 'gm') {
       return
     }
 
diff --git a/src/events/gameMaster/assetManager/tile/update.ts b/src/events/gameMaster/assetManager/tile/update.ts
index 3950fb6..d6db7a8 100644
--- a/src/events/gameMaster/assetManager/tile/update.ts
+++ b/src/events/gameMaster/assetManager/tile/update.ts
@@ -2,6 +2,7 @@ import { Server } from 'socket.io'
 import { TSocket } from '../../../../utilities/types'
 import prisma from '../../../../utilities/prisma'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
 
 type Payload = {
   id: string
@@ -16,8 +17,10 @@ type Payload = {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:tile:update', async (data: Payload, callback: (success: boolean) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return callback(false)
+
+    if (character.role !== 'gm') {
       return
     }
 
diff --git a/src/events/gameMaster/assetManager/tile/upload.ts b/src/events/gameMaster/assetManager/tile/upload.ts
index 0ebd4a7..86c8aae 100644
--- a/src/events/gameMaster/assetManager/tile/upload.ts
+++ b/src/events/gameMaster/assetManager/tile/upload.ts
@@ -5,6 +5,8 @@ import path from 'path'
 import fs from 'fs/promises'
 import prisma from '../../../../utilities/prisma'
 import CharacterManager from '../../../../managers/characterManager'
+import characterRepository from '../../../../repositories/characterRepository'
+import logger from '../../../../utilities/logger'
 
 interface ITileData {
   [key: string]: Buffer
@@ -18,9 +20,10 @@ interface ITileData {
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:tile:upload', async (data: ITileData, callback: (response: boolean) => void) => {
     try {
-      const character = CharacterManager.getCharacterFromSocket(socket);
-      if (character?.role !== 'gm') {
-        callback(false)
+      const character = await characterRepository.getById(socket.characterId as number);
+      if (!character) return callback(false)
+
+      if (character.role !== 'gm') {
         return
       }
 
diff --git a/src/events/gameMaster/zoneEditor/create.ts b/src/events/gameMaster/zoneEditor/create.ts
index 1a80bae..cfbe54e 100644
--- a/src/events/gameMaster/zoneEditor/create.ts
+++ b/src/events/gameMaster/zoneEditor/create.ts
@@ -4,6 +4,8 @@ import ZoneRepository from '../../../repositories/zoneRepository'
 import { Zone } from '@prisma/client'
 import prisma from '../../../utilities/prisma'
 import CharacterManager from '../../../managers/characterManager'
+import characterRepository from '../../../repositories/characterRepository'
+import logger from '../../../utilities/logger'
 
 type Payload = {
   name: string
@@ -18,13 +20,16 @@ type Payload = {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:zone_editor:zone:create', async (data: Payload, callback: (response: Zone[]) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+
+    if (character.role !== 'gm') {
+      logger.info(`User ${character.id} tried to create zone but is not a game master.`)
       return
     }
 
-    console.log(`---GM ${character?.id} has created a new zone via zone editor.`)
+    logger.info(`User ${character.id} has created a new zone via zone editor.`)
+
     let zoneList: Zone[] = []
     try {
       const zone = await prisma.zone.create({
diff --git a/src/events/gameMaster/zoneEditor/delete.ts b/src/events/gameMaster/zoneEditor/delete.ts
index 73e3810..c2cfb58 100644
--- a/src/events/gameMaster/zoneEditor/delete.ts
+++ b/src/events/gameMaster/zoneEditor/delete.ts
@@ -3,6 +3,8 @@ import { TSocket } from '../../../utilities/types'
 import ZoneRepository from '../../../repositories/zoneRepository'
 import prisma from '../../../utilities/prisma'
 import CharacterManager from '../../../managers/characterManager'
+import characterRepository from '../../../repositories/characterRepository'
+import logger from '../../../utilities/logger'
 
 type Payload = {
   zoneId: number
@@ -15,14 +17,15 @@ type Payload = {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:zone_editor:zone:delete', async (data: Payload, callback: (response: boolean) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+    
+    if (character.role !== 'gm') {
+      logger.info(`User ${character.id} tried to delete zone but is not a game master.`)
       return
     }
 
-    console.log(`---GM ${character?.id} has deleted a zone via zone editor.`)
+    logger.info(`User ${character.id} has deleted a zone via zone editor.`)
 
     try {
       const zone = await ZoneRepository.getById(data.zoneId)
diff --git a/src/events/gameMaster/zoneEditor/list.ts b/src/events/gameMaster/zoneEditor/list.ts
index ac9692c..b333f81 100644
--- a/src/events/gameMaster/zoneEditor/list.ts
+++ b/src/events/gameMaster/zoneEditor/list.ts
@@ -3,6 +3,8 @@ import { TSocket } from '../../../utilities/types'
 import { Zone } from '@prisma/client'
 import ZoneRepository from '../../../repositories/zoneRepository'
 import CharacterManager from '../../../managers/characterManager'
+import characterRepository from '../../../repositories/characterRepository'
+import logger from '../../../utilities/logger'
 
 interface IPayload {}
 
@@ -13,13 +15,15 @@ interface IPayload {}
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:zone_editor:zone:list', async (data: IPayload, callback: (response: Zone[]) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      console.log(`---Character #${character?.id} is not a game master.`)
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+    
+    if (character.role !== 'gm') {
+      logger.info(`User ${character.id} tried to list zones but is not a game master.`)
       return
     }
 
-    console.log(`---GM ${character?.id} has requested zone list via zone editor.`)
+    logger.info(`User ${character.id} has requested zone list via zone editor.`)
 
     try {
       const zones = await ZoneRepository.getAll()
diff --git a/src/events/gameMaster/zoneEditor/request.ts b/src/events/gameMaster/zoneEditor/request.ts
index b0f3dc2..ad1c88f 100644
--- a/src/events/gameMaster/zoneEditor/request.ts
+++ b/src/events/gameMaster/zoneEditor/request.ts
@@ -1,8 +1,10 @@
 import { Server } from 'socket.io'
 import { TSocket } from '../../../utilities/types'
 import ZoneRepository from '../../../repositories/zoneRepository'
-import { Zone } from '@prisma/client'
+import { Character, Zone } from '@prisma/client'
 import CharacterManager from '../../../managers/characterManager'
+import characterRepository from '../../../repositories/characterRepository'
+import logger from '../../../utilities/logger'
 
 interface IPayload {
   zoneId: number
@@ -15,15 +17,18 @@ interface IPayload {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:zone_editor:zone:request', async (data: IPayload, callback: (response: Zone) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+
+    if (character.role !== 'gm') {
+      logger.info(`User ${character!.id} tried to request zone but is not a game master.`)
       return
     }
 
-    console.log(`---GM ${character?.id} has requested zone via zone editor.`)
+    logger.info(`User ${character.id} has requested zone via zone editor.`)
 
     if (!data.zoneId) {
-      console.log(`---Zone id not provided.`)
+      logger.info(`User ${character.id} tried to request zone but did not provide a zone id.`)
       return
     }
 
@@ -31,7 +36,7 @@ export default function (socket: TSocket, io: Server) {
       const zone = await ZoneRepository.getById(data.zoneId)
 
       if (!zone) {
-        console.log(`---Zone not found.`)
+        logger.info(`User ${character.id} tried to request zone ${data.zoneId} but it does not exist.`)
         return
       }
 
diff --git a/src/events/gameMaster/zoneEditor/update.ts b/src/events/gameMaster/zoneEditor/update.ts
index 8d9d07b..acb242a 100644
--- a/src/events/gameMaster/zoneEditor/update.ts
+++ b/src/events/gameMaster/zoneEditor/update.ts
@@ -6,6 +6,7 @@ import prisma from '../../../utilities/prisma'
 import zoneManager from '../../../managers/zoneManager'
 import logger from '../../../utilities/logger'
 import CharacterManager from '../../../managers/characterManager'
+import characterRepository from '../../../repositories/characterRepository'
 
 interface IPayload {
   zoneId: number
@@ -34,16 +35,18 @@ interface IPayload {
  */
 export default function (socket: TSocket, io: Server) {
   socket.on('gm:zone_editor:zone:update', async (data: IPayload, callback: (response: Zone) => void) => {
-    const character = CharacterManager.getCharacterFromSocket(socket);
-    if (character?.role !== 'gm') {
-      logger.info(`User ${character?.id} tried to update zone but is not a game master.`)
+    const character = await characterRepository.getById(socket.characterId as number);
+    if (!character) return
+
+    if (character.role !== 'gm') {
+      logger.info(`User ${character.id} tried to update zone but is not a game master.`)
       return
     }
 
-    logger.info(`User ${character?.id} has updated zone via zone editor.`)
+    logger.info(`User ${character.id} has updated zone via zone editor.`)
 
     if (!data.zoneId) {
-      logger.info(`User ${character?.id} tried to update zone but did not provide a zone id.`)
+      logger.info(`User ${character.id} tried to update zone but did not provide a zone id.`)
       return
     }
 
@@ -51,7 +54,7 @@ export default function (socket: TSocket, io: Server) {
       let zone = await ZoneRepository.getById(data.zoneId)
 
       if (!zone) {
-        logger.info(`User ${character?.id} tried to update zone ${data.zoneId} but it does not exist.`)
+        logger.info(`User ${character.id} tried to update zone ${data.zoneId} but it does not exist.`)
         return
       }
 
@@ -105,7 +108,7 @@ export default function (socket: TSocket, io: Server) {
       zone = await ZoneRepository.getById(data.zoneId)
 
       if (!zone) {
-        logger.info(`User ${character?.id} tried to update zone ${data.zoneId} but it does not exist.`)
+        logger.info(`User ${character.id} tried to update zone ${data.zoneId} but it does not exist.`)
         return
       }
 
diff --git a/src/events/login.ts b/src/events/login.ts
index 009718b..a64fa4c 100644
--- a/src/events/login.ts
+++ b/src/events/login.ts
@@ -3,7 +3,7 @@ import { TSocket } from '../utilities/types'
 
 export default function (socket: TSocket, io: Server) {
   socket.on('login', () => {
-    // return user data
+    if (!socket.user) return
     socket.emit('logged_in', { user: socket.user })
   })
 }
diff --git a/src/managers/characterManager.ts b/src/managers/characterManager.ts
index 2ec1d4b..160e699 100644
--- a/src/managers/characterManager.ts
+++ b/src/managers/characterManager.ts
@@ -9,7 +9,7 @@ class CharacterManager {
     this.characters = []
   }
 
-    public initCharacter(character: ExtendedCharacter) {
+  public initCharacter(character: ExtendedCharacter) {
     this.characters = [...this.characters, character]
   }
 
@@ -26,10 +26,6 @@ class CharacterManager {
     this.characters = this.characters.filter((x) => x.id !== character.id)
   }
 
-  public getCharacter(characterId: number) {
-    return this.characters.find((x) => x.id === characterId)
-  }
-
   public getCharacterFromSocket(socket: TSocket) {
     return this.characters.find((x) => x.id === socket?.characterId)
   }