--- a/data/json/mapgen/bunker_shop.json
+++ b/data/json/mapgen/bunker_shop.json
@@ -0,0 +1,180 @@
+[
+  {
+    "type": "mapgen",
+    "method": "json",
+    "om_terrain": [ "bunker_shop_g" ],
+    "object": {
+      "fill_ter": "t_floor",
+      "rows": [
+        "kkkkkkkkkkkkkkkkkkkkkkkk",
+        "kkkkkkkkkkkkkkkkkkkkkkkk",
+        "kkkkkkkkkkkkkkkkkkkkkkkk",
+        "kkaasaaGnnGnnGnnGnnoookk",
+        "kkaEDDakkkkkkkkkkkkoqokk",
+        "GnaEDDakkkkzkkkkkkkopokk",
+        "nkaaCaakkkkkkkkAkkkktnkk",
+        "nkkktttttttttttttttttnkk",
+        "GkkktkkkiicjaraaaajktGkk",
+        "nkkktkkkjkkkwwyakkjktnkk",
+        "nttttttkjkkkww a krktnkk",
+        "Gttttttkakk    a  jktGkk",
+        "nttttttkaaagaaaaagaagaak",
+        "nttttttka   lj    akkkak",
+        "Gttttttka   ljvv  gkk sk",
+        "nttttttbbd   i    akk ak",
+        "nttttttbedk  iia  a   sk",
+        "Gttttttbbdkk      a   ak",
+        "nttttttkakkkk     iijjak",
+        "nttttttFjkkkkkk   jkkkkk",
+        "GBBBBBBGiijrcjgjjijkkkkk",
+        "kttttttFkf  kkkkgkkkAkkk",
+        "kttttttkkj   kkkjkkkkkkk",
+        "kttttttkkjjrrcrjjkkkkkkk"
+      ],
+      "terrain": {
+        "a": "t_wall_wood",
+        "b": "t_rock",
+        "c": "t_window_empty",
+        "d": "t_rock_floor",
+        "e": "t_rock_floor",
+        "f": "t_door_b",
+        "g": "t_door_frame",
+        "h": "t_door_c",
+        "i": "t_wall_wood_broken",
+        "j": "t_wall_wood_chipped",
+        "k": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
+        "m": "t_dirt",
+        "n": "t_chainfence_h",
+        "o": "t_concrete_wall",
+        "p": "t_door_metal_c",
+        "q": "t_stairs_down",
+        "r": "t_window_frame",
+        "s": "t_window_boarded",
+        "t": "t_dirt",
+        "l": "t_floor",
+        "u": "t_floor",
+        "v": "t_floor",
+        "w": "t_floor",
+        "x": "t_wall_wood_chipped",
+        "y": "t_floor",
+        "z": "t_tree_plum",
+        "A": "t_tree_apple",
+        "B": "t_door_metal_locked",
+        "C": "t_door_c",
+        "D": "t_dirtfloor",
+        "E": "t_dirtfloor",
+        "F": "t_gates_mech_control",
+        "G": "t_wall"
+      },
+      "furniture": {
+        "e": "f_brazier",
+        "m": "f_rubble",
+        "l": "f_crate_o",
+        "u": "f_woodstove",
+        "v": "f_table",
+        "w": "f_bed",
+        "y": "f_dresser",
+        "E": "f_locker"
+      },
+      "place_loot": [
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 9, 12 ], "y": [ 13, 19 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 13, 17 ], "y": [ 17, 19 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 14, 17 ], "y": [ 13, 15 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 9, 14 ], "y": [ 9, 11 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 19, 21 ], "y": [ 13, 17 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 5, "x": [ 10, 15 ], "y": [ 21, 22 ] },
+        { "group": "floor_trash", "chance": 90, "repeat": 3, "x": [ 16, 17 ], "y": [ 9, 11 ] }
+      ]
+    }
+  },
+  {
+    "type": "mapgen",
+    "method": "json",
+    "om_terrain": [ "bunker_shop_b" ],
+    "object": {
+      "fill_ter": "t_rock",
+      "rows": [
+        "              fff       ",
+        "              fvffffff  ",
+        "              fbbbbbbf  ",
+        "              fbffffbf  ",
+        "        fffff fbf  faf  ",
+        "       fftsrf fbf  fff  ",
+        "       fvbbbf fbf       ",
+        "     ffffffdfffdfffff   ",
+        "     fnccmfbfjubbxfvf   ",
+        "     fllccbbdbbbbbebf   ",
+        "     fvccofjfbbbbbfbf   ",
+        "     fffffffffgggffbf   ",
+        "            fjhhhbfbf   ",
+        "    fffffffffbbpbbdbf   ",
+        "    fviiiiivfibbbbfff   ",
+        "  fffbbbbbbbfibvbwf     ",
+        "  fkdbiiiiibdbbbbhf     ",
+        "  fffbbbbbbbfiqqbhf     ",
+        "    fviiiiivffffdff     ",
+        "    ffffffffffnlcmf     ",
+        "        fvbbbdclcmf     ",
+        "        fftsrfcccvf     ",
+        "         ffffffffff     ",
+        "                        "
+      ],
+      "terrain": {
+        "a": "t_stairs_up",
+        "b": "t_thconc_floor",
+        "c": "t_floor",
+        "d": "t_door_metal_c",
+        "e": "t_door_metal_locked",
+        "f": "t_concrete_wall",
+        "g": "t_reinforced_glass",
+        "h": "t_thconc_floor",
+        "i": "t_thconc_floor",
+        "j": "t_thconc_floor",
+        "k": "t_plut_generator",
+        "l": "t_floor",
+        "m": "t_floor",
+        "n": "t_floor",
+        "o": "t_floor",
+        "p": "t_thconc_floor",
+        "q": "t_thconc_floor",
+        "r": "t_thconc_floor",
+        "s": "t_thconc_floor",
+        "t": "t_thconc_floor",
+        "u": "t_thconc_floor",
+        "v": "t_utility_light",
+        "w": "t_console_broken",
+        "x": "t_atm"
+      },
+      "furniture": {
+        "h": "f_table",
+        "i": "f_rack",
+        "j": "f_locker",
+        "l": "f_bed",
+        "m": "f_dresser",
+        "n": "f_table",
+        "o": "f_sofa",
+        "p": "f_chair",
+        "q": "f_sofa",
+        "r": "f_toilet",
+        "s": "f_sink",
+        "t": "f_shower",
+        "u": "f_crate_o"
+      },
+      "place_loot": [
+        { "group": "mil_food_nodrugs", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 18, 18 ] },
+        { "group": "ammo_rifle_milspec", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 16, 16 ] },
+        { "group": "camping", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 14, 14 ] },
+        { "group": "allclothes", "chance": 90, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 19, 20 ] },
+        { "group": "allclothes", "chance": 90, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 8, 8 ] },
+        { "group": "book_military", "chance": 90, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 8, 8 ] },
+        { "group": "book_military", "chance": 90, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 12, 12 ] },
+        { "group": "cleaning_bulk", "chance": 90, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 10, 10 ] },
+        { "group": "cleaning_bulk", "chance": 90, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 12, 12 ] },
+        { "group": "guns_milspec", "chance": 90, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 14, 15 ] },
+        { "group": "mil_food_nodrugs", "chance": 90, "repeat": [ 5 ], "x": [ 13, 13 ], "y": [ 17, 17 ] },
+        { "group": "mil_armor", "chance": 90, "repeat": [ 5 ], "x": [ 17, 17 ], "y": [ 15, 17 ] }
+      ],
+      "place_npcs": [ { "class": "bunker_merchant", "x": 15, "y": 13 } ]
+    }
+  }
+]
--- a/data/json/npcs/bunker_shop/NC_BUNKER_MERCHANT.json
+++ b/data/json/npcs/bunker_shop/NC_BUNKER_MERCHANT.json
@@ -0,0 +1,72 @@
+[
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_pants_male",
+    "items": [ [ "pants_cargo", 60 ], [ "pants", 20 ], [ "shorts_cargo", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_pants_female",
+    "items": [ [ "pants_cargo", 60 ], [ "pants", 20 ], [ "shorts_cargo", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_shoes",
+    "items": [ [ "boots_combat", 90 ], [ "boots", 10 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_shirt_male",
+    "items": [ [ "undershirt", 30 ], [ "sweatshirt", 20 ], [ "under_armor", 20 ], [ "longshirt", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_shirt_female",
+    "items": [ [ "undershirt", 30 ], [ "sweatshirt", 20 ], [ "under_armor", 20 ], [ "longshirt", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_gloves",
+    "items": [ [ "null", 20 ], [ "gloves_tactical", 60 ], [ "gloves_fingerless", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_coat",
+    "items": [ [ "hoodie", 50 ], [ "kevlar", 50 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_extra",
+    "items": [ [ "rucksack", 100 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_hat",
+    "items": [ [ "hat_ball", 100 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_eyes",
+    "items": [ [ "null", 80 ], [ "glasses_bal", 20 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_masks",
+    "items": [ [ "scarf", 100 ] ]
+  },
+  {
+    "type": "item_group",
+    "id": "NC_BUNKER_MERCHANT_misc",
+    "items": [
+      { "group": "ammo_reloaded", "prob": 100, "count-min": 5, "count-max": 10 },
+      { "group": "everyday_gear", "prob": 100, "count-min": 5, "count-max": 25 },
+      { "group": "guns_survival", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "tools_survival", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "supplies_electronics", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "clothing_outdoor_torso", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "clothing_outdoor_pants", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "clothing_outdoor_shoes", "prob": 100, "count-min": 5, "count-max": 5 },
+      { "group": "drugs_soldier", "prob": 100, "count-min": 5, "count-max": 5 }
+    ]
+  }
+]
--- a/data/json/npcs/bunker_shop/TALK_BUNKER_MERCHANT.json
+++ b/data/json/npcs/bunker_shop/TALK_BUNKER_MERCHANT.json
@@ -0,0 +1,46 @@
+[
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT",
+    "dynamic_line": "Heya, scav.",
+    "responses": [
+      { "text": "Did you build this place?", "topic": "TALK_BUNKER_MERCHANT_HERE" },
+      { "text": "Who are you?", "topic": "TALK_BUNKER_MERCHANT_WHO" },
+      { "text": "Why do you still use cash?", "topic": "TALK_BUNKER_MERCHANT_WHY" },
+      { "text": "You're a trader?", "topic": "TALK_BUNKER_MERCHANT_TRADE" },
+      { "text": "I need some supplies.", "effect": "start_trade", "topic": "TALK_BUNKER_MERCHANT" },
+      { "text": "Need help with anything?", "topic": "TALK_BUNKER_MERCHANT_MISSION" },
+      { "text": "Well, bye.", "topic": "TALK_DONE" }
+    ]
+  },
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT_HERE",
+    "dynamic_line": "No, no… well, maybe a little.  It was just as wrecked down here as it is up top when I found it, wasn't too hard to fix up.  You're welcome to stay in the spare room awhile, just don't hog it.  You're not the only scav out there.",
+    "responses": [ { "text": "Interesting…", "topic": "TALK_BUNKER_MERCHANT" } ]
+  },
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT_WHO",
+    "dynamic_line": "Just a scav who got lucky.  Now I'm content to sit around here on my pile of treasure.  I'm more than willing to trade if you've got the cash.",
+    "responses": [ { "text": "I see…", "topic": "TALK_BUNKER_MERCHANT" } ]
+  },
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT_WHY",
+    "dynamic_line": "Why not?  Everyone else does, so I suppose that's all that matters.  My ATM over there still works, connected to the bank servers and everything.",
+    "responses": [ { "text": "Hmm…", "topic": "TALK_BUNKER_MERCHANT" } ]
+  },
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT_TRADE",
+    "dynamic_line": "I suppose I am.  Scavs like you need supplies, right?  And I could always use more money.",
+    "responses": [ { "text": "Alright…", "topic": "TALK_BUNKER_MERCHANT" } ]
+  },
+  {
+    "type": "talk_topic",
+    "id": "TALK_BUNKER_MERCHANT_MISSION",
+    "dynamic_line": "Not at the moment, check back later perhaps.",
+    "responses": [ { "text": "Sure…", "topic": "TALK_BUNKER_MERCHANT" } ]
+  }
+]
--- a/data/json/npcs/bunker_shop/classes.json
+++ b/data/json/npcs/bunker_shop/classes.json
@@ -0,0 +1,21 @@
+[
+  {
+    "type": "npc_class",
+    "id": "NC_BUNKER_MERCHANT",
+    "name": "Merchant",
+    "common": false,
+    "job_description": "",
+    "bonus_str": { "rng": [ -1, 2 ] },
+    "bonus_dex": { "rng": [ -1, 1 ] },
+    "bonus_int": { "rng": [ -1, 4 ] },
+    "bonus_per": { "rng": [ -1, 2 ] },
+    "skills": [
+      { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "constant": 0 } ] } ] } },
+      { "skill": "gun", "bonus": { "rng": [ 1, 5 ] } },
+      { "skill": "rifle", "bonus": { "rng": [ 1, 5 ] } },
+      { "skill": "pistol", "bonus": { "rng": [ 1, 4 ] } },
+      { "skill": "smg", "bonus": { "rng": [ 1, 3 ] } },
+      { "skill": "speech", "bonus": { "rng": [ 1, 6 ] } }
+    ]
+  }
+]
--- a/data/json/npcs/bunker_shop/npc.json
+++ b/data/json/npcs/bunker_shop/npc.json
@@ -0,0 +1,12 @@
+[
+  {
+    "type": "npc",
+    "id": "bunker_merchant",
+    "name_suffix": "Merchant",
+    "class": "NC_BUNKER_MERCHANT",
+    "attitude": 0,
+    "mission": 3,
+    "chat": "TALK_BUNKER_MERCHANT",
+    "faction": "no_faction"
+  }
+]
--- a/data/json/overmap/overmap_special/specials.json
+++ b/data/json/overmap/overmap_special/specials.json
@@ -7151,5 +7151,19 @@
     "city_sizes": [ 3, -1 ],
     "occurrences": [ 0, 2 ],
     "flags": [ "CLASSIC", "URBAN", "ELECTRIC_GRID" ]
+  },
+  {
+    "type": "overmap_special",
+    "id": "bunker shop",
+    "overmaps": [
+      { "point": [ 0, 0, 0 ], "overmap": "bunker_shop_g_south" },
+      { "point": [ 0, 0, -1 ], "overmap": "bunker_shop_b_south" }
+    ],
+    "connections": [ { "point": [ 0, -1, 0 ], "existing": true, "connection": "local_road", "from": [ 0, 0, 0 ] } ],
+    "locations": [ "wilderness" ],
+    "city_distance": [ 10, -1 ],
+    "city_sizes": [ 1, 12 ],
+    "occurrences": [ 5, 100 ],
+    "flags": [ "CLASSIC", "UNIQUE", "WILDERNESS", "ELECTRIC_GRID" ]
   }
 ]
--- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json
+++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json
@@ -491,5 +491,25 @@
     "name": "derelict property",
     "sym": "X",
     "color": "i_brown"
+  },
+  {
+    "type": "overmap_terrain",
+    "id": "bunker_shop_g",
+    "name": "derelict property",
+    "sym": "X",
+    "color": "i_brown",
+    "see_cost": 5,
+    "extras": "build",
+    "mondensity": 2
+  },
+  {
+    "type": "overmap_terrain",
+    "id": "bunker_shop_b",
+    "name": "scavenger bunker",
+    "sym": "B",
+    "color": "light_green",
+    "see_cost": 5,
+    "extras": "build",
+    "mondensity": 2
   }
 ]