diff --git a/src/main/java/com/syncleus/maven/plugins/mongodb/ReplSetInitiateConfig.java b/src/main/java/com/syncleus/maven/plugins/mongodb/ReplSetInitiateConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..f58eb61b10a199be18b9fd8a85f690175f59587f
--- /dev/null
+++ b/src/main/java/com/syncleus/maven/plugins/mongodb/ReplSetInitiateConfig.java
@@ -0,0 +1,264 @@
+/**
+ * Copyright: (c) Syncleus, Inc.
+ *
+ * You may redistribute and modify this source code under the terms and
+ * conditions of the Open Source Community License - Type C version 1.0
+ * or any later version as published by Syncleus, Inc. at www.syncleus.com.
+ * There should be a copy of the license included with this file. If a copy
+ * of the license is not included you are granted no right to distribute or
+ * otherwise use this file except through a legal and valid license. You
+ * should also contact Syncleus, Inc. at the information below if you cannot
+ * find a license:
+ *
+ * Syncleus, Inc.
+ * 2604 South 12th Street
+ * Philadelphia, PA 19148
+ */
+package com.syncleus.maven.plugins.mongodb;
+
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import org.apache.maven.plugins.annotations.Parameter;
+import java.util.HashMap;
+
+public class ReplSetInitiateConfig {
+    @Parameter(name = "_id")
+    private String _id;
+
+    @Parameter
+    private Integer version;
+
+    @Parameter
+    private MembersConfig[] members;
+
+    @Parameter
+    private SettingsConfig settings;
+
+    public ReplSetInitiateConfig() {
+    }
+
+    public ReplSetInitiateConfig(String _id, Integer version, MembersConfig[] members, SettingsConfig settings) {
+        this._id = _id;
+        this.version = version;
+        this.members = members;
+        this.settings = settings;
+    }
+
+    public String get_id() {
+        return _id;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public MembersConfig[] getMembers() {
+        return members;
+    }
+
+    public SettingsConfig getSettings() {
+        return settings;
+    }
+
+    public BasicDBObject makeCommand() {
+        final BasicDBObject cmd = new BasicDBObject();
+        if( _id != null && !_id.isEmpty())
+            cmd.put("_id", _id);
+        if(version != null)
+            cmd.put("version", version);
+        if( members != null && members.length > 0) {
+            final BasicDBList dbMembers = new BasicDBList();
+            for(final MembersConfig member : members )
+                dbMembers.add(member.makeCommand());
+            cmd.put("members", dbMembers);
+        }
+        if(settings != null)
+            cmd.put("settings", settings.makeCommand());
+        return cmd;
+    }
+
+    public static class MembersConfig {
+        @Parameter(name = "_id")
+        private Integer _id;
+
+        @Parameter
+        private String host;
+
+        @Parameter
+        private Boolean arbiterOnly;
+
+        @Parameter
+        private Boolean buildIndexes;
+
+        @Parameter
+        private Boolean hidden;
+
+        @Parameter
+        private Integer priority;
+
+        @Parameter
+        private HashMap<String, String> tags;
+
+        @Parameter
+        private Integer slaveDelay;
+
+        @Parameter
+        private Integer votes;
+
+        public MembersConfig() {
+        }
+
+        public MembersConfig(Integer _id, String host, Boolean arbiterOnly, Boolean buildIndexes, Boolean hidden, Integer priority, HashMap<String, String> tags, Integer slaveDelay, Integer votes) {
+            this._id = _id;
+            this.host = host;
+            this.arbiterOnly = arbiterOnly;
+            this.buildIndexes = buildIndexes;
+            this.hidden = hidden;
+            this.priority = priority;
+            this.tags = tags;
+            this.slaveDelay = slaveDelay;
+            this.votes = votes;
+        }
+
+        public Integer get_id() {
+            return _id;
+        }
+
+        public String getHost() {
+            return host;
+        }
+
+        public Boolean getArbiterOnly() {
+            return arbiterOnly;
+        }
+
+        public Boolean getBuildIndexes() {
+            return buildIndexes;
+        }
+
+        public Boolean getHidden() {
+            return hidden;
+        }
+
+        public Integer getPriority() {
+            return priority;
+        }
+
+        public HashMap<String, String> getTags() {
+            return tags;
+        }
+
+        public Integer getSlaveDelay() {
+            return slaveDelay;
+        }
+
+        public Integer getVotes() {
+            return votes;
+        }
+
+        public BasicDBObject makeCommand() {
+            final BasicDBObject cmd = new BasicDBObject();
+            if(_id != null)
+                cmd.put("_id", _id);
+            if(host != null && !host.isEmpty())
+                cmd.put("host", host);
+            if(arbiterOnly != null)
+                cmd.put("arbiterOnly", arbiterOnly);
+            if(hidden != null)
+                cmd.put("hidden", arbiterOnly);
+            if(priority != null)
+                cmd.put("priority", priority);
+            if( tags != null && tags.size() > 0)
+                cmd.put("tags", new BasicDBObject(tags));
+            if(slaveDelay != null)
+                cmd.put("slaveDelay", slaveDelay);
+            if(votes != null)
+                cmd.put("votes", votes);
+            return cmd;
+        }
+    }
+
+    public static class SettingsConfig {
+        @Parameter
+        private Boolean chainingAllowed;
+
+        @Parameter
+        private Integer heartbeatTimeoutSecs;
+
+        @Parameter
+        private GetLastErrorModesConfig[] getLastErrorModes;
+
+        //TODO: implement getLastErrorDefaults
+
+        public SettingsConfig() {
+        }
+
+        public SettingsConfig(Boolean chainingAllowed, Integer heartbeatTimeoutSecs, GetLastErrorModesConfig[] getLastErrorModes) {
+            this.chainingAllowed = chainingAllowed;
+            this.heartbeatTimeoutSecs = heartbeatTimeoutSecs;
+            this.getLastErrorModes = getLastErrorModes;
+        }
+
+        public Boolean getChainingAllowed() {
+            return chainingAllowed;
+        }
+
+        public Integer getHeartbeatTimeoutSecs() {
+            return heartbeatTimeoutSecs;
+        }
+
+        public GetLastErrorModesConfig[] getGetLastErrorModes() {
+            return getLastErrorModes;
+        }
+
+        public BasicDBObject makeCommand() {
+            final BasicDBObject cmd = new BasicDBObject();
+            if(chainingAllowed != null)
+                cmd.put("chainingAllowed", chainingAllowed);
+            if(heartbeatTimeoutSecs != null)
+                cmd.put("heartbeatTimeoutSecs", heartbeatTimeoutSecs);
+            if(getLastErrorModes != null && getLastErrorModes.length > 0) {
+                final BasicDBObject dbGetLastErrorModes = new BasicDBObject();
+                for( final GetLastErrorModesConfig getLastErrorMode : getLastErrorModes) {
+                    getLastErrorMode.makeCommand(dbGetLastErrorModes);
+                }
+                cmd.put("getLastErrorModes", dbGetLastErrorModes);
+            }
+            return cmd;
+        }
+
+        public static class GetLastErrorModesConfig {
+            @Parameter(required = true)
+            private String writeConcern;
+
+            @Parameter
+            private HashMap<String, String> tags;
+
+            public GetLastErrorModesConfig() {
+            }
+
+            public GetLastErrorModesConfig(String writeConcern, HashMap<String, String> tags) {
+                this.writeConcern = writeConcern;
+                this.tags = tags;
+            }
+
+            public String getWriteConcern() {
+                return writeConcern;
+            }
+
+            public HashMap<String, String> getTags() {
+                return tags;
+            }
+
+            public void makeCommand(final BasicDBObject cmd) {
+                if( tags != null && !tags.isEmpty()) {
+                    final BasicDBObject dbTags = new BasicDBObject();
+                    dbTags.putAll(tags);
+                    cmd.put(writeConcern, dbTags);
+                }
+                else
+                    cmd.put(writeConcern, new BasicDBObject());
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java
index 2fe8b07d34df917f0d18576e2466f0cbd53ec0e6..e5f877d15b3522fc3a3bf7545fc10a852dc842ee 100644
--- a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java
+++ b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java
@@ -282,6 +282,9 @@ public class StartMongoMojo extends AbstractMongoMojo {
     @Parameter
     private InitializerConfig[] initalizations;
 
+    @Parameter
+    private ReplSetInitiateConfig replSetInitiate;
+
     /**
      * Not a mojo configuration parameter, this is used internally.
      */
@@ -746,23 +749,14 @@ public class StartMongoMojo extends AbstractMongoMojo {
     }
 
     private void startReplSetInitiate() throws MojoExecutionException, MojoFailureException {
+        if(replSetInitiate == null)
+            return;
+
         final MongoClient mongoClient = new MongoClient(new ServerAddress("localhost", getPort()));
         getLog().info("Connected to MongoDB");
         final DB db = mongoClient.getDB("admin");
 
-        BasicDBList membersList = new BasicDBList();
-        BasicDBObject onlyMember = new BasicDBObject();
-        onlyMember.put("_id", 0);
-        onlyMember.put("host", "localhost:27017");
-        membersList.add(onlyMember);
-        BasicDBObject initRoot = new BasicDBObject();
-        initRoot.put("_id", "rs0");
-        initRoot.put("version", 1);
-        initRoot.put("members", membersList);
-        initRoot.put("settings", new BasicDBObject("getLastErrorModes", new BasicDBObject("ACKNOWLEDGED", new BasicDBObject())));
-        BasicDBObject init = new BasicDBObject("replSetInitiate", initRoot);
-        getLog().info("Initiating replSet: " + init.toString());
-
-        db.command(init);
+        getLog().info("would have initated: " + replSetInitiate.makeCommand().toString());
+        db.command(new BasicDBObject("replSetInitiate", replSetInitiate.makeCommand()));
     }
 }