Index: src/Appender/EventLogAppender.cs
===================================================================
--- src/Appender/EventLogAppender.cs	(revision 1158530)
+++ src/Appender/EventLogAppender.cs	(working copy)
@@ -43,6 +43,11 @@
 	/// set using the <c>EventLogEventID</c> property (<see cref="LoggingEvent.Properties"/>)
 	/// on the <see cref="LoggingEvent"/>.
 	/// </para>
+    /// <para>
+    /// The <c>Category</c> of the event log entry can be
+	/// set using the <c>EventLogCategory</c> property (<see cref="LoggingEvent.Properties"/>)
+	/// on the <see cref="LoggingEvent"/>.
+	/// </para>
 	/// <para>
 	/// There is a limit of 32K characters for an event log message
 	/// </para>
@@ -331,35 +336,9 @@
 			//
 			// Write the resulting string to the event log system
 			//
-			int eventID = 0;
+            int eventID = GetIntegerFromProperty("EventID", loggingEvent);
+            short category = GetShortFromProperty("Category", loggingEvent); 
 
-			// Look for the EventLogEventID property
-			object eventIDPropertyObj = loggingEvent.LookupProperty("EventID");
-			if (eventIDPropertyObj != null)
-			{
-				if (eventIDPropertyObj is int)
-				{
-					eventID = (int)eventIDPropertyObj;
-				}
-				else
-				{
-					string eventIDPropertyString = eventIDPropertyObj as string;
-					if (eventIDPropertyString != null && eventIDPropertyString.Length > 0)
-					{
-						// Read the string property into a number
-						int intVal;
-						if (SystemInfo.TryParse(eventIDPropertyString, out intVal))
-						{
-							eventID = intVal;
-						}
-						else
-						{
-							ErrorHandler.Error("Unable to parse event ID property [" + eventIDPropertyString + "].");
-						}
-					}
-				}
-			}
-
 			// Write to the event log
 			try
 			{
@@ -375,15 +354,80 @@
 
 				using(SecurityContext.Impersonate(this))
 				{
-					EventLog.WriteEntry(m_applicationName, eventTxt, entryType, eventID);
+					EventLog.WriteEntry(m_applicationName, eventTxt, entryType, eventID, category);
 				}
 			}
 			catch(Exception ex)
 			{
 				ErrorHandler.Error("Unable to write to event log [" + m_logName + "] using source [" + m_applicationName + "]", ex);
 			}
-		} 
+		}
 
+        private int GetIntegerFromProperty(string propertyName, LoggingEvent loggingEvent)
+        {
+            int intValue = 0;
+
+            // Look for the property
+            object propertyObj = loggingEvent.LookupProperty(propertyName);
+            if (propertyObj != null)
+            {
+                if (propertyObj is int)
+                {
+                    intValue = (int)propertyObj;
+                }
+                else
+                {
+                    string propertyString = propertyObj as string;
+                    if (propertyString != null && propertyString.Length > 0)
+                    {
+                        // Read the string property into a number
+                        int intVal;
+                        if (SystemInfo.TryParse(propertyString, out intVal))
+                        {
+                            intValue = intVal;
+                        }
+                        else
+                        {
+                            ErrorHandler.Error("Unable to parse " + propertyName + " property [" + propertyString + "].");
+                        }
+                    }
+                }
+            }
+            return intValue;
+        } 
+
+        private short GetShortFromProperty(string propertyName, LoggingEvent loggingEvent)
+        {
+            short shortValue = 0;
+
+            // Look for the property
+            object propertyObj = loggingEvent.LookupProperty(propertyName);
+            if (propertyObj != null)
+            {
+                if (propertyObj is short)
+                {
+                    shortValue = (short)propertyObj;
+                }
+                else
+                {
+                    string propertyString = propertyObj as string;
+                    if (propertyString != null && propertyString.Length > 0)
+                    {
+                        // Read the string property shorto a number
+                        short shortVal;
+                        if (SystemInfo.TryParse(propertyString, out shortVal))
+                        {
+                            shortValue = shortVal;
+                        }
+                        else
+                        {
+                            ErrorHandler.Error("Unable to parse " + propertyName + " property [" + propertyString + "].");
+                        }
+                    }
+                }
+            }
+            return shortValue;
+        } 
 		/// <summary>
 		/// This appender requires a <see cref="Layout"/> to be set.
 		/// </summary>
Index: src/Util/SystemInfo.cs
===================================================================
--- src/Util/SystemInfo.cs	(revision 1158530)
+++ src/Util/SystemInfo.cs	(working copy)
@@ -788,6 +788,54 @@
 		}
 
 		/// <summary>
+		/// Parse a string into an <see cref="Int16"/> value
+		/// </summary>
+		/// <param name="s">the string to parse</param>
+		/// <param name="val">out param where the parsed value is placed</param>
+		/// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+		/// <remarks>
+		/// <para>
+		/// Attempts to parse the string into an integer. If the string cannot
+		/// be parsed then this method returns <c>false</c>. The method does not throw an exception.
+		/// </para>
+		/// </remarks>
+		public static bool TryParse(string s, out short val)
+		{
+#if NETCF
+			val = 0;
+			try
+			{
+				val = short.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
+				return true;
+			}
+			catch
+			{
+			}
+
+			return false;
+#else
+			// Initialise out param
+			val = 0;
+
+			try
+			{
+				double doubleVal;
+				if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
+				{
+					val = Convert.ToInt16(doubleVal);
+					return true;
+				}
+			}
+			catch
+			{
+				// Ignore exception, just return false
+			}
+
+			return false;
+#endif
+		}
+
+		/// <summary>
 		/// Parse a string into an <see cref="Int64"/> value
 		/// </summary>
 		/// <param name="s">the string to parse</param>
