diff --git a/nmsprovider-test.config b/nmsprovider-test.config
index 01f01f8..1d7bcb2 100644
--- a/nmsprovider-test.config
+++ b/nmsprovider-test.config
@@ -17,4 +17,19 @@
 -->
 <configuration>
     <defaultURI value="stomp:tcp://${activemqhost}:61613"/>
+  <InvalidCredentials-BogusUser value="stomp:failover:tcp://${activemqhost}:61613">
+    <factoryParams>
+      <param type="string" value="InvalidCredentialsTestClient"/>
+    </factoryParams>
+    <userName value="BogusUser"/>
+    <passWord value="BogusPassword"/>
+  </InvalidCredentials-BogusUser>
+
+  <InvalidCredentials-AuthenticUser value="stomp:failover:tcp://${activemqhost}:61613">
+    <factoryParams>
+      <param type="string" value="InvalidCredentialsTestClient"/>
+    </factoryParams>
+    <userName value="system"/>
+    <passWord value="manager"/>
+  </InvalidCredentials-AuthenticUser>
 </configuration>
diff --git a/src/main/csharp/Connection.cs b/src/main/csharp/Connection.cs
index 942b44b..5643d21 100755
--- a/src/main/csharp/Connection.cs
+++ b/src/main/csharp/Connection.cs
@@ -18,6 +18,7 @@
 using System;
 using System.Collections;
 using System.Collections.Specialized;
+using System.Reflection;
 using System.Threading;
 using Apache.NMS.Stomp.Commands;
 using Apache.NMS.Stomp.Threads;
@@ -74,11 +75,7 @@
             this.brokerUri = connectionUri;
             this.clientIdGenerator = clientIdGenerator;
 
-            this.transport = transport;
-            this.transport.Command = new CommandHandler(OnCommand);
-            this.transport.Exception = new ExceptionHandler(OnTransportException);
-            this.transport.Interrupted = new InterruptedHandler(OnTransportInterrupted);
-            this.transport.Resumed = new ResumedHandler(OnTransportResumed);
+			SetTransport(transport);
 
             ConnectionId id = new ConnectionId();
             id.Value = CONNECTION_ID_GENERATOR.GenerateId();
@@ -310,7 +307,16 @@
 
         #endregion
 
-        /// <summary>
+		private void SetTransport(ITransport newTransport)
+		{
+			this.transport = newTransport;
+			this.transport.Command = new CommandHandler(OnCommand);
+			this.transport.Exception = new ExceptionHandler(OnTransportException);
+			this.transport.Interrupted = new InterruptedHandler(OnTransportInterrupted);
+			this.transport.Resumed = new ResumedHandler(OnTransportResumed);
+		}
+
+		/// <summary>
         /// Starts asynchronous message delivery of incoming messages for this connection.
         /// Synchronous delivery is unaffected.
         /// </summary>
@@ -448,7 +454,7 @@
                 }
                 catch(Exception ex)
                 {
-                    Tracer.ErrorFormat("Error during connection close: {0}", ex);
+                    Tracer.ErrorFormat("Error during connection close: {0}", ex.Message);
                 }
                 finally
                 {
@@ -583,13 +589,34 @@
                                 {
                                     if(null != transport)
                                     {
-                                        // Send the connection and see if an ack/nak is returned.
+										// Make sure the transport is started.
+										if(!this.transport.IsStarted)
+										{
+											this.transport.Start();
+										}
+										
+										// Send the connection and see if an ack/nak is returned.
                                         Response response = transport.Request(this.info, this.RequestTimeout);
                                         if(!(response is ExceptionResponse))
                                         {
                                             connected.Value = true;
                                         }
-                                    }
+										else
+										{
+											ExceptionResponse error = response as ExceptionResponse;
+											NMSException exception = CreateExceptionFromBrokerError(error.Exception);
+											if(exception is InvalidClientIDException)
+											{
+												// This is non-recoverable.
+												// Shutdown the transport connection, and re-create it, but don't start it.
+												// It will be started if the connection is re-attempted.
+												this.transport.Stop();
+												ITransport newTransport = TransportFactory.CreateTransport(this.brokerUri);
+												SetTransport(newTransport);
+												throw exception;
+											}
+										}
+									}
                                 }
                                 catch
                                 {
@@ -664,7 +691,7 @@
             }
             else
             {
-                Tracer.Error("Unknown command: " + command);
+                Tracer.ErrorFormat("Unknown command: {0}", command);
             }
         }
 
