How to Add Custom MLOs to FiveM
You found a sick custom interior on a FiveM forum — a drug lab, a custom PD, maybe a nightclub — and now you need to get it into your server without everything breaking. MLOs are one of the most common things server owners install, and one of the most common things they screw up.
I’ve installed hundreds of MLOs across different servers and frameworks. The process itself is simple, but there are gotchas around collisions, load order, and IPL conflicts that will waste hours of your time if you don’t know about them upfront. Here’s the full walkthrough.
What an MLO Actually Is
MLO stands for Map Load Object. It’s essentially a custom interior that replaces or adds to GTA V’s existing map geometry. Unlike simple props or map edits that just place objects in the world, MLOs define enclosed interior spaces with their own collision boundaries, lighting, audio occlusion, and room definitions.
An MLO resource typically contains these files:
.ymap— Defines the entity placement and position in the game world.ytyp— Defines the archetype (the object type definition for the interior).ybn— Collision data so players don’t fall through floors.ydr/.ydd— The 3D model drawables.ytd— Texture dictionariesstream/folder — Where all these files live in a FiveM resourcefxmanifest.luaor__resource.lua— The resource manifest
If any of these are missing or misconfigured, you’ll get invisible walls, fall through floors, or the interior just won’t render at all.
Step 1: Get Your MLO Resource
Most MLOs you download will already be packaged as a FiveM-ready resource. You’ll get a folder that looks something like this:
custom_pd_interior/
├── fxmanifest.lua
└── stream/
├── custom_pd.ymap
├── custom_pd.ytyp
├── custom_pd.ybn
├── custom_pd.ydr
└── custom_pd.ytd
If the MLO comes as raw files without a manifest, you need to create one. Here’s a basic fxmanifest.lua for a streaming MLO:
fx_version 'cerulean'
game 'gta5'
description 'Custom PD Interior'
version '1.0.0'
this_is_a_map 'yes'
this_is_a_map 2
data_file 'DLC_ROGEN_COMPAT' 'stream/*.ymap'
data_file 'DLC_ROGEN_COMPAT' 'stream/*.ytyp'
The key line here is this_is_a_map 'yes'. This tells FiveM to treat the resource as map data and handle streaming accordingly. The data_file 'DLC_ROGEN_COMPAT' entries register your .ymap and .ytyp files with the game’s content system.
Some older MLOs use __resource.lua instead of fxmanifest.lua. Both work, but fxmanifest.lua is the current standard. If you’re starting fresh, always use fxmanifest.lua. Check our beginner Lua scripting tutorial if you need a refresher on how manifests work.
Step 2: Place the Resource on Your Server
Drop the MLO folder into your server’s resources directory. Most people organize them under a subfolder:
server-data/
└── resources/
└── [maps]/
├── custom_pd_interior/
├── custom_hospital/
└── custom_nightclub/
Using bracket folders like [maps] keeps things organized but doesn’t affect functionality — FiveM just sees them as subdirectories.
Then add it to your server.cfg:
ensure custom_pd_interior
Or if you’re using a category folder approach:
ensure [maps]
This will start every resource inside that folder. Be careful with this — if you have 30 MLOs in [maps], they all load at once. That’s usually fine for MLOs since they stream on demand, but it can add to your startup time.
If you’re not sure about the basics of getting resources onto your server, the how to install FiveM scripts guide covers the fundamentals.
Step 3: Handle IPL Conflicts
This is where most people run into problems. IPL stands for Interior Proxy List — it’s GTA V’s system for loading and unloading interiors. Many custom MLOs are placed at locations where GTA V already has a default interior. If you don’t unload the original IPL, you get two interiors clipping into each other.
For example, if your custom police station replaces the Mission Row PD interior, you need a client-side script that unloads the original:
-- client.lua
CreateThread(function()
-- Remove the default Mission Row PD interior
RequestIpl('v_policedept')
RemoveIpl('v_policedept')
-- If the MLO has its own IPL to load
-- RequestIpl('custom_pd_ipl_name')
end)
Some MLOs handle this automatically in their own scripts. Check the README or documentation that came with the MLO. If it includes a client.lua that calls RemoveIpl, it’s already handling this.
Common vanilla IPLs you might need to remove:
- Mission Row PD:
v_policedept - Pillbox Hospital:
Coroner_Int_on,coronertrash - Vanilla Unicorn:
v_striphigh - Tequi-la-la Bar:
v_lesters - FIB Building:
FIBlobby
The MLO creator should tell you which IPLs to remove. If they don’t, and your MLO looks broken with geometry clipping everywhere, this is almost certainly why.
Step 4: Check Collisions
After installing, join your server and walk through the MLO. Check for:
Falling through floors — This means the .ybn collision file is missing or not loading properly. Make sure the file is in the stream/ folder and that the filename matches what the .ytyp expects.
Invisible walls — Usually caused by leftover collision from the original GTA V interior. You need to remove the default IPL (see Step 3) or use a collision remover resource.
Flickering textures — Two surfaces occupying the same space (z-fighting). This is typically a modeling issue, not something you can fix server-side. Contact the MLO creator.
Doors not working — Custom MLOs with doors often need a separate door lock script. If you’re running ox_doorlock or qb-doorlock, you’ll need to add the door definitions for the new interior. The door hashes are specific to each MLO.
Managing Multiple MLOs Without Killing Performance
MLOs stream on demand, meaning they only load when a player is near them. This is good — having 50 MLOs on your server won’t tank everyone’s FPS all the time. But there are still things to watch for.
Resource count matters for startup. Every MLO is a resource, and FiveM has overhead per resource. If you have 100+ MLOs as individual resources, consider combining smaller ones into grouped resources. Some server owners create a single [mlo-pack] resource with multiple interiors streaming from one manifest.
Texture memory adds up. Each MLO loads its textures into VRAM when streamed. Players with 4GB VRAM cards will start seeing texture pop-in if there are too many custom textured MLOs in a concentrated area. Spread them out geographically when possible.
Test with resmon. After adding MLOs, use resmon to check performance. MLOs themselves don’t usually cause server-side performance issues since they’re streamed client-side, but the scripts that accompany them (door locks, job scripts, interaction zones) absolutely can.
Making MLOs Functional with Scripts
A bare MLO is just a building. To make it useful for roleplay, you usually need scripts that add functionality — job points, storage, crafting stations, NPCs, blips on the map.
For example, if you’ve installed a custom restaurant MLO, you’d pair it with a restaurant job script that defines interaction points inside the interior. Our LMX RestaurantMaster script is designed to work with any MLO — you just configure the coordinate positions for each interaction point.
The same applies to trap houses and store interiors. A custom drug lab MLO is useless without a script handling the actual drug crafting mechanics. The LMX Trap & Stores script lets you define custom locations that map to any MLO’s interior coords.
If you’re working with a framework like ESX or QBCore, most job scripts expect you to define coordinates in a config file. You’ll need to go inside the MLO and grab the exact coords for each interaction point using a coordinate display resource or the native GetEntityCoords in the F8 console. This is tedious but necessary — copy-pasting coords from the MLO creator’s screenshots often results in slightly off positions because of floating point differences between builds.
For a deeper dive into framework differences and which one handles MLO interactions best, check the ESX vs QBCore vs Qbox comparison.
Where to Find Quality MLOs
The quality of MLOs varies wildly. Some are professional-grade with perfect lighting, occlusion, and optimized poly counts. Others are rushed conversions from single-player mods with broken collisions and 50MB texture files for a single room.
Free sources:
- FiveM forums (forums.cfx.re) — Hit or miss. Read comments before downloading.
- GitHub — Search for “fivem mlo” and sort by stars.
- Our free scripts page has some free resources including map-related content.
Paid sources:
- Tebex stores from established creators
- GTA5-Mods premium section (quality varies)
- Direct commission from MLO builders
When evaluating an MLO, check these things before buying or downloading:
File size. A single-room interior shouldn’t be 200MB. If it is, the textures aren’t optimized and it’ll eat your players’ VRAM.
Does it include collision files (.ybn)? Some free MLOs ship without them, expecting you to generate your own. That’s a pain and requires CodeWalker.
Is it positioned correctly? Some MLOs are placed at coordinates that conflict with popular map mods. Check where it goes before committing to it.
Framework compatibility. The MLO itself is framework-agnostic — it’s just geometry. But if it comes bundled with a job script, make sure that script matches your framework. Don’t assume a QBCore bundled MLO will work on ESX without modification.
Troubleshooting Common Issues
MLO doesn’t appear at all:
First, check your server console on startup. If you see couldn't load resource custom_mlo or similar errors, the manifest is broken. Verify your fxmanifest.lua syntax. Second, make sure you ran ensure custom_mlo in server.cfg — just dropping it in the resources folder isn’t enough.
MLO appears but interior is invisible (you can see through walls):
The .ydr drawables aren’t loading. Check that filenames in the stream/ folder match exactly — FiveM is case-sensitive on Linux servers but not on Windows. If you developed on Windows and deployed to Linux, a file named Interior.ydr won’t match interior.ydr.
Players spawn under the map inside the MLO: The MLO’s position might conflict with the game’s default ground level. Some MLOs are placed underground intentionally (instanced interiors). You need to teleport players to the correct Z coordinate, not just X and Y.
MLO loads for some players but not others:
This is almost always a client-side caching issue. Have affected players clear their FiveM cache: delete the cache/ folder in their FiveM application data. If it persists, the MLO’s streaming distance might be too short — you can adjust this in the .ymap file using CodeWalker, but that requires some 3D editing knowledge.
Server crashes when MLO loads:
Rare, but it happens with corrupted .ytyp files. Open the file in CodeWalker to validate it. If CodeWalker can’t read it, the file is bad — redownload or contact the creator.
Building Your Own MLOs
If you want to go beyond installing other people’s work, creating MLOs requires 3D modeling skills and specific tools:
- 3ds Max or Blender — For creating the 3D geometry
- CodeWalker — For converting models into GTA V format and positioning them in the game world
- OpenIV — For inspecting and extracting vanilla GTA V assets as reference
This is a deep rabbit hole. Building a production-quality MLO takes anywhere from a few hours for a simple room to weeks for a detailed building. If you’re primarily a server owner rather than a 3D artist, it’s usually more cost-effective to commission or buy MLOs and spend your time on scripting and server management instead.
That said, understanding how MLOs work under the hood makes you better at troubleshooting them, even if you never build one yourself. If you’ve already gone through our Lua scripting tutorial and want to level up, learning basic CodeWalker operations is a natural next step.
Organizing MLOs Long-Term
Once you have more than a handful of MLOs, organization matters. Here’s what I’ve landed on after dealing with servers running 40+ custom interiors:
Naming convention. Prefix all MLO resources with mlo_ or map_. Makes it trivial to find them in your resources folder and in server.cfg.
Keep a spreadsheet. Track each MLO’s name, location coordinates, source (where you got it), any IPLs it removes, and which scripts depend on it. When something breaks after an update, this saves you from playing detective.
Version control. If you’re modifying MLOs or their configs, use Git. Even a simple private repo saves you when you accidentally break a config and can’t remember what it looked like before. The server setup guide touches on this, and it applies double for map resources that are hard to debug.
Test on a staging server. Never drop a new MLO directly onto your production server. The collision conflicts and IPL issues described above are much easier to diagnose when you’re the only player on the server.
MLOs are one of the biggest visual differentiators between servers. A server running all default interiors feels generic. Custom interiors make the world feel built, lived-in, and unique to your community. Get the installation right, pair them with solid scripts, and your players will notice.
If you run into issues or want to share what you’ve built, drop by our Discord — there’s always someone around who’s dealt with the same problem.