diff --git a/RGB.NET.Devices.Wooting/Enum/WootingDevicesIndexes.cs b/RGB.NET.Devices.Wooting/Enum/WootingDevicesIndexes.cs
new file mode 100644
index 0000000..c25afa4
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Enum/WootingDevicesIndexes.cs
@@ -0,0 +1,21 @@
+// ReSharper disable InconsistentNaming
+// ReSharper disable UnusedMember.Global
+
+using System.ComponentModel;
+
+#pragma warning disable 1591 // Missing XML comment for publicly visible type or member
+
+namespace RGB.NET.Devices.Wooting.Enum
+{
+ ///
+ /// Contains a list of available device-indexes.
+ ///
+ public enum WootingDevicesIndexes
+ {
+ [Description("Wooting One")]
+ WootingOne = 0,
+
+ [Description("Wooting Two")]
+ WootingTwo = 1
+ }
+}
diff --git a/RGB.NET.Devices.Wooting/Enum/WootingLogicalKeyboardLayout.cs b/RGB.NET.Devices.Wooting/Enum/WootingLogicalKeyboardLayout.cs
new file mode 100644
index 0000000..640bfee
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Enum/WootingLogicalKeyboardLayout.cs
@@ -0,0 +1,21 @@
+// ReSharper disable InconsistentNaming
+// ReSharper disable UnusedMember.Global
+
+#pragma warning disable 1591 // Missing XML comment for publicly visible type or member
+
+namespace RGB.NET.Devices.Wooting.Enum
+{
+ ///
+ /// Contains list of available logical layouts for cooler master keyboards.
+ ///
+ ///
+ /// Based on what is available in the shop: https://wooting.store/collections/wooting-keyboards/products/wooting-two
+ ///
+ public enum WootingLogicalKeyboardLayout
+ {
+ US = 0,
+ UK = 1,
+ DE = 2,
+ ND = 3
+ };
+}
diff --git a/RGB.NET.Devices.Wooting/Enum/WootingPhysicalKeyboardLayout.cs b/RGB.NET.Devices.Wooting/Enum/WootingPhysicalKeyboardLayout.cs
new file mode 100644
index 0000000..07d830f
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Enum/WootingPhysicalKeyboardLayout.cs
@@ -0,0 +1,19 @@
+// ReSharper disable InconsistentNaming
+// ReSharper disable UnusedMember.Global
+
+#pragma warning disable 1591 // Missing XML comment for publicly visible type or member
+
+namespace RGB.NET.Devices.Wooting.Enum
+{
+ ///
+ /// Contains list of available physical layouts for Wooting keyboards.
+ ///
+ ///
+ /// Shop states ANSI (US) and ISO (UK/German/Nodics) - https://wooting.store/collections/wooting-keyboards/products/wooting-two
+ ///
+ public enum WootingPhysicalKeyboardLayout
+ {
+ US = 0,
+ UK = 1
+ }
+}
diff --git a/RGB.NET.Devices.Wooting/Generic/IWootingRGBDevice.cs b/RGB.NET.Devices.Wooting/Generic/IWootingRGBDevice.cs
new file mode 100644
index 0000000..b7356eb
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Generic/IWootingRGBDevice.cs
@@ -0,0 +1,12 @@
+using RGB.NET.Core;
+
+namespace RGB.NET.Devices.Wooting.Generic
+{
+ ///
+ /// Represents a Wooting RGB-device.
+ ///
+ internal interface IWootingRGBDevice : IRGBDevice
+ {
+ void Initialize(IDeviceUpdateTrigger updateTrigger);
+ }
+}
diff --git a/RGB.NET.Devices.Wooting/Generic/WootingRGBDevice.cs b/RGB.NET.Devices.Wooting/Generic/WootingRGBDevice.cs
new file mode 100644
index 0000000..7647a3d
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Generic/WootingRGBDevice.cs
@@ -0,0 +1,68 @@
+using System.Linq;
+using RGB.NET.Core;
+
+namespace RGB.NET.Devices.Wooting.Generic
+{
+ ///
+ ///
+ ///
+ /// Represents a Wooting-device
+ ///
+ public abstract class WootingRGBDevice : AbstractRGBDevice, IWootingRGBDevice
+ where TDeviceInfo : WootingRGBDeviceInfo
+ {
+ #region Properties & Fields
+
+ ///
+ ///
+ /// Gets information about the .
+ ///
+ public override TDeviceInfo DeviceInfo { get; }
+
+ ///
+ /// Gets or sets the update queue performing updates for this device.
+ ///
+ // ReSharper disable once MemberCanBePrivate.Global
+ protected UpdateQueue UpdateQueue { get; set; }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The generic information provided by Wooting for the device.
+ protected WootingRGBDevice(TDeviceInfo info)
+ {
+ this.DeviceInfo = info;
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Initializes the device.
+ ///
+ public void Initialize(IDeviceUpdateTrigger updateTrigger)
+ {
+ InitializeLayout();
+
+ if (Size == Size.Invalid)
+ {
+ Rectangle ledRectangle = new Rectangle(this.Select(x => x.LedRectangle));
+ Size = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y);
+ }
+
+ UpdateQueue = new WootingUpdateQueue(updateTrigger);
+ }
+
+ ///
+ /// Initializes the and of the device.
+ ///
+ protected abstract void InitializeLayout();
+
+ #endregion
+ }
+}
diff --git a/RGB.NET.Devices.Wooting/Generic/WootingRGBDeviceInfo.cs b/RGB.NET.Devices.Wooting/Generic/WootingRGBDeviceInfo.cs
new file mode 100644
index 0000000..bf91f8d
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Generic/WootingRGBDeviceInfo.cs
@@ -0,0 +1,62 @@
+using System;
+using RGB.NET.Core;
+using RGB.NET.Devices.Wooting.Enum;
+using RGB.NET.Devices.Wooting.Helper;
+
+namespace RGB.NET.Devices.Wooting.Generic
+{
+ ///
+ ///
+ /// Represents a generic information for a Wooting-.
+ ///
+ public class WootingRGBDeviceInfo : IRGBDeviceInfo
+ {
+ #region Properties & Fields
+
+ ///
+ public RGBDeviceType DeviceType { get; }
+
+ ///
+ public string DeviceName { get; }
+
+ ///
+ public string Manufacturer => "Wooting";
+
+ ///
+ public string Model { get; }
+
+ ///
+ public Uri Image { get; set; }
+
+ ///
+ public RGBDeviceLighting Lighting => RGBDeviceLighting.Key;
+
+ ///
+ public bool SupportsSyncBack => false;
+
+ ///
+ /// Gets the of the .
+ ///
+ public WootingDevicesIndexes DeviceIndex { get; }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Internal constructor of managed .
+ ///
+ /// The type of the .
+ /// The of the .
+ internal WootingRGBDeviceInfo(RGBDeviceType deviceType, WootingDevicesIndexes deviceIndex)
+ {
+ this.DeviceType = deviceType;
+ this.DeviceIndex = deviceIndex;
+
+ Model = deviceIndex.GetDescription();
+ DeviceName = $"{Manufacturer} {Model}";
+ }
+
+ #endregion
+ }
+}
diff --git a/RGB.NET.Devices.Wooting/Generic/WootingUpdateQueue.cs b/RGB.NET.Devices.Wooting/Generic/WootingUpdateQueue.cs
new file mode 100644
index 0000000..8342768
--- /dev/null
+++ b/RGB.NET.Devices.Wooting/Generic/WootingUpdateQueue.cs
@@ -0,0 +1,42 @@
+using System.Collections.Generic;
+using RGB.NET.Core;
+using RGB.NET.Devices.Wooting.Native;
+
+namespace RGB.NET.Devices.Wooting.Generic
+{
+ ///
+ ///
+ /// Represents the update-queue performing updates for cooler master devices.
+ ///
+ public class WootingUpdateQueue : UpdateQueue
+ {
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The update trigger used by this queue.
+ public WootingUpdateQueue(IDeviceUpdateTrigger updateTrigger)
+ : base(updateTrigger)
+ {
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ protected override void Update(Dictionary