SoulFire v2 is out now!
Back to Blog
By Pistonmaster

Multi-Version Minecraft Support - Testing Protocol Compatibility

Learn how to support multiple Minecraft versions with ViaVersion, ViaBackwards, and ViaRewind, plus testing strategies for cross-version compatibility

minecraftviaversionmulti-versionprotocolcompatibilitytesting

Understanding Protocol Versioning

Every Minecraft version speaks a different "language" (protocol). Clients and servers must use the same protocol to communicate.

The Version Problem

Traditional approach:

Traditional Approach
Server Version: 1.21
Compatible Clients: Only 1.21

Player with 1.20.4 client: ❌ Cannot connect
Player with 1.21.1 client: ❌ Cannot connect

With ViaVersion:

With ViaVersion Installed
Server Version: 1.21
ViaVersion Installed: ✅

Player with 1.20.4 client: ✅ Can connect
Player with 1.21 client: ✅ Can connect
Player with 1.21.1 client: ✅ Can connect

Why Multi-Version Support?

Player perspective:

  • Don't need to manage multiple client installations
  • Can join before updating
  • Can play on older versions if new version has bugs

Server perspective:

  • Don't lose players during version transitions
  • Support modded clients (often behind versions)
  • Flexible update schedule

Network perspective:

  • Single proxy supports all backend versions
  • Gradual backend updates
  • Test new versions without forcing all players

The ViaVersion Suite

ViaVersion isn't one plugin—it's an ecosystem.

ViaVersion (Core)

Purpose: Allow newer clients to connect to older servers

How ViaVersion Works
Example:
Server: 1.20.4
ViaVersion: Installed

Client 1.21 → ViaVersion translates → Server sees 1.20.4 client

Installation:

Installing ViaVersion
# Download ViaVersion
wget https://github.com/ViaVersion/ViaVersion/releases/download/5.0.0/ViaVersion-5.0.0.jar

# Place in plugins folder
mv ViaVersion-5.0.0.jar plugins/

# Start server (config auto-generates)

ViaBackwards

Purpose: Allow older clients to connect to newer servers

How ViaBackwards Works
Example:
Server: 1.21
ViaBackwards: Installed

Client 1.19 → ViaBackwards translates → Server sees 1.21 client

Requires: ViaVersion (core)

Installation:

Installing ViaBackwards
# ViaBackwards requires ViaVersion
# Download ViaBackwards
wget https://github.com/ViaVersion/ViaBackwards/releases/download/5.0.0/ViaBackwards-5.0.0.jar

mv ViaBackwards-5.0.0.jar plugins/

ViaRewind

Purpose: Support extremely old clients (1.8 and below)

How ViaRewind Works
Example:
Server: 1.21
ViaRewind: Installed

Client 1.8 → ViaRewind translates → Server sees 1.21 client

Requires: ViaVersion + ViaBackwards

Installation:

Installing ViaRewind
# Download ViaRewind
wget https://github.com/ViaVersion/ViaRewind/releases/download/3.0.0/ViaRewind-3.0.0.jar

mv ViaRewind-3.0.0.jar plugins/

Version Support Matrix

Your ServerViaVersionViaBackwardsViaRewindClient Support
1.211.8 - 1.21+
1.20.41.8 - 1.21+
1.191.8 - 1.21+
1.16.51.16.5 - 1.21+

ViaBackwards only goes back ~3-4 versions. ViaRewind fills the gap to support extremely old versions like 1.8.

Configuration

ViaVersion Configuration

config.yml:

ViaVersion config.yml
# Should ViaVersion check for updates?
checkforupdates: true

# Send supported versions info to clients
send-supported-versions: false

# Block protocols not explicitly handled
block-protocols: []

# Force specific version for everyone (usually empty)
force-json-transform: false

# Prevent version downgrade exploits
suppress-metadata-errors: false

# Debug mode (disable in production)
debug: false

# Minimize cool down for item pickup
minimize-cooldown: true

# Handle how team colors work across versions
team-colour-fix: true

# Serialize block entities in chunks
cache-values: false

# Ensure correct character width calculation
character-width-fix: false

Important settings:

