diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj
index cc4923d8d..8c149b2ae 100644
--- a/Subsurface/Barotrauma.csproj
+++ b/Subsurface/Barotrauma.csproj
@@ -116,6 +116,8 @@
+
+
diff --git a/Subsurface/Content/Items/Electricity/signalcomp.png b/Subsurface/Content/Items/Electricity/signalcomp.png
index 726b7921e..bb7510542 100644
Binary files a/Subsurface/Content/Items/Electricity/signalcomp.png and b/Subsurface/Content/Items/Electricity/signalcomp.png differ
diff --git a/Subsurface/Content/Items/Electricity/signalitems.xml b/Subsurface/Content/Items/Electricity/signalitems.xml
index b3f0e4b25..8128c1d74 100644
--- a/Subsurface/Content/Items/Electricity/signalitems.xml
+++ b/Subsurface/Content/Items/Electricity/signalitems.xml
@@ -202,7 +202,77 @@
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- > signalQueue;
+
+ [InGameEditable, HasDefaultValue(1.0f, true)]
+ public float Delay
+ {
+ get { return (float)delay.TotalSeconds; }
+ set
+ {
+ float seconds = MathHelper.Clamp(value, 0.0f, 60.0f);
+
+ delay = new TimeSpan(0,0,0,0, (int)(seconds*1000.0f));
+ }
+ }
+
+ public DelayComponent(Item item, XElement element)
+ : base (item, element)
+ {
+ signalQueue = new Queue>();
+
+ IsActive = true;
+ }
+
+ public override void Update(float deltaTime, Camera cam)
+ {
+ while (signalQueue.Any() && signalQueue.Peek().Item2 + delay <= DateTime.Now)
+ {
+ var signalOut = signalQueue.Dequeue();
+
+ item.SendSignal(signalOut.Item1, "signal_out");
+ }
+ }
+
+ public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
+ {
+ switch (connection.Name)
+ {
+ case "signal_in":
+ signalQueue.Enqueue(new Tuple(signal, DateTime.Now));
+ break;
+ }
+ }
+ }
+}
diff --git a/Subsurface/Source/Items/Components/Signal/RelayComponent.cs b/Subsurface/Source/Items/Components/Signal/RelayComponent.cs
new file mode 100644
index 000000000..950ddd41a
--- /dev/null
+++ b/Subsurface/Source/Items/Components/Signal/RelayComponent.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Linq;
+
+namespace Barotrauma.Items.Components
+{
+ class RelayComponent : ItemComponent
+ {
+ public RelayComponent(Item item, XElement element)
+ : base (item, element)
+ {
+ IsActive = true;
+ }
+
+ public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
+ {
+ if (connection.Name.Contains("_in"))
+ {
+ if (!IsActive) return;
+
+ string outConnection = connection.Name.Contains("power_in") ? "power_out" : "signal_out";
+
+ int connectionNumber = -1;
+ int.TryParse(connection.Name.Substring(connection.Name.Length - 1, 1), out connectionNumber);
+
+ if (connectionNumber > 0) outConnection += connectionNumber;
+
+ item.SendSignal(signal, outConnection, power);
+ }
+ else if (connection.Name == "toggle")
+ {
+ IsActive = !IsActive;
+ }
+ else if (connection.Name == "set_state")
+ {
+ IsActive = signal == "1";
+ }
+
+ }
+ }
+}