     PokeBattle.chatView.announce('success',
       "<b>PBV:</b> #{messages.join(' | ')}")
 
-makeCommand "data", "dex", (pokemon) ->
-  pokemon = findPokemon(pokemon)
-  if pokemon.length == 0
+makeCommand "data", "dex", (query) ->
+  if (pokemon = findPokemon(query))
+    dataPokemon(pokemon)
+  else if (item = findItem(query))
+    dataItem(item)
+  else if (move = findMove(query))
+    dataMove(move)
+  else if (ability = findAbility(query))
+    dataAbility(ability)
+  else
     PokeBattle.chatView.announce("error",
-      "<b>Data error:</b> Enter a valid Pokemon.</div>")
-    return
-
+      "<b>Data error:</b> Enter a valid Pokemon, item, move, or ability.</div>")
+
+dataPokemon = (pokemon) ->
   [speciesName, formeName] = pokemon
   [speciesSlug, formeSlug] = [slugify(speciesName), slugify(formeName)]
   forme = window.Generations.XY.FormeData[speciesName][formeName]

    """
  PokeBattle.chatView.announce('success', message)

# Finds the most lenient match possible.
findPokemon = (pokemonName) ->
  pokemonName = pokemonName.trim().toLowerCase().replace(/[^a-zA-Z0-9]+/g, '')
  for speciesName, speciesData of window.Generations.XY.FormeData
    for formeName of speciesData
      name = speciesName
      name += formeName  unless formeName == 'default'
      name = name.toLowerCase().replace(/[^a-zA-Z0-9]+/g, '')
      return [speciesName, formeName]  if pokemonName == name
  # Return blank match
  []

slugify = (str) ->
  str.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/\-{2,}/g, '-')

formatName = (speciesName, formeName) ->
  if formeName == 'default'

  messages = []
  total = 0
  for array in pokemon
    continue  unless array
    [speciesName, formeName] = array
    pbv = PokeBattle.PBV.determinePBV(window.Generations.XY,
      name: speciesName, forme: formeName)
