diff --git a/.travis.yml b/.travis.yml
index 7767232..1c04b32 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,4 +4,4 @@
 dotnet: 2.2.401
 script:
  - dotnet build -p:AppTargetFramework=netcoreapp2.2 -c Release
- - dotnet test ./test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj -f netcoreapp2.2 -c Release
\ No newline at end of file
+ - dotnet test ./test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj -f netcoreapp2.2 -c Release --filter Category!=Windows
\ No newline at end of file
diff --git a/apache-nms-amqp.sln.DotSettings b/apache-nms-amqp.sln.DotSettings
index 69a5afc..8e25730 100644
--- a/apache-nms-amqp.sln.DotSettings
+++ b/apache-nms-amqp.sln.DotSettings
@@ -1,2 +1,3 @@
 ﻿<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
-	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JMS/@EntryIndexedValue">JMS</s:String></wpf:ResourceDictionary>
\ No newline at end of file
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JMS/@EntryIndexedValue">JMS</s:String>
+	<s:Boolean x:Key="/Default/UserDictionary/Words/=Amqp/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
\ No newline at end of file
diff --git a/src/NMS.AMQP/Provider/Amqp/AmqpConnection.cs b/src/NMS.AMQP/Provider/Amqp/AmqpConnection.cs
index 3410eb6..bcdd5a3 100644
--- a/src/NMS.AMQP/Provider/Amqp/AmqpConnection.cs
+++ b/src/NMS.AMQP/Provider/Amqp/AmqpConnection.cs
@@ -71,10 +71,10 @@
             Address address = UriUtil.ToAddress(remoteUri, Info.username, Info.password);
             this.tsc = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
             underlyingConnection = await transport.CreateAsync(address, new AmqpHandler(this)).ConfigureAwait(false);
-            underlyingConnection.AddClosedCallback((sender, error) => Provider.OnConnectionClosed(error));
-            
+            underlyingConnection.AddClosedCallback(OnClosed);
+
             // Wait for connection to be opened
-            await tsc.Task.ConfigureAwait(false);
+            await this.tsc.Task.ConfigureAwait(false);
 
             // Create a Session for this connection that is used for Temporary Destinations
             // and perhaps later on management and advisory monitoring.
@@ -86,6 +86,24 @@
             await connectionSession.Start().ConfigureAwait(false);
         }
 
+        private void OnClosed(IAmqpObject sender, Error error)
+        {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug($"Connection closed. {error}");
+            }
+
+            bool connectionExplicitlyClosed = error == null;
+            if (!connectionExplicitlyClosed)
+            {
+                var exception = ExceptionSupport.GetException(error);
+                if (!this.tsc.TrySetException(exception))
+                {
+                    Provider.OnConnectionClosed(exception);
+                }
+            }
+        }
+
         internal void OnLocalOpen(Open open)
         {
             open.ContainerId = Info.ClientId;
@@ -122,7 +140,7 @@
                     Info.QueuePrefix = queuePrefix;
                 }
 
-                this.tsc.SetResult(true);
+                this.tsc.TrySetResult(true);
                 Provider.FireConnectionEstablished();
             }
         }
diff --git a/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs b/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
index 99330db..80e2fdd 100644
--- a/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
+++ b/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
@@ -116,18 +116,9 @@
             return connection.Start();
         }
 
-        internal void OnConnectionClosed(Error error)
+        internal void OnConnectionClosed(NMSException exception)
         {
-            if (Tracer.IsDebugEnabled)
-            {
-                Tracer.Debug($"Connection closed. {error}");
-            }
-
-            bool connectionExplicitlyClosed = error == null;
-            if (!connectionExplicitlyClosed)
-            {
-                Listener?.OnConnectionFailure(ExceptionSupport.GetException(error));
-            }
+            Listener?.OnConnectionFailure(exception);
         }
 
         internal void FireConnectionEstablished()
diff --git a/src/NMS.AMQP/Provider/Failover/FailoverProvider.cs b/src/NMS.AMQP/Provider/Failover/FailoverProvider.cs
index 3a95a27..89ce95f 100644
--- a/src/NMS.AMQP/Provider/Failover/FailoverProvider.cs
+++ b/src/NMS.AMQP/Provider/Failover/FailoverProvider.cs
@@ -35,13 +35,13 @@
         public static int DEFAULT_INITIAL_RECONNECT_DELAY = 0;
         public static long DEFAULT_RECONNECT_DELAY = 10;
         public static double DEFAULT_RECONNECT_BACKOFF_MULTIPLIER = 2.0d;
-        public static long DEFAULT_MAX_RECONNECT_DELAY = (long)Math.Round(TimeSpan.FromSeconds(30).TotalMilliseconds);
+        public static long DEFAULT_MAX_RECONNECT_DELAY = (long) Math.Round(TimeSpan.FromSeconds(30).TotalMilliseconds);
         public static int DEFAULT_STARTUP_MAX_RECONNECT_ATTEMPTS = UNDEFINED;
         public static int DEFAULT_MAX_RECONNECT_ATTEMPTS = UNDEFINED;
         public static bool DEFAULT_USE_RECONNECT_BACKOFF = true;
         public static int DEFAULT_WARN_AFTER_RECONNECT_ATTEMPTS = 10;
         public static bool DEFAULT_RANDOMIZE_ENABLED = false;
-        
+
         private readonly ReconnectControls reconnectControl;
         private readonly FailoverUriPool uris;
 
@@ -140,7 +140,9 @@
                                 {
                                     provider?.Close();
                                 }
