diff --git a/src/application/types.ts b/src/application/types.ts
index 1a8b914..0df12d9 100644
--- a/src/application/types.ts
+++ b/src/application/types.ts
@@ -1,5 +1,7 @@
 import { Socket } from 'socket.io'
-import { Character, User, ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client'
+import { Character } from '#entities/character'
+import { ZoneEventTile } from '#entities/zoneEventTile'
+import { ZoneEventTileTeleport } from '#entities/zoneEventTileTeleport'
 
 export type TSocket = Socket & {
   userId?: number
diff --git a/src/models/loadedZone.ts b/src/models/loadedZone.ts
index c358f01..3913c86 100644
--- a/src/models/loadedZone.ts
+++ b/src/models/loadedZone.ts
@@ -1,6 +1,7 @@
-import { Character, Zone } from '@prisma/client'
 import zoneEventTileRepository from '#repositories/zoneEventTileRepository'
 import ZoneCharacter from './zoneCharacter'
+import { Character } from '#entities/character'
+import { Zone } from '#entities/zone'
 
 class LoadedZone {
   private readonly zone: Zone
diff --git a/src/models/zoneCharacter.ts b/src/models/zoneCharacter.ts
index 710ad6c..3ca0e6f 100644
--- a/src/models/zoneCharacter.ts
+++ b/src/models/zoneCharacter.ts
@@ -1,5 +1,5 @@
-import { Character } from '@prisma/client'
 import { CharacterService } from '#services/characterService'
+import { Character } from '#entities/character'
 
 class ZoneCharacter {
   public readonly character: Character
@@ -12,7 +12,7 @@ class ZoneCharacter {
 
   public async savePosition() {
     const characterService = new CharacterService()
-    await characterService.updateCharacterPosition(this.character.id, this.character.positionX, this.character.positionY, this.character.rotation, this.character.zoneId)
+    await characterService.updateCharacterPosition(this.character.id, this.character.positionX, this.character.positionY, this.character.rotation, this.character.zone.id)
   }
 }
 
diff --git a/src/services/characterService.ts b/src/services/characterService.ts
index 4e5083e..234341c 100644
--- a/src/services/characterService.ts
+++ b/src/services/characterService.ts
@@ -25,9 +25,8 @@ export class CharacterService {
     const character = new Character()
     character.name = name
     character.user = user
-    await Database.save(character)
 
-    return character
+    return await character.save()
   }
 
   async updateHair(characterId: number, characterHairId: number | null) {
@@ -36,15 +35,13 @@ export class CharacterService {
 
     if (characterHairId === null) {
       character.characterHair = undefined
-      await Database.save(character)
-      return character
+      return await character.save()
     }
 
     const characterHair = await CharacterHairRepository.getById(characterHairId)
     character.characterHair = characterHair ?? undefined
 
-    await Database.save(character)
-    return character
+    return await character.save()
   }
 
   async deleteByUserIdAndId(userId: number, characterId: number): Promise<Character | null> {
@@ -52,8 +49,7 @@ export class CharacterService {
       const character = await CharacterRepository.getByUserAndId(userId, characterId)
       if (!character) return null
 
-      await Database.delete(character)
-      return character
+      return await character.delete()
     } catch (error: any) {
       // Handle error
       appLogger.error(`Failed to delete character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`)
@@ -70,7 +66,8 @@ export class CharacterService {
     character.rotation = rotation
     character.zone = await ZoneRepository.getById(zoneId) as Zone
 
-    await Database.save(character)
+    await character.save()
+
     return character
   }
 
diff --git a/src/services/chatService.ts b/src/services/chatService.ts
index 4da47c8..39dd4bf 100644
--- a/src/services/chatService.ts
+++ b/src/services/chatService.ts
@@ -1,19 +1,28 @@
-import prisma from '#application/prisma'
 import { gameLogger } from '#application/logger'
 import { Server } from 'socket.io'
 import { TSocket } from '#application/types'
 import ChatRepository from '#repositories/chatRepository'
+import { Chat } from '#entities/chat'
+import ZoneRepository from '#repositories/zoneRepository'
+import CharacterRepository from '#repositories/characterRepository'
 
 class ChatService {
   async sendZoneMessage(io: Server, socket: TSocket, message: string, characterId: number, zoneId: number): Promise<boolean> {
     try {
-      const newChat = await prisma.chat.create({
-        data: {
-          characterId,
-          zoneId,
-          message
-        }
-      })
+
+      const character = await CharacterRepository.getById(characterId)
+      if (!character) return false
+
+      const zone = await ZoneRepository.getById(zoneId)
+      if (!zone) return false
+
+      const newChat = new Chat()
+
+      newChat.character = character
+      newChat.zone = zone
+      newChat.message = message
+
+      await newChat.save()
 
       const chat = await ChatRepository.getById(newChat.id)
       if (!chat) return false
diff --git a/src/services/passwordResetTokenService.ts b/src/services/passwordResetTokenService.ts
index a0c4dca..f6af85b 100644
--- a/src/services/passwordResetTokenService.ts
+++ b/src/services/passwordResetTokenService.ts
@@ -1,4 +1,3 @@
-import prisma from '#application/prisma'
 import passwordResetTokenRepository from '#repositories/passwordResetTokenRepository'
 import { appLogger } from '#application/logger'
 
@@ -14,11 +13,7 @@ class PasswordResetTokenService {
         return false
       }
 
-      await prisma.passwordResetToken.delete({
-        where: {
-          token
-        }
-      })
+      await tokenData.delete()
 
       return true
     } catch (error: any) {
diff --git a/src/services/userService.ts b/src/services/userService.ts
index 545cbaf..756bddf 100644
--- a/src/services/userService.ts
+++ b/src/services/userService.ts
@@ -51,7 +51,7 @@ class UserService {
       newUser.username = username
       newUser.email = email
       newUser.password = hashedPassword
-      await Database.save(newUser)
+      await newUser.save()
 
       return newUser
     } catch (error: any) {
@@ -76,14 +76,14 @@ class UserService {
         if (!isTokenExpired) return false
 
         // Delete existing token using MikroORM
-        await Database.delete(latestToken)
+        await latestToken.delete()
       }
 
       // Create new token using MikroORM
       const passwordResetToken = new PasswordResetToken()
       passwordResetToken.user = user
       passwordResetToken.token = token
-      await Database.save(passwordResetToken)
+      await passwordResetToken.save()
 
       const transporter = NodeMailer.createTransport({
         host: config.SMTP_HOST,
diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts
index 6f418fc..7573d9c 100644
--- a/src/services/zoneEventTileService.ts
+++ b/src/services/zoneEventTileService.ts
@@ -1,15 +1,14 @@
 import { ExtendedCharacter, TSocket } from '#application/types'
-import prisma from '#application/prisma'
-import { ZoneEventTileTeleport } from '@prisma/client'
 import { Server } from 'socket.io'
 import ZoneManager from '#managers/zoneManager'
 import { gameLogger } from '#application/logger'
+import { ZoneEventTileTeleport } from '#entities/zoneEventTileTeleport'
 
 export class ZoneEventTileService {
   public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
-    if (teleport.toZoneId === character.zoneId) return
+    if (teleport.toZone.id === character.zone.id) return
 
-    const loadedZone = ZoneManager.getZoneById(teleport.toZoneId)
+    const loadedZone = ZoneManager.getZoneById(teleport.toZone.id)
     if (!loadedZone) {
       gameLogger.error('zone:character:join error', 'Loaded zone not found')
       return
@@ -17,27 +16,18 @@ export class ZoneEventTileService {
 
     const zone = loadedZone.getZone()
 
-    const oldZoneId = character.zoneId
-    const newZoneId = teleport.toZoneId
-
-    // Update character in database
-    await prisma.character.update({
-      where: { id: character.id },
-      data: {
-        zoneId: newZoneId,
-        positionX: teleport.toPositionX,
-        positionY: teleport.toPositionY,
-        rotation: teleport.toRotation
-      }
-    })
+    const oldZoneId = character.zone.id
+    const newZoneId = teleport.toZone.id
 
     // Update local character object
-    character.zoneId = newZoneId
+    character.zone = teleport.toZone
     character.rotation = teleport.toRotation
     character.positionX = teleport.toPositionX
     character.positionY = teleport.toPositionY
     character.isMoving = false
 
+    await character.save()
+
     // Remove and add character to new zone
     await loadedZone.removeCharacter(character.id)
     loadedZone.addCharacter(character)
diff --git a/src/services/zoneService.ts b/src/services/zoneService.ts
index 17a4eeb..e7fb729 100644
--- a/src/services/zoneService.ts
+++ b/src/services/zoneService.ts
@@ -1,6 +1,3 @@
-import prisma from '#application/prisma'
-import { gameLogger } from '#application/logger'
-
 class ZoneService {}
 
 export default ZoneService