diff -urN source.orig/abl-show.cc source/abl-show.cc
--- source.orig/abl-show.cc	2008-08-01 02:00:50.000000000 +0300
+++ source/abl-show.cc	2008-09-15 17:32:00.000000000 +0300
@@ -189,6 +189,7 @@
     { ABIL_BREATHE_POWER, "Breathe Power", 0, 0, 125, 0, ABFLAG_BREATH },
     { ABIL_BREATHE_STICKY_FLAME, "Breathe Sticky Flame", 0, 0, 125, 0, ABFLAG_BREATH },
     { ABIL_BREATHE_STEAM, "Breathe Steam", 0, 0, 75, 0, ABFLAG_BREATH },
+    { ABIL_BREATHE_MIASMA, "Breathe Miasma", 0, 0, 125, 0, ABFLAG_BREATH },
     { ABIL_TRAN_BAT, "Bat Form", 2, 0, 0, 0, ABFLAG_NONE },
 
     { ABIL_SPIT_ACID, "Spit Acid", 0, 0, 125, 0, ABFLAG_NONE },
@@ -497,31 +498,64 @@
                   - you.experience_level;
         break;
 
+    case ABIL_BREATHE_MIASMA:
+        failure = 30 - you.experience_level;
+
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DEATH_DRAKE)
+            failure -= 20;
+        break;
+
     case ABIL_BREATHE_FIRE:
         failure = ((you.species == SP_RED_DRACONIAN) ? 30 : 50)
                         - 10 * player_mutation_level(MUT_BREATHE_FLAMES)
                         - you.experience_level;
 
-        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+            || you.attribute[ATTR_TRANSFORMATION] == TRAN_GOLDEN_DRAGON
+            || you.attribute[ATTR_TRANSFORMATION] == TRAN_LINDWURM
+            || you.attribute[ATTR_TRANSFORMATION] == TRAN_FIREDRAKE)
             failure -= 20;
         break;
 
     case ABIL_BREATHE_FROST:
+        failure = 30 - you.experience_level;
+
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_DRAGON)
+            failure -= 20;
+        break;
     case ABIL_BREATHE_POISON:
+        failure = 30 - you.experience_level;
+
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SWAMP_DRAGON
+            || you.attribute[ATTR_TRANSFORMATION] == TRAN_SWAMP_DRAKE)
+            failure -= 20;
+        break;
     case ABIL_SPIT_ACID:
+        failure = 30 - you.experience_level;
+        break;
     case ABIL_BREATHE_LIGHTNING:
+        failure = 30 - you.experience_level;
+
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STORM_DRAGON)
+            failure -= 20;
+        break;
     case ABIL_BREATHE_POWER:
+        failure = 30 - you.experience_level;
+
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_QUICKSILVER_DRAGON)
+            failure -= 20;
+        break;
     case ABIL_BREATHE_STICKY_FLAME:
         failure = 30 - you.experience_level;
 
-        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_MOTTLED_DRAGON)
             failure -= 20;
         break;
 
     case ABIL_BREATHE_STEAM:
         failure = 20 - you.experience_level;
 
-        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STEAM_DRAGON)
             failure -= 20;
         break;
 
@@ -1175,6 +1209,7 @@
     case ABIL_BREATHE_POWER:
     case ABIL_BREATHE_STICKY_FLAME:
     case ABIL_BREATHE_STEAM:
+    case ABIL_BREATHE_MIASMA:
         if (you.duration[DUR_BREATH_WEAPON]
             && abil.ability != ABIL_SPIT_ACID)
         {
@@ -1194,6 +1229,11 @@
 
             if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
                 power += 12;
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_GOLDEN_DRAGON)
+                power += 8;
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_FIREDRAKE
+                || you.attribute[ATTR_TRANSFORMATION] == TRAN_LINDWURM)
+                power += 6;
 
             snprintf(info, INFO_SIZE, "You breathe fire%c",
                      (power < 15) ? '.':'!');
@@ -1203,7 +1243,18 @@
             break;
 
         case ABIL_BREATHE_FROST:
-            if (!zapping(ZAP_BREATHE_FROST, you.experience_level, beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_DRAGON)
+                power += 12;
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_GOLDEN_DRAGON)
+                power += 8;
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SWAMP_DRAKE)
+                power += 6;
+
+
+
+            if (!zapping(ZAP_BREATHE_FROST, power, beam, true,
                          "You exhale a wave of freezing cold."))
             {
                 return (false);
@@ -1211,15 +1262,41 @@
             break;
 
         case ABIL_BREATHE_POISON:
-            if (!zapping(ZAP_BREATHE_POISON, you.experience_level, beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SWAMP_DRAGON)
+                power += 12;
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_GOLDEN_DRAGON)
+                power += 8;
+
+
+            if (!zapping(ZAP_BREATHE_POISON, power, beam, true,
                          "You exhale a blast of poison gas."))
             {
                 return (false);
             }
             break;
 
+        case ABIL_BREATHE_MIASMA:
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DEATH_DRAKE)
+                power += 6;
+
+            if (!zapping(ZAP_BREATHE_MIASMA, power, beam, true,
+                         "You exhale a blast of foul vapours."))
+            {
+                return (false);
+            }
+            break;
+
         case ABIL_BREATHE_LIGHTNING:
