diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs b/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs
new file mode 100644
index 0000000..64cd4aa
--- /dev/null
+++ b/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using log4net;
+using NPSharp.Master.Messages.Data;
+
+namespace NPSharp.Master.Messages.Client
+{
+ ///
+ /// Represents a request message for the master server for an extended dedicated server list.
+ ///
+ [MasterClientMessage("getserversExt")]
+ public class MasterGetServersExtendedMessage : MasterClientMessage
+ {
+ private static readonly ILog Log;
+
+ static MasterGetServersExtendedMessage()
+ {
+ Log = LogManager.GetLogger(typeof (MasterGetServersExtendedMessage));
+ }
+
+ protected override string Serialize()
+ {
+ // I wonder if an extra useless space char at the end is okay in this case
+ return string.Format("{0} {1} {2} {3}", Name, GameName, ProtocolVersion, string.Join(" ", Keywords.Select(k => k.ToString())));
+ }
+
+ protected override void Deserialize(string[] arguments)
+ {
+ GameName = arguments[0];
+ ProtocolVersion = uint.Parse(arguments[1]);
+ foreach (var kw in arguments.Skip(2))
+ {
+ switch (kw.ToLower())
+ {
+ case "empty":
+ Keywords.Add(MasterGetServersExtendedKeywords.Empty);
+ break;
+ case "full":
+ Keywords.Add(MasterGetServersExtendedKeywords.Full);
+ break;
+ case "ipv4":
+ Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion4);
+ break;
+ case "ipv6":
+ Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion6);
+ break;
+ default:
+ Log.WarnFormat("{0}: weird keyword {1}", Name, kw);
+ break;
+ }
+ }
+ }
+
+ ///
+ /// The game for which servers should be fetched
+ ///
+ public string GameName { get; set; }
+
+ ///
+ /// The protocol version of the dedicated servers to search for
+ ///
+ public uint ProtocolVersion { get; set; }
+
+ ///
+ /// Extra keywords to take care of when generating the server list
+ ///
+ public List Keywords { get; set; }
+ }
+}
+
+namespace NPSharp.Master.Messages.Data
+{
+ ///
+ /// Represents keywords for a master server standard serverlist request.
+ ///
+ public enum MasterGetServersExtendedKeywords
+ {
+ Full = 0x01,
+ Empty = 0x02,
+ InternetProtocolVersion4 = 0x04,
+ InternetProtocolVersion6 = 0x08
+ }
+}
\ No newline at end of file
diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs b/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs
new file mode 100644
index 0000000..98e6612
--- /dev/null
+++ b/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using log4net;
+using NPSharp.Master.Messages.Data;
+
+namespace NPSharp.Master.Messages.Client
+{
+ ///
+ /// Represents a request message for the master server for a standard dedicated server list.
+ ///
+ [MasterClientMessage("getservers")]
+ public class MasterGetServersMessage : MasterClientMessage
+ {
+ private static readonly ILog Log;
+
+ static MasterGetServersMessage()
+ {
+ Log = LogManager.GetLogger(typeof (MasterGetServersMessage));
+ }
+
+ protected override string Serialize()
+ {
+ // I wonder if an extra useless space char at the end is okay in this case
+ return string.Format("{0} {1} {2} {3}", Name, GameName, ProtocolVersion, string.Join(" ", Keywords.Select(k => k.ToString())));
+ }
+
+ protected override void Deserialize(string[] arguments)
+ {
+ GameName = arguments[0];
+ ProtocolVersion = uint.Parse(arguments[1]);
+ foreach (var kw in arguments.Skip(2))
+ {
+ switch (kw.ToLower())
+ {
+ case "empty":
+ Keywords.Add(MasterGetServersKeywords.Empty);
+ break;
+ case "full":
+ Keywords.Add(MasterGetServersKeywords.Full);
+ break;
+ default:
+ Log.WarnFormat("{0}: weird keyword {1}", Name, kw);
+ break;
+ }
+ }
+ }
+
+ ///
+ /// The game for which servers should be fetched
+ ///
+ public string GameName { get; set; }
+
+ ///
+ /// The protocol version of the dedicated servers to search for
+ ///
+ public uint ProtocolVersion { get; set; }
+
+ ///
+ /// Extra keywords to take care of when generating the server list
+ ///
+ public List Keywords { get; set; }
+ }
+}
+
+namespace NPSharp.Master.Messages.Data
+{
+ ///
+ /// Represents keywords for a master server standard serverlist request.
+ ///
+ public enum MasterGetServersKeywords
+ {
+ Full = 0x01,
+ Empty = 0x02
+ }
+}
\ No newline at end of file
diff --git a/src/libnpsharp/Master/Messages/MasterClientMessage.cs b/src/libnpsharp/Master/Messages/MasterClientMessage.cs
new file mode 100644
index 0000000..0e972ac
--- /dev/null
+++ b/src/libnpsharp/Master/Messages/MasterClientMessage.cs
@@ -0,0 +1,40 @@
+using System.Collections.Generic;
+using System.Net.Sockets;
+using System.Reflection;
+using System.Text;
+
+namespace NPSharp.Master.Messages
+{
+ public abstract class MasterClientMessage
+ {
+ protected List Properties { get; set; }
+
+ internal MasterClientMessage Deserialize(Socket sock)
+ {
+ // TODO
+ }
+
+ internal byte[] SerializeInternal()
+ {
+ var buffer = new List();
+ buffer.AddRange(Header);
+ buffer.AddRange(Encoding.ASCII.GetBytes(Serialize()));
+ buffer.Add(0x0a); // end of command
+ return buffer.ToArray();
+ }
+
+ protected virtual string Serialize()
+ {
+ return Name;
+ }
+
+ public virtual byte[] Header { get { return new byte[] {0xFF, 0xFF, 0xFF, 0xFF}; } }
+
+ internal string Name
+ {
+ get { return GetType().GetCustomAttribute().Name; }
+ }
+
+ protected abstract void Deserialize(string[] arguments);
+ }
+}
diff --git a/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs b/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs
new file mode 100644
index 0000000..745fc9b
--- /dev/null
+++ b/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace NPSharp.Master.Messages
+{
+ public class MasterClientMessageAttribute : Attribute
+ {
+ public MasterClientMessageAttribute(string name)
+ {
+ Name = name;
+ }
+
+ internal string Name { get; private set; }
+ }
+}
diff --git a/src/libnpsharp/libnpsharp.csproj b/src/libnpsharp/libnpsharp.csproj
index 9a9e1bf..0a1074f 100644
--- a/src/libnpsharp/libnpsharp.csproj
+++ b/src/libnpsharp/libnpsharp.csproj
@@ -63,6 +63,10 @@
+
+
+
+