test case for: https://issues.apache.org/jira/browse/AMQNET-383
diff --git a/src/test/csharp/AMQNET383Test.cs b/src/test/csharp/AMQNET383Test.cs
new file mode 100644
index 0000000..8afe8d3
--- /dev/null
+++ b/src/test/csharp/AMQNET383Test.cs
@@ -0,0 +1,330 @@
+/*
+ * 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.
+ */
+
+/*
+ * The main goal of this test list is to make sure that a producer and a consumer with
+ * separate connections can communicate properly and consitently despite a waiting time
+ * between messages TestStability500WithSleep would be the important test, as a delay of
+ * 30s is executed at each 100 (100, 200, 300, ...).
+ */
+
+using System.Threading;
+using Apache.NMS;
+using Apache.NMS.Util;
+using Apache.NMS.Test;
+using Apache.NMS.Stomp;
+using NUnit.Framework;
+using System;
+
+namespace Apache.NMS.Stomp.Test
+{
+    [TestFixture]
+    public class NMSTester : NMSTestSupport
+    {
+        // TODO set proper configuration parameters
+        private const string destination = "test";
+
+        private static int numberOfMessages = 0;
+        private static IConnection producerConnection = null;
+        private static IConnection consumerConnection = null;
+        private static Thread consumerThread = null;
+        private static Thread producerThread = null;
+        private static long consumerMessageCounter = 0;
+        private static long producerMessageCounter = 0;
+        private static string possibleConsumerException = "";
+        private static string possibleProducerException = "";
+        private static bool consumerReady = false;
+
+        [SetUp]
+        public void Init()
+        {
+            if (producerConnection != null)
+            {
+                producerConnection.Close();
+            }
+            if (consumerConnection != null)
+            {
+                consumerConnection.Close();
+            }
+            if (consumerThread != null)
+            {
+                consumerThread.Abort();
+            }
+            if (producerThread != null)
+            {
+                producerThread.Abort();
+            }
+
+            producerConnection = null;
+            consumerConnection = null;
+            consumerThread = null;
+            producerThread = null;
+
+            producerConnection = CreateConnection();
+            consumerConnection = CreateConnection();
+
+            numberOfMessages = 0;
+            consumerMessageCounter = 0;
+            producerMessageCounter = 0;
+            possibleConsumerException = "";
+            possibleProducerException = "";
+            consumerReady = false;
+            //Giving time for the topic to clear out
+            Thread.Sleep(2500);
+        }
+
+        [TearDown]
+        public void Dispose()
+        {
+            if (producerConnection != null)
+            {
+                producerConnection.Close();
+            }
+            if (consumerConnection != null)
+            {
+                consumerConnection.Close();
+            }
+
+            if (consumerThread != null)
+            {
+                consumerThread.Abort();
+            }
+            if (producerThread != null)
+            {
+                producerThread.Abort();
+            }
+
+            producerConnection = null;
+            consumerConnection = null;
+            consumerThread = null;
+            producerThread = null;
+        }
+
+        [Test]
+        public void TestStability5Continuous()
+        {
+            numberOfMessages = 5;
+
+            consumerThread = new Thread(new ThreadStart(NMSTester.ConsumerThread));
+            consumerThread.Start();
+
+            producerThread = new Thread(new ThreadStart(NMSTester.ProducerThreadContinuous));
+            producerThread.Start();
+
+            Thread.Sleep(100);
+
+            Assert.IsTrue(consumerThread.IsAlive && producerThread.IsAlive);
+
+            while (consumerThread.IsAlive && producerThread.IsAlive)
+            {
+                Thread.Sleep(100);
+            }
+
+            Assert.AreEqual("", possibleConsumerException);
+            Assert.AreEqual("", possibleProducerException);
+            Assert.AreEqual(numberOfMessages, producerMessageCounter);
+            Assert.AreEqual(numberOfMessages, consumerMessageCounter);
+        }
+
+        [Test]
+        public void TestStability50Continuous()
+        {
+            numberOfMessages = 50;
+
+            consumerThread = new Thread(new ThreadStart(NMSTester.ConsumerThread));
+            consumerThread.Start();
+
+            producerThread = new Thread(new ThreadStart(NMSTester.ProducerThreadContinuous));
+            producerThread.Start();
+
+            Thread.Sleep(100);
+
+            Assert.IsTrue(consumerThread.IsAlive && producerThread.IsAlive);
+
+            while (consumerThread.IsAlive && producerThread.IsAlive)
+            {
+                Thread.Sleep(100);
+            }
+
+            Assert.AreEqual("", possibleConsumerException);
+            Assert.AreEqual("", possibleProducerException);
+            Assert.AreEqual(numberOfMessages, producerMessageCounter);
+            Assert.AreEqual(numberOfMessages, consumerMessageCounter);
+        }
+
+        [Test]
+        public void TestStability500Continuous()
+        {
+            numberOfMessages = 500; //At 100,200,300, ... a delay of 30 seconds is executed in the producer to cause an unexpected disconnect, due to a malformed ACK?
+
+            consumerThread = new Thread(new ThreadStart(NMSTester.ConsumerThread));
+            consumerThread.Start();
+
+            producerThread = new Thread(new ThreadStart(NMSTester.ProducerThreadContinuous));
+            producerThread.Start();
+
+            Thread.Sleep(100);
+
+            Assert.IsTrue(consumerThread.IsAlive && producerThread.IsAlive);
+
+            while (consumerThread.IsAlive && producerThread.IsAlive)
+            {
+                Thread.Sleep(100);
+            }
+
+            Assert.AreEqual("", possibleConsumerException);
+            Assert.AreEqual("", possibleProducerException);
+            Assert.AreEqual(numberOfMessages, producerMessageCounter);
+            Assert.AreEqual(numberOfMessages, consumerMessageCounter);
+        }
+
+        [Test]
+        public void TestStability500WithSleep()
+        {
+            numberOfMessages = 500; //At 100,200,300, ... a delay of 30 seconds is executed in the producer to cause an unexpected disconnect, due to a malformed ACK?
+
+            consumerThread = new Thread(new ThreadStart(NMSTester.ConsumerThread));
+            consumerThread.Start();
+
+            producerThread = new Thread(new ThreadStart(NMSTester.ProducerThreadWithSleep));
+            producerThread.Start();
+
+            Thread.Sleep(100);
+
+            Assert.IsTrue(consumerThread.IsAlive && producerThread.IsAlive);
+
+            while (consumerThread.IsAlive && producerThread.IsAlive)
+            {
+                Thread.Sleep(100);
+            }
+
+            Assert.AreEqual("", possibleConsumerException);
+            Assert.AreEqual("", possibleProducerException);
+            Assert.AreEqual(numberOfMessages, producerMessageCounter);
+            Assert.AreEqual(numberOfMessages, consumerMessageCounter);
+        }
+
+        public static void Main(string[] args)
+        {
+
+        }
+
+        #region Consumer
+        private static void ConsumerThread()
+        {
+            ISession session = consumerConnection.CreateSession();
+            IMessageConsumer consumer;
+            IDestination dest = session.GetTopic(destination);
+            consumer = session.CreateConsumer(dest);
+            consumer.Listener += new MessageListener(OnMessage);
+            consumerConnection.ExceptionListener += new ExceptionListener(OnConsumerExceptionListener);
+            consumerConnection.Start();
+
+            consumerReady = true;
+
+            while (true)
+            {
+                Thread.Sleep(100);
+            }
+        }
+
+        private static void OnMessage(IMessage receivedMsg)
+        {
+            consumerMessageCounter++;
+        }
+
+        public static void OnConsumerExceptionListener(Exception ex)
+        {
+            possibleConsumerException = ex.Message;
+            Thread.CurrentThread.Abort();
+        }
+        #endregion Consumer
+
+        #region Producer
+        private static void ProducerThreadWithSleep()
+        {
+            ISession session = producerConnection.CreateSession();
+            IMessageProducer producer;
+
+            IDestination dest = session.GetTopic(destination);
+            producer = session.CreateProducer(dest);
+            producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
+            producerConnection.ExceptionListener += new ExceptionListener(OnProducerExceptionListener);
+            producerConnection.Start();
+
+            ITextMessage message;
+
+            while (!consumerReady)
+            {
+                Thread.Sleep(100);
+            }
+
+            for (int c = 0; c < numberOfMessages; c++)
+            {
+                message = session.CreateTextMessage(c.ToString());
+                message.NMSType = "testType";
+                producer.Send(message);
+                producerMessageCounter++;
+                //Focal point of this test; induce a "long" delay between two messages without any other communication on the topic, Note that thse delays occure only at each 100, and that messages can be sent after the delay before a possible disconnect
+                if ((c + 1) % 100 == 0)
+                {
+                    Thread.Sleep(30000);
+                }
+                else
+                {
+                    Thread.Sleep(10);
+                }
+            }
+        }
+
+        private static void ProducerThreadContinuous()
+        {
+            ISession session = producerConnection.CreateSession();
+            IMessageProducer producer;
+
+            IDestination dest = session.GetTopic(destination);
+            producer = session.CreateProducer(dest);
+            producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
+            producerConnection.ExceptionListener += new ExceptionListener(OnProducerExceptionListener);
+            producerConnection.Start();
+
+            ITextMessage message;
+
+            while (!consumerReady)
+            {
+                Thread.Sleep(100);
+            }
+
+            for (int c = 0; c < numberOfMessages; c++)
+            {
+                message = session.CreateTextMessage(c.ToString());
+                message.NMSType = "testType";
+                producer.Send(message);
+                producerMessageCounter++;
+                Thread.Sleep(10);
+            }
+        }
+
+        public static void OnProducerExceptionListener(Exception ex)
+        {
+            possibleProducerException = ex.Message;
+            Thread.CurrentThread.Abort();
+        }
+        #endregion Producer
+
+    }
+}
\ No newline at end of file