-            if (!zapping(ZAP_LIGHTNING, (you.experience_level * 2), beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STORM_DRAGON)
+                power += 12;
+
+            if (!zapping(ZAP_LIGHTNING, (power * 2), beam, true,
                          "You spit a bolt of lightning."))
             {
                 return (false);
@@ -1235,7 +1312,12 @@
             break;
 
         case ABIL_BREATHE_POWER:
-            if (!zapping(ZAP_BREATHE_POWER, you.experience_level, beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_QUICKSILVER_DRAGON)
+                power += 12;
+
+            if (!zapping(ZAP_BREATHE_POWER, power, beam, true,
                          "You spit a bolt of incandescent energy."))
             {
                 return (false);
@@ -1243,7 +1325,12 @@
             break;
 
         case ABIL_BREATHE_STICKY_FLAME:
-            if (!zapping(ZAP_STICKY_FLAME, you.experience_level, beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_MOTTLED_DRAGON)
+                power += 6;
+
+            if (!zapping(ZAP_STICKY_FLAME, power, beam, true,
                          "You spit a glob of burning liquid."))
             {
                 return (false);
@@ -1251,7 +1338,12 @@
             break;
 
         case ABIL_BREATHE_STEAM:
-            if (!zapping(ZAP_BREATHE_STEAM, you.experience_level, beam, true,
+            power = you.experience_level;
+
+            if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STEAM_DRAGON)
+                power += 6;
+
+            if (!zapping(ZAP_BREATHE_STEAM, power, beam, true,
                          "You exhale a blast of scalding steam."))
             {
                 return (false);
@@ -2181,12 +2273,54 @@
     //     Make better come ones first.
     if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SERPENT_OF_HELL)
         _add_talent(talents, ABIL_BREATHE_HELLFIRE, check_confused );
-    else if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
-             || player_mutation_level(MUT_BREATHE_FLAMES))
+    else if (player_mutation_level(MUT_BREATHE_FLAMES))
     {
         _add_talent(talents, ABIL_BREATHE_FIRE, check_confused );
     }
 
+    if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+    {
+        switch (you.attribute[ATTR_TRANSFORMATION])
+        {
+        case TRAN_GOLDEN_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_FIRE, check_confused );
+            _add_talent(talents, ABIL_BREATHE_FROST, check_confused );
+            _add_talent(talents, ABIL_BREATHE_POISON, check_confused );
+            break;
+        case TRAN_DRAGON:
+        case TRAN_LINDWURM:
+        case TRAN_FIREDRAKE:
+            _add_talent(talents, ABIL_BREATHE_FIRE, check_confused );
+            break;
+        case TRAN_SWAMP_DRAGON:
+        case TRAN_SWAMP_DRAKE:
+            _add_talent(talents, ABIL_BREATHE_POISON, check_confused );
+            break;
+        case TRAN_DEATH_DRAKE:
+            _add_talent(talents, ABIL_BREATHE_MIASMA, check_confused );
+            break;
+        case TRAN_ICE_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_FROST, check_confused );
+            break;
+        case TRAN_STORM_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_LIGHTNING, check_confused );
+            break;
+        case TRAN_MOTTLED_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_STICKY_FLAME, check_confused );
+            break;
+        case TRAN_STEAM_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_STEAM, check_confused );
+            break;
+        case TRAN_QUICKSILVER_DRAGON:
+            _add_talent(talents, ABIL_BREATHE_POWER, check_confused );
+            break;
+
+
+        default:
+            break;
+        }
+    }
+
     // Checking for unreleased delayed Fireball.
     if (you.attribute[ ATTR_DELAYED_FIREBALL ])
         _add_talent(talents, ABIL_DELAYED_FIREBALL, check_confused );
diff -urN source.orig/beam.cc source/beam.cc
--- source.orig/beam.cc	2008-08-01 02:00:55.000000000 +0300
+++ source/beam.cc	2008-09-15 18:08:17.000000000 +0300
@@ -399,6 +399,19 @@
         pbolt.is_beam        = true;
         break;
 
+    case ZAP_BREATHE_MIASMA:
+        if (power > 50)
+            power = 50;
+
+//      pbolt.range          = 3 + random2( 1 + power / 2 );
+        pbolt.rangeMax       = 3 + power / 2;
+        if (pbolt.rangeMax > 9)
+            pbolt.rangeMax = 9;
+
+        pbolt.flavour        = BEAM_MIASMA;
+        pbolt.is_beam        = true;
+        break;
+
     case ZAP_BREATHE_POWER:
         if (power > 50)
             power = 50;
@@ -961,6 +974,7 @@
     case ZAP_BREATHE_POISON:            // lev
     case ZAP_BREATHE_POWER:             // lev
     case ZAP_BREATHE_STEAM:             // lev
+    case ZAP_BREATHE_MIASMA:   
         if (power > 50)
             power = 50;
         break;
@@ -1498,6 +1512,23 @@
         pbolt.is_beam        = true;
         break;
 
+    case ZAP_BREATHE_MIASMA:
+        // max power = lev = 27
+        pbolt.name           = "foul vapour";
+        pbolt.colour         = DARKGREY;
+
+        pbolt.range          = 3 + random2( 1 + power / 2 );
+        if (pbolt.range > 9)
+            pbolt.range = 9;
+
+        pbolt.damage         = dice_def( 3, 2 + power / 6 );    // max dam: 18
+        pbolt.hit            = 6 + random2( 1 + power / 3 );
+        pbolt.type           = dchar_glyph(DCHAR_FIRED_ZAP);
+        pbolt.flavour        = BEAM_MIASMA;
+        pbolt.obvious_effect = true;
+        pbolt.is_beam        = true;
+        break;
+
     case ZAP_BREATHE_POWER:     // cap 50
         pbolt.name           = "bolt of energy";
         // max power = lev = 27
diff -urN source.orig/beam.h source/beam.h
--- source.orig/beam.h	2008-08-01 02:00:52.000000000 +0300
+++ source/beam.h	2008-09-15 16:46:33.000000000 +0300
@@ -95,6 +95,7 @@
     ZAP_BREATHE_LIGHTNING,
     ZAP_PETRIFY,
     ZAP_HELLFROST,
+    ZAP_BREATHE_MIASMA,
     NUM_ZAPS                           // must remain last member {dlb}
 };
 
diff -urN source.orig/chardump.cc source/chardump.cc
--- source.orig/chardump.cc	2008-08-01 02:00:51.000000000 +0300
+++ source/chardump.cc	2008-09-13 17:43:33.000000000 +0300
@@ -250,8 +250,22 @@
         case TRAN_ICE_BEAST:
             text += "You " + verb + " a creature of crystalline ice.";
             break;
+        case TRAN_SWAMP_DRAKE:
+        case TRAN_STEAM_DRAGON:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_WYVERN:
+        case TRAN_FIREDRAKE:
+        case TRAN_DEATH_DRAKE:
+        case TRAN_LINDWURM:
+        case TRAN_SWAMP_DRAGON:
         case TRAN_DRAGON:
-            text += "You " + verb + " a fearsome dragon!";
+        case TRAN_ICE_DRAGON:
+        case TRAN_STORM_DRAGON:
+        case TRAN_QUICKSILVER_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
+            text += "You " + verb + " a fearsome " + dragon_name(static_cast<transformation_type>(you.attribute[ATTR_TRANSFORMATION])) + "!";
             break;
         case TRAN_LICH:
             text += "You " + verb + " in lich-form.";
diff -urN source.orig/describe.cc source/describe.cc
--- source.orig/describe.cc	2008-08-01 02:00:52.000000000 +0300
+++ source/describe.cc	2008-09-13 18:05:53.000000000 +0300
@@ -3180,7 +3180,7 @@
         // Give a detailed listing of what attacks the character may perform.
         std::vector<std::string> unarmed_attacks;
 
-        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+        if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
             || player_genus(GENPC_DRACONIAN)
             || you.species == SP_MERFOLK && player_is_swimming()
             || player_mutation_level( MUT_STINGER ))
@@ -3189,7 +3189,7 @@
         }
 
         if (player_mutation_level(MUT_FANGS)
-            || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+            || dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
         {
             unarmed_attacks.push_back("bite other creatures");
         }
diff -urN source.orig/enum.h source/enum.h
--- source.orig/enum.h	2008-08-01 02:00:52.000000000 +0300
+++ source/enum.h	2008-09-15 16:42:14.000000000 +0300
@@ -67,7 +67,8 @@
     ABIL_EVOKE_MAPPING,                //   30
     ABIL_EVOKE_TELEPORTATION,
     ABIL_EVOKE_BLINK,                  //   32
-    // 33 - 50 unused
+    ABIL_BREATHE_MIASMA,
+    // 34 - 50 unused
     ABIL_EVOKE_TURN_INVISIBLE = 51,    //   51
     ABIL_EVOKE_TURN_VISIBLE,
     ABIL_EVOKE_LEVITATE,
diff -urN source.orig/fight.cc source/fight.cc
--- source.orig/fight.cc	2008-08-01 02:01:01.000000000 +0300
+++ source/fight.cc	2008-09-15 16:25:41.000000000 +0300
@@ -903,12 +903,12 @@
             uattack = (coinflip() ? UNAT_HEADBUTT : UNAT_KICK);
 
         if (player_mutation_level(MUT_FANGS)
-            || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+            || dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
         {
             uattack = UNAT_BITE;
         }
 
-        if ((you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+        if ((dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
                || player_genus(GENPC_DRACONIAN)
                || (you.species == SP_MERFOLK && player_is_swimming())
                || player_mutation_level( MUT_STINGER ))
@@ -948,7 +948,7 @@
 
             if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SERPENT_OF_HELL
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_BEAST
-                || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+                || dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_SPIDER
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
             {
@@ -985,7 +985,7 @@
             if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SERPENT_OF_HELL
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_SPIDER
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_BEAST
-                || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+                || dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
             {
                 continue;
@@ -1067,7 +1067,7 @@
             if (you.attribute[ATTR_TRANSFORMATION] == TRAN_SERPENT_OF_HELL
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_SPIDER
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_BEAST
-                || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+                || dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
                 || you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
             {
                 continue;
@@ -1651,7 +1651,21 @@
             else
                 attack_verb = "pummel";
             break;
+        case TRAN_SWAMP_DRAKE:
+        case TRAN_STEAM_DRAGON:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_WYVERN:
+        case TRAN_FIREDRAKE:
+        case TRAN_DEATH_DRAKE:
+        case TRAN_LINDWURM:
+        case TRAN_SWAMP_DRAGON:
         case TRAN_DRAGON:
+        case TRAN_ICE_DRAGON:
+        case TRAN_STORM_DRAGON:
+        case TRAN_QUICKSILVER_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
         case TRAN_SERPENT_OF_HELL:
             if (damage < HIT_MED)
                 attack_verb = "claw";
@@ -2206,7 +2220,7 @@
         if (mons_genus(defender->mons_species()) == MONS_DRAGON
             || mons_genus(defender->mons_species()) == MONS_DRACONIAN
             || defender->atype() == ACT_PLAYER
-               && you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+               && dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
         {
             special_damage = 1 + random2(3*damage_done/2);
             if (defender_visible)
@@ -2841,7 +2855,21 @@
             your_to_hit += maybe_random2(9, random_factor);
             break;
         case TRAN_SERPENT_OF_HELL:
+        case TRAN_SWAMP_DRAKE:
+        case TRAN_STEAM_DRAGON:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_WYVERN:
+        case TRAN_FIREDRAKE:
+        case TRAN_DEATH_DRAKE:
+        case TRAN_LINDWURM:
+        case TRAN_SWAMP_DRAGON:
         case TRAN_DRAGON:
+        case TRAN_ICE_DRAGON:
+        case TRAN_STORM_DRAGON:
+        case TRAN_QUICKSILVER_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
             your_to_hit += maybe_random2(10, random_factor);
             break;
         case TRAN_LICH:
@@ -3064,8 +3092,24 @@
         case TRAN_STATUE:
             damage = 12 + you.strength;
             break;
-        case TRAN_SERPENT_OF_HELL:
+        case TRAN_SWAMP_DRAKE:
+        case TRAN_WYVERN:
+        case TRAN_FIREDRAKE:
+        case TRAN_DEATH_DRAKE:
+        case TRAN_LINDWURM:
+            damage = 10 + you.strength;
+            break;
+        case TRAN_STEAM_DRAGON:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_SWAMP_DRAGON:
         case TRAN_DRAGON:
+        case TRAN_ICE_DRAGON:
+        case TRAN_STORM_DRAGON:
+        case TRAN_QUICKSILVER_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
+        case TRAN_SERPENT_OF_HELL:
             damage = 20 + you.strength;
             break;
         case TRAN_LICH:
diff -urN source.orig/item_use.cc source/item_use.cc
--- source.orig/item_use.cc	2008-08-01 02:00:47.000000000 +0300
+++ source/item_use.cc	2008-09-13 23:00:52.000000000 +0300
@@ -585,7 +585,7 @@
 
                 case SPWPN_DRAGON_SLAYING:
                     mpr(player_genus(GENPC_DRACONIAN)
-                        || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+                        || dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
                             ? "You feel a sudden desire to commit suicide."
                             : "You feel a sudden desire to slay dragons!");
                     break;
@@ -1174,6 +1174,15 @@
         }
     }
 
+    if ( dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
+         && armour_is_hide(you.inv[item])
+         && you.inv[item].sub_type != ARM_TROLL_HIDE )
+    {
+        mprf("%s is stuck to your body!",
+        you.inv[item].name(DESC_CAP_YOUR).c_str());
+        return (false);
+    }
+
     if (!safe_to_remove_or_wear(you.inv[item], true))
         return (false);
 
diff -urN source.orig/misc.cc source/misc.cc
--- source.orig/misc.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/misc.cc	2008-09-13 18:09:27.000000000 +0300
@@ -2681,7 +2681,21 @@
         result = "front leg";
         break;
     case TRAN_SERPENT_OF_HELL:
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
     case TRAN_BAT:
         result = "foreclaw";
         break;
diff -urN source.orig/output.cc source/output.cc
--- source.orig/output.cc	2008-08-01 02:01:03.000000000 +0300
+++ source/output.cc	2008-09-13 18:08:12.000000000 +0300
@@ -2334,7 +2334,21 @@
       case TRAN_ICE_BEAST:
           text += "\nYou are an ice creature.";
           break;
+      case TRAN_SWAMP_DRAKE:
+      case TRAN_STEAM_DRAGON:
+      case TRAN_MOTTLED_DRAGON:
+      case TRAN_WYVERN:
+      case TRAN_FIREDRAKE:
+      case TRAN_DEATH_DRAKE:
+      case TRAN_LINDWURM:
+      case TRAN_SWAMP_DRAGON:
       case TRAN_DRAGON:
+      case TRAN_ICE_DRAGON:
+      case TRAN_STORM_DRAGON:
+      case TRAN_QUICKSILVER_DRAGON:
+      case TRAN_SHADOW_DRAGON:
+      case TRAN_GOLDEN_DRAGON:
+      case TRAN_IRON_DRAGON:
           text += "\nYou are in dragon-form.";
           break;
       case TRAN_LICH:
diff -urN source.orig/player.cc source/player.cc
--- source.orig/player.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/player.cc	2008-09-15 18:23:02.000000000 +0300
@@ -497,11 +497,14 @@
         // Compare with monster *genus*.
         case TRAN_SPIDER:
             return (mons_genus(mon) == MONS_WOLF_SPIDER);
-        case TRAN_DRAGON:
-            return (mons_genus(mon) == MONS_DRAGON); // Includes all drakes.
+        //case TRAN_DRAGON:
+        //    return (mons_genus(mon) == MONS_DRAGON); // Includes all drakes.
         default:
             break; // Check real (non-transformed) form.
         }
+
+        if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+            return (mons_genus(mon) == MONS_DRAGON); // Includes all drakes.
     }
 
     switch (you.species)
@@ -676,7 +679,7 @@
         return (true);
 
     // These cannot use anything but jewellery.
-    if (transform == TRAN_SPIDER || transform == TRAN_DRAGON
+    if (transform == TRAN_SPIDER || dragon_transformation(transform)
         || transform == TRAN_SERPENT_OF_HELL)
     {
         return (false);
@@ -1233,6 +1236,9 @@
     if (items && player_equip(EQ_BODY_ARMOUR, ARM_STEAM_DRAGON_ARMOUR))
         res += 2;
 
+    if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STEAM_DRAGON)
+        res += 2;
+
     return (res + player_res_fire(calc_unid, temp, items) / 2);
 }
 
@@ -1293,6 +1299,15 @@
         case TRAN_ICE_BEAST:
             rf--;
             break;
+        case TRAN_ICE_DRAGON:
+            rf--;
+            break;
+        case TRAN_FIREDRAKE:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
+            rf++;
+            break;
         case TRAN_DRAGON:
             rf += 2;
             break;
@@ -1335,6 +1350,15 @@
         case TRAN_DRAGON:
             rc--;
             break;
+        case TRAN_STORM_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
+            rc++;
+            break;
+        case TRAN_ICE_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+            rc += 2;
+            break;
         case TRAN_LICH:
             rc++;
             break;
@@ -1445,6 +1469,11 @@
         if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STATUE)
             re += 1;
 
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_GOLDEN_DRAGON)
+            re += 1;
+        if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STORM_DRAGON)
+            re += 3;
+
         if (you.attribute[ATTR_TRANSFORMATION] == TRAN_AIR)
             re += 2;  // multiple levels currently meaningless
 
@@ -1562,7 +1591,15 @@
         case TRAN_LICH:
         case TRAN_ICE_BEAST:
         case TRAN_STATUE:
+        case TRAN_SWAMP_DRAKE:
+        case TRAN_MOTTLED_DRAGON:
+        case TRAN_DEATH_DRAKE:
+        case TRAN_SWAMP_DRAGON:
         case TRAN_DRAGON:
+        case TRAN_ICE_DRAGON:
+        case TRAN_SHADOW_DRAGON:
+        case TRAN_GOLDEN_DRAGON:
+        case TRAN_IRON_DRAGON:
         case TRAN_SERPENT_OF_HELL:
         case TRAN_AIR:
             rp++;
@@ -1788,6 +1825,10 @@
         case TRAN_LICH:
             pl += 3;
             break;
+        case TRAN_DEATH_DRAKE:
+        case TRAN_SHADOW_DRAGON:
+            pl += 3;
+            break;
         default:
            break;
         }
@@ -1926,6 +1967,15 @@
 
     switch (you.attribute[ATTR_TRANSFORMATION])
     {
+    case TRAN_WYVERN:
+        ps *= 9;
+        ps /= 10;
+        break;
+    case TRAN_QUICKSILVER_DRAGON:
+        ps *= 8;
+        ps /= 10;
+        break;
+
     case TRAN_STATUE:
         ps *= 15;
         ps /= 10;
@@ -2166,10 +2216,6 @@
                 AC += (100 + 100 * you.skills[SK_ICE_MAGIC] / 4);   // max +7
             break;
 
-        case TRAN_DRAGON:
-            AC += (700 + 100 * you.skills[SK_FIRE_MAGIC] / 3);      // max 16
-            break;
-
         case TRAN_STATUE: // main ability is armour (high bonus)
             AC += (1700 + 100 * you.skills[SK_EARTH_MAGIC] / 2);    // max 30
 
@@ -2185,6 +2231,53 @@
             AC = (you.skills[SK_AIR_MAGIC] * 300) / 2;            // max 40
             break;
 
+        case TRAN_SWAMP_DRAKE:
+            AC += (500 + 100 * (you.skills[SK_POISON_MAGIC] + 1) / 4); // max 12
+            break;
+        case TRAN_STEAM_DRAGON:
+            AC += (500 + 100 * (you.skills[SK_AIR_MAGIC] + 1) / 4); // max 12
+            break;
+        case TRAN_MOTTLED_DRAGON:
+            AC += (500 + 100 * (you.skills[SK_FIRE_MAGIC] + 1) / 4); // max 12
+            break;
+        case TRAN_WYVERN:
+            AC += (500 + 100 * (you.skills[SK_SPELLCASTING] + 1) / 4); // max 12
+            break;
+        case TRAN_FIREDRAKE:
+            AC += (500 + 100 * (you.skills[SK_FIRE_MAGIC] + 1) / 4); // max 12
+            break;
+        case TRAN_DEATH_DRAKE:
+            AC += (500 + 100 * (you.skills[SK_NECROMANCY] + 1) / 4); // max 12
+            break;
+        case TRAN_LINDWURM:
+            AC += (500 + 100 * (you.skills[SK_EARTH_MAGIC] + 1) / 4); // max 12
+            break;
+        
+        case TRAN_SHADOW_DRAGON:
+            AC += (700 + 100 * you.skills[SK_NECROMANCY] / 3);     // max 16
+            break;
+        case TRAN_STORM_DRAGON:
+            AC += (700 + 100 * you.skills[SK_AIR_MAGIC] / 3);      // max 16
+            break;
+        case TRAN_SWAMP_DRAGON:
+            AC += (700 + 100 * you.skills[SK_POISON_MAGIC] / 3);   // max 16
+            break;
+        case TRAN_IRON_DRAGON:
+            AC += (700 + 100 * you.skills[SK_EARTH_MAGIC] / 3);    // max 16
+            break;
+        case TRAN_ICE_DRAGON:
+            AC += (700 + 100 * you.skills[SK_ICE_MAGIC] / 3);      // max 16
+            break;
+        case TRAN_DRAGON:
+            AC += (700 + 100 * you.skills[SK_FIRE_MAGIC] / 3);     // max 16
+            break;
+        case TRAN_GOLDEN_DRAGON:
+            AC += (700 + 100 *
+                   (you.skills[SK_FIRE_MAGIC] + you.skills[SK_ICE_MAGIC] + you.skills[SK_POISON_MAGIC]) / 9);
+            break;
+    case TRAN_QUICKSILVER_DRAGON:
+
+
         default:
             break;
         }
@@ -3818,7 +3911,21 @@
     case TRAN_ICE_BEAST:
         mpr( "You are an ice creature." );
         break;
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
         mpr( "You are in dragon-form." );
         break;
     case TRAN_LICH:
@@ -4238,7 +4345,7 @@
     if (amulet == AMU_CONTROLLED_FLIGHT
         && (you.duration[DUR_CONTROLLED_FLIGHT]
             || player_genus(GENPC_DRACONIAN)
-            || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+            || flying_dragon_transformation(you.attribute[ATTR_TRANSFORMATION])
             || you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT))
     {
         return (true);
@@ -4920,10 +5027,16 @@
             hitp *= 12;
             hitp /= 10;
             break;
-        case TRAN_DRAGON:
-            hitp *= 16;
+        //case TRAN_DRAGON:
+        //    hitp *= 16;
+        //    hitp /= 10;
+        //    break;
+        }
+
+        if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+        {
+            hitp *= dragon_extra_hp(you.attribute[ATTR_TRANSFORMATION]);
             hitp /= 10;
-            break;
         }
     }
 
@@ -5316,13 +5429,18 @@
     switch ( you.attribute[ATTR_TRANSFORMATION] )
     {
     case TRAN_STATUE:          result +=  2; break;
-    case TRAN_DRAGON:          result += 10; break;
+    //case TRAN_DRAGON:          result += 10; break;
     case TRAN_LICH:            result +=  3; break;
     case TRAN_SERPENT_OF_HELL: result += 13; break;
     case TRAN_BAT:             result -=  5; break;
     default:                                 break;
     }
 
+    if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+    {
+        result += dragon_extra_stat(you.attribute[ATTR_TRANSFORMATION], STAT_STRENGTH);
+    }
+
     return (result);
 }
 
@@ -5393,6 +5511,11 @@
     default:                        break;
     }
 