SettingRecommendedWhy
checkforupdatestrueKnow when critical fixes available
debugfalsePerformance impact, only for troubleshooting
team-colour-fixtrueFixes scoreboard colors across versions
minimize-cooldowntrueBetter combat feel for older clients

ViaBackwards Configuration

config.yml:

ViaBackwards config.yml
# Suppress conversion warnings
suppress-conversion-warnings: false

# Fix fire animation on 1.12- clients
fix-fire-animation: true

# Make  shields work on 1.8 clients
shield-blocking: true

# Handle hologram conversion
hologram-patch: true

# Convert newer sounds to older equivalents
sound-conversion: true

Version-Specific Limitations

Not everything can be translated perfectly between Minecraft versions. Some features will have limited functionality or appear differently on older clients.

FeatureVersion IntroducedCompatibility
New blocksVariesShown as placeholder (stone, etc.)
New itemsVariesShown as similar older item
Increased world height1.18Clients <1.18 can't see below y=0 or above y=255
New mobsVariesMay appear as different mob
New enchantmentsVariesEffect works, name may differ
Underwater mechanics1.13Limited on <1.13 clients

Testing Multi-Version Support

Configuration means nothing without validation.

Test Matrix

Minimum testing coverage:

Server VersionTest Clients
1.211.21, 1.20.4, 1.19, 1.18, 1.16.5, 1.12.2, 1.8.9

Test Case 1: Basic Connection

Objective: Clients can connect

For each client version:

Connection Test Steps
1. Start server with ViaVersion suite
2. Connect with test client
3. Verify successful join

Expected:
- No connection errors
- Player spawns normally
- No console errors

Common issues:

IssueCauseFix
"Outdated client"ViaBackwards not installedInstall ViaBackwards
"Outdated server"ViaVersion not installedInstall ViaVersion
Connection timeoutProtocol not supportedCheck ViaVersion version

Test Case 2: Movement and Physics

Objective: Movement feels correct

Test:

Movement Test Steps
1. Connect with various client versions
2. Walk, sprint, jump, swim, fly
3. Note any jank or rubber-banding

Expected:
- Smooth movement
- Correct sprint/jump mechanics
- No stuttering

Known issues:

Known Movement Issues
Client 1.8:
- Sprint mechanics slightly different (client-side prediction)
- Swimming is walking underwater (pre-aquatic update)

Client 1.12:
- Elytra flight slightly different
- No swimming animations

Test Case 3: Block Interactions

Objective: Blocks appear correctly

Test:

Block Interaction Test
1. Place variety of blocks (new and old)
2. Connect with various clients
3. Verify blocks appear (even if placeholder)

Test blocks:
- Deepslate (1.17+)
- Copper (1.17+)
- Amethyst (1.17+)
- Ancient debris (1.16+)
- Honey block (1.15+)

Expected behavior:

Expected Block Behavior
Client 1.16 seeing copper block (1.17):
- Appears as stone or another placeholder
- Collision box correct
- Can break block (drops as intended)

Test Case 4: Combat Mechanics

Objective: Combat works across versions

Test:

Combat Test Steps
1. Connect with 1.8 client (old combat)
2. Connect with 1.9+ client (new combat)
3. Test PvP between clients

Expected:
- Both can damage each other
- Hit registration works
- Weapons deal appropriate damage

Combat differences:

VersionSystemAttack SpeedShields
1.8Spam clickingUnlimitedNo
1.9+CooldownLimited by weaponYes

Server can't fully bridge this gap—combat feel will differ.

Test Case 5: Inventory and Items

Objective: Items appear and function

Test:

Item Test Steps
1. Give player items from various versions
2. Connect with older clients
3. Verify items appear (even if converted)

Test items:
- Netherite sword (1.16+)
- Trident (1.13+)
- Elytra (1.9+)
- Shield (1.9+)

Expected:

Expected Item Behavior
Client 1.8 receiving netherite sword:
- Appears as diamond sword (or similar)
- Functions as weapon
- Durability works

Test Case 6: Chat and Commands

Objective: Communication works

Test:

Chat Test Steps
1. Connect with various clients
2. Send chat messages
3. Execute commands
4. Check formatting

