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-07 17:24:52.000000000 +0300
@@ -321,6 +321,9 @@
     { ABIL_TORMENT_II, "Call Torment", 9, 0, 0, 3, ABFLAG_PAIN },
 
     { ABIL_RENOUNCE_RELIGION, "Renounce Religion", 0, 0, 0, 0, ABFLAG_NONE },
+
+    // Cooking
+    { ABIL_COOKING, "Cooking", 0, 0, 0, 0, ABFLAG_NONE },    
 };
 
 const struct ability_def & get_ability_def( ability_type abil )
@@ -782,6 +785,11 @@
         failure = 0;
         break;
 
+    case ABIL_COOKING:
+        failure = 0;
+        perfect = true;
+        break;
+
         // end invocations {dlb}
     default:
         failure = -1;
@@ -984,6 +992,7 @@
         case ABIL_DELAYED_FIREBALL:
         case ABIL_MUMMY_RESTORATION:
         case ABIL_TRAN_BAT:
+        case ABIL_COOKING:
             hungerCheck = false;
             break;
         default:
@@ -1910,6 +1919,13 @@
     case ABIL_NON_ABILITY:
         mpr("Sorry, you can't do that.");
         break;
+    case ABIL_COOKING:
+        if (!cooking())
+        {
+            crawl_state.zero_turns_taken();
+            return (false);
+        }
+        break;
     }
     return (true);
 }
@@ -2239,6 +2255,9 @@
         _add_talent(talents, ABIL_EVOKE_TELEPORTATION, check_confused );
     }
 
+    if (you.skills[SK_COOKING] > 0)
+        _add_talent(talents, ABIL_COOKING, check_confused );
+
     // Find hotkeys for the non-hotkeyed talents.
     for (unsigned int i = 0; i < talents.size(); ++i)
     {
diff -urN source.orig/COOKING.txt source/COOKING.txt
--- source.orig/COOKING.txt	1970-01-01 02:00:00.000000000 +0200
+++ source/COOKING.txt	2008-09-08 02:34:37.000000000 +0300
@@ -0,0 +1,39 @@
+Stone Soup Cooking patch
+
+ * Halflings and hunters start with cooking skill.
+ * By butchering corpses you can learn first level of cooking skill.
+   (like learning spellcasting by reading scrolls)
+   Further training requires use of cooking ability. It's available when
+   you get first cooking level.
+ * Cooked chunks do not rot as fast as raw chunks, but cooking takes
+   some time and result is not guaranteed.
+ * Even cooked rat can taste like gourmet meal if it's prepared by skilled
+   chef.
+ * Cooking stone soup is not supported.
+
+Skill aptitudes for cooking:
+  human          100
+  high elf        90
+  grey elf        90
+  deep elf        90
+  sludge elf     110
+  mountain dwarf 110
+  halfling        70
+  hill orc       150
+  mummy          140
+  naga           100
+  gnome          100
+  ogre           200
+  troll          200
+  ogre-mage      150
+  all draconians 100
+  centaur        100
+  demigod        110
+  spriggan       200
+  minotaur       150
+  demonspawn     110
+  ghoul          250
+  kenku          100
+  merfolk        100
+  vampire        140
+ 
diff -urN source.orig/debug.cc source/debug.cc
--- source.orig/debug.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/debug.cc	2008-09-08 02:04:44.000000000 +0300
@@ -208,7 +208,7 @@
     for (int i = 0; i < NUM_SKILLS; i++)
     {
         // Avoid the bad values.
-        if (i == SK_UNUSED_1 || (i > SK_UNARMED_COMBAT && i < SK_SPELLCASTING))
+        if (i == SK_UNUSED_1 || (i > SK_UNARMED_COMBAT && i < SK_COOKING))
             continue;
 
         char sk_name[80];
diff -urN source.orig/delay.cc source/delay.cc
--- source.orig/delay.cc	2008-08-01 02:00:57.000000000 +0300
+++ source/delay.cc	2008-09-08 01:38:21.000000000 +0300
@@ -27,6 +27,7 @@
 #include "itemprop.h"
 #include "item_use.h"
 #include "it_use2.h"
+#include "skills.h"
 #include "message.h"
 #include "misc.h"
 #include "monstuff.h"
@@ -412,6 +413,10 @@
         _pop_delay();
         break;
     }
+    case DELAY_COOKING:
+        mprf("You stop cooking.");
+        _pop_delay();
+        break;
     case DELAY_MEMORISE:
         // Losing work here is okay... having to start from
         // scratch is a reasonable behaviour. -- bwr
@@ -685,6 +690,12 @@
                 did_god_conduct(DID_DEDICATED_BUTCHERY, 10);
             }
             break;
+        case DELAY_COOKING:
+            if (!is_valid_item(you.inv[delay.parm1]))
+                break;
+            mprf(MSGCH_MULTITURN_ACTION, "You start cooking the %s.",
+                 you.inv[delay.parm1].name(DESC_PLAIN).c_str());
+            break;
         case DELAY_MEMORISE:
             mpr("You start memorising the spell.", MSGCH_MULTITURN_ACTION);
             break;
@@ -835,6 +846,34 @@
             delay.duration = 0;
         }
     }
