diff --git a/src/commands/tiles.ts b/src/commands/tiles.ts
index b618d43..08a3667 100644
--- a/src/commands/tiles.ts
+++ b/src/commands/tiles.ts
@@ -1,4 +1,5 @@
 import fs from 'fs'
+
 import sharp from 'sharp'
 
 import { BaseCommand } from '#application/base/baseCommand'
diff --git a/src/socketEvents/character/charactersScreen/characterHairList.ts b/src/socketEvents/character/charactersScreen/characterHairList.ts
index 2aa2709..47e7e49 100644
--- a/src/socketEvents/character/charactersScreen/characterHairList.ts
+++ b/src/socketEvents/character/charactersScreen/characterHairList.ts
@@ -1,18 +1,11 @@
-import { Server } from 'socket.io'
-
+import { BaseEvent } from '#application/base/baseEvent'
 import Database from '#application/database'
-import { TSocket } from '#application/types'
 import { CharacterHair } from '#entities/characterHair'
 import characterHairRepository from '#repositories/characterHairRepository'
 
 interface IPayload {}
 
-export default class characterHairListEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class characterHairListEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('character:hair:list', this.handleEvent.bind(this))
   }
diff --git a/src/socketEvents/character/connect.ts b/src/socketEvents/character/connect.ts
index c75499d..3fe0250 100644
--- a/src/socketEvents/character/connect.ts
+++ b/src/socketEvents/character/connect.ts
@@ -1,8 +1,4 @@
-import { Server } from 'socket.io'
-
-import Database from '#application/database'
-import { gameLogger } from '#application/logger'
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
 import ZoneManager from '#managers/zoneManager'
 import CharacterHairRepository from '#repositories/characterHairRepository'
 import CharacterRepository from '#repositories/characterRepository'
@@ -12,12 +8,7 @@ interface CharacterConnectPayload {
   characterHairId?: number
 }
 
-export default class CharacterConnectEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class CharacterConnectEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('character:connect', this.handleCharacterConnect.bind(this))
   }
@@ -62,12 +53,12 @@ export default class CharacterConnectEvent {
 
   private emitError(message: string): void {
     this.socket.emit('notification', { title: 'Server message', message })
-    gameLogger.error('character:connect error', `Player ${this.socket.userId}: ${message}`)
+    this.logger.error('character:connect error', `Player ${this.socket.userId}: ${message}`)
   }
 
   private handleError(context: string, error: unknown): void {
     const errorMessage = error instanceof Error ? error.message : String(error)
     this.emitError(`${context}: ${errorMessage}`)
-    gameLogger.error('character:connect error', errorMessage)
+    this.logger.error('character:connect error', errorMessage)
   }
 }
diff --git a/src/socketEvents/character/delete.ts b/src/socketEvents/character/delete.ts
index f6723ac..849e13e 100644
--- a/src/socketEvents/character/delete.ts
+++ b/src/socketEvents/character/delete.ts
@@ -1,10 +1,7 @@
-import { Server } from 'socket.io'
-
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
 import { Character } from '#entities/character'
 import { Zone } from '#entities/zone'
 import CharacterRepository from '#repositories/characterRepository'
-import { CharacterService } from '#services/characterService'
 
 type TypePayload = {
   characterId: number
@@ -15,12 +12,7 @@ type TypeResponse = {
   characters: Character[]
 }
 
-export default class CharacterDeleteEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class CharacterDeleteEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('character:delete', this.handleCharacterDelete.bind(this))
   }
diff --git a/src/socketEvents/character/list.ts b/src/socketEvents/character/list.ts
index c74247c..d7836be 100644
--- a/src/socketEvents/character/list.ts
+++ b/src/socketEvents/character/list.ts
@@ -1,17 +1,9 @@
-import { Socket, Server } from 'socket.io'
-
+import { BaseEvent } from '#application/base/baseEvent'
 import Database from '#application/database'
-import { gameLogger } from '#application/logger'
-import { TSocket } from '#application/types'
 import { Character } from '#entities/character'
 import CharacterRepository from '#repositories/characterRepository'
 
-export default class CharacterListEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class CharacterListEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('character:list', this.handleEvent.bind(this))
   }
@@ -23,7 +15,7 @@ export default class CharacterListEvent {
 
       this.socket.emit('character:list', characters)
     } catch (error: any) {
-      gameLogger.error('character:list error', error.message)
+      this.logger.error('character:list error', error.message)
     }
   }
 }
diff --git a/src/socketEvents/gameMaster/assetManager/characterHair/create.ts b/src/socketEvents/gameMaster/assetManager/characterHair/create.ts
index 3bfe169..d321fc9 100644
--- a/src/socketEvents/gameMaster/assetManager/characterHair/create.ts
+++ b/src/socketEvents/gameMaster/assetManager/characterHair/create.ts
@@ -1,15 +1,8 @@
-import { Server } from 'socket.io'
-
-import prisma from '#application/prisma'
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
+import { CharacterHair } from '#entities/characterHair'
 import characterRepository from '#repositories/characterRepository'
 
-export default class CharacterHairCreateEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class CharacterHairCreateEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('gm:characterHair:create', this.handleEvent.bind(this))
   }
@@ -23,11 +16,8 @@ export default class CharacterHairCreateEvent {
         return callback(false)
       }
 
