diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
index bec4134626..d92f5037c0 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
@@ -49,6 +49,11 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
             return player.getName();
         }
 
+        // This might not match lastKnownName but if not it should be more correct
+        if (profile.getName() != null) {
+            return profile.getName();
+        }
+
         NBTTagCompound data = getBukkitData();
 
         if (data != null) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 748d887dec..c4ef9fa35a 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1260,14 +1260,22 @@ public final class CraftServer implements Server {
     public OfflinePlayer getOfflinePlayer(String name) {
         Validate.notNull(name, "Name cannot be null");
 
-        // This is potentially blocking :(
-        GameProfile profile = MinecraftServer.getServer().getUserCache().a(name);
-        if (profile == null) {
-            // Make an OfflinePlayer using an offline mode UUID since the name has no profile
-            return getOfflinePlayer(new GameProfile(java.util.UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), name));
+        OfflinePlayer result = getPlayerExact(name);
+        if (result == null) {
+            // This is potentially blocking :(
+            GameProfile profile = MinecraftServer.getServer().getUserCache().a(name);
+            if (profile == null) {
+                // Make an OfflinePlayer using an offline mode UUID since the name has no profile
+                result = getOfflinePlayer(new GameProfile(java.util.UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), name));
+            } else {
+                // Use the GameProfile even when we get a UUID so we ensure we still have a name
+                result = getOfflinePlayer(profile);
+            }
+        } else {
+            offlinePlayers.remove(result.getUniqueId());
         }
 
-        return getOfflinePlayer(profile.getId());
+        return result;
     }
 
     public OfflinePlayer getOfflinePlayer(java.util.UUID id) {