diff --git a/FEE/smile_fee_ctrl.c b/FEE/smile_fee_ctrl.c
index 274e85a81f4ba491f31e9042d708d12321421f7c..f1784150127c442ea90994acd606f7a1d99d93cc 100644
--- a/FEE/smile_fee_ctrl.c
+++ b/FEE/smile_fee_ctrl.c
@@ -1861,19 +1861,24 @@ int smile_fee_sync_execute_op(enum sync_direction dir)
 
 
 
-
-
-
-
 /**
  * @brief initialise the smile_fee control library
+ *
+ * @param fee_mirror the desired FEE mirror, set NULL to allocate it for you
  */
 
-void smile_fee_ctrl_init(void)
+void smile_fee_ctrl_init(struct smile_fee_mirror *fee_mirror)
 {
-	smile_fee = (struct smile_fee_mirror *) malloc(sizeof(struct smile_fee_mirror));
-	if (!smile_fee)
+	if (!fee_mirror)
+		smile_fee = (struct smile_fee_mirror *)
+				malloc(sizeof(struct smile_fee_mirror));
+	else
+		smile_fee = fee_mirror;
+
+	if (!smile_fee) {
 		printf("Error allocating memory for the SMILE_FEE mirror\n");
+		return;
+	}
 
 	bzero(smile_fee, sizeof(struct smile_fee_mirror));
 }
diff --git a/FEE/smile_fee_ctrl.h b/FEE/smile_fee_ctrl.h
index a60dbe5b40724a88e5960bc181cb1494879c8f2a..deca7185ba4ef5cd9a532d50a5e6b213c88d1470 100644
--- a/FEE/smile_fee_ctrl.h
+++ b/FEE/smile_fee_ctrl.h
@@ -239,7 +239,7 @@ void smile_fee_set_execute_op(uint32_t mode);
 
 
 /* setup */
-void smile_fee_ctrl_init(void);
+void smile_fee_ctrl_init(struct smile_fee_mirror *fee_mirror);
 
 
 #endif /* _SMILE_FEE_CTRL_H_ */
diff --git a/FEE/smile_fee_demo.c b/FEE/smile_fee_demo.c
index 681dfd4a9b6f7acb45eeb3b407880f89e69fe77a..eb98d8de9e318bacf3f8fa213e9425f039b1f3ae 100644
--- a/FEE/smile_fee_demo.c
+++ b/FEE/smile_fee_demo.c
@@ -549,7 +549,7 @@ int main(void)
 #endif
 
 	/* initialise the libraries */
-	smile_fee_ctrl_init();
+	smile_fee_ctrl_init(NULL);
 	smile_fee_rmap_init(GRSPW2_DEFAULT_MTU, rmap_tx, rmap_rx);