@@ -717,7 +744,7 @@
                 }
                 else
                 {
-                    Tracer.Debug("Async exception with no exception listener: " + error);
+                    Tracer.DebugFormat("Async exception with no exception listener: {0}", error.Message);
                 }
             }
         }
@@ -753,7 +780,7 @@
             }
             catch(Exception ex)
             {
-                Tracer.Debug("Caught Exception While disposing of Transport: " + ex);
+                Tracer.DebugFormat("Caught Exception While disposing of Transport: {0}", ex.Message);
             }
 
             IList sessionsCopy = null;
@@ -772,7 +799,7 @@
                 }
                 catch(Exception ex)
                 {
-                    Tracer.Debug("Caught Exception While disposing of Sessions: " + ex);
+                    Tracer.DebugFormat("Caught Exception While disposing of Sessions: {0}", ex.Message);
                 }
             }
         }
@@ -784,7 +811,7 @@
             this.transportInterruptionProcessingComplete = new CountDownLatch(dispatchers.Count);
             if(Tracer.IsDebugEnabled)
             {
-                Tracer.Debug("transport interrupted, dispatchers: " + dispatchers.Count);
+                Tracer.DebugFormat("transport interrupted, dispatchers: {0}", dispatchers.Count);
             }
 
             foreach(Session session in this.sessions)
@@ -880,8 +907,8 @@
             {
                 if(!closed.Value && cdl.Remaining > 0)
                 {
-                    Tracer.Warn("dispatch paused, waiting for outstanding dispatch interruption " +
-                                "processing (" + cdl.Remaining + ") to complete..");
+                    Tracer.WarnFormat("dispatch paused, waiting for outstanding dispatch interruption " +
+								"processing ({0}) to complete..", cdl.Remaining);
                     cdl.await(TimeSpan.FromSeconds(10));
                 }
             }
@@ -895,5 +922,73 @@
                 cdl.countDown();
             }
         }
-    }
+
+		private NMSException CreateExceptionFromBrokerError(BrokerError brokerError)
+		{
+			String exceptionClassName = brokerError.ExceptionClass;
+
+			if(String.IsNullOrEmpty(exceptionClassName))
+			{
+				return new BrokerException(brokerError);
+			}
+
+			NMSException exception = null;
+			String message = brokerError.Message;
+
+			// We only create instances of exceptions from the NMS API
+			Assembly nmsAssembly = Assembly.GetAssembly(typeof(NMSException));
+
+			// First try and see if it's one we populated ourselves in which case
+			// it will have the correct namespace and exception name.
+			Type exceptionType = nmsAssembly.GetType(exceptionClassName, false, true);
+
+			// Exceptions from the broker don't have the same namespace, so we
+			// trim that and try using the NMS namespace to see if we can get an
+			// NMSException based version of the same type.  We have to convert
+			// the JMS prefixed exceptions to NMS also.
+			if(null == exceptionType)
+			{
+				if(exceptionClassName.StartsWith("java.lang.SecurityException"))
+				{
+					exceptionClassName = "Apache.NMS.InvalidClientIDException";
+				}
+				else if(!exceptionClassName.StartsWith("Apache.NMS"))
+				{
+					string transformClassName;
+
+					if(exceptionClassName.Contains("."))
+					{
+						int pos = exceptionClassName.LastIndexOf(".");
+						transformClassName = exceptionClassName.Substring(pos + 1).Replace("JMS", "NMS");
+					}
+					else
+					{
+						transformClassName = exceptionClassName;
+					}
+
+					exceptionClassName = "Apache.NMS." + transformClassName;
+				}
+
+				exceptionType = nmsAssembly.GetType(exceptionClassName, false, true);
+			}
+
+			if(exceptionType != null)
+			{
+				object[] args = null;
+				if(!String.IsNullOrEmpty(message))
+				{
+					args = new object[1];
+					args[0] = message;
+				}
+
+				exception = Activator.CreateInstance(exceptionType, args) as NMSException;
+			}
+			else
+			{
+				exception = new BrokerException(brokerError);
+			}
+
+			return exception;
+		}
+	}
 }
