diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 5e2d2b6526..ba8fd38926 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1244,7 +1244,7 @@ public final class CraftServer implements Server {
 
     @Override
     @Deprecated
-    public CraftMapView getMap(short id) {
+    public CraftMapView getMap(int id) {
         PersistentCollection collection = console.getWorldServer(DimensionManager.OVERWORLD).worldMaps;
         WorldMap worldmap = (WorldMap) collection.get(DimensionManager.OVERWORLD, WorldMap::new, "map_" + id);
         if (worldmap == null) {
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
index 5f075f6566..e5b1a73023 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
@@ -6,12 +6,15 @@ import net.minecraft.server.NBTTagCompound;
 import net.minecraft.server.NBTTagInt;
 import net.minecraft.server.NBTTagString;
 
+import org.bukkit.Bukkit;
 import org.bukkit.Color;
 import org.bukkit.Material;
 import org.bukkit.configuration.serialization.DelegateDeserialization;
 import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta;
 import org.bukkit.inventory.meta.MapMeta;
+import org.bukkit.map.MapView;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import org.bukkit.craftbukkit.util.CraftMagicNumbers;
 
@@ -147,6 +150,22 @@ class CraftMetaMap extends CraftMetaItem implements MapMeta {
         this.mapId = id;
     }
 
+    @Override
+    public boolean hasMapView() {
+        return mapId != null;
+    }
+
+    @Override
+    public MapView getMapView() {
+        Preconditions.checkState(hasMapView(), "Item does not have map associated - check hasMapView() first!");
+        return Bukkit.getMap(mapId);
+    }
+
+    @Override
+    public void setMapView(MapView map) {
+        this.mapId = (map != null) ? map.getId() : null;
+    }
+
     boolean hasScaling() {
         return scaling != SCALING_EMPTY;
     }
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
index 875b4f77c3..dd57c5c323 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
@@ -206,6 +206,13 @@ public class Commodore
                             super.visitMethodInsn( opcode, owner, name, "()I", itf );
                             return;
                         }
+                        // SPIGOT-4608
+                        if ( (owner.equals( "org/bukkit/Bukkit" ) || owner.equals( "org/bukkit/Server" ) ) && name.equals( "getMap" ) && desc.equals( "(Lorg/bukkit/map/MapView;)S" ) )
+                        {
+                            // Should be same size on stack so just call other method
+                            super.visitMethodInsn( opcode, owner, name, "(Lorg/bukkit/map/MapView;)I", itf );
+                            return;
+                        }
 
                         if ( modern )
                         {