Expected:
- All versions can chat
- Colors/formatting work
- Commands execute
- JSON chat components display properly

Format compatibility:

Chat Format Compatibility
# Avoid 1.16+ hex colors for older clients
Good: "&c&lWarning"  # Works on all versions
Bad: "&#FF5555Warning"  # Only works 1.16+

# Check client version before sending complex JSON
if (player.getProtocolVersion() >= 735) {  // 1.16+
    sendHexMessage()
} else {
    sendLegacyMessage()
}

Test Case 7: World Height Limits

Objective: Handle extended world height

Test (1.18+ server):

Below World Test
1. Teleport player to y=-64 (below old bedrock)
2. Connect with 1.17- client
3. Verify behavior

Expected:
- Player can't see blocks below y=0
- Falls through "void" visually
- Server handles position correctly

Test (1.18+ server):

Above World Test
1. Build structure at y=300 (above old limit)
2. Connect with 1.17- client
3. Fly up to y=300

Expected:
- Player can't see blocks above y=255
- Blocks invisible to client
- Server collision still works

Mitigation:

Safe Y-Level Ranges
# Build important structures within "safe" zones
Safe Y range (all clients): 0-255
Extended Y range (1.18+ only): -64-319

Test Case 8: Entity Rendering

Objective: Entities appear correctly

Test:

Entity Test Steps
1. Spawn various mobs (old and new)
2. Connect with different clients
3. Verify mobs render

Test mobs:
- Warden (1.19+)
- Allay (1.19+)
- Frog (1.19+)
- Goat (1.17+)
- Axolotl (1.17+)

Expected:

Expected Entity Behavior
Client 1.16 seeing Warden:
- Appears as alternative mob (zombie, etc.)
- Hitbox correct
- Can be damaged
- AI works server-side

Proxy Multi-Version Support

Proxies (Velocity / BungeeCord) benefit greatly from ViaVersion.

ViaVersion on Proxy

Why install on proxy?

  • Translate once, not per backend
  • Backend servers can run different versions
  • Easier management

Architecture:

Proxy with ViaVersion
Player (1.20) → Proxy (ViaVersion) → Backend 1.21
Player (1.19) → Proxy (ViaVersion) → Backend 1.21
Player (1.21) → Proxy (ViaVersion) → Backend 1.21

Installing ViaVersion on the proxy allows you to translate protocols once instead of on each backend server, making it more efficient for networks.

Installation:

Installing on Velocity
# Download ViaVersion for Velocity
wget https://github.com/ViaVersion/ViaVersion/releases/download/5.0.0/ViaVersion-5.0.0.jar

# Place in proxy plugins folder
mv ViaVersion-5.0.0.jar velocity/plugins/
Installing on BungeeCord
# Download ViaVersion for BungeeCord
wget https://github.com/ViaVersion/ViaVersion/releases/download/5.0.0/ViaVersion-5.0.0.jar

# Place in proxy plugins folder
mv ViaVersion-5.0.0.jar bungeecord/plugins/

Testing Proxy Multi-Version

Test scenario:

Proxy Test Setup
Setup:
- Proxy: Velocity with ViaVersion
- Backend 1: Paper 1.21 (lobby)
- Backend 2: Paper 1.20.4 (survival)
- Backend 3: Paper 1.19 (creative)

Test clients:
- Client 1.21
- Client 1.20
- Client 1.19

When using ViaVersion with proxies and different backend server versions, ensure all backends have compatible protocol forwarding configurations.

Test matrix:

ClientLobby (1.21)Survival (1.20.4)Creative (1.19)
1.21✅ Should work✅ Should work✅ Should work
1.20⚠️ Downgrade✅ Should work⚠️ Downgrade
1.19⚠️ Downgrade⚠️ Downgrade✅ Should work

Expected: All combinations work (ViaVersion translates)

Protocol Forwarding with ViaVersion

Important: ViaVersion must handle forwarded player info correctly.

Test:

Protocol Forwarding Test
1. Setup Velocity with modern forwarding
2. Install ViaVersion on proxy
3. Connect with various client versions
4. Verify UUIDs correct on backend

