diff --git a/code/modules/research/xenoarchaeology/analysis_machinery.dm b/code/modules/research/xenoarchaeology/analysis_machinery.dm
new file mode 100644
index 00000000000..c0534a43a65
--- /dev/null
+++ b/code/modules/research/xenoarchaeology/analysis_machinery.dm
@@ -0,0 +1,119 @@
+obj/machinery/gas_chromatography
+ name = "Gas Chromatography Spectrometer"
+ desc = "A specialised mass spectrometer."
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+
+obj/machinery/gas_chromatography/Topic(href, href_list)
+ if(href_list["close"])
+ usr << browse(null, "window=artanalyser")
+ usr.machine = null
+
+ updateDialog()
+
+obj/machinery/gas_chromatography/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ user.machine = src
+ var/dat = "Gas Chromatography Spectrometer
"
+ dat += "
"
+ dat += "Refresh
"
+ dat += "Close
"
+ user << browse(dat, "window=artanalyser;size=450x500")
+ onclose(user, "artanalyser")
+
+obj/machinery/accelerator
+ name = "Accelerator Spectrometer"
+ desc = "A specialised mass spectrometer."
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+
+obj/machinery/accelerator/Topic(href, href_list)
+ if(href_list["close"])
+ usr << browse(null, "window=artanalyser")
+ usr.machine = null
+
+ updateDialog()
+
+obj/machinery/accelerator/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ user.machine = src
+ var/dat = "Accelerator Spectrometer
"
+ dat += "
"
+ dat += "Refresh
"
+ dat += "Close
"
+ user << browse(dat, "window=artanalyser;size=450x500")
+ onclose(user, "artanalyser")
+
+obj/machinery/fourier_transform
+ name = "Fourier Transform Spectroscope"
+ desc = "A specialised geochemical analysis device."
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+
+obj/machinery/fourier_transform/Topic(href, href_list)
+ if(href_list["close"])
+ usr << browse(null, "window=artanalyser")
+ usr.machine = null
+
+ updateDialog()
+
+obj/machinery/fourier_transform/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ user.machine = src
+ var/dat = "Fourier Transform Spectroscope
"
+ dat += "
"
+ dat += "Refresh
"
+ dat += "Close
"
+ user << browse(dat, "window=artanalyser;size=450x500")
+ onclose(user, "artanalyser")
+
+obj/machinery/radiometric
+ name = "Radiometric Exposure Spectrometer"
+ desc = "A specialised mass spectrometer, able to radiometrically date inserted materials."
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+
+obj/machinery/radiometric/Topic(href, href_list)
+ if(href_list["close"])
+ usr << browse(null, "window=artanalyser")
+ usr.machine = null
+
+ updateDialog()
+
+obj/machinery/radiometric/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ user.machine = src
+ var/dat = "Radiometric Exposure Spectrometer
"
+ dat += "
"
+ dat += "Refresh
"
+ dat += "Close
"
+ user << browse(dat, "window=artanalyser;size=450x500")
+ onclose(user, "artanalyser")
+
+obj/machinery/ion_mobility
+ name = "Ion Mobility Spectrometer"
+ desc = "A specialised mass spectrometer."
+ icon = 'virology.dmi'
+ icon_state = "analyser"
+
+obj/machinery/ion_mobility/Topic(href, href_list)
+ if(href_list["close"])
+ usr << browse(null, "window=artanalyser")
+ usr.machine = null
+
+ updateDialog()
+
+obj/machinery/ion_mobility/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ user.machine = src
+ var/dat = "Ion Mobility Spectrometer
"
+ dat += "
"
+ dat += "Refresh
"
+ dat += "Close
"
+ user << browse(dat, "window=artanalyser;size=450x500")
+ onclose(user, "artanalyser")
diff --git a/code/modules/research/xenoarchaeology/core_sampler.dm b/code/modules/research/xenoarchaeology/core_sampler.dm
new file mode 100644
index 00000000000..5bd59edc656
--- /dev/null
+++ b/code/modules/research/xenoarchaeology/core_sampler.dm
@@ -0,0 +1,68 @@
+//device to take core samples from mineral turfs - used for various types of analysis
+
+/obj/item/weapon/storage/samplebag
+ name = "sample bag"
+ desc = "A geological sample bag."
+ icon_state = "evidenceobj"
+ w_class = 1
+ max_w_class = 1
+ max_combined_w_class = 7
+ storage_slots = 7
+
+//////////////////////////////////////////////////////////////////
+
+/obj/item/device/core_sampler
+ name = "core sampler"
+ desc = "Used to extract geological core samples."
+ icon = 'device.dmi'
+ icon_state = "sampler0"
+ item_state = "screwdriver_brown"
+ w_class = 1.0
+ flags = FPRINT | TABLEPASS
+ //slot_flags = SLOT_BELT
+ var/sampled_turf = ""
+ var/num_stored_bags = 10
+ var/obj/item/weapon/storage/samplebag/filled_bag
+
+/obj/item/device/core_sampler/New()
+ /*for(var/i=0, i