diff --git a/.travis.yml b/.travis.yml
index 2d3b52c..3ab1d72 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,3 +9,4 @@ python:
 install: pip install -e .
 before_script: pokedex setup -v
 script: py.test
+sudo: false
diff --git a/pokedex/data/csv/berry_firmness_names.csv b/pokedex/data/csv/berry_firmness_names.csv
index c66ff7c..9af051e 100644
--- a/pokedex/data/csv/berry_firmness_names.csv
+++ b/pokedex/data/csv/berry_firmness_names.csv
@@ -1,6 +1,11 @@
 berry_firmness_id,local_language_id,name
+1,5,Très tendre
 1,9,Very Soft
+2,5,Tendre
 2,9,Soft
+3,5,Ferme
 3,9,Hard
+4,5,Très ferme
 4,9,Very Hard
+5,5,Super ferme
 5,9,Super Hard
diff --git a/pokedex/data/csv/characteristic_text.csv b/pokedex/data/csv/characteristic_text.csv
index dcdef66..23adda1 100644
--- a/pokedex/data/csv/characteristic_text.csv
+++ b/pokedex/data/csv/characteristic_text.csv
@@ -1,31 +1,61 @@
 characteristic_id,local_language_id,message
+1,5,Adore manger
 1,9,Loves to eat
+2,5,Est fier de sa puissance
 2,9,Proud of its power
+3,5,Corps robuste
 3,9,Sturdy body
+4,5,Extrêmement curieux
 4,9,Highly curious
+5,5,Très volontaire
 5,9,Strong willed
+6,5,Aime courir
 6,9,Likes to run
+7,5,S'assoupit souvent
 7,9,Takes plenty of siestas
+8,5,Aime se démener
 8,9,Likes to thrash about
+9,5,Sait encaisser les coups
 9,9,Capable of taking hits
+10,5,Coquin
 10,9,Mischievous
+11,5,Un peu vaniteux
 11,9,Somewhat vain
+12,5,Attentif aux sons
 12,9,Alert to sounds
+13,5,Dort beaucoup
 13,9,Nods off a lot
+14,5,Un peu coléreux
 14,9,A little quick tempered
+15,5,Très obstiné
 15,9,Highly persistent
+16,5,Très astucieux
 16,9,Thoroughly cunning
+17,5,Esprit rebelle
 17,9,Strongly defiant
+18,5,Bête et impulsif
 18,9,Impetuous and silly
+19,5,Éparpille des choses
 19,9,Scatters things often
+20,5,Aime combattre
 20,9,Likes to fight
+21,5,Bonne endurance
 21,9,Good endurance
+22,5,Souvent dans la lune
 22,9,Often lost in thought
+23,5,A horreur de perdre
 23,9,Hates to lose
+24,5,Aime faire le pitre
 24,9,Somewhat of a clown
+25,5,Aime se détendre
 25,9,Likes to relax
+26,5,S'emporte facilement
 26,9,Quick tempered
+27,5,Persévérant
 27,9,Good perseverance
+28,5,Très particulier
 28,9,Very finicky
+29,5,Assez entêté
 29,9,Somewhat stubborn
+30,5,Fuit rapidement
 30,9,Quick to flee
diff --git a/pokedex/data/csv/language_names.csv b/pokedex/data/csv/language_names.csv
index d30464a..31d8f11 100644
--- a/pokedex/data/csv/language_names.csv
+++ b/pokedex/data/csv/language_names.csv
@@ -1,31 +1,41 @@
 language_id,local_language_id,name
 1,1,日本語
+1,5,Japonais
 1,6,Japanisch
 1,9,Japanese
 2,1,正式ローマジ
+2,5,Romaji
 2,6,Rōmaji
 2,9,Official roomaji
 3,1,韓国語
+3,5,Coréen
 3,6,Koreanisch
 3,9,Korean
 4,1,中国語
+4,5,Chinois
 4,6,Chinesisch
 4,9,Chinese
 5,1,フランス語
+5,5,Français
 5,6,Französisch
 5,9,French
 6,1,ドイツ語
+6,5,Allemand
 6,6,Deutsch
 6,9,German
 7,1,西語
+7,5,Espagnol
 7,6,Spanisch
 7,9,Spanish
 8,1,伊語
+8,5,Italien
 8,6,Italienisch
 8,9,Italian
 9,1,英語