Expected:
- All clients get correct UUID
- Skins load properly
- No UUID conflicts

Advanced: ViaFabricPlus

For truly comprehensive version support, ViaFabricPlus supports nearly every Minecraft version ever released.

What is ViaFabricPlus?

Client-side mod that allows connecting to any server version from latest client.

Coverage:

  • Every Java Edition version (Alpha, Beta, Release)
  • Snapshots
  • April Fools' versions
  • Even Bedrock Edition (via Geyser integration)

How it works:

ViaFabricPlus Translation
Client: 1.21 with ViaFabricPlus
Server: 1.8

ViaFabricPlus translates: Client sends 1.8 packets

Testing with ViaFabricPlus

Test scenario:

ViaFabricPlus Test Coverage
Server versions to test:
- 1.21 (latest)
- 1.20.4
- 1.19
- 1.16.5 (popular modded version)
- 1.12.2 (popular modded version)
- 1.8.9 (PvP standard)
- Beta 1.7.3 (nostalgia)

Client: 1.21 with ViaFabricPlus

Expected: Can connect to all servers

Benefits for testing:

  • Single client connects to all versions
  • Test version compatibility easily
  • Verify server-side Via* plugins working

Common Multi-Version Issues

Issue: Blocks Invisible

Symptom: New blocks don't appear for older clients

Expected behavior: This is normal—older clients don't know about new blocks

Workaround:

  • Use blocks from client's version in important areas
  • Document which areas require specific versions
  • Consider resource pack with custom models

Issue: Movement Rubber-Banding

Symptom: Older clients experience stuttering/teleporting

Cause: Physics prediction differences

Fix:

Movement Optimization
# ViaVersion config.yml
minimize-cooldown: true

# Paper config (server-side)
# Reduce anti-cheat sensitivity for older clients

Issue: Combat Delay

Symptom: 1.9+ clients feel delayed on 1.8 combat server

Cause: Attack cooldown vs spam clicking

Fix:

  • Use combat plugin to normalize (OldCombatMechanics)
  • Or document server uses 1.9+ combat

Issue: Chunk Loading Slow

Symptom: Takes longer for older clients to load chunks

Cause: Protocol differences in chunk format

Fix:

Chunk Loading Optimization
# Paper config
# Increase chunk send rate for older protocols

Issue: Protocol Mismatch Errors

Symptom: "Protocol error" or disconnects

Cause: ViaVersion doesn't support that specific combination

Fix:

  • Update ViaVersion to latest (always)
  • Check GitHub issues for known bugs
  • May need to restrict specific version

Performance Considerations

Multi-version support has overhead.

Resource Impact

ViaVersion overhead:

  • CPU: ~5-10% increase for packet translation
  • RAM: ~50-100MB for cache
  • Latency: +1-5ms per packet translation

Not significant for most servers, but consider for:

  • Very large networks (1000+ players)
  • Extremely performance-sensitive (competitive PvP)
  • Budget hosting (limited resources)

Optimization

ViaVersion Performance Optimization
# ViaVersion config.yml

# Reduce cache size (if memory constrained)
cache-values: false  # Recompute instead of cache

# Disable features you don't need
character-width-fix: false  # Only needed for specific issues

# Minimize debug logging
debug: false

Testing Multi-Version with Bots

Manual testing every version is tedious. Bots automate this.

Why Bots for Version Testing?

Manual testing:

  • Install 10 client versions
  • Connect each manually
  • Check each feature
  • Repeat after every server update

Bot testing:

  • Configure bot tool for each version
  • Automate connection test
  • Script feature validation
  • Run as part of CI/CD

Test Scenarios

Scenario 1: Version Coverage Test

Version Coverage Test
Objective: Verify all supported versions can connect

Setup:
- Server with ViaVersion suite
- Bot tool supporting multiple protocols

Test:
1. Connect bot with protocol 1.21
2. Verify connection success
3. Disconnect
4. Connect bot with protocol 1.20
5. Repeat for: 1.19, 1.18, 1.16.5, 1.12.2, 1.8.9

Expected:
- All versions connect successfully
- No errors in console

Scenario 2: Concurrent Multi-Version Load