+    if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+    {
+        result += dragon_extra_stat(you.attribute[ATTR_TRANSFORMATION], STAT_DEXTERITY);
+    }
+
     return (result);
 }
 
@@ -5873,7 +5996,21 @@
     const int transform = attribute[ATTR_TRANSFORMATION];
     switch (transform)
     {
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
     case TRAN_SERPENT_OF_HELL:
         return "roar";
     case TRAN_SPIDER:
@@ -6369,7 +6506,7 @@
 
 flight_type player::flight_mode() const
 {
-    if (attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+    if (flying_dragon_transformation(attribute[ATTR_TRANSFORMATION])
         || attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
     {
         return FL_FLY;
@@ -6539,7 +6676,7 @@
     if (allow_tran)
     {
         // these transformations bring claws with them
-        if (attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+        if (dragon_transformation(attribute[ATTR_TRANSFORMATION])
             || attribute[ATTR_TRANSFORMATION] == TRAN_SERPENT_OF_HELL)
         {
             return 3;
diff -urN source.orig/spells4.cc source/spells4.cc
--- source.orig/spells4.cc	2008-08-01 02:01:03.000000000 +0300
+++ source/spells4.cc	2008-09-13 18:11:08.000000000 +0300
@@ -320,7 +320,21 @@
     case TRAN_NONE:
     case TRAN_SPIDER:
     case TRAN_LICH:
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
     case TRAN_AIR:
     case TRAN_SERPENT_OF_HELL:
     case TRAN_BAT:
diff -urN source.orig/spl-data.h source/spl-data.h
--- source.orig/spl-data.h	2008-08-01 02:01:02.000000000 +0300
+++ source/spl-data.h	2008-09-15 16:22:29.000000000 +0300
@@ -1676,7 +1676,7 @@
 
 {
     SPELL_DRAGON_FORM, "Dragon Form",
-     SPTYP_FIRE | SPTYP_TRANSMIGRATION,
+     SPTYP_TRANSMIGRATION,
      SPFLAG_HELPFUL,
      8,
      200,
diff -urN source.orig/transfor.cc source/transfor.cc
--- source.orig/transfor.cc	2008-08-01 02:00:46.000000000 +0300
+++ source/transfor.cc	2008-09-15 16:31:47.000000000 +0300
@@ -26,6 +26,7 @@
 #include "itemprop.h"
 #include "items.h"
 #include "misc.h"
+#include "mon-util.h"
 #include "output.h"
 #include "player.h"
 #include "randart.h"
@@ -36,6 +37,284 @@
 void drop_everything(void);
 void extra_hp(int amount_extra);
 
+static transformation_type _random_dragon()
+{
+    if (you.equip[EQ_BODY_ARMOUR] != -1)
+    {
+        item_def& arm(you.inv[you.equip[EQ_BODY_ARMOUR]]);
+        if (armour_is_hide(arm) && arm.sub_type != ARM_TROLL_HIDE)
+            mprf("%s glows brightly!", arm.name(DESC_CAP_YOUR).c_str());
+
+        switch (arm.sub_type)
+        {
+        case ARM_DRAGON_HIDE:
+            return TRAN_DRAGON;
+        case ARM_ICE_DRAGON_HIDE:
+            return TRAN_ICE_DRAGON;
+        case ARM_STEAM_DRAGON_HIDE:
+            return TRAN_STEAM_DRAGON;
+        case ARM_MOTTLED_DRAGON_HIDE:
+            return TRAN_MOTTLED_DRAGON;
+        case ARM_STORM_DRAGON_HIDE:
+            return TRAN_STORM_DRAGON;
+        case ARM_GOLD_DRAGON_HIDE:
+            return TRAN_GOLDEN_DRAGON;
+        case ARM_SWAMP_DRAGON_HIDE:
+            return TRAN_SWAMP_DRAGON;
+        default:
+            break;
+        }
+    }
+    int fe = (you.skills[SK_FIRE_MAGIC] + you.skills[SK_EARTH_MAGIC]) / 2;
+    int n = you.skills[SK_NECROMANCY];
+    int pa = (you.skills[SK_POISON_MAGIC] + you.skills[SK_AIR_MAGIC]) / 2;
+    int rand = random2(10 + fe + n + pa);
+
+    if (rand < 10)
+        return TRAN_WYVERN;
+    else if (rand < 10 + fe)
+        return TRAN_LINDWURM;
+    else if (rand < 10 + fe + n)
+        return TRAN_DEATH_DRAKE;
+    else if (rand < 10 + fe + n + pa)
+        return TRAN_SWAMP_DRAKE;
+
+
+    return TRAN_QUICKSILVER_DRAGON; // should not happen
+
+    //return static_cast<transformation_type>(TRAN_SWAMP_DRAKE + random2(15));
+}
+
+bool dragon_transformation(char which_tran)
+{
+    if (which_tran >= TRAN_SWAMP_DRAKE && which_tran <= TRAN_IRON_DRAGON)
+        return true;
+    return false;
+}
+
+bool flying_dragon_transformation(char which_tran)
+{
+    switch (which_tran)
+    {
+    case TRAN_NONE:
+        return false;
+    case TRAN_LINDWURM:
+    case TRAN_IRON_DRAGON:
+    case TRAN_WYVERN:
+        return false;
+    default:
+        return true;
+    }
+}
+
+const char* dragon_name(transformation_type which_tran)
+{
+    switch (which_tran)
+    {
+    case TRAN_SWAMP_DRAKE:
+        return "swamp drake";
+    case TRAN_STEAM_DRAGON:
+        return "steam dragon";
+    case TRAN_MOTTLED_DRAGON:
+        return "mottled dragon";
+    case TRAN_WYVERN:
+        return "wyvern";
+    case TRAN_FIREDRAKE:
+        return "firedrake";
+    case TRAN_DEATH_DRAKE:
+        return "death drake";
+    case TRAN_LINDWURM:
+        return "lindwurm";
+    case TRAN_SWAMP_DRAGON:
+        return "swamp dragon";
+    case TRAN_DRAGON:
+        return "dragon";
+    case TRAN_ICE_DRAGON:
+        return "ice dragon";
+    case TRAN_STORM_DRAGON:
+        return "storm dragon";
+    case TRAN_QUICKSILVER_DRAGON:
+        return "quicksilver dragon";
+    case TRAN_SHADOW_DRAGON:
+        return "shadow dragon";
+    case TRAN_GOLDEN_DRAGON:
+        return "golden dragon";
+    case TRAN_IRON_DRAGON:
+        return "iron dragon";
+    default:
+        return "dragon";
+    }
+}
+
+static unsigned char _dragon_symbol(transformation_type which_tran)
+{
+    switch (which_tran)
+    {
+    case TRAN_SWAMP_DRAKE:
+        return mons_char(MONS_SWAMP_DRAKE);
+    case TRAN_STEAM_DRAGON:
+        return mons_char(MONS_STEAM_DRAGON);
+    case TRAN_MOTTLED_DRAGON:
+        return mons_char(MONS_MOTTLED_DRAGON);
+    case TRAN_WYVERN:
+        return mons_char(MONS_WYVERN);
+    case TRAN_FIREDRAKE:
+        return mons_char(MONS_FIREDRAKE);
+    case TRAN_DEATH_DRAKE:
+        return mons_char(MONS_DEATH_DRAKE);
+    case TRAN_LINDWURM:
+        return mons_char(MONS_LINDWURM);
+    case TRAN_SWAMP_DRAGON:
+        return mons_char(MONS_SWAMP_DRAGON);
+    case TRAN_DRAGON:
+        return mons_char(MONS_DRAGON);
+    case TRAN_ICE_DRAGON:
+        return mons_char(MONS_ICE_DRAGON);
+    case TRAN_STORM_DRAGON:
+        return mons_char(MONS_STORM_DRAGON);
+    case TRAN_QUICKSILVER_DRAGON:
+        return mons_char(MONS_QUICKSILVER_DRAGON);
+    case TRAN_SHADOW_DRAGON:
+        return mons_char(MONS_SHADOW_DRAGON);
+    case TRAN_GOLDEN_DRAGON:
+        return mons_char(MONS_GOLDEN_DRAGON);
+    case TRAN_IRON_DRAGON:
+        return mons_char(MONS_IRON_DRAGON);
+    default:
+        return 'D';
+    }
+}
+
+static int _dragon_colour(transformation_type which_tran)
+{
+    switch (which_tran)
+    {
+    case TRAN_SWAMP_DRAKE:
+        return mons_class_colour(MONS_SWAMP_DRAKE);
+    case TRAN_STEAM_DRAGON:
+        return mons_class_colour(MONS_STEAM_DRAGON);
+    case TRAN_MOTTLED_DRAGON:
+        return mons_class_colour(MONS_MOTTLED_DRAGON);
+    case TRAN_WYVERN:
+        return mons_class_colour(MONS_WYVERN);
+    case TRAN_FIREDRAKE:
+        return mons_class_colour(MONS_FIREDRAKE);
+    case TRAN_DEATH_DRAKE:
+        return mons_class_colour(MONS_DEATH_DRAKE);
+    case TRAN_LINDWURM:
+        return mons_class_colour(MONS_LINDWURM);
+    case TRAN_SWAMP_DRAGON:
+        return mons_class_colour(MONS_SWAMP_DRAGON);
+    case TRAN_DRAGON:
+        return mons_class_colour(MONS_DRAGON);
+    case TRAN_ICE_DRAGON:
+        return mons_class_colour(MONS_ICE_DRAGON);
+    case TRAN_STORM_DRAGON:
+        return mons_class_colour(MONS_STORM_DRAGON);
+    case TRAN_QUICKSILVER_DRAGON:
+        return mons_class_colour(MONS_QUICKSILVER_DRAGON);
+    case TRAN_SHADOW_DRAGON:
+        return mons_class_colour(MONS_SHADOW_DRAGON);
+    case TRAN_GOLDEN_DRAGON:
+        return mons_class_colour(MONS_GOLDEN_DRAGON);
+    case TRAN_IRON_DRAGON:
+        return mons_class_colour(MONS_IRON_DRAGON);
+    default:
+        return GREEN;
+    }
+}
+
+int dragon_extra_hp(char which_tran)
+{
+    switch (which_tran)
+    {
+    // 4
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+        return 12;
+    // 5
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+        return 13;
+    // 6
+    case TRAN_FIREDRAKE:
+    // 9
+        return 14;
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
+        return 15;
+    // 12
+    case TRAN_DRAGON:  // baseline 16
+    case TRAN_ICE_DRAGON:
+        return 16;
+    // 14
+    case TRAN_STORM_DRAGON:
+        return 17;
+    // 16
+    case TRAN_QUICKSILVER_DRAGON:
+        return 18;
+    // 17
+    case TRAN_SHADOW_DRAGON:
+        return 19;
+    // 18
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
+        return 20;
+    default:
+        return 10;
+    }
+}
+
+int dragon_extra_stat(char which_tran, stat_type which_stat)
+{
+    if (which_stat != STAT_DEXTERITY && which_tran == TRAN_QUICKSILVER_DRAGON)
+        return 6; // +6 str
+
+    if (which_stat != STAT_STRENGTH)
+        return 0;
+
+    switch (which_tran)
+    {
+    // 4
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+        return 6;
+    // 5
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+        return 7;
+    // 6
+    case TRAN_FIREDRAKE:
+    // 9
+        return 8;
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
+        return 9;
+    // 12
+    case TRAN_DRAGON:  // baseline 10
+    case TRAN_ICE_DRAGON:
+        return 10;
+    // 14
+    case TRAN_STORM_DRAGON:
+        return 11;
+    // 16
+    case TRAN_QUICKSILVER_DRAGON:
+        return 6; // +6 dex
+    // 17
+    case TRAN_SHADOW_DRAGON:
+        return 13;
+    // 18
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
+        return 14;
+    default:
+        return 0;
+    }
+}
+
+
 static void _init_equipment_removal(std::set<equipment_type> &rem_stuff,
                                     int which_trans)
 {
@@ -86,6 +365,22 @@
         rem_stuff.insert(EQ_RIGHT_RING);
         rem_stuff.insert(EQ_AMULET);
         break;
+
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_SWAMP_DRAGON:
+    case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+        if ( you.equip[EQ_BODY_ARMOUR] != -1
+             && armour_is_hide(you.inv[you.equip[EQ_BODY_ARMOUR]])
+             && you.inv[you.equip[EQ_BODY_ARMOUR]].sub_type != ARM_TROLL_HIDE )
+        {
+            rem_stuff.erase(EQ_BODY_ARMOUR);
+        }
+        break;
+
     default:
         break;
     }
@@ -267,7 +562,23 @@
         return SIZE_TINY;
     case TRAN_ICE_BEAST:
         return SIZE_LARGE;
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_WYVERN:
+        return SIZE_BIG;
+    case TRAN_LINDWURM:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_SWAMP_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+        return SIZE_GIANT;
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_IRON_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
     case TRAN_SERPENT_OF_HELL:
         return SIZE_HUGE;
     case TRAN_AIR:
@@ -281,8 +592,19 @@
 // (if it fails).
 bool transform(int pow, transformation_type which_trans, bool quiet)
 {
+    if (which_trans == TRAN_DRAGON)
+    {
+        // If already transformed to dragon, continue that transformation
+        if (dragon_transformation(you.attribute[ATTR_TRANSFORMATION]))
+        {
+            which_trans = static_cast<transformation_type> (you.attribute[ATTR_TRANSFORMATION]);
+        }
+        else
+            which_trans = _random_dragon();
+    }
+
     if (you.species == SP_MERFOLK && player_is_swimming()
-        && which_trans != TRAN_DRAGON)
+        && !flying_dragon_transformation(which_trans))
     {
         // This might by overkill, but it's okay because obviously
         // whatever magical ability that lets them walk on land is
@@ -491,7 +813,22 @@
         you.colour = LIGHTGREY;
         return (true);
 
-    case TRAN_DRAGON:  // also AC +10, ev -3, cold -1, fire +2, pois +1, flight
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
+    case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
+    //case TRAN_DRAGON:  // also AC +10, ev -3, cold -1, fire +2, pois +1, flight
         if (check_for_cursed_equipment(rem_stuff, quiet))
             return (false);
 
@@ -501,26 +838,28 @@
 
         if (you.species == SP_MERFOLK && player_is_swimming())
         {
-            mpr("You fly out of the water as you turn into "
-                "a fearsome dragon!");
+            mprf("You fly out of the water as you turn into "
+                "a fearsome %s!", dragon_name(which_trans));
         }
         else
-            mpr("You turn into a fearsome dragon!");
+            mprf("You turn into a fearsome %s!", dragon_name(which_trans));
 
         remove_equipment(rem_stuff);
 
-        you.attribute[ATTR_TRANSFORMATION] = TRAN_DRAGON;
+        you.attribute[ATTR_TRANSFORMATION] = which_trans; //TRAN_DRAGON;
         you.duration[DUR_TRANSFORMATION] = 20 + random2(pow) + random2(pow);
 
         if (you.duration[ DUR_TRANSFORMATION ] > 100)
             you.duration[ DUR_TRANSFORMATION ] = 100;
 
-        modify_stat( STAT_STRENGTH, 10, true,
+        modify_stat( STAT_STRENGTH, dragon_extra_stat(which_trans, STAT_STRENGTH), true,
                      "gaining the dragon transformation" );
-        extra_hp(16);   // must occur after attribute set
+        modify_stat( STAT_DEXTERITY, dragon_extra_stat(which_trans, STAT_DEXTERITY), true,
+                     "gaining the dragon transformation" );
+        extra_hp(dragon_extra_hp(which_trans));   // must occur after attribute set
 
-        you.symbol = 'D';
-        you.colour = GREEN;
+        you.symbol = _dragon_symbol(which_trans);
+        you.colour = _dragon_colour(which_trans);
 
         if (you.attribute[ATTR_HELD])
         {
@@ -723,11 +1062,27 @@
 
         break;
 
+    case TRAN_SWAMP_DRAKE:
+    case TRAN_STEAM_DRAGON:
+    case TRAN_MOTTLED_DRAGON:
+    case TRAN_WYVERN:
+    case TRAN_FIREDRAKE:
+    case TRAN_DEATH_DRAKE:
+    case TRAN_LINDWURM:
+    case TRAN_SWAMP_DRAGON:
     case TRAN_DRAGON:
+    case TRAN_ICE_DRAGON:
+    case TRAN_STORM_DRAGON:
+    case TRAN_QUICKSILVER_DRAGON:
+    case TRAN_SHADOW_DRAGON:
+    case TRAN_GOLDEN_DRAGON:
+    case TRAN_IRON_DRAGON:
         mpr( "Your transformation has ended.", MSGCH_DURATION );
-        modify_stat(STAT_STRENGTH, -10, true,
+        modify_stat(STAT_STRENGTH, -1 * dragon_extra_stat(old_form, STAT_STRENGTH), true,
+                    "losing the dragon transformation" );
+        modify_stat(STAT_DEXTERITY, -1 * dragon_extra_stat(old_form, STAT_DEXTERITY), true,
                     "losing the dragon transformation" );
-        hp_downscale = 16;
+        hp_downscale = dragon_extra_hp(old_form);
         break;
 
     case TRAN_LICH:
diff -urN source.orig/transfor.h source/transfor.h
--- source.orig/transfor.h	2008-08-01 02:00:58.000000000 +0300
+++ source/transfor.h	2008-09-15 15:32:18.000000000 +0300
@@ -26,7 +26,23 @@
     TRAN_BLADE_HANDS,
     TRAN_STATUE,
     TRAN_ICE_BEAST,
-    TRAN_DRAGON,                       //    5
+
+    TRAN_SWAMP_DRAKE,
+    TRAN_STEAM_DRAGON,
+    TRAN_MOTTLED_DRAGON,
+    TRAN_WYVERN,
+    TRAN_FIREDRAKE,
+    TRAN_DEATH_DRAKE,
+    TRAN_LINDWURM,
+    TRAN_SWAMP_DRAGON,
+    TRAN_DRAGON,
+    TRAN_ICE_DRAGON,
+    TRAN_STORM_DRAGON,
+    TRAN_QUICKSILVER_DRAGON,
+    TRAN_SHADOW_DRAGON,
+    TRAN_GOLDEN_DRAGON,
+    TRAN_IRON_DRAGON,
+
     TRAN_LICH,
     TRAN_SERPENT_OF_HELL,
     TRAN_AIR,
@@ -69,4 +85,11 @@
 
 bool transform_changed_physiology( bool phys_scales = false );
 
+
+const char* dragon_name(transformation_type which_tran);
+bool dragon_transformation(char which_tran);
+bool flying_dragon_transformation(char which_tran);
+
+int dragon_extra_hp(char which_tran);
+int dragon_extra_stat(char which_tran, stat_type which_stat);
 #endif

