diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/AbstractEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/AbstractEmbeddedMongoMojo.java
index 341a586c2ce802456635e98792a681a320ec3ed0..504b9cfdd090738de2b2ca75e5d1df71fc750372 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/AbstractEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/AbstractEmbeddedMongoMojo.java
@@ -34,26 +34,100 @@ public abstract class AbstractEmbeddedMongoMojo extends AbstractMojo {
     @Parameter(property = "embedmongo.skip", defaultValue = "false")
     private boolean skip;
 
+    /**
+     * The port MongoDB should run on.
+     *
+     * @since 0.1.0
+     */
     @Parameter(property = "embedmongo.port", defaultValue = "27017")
     private int port;
 
+    /**
+     * Whether a random free port should be used for MongoDB instead of the one
+     * specified by {@code port}. If {@code randomPort} is {@code true}, the
+     * random port chosen will be available in the Maven project property
+     * {@code embedmongo.port}.
+     *
+     * @since 0.1.8
+     */
     @Parameter(property = "embedmongo.randomPort", defaultValue = "false")
     private boolean randomPort;
 
+    /**
+     * The version of MongoDB to run e.g. 2.1.1, 1.6 v1.8.2, V2_0_4,
+     *
+     * @since 0.1.0
+     */
     @Parameter(property = "embedmongo.version", defaultValue = "2.2.1")
     private String version;
 
+    /**
+     * A proxy hostname to be used when downloading MongoDB distributions.
+     *
+     * @since 0.1.1
+     */
+    @Parameter(property = "embedmongo.proxyHost")
+    private String proxyHost;
+
+    /**
+     * A proxy port to be used when downloading MongoDB distributions.
+     *
+     * @since 0.1.1
+     */
+    @Parameter(property = "embedmongo.proxyPort", defaultValue = "80")
+    private int proxyPort;
+
+    /**
+     * Block immediately and wait until MongoDB is explicitly stopped (eg:
+     * {@literal <ctrl-c>}). This option makes this goal similar in spirit to
+     * something like jetty:run, useful for interactive debugging.
+     *
+     * @since 0.1.2
+     */
+    @Parameter(property = "embedmongo.wait", defaultValue = "false")
+    private boolean wait;
+
+    /**
+     * The proxy user to be used when downloading MongoDB
+     *
+     * @since 0.1.6
+     */
+    @Parameter(property = "embedmongo.proxyUser")
+    private String proxyUser;
+
+    /**
+     * The proxy password to be used when downloading MondoDB
+     *
+     * @since 0.1.6
+     */
+    @Parameter(property = "embedmongo.proxyPassword")
+    private String proxyPassword;
+
+
     @Component
     protected MavenProject project;
 
+    public AbstractEmbeddedMongoMojo() {
+
+    }
+
+    AbstractEmbeddedMongoMojo(int port) {
+        this.port = port;
+    }
+
     @Override
     public final void execute() throws MojoExecutionException, MojoFailureException {
-        if(!skip){
-            executeEmbeddedMongo();
+        if(skip) {
+            onSkip();
+        } else {
+            executeStart();
         }
     }
 
-    // FIXME: This is a copy/paste version of StartEmbeddedMongoMojo
+    protected void onSkip() {
+        // Nothing to do, this is just to allow do things if mojo is skipped
+    }
+
     protected IFeatureAwareVersion getVersion() {
         String versionEnumName = this.version.toUpperCase().replaceAll("\\.", "_");
 
@@ -84,5 +158,50 @@ public abstract class AbstractEmbeddedMongoMojo extends AbstractMojo {
         }
     }
 
-    public abstract void executeEmbeddedMongo() throws MojoExecutionException, MojoFailureException;
+    public abstract void executeStart() throws MojoExecutionException, MojoFailureException;
+
+    /**
+     * Saves port to the {@link MavenProject#getProperties()} (with the property
+     * name {@code embedmongo.port}) to allow others (plugins, tests, etc) to
+     * find the randomly allocated port.
+     */
+    protected void savePortToProjectProperties(int port) {
+        project.getProperties().put("embedmongo.port", String.valueOf(port));
+    }
+
+    public boolean isSkip() {
+        return skip;
+    }
+
+    public boolean isRandomPort() {
+        return randomPort;
+    }
+
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    public int getProxyPort() {
+        return proxyPort;
+    }
+
+    public boolean isWait() {
+        return wait;
+    }
+
+    public String getProxyUser() {
+        return proxyUser;
+    }
+
+    public String getProxyPassword() {
+        return proxyPassword;
+    }
+
+    public MavenProject getProject() {
+        return project;
+    }
+
+    public boolean hasProxyConfigured() {
+        return this.proxyHost != null && this.proxyHost.length() > 0;
+    }
 }
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/ImportEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/ImportEmbeddedMongoMojo.java
index d363b81dcb9c0f1f5e6efb780326b76b4d2a68d3..37fbab7bf05c386bb81ffadd046346b827997938 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/ImportEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/ImportEmbeddedMongoMojo.java
@@ -47,7 +47,7 @@ public class ImportEmbeddedMongoMojo extends AbstractEmbeddedMongoMojo {
     private Boolean parallel;
 
     @Override
-    public void executeEmbeddedMongo() throws MojoExecutionException, MojoFailureException {
+    public void executeStart() throws MojoExecutionException, MojoFailureException {
         try {
             sendImportScript();
         } catch (Exception e) {
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/InitDataMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/InitDataMongoMojo.java
index e7a81a66b764fa746300977f92ae8a1fdb82c155..156d3b98ac103598ce6de944b6fcf6f3a8551109 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/InitDataMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/InitDataMongoMojo.java
@@ -1,5 +1,5 @@
 /**
- * Copyright © 2012 Joe Littlejohn
+ * Copyright © 2012 Pierre-Jean Vardanéga
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,9 @@ import com.mongodb.CommandResult;
 import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import com.mongodb.MongoException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 
 /**
  * When invoked, this goal connects to an instance of mongo and execute some instructions
@@ -33,43 +36,37 @@ import com.mongodb.MongoException;
  *
  * You should use the same javascript syntax that you would use in the mongo client.
  *
- * @goal init-data
- * @phase pre-integration-test
  */
-public class InitDataMongoMojo extends AbstractMojo {
+@Mojo(name="init-data", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
+public class InitDataMongoMojo extends AbstractEmbeddedMongoMojo {
 
     /**
      * Folder that contains all scripts to execute.
      * @parameter
      * @required
      */
+    @Parameter(property = "scriptsDirectory", required = true)
     private File scriptsDirectory;
 
-    /**
-     * Optional. Specify the port only if you want have a different one from the default value.
-     * Default value is 27017.
-     * @parameter
-     */
-    private int port;
-
     /**
      * The name of the database where data will be stored.
      * @parameter
      * @required
      */
+    @Parameter(property = "databaseName", required = true)
     private String databaseName;
 
     public InitDataMongoMojo() {
     }
 
     InitDataMongoMojo(File scriptsDirectory, int port, String databaseName) {
+        super(port);
         this.scriptsDirectory = scriptsDirectory;
-        this.port = port;
         this.databaseName = databaseName;
     }
 
     @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
+    public void executeStart() throws MojoExecutionException, MojoFailureException {
         DB db = connectToMongoAndGetDatabase();
 
         if (scriptsDirectory.isDirectory()) {
@@ -113,7 +110,7 @@ public class InitDataMongoMojo extends AbstractMojo {
 
         MongoClient mongoClient;
         try {
-            mongoClient = new MongoClient("localhost", port == 0 ? 27017 : port);
+            mongoClient = new MongoClient("localhost", getPort());
         } catch (UnknownHostException e) {
             throw new MojoExecutionException("Unable to connect to mongo instance", e);
         }
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
index d18124876fbd486e38ed736794d43dea87cde3bd..40df40f49f74d319e7274c9b5c86f3f06629bcb5 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/StartEmbeddedMongoMojo.java
@@ -33,6 +33,9 @@ import java.util.concurrent.TimeUnit;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 
 import com.github.joelittlejohn.embedmongo.log.Loggers;
@@ -66,161 +69,76 @@ import de.flapdoodle.embed.process.store.IArtifactStore;
  * When invoked, this goal starts an instance of mongo. The required binaries
  * are downloaded if no mongo release is found in <code>~/.embedmongo</code>.
  * 
- * @goal start
- * @phase pre-integration-test
  * @see <a
  *      href="http://github.com/flapdoodle-oss/embedmongo.flapdoodle.de">http://github.com/flapdoodle-oss/embedmongo.flapdoodle.de</a>
  */
-public class StartEmbeddedMongoMojo extends AbstractMojo {
+@Mojo(name="start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
+public class StartEmbeddedMongoMojo extends AbstractEmbeddedMongoMojo {
 
     private static final String PACKAGE_NAME = StartEmbeddedMongoMojo.class.getPackage().getName();
     public static final String MONGOD_CONTEXT_PROPERTY_NAME = PACKAGE_NAME + ".mongod";
 
-    /**
-     * The port MongoDB should run on.
-     * 
-     * @parameter expression="${embedmongo.port}" default-value="27017"
-     * @since 0.1.0
-     */
-    private int port;
-
-    /**
-     * Whether a random free port should be used for MongoDB instead of the one
-     * specified by {@code port}. If {@code randomPort} is {@code true}, the
-     * random port chosen will be available in the Maven project property
-     * {@code embedmongo.port}.
-     * 
-     * @parameter expression="${embedmongo.randomPort}" default-value="false"
-     * @since 0.1.8
-     */
-    private boolean randomPort;
-
-    /**
-     * The version of MongoDB to run e.g. 2.1.1, 1.6 v1.8.2, V2_0_4,
-     * 
-     * @parameter expression="${embedmongo.version}" default-value="2.2.1"
-     * @since 0.1.0
-     */
-    private String version;
-
     /**
      * The location of a directory that will hold the MongoDB data files.
      * 
-     * @parameter expression="${embedmongo.databaseDirectory}"
      * @since 0.1.0
      */
+    @Parameter(property = "embedmongo.databaseDirectory")
     private File databaseDirectory;
 
     /**
      * An IP address for the MongoDB instance to be bound to during its
      * execution.
      * 
-     * @parameter expression="${embedmongo.bindIp}"
      * @since 0.1.4
      */
+    @Parameter(property = "embedmongo.bindIp")
     private String bindIp;
 
     /**
-     * A proxy hostname to be used when downloading MongoDB distributions.
-     * 
-     * @parameter expression="${embedmongo.proxyHost}"
-     * @since 0.1.1
-     */
-    private String proxyHost;
-
-    /**
-     * A proxy port to be used when downloading MongoDB distributions.
-     * 
-     * @parameter expression="${embedmongo.proxyPort}" default-value="80"
-     * @since 0.1.1
-     */
-    private int proxyPort;
-
-    /**
-     * Block immediately and wait until MongoDB is explicitly stopped (eg:
-     * {@literal <ctrl-c>}). This option makes this goal similar in spirit to
-     * something like jetty:run, useful for interactive debugging.
-     * 
-     * @parameter expression="${embedmongo.wait}" default-value="false"
-     * @since 0.1.2
-     */
-    private boolean wait;
-
-    /**
-     * @parameter expression="${embedmongo.logging}" default-value="console"
      * @since 0.1.3
      */
+    @Parameter(property = "embedmongo.logging")
     private String logging;
 
     /**
-     * @parameter expression="${embedmongo.logFile}"
-     *            default-value="embedmongo.log"
      * @since 0.1.7
      */
+    @Parameter(property = "embedmongo.logFile", defaultValue = "embedmongo.log")
     private String logFile;
 
     /**
-     * @parameter expression="${embedmongo.logFileEncoding}"
-     *            default-value="utf-8"
      * @since 0.1.7
      */
+    @Parameter(property = "embedmongo.logFileEncoding", defaultValue = "utf-8")
     private String logFileEncoding;
 
     /**
      * The base URL to be used when downloading MongoDB
      * 
-     * @parameter expression="${embedmongo.downloadPath}"
-     *            default-value="http://fastdl.mongodb.org/"
      * @since 0.1.10
      */
+    @Parameter(property = "embedmongo.downloadPath", defaultValue = "http://fastdl.mongodb.org/")
     private String downloadPath;
 
-    /**
-     * The proxy user to be used when downloading MongoDB
-     * 
-     * @parameter expression="${embedmongo.proxyUser}"
-     * @since 0.1.6
-     */
-    private String proxyUser;
-
-    /**
-     * The proxy password to be used when downloading MondoDB
-     * 
-     * @parameter expression="${embedmongo.proxyPassword}"
-     * @since 0.1.6
-     */
-    private String proxyPassword;
 
     /**
      * Should authorization be enabled for MongoDB
      * 
-     * @parameter expression="${embedmongo.authEnabled}" default-value="false"
      */
+    @Parameter(property = "embedmongo.authEnabled", defaultValue = "false")
     private boolean authEnabled;
 
-    /**
-     * The maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * @parameter expression="${embedmongo.skip}" default-value="false"
-     */
-    private boolean skip;
+    @Override
+    protected void onSkip() {
+        getLog().debug("skip=true, not starting embedmongo");
+    }
 
     @Override
     @SuppressWarnings("unchecked")
-    public void execute() throws MojoExecutionException, MojoFailureException {
+    public void executeStart() throws MojoExecutionException, MojoFailureException {
 
-        if (skip) {
-            getLog().debug("skip=true, not starting embedmongo");
-            return;
-        }
-        
-        if (this.proxyHost != null && this.proxyHost.length() > 0) {
+        if (hasProxyConfigured()) {
             this.addProxySelector();
         }
 
@@ -248,10 +166,12 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
                     .commandLinePostProcessor(commandLinePostProcessor)
                     .build();
 
-            if (randomPort) {
+            int port = getPort();
+
+            if (isRandomPort()) {
                 port = PortUtils.allocateRandomPort();
             }
-            savePortToProjectProperties();
+            savePortToProjectProperties(port);
 
             IMongodConfig config = new MongodConfigBuilder()
                     .version(getVersion()).net(new Net(bindIp, port, Network.localhostIsIPv6()))
@@ -270,7 +190,7 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
         try {
             MongodProcess mongod = executable.start();
 
-            if (wait) {
+            if (isWait()) {
                 while (true) {
                     try {
                         TimeUnit.MINUTES.sleep(5);
@@ -286,14 +206,6 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
         }
     }
 
-    /**
-     * Saves port to the {@link MavenProject#getProperties()} (with the property
-     * name {@code embedmongo.port}) to allow others (plugins, tests, etc) to
-     * find the randomly allocated port.
-     */
-    private void savePortToProjectProperties() {
-        project.getProperties().put("embedmongo.port", String.valueOf(port));
-    }
 
     private ProcessOutput getOutputConfig() throws MojoFailureException {
 
@@ -321,6 +233,11 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
     private void addProxySelector() {
 
         // Add authenticator with proxyUser and proxyPassword
+        final String proxyUser = getProxyUser();
+        final String proxyPassword = getProxyPassword();
+        final String proxyHost = getProxyHost();
+        final int proxyPort = getProxyPort();
+
         if (proxyUser != null && proxyPassword != null) {
             Authenticator.setDefault(new Authenticator() {
                 @Override
@@ -347,27 +264,6 @@ public class StartEmbeddedMongoMojo extends AbstractMojo {
         });
     }
 
-    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 Versions.withFeatures(new IVersion() {
-                @Override
-                public String asInDownloadPath() {
-                    return version;
-                }
-            });
-        }
-
-    }
-
     private String getDataDirectory() {
         if (databaseDirectory != null) {
             return databaseDirectory.getAbsolutePath();
diff --git a/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java b/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
index aaf05ccbe5ee21f084316a1985117176249254f7..41d06d703fa0e2115cd645491c26870169734bab 100644
--- a/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
+++ b/src/main/java/com/github/joelittlejohn/embedmongo/StopEmbeddedMongoMojo.java
@@ -28,19 +28,10 @@ import de.flapdoodle.embed.mongo.MongodProcess;
  * @goal stop
  * @phase post-integration-test
  */
-public class StopEmbeddedMongoMojo extends AbstractMojo {
-
-    /**
-     * @parameter expression="${embedmongo.skip}" default-value="false"
-     */
-    private boolean skip;
+public class StopEmbeddedMongoMojo extends AbstractEmbeddedMongoMojo {
 
     @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        if (skip) {
-            return;
-        }
-        
+    public void executeStart() throws MojoExecutionException, MojoFailureException {
         MongodProcess mongod = (MongodProcess)getPluginContext().get(StartEmbeddedMongoMojo
             .MONGOD_CONTEXT_PROPERTY_NAME);