Concurrent Load Test
Objective: Multiple versions online simultaneously

Setup:
- Server with ViaVersion
- Multiple bot accounts

Test:
1. Connect 10 bots: 5x 1.21, 3x 1.20, 2x 1.19
2. All online simultaneously for 10 minutes
3. Monitor server performance

Expected:
- All bots stay connected
- TPS remains 19-20
- No protocol errors

Scenario 3: Version Migration Test

Version Migration Test
Objective: Client updates don't break connection

Setup:
- Bot connected with version 1.20

Test:
1. Bot connects as 1.20 client
2. Bot disconnects
3. Bot connects as 1.21 client (same account)
4. Verify connection

Expected:
- Both versions connect successfully
- Account data persistent across versions

Using SoulFire for Version Testing

SoulFire includes ViaFabricPlus integration, enabling multi-version support from a single Fabric-based client.

Why this is powerful:

Traditional bot tools:

  • Often support limited protocol versions
  • May have version-specific bugs
  • Require separate builds per version

SoulFire with ViaFabricPlus:

  • Supports virtually every Minecraft version
  • Single client translates to all versions
  • Perfect for comprehensive version compatibility testing

Test Configuration:

SoulFire Test Configuration
Server: 1.16.5 (modded)
SoulFire Configuration:
- Protocol Version: 1.16.5 (use dropdown/config)
- Bots: 5
- Join Delay: 2000-3000ms

Test:
1. Verify all 5 bots connect successfully
2. Bots remain online for 15 minutes
3. Check console for protocol errors

Expected:
- All bots connect to 1.16.5 server
- No "protocol mismatch" errors
- Server sees bots as 1.16.5 clients

Advanced Test: Version Matrix

Comprehensive Version Matrix Test
Test Goal: Verify server supports all advertised versions

Server Setup:
- Paper 1.21 with ViaVersion + ViaBackwards + ViaRewind

Test Matrix:
- 5 bots on 1.21
- 5 bots on 1.20.4
- 5 bots on 1.19
- 5 bots on 1.16.5
- 5 bots on 1.12.2
- 5 bots on 1.8.9

Process:
1. Configure bot tool to cycle through versions
2. Connect all 30 bots (5 per version)
3. Run for 30 minutes
4. Monitor for disconnects or errors

Expected Results:
✅ All 30 bots remain connected
✅ Server TPS stable (18-20)
✅ No protocol errors
✅ /list shows 30 players

Interpretation:
- If all versions connect: ViaVersion working correctly
- If specific version fails: Missing ViaBackwards/ViaRewind or config issue
- If TPS drops: Performance tuning needed

Best Practices Summary

For best results, use Paper as your server software. It provides excellent performance and full compatibility with the ViaVersion suite.

  1. Install full ViaVersion suite (ViaVersion + ViaBackwards + ViaRewind) for maximum compatibility
  2. Test major versions: 1.21, 1.20, 1.19, 1.16.5, 1.12.2, 1.8.9
  3. Document limitations: Tell players about version-specific features
  4. Keep Via plugins updated*: New Minecraft versions need new ViaVersion versions
  5. Test after updates: Verify compatibility after updating server or plugins
  6. Monitor console: Watch for protocol errors
  7. Consider world height: Build important structures in y=0-255 range
  8. Use appropriate blocks: Don't use 1.19 blocks in 1.18 areas
  9. Test proxy setups thoroughly: Multi-version + proxy + forwarding = complex
  10. Automate testing: Use bots to validate version support regularly

Conclusion

Multi-version support transforms your server from a walled garden to an inclusive community. Players don't need to frantically update or maintain multiple clients—they just connect and play.

Key takeaways:

  1. ViaVersion suite provides comprehensive version support (1.8 to latest)
  2. Testing is critical—versions have subtle differences
  3. World height is the biggest compatibility concern (1.18+)
  4. Combat mechanics differ significantly (1.8 vs 1.9+)
  5. Bot testing automates comprehensive version validation

With proper configuration and testing, your server can welcome players on any Minecraft version, growing your community and improving player experience.

Remember: A multi-version server is only as good as its testing—validate compatibility before advertising support.