+    else if (delay.type == DELAY_COOKING)
+    {
+        if (is_valid_item(you.inv[ delay.parm1 ])
+            && you.inv[ delay.parm1 ].base_type == OBJ_FOOD && you.inv[ delay.parm1 ].sub_type == FOOD_CHUNK)
+        {
+            if (food_is_rotten(you.inv[delay.parm1]))
+            {
+                // Only give the rotting message if the chunk wasn't
+                // previously rotten. (special < 100 is the rottenness check).
+                if (delay.parm2 >= 100)
+                    mpr("The chunk rots.", MSGCH_ROTTEN_MEAT);
+
+                delay.parm2 = 99; // Don't give the message twice.
+
+                mpr("You stop cooking this foul-smelling chunk!");
+                _pop_delay();
+                handle_delay();
+                return;
+            }
+
+            // Mark work done on the chunk in case we stop.
+            you.inv[ delay.parm1 ].plus2++;
+        }
+        else
+        {
+            delay.duration = 0;
+        }
+    }
     else if (delay.type == DELAY_MULTIDROP)
     {
         // Throw away invalid items; items usually go invalid because
@@ -897,6 +936,9 @@
             mprf(MSGCH_MULTITURN_ACTION, "You continue bottling blood from "
                                          "the corpse.");
             break;
+        case DELAY_COOKING:
+            mprf(MSGCH_MULTITURN_ACTION, "You continue cooking.");
+            break;
         case DELAY_MEMORISE:
             mpr("You continue memorising.", MSGCH_MULTITURN_ACTION);
             break;
@@ -1159,6 +1201,11 @@
                     mpr("You enjoyed that.");
                     you.berserk_penalty = 0;
                 }
+
+                if (you.skills[SK_COOKING] < 1)
+                {
+                    exercise( SK_COOKING, 1 + random2(3));
+                }
             }
 
             // Don't autopickup chunks/potions if there's still another
@@ -1208,6 +1255,68 @@
         }
         break;
     }
+
+    case DELAY_COOKING:
+    {
+        const item_def &item = you.inv[delay.parm1];
+        if (is_valid_item(item) && item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK)
+        {
+            bool success = true;
+
+            if ( x_chance_in_y(2, 2 + you.skills[SK_COOKING]))
+                success = false;
+
+            mprf("You finish cooking the %s%s.",
+                 you.inv[delay.parm1].name(DESC_PLAIN).c_str(),
+                 success ? "" : ", but result is anything but edible");
+
+            if (is_good_god(you.religion)
+                && is_player_same_species(item.plus))
+            {
+                simple_god_message(" really expects more respect for your departed "
+                                   "relatives.");
+                lose_piety(5); // already got warning when butchering
+            }
+            else if (you.religion == GOD_ZIN
+                     && mons_intel(item.plus) >= I_NORMAL)
+            {
+                simple_god_message(" really expects more respect for this departed "
+                                   "soul.");
+                lose_piety(5); // already got warning when butchering
+            }
+
+            if (you.species == SP_VAMPIRE
+                && mons_has_blood(item.plus) && !food_is_rotten(item)
+                // Don't give this message if more butchering to follow.
+                && (you.delay_queue.size() == 1
+                    || you.delay_queue[1].type != DELAY_COOKING))
+            {
+                mpr("What a waste!");
+            }
+            if (you.species == SP_GHOUL
+                && (you.delay_queue.size() == 1
+                    || you.delay_queue[1].type != DELAY_COOKING))
+            {
+                mpr("What a waste!");
+            }
+
+            if (success)
+                split_cooked_chunks( delay.parm1, you.inv[delay.parm1].quantity, false );
+            else
+                dec_inv_item_quantity(delay.parm1, you.inv[delay.parm1].quantity);
+
+            exercise( SK_COOKING, (success? 1 : 2) + random2(3));
+        }
+        else
+        {
+            mprf("You stop cooking the chunk.");
+            _pop_delay();
+            handle_delay();
+        }
+        StashTrack.update_stash(); // Stash-track the generated item(s).
+        break;
+    }
+
     case DELAY_DROP_ITEM:
         // Note:  checking if item is droppable is assumed to
         // be done before setting up this delay... this includes
@@ -1853,7 +1962,7 @@
     "not_delayed", "eat", "vampire_feed", "armour_on", "armour_off",
     "jewellery_on", "memorise", "butcher", "bottle_blood", "offer_corpse",
     "weapon_swap", "passwall", "drop_item", "multidrop", "ascending_stairs",
-    "descending_stairs", "recite", "run", "rest", "travel", "macro",
+    "descending_stairs", "cooking", "recite", "run", "rest", "travel", "macro",
     "interruptible", "uninterruptible"
 };
 
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-06 18:24:21.000000000 +0300
@@ -1700,7 +1700,7 @@
 
             if (item.base_type == OBJ_WANDS
                 || item.base_type == OBJ_MISSILES
-                || item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK)
+                || item.base_type == OBJ_FOOD && (item.sub_type == FOOD_CHUNK || item.sub_type == FOOD_CHUNK_COOKED ))
             {
                 // Get rid of newline at end of description, so that
                 // either the wand "no charges left" or the meat chunk
diff -urN source.orig/effects.cc source/effects.cc
--- source.orig/effects.cc	2008-08-01 02:00:52.000000000 +0300
+++ source/effects.cc	2008-09-06 19:57:26.000000000 +0300
@@ -2307,7 +2307,7 @@
         return (false);
     }
 
-    if (item.base_type == OBJ_FOOD && item.sub_type != FOOD_CHUNK)
+    if (item.base_type == OBJ_FOOD && item.sub_type != FOOD_CHUNK && item.sub_type != FOOD_CHUNK_COOKED)
         return (false);
 
     if (item.base_type == OBJ_POTIONS && !is_blood_potion(item))
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-06 23:11:21.000000000 +0300
@@ -67,7 +67,10 @@
     ABIL_EVOKE_MAPPING,                //   30
     ABIL_EVOKE_TELEPORTATION,
     ABIL_EVOKE_BLINK,                  //   32