-                                catch { }
+                                catch
+                                {
+                                }
                                 finally
                                 {
                                     provider = null;
@@ -164,7 +166,7 @@
                 {
                     if (provider == null)
                     {
-                        Tracer.Debug($"Connection attempt:[{reconnectControl.ReconnectAttempts}] failed error: {failure.Message}");
+                        Tracer.Debug($"Connection attempt:[{reconnectControl.ReconnectAttempts}] failed error: {failure?.Message}");
                         if (!reconnectControl.IsReconnectAllowed(failure))
                         {
                             ReportReconnectFailure(failure);
@@ -337,7 +339,7 @@
         public Task Recover(Id sessionId)
         {
             CheckClosed();
-            
+
             FailoverRequest request = new FailoverRequest(this, requestTimeout)
             {
                 DoTask = activeProvider => activeProvider.Recover(sessionId),
@@ -404,7 +406,7 @@
         public Task Unsubscribe(string name)
         {
             CheckClosed();
-            
+
             FailoverRequest request = new FailoverRequest(this, SendTimeout)
             {
                 DoTask = activeProvider => activeProvider.Unsubscribe(name),
@@ -524,7 +526,7 @@
                         {
                             failoverRequest.ScheduleTimeout();
                         }
-                    
+
                         TriggerReconnectionAttempt();
 
                         listener?.OnConnectionInterrupted(failedUri);
@@ -646,7 +648,7 @@
                 if (failoverProvider.UseReconnectBackOff && ReconnectAttempts > 1)
                 {
                     // Exponential increment of reconnect delay.
-                    nextReconnectDelay = (long)Math.Round(nextReconnectDelay * failoverProvider.ReconnectBackOffMultiplier);
+                    nextReconnectDelay = (long) Math.Round(nextReconnectDelay * failoverProvider.ReconnectBackOffMultiplier);
                     if (nextReconnectDelay > failoverProvider.MaxReconnectDelay)
                     {
                         nextReconnectDelay = failoverProvider.MaxReconnectDelay;
diff --git a/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs b/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
index cb3f4cc..a3b6306 100644
--- a/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
+++ b/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
@@ -36,7 +36,7 @@
     {
         private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
         
-        [Test, Timeout(20_000), Ignore("Ignore as we cannot detect connection disconnect on Linux.")]
+        [Test, Timeout(20_000), Category("Windows")]
         public void TestFailoverHandlesDropThenRejectionCloseAfterConnect()
         {
             using (TestAmqpPeer originalPeer = new TestAmqpPeer())
@@ -62,7 +62,6 @@
 
                 long ird = 0;
                 long rd = 2000;
-                DateTime start = DateTime.UtcNow;
 
                 NmsConnection connection = EstablishAnonymousConnection("failover.initialReconnectDelay=" + ird + "&failover.reconnectDelay=" + rd + "&failover.maxReconnectAttempts=10", originalPeer,
                     rejectingPeer, finalPeer);
@@ -96,15 +95,7 @@
 
                 rejectingPeer.WaitForAllMatchersToComplete(2000);
 
-                Assert.True(finalConnected.WaitOne(TimeSpan.FromSeconds(5)), "Should connect to final peer");
-                DateTime end = DateTime.UtcNow;
-
-                long margin = 2000;
-
-                // TODO: It is failing because, we are not handling rejected connection properly, when socket connection is established
-                // but broker replies with amqp:connection-establishment-failed. Initially connection is treated as successful, which resets
-                // the attempts counter. As a result next connect attempt is being made without any delay.
-                // Assert.That((end - start).TotalMilliseconds, Is.GreaterThanOrEqualTo(ird + rd).And.LessThanOrEqualTo(ird + rd + margin), "Elapsed time outwith expected range for reconnect");
+                Assert.True(finalConnected.WaitOne(TimeSpan.FromSeconds(10)), "Should connect to final peer");
 
                 finalPeer.ExpectClose();
                 connection.Close();
diff --git a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
index f1981e5..71f7f02 100644
--- a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
+++ b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
@@ -156,7 +156,7 @@
 
         public void ExpectOpen(Fields serverProperties = null)
         {
-            ExpectOpen(desiredCapabilities: DEFAULT_DESIRED_CAPABILITIES, serverCapabilities: new[] { SymbolUtil.OPEN_CAPABILITY_SOLE_CONNECTION_FOR_CONTAINER }, serverProperties: null);
+            ExpectOpen(desiredCapabilities: DEFAULT_DESIRED_CAPABILITIES, serverCapabilities: new[] { SymbolUtil.OPEN_CAPABILITY_SOLE_CONNECTION_FOR_CONTAINER }, serverProperties: serverProperties);
         }
 
         public void ExpectOpen(Symbol[] serverCapabilities, Fields serverProperties)
@@ -190,7 +190,7 @@
         public void RejectConnect(Symbol errorType, string errorMessage)
         {
             // Expect a connection, establish through the SASL negotiation and sending of the Open frame
-            Fields serverProperties = new Fields { { SymbolUtil.CONNECTION_ESTABLISH_FAILED, true } };
+            Fields serverProperties = new Fields { { SymbolUtil.CONNECTION_ESTABLISH_FAILED, SymbolUtil.BOOLEAN_TRUE } };
             ExpectSaslAnonymous();
             ExpectOpen(serverProperties: serverProperties);
 
@@ -198,12 +198,10 @@
             IMatcher lastMatcher = GetLastMatcher();
             lastMatcher.WithOnComplete(context =>
             {
-                var close = new Close { Error = new Error(errorType) { Description = errorMessage } };
+                var close = new Close { Error = new Error(errorType) { Description = errorMessage} };
                 context.SendCommand(CONNECTION_CHANNEL, close);
             });
 
-            AddMatcher(new FrameMatcher<Begin>());
-
             var closeMatcher = new FrameMatcher<Close>()
                 .WithAssertion(close => Assert.IsNull(close.Error));
 
