diff --git a/pom.xml b/pom.xml
index 1df3256234ca14c214d8c482949c09a33f15183f..4e06141339c4b4945d37b2e1913f280fdb8987ae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -105,12 +105,12 @@
         <dependency>
             <groupId>de.flapdoodle.embed</groupId>
             <artifactId>de.flapdoodle.embed.mongo</artifactId>
-            <version>1.31</version>
+            <version>1.40</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit-dep</artifactId>
-            <version>4.10</version>
+            <version>4.11</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
index 2ee89da3abb0e2c6e0b6754b68694e65af334d76..5f6d230fe4a26cbbb7d0a525b0bfa2fa1bd35ad5 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
@@ -42,19 +42,20 @@ import de.flapdoodle.embed.mongo.Command;
 import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
 import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.AbstractMongoConfig.Net;
-import de.flapdoodle.embed.mongo.config.AbstractMongoConfig.Storage;
-import de.flapdoodle.embed.mongo.config.AbstractMongoConfig.Timeout;
 import de.flapdoodle.embed.mongo.config.ArtifactStoreBuilder;
 import de.flapdoodle.embed.mongo.config.DownloadConfigBuilder;
-import de.flapdoodle.embed.mongo.config.MongodConfig;
+import de.flapdoodle.embed.mongo.config.IMongodConfig;
+import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
+import de.flapdoodle.embed.mongo.config.Net;
 import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder;
+import de.flapdoodle.embed.mongo.config.Storage;
+import de.flapdoodle.embed.mongo.distribution.IFeatureAwareVersion;
 import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.mongo.distribution.Versions;
 import de.flapdoodle.embed.process.config.IRuntimeConfig;
 import de.flapdoodle.embed.process.config.io.ProcessOutput;
 import de.flapdoodle.embed.process.config.store.IDownloadConfig;
 import de.flapdoodle.embed.process.distribution.Distribution;
-import de.flapdoodle.embed.process.distribution.GenericVersion;
 import de.flapdoodle.embed.process.distribution.IVersion;
 import de.flapdoodle.embed.process.exceptions.DistributionException;
 import de.flapdoodle.embed.process.runtime.ICommandLinePostProcessor;
@@ -230,28 +231,25 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
                 commandLinePostProcessor = new ICommandLinePostProcessor.Noop();
             }
 
-            IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
-                    .defaults(Command.MongoD)
-                    .processOutput(getOutputConfig())
-                    .artifactStore(getArtifactStore())
-                    .commandLinePostProcessor(commandLinePostProcessor)
-                    .build();
+            IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder().defaults(Command.MongoD).processOutput
+                (getOutputConfig()).artifactStore(getArtifactStore()).commandLinePostProcessor
+                (commandLinePostProcessor).build();
 
             if (randomPort) {
                 port = PortUtils.allocateRandomPort();
             }
             savePortToProjectProperties();
 
-            MongodConfig mongoConfig = new MongodConfig(getVersion(),
-                    new Net(bindIp, port, Network.localhostIsIPv6()),
-                    new Storage(getDataDirectory(), null, 0),
-                    new Timeout());
+            IMongodConfig config = new MongodConfigBuilder().version(getVersion()).net(new Net(bindIp, port,
+                Network.localhostIsIPv6())).replication(new Storage(getDataDirectory(), null, 0)).build();
 
-            executable = MongodStarter.getInstance(runtimeConfig).prepare(mongoConfig);
+            executable = MongodStarter.getInstance(runtimeConfig).prepare(config);
         } catch (UnknownHostException e) {
             throw new MojoExecutionException("Unable to determine if localhost is ipv6", e);
         } catch (DistributionException e) {
             throw new MojoExecutionException("Failed to download MongoDB distribution: " + e.withDistribution(), e);
+        } catch (IOException e) {
+            throw new MojoExecutionException("Unable to Config MongoDB: ", e);
         }
 
         try {
@@ -294,21 +292,17 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
             case NONE:
                 return Loggers.none();
             default:
-                throw new MojoFailureException("Unexpected logging style encountered: \"" + logging + "\" -> " + loggingStyle);
+                throw new MojoFailureException("Unexpected logging style encountered: \"" + logging + "\" -> " +
+                    loggingStyle);
         }
 
     }
 