diff --git a/src/main/csharp/ConnectionFactory.cs b/src/main/csharp/ConnectionFactory.cs
index 608fa21..b2c3309 100755
--- a/src/main/csharp/ConnectionFactory.cs
+++ b/src/main/csharp/ConnectionFactory.cs
@@ -118,8 +118,6 @@
                     connection.DefaultClientId = this.clientId;
                 }
 
-                connection.ITransport.Start();
-
                 return connection;
             }
             catch(NMSException e)
diff --git a/src/main/csharp/State/ConnectionState.cs b/src/main/csharp/State/ConnectionState.cs
index c39d67f..8fdd42e 100644
--- a/src/main/csharp/State/ConnectionState.cs
+++ b/src/main/csharp/State/ConnectionState.cs
@@ -48,40 +48,52 @@
 		{
 			get
 			{
-				ConsumerState consumerState;
-				
-				if(consumers.TryGetValue(id, out consumerState))
-				{
-					return consumerState;
-				}
+				ConsumerState consumerState = null;
+
+				consumers.TryGetValue(id, out consumerState);
 				
 #if DEBUG
-				// Useful for dignosing missing consumer ids
-				string consumerList = string.Empty;
-				foreach(ConsumerId consumerId in consumers.Keys)
+				if(null == consumerState)
 				{
-					consumerList += consumerId.ToString() + "\n";
+					// Useful for dignosing missing consumer ids
+					string consumerList = string.Empty;
+					foreach(ConsumerId consumerId in consumers.Keys)
+					{
+						consumerList += consumerId.ToString() + "\n";
+					}
+
+					System.Diagnostics.Debug.Assert(false,
+						string.Format("Consumer '{0}' did not exist in the consumers collection.\n\nConsumers:-\n{1}", id, consumerList));
 				}
-				
-				System.Diagnostics.Debug.Assert(false,
-					string.Format("Consumer '{0}' did not exist in the consumers collection.\n\nConsumers:-\n{1}", id, consumerList));
 #endif
-				return null;
+				return consumerState;
 			}
 		}
 
 		public void addConsumer(ConsumerInfo info)
 		{
 			checkShutdown();
-			consumers.Add(info.ConsumerId, new ConsumerState(info));
+
+			ConsumerState consumerState = new ConsumerState(info);
+
+			if(consumers.ContainsKey(info.ConsumerId))
+			{
+				consumers[info.ConsumerId] = consumerState;
+			}
+			else
+			{
+				consumers.Add(info.ConsumerId, consumerState);
+			}
 		}
 
 		public ConsumerState removeConsumer(ConsumerId id)
 		{
 			ConsumerState ret = null;
-			
-			consumers.TryGetValue(id, out ret);
-			consumers.Remove(id);
+
+			if(consumers.TryGetValue(id, out ret))
+			{
+				consumers.Remove(id);
+			}
 			return ret;
 		}
 
diff --git a/src/main/csharp/State/SynchronizedObjects.cs b/src/main/csharp/State/SynchronizedObjects.cs
index 2795503..f082d5c 100644
--- a/src/main/csharp/State/SynchronizedObjects.cs
+++ b/src/main/csharp/State/SynchronizedObjects.cs
@@ -222,5 +222,21 @@
 				return _dictionary.Remove(v);
 			}
 		}