+9,5,Anglais
 9,6,Englisch
 9,9,English
 10,1,チェコ語
+10,5,Tchèque
 10,6,Tschechisch
 10,9,Czech
diff --git a/pokedex/data/csv/move_meta_ailment_names.csv b/pokedex/data/csv/move_meta_ailment_names.csv
index a202a71..5b4e8e6 100644
--- a/pokedex/data/csv/move_meta_ailment_names.csv
+++ b/pokedex/data/csv/move_meta_ailment_names.csv
@@ -1,21 +1,41 @@
 move_meta_ailment_id,local_language_id,name
+-1,5,????
 -1,9,????
+0,5,Aucun
 0,9,none
+1,5,Paralysie
 1,9,Paralysis
+2,5,Sommeil
 2,9,Sleep
+3,5,Gel
 3,9,Freeze
+4,5,Brûlure
 4,9,Burn
+5,5,Empoisonnement
 5,9,Poison
+6,5,Confusion
 6,9,Confusion
+7,5,Attraction
 7,9,Infatuation
+8,5,Piège
 8,9,Trap
+9,5,Cauchemar
 9,9,Nightmare
+12,5,Tourmente
 12,9,Torment
+13,5,Entrave
 13,9,Disable
+14,5,Bâillement
 14,9,Yawn
+15,5,Anti-Soin
 15,9,Heal Block
+17,5,
 17,9,No type immunity
+18,5,Vampigraine
 18,9,Leech Seed
+19,5,Embargo
 19,9,Embargo
+20,5,Requiem
 20,9,Perish Song
+21,5,Racines
 21,9,Ingrain
diff --git a/pokedex/data/csv/pal_park_area_names.csv b/pokedex/data/csv/pal_park_area_names.csv
index c0dfd97..394d249 100644
--- a/pokedex/data/csv/pal_park_area_names.csv
+++ b/pokedex/data/csv/pal_park_area_names.csv
@@ -1,6 +1,11 @@
 pal_park_area_id,local_language_id,name
+1,5,Forêt
 1,9,Forest
+2,5,Plaine
 2,9,Field
+3,5,Montagne
 3,9,Mountain
+4,5,Étang
 4,9,Pond
+5,5,Mer
 5,9,Sea
diff --git a/pokedex/data/csv/pokeathlon_stat_names.csv b/pokedex/data/csv/pokeathlon_stat_names.csv
index 4f47d7e..67fa37d 100644
--- a/pokedex/data/csv/pokeathlon_stat_names.csv
+++ b/pokedex/data/csv/pokeathlon_stat_names.csv
@@ -1,6 +1,11 @@
 pokeathlon_stat_id,local_language_id,name
+1,5,Vitesse
 1,9,Speed
+2,5,Force
 2,9,Power
+3,5,Habileté
 3,9,Skill
+4,5,Endurance
 4,9,Stamina
+5,5,Saut
 5,9,Jump
diff --git a/pokedex/data/csv/pokedex_prose.csv b/pokedex/data/csv/pokedex_prose.csv
index b20144c..22772a5 100644
--- a/pokedex/data/csv/pokedex_prose.csv
+++ b/pokedex/data/csv/pokedex_prose.csv
@@ -1,28 +1,40 @@
 pokedex_id,local_language_id,name,description
+1,5,National,Pokédex National complet
 1,6,National,Komplette Nationale Dex
 1,9,National,Entire National dex
+2,5,Kanto,Pokédex régional de Kanto dans Rouge/Bleu/Jaune
 2,6,Kanto,Rot/Blau/Gelb Kanto Dex
 2,9,Kanto,Red/Blue/Yellow Kanto dex
+3,5,Johto initial,"Pokédex régional de Johto dans Or/Argent/Cristal, appellé ""Nouveau"" Pokédex dans le jeu"
 3,6,Original Johto,"Gold/Silber/Kristall Johto Dex — Auch der ""Neue"" Pokédex im Spiel genannt"
 3,9,Original Johto,"Gold/Silver/Crystal Johto dex—called the ""New"" Pokédex in-game"
 4,6,Original Hoenn,Rubin/Saphir/Smaragd Hoenn Dex
 4,9,Original Hoenn,Ruby/Sapphire/Emerald Hoenn dex
