diff --git a/src/land.c b/src/land.c
index f52fd67..5123bf9 100644
--- a/src/land.c
+++ b/src/land.c
@@ -61,6 +61,7 @@ static unsigned int land_visited = 0;
 
 /* Land variables. */
 int landed = 0;
+static unsigned int land_wid = 0; /**< Land window ID. */
 Planet* land_planet = NULL;
 static glTexture* gfx_exterior = NULL;
 
@@ -71,101 +72,90 @@ static int mission_ncomputer = 0;
 /* Player stuff. */
 extern int hyperspace_target;
 
-/* Window stuff. */
-static int land_wid = 0; /* Primary land window. */
-/* For the second opened land window */
-static int secondary_wid = 0;
-static int terciary_wid = 0; /* For fancy things like news, your ship etc.. */
-
 /* Commodity excahnge. */
 static void commodity_exchange_open(void);
-static void commodity_exchange_close(char* str);
-static void commodity_update(char* str);
-static void commodity_buy(char* str);
-static void commodity_sell(char* str);
+static void commodity_update(unsigned int wid, char* str);
+static void commodity_buy(unsigned int wid, char* str);
+static void commodity_sell(unsigned int wid, char* str);
 /* Outfits. */
 static void outfits_open(void);
-static void outfits_close(char* str);
-static void outfits_update(char* str);
+static void outfits_update(unsigned int wid, char* str);
 static int  outfit_canBuy(Outfit* outfit, int q, int errmsg);
-static void outfits_buy(char* str);
+static void outfits_buy(unsigned int wid, char* str);
 static int  outfit_canSell(Outfit* outfit, int q, int errmsg);
-static void outfits_sell(char* str);
+static void outfits_sell(unsigned int wid, char* str);
 static int  outfits_getMod(void);
 static void outfits_renderMod(double bx, double by, double w, double h);
 /* Shipyard. */
 static void shipyard_open(void);
-static void shipyard_close(char* str);
-static void shipyard_update(char* str);
-static void shipyard_info(char* str);
-static void shipyard_buy(char* str);
+static void shipyard_update(unsigned int wid, char* str);
+static void shipyard_info(unsigned int wid, char* str);
+static void shipyard_buy(unsigned int wid, char* str);
 /* Your ship. */
-static void shipyard_yours_open(char* str);
-static void shipyard_yours_close(char* str);
-static void shipyard_yoursUpdate(char* str);
-static void shipyard_yoursChange(char* str);
-static void shipyard_yoursSell(char* str);
-static void shipyard_yoursTransport(char* str);
+static void shipyard_yours_open(unsigned int wid, char* str);
+static void shipyard_yoursUpdate(unsigned int wid, char* str);
+static void shipyard_yoursChange(unsigned int wid, char* str);
+static void shipyard_yoursSell(unsigned int wid, char* str);
+static void shipyard_yoursTransport(unsigned int wid, char* str);
 static int  shipyard_yoursTransportPrice(char* shipname);
 /* Spaceport bar. */
 static void spaceport_bar_open(void);
-static void spaceport_bar_close(char* str);
 /* News. */
-static void news_open(void);
-static void news_close(char* str);
+static void news_open(unsigned int parent, char* str);
 /* Mission computer. */
 static void misn_open(void);
-static void misn_close(char* str);
-static void misn_accept(char* str);
-static void misn_genList(int first);
-static void misn_update(char* str);
+static void misn_accept(unsigned int wid, char* str);
+static void misn_genList(unsigned int wid, int first);
+static void misn_update(unsigned int wid, char* str);
 /* Refuel. */
 static int refuel_price(void);
