diff --git a/src/refit/config/REFITConfig.java b/src/refit/config/REFITConfig.java
index d55d2751fff2fc49f0e5287522d0031b43da5367..046b46534ee71e4fa76c13633445a3f92b19c30e 100644
--- a/src/refit/config/REFITConfig.java
+++ b/src/refit/config/REFITConfig.java
@@ -213,7 +213,7 @@ public class REFITConfig {
 	public static final Class<? extends REFITBenchmarkRunnable> APPLICATION_CLIENT = config.getClass("application.client", REFITBenchmarkRunnable.class);
 	public static final Class<? extends REFITClientLibrary> APPLICATION_CLIENT_LIBRARY = config.getClass("application.library", REFITClientLibrary.class);
 	public static final Class<? extends REFITClientPolicy> APPLICATION_CLIENT_POLICY = config.getClass("application.policy", REFITClientPolicy.class);
-	public static final Class<? extends REFITBaseReplica> APPLICATION_REPLICA = config.getClass("application.replica", REFITBaseReplica.class);
+	public static final Class<? extends REFITBaseReplica> APPLICATION_REPLICA;
 
 	// Communication
 	public static final int REPLICA_NETWORK_SEND_BUFFER_SIZE = 1024 * config.getInt("replica.network.buffer.send.kb");
@@ -375,6 +375,8 @@ public class REFITConfig {
 
 		REFITAssert.assertTrue(!REFITConfig.AUTHENTICATE_MESSAGES || REFITConfig.WAIT_FOR_FULL_REPLY,
 				"ack replies are not yet implemented in the BFT protocol");
+
+		APPLICATION_REPLICA = config.getClass("application.replica", REFITBaseReplica.class);
 	}
 
 
diff --git a/src/refit/replica/REFITMicroIRMCReplica.java b/src/refit/replica/REFITMicroIRMCReplica.java
index a76f64530a7ec14465c0831a28d4559e84afa6a8..e2a404da638a4af907888cb678554c09ff075757 100644
--- a/src/refit/replica/REFITMicroIRMCReplica.java
+++ b/src/refit/replica/REFITMicroIRMCReplica.java
@@ -17,14 +17,15 @@ public class REFITMicroIRMCReplica extends REFITBaseReplica {
 	private final REFITAbstractChannelSender orderedChannelSenderStage;
 	private final REFITAbstractChannelReceiver orderedChannelReceiverStage;
 
-
-	public REFITMicroIRMCReplica(short id, boolean isSingleThreaded) {
-		super(id, isSingleThreaded, false);
-
+	static {
 		// partial configuration sanity check
 		REFITAssert.assertTrue(REFITConfig.AUTONOMOUS_PANICS && REFITConfig.SEPARATE_EXECUTION_REPLICAS
 						&& REFITConfig.BATCH_ALWAYS && REFITOrderGroups.COUNT == 1 && REFITConfig.SIGNED_REQUESTS,
 				"Incompatible configuration");
+	}
+
+	public REFITMicroIRMCReplica(short id, boolean isSingleThreaded) {
+		super(id, isSingleThreaded, false);
 
 		boolean isExecutor = (id >= REFITConfig.ORDER_GROUP_SIZE);
 
diff --git a/src/refit/replica/REFITReplica.java b/src/refit/replica/REFITReplica.java
index b1fbaf833516a525a4ee57aa01965ddee6a72972..c3fa03e16bc623beca07b3a45f4f034e93ee49f0 100644
--- a/src/refit/replica/REFITReplica.java
+++ b/src/refit/replica/REFITReplica.java
@@ -27,13 +27,14 @@ public class REFITReplica extends REFITBaseReplica {
 	private final REFITExecutionStageBase executionStage;
 	private final REFITFuzzyCheckpointStage fuzzyCheckpointStage;
 
-
-	public REFITReplica(short id, boolean isSingleThreaded) {
-		super(id, isSingleThreaded, true);
-
+	static {
 		if (REFITOrderGroups.COUNT > 1) {
 			throw new AssertionError("The base configuration only supports a single order group!");
 		}
+	}
+
+	public REFITReplica(short id, boolean isSingleThreaded) {
+		super(id, isSingleThreaded, true);
 
 		// Create global stages
 		if (id < REFITConfig.EXEC_GROUP_SIZE) {
diff --git a/src/refit/replica/REFITSpiderReplica.java b/src/refit/replica/REFITSpiderReplica.java
index 11c113ec6b6e65876190fc3eefa3b6fe8ce312c2..58245811bdf4974254e2477f4a5e8361c10997b4 100644
--- a/src/refit/replica/REFITSpiderReplica.java
+++ b/src/refit/replica/REFITSpiderReplica.java
@@ -38,14 +38,15 @@ public class REFITSpiderReplica extends REFITBaseReplica {
 	private final REFITAbstractChannelSender orderedChannelSenderStage;
 	private final REFITAbstractChannelReceiver orderedChannelReceiverStage;
 
-
-	public REFITSpiderReplica(short id, boolean isSingleThreaded) {
-		super(id, isSingleThreaded, (id >= REFITConfig.ORDER_GROUP_SIZE));
-
+	static {
 		// partial configuration sanity check
 		REFITAssert.assertTrue(REFITConfig.AUTONOMOUS_PANICS && REFITConfig.SEPARATE_EXECUTION_REPLICAS
 						&& REFITConfig.BATCH_ALWAYS && REFITOrderGroups.COUNT == 1 && REFITConfig.SIGNED_REQUESTS,
 				"Incompatible configuration");
+	}
+
+	public REFITSpiderReplica(short id, boolean isSingleThreaded) {
+		super(id, isSingleThreaded, (id >= REFITConfig.ORDER_GROUP_SIZE));
 
 		boolean isExecutor = (id >= REFITConfig.ORDER_GROUP_SIZE);
 		int executorID = REFITReplicaGroups.getExecutionGroupId(id);
diff --git a/src/refit/replica/REFITWeaveReplica.java b/src/refit/replica/REFITWeaveReplica.java
index 442e8ed698d354536978caf19795fea75cf08cc4..e037a10593c6fa29417f43f20a2f77f0594f520b 100644
--- a/src/refit/replica/REFITWeaveReplica.java
+++ b/src/refit/replica/REFITWeaveReplica.java
@@ -31,14 +31,15 @@ public class REFITWeaveReplica extends REFITBaseReplica {
 
 	private final REFITGroupMessageRouter msgRouter;
 
-
-	public REFITWeaveReplica(short id, boolean isSingleThreaded) {
-		super(id, isSingleThreaded, true);
-
+	static {
 		// minimal sanity check
 		REFITAssert.assertTrue(REFITConfig.LOCATION_BASED_ORDER_GROUPS
 				&& REFITConfig.TOTAL_NR_OF_REPLICAS == REFITConfig.ORDER_GROUP_SIZE
 				&& REFITConfig.TOTAL_NR_OF_REPLICAS == REFITConfig.EXEC_GROUP_SIZE, "Incompatible configuration");
+	}
+
+	public REFITWeaveReplica(short id, boolean isSingleThreaded) {
+		super(id, isSingleThreaded, true);
 
 		for (int i = 0; i < REFITOrderGroups.COUNT; i++) {
 			REFITLogger.logDebug(this, "Order group " + i + ": " + Arrays.toString(REFITConfig.ORDER_GROUPS[i]));