+5,5,Sinnoh initial,Pokédex régional de Sinnoh dans Diamant/Perle
 5,6,Original Sinnoh,Diamant/Perl Sinnoh Dex
 5,9,Original Sinnoh,Diamond/Pearl Sinnoh dex
+6,5,Sinnoh étendu,Pokédex régional de Sinnoh dans Platine
 6,6,Erweitertes Sinnoh,Platin Sinnoh Dex — eine erweiterte Version von Diamant und Perl
 6,9,Extended Sinnoh,Platinum Sinnoh dex—an extended version of Diamond and Pearl's
+7,5,Johto amélioré,"Pokédex régional de Johto dans Or HeartGold/Argent SoulSilver, mis à jour pour la 4ème génération"
 7,6,Aktualisiertes Johto,HeartGold/SoulSilver Johto Dex — Dex aus Gold/Silber/Kristall um Fähigkeiten basierende Entwicklungen aus Generation IV erweitert
 7,9,Updated Johto,"HeartGold/SoulSilver Johto dex—Gold/Silver/Crystal's, extended to add move-based Generation IV evolutions"
+8,5,Unys initial,Pokédex régional d'Unys dans Noir/Blanc
 8,6,Original Einall,Schwarz/Weiß Einall Dex
 8,9,Original Unova,Black/White Unova dex
+9,5,Unys amélioré,Pokédex régional d'Unys dans Noir 2/Blanc 2
 9,6,Aktualisiertes Einall,Schwarz 2/Weiß 2 Einall Dex
 9,9,Updated Unova,Black 2/White 2 Unova dex
+11,5,Galerie,Ordre de la Galerie dans Pokémon Conquest
 11,6,Gallerie,Pokémon Conquest Galerie Reihenfolge
 11,9,Gallery,Pokémon Conquest gallery order
+12,5,Kalos : Centre,
 12,6,Kalos-Zentral,
 12,9,Central Kalos,
+13,5,Kalos : Côtes,
 13,6,Kalos-Küste,
 13,9,Coastal Kalos,
+14,5,Kalos : Monts,
 14,6,Kalos-Gebirge,
 14,9,Mountain Kalos,
 15,6,Neue Hoenn,Omega Rubin/Alpha Saphir Hoenn Dex — Dex aus Rubin/Saphir/Smaragd um Neue Entwicklungen erweitert
diff --git a/pokedex/data/csv/pokemon_color_names.csv b/pokedex/data/csv/pokemon_color_names.csv
index af86742..c0f610a 100644
--- a/pokedex/data/csv/pokemon_color_names.csv
+++ b/pokedex/data/csv/pokemon_color_names.csv
@@ -1,41 +1,51 @@
 pokemon_color_id,local_language_id,name
 1,1,黒い
+1,5,Noir
 1,6,Schwarz
 1,8,Nero
 1,9,Black
 2,1,青い
+2,5,Bleu
 2,6,Blau
 2,8,Blu
 2,9,Blue
 3,1,茶色
+3,5,Brun
 3,6,Braun
 3,8,Marrone
 3,9,Brown
 4,1,灰色
+4,5,Gris
 4,6,Grau
 4,8,Grigio
 4,9,Gray
 5,1,緑
+5,5,Vert
 5,6,Grün
 5,8,Verde
 5,9,Green
 6,1,ピンク
+6,5,Rose
 6,6,Rosa
 6,8,Rosa
 6,9,Pink
 7,1,パーパル
+7,5,Violet
 7,6,Violett
 7,8,Viola
 7,9,Purple
 8,1,赤い
+8,5,Rouge
 8,6,Rot
 8,8,Rosso
 8,9,Red
 9,1,白い
+9,5,Blanc
 9,6,Weiß
 9,8,Bianco
 9,9,White
 10,1,黄色
+10,5,Jaune
 10,6,Gelb
 10,8,Giallo
 10,9,Yellow
diff --git a/pokedex/data/csv/pokemon_habitat_names.csv b/pokedex/data/csv/pokemon_habitat_names.csv
index d974bc6..8cd3b48 100644
--- a/pokedex/data/csv/pokemon_habitat_names.csv
+++ b/pokedex/data/csv/pokemon_habitat_names.csv
@@ -1,10 +1,19 @@
 pokemon_habitat_id,local_language_id,name
+1,5,grottes
 1,9,cave
+2,5,forêts
 2,9,forest