-static void spaceport_refuel(char* str);
+static void spaceport_refuel(unsigned int wid, char* str);
 
 /* The local market. */
 static void commodity_exchange_open(void) {
   int i;
   char** goods;
-  secondary_wid = window_create("Commodity Exchange", -1, -1,
+  unsigned int wid;
+
+  wid = window_create("Commodity Exchange", -1, -1,
                                 COMMODITY_WIDTH, COMMODITY_HEIGHT);
 
-  window_addButton(secondary_wid, -20, 20,
+  window_addButton(wid, -20, 20,
                    BUTTON_WIDTH, BUTTON_HEIGHT, "btnCommodityClose",
                    "Close", commodity_exchange_close);
 
-  window_addButton(secondary_wid, -40-((BUTTON_WIDTH-20)/2), 20*2+BUTTON_HEIGHT,
+  window_addButton(wid, -40-((BUTTON_WIDTH-20)/2), 20*2+BUTTON_HEIGHT,
                    (BUTTON_WIDTH-20)/2, BUTTON_HEIGHT, "btnCommodityBuy",
                    "Buy", commodity_buy);
 
-  window_addButton(secondary_wid, -20, 20*2+BUTTON_HEIGHT,
+  window_addButton(wid, -20, 20*2+BUTTON_HEIGHT,
                    (BUTTON_WIDTH-20)/2, BUTTON_HEIGHT, "btnCommoditySell",
                    "Sell", commodity_sell);
 
-  window_addText(secondary_wid, -20, -40, BUTTON_WIDTH, 60, 0,
+  window_addText(wid, -20, -40, BUTTON_WIDTH, 60, 0,
                  "txtSInfo", &gl_smallFont, &cDConsole,
                  "You have:\n"
                  "Market price:\n"
                  "\n"
                  "Free Space:\n");
 
-  window_addText(secondary_wid, -20, -40, BUTTON_WIDTH/2, 60, 0,
+  window_addText(wid, -20, -40, BUTTON_WIDTH/2, 60, 0,
                  "txtDInfo", &gl_smallFont, &cBlack, NULL);
 
-  window_addText(secondary_wid, -40, -120, BUTTON_WIDTH-20,
+  window_addText(wid, -40, -120, BUTTON_WIDTH-20,
                  BUTTON_WIDTH, 0, "txtDesc", &gl_smallFont, &cBlack, NULL);
 
   goods = malloc(sizeof(char*)*land_planet->ncommodities);
   for(i = 0; i < land_planet->ncommodities; i++)
     goods[i] = strdup(land_planet->commodities[i]->name);
 
-  window_addList(secondary_wid, 20, -40,
+  window_addList(wid, 20, -40,
                  COMMODITY_WIDTH-BUTTON_WIDTH-60,
                  COMMODITY_HEIGHT-80-BUTTON_HEIGHT, "lstGoods",
                  goods, land_planet->ncommodities, 0, commodity_update);
 
   /* Update. */
-  commodity_update(NULL);
+  commodity_update(wid, NULL);
 
   /* Check commodity exchange missions. */
   if(!has_visited(VISITED_COMMODITY)) {
@@ -175,19 +165,13 @@ static void commodity_exchange_open(void) {
   }
 }
 
-static void commodity_exchange_close(char* str) {
-  if(strcmp(str, "btnCommodityClose")==0)
-    window_destroy(secondary_wid);
-  secondary_wid = 0;
-}
-
-static void commodity_update(char* str) {
+static void commodity_update(unsigned int wid, char* str) {
   (void)str;
   char buf[128];
   char* comname;
   Commodity* com;
 
-  comname = toolkit_getList(secondary_wid, "lstGoods");
+  comname = toolkit_getList(wid, "lstGoods");
   com = commodity_get(comname);
 
   snprintf(buf, 128,
@@ -199,11 +183,11 @@ static void commodity_update(char* str) {
       com->medium,
       pilot_cargoFree(player));
 
-  window_modifyText(secondary_wid, "txtDInfo", buf);
-  window_modifyText(secondary_wid, "txtDesc", com->description);
+  window_modifyText(wid, "txtDInfo", buf);
+  window_modifyText(wid, "txtDesc", com->description);
 }
 
-static void commodity_buy(char* str) {
+static void commodity_buy(unsigned int wid, char* str) {
   (void)str;
   char* comname;
   Commodity* com;
@@ -211,7 +195,7 @@ static void commodity_buy(char* str) {
 
   q = 10;
 
-  comname = toolkit_getList(secondary_wid, "lstGoods");
+  comname = toolkit_getList(wid, "lstGoods");
   com = commodity_get(comname);
 
   if(player->credits <= q * com->medium) {
@@ -225,22 +209,22 @@ static void commodity_buy(char* str) {
 
   q = pilot_addCargo(player, com, q);
   player->credits -= q * com->medium;
-  commodity_update(NULL);
+  commodity_update(wid, NULL);
 }
 
-static void commodity_sell(char* str) {
+static void commodity_sell(unsigned int wid, char* str) {
   (void)str;
   char* comname;
   Commodity* com;
   int q;
 
   q = 10;
-  comname = toolkit_getList(secondary_wid, "lstGoods");
+  comname = toolkit_getList(wid, "lstGoods");
   com = commodity_get(comname);
 
   q = pilot_rmCargo(player, com, q);
   player->credits += q * com->medium;
-  commodity_update(NULL);
+  commodity_update(wid, NULL);
 }
 
 static void outfits_open(void) {
@@ -250,38 +234,39 @@ static void outfits_open(void) {
   glTexture** toutfits;
   int noutfits;
   char buf[128];
+  unsigned int wid;
 
   /* Create window. */
   snprintf(buf, 128, "%s - Outfits", land_planet->name);
-  secondary_wid = window_create(buf, -1, -1,
-                                OUTFITS_WIDTH, OUTFITS_HEIGHT);
+  wid = window_create(buf, -1, -1,
+                     OUTFITS_WIDTH, OUTFITS_HEIGHT);
 
   /* Will allow buying from keyboard. */
-  window_setAccept(secondary_wid, outfits_buy);
+  window_setAccept(wid, outfits_buy);
 
   /* Buttons. */
-  window_addButton(secondary_wid, -20, 20,
+  window_addButton(wid, -20, 20,
                    BUTTON_WIDTH, BUTTON_HEIGHT, "btnCloseOutfits",
                    "Close", outfits_close);
 
-  window_addButton(secondary_wid, -40-BUTTON_WIDTH, 40+BUTTON_HEIGHT,
+  window_addButton(wid, -40-BUTTON_WIDTH, 40+BUTTON_HEIGHT,
                    BUTTON_WIDTH, BUTTON_HEIGHT, "btnBuyOutfit",
                    "Buy", outfits_buy);
 
-  window_addButton(secondary_wid, -40-BUTTON_WIDTH, 20,
+  window_addButton(wid, -40-BUTTON_WIDTH, 20,
                    BUTTON_WIDTH, BUTTON_HEIGHT, "btnSellOutfit",
                    "Sell", outfits_sell);
 
   /* Fancy 128x128 image. */
-  window_addRect(secondary_wid, -20, -50, 128, 128, "rctImage", &cBlack, 0);
-  window_addImage(secondary_wid, -20-128, -50-128, "imgOutfit", NULL, 1);
+  window_addRect(wid, -20, -50, 128, 128, "rctImage", &cBlack, 0);
+  window_addImage(wid, -20-128, -50-128, "imgOutfit", NULL, 1);
 
-  window_addCust(secondary_wid, -40-BUTTON_WIDTH, 60+2*BUTTON_HEIGHT,
+  window_addCust(wid, -40-BUTTON_WIDTH, 60+2*BUTTON_HEIGHT,
                  BUTTON_WIDTH, BUTTON_HEIGHT,
                  "cstMod", 0, outfits_renderMod, NULL);
 
   /* The descriptive text. */
-  window_addText(secondary_wid, 40+300+20, -60,
+  window_addText(wid, 40+300+20, -60,
                  80, 96, 0, "txtSDesc", &gl_smallFont, &cDConsole,
                  "Name:\n"
                  "Type:\n"
@@ -293,10 +278,10 @@ static void outfits_open(void) {
                  "Price:\n"
                  "Money:\n");
 
-  window_addText(secondary_wid, 40+300+40+60, -60,
+  window_addText(wid, 40+300+40+60, -60,
                  250, 96, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL);
 
-  window_addText(secondary_wid, 20+300+40, -220,
+  window_addText(wid, 20+300+40, -220,
                  OUTFITS_WIDTH-400, 180, 0, "txtDescription",
                  &gl_smallFont, NULL, NULL);
 
@@ -320,12 +305,12 @@ static void outfits_open(void) {
     free(outfits);
   }
   
-  window_addImageArray(secondary_wid, 20, 40,
+  window_addImageArray(wid, 20, 40,
       310, OUTFITS_HEIGHT-80, "iarOutfits", 64, 64,
       toutfits, soutfits, noutfits, outfits_update);
 
   /* Write the outfits stuff. */
-  outfits_update(NULL);
+  outfits_update(wid, NULL);
 
   if(!has_visited(VISITED_OUTFITS)) {
     /* @todo mission check. */
@@ -333,23 +318,17 @@ static void outfits_open(void) {
   }
 }
 
-static void outfits_close(char* str) {
-  if(strcmp(str, "btnCloseOutfits")==0)
-    window_destroy(secondary_wid);
-  secondary_wid = 0;
-}
-
-static void outfits_update(char* str) {
+static void outfits_update(unsigned int wid, char* str) {
   (void)str;
   char* outfitname;
   Outfit* outfit;
   char buf[128], buf2[16], buf3[16];
 
-  outfitname = toolkit_getList(secondary_wid, "iarOutfits");
+  outfitname = toolkit_getList(wid, "iarOutfits");
   if(strcmp(outfitname, "None")==0) { /* No outfits. */
-    window_modifyImage(secondary_wid, "imgOutfit", NULL);
-    window_disableButton(secondary_wid, "btnBuyOutfit");
-    window_disableButton(secondary_wid, "btnSellOutfit");
+    window_modifyImage(wid, "imgOutfit", NULL);
+    window_disableButton(wid, "btnBuyOutfit");
+    window_disableButton(wid, "btnSellOutfit");
     snprintf(buf, 128,
         "None\n"
         "NA\n"
@@ -361,27 +340,27 @@ static void outfits_update(char* str) {
         "NA\n"
         "NA\n",
         pilot_freeSpace(player));
-    window_modifyText(secondary_wid, "txtDDesc", buf);
+    window_modifyText(wid, "txtDDesc", buf);
     return;
   }
 
   outfit = outfit_get(outfitname);
 
-  window_modifyImage(secondary_wid, "imgOutfit", outfit->gfx_store);
+  window_modifyImage(wid, "imgOutfit", outfit->gfx_store);
 
   if(outfit_canBuy(outfit, 1, 0) > 0)
-    window_enableButton(secondary_wid, "btnBuyOutfit");
+    window_enableButton(wid, "btnBuyOutfit");
   else
-    window_disableButton(secondary_wid, "btnBuyOutfit");
+    window_disableButton(wid, "btnBuyOutfit");
 
   /* Gray out sell button. */
   if(outfit_canSell(outfit, 1, 0) > 0)
-    window_enableButton(secondary_wid, "btnSellOutfit");
+    window_enableButton(wid, "btnSellOutfit");
   else
-    window_disableButton(secondary_wid, "btnSellOutfit");
+    window_disableButton(wid, "btnSellOutfit");
 
   /* New text. */
-  window_modifyText(secondary_wid, "txtDescription", outfit->description);
+  window_modifyText(wid, "txtDescription", outfit->description);
   credits2str(buf2, outfit->price,  2);
   credits2str(buf3, player->credits, 2);
   snprintf(buf, 128,
@@ -402,7 +381,7 @@ static void outfits_update(char* str) {
            buf2,
            buf3);
 
-  window_modifyText(secondary_wid, "txtDDesc", buf);
+  window_modifyText(wid, "txtDDesc", buf);
 }
 
 static int outfit_canBuy(Outfit* outfit, int q, int errmsg) {