diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
new file mode 100644
index 00000000000..443acb550e1
--- /dev/null
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -0,0 +1,196 @@
+var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner")
+
+/obj/machinery/computer/telecrystals
+ name = "Telecrystal Assignment Machinery"
+ desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
+ icon_state = "tcstation"
+
+/////////////////////////////////////////////
+/obj/machinery/computer/telecrystals/uplinker
+ name = "Telecrystal Upload/Recieve Station"
+ desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
+ you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
+ icon_state = "tcstation"
+ var/obj/item/uplinkholder = null
+ var/obj/machinery/computer/telecrystals/boss/linkedboss = null
+
+/obj/machinery/computer/telecrystals/uplinker/New()
+ ..()
+
+ var/ID
+ if(possible_uplinker_IDs.len)
+ ID = pick(possible_uplinker_IDs)
+ possible_uplinker_IDs -= ID
+ name = "[name] [ID]"
+ else
+ name = "[name] [rand(1,999)]"
+
+
+/obj/machinery/computer/telecrystals/uplinker/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item))
+ if(O.hidden_uplink)
+ var/obj/item/P = user.get_active_hand()
+ user.drop_item()
+ uplinkholder = P
+ P.loc = src
+ P.add_fingerprint(user)
+ update_icon()
+ updateUsrDialog()
+ else
+ user << "The [O] doesn't appear to be an uplink..."
+
+
+/obj/machinery/computer/telecrystals/uplinker/update_icon()
+ overlays.Cut()
+ if(uplinkholder)
+ overlays += "[initial(icon_state)]-closed"
+
+
+/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink()
+ if(uplinkholder)
+ uplinkholder.loc = get_turf(src.loc)
+ uplinkholder = null
+ update_icon()
+
+/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(var/amt)
+ if(uplinkholder && linkedboss)
+ if(amt <= uplinkholder.hidden_uplink.uses)
+ uplinkholder.hidden_uplink.uses -= amt
+ linkedboss.storedcrystals += amt
+
+/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(var/amt)
+ if(uplinkholder && linkedboss)
+ if(amt <= linkedboss.storedcrystals)
+ uplinkholder.hidden_uplink.uses += amt
+ linkedboss.storedcrystals -= amt
+
+///////
+
+/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user as mob)
+ if(..())
+ return
+ src.add_fingerprint(user)
+ user.set_machine(src)
+
+ var/dat = ""
+ if(linkedboss)
+ dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution.
"
+ else
+ dat += "No linked management consoles detected. Scan for uplink stations using the management console.
"
+
+ if(uplinkholder)
+ dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.
"
+ if(linkedboss)
+ dat += "Donate TC: 1 | 5"
+ dat += "
Eject Uplink"
+
+
+ var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500)
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ return
+
+/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["donate1"])
+ donateTC(1)
+
+ if(href_list["donate5"])
+ donateTC(5)
+
+ if(href_list["eject"])
+ ejectuplink()
+
+ src.updateUsrDialog()
+
+
+/////////////////////////////////////////
+/obj/machinery/computer/telecrystals/boss
+ name = "Team Telecrystal Management Console"
+ desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
+ Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
+ based on the danger rating of the mission."
+ icon_state = "tcboss"
+ var/virgin = 1
+ var/scanrange = 10
+ var/storedcrystals = 0
+ var/list/TCstations = list()
+
+/obj/machinery/computer/telecrystals/boss/proc/scanUplinkers()
+ for(var/obj/machinery/computer/telecrystals/uplinker/A in range(scanrange, src.loc))
+ if(!A.linkedboss)
+ TCstations += A
+ A.linkedboss = src
+ if(virgin)
+ getDangerous()
+ virgin = 0
+
+/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population.
+ ..()
+ var/danger
+ danger = player_list.len
+ while(!IsMultiple(++danger,10))//Just round up to the nearest multiple of ten.
+ scaleTC(danger)
+
+/obj/machinery/computer/telecrystals/boss/proc/scaleTC(var/amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc.
+ storedcrystals += amt
+
+/////////
+
+/obj/machinery/computer/telecrystals/boss/attack_hand(var/mob/user as mob)
+ if(..())
+ return
+ src.add_fingerprint(user)
+ user.set_machine(src)
+
+
+ var/dat = ""
+ dat += "Scan for TC stations.
"
+ dat += "This [src] has [storedcrystals] telecrystals available for distribution.
"
+ dat += "
"
+
+
+ for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
+ dat += "[A.name] | "
+ if(A.uplinkholder)
+ dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals."
+ if(storedcrystals)
+ dat+= "
Add TC: 1 | 5"
+ dat += "
"
+
+ if(TCstations.len)
+ dat += "
Evenly distribute remaining TC."
+
+ var/datum/browser/popup = new(user, "computer", "Team Telecrystal Management Console", 700, 500)//400,500
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ return
+
+/obj/machinery/computer/telecrystals/boss/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["scan"])
+ scanUplinkers()
+
+ if(href_list["give1"])
+ var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"])
+ A.giveTC(1)
+
+ if(href_list["give5"])
+ var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"])
+ A.giveTC(5)
+
+ if(href_list["distrib"])
+ var/sanity = 0
+ while(storedcrystals && sanity < 100)
+ for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
+ A.giveTC(1)
+ sanity++
+
+ src.updateUsrDialog()
+ return
\ No newline at end of file
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 2b7c758bd67..9557a1472da 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