+3,5,champs
 3,9,grassland
+4,5,montagnes
 4,9,mountain
+5,5,rares
 5,9,rare
+6,5,milieux hostiles
 6,9,rough terrain
+7,5,mers
 7,9,sea
+8,5,urbains
 8,9,urban
+9,5,marécages
 9,9,water's edge
diff --git a/pokedex/data/csv/region_names.csv b/pokedex/data/csv/region_names.csv
index fe0926e..41f65f1 100644
--- a/pokedex/data/csv/region_names.csv
+++ b/pokedex/data/csv/region_names.csv
@@ -1,13 +1,19 @@
 region_id,local_language_id,name
+1,5,Kanto
 1,6,Kanto
 1,9,Kanto
+2,5,Johto
 2,6,Johto
 2,9,Johto
+3,5,Hoenn
 3,6,Hoenn
 3,9,Hoenn
+4,5,Sinnoh
 4,6,Sinnoh
 4,9,Sinnoh
+5,5,Unys
 5,6,Einall
 5,9,Unova
+6,5,Kalos
 6,6,Kalos
 6,9,Kalos
diff --git a/pokedex/data/csv/stat_names.csv b/pokedex/data/csv/stat_names.csv
index 467e739..1e98a1a 100644
--- a/pokedex/data/csv/stat_names.csv
+++ b/pokedex/data/csv/stat_names.csv
@@ -1,40 +1,48 @@
 stat_id,local_language_id,name
 1,1,HP
+1,5,PV
 1,6,KP
 1,7,PS
 1,8,PS
 1,9,HP
 2,1,こうげき
+2,5,Attaque
 2,6,Angriff
 2,7,Ataque
 2,8,Attacco
 2,9,Attack
 3,1,ぼうぎょ
+3,5,Défense
 3,6,Verteidigung
 3,7,Defensa
 3,8,Difesa
 3,9,Defense
 4,1,とくこう
+4,5,Attaque Spéciale
 4,6,Spezialangriff
 4,7,Ataque Especial
 4,8,Attacco Speciale
 4,9,Special Attack
 5,1,とくぼう
+5,5,Défense Spéciale
 5,6,Spezialverteidigung
 5,7,Defensa Especial
 5,8,Difesa Speciale
 5,9,Special Defense
 6,1,すばやさ
+6,5,Vitesse
 6,6,Initiative
 6,7,Velocidad
 6,8,Velocità
 6,9,Speed
 7,1,めいちゅう
+7,5,Précision
 7,6,Genauigkeit
 7,7,Precisión
 7,8,precisione
 7,9,accuracy
 8,1,かいひ
+8,5,Esquive
 8,6,Fluchtwert
 8,7,Evasión
 8,8,elusione
diff --git a/pokedex/data/csv/type_names.csv b/pokedex/data/csv/type_names.csv
index cec8c2e..3d0c857 100644
--- a/pokedex/data/csv/type_names.csv
+++ b/pokedex/data/csv/type_names.csv
@@ -132,5 +132,6 @@ type_id,local_language_id,name
 10001,8,???
 10001,9,???
 10002,1,ダーク
+10002,5,Obscur
 10002,8,Ombra
 10002,9,Shadow
diff --git a/pokedex/data/csv/version_group_pokemon_move_methods.csv b/pokedex/data/csv/version_group_pokemon_move_methods.csv
index b6622df..ee0940d 100644
--- a/pokedex/data/csv/version_group_pokemon_move_methods.csv
+++ b/pokedex/data/csv/version_group_pokemon_move_methods.csv
@@ -64,3 +64,9 @@ version_group_id,pokemon_move_method_id
 15,4
 15,6
 15,10
+16,1
+16,2
+16,3
+16,4
+16,6
+16,10
diff --git a/pokedex/data/csv/version_names.csv b/pokedex/data/csv/version_names.csv
index 9b8d307..b01a3b0 100644
--- a/pokedex/data/csv/version_names.csv
+++ b/pokedex/data/csv/version_names.csv
@@ -1,74 +1,98 @@
 version_id,local_language_id,name
 1,1,赤
+1,5,Rouge
 1,6,Rot
 1,9,Red
 2,1,緑
+2,5,Bleu
 2,6,Blau
 2,9,Blue
 3,1,ピカチュウ
+3,5,Jaune
 3,6,Gelb
 3,9,Yellow
 4,1,金
