diff --git a/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDevice.cs b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDevice.cs
new file mode 100644
index 0000000..5fa3c85
--- /dev/null
+++ b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDevice.cs
@@ -0,0 +1,78 @@
+// ReSharper disable MemberCanBePrivate.Global
+// ReSharper disable UnusedMember.Global
+
+using System.Collections.Generic;
+using System.Linq;
+using RGB.NET.Core;
+
+namespace RGB.NET.Devices.WS281X.Arduino
+{
+ // ReSharper disable once InconsistentNaming
+ ///
+ ///
+ /// Represents an arduino WS2812 device.
+ ///
+ public class ArduinoWS2812USBDevice : AbstractRGBDevice
+ {
+ #region Properties & Fields
+
+ ///
+ /// Gets the update queue performing updates for this device.
+ ///
+ public ArduinoWS2812USBUpdateQueue UpdateQueue { get; }
+
+ ///
+ public override ArduinoWS2812USBDeviceInfo DeviceInfo { get; }
+
+ ///
+ /// Gets the channel (as defined in the arduino-sketch) this device is attached to.
+ ///
+ public int Channel { get; }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The update trigger used by this queue.
+ /// The update queue performing updates for this device.
+ /// The channel (as defined in the arduino-sketch) this device is attached to.
+ public ArduinoWS2812USBDevice(ArduinoWS2812USBDeviceInfo deviceInfo, ArduinoWS2812USBUpdateQueue updateQueue, int channel)
+ {
+ this.DeviceInfo = deviceInfo;
+ this.UpdateQueue = updateQueue;
+ this.Channel = channel;
+ }
+
+ #endregion
+
+ #region Methods
+
+ internal void Initialize(int ledCount)
+ {
+ for (int i = 0; i < ledCount; i++)
+ InitializeLed(LedId.LedStripe1 + i, new Rectangle(i * 10, 0, 10, 10));
+
+ //TODO DarthAffe 23.12.2018: Allow to load a layout.
+
+ if (Size == Size.Invalid)
+ {
+ Rectangle ledRectangle = new Rectangle(this.Select(x => x.LedRectangle));
+ Size = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y);
+ }
+ }
+
+ ///
+ protected override object CreateLedCustomData(LedId ledId) => (Channel, (int)ledId - (int)LedId.LedStripe1);
+
+ ///
+ protected override IEnumerable GetLedsToUpdate(bool flushLeds) => (flushLeds || LedMapping.Values.Any(x => x.IsDirty)) ? LedMapping.Values : null;
+
+ ///
+ protected override void UpdateLeds(IEnumerable ledsToUpdate) => UpdateQueue.SetData(ledsToUpdate.Where(x => x.Color.A > 0));
+
+ #endregion
+ }
+}
diff --git a/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDeviceInfo.cs b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDeviceInfo.cs
new file mode 100644
index 0000000..c8f0282
--- /dev/null
+++ b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBDeviceInfo.cs
@@ -0,0 +1,51 @@
+using System;
+using RGB.NET.Core;
+
+namespace RGB.NET.Devices.WS281X.Arduino
+{
+ // ReSharper disable once InconsistentNaming
+ ///
+ ///
+ /// Represents a generic information for a .
+ ///
+ public class ArduinoWS2812USBDeviceInfo : IRGBDeviceInfo
+ {
+ #region Properties & Fields
+
+ ///
+ public string DeviceName { get; }
+
+ ///
+ public RGBDeviceType DeviceType => RGBDeviceType.LedStripe;
+
+ ///
+ public string Manufacturer => "Arduino";
+
+ ///
+ public string Model => "WS2812 USB";
+
+ ///
+ public RGBDeviceLighting Lighting => RGBDeviceLighting.Key;
+
+ ///
+ public bool SupportsSyncBack => false;
+
+ ///
+ public Uri Image { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The name of this device.
+ public ArduinoWS2812USBDeviceInfo(string name)
+ {
+ this.DeviceName = name;
+ }
+
+ #endregion
+ }
+}
diff --git a/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBUpdateQueue.cs b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBUpdateQueue.cs
new file mode 100644
index 0000000..696f54e
--- /dev/null
+++ b/RGB.NET.Devices.WS281X/Arduino/ArduinoWS2812USBUpdateQueue.cs
@@ -0,0 +1,105 @@
+using System.Collections.Generic;
+using System.Linq;
+using RGB.NET.Core;
+
+namespace RGB.NET.Devices.WS281X.Arduino
+{
+ // ReSharper disable once InconsistentNaming
+ ///
+ ///
+ /// Represents the update-queue performing updates for arduino WS2812 devices.
+ ///
+ public class ArduinoWS2812USBUpdateQueue : SerialPortUpdateQueue
+ {
+ #region Constants
+
+ private static readonly byte[] COUNT_COMMAND = { 0x01 };
+ private static readonly byte[] UPDATE_COMMAND = { 0x02 };
+ private static readonly byte[] ASK_PROMPT_COMMAND = { 0x0F };
+
+ #endregion
+
+ #region Properties & Fields
+
+ private readonly Dictionary _dataBuffer = new Dictionary();
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The update trigger used by this queue.
+ /// The name of the serial-port to connect to.
+ /// The baud-rate used by the serial-connection.
+ public ArduinoWS2812USBUpdateQueue(IDeviceUpdateTrigger updateTrigger, string portName, int baudRate = 115200)
+ : base(updateTrigger, portName, baudRate)
+ { }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ protected override void OnStartup(object sender, CustomUpdateData customData)
+ {
+ base.OnStartup(sender, customData);
+
+ SendCommand(ASK_PROMPT_COMMAND); // Get initial prompt
+ }
+
+ ///
+ protected override IEnumerable GetCommands(Dictionary