-      const newCharacterHair = await prisma.characterHair.create({
-        data: {
-          name: 'New hair'
-        }
-      })
+      const newCharacterHair = new CharacterHair()
+      await newCharacterHair.setName('New hair').save()
 
       callback(true, newCharacterHair)
     } catch (error) {
diff --git a/src/socketEvents/gameMaster/assetManager/characterHair/delete.ts b/src/socketEvents/gameMaster/assetManager/characterHair/delete.ts
index 708f183..0f80778 100644
--- a/src/socketEvents/gameMaster/assetManager/characterHair/delete.ts
+++ b/src/socketEvents/gameMaster/assetManager/characterHair/delete.ts
@@ -1,20 +1,12 @@
-import { Server } from 'socket.io'
-
-import { gameMasterLogger } from '#application/logger'
-import prisma from '#application/prisma'
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
+import CharacterHairRepository from '#repositories/characterHairRepository'
 import characterRepository from '#repositories/characterRepository'
 
 interface IPayload {
   id: number
 }
 
-export default class characterHairDeleteEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class characterHairDeleteEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('gm:characterHair:remove', this.handleEvent.bind(this))
   }
@@ -28,13 +20,14 @@ export default class characterHairDeleteEvent {
     }
 
     try {
-      await prisma.characterHair.delete({
-        where: { id: data.id }
-      })
+      const characterHair = await CharacterHairRepository.getById(data.id)
+      if (characterHair) {
+        await characterHair.delete()
+      }
 
       callback(true)
     } catch (error) {
-      gameMasterLogger.error(`Error deleting character type ${data.id}: ${error instanceof Error ? error.message : String(error)}`)
+      this.logger.error(`Error deleting character type ${data.id}: ${error instanceof Error ? error.message : String(error)}`)
       callback(false)
     }
   }
diff --git a/src/socketEvents/gameMaster/assetManager/characterHair/list.ts b/src/socketEvents/gameMaster/assetManager/characterHair/list.ts
index 3a3e236..d6ea78d 100644
--- a/src/socketEvents/gameMaster/assetManager/characterHair/list.ts
+++ b/src/socketEvents/gameMaster/assetManager/characterHair/list.ts
@@ -1,19 +1,11 @@
-import { CharacterHair } from '@prisma/client'
-import { Server } from 'socket.io'
-
-import { gameMasterLogger } from '#application/logger'
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
+import { CharacterHair } from '#entities/characterHair'
 import characterHairRepository from '#repositories/characterHairRepository'
 import characterRepository from '#repositories/characterRepository'
 
 interface IPayload {}
 
-export default class characterHairListEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class characterHairListEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('gm:characterHair:list', this.handleEvent.bind(this))
   }
@@ -21,12 +13,12 @@ export default class characterHairListEvent {
   private async handleEvent(data: IPayload, callback: (response: CharacterHair[]) => void): Promise<void> {
     const character = await characterRepository.getById(this.socket.characterId as number)
     if (!character) {
-      gameMasterLogger.error('gm:characterHair:list error', 'Character not found')
+      this.logger.error('gm:characterHair:list error', 'Character not found')
       return callback([])
     }
 
     if (character.role !== 'gm') {
-      gameMasterLogger.info(`User ${character.id} tried to list character hair but is not a game master.`)
+      this.logger.info(`User ${character.id} tried to list character hair but is not a game master.`)
       return callback([])
     }
 
diff --git a/src/socketEvents/gameMaster/assetManager/characterHair/update.ts b/src/socketEvents/gameMaster/assetManager/characterHair/update.ts
index 526d389..7af2a63 100644
--- a/src/socketEvents/gameMaster/assetManager/characterHair/update.ts
+++ b/src/socketEvents/gameMaster/assetManager/characterHair/update.ts
@@ -1,25 +1,19 @@
-import { CharacterGender, CharacterRace } from '@prisma/client'
-import { Server } from 'socket.io'
-
-import { gameMasterLogger } from '#application/logger'
-import prisma from '#application/prisma'
-import { TSocket } from '#application/types'
+import { BaseEvent } from '#application/base/baseEvent'
+import { CharacterGender } from '#application/enums'
+import { UUID } from '#application/types'
+import CharacterHairRepository from '#repositories/characterHairRepository'
 import characterRepository from '#repositories/characterRepository'
+import SpriteRepository from '#repositories/spriteRepository'
 
 type Payload = {
   id: number
   name: string
   gender: CharacterGender
   isSelectable: boolean
-  spriteId: string
+  spriteId: UUID
 }
 
-export default class CharacterHairUpdateEvent {
-  constructor(
-    private readonly io: Server,
-    private readonly socket: TSocket
-  ) {}
-
+export default class CharacterHairUpdateEvent extends BaseEvent {
   public listen(): void {
     this.socket.on('gm:characterHair:update', this.handleObjectUpdate.bind(this))
   }
@@ -33,19 +27,16 @@ export default class CharacterHairUpdateEvent {
     }
 
     try {
-      await prisma.characterHair.update({
-        where: { id: data.id },
-        data: {
-          name: data.name,
-          gender: data.gender,
-          isSelectable: data.isSelectable,
-          spriteId: data.spriteId
-        }
-      })
+      const sprite = await SpriteRepository.getById(data.spriteId)
+      const characterHair = await CharacterHairRepository.getById(data.id)
+
+      if (characterHair) {
+        await characterHair.setName(data.name).setGender(data.gender).setIsSelectable(data.isSelectable).setSprite(sprite!).update()
+      }
 
       return callback(true)
     } catch (error) {
-      gameMasterLogger.error(`Error updating character hair: ${error instanceof Error ? error.message : String(error)}`)
+      this.logger.error(`Error updating character hair: ${error instanceof Error ? error.message : String(error)}`)
       return callback(false)
     }
   }