-    // 33 - 50 unused
+
+    ABIL_COOKING,
+
+    // 34 - 50 unused
     ABIL_EVOKE_TURN_INVISIBLE = 51,    //   51
     ABIL_EVOKE_TURN_VISIBLE,
     ABIL_EVOKE_LEVITATE,
@@ -744,6 +747,8 @@
     DELAY_DESCENDING_STAIRS,
     DELAY_RECITE,  // Zin's Recite invocation
 
+    DELAY_COOKING,
+
     // [dshaligram] Shift-running, resting, travel and macros are now
     // also handled as delays.
     DELAY_RUN,
@@ -2350,7 +2355,7 @@
     // 21
     // 22
     // 23
-    // 24
+    SK_COOKING = 24,                   //   24
     SK_SPELLCASTING = 25,              //   25
     SK_CONJURATIONS,
     SK_ENCHANTMENTS,
diff -urN source.orig/food.cc source/food.cc
--- source.orig/food.cc	2008-08-01 02:00:55.000000000 +0300
+++ source/food.cc	2008-09-08 02:24:41.000000000 +0300
@@ -57,8 +57,8 @@
 #include "tutorial.h"
 #include "xom.h"
 
-static int  _determine_chunk_effect(int which_chunk_type, bool rotten_chunk);
-static void _eat_chunk( int chunk_effect, bool cannibal, int mon_intel = 0);
+static int  _determine_chunk_effect(int which_chunk_type, bool rotten_chunk, bool cooked = false);
+static void _eat_chunk( int chunk_effect, bool cannibal, int mon_intel = 0, bool cooked = false);
 static void _eating(unsigned char item_class, int item_type);
 static void _describe_food_change(int hunger_increment);
 static bool _food_change(bool suppress_message);
@@ -448,12 +448,39 @@
     return (true);
 }
 
+static bool _have_chunks_in_pack(bool remind)
+{
+    int num = 0;
+
+    for (int i = 0; i < ENDOFPACK; i++)
+    {
+        item_def &obj(you.inv[i]);
+
+        if (!is_valid_item( obj ))
+            continue;
+
+        if (obj.base_type != OBJ_FOOD || obj.sub_type != FOOD_CHUNK)
+            continue;
+
+        if (food_is_rotten(obj))
+        {
+            continue;
+        }
+
+        num++;
+    }
+
+    if (num == 0)
+        return (false);
+
+    return (true);
+}
 
 bool butchery(int which_corpse)
 {
     if (igrd(you.pos()) == NON_ITEM)
     {
-        if (!_have_corpses_in_pack(false))
+        if (!_have_chunks_in_pack(false))
             mpr("There isn't anything here!");
         return (false);
     }
@@ -880,6 +907,7 @@
                 continue;
             switch (item.sub_type)
             {
+            case FOOD_CHUNK_COOKED:
             case FOOD_CHUNK:
                 if (!player_mutation_level(MUT_HERBIVOROUS))
                     food_value += 2 * item.quantity;
@@ -1094,19 +1122,20 @@
         _vampire_consume_corpse(which_inventory_slot, true);
         return;
     }
-    else if (food.sub_type == FOOD_CHUNK)
+    else if (food.sub_type == FOOD_CHUNK || food.sub_type == FOOD_CHUNK_COOKED)
     {
         const int mons_type  = food.plus;
         const bool cannibal  = is_player_same_species(mons_type);
         const int intel      = mons_intel(mons_type) - I_ANIMAL;
         const int chunk_type = mons_corpse_effect( mons_type );
         const bool rotten    = food_is_rotten(food);
+        const bool cooked    = food.sub_type == FOOD_CHUNK_COOKED;
 
         if (rotten && !_player_can_eat_rotten_meat(true))
             return;
 
         _eat_chunk(_determine_chunk_effect(chunk_type, rotten), cannibal,
-                   intel);
+                   intel, cooked);
     }
     else
         _eating( food.base_type, food.sub_type );
@@ -1127,18 +1156,19 @@
 
         return;
     }
-    else if (food.sub_type == FOOD_CHUNK)
+    else if (food.sub_type == FOOD_CHUNK || food.sub_type == FOOD_CHUNK_COOKED)
     {
         const int chunk_type = mons_corpse_effect( food.plus );
         const int intel      = mons_intel( food.plus ) - I_ANIMAL;
         const bool cannibal  = is_player_same_species( food.plus );
         const bool rotten    = food_is_rotten(food);
+        const bool cooked    = food.sub_type == FOOD_CHUNK_COOKED;
 
         if (rotten && !_player_can_eat_rotten_meat(true))
             return;
 
         _eat_chunk(_determine_chunk_effect(chunk_type, rotten), cannibal,
-        intel);
+        intel, cooked);
     }
     else
         _eating( food.base_type, food.sub_type );
@@ -1273,7 +1303,7 @@
     return (0);
 }
 