+4,5,Or
 4,6,Gold
 4,9,Gold
 5,1,銀
+5,5,Argent
 5,6,Silber
 5,9,Silver
 6,1,クリスタル
+6,5,Cristal
 6,6,Kristall
 6,9,Crystal
 7,1,ルビー
+7,5,Rubis
 7,6,Rubin
 7,9,Ruby
 8,1,サファイア
+8,5,Saphir
 8,6,Saphir
 8,9,Sapphire
 9,1,エメラルド
+9,5,Émeraude
 9,6,Smaragd
 9,9,Emerald
 10,1,ファイアレッド
+10,5,Rouge Feu
 10,6,Feuerrot
 10,9,FireRed
 11,1,リーフグリーン
+11,5,Vert Feuille
 11,6,Blattgrün
 11,9,LeafGreen
 12,1,ダイヤモンド
+12,5,Diamant
 12,6,Diamant
 12,9,Diamond
 13,1,パール
+13,5,Perle
 13,6,Perl
 13,9,Pearl
 14,1,プラチナ
+14,5,Platine
 14,6,Platin
 14,9,Platinum
 15,1,ハートゴールド
+15,5,Or HeartGold
 15,6,HeartGold
 15,9,HeartGold
 16,1,ソウルシルバー
+16,5,Argent SoulSilver
 16,6,SoulSilver
 16,9,SoulSilver
 17,1,ブラック
+17,5,Noir
 17,6,Schwarz
 17,9,Black
 18,1,ホワイト
+18,5,Blanc
 18,6,Weiß
 18,9,White
 19,1,コロシアム
+19,5,Colosseum
 19,6,Colosseum
 19,9,Colosseum
 20,1,XD
+20,5,XD
 20,6,XD
 20,9,XD
 21,1,ブラック2
+21,5,Noir 2
 21,6,Schwarz 2
 21,9,Black 2
 22,1,ホワイト2
+22,5,Blanc 2
 22,6,Weiß 2
 22,9,White 2
 23,1,X
+23,5,X
 23,6,X
 23,9,X
 24,1,Y
+24,5,Y
 24,6,Y
 24,9,Y
 25,1,オメガルビー
diff --git a/pokedex/db/tables.py b/pokedex/db/tables.py
index 1858c55..5382196 100644
--- a/pokedex/db/tables.py
+++ b/pokedex/db/tables.py
@@ -114,11 +114,14 @@ create_translation_table('language_names', Language, 'names',
 ### The actual tables
 
 class Ability(TableBase):
-    u"""An ability a Pokémon can have, such as Static or Pressure."""
+    u"""An ability a Pokémon can have, such as Static or Pressure.
+
+    IDs below 10000 match the internal ID in the games.
+    IDs above 10000 are reserved for Conquest-only abilities.
+    """
     __tablename__ = 'abilities'
     __singlename__ = 'ability'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"This ability's unique ID; matches the games' internal ID")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"An identifier",
         info=dict(format='identifier'))
@@ -176,10 +179,11 @@ class Berry(TableBase):
     u"""A Berry, consumable item that grows on trees.
 
     For data common to all items, such as the name, see the corresponding item entry.
+
+    ID matches the in-game berry number.
     """
     __tablename__ = 'berries'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"This Berry's in-game number")
+    id = Column(Integer, primary_key=True, nullable=False)
     item_id = Column(Integer, ForeignKey('items.id'), nullable=False,
         doc=u"The ID of the item that represents this Berry")
     firmness_id = Column(Integer, ForeignKey('berry_firmness.id'), nullable=False,
@@ -713,12 +717,18 @@ create_translation_table('contest_type_names', ContestType, 'names',
 class EggGroup(TableBase):
     u"""An Egg group. Usually, two Pokémon can breed if they share an Egg Group.
 
-    (exceptions are the Ditto and No Eggs groups)
+    Exceptions:
+
+    Pokémon in the No Eggs group cannot breed.
+
+    Pokemon in the Ditto group can breed with any pokemon
+    except those in the Ditto or No Eggs groups.
+
+    ID matches to the internal ID used in the games.
     """
     __tablename__ = 'egg_groups'
     __singlename__ = 'egg_group'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"A unique ID for this group")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"An identifier.",
         info=dict(format='identifier'))