-    private IArtifactStore getArtifactStore()
-    {
-        IDownloadConfig downloadConfig = new DownloadConfigBuilder()
-                .defaultsForCommand(Command.MongoD)
-                .downloadPath(downloadPath)
-                .build();
-        IArtifactStore artifactStore = new ArtifactStoreBuilder()
-                .defaults(Command.MongoD)
-                .download(downloadConfig)
-                .build();
+    private IArtifactStore getArtifactStore() {
+        IDownloadConfig downloadConfig = new DownloadConfigBuilder().defaultsForCommand(Command.MongoD).downloadPath
+            (downloadPath).build();
+        IArtifactStore artifactStore = new ArtifactStoreBuilder().defaults(Command.MongoD).download(downloadConfig)
+            .build();
         return artifactStore;
     }
 
@@ -341,18 +335,23 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
         });
     }
 
-    private IVersion getVersion() {
+    private IFeatureAwareVersion getVersion() {
         String versionEnumName = this.version.toUpperCase().replaceAll("\\.", "_");
 
         if (versionEnumName.charAt(0) != 'V') {
             versionEnumName = "V" + versionEnumName;
         }
-
         try {
             return Version.valueOf(versionEnumName);
         } catch (IllegalArgumentException e) {
-            getLog().warn("Unrecognised MongoDB version '" + this.version + "', this might be a new version that we don't yet know about. Attemping download anyway...");
-            return new GenericVersion(this.version);
+            getLog().warn("Unrecognised MongoDB version '" + this.version + "', this might be a new version that we " +
+                "don't yet know about. Attemping download anyway...");
+            return Versions.withFeatures(new IVersion() {
+                @Override
+                public String asInDownloadPath() {
+                    return version;
+                }
+            });
         }
 
     }
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
index c8bd407cfbc3a56688997fb5f8d3442cf82e4c29..c786546f43e73dc162ce8774cacdedd9dc2e3ef8 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
@@ -32,10 +32,11 @@ public class StopEmbeddedMongoMojo extends AbstractMojo {
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        Object mongod = getPluginContext().get(StartEmbeddedMongoMojo.MONGOD_CONTEXT_PROPERTY_NAME);
+        MongodProcess mongod = (MongodProcess)getPluginContext().get(StartEmbeddedMongoMojo
+            .MONGOD_CONTEXT_PROPERTY_NAME);
 
         if (mongod != null) {
-            ((MongodProcess) mongod).stop();
+            mongod.stop();
         } else {
             throw new MojoFailureException("No mongod process found, it appears embedmongo:start was not called");
         }
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/log/Loggers.java b/src/main/java/com/github/joelittlejohn/embedmongo/log/Loggers.java
index e67cf2916bbe118c54b1b1ea8f639853e07d8c1c..99e1a5f2f8e0894e66ec7c1d848d0de78eec5572 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/log/Loggers.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/log/Loggers.java
@@ -15,6 +15,7 @@
  */
 package com.github.joelittlejohn.embedmongo.log;
 
+import de.flapdoodle.embed.mongo.Command;
 import de.flapdoodle.embed.mongo.config.MongodProcessOutputConfig;
 import de.flapdoodle.embed.process.config.io.ProcessOutput;
 import de.flapdoodle.embed.process.io.NamedOutputStreamProcessor;
@@ -35,7 +36,7 @@ public class Loggers {
     }
 
     public static ProcessOutput console() {
-        return MongodProcessOutputConfig.getDefaultInstance();
+        return MongodProcessOutputConfig.getDefaultInstance(Command.MongoD);
     }
 
     public static ProcessOutput none() {