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 86abcbc..2bcca2b 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
@@ -374,6 +374,7 @@
         suite.addTestSuite( MavenITmng4008MergedFilterOrderTest.class );
         suite.addTestSuite( MavenITmng4007PlatformFileSeparatorTest.class );
         suite.addTestSuite( MavenITmng4005UniqueDependencyKeyTest.class );
+        suite.addTestSuite( MavenITmng4005UniqueDependencyKey34Test.class );
         suite.addTestSuite( MavenITmng4000MultiPluginExecutionsTest.class );
         suite.addTestSuite( MavenITmng3998PluginExecutionConfigTest.class );
         suite.addTestSuite( MavenITmng3991ValidDependencyScopeTest.class );
@@ -447,6 +448,7 @@
         suite.addTestSuite( MavenITmng3724ExecutionProjectSyncTest.class );
         suite.addTestSuite( MavenITmng3723ConcreteParentProjectTest.class );
         suite.addTestSuite( MavenITmng3719PomExecutionOrderingTest.class );
+        suite.addTestSuite( MavenITmng3719PomExecutionOrdering34Test.class );
         suite.addTestSuite( MavenITmng3716AggregatorForkingTest.class );
         suite.addTestSuite( MavenITmng3714ToolchainsCliOptionTest.class );
         suite.addTestSuite( MavenITmng3710PollutedClonedPluginsTest.class );
@@ -596,6 +598,7 @@
         suite.addTestSuite( MavenITmng1751ForcedMetadataUpdateDuringDeploymentTest.class );
         suite.addTestSuite( MavenITmng1703PluginMgmtDepInheritanceTest.class );
         suite.addTestSuite( MavenITmng1701DuplicatePluginTest.class );
+        suite.addTestSuite( MavenITmng1701DuplicatePlugin34Test.class );
         suite.addTestSuite( MavenITmng1493NonStandardModulePomNamesTest.class );
         suite.addTestSuite( MavenITmng1491ReactorArtifactIdCollisionTest.class );
         suite.addTestSuite( MavenITmng1415QuotedSystemPropertiesTest.class );
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng1701DuplicatePlugin34Test.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng1701DuplicatePlugin34Test.java
new file mode 100644
index 0000000..188d552
--- /dev/null
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng1701DuplicatePlugin34Test.java
@@ -0,0 +1,70 @@
+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 java.io.File;
+
+/**
+ * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-1701">MNG-1701</a>.
+ *
+ * @author Benjamin Bentmann
+ */
+public class MavenITmng1701DuplicatePlugin34Test
+    extends AbstractMavenIntegrationTestCase
+{
+
+    public MavenITmng1701DuplicatePlugin34Test()
+    {
+        super( "[3.4,)" );
+    }
+
+    /**
+     * Verify that duplicate plugin declarations cause an error.
+     */
+    public void testit()
+        throws Exception
+    {
+        Verifier verifier = null;
+
+        try
+        {
+            File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-1701" );
+
+            verifier = newVerifier( testDir.getAbsolutePath() );
+            verifier.setAutoclean( false );
+            verifier.executeGoal( "validate" );
+            fail( "Expected 'VerificationException' due to duplicate plugin declarations not thrown." );
+        }
+        catch ( final VerificationException e )
+        {
+            // Expected.
+        }
+        finally
+        {
+            if ( verifier != null )
+            {
+                verifier.resetStreams();
+            }
+        }
+    }
+
+}
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3719PomExecutionOrdering34Test.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3719PomExecutionOrdering34Test.java
new file mode 100644
index 0000000..00295ab
--- /dev/null
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3719PomExecutionOrdering34Test.java
@@ -0,0 +1,73 @@
+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 java.io.File;
+
+/**
+ * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-3719">MNG-3719</a>.
+ *
+ * @author Brett Porter
+ * @version $Id$
+ */
+public class MavenITmng3719PomExecutionOrdering34Test
+    extends AbstractMavenIntegrationTestCase
+{
+
+    public MavenITmng3719PomExecutionOrdering34Test()
+    {
+        super( "[3.4,)" );
+    }
+
+    /**
+     * Test that 3 executions are run in the correct order.
+     */
+    public void testitMNG3719()
+        throws Exception
+    {
+        Verifier verifier = null;
+
+        try
+        {
+            File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-3719" );
+
+            verifier = newVerifier( testDir.getAbsolutePath() );
+            verifier.setAutoclean( false );
+            verifier.deleteDirectory( "target" );
+            verifier.executeGoal( "validate" );
+
+            fail( "Expected 'VerificationException' not thrown." );
+        }
+        catch ( final VerificationException e )
+        {
+            // Expected.
+        }
+        finally
+        {
+            if ( verifier != null )
+            {
+                verifier.resetStreams();
+            }
+        }
+    }
+
+}
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4005UniqueDependencyKey34Test.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4005UniqueDependencyKey34Test.java
new file mode 100644
index 0000000..63a82de
--- /dev/null
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4005UniqueDependencyKey34Test.java
@@ -0,0 +1,105 @@
+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 java.io.File;
+
+/**
+ * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-4005">MNG-4005</a>.
+ *
+ * @author Benjamin Bentmann
+ */
+public class MavenITmng4005UniqueDependencyKey34Test
+    extends AbstractMavenIntegrationTestCase
+{
+
+    public MavenITmng4005UniqueDependencyKey34Test()
+    {
+        super( "[3.4,)" );
+    }
+
+    /**
+     * Test that duplicate dependencies cause a validation error during building.
+     */
+    public void testitDependency()
+        throws Exception
+    {
+        test( "dep" );
+    }
+
+    /**
+     * Test that duplicate managed dependencies cause a validation error during building.
+     */
+    public void testitManagedDependency()
+        throws Exception
+    {
+        test( "man-dep" );
+    }
+
+    /**
+     * Test that duplicate dependencies in profiles cause a validation error during building.
+     */
+    public void testitProfileDependency()
+        throws Exception
+    {
+        test( "profile-dep" );
+    }
+
+    /**
+     * Test that duplicate managed dependencies in profiles cause a validation error during building.
+     */
+    public void testitProfileManagedDependency()
+        throws Exception
+    {
+        test( "profile-man-dep" );
+    }
+
+    private void test( String project )
+        throws Exception
+    {
+        Verifier verifier = null;
+
+        try
+        {
+            File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4005/" + project );
+
+            verifier = newVerifier( testDir.getAbsolutePath() );
+            verifier.setAutoclean( false );
+            verifier.deleteDirectory( "target" );
+            verifier.executeGoal( "validate" );
+
+            fail( "Expected 'VerificationException' not thrown." );
+        }
+        catch ( final VerificationException e )
+        {
+            // Expected.
+        }
+        finally
+        {
+            if ( verifier != null )
+            {
+                verifier.resetStreams();
+            }
+        }
+    }
+
+}
