diff --git a/code/WorkInProgress/computer3/lapvend.dm b/code/WorkInProgress/computer3/lapvend.dm
new file mode 100644
index 0000000000..d36af863d1
--- /dev/null
+++ b/code/WorkInProgress/computer3/lapvend.dm
@@ -0,0 +1,398 @@
+/obj/machinery/lapvend
+ name = "Laptop Vendor"
+ desc = "A generic vending machine."
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "robotics"
+ layer = 2.9
+ anchored = 1
+ density = 1
+ var/datum/browser/popup = null
+ var/obj/machinery/computer3/laptop/vended/newlap = null
+ var/obj/item/device/laptop/relap = null
+ var/vendmode = 0
+
+
+ var/cardreader = 0
+ var/floppy = 0
+ var/radionet = 0
+ var/camera = 0
+ var/network = 0
+ var/power = 0
+
+
+/obj/machinery/lapvend/New()
+ ..()
+ spawn(4)
+ power_change()
+ return
+ return
+
+
+/obj/machinery/lapvend/blob_act()
+ if (prob(50))
+ spawn(0)
+ del(src)
+ return
+
+ return
+
+
+/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(vendmode == 1)
+ if(istype(W, /obj/item/weapon/card))
+ var/obj/item/weapon/card/I = W
+ scan_card(I)
+ vendmode = 0
+ if(vendmode == 3)
+ if(istype(W,/obj/item/weapon/card))
+ var/obj/item/weapon/card/I = W
+ reimburse(I)
+ vendmode = 0
+ if(vendmode == 0)
+ if(istype(W, /obj/item/device/laptop))
+ var/obj/item/device/laptop/L = W
+ relap = L
+ calc_reimburse(L)
+ usr.drop_item()
+ L.loc = src
+ vendmode = 3
+ usr << "You slot your [L.name] into \The [src.name]"
+ else
+ ..()
+
+
+/obj/machinery/lapvend/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ var/vendorname = (src.name) //import the machine's name
+ var/dat = "[vendorname]
" //display the name, and added a horizontal rule
+ if(vendmode == 0)
+ dat += "Please choose your laptop customization options
"
+ dat += "Your comptuer will automatically be loaded with any programs you can use after the transaction is complete."
+ dat += "Some programs will require additional components to be installed!
"
+ dat += "HDD (Required) : Added
"
+ dat += "Card Reader : Single (50) | Dual (125)
"
+ dat += "Floppy Drive: Add (50)
"
+ dat += "Radio Network card Add (50)
"
+ dat += "Camera Card Add (100)
"
+ dat += " Network card Area (75) Adjacent (50)Powernet (25)
"
+ dat += "
Power source upgrade Extended (175) Unreal (250)"
+
+ if(vendmode == 0 || vendmode == 1)
+ dat += "
Cart
"
+ dat += "Total: [total()]
"
+ if(cardreader == 1)
+ dat += "Card Reader: (single) (50)
"
+ else if (cardreader == 2)
+ dat += "Card Reader: (double) (125)
"
+ else
+ dat += "Card Reader: None
"
+ if(floppy == 0)
+ dat += "Floppy Drive: None
"
+ else
+ dat += "Floppy Drive: Added (50)
"
+ if(radionet == 1)
+ dat += "Radio Card: Added (50)
"
+ else
+ dat += "Radio Card: None
"
+ if(camera == 1)
+ dat += "Camera Card: Added (100)
"
+ else
+ dat += "Camera Card: None
"
+ if(network == 1)
+ dat += "Network card: Area (75)
"
+ else if(network == 2)
+ dat += "Network card: Adjacent (50)
"
+ else if(network == 3)
+ dat += "Network card: Powernet (25)
"
+ else
+ dat += "Network card: None"
+ if (power == 0)
+ dat += "Power source: Regular"
+ else if (power == 1)
+ dat += "Power source: Extended (175)
"
+ else
+ dat += "Power source: Unreal (250)
"
+
+ if(vendmode == 0)
+ dat += "
Vend Laptop"
+
+ if(vendmode == 1)
+ dat += "Please swipe your card and enter your PIN to complete the transaction"
+
+ if(vendmode == 3)
+ dat += "Please swipe your card and enter your PIN to be finish returning your computer
"
+ dat += "Cancel"
+
+
+
+
+ popup = new(user, "lapvend", name, 450, 500)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+
+/obj/machinery/lapvend/Topic(href, href_list)
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
+ usr.set_machine(src)
+ switch(href_list["choice"])
+ if("single_add")
+ cardreader = 1
+ if ("dual_add")
+ cardreader = 2
+ if ("floppy_add")
+ floppy = 1
+ if ("radio_add")
+ radionet = 1
+ if ("camnet_add")
+ camera = 1
+ if ("area_add")
+ network = 1
+ if ("prox_add")
+ network = 2
+ if ("cable_add")
+ network = 3
+ if ("high_add")
+ power = 1
+ if ("super_add")
+ power = 2
+
+ if ("single_rem" || "dual_rem")
+ cardreader = 0
+ if ("floppy_rem")
+ floppy = 0
+ if ("radio_rem")
+ radionet = 0
+ if ("camnet_rem")
+ camera = 0
+ if ("area_rem" || "prox_rem" || "cable_rem")
+ network = 0
+ if ("high_rem" || "super_rem")
+ power = 0
+
+ if("vend")
+ vendmode = 1
+
+ if("cancel")
+ relap.loc = src.loc
+ relap = null
+ vendmode = 0
+
+ src.updateUsrDialog()
+ return
+
+
+/obj/machinery/lapvend/proc/vend()
+ if(cardreader > 0)
+ if(cardreader == 1)
+ newlap.spawn_parts += (/obj/item/part/computer/cardslot)
+ else
+ newlap.spawn_parts += (/obj/item/part/computer/cardslot/dual)
+ if(floppy == 1)
+ newlap.spawn_parts += (/obj/item/part/computer/storage/removable)
+ if(radionet == 1)
+ newlap.spawn_parts += (/obj/item/part/computer/networking/radio)
+ if(camera == 1)
+ newlap.spawn_parts += (/obj/item/part/computer/networking/cameras)
+ if (network == 1)
+ newlap.spawn_parts += (/obj/item/part/computer/networking/area)
+ if (network == 2)
+ newlap.spawn_parts += (/obj/item/part/computer/networking/prox)
+ if (network == 3)
+ newlap.spawn_parts += (/obj/item/part/computer/networking/cable)
+ if (power == 1)
+ del(newlap.battery)
+ newlap.battery = new /obj/item/weapon/cell/high(newlap)
+ if (power == 2)
+ del(newlap.battery)
+ newlap.battery = new /obj/item/weapon/cell/super(newlap)
+
+ newlap.spawn_parts()
+
+/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I)
+ if (istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/C = I
+ visible_message("[usr] swipes a card through [src].")
+ if(vendor_account)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
+ if(D)
+ var/transaction_amount = total()
+ if(transaction_amount <= D.money)
+
+ //transfer the money
+ D.money -= transaction_amount
+ vendor_account.money += transaction_amount
+
+ //Transaction logs
+ var/datum/transaction/T = new()
+ T.target_name = "[vendor_account.owner_name] (via [src.name])"
+ T.purpose = "Purchase of Laptop"
+ if(transaction_amount > 0)
+ T.amount = "([transaction_amount])"
+ else
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ D.transaction_log.Add(T)
+ //
+ T = new()
+ T.target_name = D.owner_name
+ T.purpose = "Purchase of Laptop"
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ vendor_account.transaction_log.Add(T)
+
+ newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
+
+ choose_progs(C)
+ vend()
+ popup.close()
+ newlap.close_computer()
+ newlap = null
+ cardreader = 0
+ floppy = 0
+ radionet = 0
+ camera = 0
+ network = 0
+ power = 0
+ else
+ usr << "\icon[src]You don't have that much money!"
+ else
+ usr << "\icon[src]Unable to access account. Check security settings and try again."
+ else
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
+
+/obj/machinery/lapvend/proc/total()
+ var/total = 0
+
+ if(cardreader == 1)
+ total += 50
+ if(cardreader == 2)
+ total += 125
+ if(floppy == 1)
+ total += 50
+ if(radionet == 1)
+ total += 50
+ if(camera == 1)
+ total += 100
+ if(network == 1)
+ total += 75
+ if(network == 2)
+ total += 50
+ if(network == 3)
+ total += 25
+ if(power == 1)
+ total += 175
+ if(power == 2)
+ total += 250
+
+ return total
+
+/obj/machinery/lapvend/proc/choose_progs(var/obj/item/weapon/card/id/C)
+ if(access_security in C.access)
+ newlap.spawn_files += (/datum/file/program/secure_data)
+ newlap.spawn_files += (/datum/file/camnet_key)
+ newlap.spawn_files += (/datum/file/program/security)
+ if(access_armory in C.access)
+ newlap.spawn_files += (/datum/file/program/prisoner)
+ if(access_atmospherics in C.access)
+ newlap.spawn_files += (/datum/file/program/atmos_alert)
+ if(access_change_ids in C.access)
+ newlap.spawn_files += (/datum/file/program/card_comp)
+ if(access_heads in C.access)
+ newlap.spawn_files += (/datum/file/program/communications)
+ if(access_medical in C.access)
+ newlap.spawn_files += (/datum/file/program/crew)
+ newlap.spawn_files += (/datum/file/program/med_data)
+ if(access_engine in C.access)
+ newlap.spawn_files += (/datum/file/program/powermon)
+ if(access_research in C.access)
+ newlap.spawn_files += (/datum/file/camnet_key/research)
+ newlap.spawn_files += (/datum/file/camnet_key/bombrange)
+ newlap.spawn_files += (/datum/file/camnet_key/xeno)
+ if(access_rd in C.access)
+ newlap.spawn_files += (/datum/file/program/borg_control)
+ if(access_cent_specops in C.access)
+ newlap.spawn_files += (/datum/file/camnet_key/creed)
+ newlap.spawn_files += (/datum/file/program/arcade)
+ newlap.spawn_files += (/datum/file/camnet_key/entertainment)
+ newlap.update_spawn_files()
+
+/obj/machinery/lapvend/proc/calc_reimburse(var/obj/item/device/laptop/L)
+ if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot))
+ cardreader = 1
+ if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot/dual))
+ cardreader = 2
+ if(istype(L.stored_computer.floppy,/obj/item/part/computer/storage/removable))
+ floppy = 1
+ if(istype(L.stored_computer.radio,/obj/item/part/computer/networking/radio))
+ radionet = 1
+ if(istype(L.stored_computer.camnet,/obj/item/part/computer/networking/cameras))
+ camera = 1
+ if(istype(L.stored_computer.net,/obj/item/part/computer/networking/area))
+ network = 1
+ if(istype(L.stored_computer.net,/obj/item/part/computer/networking/prox))
+ network = 2
+ if(istype(L.stored_computer.net,/obj/item/part/computer/networking/cable))
+ network = 3
+ if(istype(L.stored_computer.battery, /obj/item/weapon/cell/high))
+ power = 1
+ if(istype(L.stored_computer.battery, /obj/item/weapon/cell/super))
+ power = 2
+
+
+
+/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I)
+ if (istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/C = I
+ visible_message("[usr] swipes a card through [src].")
+ if(vendor_account)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2)
+ if(D)
+ var/transaction_amount = total()
+
+ //transfer the money
+ D.money += transaction_amount
+ vendor_account.money -= transaction_amount
+
+ //Transaction logs
+ var/datum/transaction/T = new()
+ T.target_name = "[vendor_account.owner_name] (via [src.name])"
+ T.purpose = "Return purchase of Laptop"
+ if(transaction_amount > 0)
+ T.amount = "([transaction_amount])"
+ else
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ D.transaction_log.Add(T)
+ //
+ T = new()
+ T.target_name = D.owner_name
+ T.purpose = "Return purchase of Laptop"
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ vendor_account.transaction_log.Add(T)
+
+ del(relap)
+
+ vendmode = 0
+ cardreader = 0
+ floppy = 0
+ radionet = 0
+ camera = 0
+ network = 0
+ power = 0
+
+ else
+ usr << "\icon[src]Unable to access account. Check security settings and try again."
+ else
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
\ No newline at end of file