+
+		public bool ContainsKey(TKey k)
+		{
+			lock(((ICollection) _dictionary).SyncRoot)
+			{
+				return _dictionary.ContainsKey(k);
+			}
+		}
+
+		public bool ContainsValue(TValue v)
+		{
+			lock(((ICollection) _dictionary).SyncRoot)
+			{
+				return _dictionary.ContainsValue(v);
+			}
+		}
 	}
 }
diff --git a/src/main/csharp/Transport/InactivityMonitor.cs b/src/main/csharp/Transport/InactivityMonitor.cs
index 7a2071d..2bb7592 100644
--- a/src/main/csharp/Transport/InactivityMonitor.cs
+++ b/src/main/csharp/Transport/InactivityMonitor.cs
@@ -90,7 +90,7 @@
         {
             this.instanceId = ++id;
             this.localWireFormatInfo = wireFormat;
-            Tracer.Debug("Creating Inactivity Monitor: " + instanceId);
+            Tracer.DebugFormat("Creating Inactivity Monitor: {0}", instanceId);
         }
 
         ~InactivityMonitor()
@@ -280,7 +280,7 @@
         {
             if(failed.CompareAndSet(false, true) && !this.disposing)
             {
-                Tracer.Debug("Exception received in the Inactivity Monitor: " + command.ToString());
+                Tracer.DebugFormat("Exception received in the Inactivity Monitor: {0}", command.Message);
                 StopMonitorThreads();
                 base.OnException(sender, command);
             }
diff --git a/src/test/csharp/AMQNET383Test.cs b/src/test/csharp/AMQNET383Test.cs
index e93c801..93b5645 100644
--- a/src/test/csharp/AMQNET383Test.cs
+++ b/src/test/csharp/AMQNET383Test.cs
@@ -33,7 +33,7 @@
     public class NMSTestStability : NMSTestSupport
     {
         // TODO set proper configuration parameters
-        private const string destination = "test";
+        private const string destination = "TEST.Stability";
 
         private static int numberOfMessages = 0;
         private static IConnection producerConnection = null;
diff --git a/src/test/csharp/Commands/MessageTest.cs b/src/test/csharp/Commands/MessageTest.cs
index e6e6810..c142007 100755
--- a/src/test/csharp/Commands/MessageTest.cs
+++ b/src/test/csharp/Commands/MessageTest.cs
@@ -44,8 +44,8 @@
         {
             this.nmsMessageID = "testid";
             this.nmsCorrelationID = "testcorrelationid";
-            this.nmsDestination = new Topic("test.topic");
-            this.nmsReplyTo = new TempTopic("test.replyto.topic:001");
+            this.nmsDestination = new Topic("TEST.Message");
+			this.nmsReplyTo = new TempTopic("TEST.Message.replyto.topic:001");
             this.nmsDeliveryMode = MsgDeliveryMode.NonPersistent;
             this.nmsRedelivered = true;
             this.nmsType = "test type";
diff --git a/src/test/csharp/InvalidCredentialsTest.cs b/src/test/csharp/InvalidCredentialsTest.cs
new file mode 100644
index 0000000..9b2e3a9
--- /dev/null
+++ b/src/test/csharp/InvalidCredentialsTest.cs
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Apache.NMS.Test;
+using NUnit.Framework;
+
+namespace Apache.NMS.Stomp.Test
+{
+	[TestFixture]
+	public class InvalidCredentialsTest : NMSTestSupport
+	{
+		[SetUp]
+		public override void SetUp()
+		{
+			base.SetUp();
+		}
+
+		[TearDown]
+		public override void TearDown()
+		{
+			base.TearDown();
+		}
+
+		// Maximum time to run is 20 seconds.
+		[Test] //, Timeout(20000)]
+		public void TestRestartInvalidCredentialsWithFailover()
+		{
+			// To run this test successfully, the broker must have secure login enabled.
+			// This test will attempt to login to the server using invalid credentials.
+			// It should not connect, and should not go into failover retry loop.
+			// It will then attempt to login with correct credentials, and it should be succcessful on second attempt.
+			Assert.IsTrue(CreateNMSFactory("InvalidCredentials-BogusUser"));
+			using(IConnection connection = CreateConnection())
+			{
+				Assert.Throws(typeof(InvalidClientIDException), () => { connection.Start(); }, "You may not have enabled credential login on the broker.  Credentials must be enabled for this test to pass.");
+			}
+
+			// Now connect with a valid user account.
+			Assert.IsTrue(CreateNMSFactory("InvalidCredentials-AuthenticUser"));
+			using(IConnection connection = CreateConnection())
+			{
+				Assert.DoesNotThrow(() => { connection.Start(); }, "You may not have set the InvalidCredentials-AuthenticUser node in the nmsprovider-test.config file.");
+			}
+		}
+	}
+}
diff --git a/src/test/csharp/NMSSessionRecoverTest.cs b/src/test/csharp/NMSSessionRecoverTest.cs
index 9d47826..b0beafc 100644
--- a/src/test/csharp/NMSSessionRecoverTest.cs
+++ b/src/test/csharp/NMSSessionRecoverTest.cs
@@ -57,42 +57,42 @@
         [Test]
         public void TestQueueSynchRecover()
         {
-            destination = new Queue("Queue-" + DateTime.Now.Ticks);
+            destination = new Queue("TEST.Queue-" + DateTime.Now.Ticks);
             DoTestSynchRecover();
         }
 
         [Test]
         public void TestQueueAsynchRecover()
         {
-            destination = new Queue("Queue-" + DateTime.Now.Ticks);
+			destination = new Queue("TEST.Queue-" + DateTime.Now.Ticks);
             DoTestAsynchRecover();
         }
 
         [Test]
         public void TestTopicSynchRecover()
         {
-            destination = new Topic("Topic-" + DateTime.Now.Ticks);
+			destination = new Topic("TEST.Topic-" + DateTime.Now.Ticks);
             DoTestSynchRecover();
         }
 
         [Test]
         public void TestTopicAsynchRecover()
         {
-            destination = new Topic("Topic-" + DateTime.Now.Ticks);
+			destination = new Topic("TEST.Topic-" + DateTime.Now.Ticks);
             DoTestAsynchRecover();
         }
 
         [Test]
         public void TestQueueAsynchRecoverWithAutoAck()
         {
-            destination = new Queue("Queue-" + DateTime.Now.Ticks);
+			destination = new Queue("TEST.Queue-" + DateTime.Now.Ticks);
             DoTestAsynchRecoverWithAutoAck();
         }
 
         [Test]
         public void TestTopicAsynchRecoverWithAutoAck()
         {
-            destination = new Topic("Topic-" + DateTime.Now.Ticks);
+			destination = new Topic("TEST.Topic-" + DateTime.Now.Ticks);
             DoTestAsynchRecoverWithAutoAck();
         }
 
diff --git a/src/test/csharp/StompQueueTransactionTest.cs b/src/test/csharp/StompQueueTransactionTest.cs
index dfc4b47..d9638fa 100755
--- a/src/test/csharp/StompQueueTransactionTest.cs
+++ b/src/test/csharp/StompQueueTransactionTest.cs
@@ -28,7 +28,7 @@
     public class StompQueueTransactionTest : StompTransactionTestSupport
     {
         public const String CLIENT_ID = "QueueTransactionTest";
-        public const String DESTINATION_NAME = "QueueTransactionTestDestination";
+		public const String DESTINATION_NAME = "TEST.QueueTransactionTest";
 
         protected override bool Topic
         {
diff --git a/src/test/csharp/StompRedeliveryPolicyTest.cs b/src/test/csharp/StompRedeliveryPolicyTest.cs
index 2f2005c..9ac065a 100755
--- a/src/test/csharp/StompRedeliveryPolicyTest.cs
+++ b/src/test/csharp/StompRedeliveryPolicyTest.cs
@@ -29,7 +29,7 @@
     [TestFixture]
     public class StompRedeliveryPolicyTest : NMSTestSupport
     {
-        private const string DESTINATION_NAME = "RedeliveryPolicyTestDest";
+		private const string DESTINATION_NAME = "TEST.RedeliveryPolicyTestDest";
 
         [Test]
         public void TestExponentialRedeliveryPolicyDelaysDeliveryOnRollback()
diff --git a/src/test/csharp/StompTopicTransactionTest.cs b/src/test/csharp/StompTopicTransactionTest.cs
index 2ebbab4..a146e5b 100755
--- a/src/test/csharp/StompTopicTransactionTest.cs
+++ b/src/test/csharp/StompTopicTransactionTest.cs
@@ -28,7 +28,7 @@
     public class StompTopicTransactionTest : StompTransactionTestSupport
     {
         public const String CLIENT_ID = "TopicTransactionTest";
-        public const String DESTINATION_NAME = "StompTopicTransactionTestDestination";
+		public const String DESTINATION_NAME = "TEST.StompTopicTransactionTestDestination";
         public const String SUBSCRIPTION_NAME = "TopicTransactionTest";
 
         protected override bool Topic
diff --git a/vs2008-stomp-test.csproj b/vs2008-stomp-test.csproj
index d72ea36..d93579e 100644
--- a/vs2008-stomp-test.csproj
+++ b/vs2008-stomp-test.csproj
@@ -55,17 +55,20 @@
     <NoWarn>3016</NoWarn>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Apache.NMS, Version=1.6.0.2963, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-2.0\Apache.NMS.dll</HintPath>
+    </Reference>
+    <Reference Include="Apache.NMS.Test, Version=1.6.0.2963, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-2.0\Apache.NMS.Test.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework, Version=2.5.8.10295, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\NUnit\net-2.0\nunit.framework.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Xml" />
-    <Reference Include="nunit.framework">
-      <HintPath>lib\NUnit\mono-2.0\nunit.framework.dll</HintPath>
-    </Reference>
-    <Reference Include="Apache.NMS.Test">
-      <HintPath>lib\Apache.NMS\mono-2.0\Apache.NMS.Test.dll</HintPath>
-    </Reference>
-    <Reference Include="Apache.NMS">
-      <HintPath>lib\Apache.NMS\mono-2.0\Apache.NMS.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
@@ -100,6 +103,7 @@
   </ProjectExtensions>
   <ItemGroup>
     <Compile Include="src\test\csharp\AMQNET383Test.cs" />
+    <Compile Include="src\test\csharp\InvalidCredentialsTest.cs" />
     <Compile Include="src\test\csharp\StompHelperTest.cs" />
     <Compile Include="src\test\csharp\StompRedeliveryPolicyTest.cs" />
     <Compile Include="src\test\csharp\Threads\CompositeTaskRunnerTest.cs" />
diff --git a/vs2008-stomp.csproj b/vs2008-stomp.csproj
index 4f87e60..740707d 100644
--- a/vs2008-stomp.csproj
+++ b/vs2008-stomp.csproj
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8"?>
+﻿<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{AA51947C-1370-44DC-8692-1C8EFC5945F7}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -53,11 +53,12 @@
     <DefineConstants>TRACE;NET,NET_2_0</DefineConstants>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Apache.NMS, Version=1.6.0.2963, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>lib\Apache.NMS\net-2.0\Apache.NMS.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Xml" />
-    <Reference Include="Apache.NMS">
-      <HintPath>lib\Apache.NMS\mono-2.0\Apache.NMS.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