@@ -937,11 +947,13 @@ create_translation_table('growth_rate_prose', GrowthRate, 'prose',
 )
 
 class Item(TableBase):
-    u"""An Item from the games, like "Poké Ball" or "Bicycle". """
+    u"""An Item from the games, like "Poké Ball" or "Bicycle".
+
+    IDs do not mean anything; see ItemGameIndex for the IDs used in the games.
+    """
     __tablename__ = 'items'
     __singlename__ = 'item'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"A numeric ID")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"An identifier",
         info=dict(format='identifier'))
@@ -980,7 +992,7 @@ create_translation_table('item_flavor_summaries', Item, 'flavor_summaries',
 )
 
 class ItemCategory(TableBase):
-    u"""An item category. Not official."""
+    u"""An item category.  Not official."""
     __tablename__ = 'item_categories'
     __singlename__ = 'item_category'
     id = Column(Integer, primary_key=True, nullable=False,
@@ -999,7 +1011,7 @@ create_translation_table('item_category_prose', ItemCategory, 'prose',
 )
 
 class ItemFlag(TableBase):
-    u"""An item attribute such as "consumable" or "holdable". """
+    u"""An item attribute such as "consumable" or "holdable".  Not official. """
     __tablename__ = 'item_flags'
     __singlename__ = 'item_flag'
     id = Column(Integer, primary_key=True, nullable=False,
@@ -1064,7 +1076,7 @@ class ItemGameIndex(TableBase):
         doc=u"Internal ID of the item in the generation")
 
 class ItemPocket(TableBase):
-    u"""A pocket that categorizes items."""
+    u"""A pocket that categorizes items.  Semi-offical."""
     __tablename__ = 'item_pockets'
     __singlename__ = 'item_pocket'
     id = Column(Integer, primary_key=True, nullable=False,
@@ -1165,11 +1177,13 @@ class Machine(TableBase):
         return self.machine_number >= 100
 
 class Move(TableBase):
-    u"""A Move: technique or attack a Pokémon can learn to use."""
+    u"""A Move: technique or attack a Pokémon can learn to use.
+
+    IDs below 10000 match the internal IDs used in the games.
+    IDs above 10000 are reserved for Shadow moves from Colosseum and XD."""
     __tablename__ = 'moves'
     __singlename__ = 'move'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"A numeric ID")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"An identifier",
         info=dict(format='identifier'))
@@ -1603,11 +1617,13 @@ class Pokemon(TableBase):
     different types, moves, or other game-changing properties counts as a
     different Pokémon.  For example, this table contains four rows for Deoxys,
     but only one for Unown.
+
+    Non-default forms have IDs above 10000.
+    IDs below 10000 match the species_id column, for convenience.
     """
     __tablename__ = 'pokemon'
     __singlename__ = 'pokemon'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"A numeric ID")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u'An identifier, including form iff this row corresponds to a single, named form',
         info=dict(format='identifier'))
@@ -1789,11 +1805,15 @@ class PokemonForm(TableBase):
     color differences) of every Pokémon, regardless of how the games treat
     them.  Even Pokémon with no alternate forms have one row in this table, to
     represent their lone "normal" form.
+
+    Forms which are not the default for their species have IDs above 10000.
+    IDs below 10000 correspond to ID of the species for convenience,
+    but this should not be relied upon.
+    To get the species ID of a form, join with the pokemon table.
     """
     __tablename__ = 'pokemon_forms'
     __singlename__ = 'pokemon_form'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u'A unique ID for this form.')
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"A unique identifier for this form among all forms of all Pokémon",
         info=dict(format='identifier'))
@@ -1960,11 +1980,13 @@ create_translation_table('pokemon_shape_prose', PokemonShape, 'prose',
 )
 
 class PokemonSpecies(TableBase):
-    u"""A Pokémon species: the standard 1–151.  Or 649.  Whatever. """
+    u"""A Pokémon species: the standard 1–151.  Or 649.  Whatever.
+
+    ID matches the National Pokédex number of the species.
+    """
     __tablename__ = 'pokemon_species'
     __singlename__ = 'pokemon_species'
-    id = Column(Integer, primary_key=True, nullable=False,
-        doc=u"A numeric ID")
+    id = Column(Integer, primary_key=True, nullable=False)
     identifier = Column(Unicode(79), nullable=False,
         doc=u"An identifier",
         info=dict(format='identifier'))