-static const char *_chunk_flavour_phrase(bool likes_chunks)
+static const char *_chunk_flavour_phrase(bool likes_chunks, bool cooked = false)
 {
     const char *phrase =
         likes_chunks? "tastes great." : "tastes terrible.";
@@ -1281,16 +1311,20 @@
     if (!likes_chunks)
     {
         const int gourmand = you.duration[DUR_GOURMAND];
-        if (gourmand >= GOURMAND_MAX)
+        const int cooking_skill = cooked ? you.skills[SK_COOKING] : 0;
+        if (cooking_skill >= 27) {
+            phrase = "tastes absolutely perfect!";
+        }
+        else if (gourmand >= GOURMAND_MAX)
         {
             phrase = one_chance_in(1000) ? "tastes like chicken!"
                                          : "tastes great.";
         }
-        else if (gourmand > GOURMAND_MAX * 75 / 100)
+        else if ((gourmand > GOURMAND_MAX * 75 / 100) || cooking_skill > 17 )
             phrase = "tastes very good.";
-        else if (gourmand > GOURMAND_MAX * 50 / 100)
+        else if ((gourmand > GOURMAND_MAX * 50 / 100) || cooking_skill > 12 )
             phrase = "tastes good.";
-        else if (gourmand > GOURMAND_MAX * 25 / 100)
+        else if ((gourmand > GOURMAND_MAX * 25 / 100) || cooking_skill > 5 )
             phrase = "is not very appetising.";
     }
 
@@ -1316,7 +1350,7 @@
     return (nutrition);
 }
 
-static int _chunk_nutrition(bool likes_chunks)
+static int _chunk_nutrition(bool likes_chunks, bool cooked = false)
 {
     int nutrition = CHUNK_BASE_NUTRITION;
 
@@ -1340,22 +1374,31 @@
                 gourmand, nutrition, effective_nutrition, epercent);
 #endif
 
+    if (cooked)
+    {
+        int cooking_nutrition = nutrition * (you.skills[SK_COOKING] * 10)
+                                          / GOURMAND_MAX;
+
+        if (cooking_nutrition > effective_nutrition)
+            effective_nutrition = cooking_nutrition;
+    }
+
     return (_apply_herbivore_chunk_effects(effective_nutrition));
 }
 
-static void _say_chunk_flavour(bool likes_chunks)
+static void _say_chunk_flavour(bool likes_chunks, bool cooked = false)
 {
-    mprf("This raw flesh %s", _chunk_flavour_phrase(likes_chunks));
+    mprf("This %s flesh %s", cooked ? "cooked" : "raw", _chunk_flavour_phrase(likes_chunks, cooked));
 }
 
 // Never called directly - chunk_effect values must pass
 // through food::_determine_chunk_effect() first. {dlb}:
-static void _eat_chunk( int chunk_effect, bool cannibal, int mon_intel )
+static void _eat_chunk( int chunk_effect, bool cannibal, int mon_intel, bool cooked)
 {
 
     bool likes_chunks = (you.omnivorous() ||
                          player_mutation_level(MUT_CARNIVOROUS));
-    int nutrition     = _chunk_nutrition(likes_chunks);
+    int nutrition     = _chunk_nutrition(likes_chunks, cooked);
     int hp_amt        = 0;
     bool suppress_msg = false; // do we display the chunk nutrition message?
     bool do_eat       = false;
@@ -1419,16 +1462,20 @@
     {
         if (player_mutation_level(MUT_SAPROVOROUS) == 3)
         {
-            mpr("This raw flesh tastes good.");
+            if (cooked)
+                mpr("This cooked flesh tastes good.");
+            else
+                mpr("This raw flesh tastes good.");
 
-            if (you.species == SP_GHOUL)
+
+            if (you.species == SP_GHOUL && !cooked)
             {
                 _heal_from_food((!one_chance_in(5)? hp_amt : 0), 0,
                                 !one_chance_in(3), false);
             }
         }
         else
-            _say_chunk_flavour(likes_chunks);
+            _say_chunk_flavour(likes_chunks, cooked);
 
         do_eat = true;
         break;
@@ -1953,6 +2000,7 @@
         return 1;
 
     case FOOD_CHUNK:
+    case FOOD_CHUNK_COOKED:
     case FOOD_MEAT_RATION:
     case FOOD_SAUSAGE:
     case FOOD_BEEF_JERKY:
@@ -2209,7 +2257,7 @@
 // See if you can follow along here -- except for the amulet of the gourmand
 // addition (long missing and requested), what follows is an expansion of how
 // chunks were handled in the codebase up to this date ... {dlb}
-static int _determine_chunk_effect(int which_chunk_type, bool rotten_chunk)
+static int _determine_chunk_effect(int which_chunk_type, bool rotten_chunk, bool cooked)
 {
     int this_chunk_effect = which_chunk_type;
 
@@ -2292,8 +2340,9 @@
     // contaminated meat as though it were "clean" meat - level 3
     // saprovores get rotting meat effect from clean chunks, since they
     // love rotting meat.
-    if (wearing_amulet(AMU_THE_GOURMAND)
-        && x_chance_in_y(you.duration[DUR_GOURMAND], GOURMAND_MAX))
+    if ((wearing_amulet(AMU_THE_GOURMAND)
+          && x_chance_in_y(you.duration[DUR_GOURMAND], GOURMAND_MAX))
+        || (you.skills[SK_COOKING] > 5 && x_chance_in_y(you.skills[SK_COOKING]-5, 22)))
     {
         if (player_mutation_level(MUT_SAPROVOROUS) == 3)
         {
@@ -2401,3 +2450,60 @@
 
     return 0;
 }
+
+bool cooking(int which_chunk)
+{
+    int chunk = -1;
+
+    if (!_have_chunks_in_pack(false))
+    {
+        mpr("You don't have anyting to cook!");
+        return (false);
+    }
+
+    if (you.flight_mode() == FL_LEVITATE)
+    {
+        mpr("You can't reach the floor from up here.");
+        return (false);
+    }
+
+    if (you.duration[DUR_BERSERKER])
+    {
+        mpr("You are too berserk!");
+        return (false);
+    }
+
+
+    chunk = prompt_invent_item( "Cook which item?", MT_INVLIST,
+                                OBJ_FOOD, true, true, false );
+
+    if (chunk == PROMPT_ABORT || !is_valid_item(you.inv[chunk]))
+    {
+        canned_msg(MSG_OK);
+        return (false);
+    }
+    else if ( you.inv[chunk].base_type == OBJ_MISSILES && you.inv[chunk].sub_type == MI_STONE ) {
+        mpr("Trying to make stone soup?");
+        return (false);
+    }
+    else if ( you.inv[chunk].base_type == OBJ_CORPSES && you.inv[chunk].sub_type == CORPSE_BODY ) {
+        mpr("Too big. Try chopping it into pieces first.");
+        return (false);
+    }
+    else if ( you.inv[chunk].base_type == OBJ_FOOD && you.inv[chunk].sub_type == FOOD_CHUNK_COOKED ) {
+        mpr("It's already cooked!");
+        return (false);
+    }
+    else if ( you.inv[chunk].base_type != OBJ_FOOD || you.inv[chunk].sub_type != FOOD_CHUNK ) {
+        mpr("You can't cook that!");
+        return (false);
+    }
+
+    int work_req = 4 * you.inv[chunk].quantity;
+
+    start_delay(DELAY_COOKING, work_req, chunk, you.inv[chunk].special);
+
+    return (true);
+}
+
+
diff -urN source.orig/food.h source/food.h
--- source.orig/food.h	2008-08-01 02:01:03.000000000 +0300
+++ source/food.h	2008-09-07 15:59:49.000000000 +0300
@@ -38,6 +38,9 @@
     FOOD_CHEESE,
     FOOD_SAUSAGE,                      //   20
     FOOD_CHUNK,
+//
+    FOOD_CHUNK_COOKED,
+//
     NUM_FOODS                          //   22
 };
 
@@ -111,4 +114,5 @@
 int you_max_hunger();
 int you_min_hunger();
 
+bool cooking(int which_chunk = -1);
 #endif
diff -urN source.orig/initfile.cc source/initfile.cc
--- source.orig/initfile.cc	2008-08-01 02:00:59.000000000 +0300
+++ source/initfile.cc	2008-09-07 17:57:11.000000000 +0300
@@ -491,6 +491,7 @@
         "interrupt_memorise = interrupt_armour_on, stat",
         "interrupt_butcher = interrupt_armour_on, teleport, stat",
         "interrupt_bottle_blood = interrupt_butcher",
+        "interrupt_cooking = interrupt_butcher",
         "interrupt_offer_corpse = interrupt_butcher, hungry",
         "interrupt_vampire_feed = interrupt_butcher",
         "interrupt_passwall = interrupt_butcher",
diff -urN source.orig/invent.cc source/invent.cc
--- source.orig/invent.cc	2008-08-01 02:01:01.000000000 +0300
+++ source/invent.cc	2008-09-07 03:24:30.000000000 +0300
@@ -157,7 +157,7 @@
 // 0 for non-chunks, and values > 0 for rotten chunks for non-Saprovores
 const int InvEntry::item_freshness() const
 {
-    if (item->base_type != OBJ_FOOD || item->sub_type != FOOD_CHUNK)
+    if (item->base_type != OBJ_FOOD || (item->sub_type != FOOD_CHUNK && item->sub_type != FOOD_CHUNK_COOKED))
         return 0;
 
     int freshness = item->special;
diff -urN source.orig/itemname.cc source/itemname.cc
--- source.orig/itemname.cc	2008-08-01 02:01:01.000000000 +0300
+++ source/itemname.cc	2008-09-07 02:53:17.000000000 +0300
@@ -1369,6 +1369,19 @@
             else
                 buff << "chunk of flesh";
             break;
+        case FOOD_CHUNK_COOKED:
+            if (!basename && !dbname)
+            {
+                if (food_is_rotten(*this))
+                    buff << "rotting ";
+
+                buff << "chunk of cooked "
+                     << mons_type_name(it_plus, DESC_PLAIN)
+                     << " flesh";
+            }
+            else
+                buff << "chunk of cooked flesh";
+            break;
         }
 
         break;
@@ -2587,7 +2600,7 @@
         }
         // intentional fall-through
     case OBJ_FOOD:
-        if ((item.base_type == OBJ_CORPSES || item.sub_type == FOOD_CHUNK)
+        if ((item.base_type == OBJ_CORPSES || item.sub_type == FOOD_CHUNK|| item.sub_type == FOOD_CHUNK_COOKED)
             && (is_good_god(you.religion) && is_player_same_species(item.plus)
                 || you.religion == GOD_ZIN
                    && mons_intel(item.plus) >= I_NORMAL))
diff -urN source.orig/itemprop.cc source/itemprop.cc
--- source.orig/itemprop.cc	2008-08-01 02:00:48.000000000 +0300
+++ source/itemprop.cc	2008-09-06 18:37:43.000000000 +0300
@@ -406,6 +406,7 @@
     { FOOD_MEAT_RATION,  "meat ration",  5000,   500, -1500,  80, 4 },
     { FOOD_SAUSAGE,      "sausage",      1500,   150,  -400,  40, 1 },
     { FOOD_CHUNK,        "chunk",        1000,   100,  -500, 100, 3 },
+    { FOOD_CHUNK_COOKED, "cooked chunk", 1000,   100,  -500, 100, 3 },
     { FOOD_BEEF_JERKY,   "beef jerky",    800,   100,  -250,  20, 1 },
 
     { FOOD_BREAD_RATION, "bread ration", 4400, -1500,   750,  80, 4 },
@@ -437,7 +438,7 @@
     COMPILE_CHECK(NUM_ARMOURS  == 37, c1);
     COMPILE_CHECK(NUM_WEAPONS  == 55, c2);
     COMPILE_CHECK(NUM_MISSILES ==  9, c3);
-    COMPILE_CHECK(NUM_FOODS    == 22, c4);
+    COMPILE_CHECK(NUM_FOODS    == 23, c4);
 
     int i;
 
@@ -2201,7 +2202,7 @@
     return (item.special < 100) && (item.base_type == OBJ_CORPSES
                                        && item.sub_type == CORPSE_BODY
                                     || item.base_type == OBJ_FOOD
-                                       && item.sub_type == FOOD_CHUNK);
+                                       && (item.sub_type == FOOD_CHUNK || item.sub_type == FOOD_CHUNK_COOKED));
 }
 
 // Returns true if item counts as a tool for tool size comparisons and msgs.
diff -urN source.orig/items.cc source/items.cc
--- source.orig/items.cc	2008-08-01 02:00:57.000000000 +0300
+++ source/items.cc	2008-09-07 15:37:58.000000000 +0300
@@ -1039,7 +1039,7 @@
             && (!is_stackable_item(item) || is_rune(item))
             && item.quantity == 1
             && item.base_type != OBJ_CORPSES
-            && (item.base_type != OBJ_FOOD || item.sub_type != FOOD_CHUNK));
+            && (item.base_type != OBJ_FOOD || (item.sub_type != FOOD_CHUNK && item.sub_type != FOOD_CHUNK_COOKED)));
 }
 
 static std::string _article_it(const item_def &item)
