diff --git a/core-it-suite/src/test/java/org/apache/maven/it/IntegrationTestSuite.java b/core-it-suite/src/test/java/org/apache/maven/it/IntegrationTestSuite.java
index 10951b6..b525a70 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/IntegrationTestSuite.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/IntegrationTestSuite.java
@@ -165,6 +165,7 @@
         suite.addTestSuite( MavenITmng5224InjectedSettings.class );
         suite.addTestSuite( MavenITmng5214DontMapWsdlToJar.class );
         suite.addTestSuite( MavenITmng5175WagonHttpTest.class );
+        suite.addTestSuite( MavenITmng5175WagonHttpTest2.class );
         suite.addTestSuite( MavenITmng5137ReactorResolutionInForkedBuildTest.class );
         suite.addTestSuite( MavenITmng5135AggregatorDepResolutionModuleExtensionTest.class );
         suite.addTestSuite( MavenITmng5096ExclusionAtDependencyWithImpliedClassifierTest.class );
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest.java
index f163f70..2f6f376 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest.java
@@ -48,7 +48,7 @@
 
     public MavenITmng5175WagonHttpTest()
     {
-        super( "[3.0.4,)" ); // 3.0.4+
+        super( "[3.0.4,3.7.0-SNAPSHOT)" ); // 3.0.4+
     }
 
     @Override
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest2.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest2.java
new file mode 100644
index 0000000..5f32f46
--- /dev/null
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng5175WagonHttpTest2.java
@@ -0,0 +1,133 @@
+package org.apache.maven.it;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.it.util.ResourceExtractor;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.NetworkConnector;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-5175">MNG-5175</a>.
+ * test correct integration of wagon http: read time out configuration from settings.xml
+ *
+ *
+ */
+public class MavenITmng5175WagonHttpTest2
+    extends AbstractMavenIntegrationTestCase
+{
+    private Server server;
+
+    private int port;
+
+    public MavenITmng5175WagonHttpTest2()
+    {
+        super( "[3.7.0-SNAPSHOT,)" ); // 3.7.0+
+    }
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        Handler handler = new AbstractHandler()
+        {
+            @Override
+            public void handle( String target, Request baseRequest, HttpServletRequest request,
+                                HttpServletResponse response )
+                throws IOException, ServletException
+            {
+                try
+                {
+                    Thread.sleep( 15 );
+                }
+                catch ( InterruptedException e )
+                {
+                    throw new ServletException( e.getMessage() );
+                }
+                response.setContentType( "text/plain" );
+                response.setStatus( HttpServletResponse.SC_OK );
+                response.getWriter().println( "some content" );
+                response.getWriter().println();
+
+                ( (Request) request ).setHandled( true );
+            }
+        };
+
+        server = new Server( 0 );
+        server.setHandler( handler );
+        server.start();
+        if ( server.isFailed() )
+        {
+            fail( "Couldn't bind the server socket to a free port!" );
+        }
+        port = ( (NetworkConnector) server.getConnectors()[0] ).getLocalPort();
+        System.out.println( "Bound server socket to the port " + port );
+    }
+
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        if ( server != null )
+        {
+            server.stop();
+            server.join();
+        }
+    }
+
+    /**
+     * Test that the read time out from settings is used.
+     * basically use a 1ms time out and wait a bit in the handler
+     */
+    public void testmng5175_ReadTimeOutFromSettings()
+        throws Exception
+    {
+        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-5175" );
+
+        Verifier verifier = newVerifier( testDir.getAbsolutePath() );
+
+        Properties filterProps = new Properties();
+        filterProps.setProperty( "@port@", Integer.toString( port ) );
+
+        verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8", filterProps );
+
+        verifier.addCliOption( "-U" );
+        verifier.addCliOption( "--settings" );
+        verifier.addCliOption( "settings.xml" );
+        verifier.addCliOption( "--fail-never" );
+        verifier.addCliOption( "--errors" );
+        verifier.setMavenDebug( true );
+        verifier.executeGoal( "validate" );
+
+        verifier.verifyTextInLog(
+                "Could not transfer artifact org.apache.maven.its.mng5175:fake-dependency:pom:1.0-SNAPSHOT" );
+        verifier.verifyTextInLog( "Read timed out" );
+        verifier.resetStreams();
+    }
+}