@@ -1253,7 +1253,7 @@
         return (false);
 
     if (item.base_type == OBJ_MISSILES
-        || (item.base_type == OBJ_FOOD && item.sub_type != FOOD_CHUNK)
+        || (item.base_type == OBJ_FOOD && item.sub_type != FOOD_CHUNK && item.sub_type != FOOD_CHUNK_COOKED)
         || item.base_type == OBJ_SCROLLS
         || item.base_type == OBJ_POTIONS
         || item.base_type == OBJ_UNKNOWN_II
@@ -1669,7 +1669,7 @@
     // Explode the stack when dropped. We have to special case chunks, ew.
     else if (mitm[*obj].quantity > 1
              && (mitm[*obj].base_type != OBJ_FOOD
-                 || mitm[*obj].sub_type != FOOD_CHUNK))
+                 || (mitm[*obj].sub_type != FOOD_CHUNK && mitm[*obj].sub_type != FOOD_CHUNK_COOKED)))
     {
         while (mitm[*obj].quantity > 1)
         {
diff -urN source.orig/makeitem.cc source/makeitem.cc
--- source.orig/makeitem.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/makeitem.cc	2008-09-06 18:22:14.000000000 +0300
@@ -576,6 +576,7 @@
         case FOOD_GRAPE:
             item.colour = (coinflip() ? MAGENTA : GREEN);
             break;
+        case FOOD_CHUNK_COOKED:
         case FOOD_CHUNK:
             // set the appropriate colour of the meat:
             temp_value = mons_class_colour( item.plus );
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-08 01:54:14.000000000 +0300
@@ -2760,3 +2760,72 @@
 
     return (retval);
 }
+
+void split_cooked_chunks( int obj, int amount, bool need_msg )
+{
+    ASSERT(obj != -1);
+    item_def &chunk = you.inv[obj];
+
+    ASSERT(is_valid_item(chunk));
+    ASSERT(chunk.base_type == OBJ_FOOD);
+    ASSERT(chunk.sub_type == FOOD_CHUNK);
+    ASSERT(amount > 0);
+    ASSERT(amount <= chunk.quantity);
+
+    // Output message.
+    if (need_msg) {
+        //_potion_stack_changed_message(potion, amount, false);
+    }
+
+    if (you.equip[EQ_WEAPON] == obj)
+        you.wield_change = true;
+    you.redraw_quiver = true;
+
+
+    if (amount == chunk.quantity)
+    {
+        you.inv[obj].sub_type = FOOD_CHUNK_COOKED;
+        you.inv[obj].special = 1000 + random2avg((3 + you.skills[SK_COOKING]) * 100, 2);
+        return;
+    }
+
+    int freeslot = find_free_slot(you.inv[obj]);
+    if (freeslot >= 0 && freeslot < ENDOFPACK
+        && !is_valid_item(you.inv[freeslot]))
+    {
+        item_def &item   = you.inv[freeslot];
+        item.link        = freeslot;
+        item.slot        = index_to_letter(item.link);
+        item.base_type   = OBJ_FOOD;
+        item.sub_type    = FOOD_CHUNK_COOKED;
+        item.quantity    = amount;
+        item.x           = -1;
+        item.y           = -1;
+        item.plus        = chunk.plus;
+        item.plus2       = 0;
+        item.special     = 1000 + random2avg((3 + you.skills[SK_COOKING]) * 100, 2);
+        item.flags       = 0;
+        item.colour      = chunk.colour;
+        item.inscription = "";
+
+        you.inv[obj].quantity -= amount;
+        return;
+    }
+
+    if (!grid_destroys_items(grd[you.x_pos][you.y_pos]))
+    {
+        item_def chunk2;
+        chunk2.base_type = OBJ_FOOD;
+        chunk2.sub_type  = FOOD_CHUNK_COOKED;
+        chunk2.plus      = chunk.plus;
+        chunk2.quantity  = amount;
+        chunk2.colour    = chunk.colour;
+        chunk2.plus2     = 0;
+        chunk2.flags     = 0;
+        chunk2.special   = chunk.special;
+
+        copy_item_to_grid( chunk2, you.x_pos, you.y_pos );
+   }
+
+   dec_inv_item_quantity(obj, amount);
+}
diff -urN source.orig/misc.h source/misc.h
--- source.orig/misc.h	2008-08-01 02:00:56.000000000 +0300
+++ source/misc.h	2008-09-08 01:54:30.000000000 +0300
@@ -73,6 +73,7 @@
 bool can_bottle_blood_from_corpse( int mons_type );
 void turn_corpse_into_blood_potions ( item_def &item );
 void split_potions_into_decay( int obj, int amount, bool need_msg = true );
+void split_cooked_chunks( int obj, int amount, bool need_msg = false );
 
 bool victim_can_bleed(int montype);
 void bleed_onto_floor(int x, int y, int mon, int damage, bool spatter = false);
diff -urN source.orig/newgame.cc source/newgame.cc
--- source.orig/newgame.cc	2008-08-01 02:01:02.000000000 +0300
+++ source/newgame.cc	2008-09-06 21:08:42.000000000 +0300
@@ -5317,6 +5317,9 @@
             you.skills[range_skill(you.inv[1])] = 4;
         else
             you.skills[SK_THROWING] = 4;
+
+        if (!you.is_undead)
+            you.skills[SK_COOKING] = 2;
         break;
 
     case JOB_WANDERER:
@@ -5331,6 +5334,11 @@
     if (you.species == SP_VAMPIRE && you.skills[SK_UNARMED_COMBAT] < 2)
         you.skills[SK_UNARMED_COMBAT] = 2;
 
+    // Halflings always start with cooking skill.
+    if (you.species == SP_HALFLING && you.skills[SK_COOKING] < 2)
+        you.skills[SK_COOKING] = 2;
+
+
     if (weap_skill)
     {
         if (you.equip[EQ_WEAPON] == -1)
diff -urN source.orig/shopping.cc source/shopping.cc
--- source.orig/shopping.cc	2008-08-01 02:00:50.000000000 +0300
+++ source/shopping.cc	2008-09-06 18:56:50.000000000 +0300
@@ -1226,6 +1226,7 @@
             valued = 8;
             break;
 
+        case FOOD_CHUNK_COOKED:
         case FOOD_CHUNK:
             if (food_is_rotten(item))
                 break;
diff -urN source.orig/skills2.cc source/skills2.cc
--- source.orig/skills2.cc	2008-08-01 02:00:58.000000000 +0300
+++ source/skills2.cc	2008-09-08 00:11:35.000000000 +0300
@@ -112,7 +112,10 @@
     {NULL},   // 21- empty
     {NULL},   // 22- empty
     {NULL},   // 23- empty
-    {NULL},   // 24- empty
+
+    // Cooking titles from wikipedia: http://en.wikipedia.org/wiki/Chef
+    {"Cooking",        "Commis",        "Chef de Partie",  "Expediter",       "Sous chef",     "Chef de Cuisine"},           // 24
+
 
     {"Spellcasting",   "Magician",      "Thaumaturge",     "Eclecticist",     "Sorcerer",       "Archmage"},           // 25
     {"Conjurations",   "Ruinous",       "Conjurer",        "Destroyer",       "Devastator",     "Annihilator"},
@@ -185,7 +188,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      100,                       // SK_ENCHANTMENTS
@@ -228,7 +231,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     90,                        // cooking
      (70 * 130) / 100,          // SK_SPELLCASTING
      90,                        // SK_CONJURATIONS
      70,                        // SK_ENCHANTMENTS
@@ -271,7 +274,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     90,                        // cooking
      (60 * 130) / 100,          // SK_SPELLCASTING
      90,                        // SK_CONJURATIONS
      50,                        // SK_ENCHANTMENTS
@@ -314,7 +317,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     90,                        // cooking
      (55 * 130) / 100,          // SK_SPELLCASTING
      80,                        // SK_CONJURATIONS
      50,                        // SK_ENCHANTMENTS
@@ -357,7 +360,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     110,                       // cooking
      (70 * 130) / 100,          // SK_SPELLCASTING
      130,                       // SK_CONJURATIONS
      130,                       // SK_ENCHANTMENTS
@@ -400,7 +403,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     110,                       // cooking
      (160 * 130) / 100,         // SK_SPELLCASTING
      120,                       // SK_CONJURATIONS
      150,                       // SK_ENCHANTMENTS
@@ -443,7 +446,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+      70,                       // cooking
      (130 * 130) / 100,         // SK_SPELLCASTING
      130,                       // SK_CONJURATIONS
      100,                       // SK_ENCHANTMENTS
@@ -486,7 +489,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     150,                       // cooking
      (150 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -529,7 +532,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     160,                       // cooking
      (110 * 130) / 100,         // SK_SPELLCASTING
      110,                       // SK_CONJURATIONS
      110,                       // SK_ENCHANTMENTS
@@ -572,7 +575,7 @@
      140,                       // undefined
      140,                       // undefined
      140,                       // undefined
-     140,                       // undefined
+     140,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      140,                       // SK_CONJURATIONS
      140,                       // SK_ENCHANTMENTS
@@ -615,7 +618,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      100,                       // SK_ENCHANTMENTS
@@ -658,7 +661,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (120 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      100,                       // SK_ENCHANTMENTS
@@ -701,7 +704,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     200,                       // cooking
      (220 * 130) / 100,         // SK_SPELLCASTING
      180,                       // SK_CONJURATIONS
      220,                       // SK_ENCHANTMENTS
@@ -744,7 +747,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     200,                       // cooking
      (200 * 130) / 100,         // SK_SPELLCASTING
      160,                       // SK_CONJURATIONS
      200,                       // SK_ENCHANTMENTS
@@ -787,7 +790,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     150,                       // cooking
      (70 * 130) / 100,          // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      80,                        // SK_ENCHANTMENTS
@@ -830,7 +833,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -873,7 +876,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -916,7 +919,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -959,7 +962,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1002,7 +1005,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1045,7 +1048,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1088,7 +1091,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (70 * 130) / 100,          // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      90,                        // SK_ENCHANTMENTS
@@ -1131,7 +1134,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1174,7 +1177,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1217,7 +1220,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      120,                       // SK_ENCHANTMENTS
@@ -1260,7 +1263,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (140 * 130) / 100,         // SK_SPELLCASTING
      120,                       // SK_CONJURATIONS
      110,                       // SK_ENCHANTMENTS
@@ -1303,7 +1306,7 @@
      110,                       // undefined
      110,                       // undefined
      110,                       // undefined
-     110,                       // undefined
+     110,                       // cooking
      (110 * 130) / 100,         // SK_SPELLCASTING
      110,                       // SK_CONJURATIONS
      110,                       // SK_ENCHANTMENTS
@@ -1346,7 +1349,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     200,                       // cooking
      (60 * 130) / 100,          // SK_SPELLCASTING
      160,                       // SK_CONJURATIONS
      50,                        // SK_ENCHANTMENTS
@@ -1389,7 +1392,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     150,                       // cooking
      (180 * 130) / 100,         // SK_SPELLCASTING
      170,                       // SK_CONJURATIONS
      170,                       // SK_ENCHANTMENTS
@@ -1432,7 +1435,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     110,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      100,                       // SK_CONJURATIONS
      110,                       // SK_ENCHANTMENTS
@@ -1475,7 +1478,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     250,                       // cooking
      (120 * 130) / 100,         // SK_SPELLCASTING
      130,                       // SK_CONJURATIONS
      130,                       // SK_ENCHANTMENTS
@@ -1518,7 +1521,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      60,                        // SK_CONJURATIONS
      160,                       // SK_ENCHANTMENTS
@@ -1561,7 +1564,7 @@
      100,                       // undefined
      100,                       // undefined
      100,                       // undefined
-     100,                       // undefined
+     100,                       // cooking
      (100 * 130) / 100,         // SK_SPELLCASTING
      140,                       // SK_CONJURATIONS
      90,                        // SK_ENCHANTMENTS
@@ -1604,7 +1607,7 @@
      140,                       // undefined
      140,                       // undefined
      140,                       // undefined
-     140,                       // undefined
+     140,                       // cooking
      (100 * 130)/100,           // SK_SPELLCASTING
      160,                       // SK_CONJURATIONS
       90,                       // SK_ENCHANTMENTS
@@ -1724,7 +1727,7 @@
 
     SK_BLANK_LINE,
 
-    SK_INVOCATIONS, SK_EVOCATIONS,
+    SK_INVOCATIONS, SK_EVOCATIONS, SK_COOKING,
 };
 
 static const int ndisplayed_skills =
diff -urN source.orig/stash.cc source/stash.cc
--- source.orig/stash.cc	2008-08-01 02:00:59.000000000 +0300
+++ source/stash.cc	2008-09-06 18:59:39.000000000 +0300
@@ -172,7 +172,9 @@
             || (a.base_type == b.base_type
                 && (a.base_type == OBJ_CORPSES
                     || (a.base_type == OBJ_FOOD && a.sub_type == FOOD_CHUNK
-                        && b.sub_type == FOOD_CHUNK))
+                        && b.sub_type == FOOD_CHUNK)
+                    || (a.base_type == OBJ_FOOD && a.sub_type == FOOD_CHUNK_COOKED
+                        && b.sub_type == FOOD_CHUNK_COOKED))
                 && a.plus == b.plus));
 }
 
@@ -367,7 +369,7 @@
 static bool _is_rottable(const item_def &item)
 {
     return (item.base_type == OBJ_CORPSES
-            || (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK));
+            || (item.base_type == OBJ_FOOD && (item.sub_type == FOOD_CHUNK || item.sub_type == FOOD_CHUNK_COOKED)));
 }
 
 static short _min_rot(const item_def &item)
diff -urN source.orig/tile1.cc source/tile1.cc
--- source.orig/tile1.cc	2008-08-01 02:00:52.000000000 +0300
+++ source/tile1.cc	2008-09-06 18:57:15.000000000 +0300
@@ -1365,6 +1365,7 @@
     case FOOD_CHEESE:       return TILE_FOOD_CHEESE;
     case FOOD_SAUSAGE:      return TILE_FOOD_SAUSAGE;
 
+    case FOOD_CHUNK_COOKED:
     case FOOD_CHUNK:
         if (food_is_rotten(item))
             return TILE_FOOD_CHUNK_ROTTEN;

