diff --git a/openair2/LAYER2/MAC/ff-mac.c b/openair2/LAYER2/MAC/ff-mac.c
index a12490ef7f3262fee3afee9f8823e2eac854f5e7..e61eb908dbf9c193b5c2edff03fe8715fc687aca 100644
--- a/openair2/LAYER2/MAC/ff-mac.c
+++ b/openair2/LAYER2/MAC/ff-mac.c
@@ -93,7 +93,9 @@ struct fapi {
     fi->rsp_id[fn]++; \
   } while (0)
 
-/* SCHED "wrappers" */
+/************************************************************************/
+/*                          SCHED "wrappers"                            */
+/************************************************************************/
 
 void SchedDlConfigInd(fapi_interface_t *_fi, struct SchedDlConfigIndParameters *params)
 {
@@ -142,7 +144,9 @@ void SchedUlConfigInd(fapi_interface_t *_fi, struct SchedUlConfigIndParameters *
   LOG_D(MAC, "%s leave\n", __FUNCTION__);
 }
 
-/* CSCHED "wrappers" */
+/************************************************************************/
+/*                         CSCHED "wrappers"                            */
+/************************************************************************/
 
 void CschedCellConfigCnf(fapi_interface_t *_fi, struct CschedCellConfigCnfParameters *params)
 {
@@ -215,18 +219,53 @@ void CschedCellConfigUpdateInd(fapi_interface_t *_fi, struct CschedCellConfigUpd
   int fn = CSCHED_CELL_CONFIG_UPDATE_IND;
 }
 
-/* SCHED callbacks */
+/************************************************************************/
+/*                          SCHED callbacks                             */
+/************************************************************************/
 
 void SchedDlConfigInd_callback(void *callback_data, const struct SchedDlConfigIndParameters *params)
 {
   struct fapi *fi = callback_data;
   int fn = SCHED_DL_CONFIG_IND;
+  int i, j, k;
   LOG_D(MAC, "%s enter\n", __FUNCTION__);
 
   LOCK(fi, fn);
   CHECK(fi, fn);
 
-  fi->SchedDlConfigIndParameters = *params;
+  /* copy from params to local structure */
+  fi->SchedDlConfigIndParameters.nr_buildDataList = params->nr_buildDataList;
+  fi->SchedDlConfigIndParameters.nr_buildRARList = params->nr_buildRARList;
+  fi->SchedDlConfigIndParameters.nr_buildBroadcastList = params->nr_buildBroadcastList;
+
+  for (i = 0; i < params->nr_buildDataList; i++) {
+    fi->SchedDlConfigIndParameters.buildDataList[i].rnti = params->buildDataList[i].rnti;
+    fi->SchedDlConfigIndParameters.buildDataList[i].dci = params->buildDataList[i].dci;
+    for (j = 0; j < MAX_TB_LIST; j++)
+      fi->SchedDlConfigIndParameters.buildDataList[i].ceBitmap[j] = params->buildDataList[i].ceBitmap[j];
+    for (j = 0; j < MAX_TB_LIST; j++) {
+      fi->SchedDlConfigIndParameters.buildDataList[i].nr_rlcPDU_List[j] = params->buildDataList[i].nr_rlcPDU_List[j];
+      for (k = 0; k < params->buildDataList[i].nr_rlcPDU_List[j]; k++)
+        fi->SchedDlConfigIndParameters.buildDataList[i].rlcPduList[j][k] = params->buildDataList[i].rlcPduList[j][k];
+    }
+    fi->SchedDlConfigIndParameters.buildDataList[i].servCellIndex = params->buildDataList[i].servCellIndex;
+    fi->SchedDlConfigIndParameters.buildDataList[i].activationDeactivationCE = params->buildDataList[i].activationDeactivationCE;
+  }
+
+  for (i = 0; i < params->nr_buildRARList; i++) {
+    fi->SchedDlConfigIndParameters.buildRarList[i] = params->buildRarList[i];
+  }
+
+  for (i = 0; i < params->nr_buildBroadcastList; i++) {
+    fi->SchedDlConfigIndParameters.buildBroadcastList[i] = params->buildBroadcastList[i];
+  }
+
+  /* TODO: be sure of this */
+  if (params->nr_ofdmSymbolsCount != 1) { printf("%s:%d: what to do?\n", __FILE__, __LINE__); abort(); }
+  fi->SchedDlConfigIndParameters.nr_ofdmSymbolsCount = params->nr_ofdmSymbolsCount;
+  for (i = 0; i < MAX_NUM_CCs; i++) {
+    *fi->SchedDlConfigIndParameters.nrOfPdcchOfdmSymbols[i] = *params->nrOfPdcchOfdmSymbols[i];
+  }
 
   DONE_callback(fi, fn);
   UNLOCK(fi, fn);
@@ -238,12 +277,23 @@ void SchedUlConfigInd_callback(void *callback_data, const struct SchedUlConfigIn
 {
   struct fapi *fi = callback_data;
   int fn = SCHED_UL_CONFIG_IND;
+  int i;
   LOG_D(MAC, "%s enter\n", __FUNCTION__);
 
   LOCK(fi, fn);
   CHECK(fi, fn);
 
-  fi->SchedUlConfigIndParameters = *params;
+  /* copy from params to local structure */
+  fi->SchedUlConfigIndParameters.nr_dciList = params->nr_dciList;
+  fi->SchedUlConfigIndParameters.nr_phichList = params->nr_phichList;
+
+  for (i = 0; i < params->nr_dciList; i++) {
+    fi->SchedUlConfigIndParameters.dciList[i] = params->dciList[i];
+  }
+
+  for (i = 0; i < params->nr_phichList; i++) {
+    fi->SchedUlConfigIndParameters.phichList[i] = params->phichList[i];
+  }
 
   DONE_callback(fi, fn);
   UNLOCK(fi, fn);
@@ -251,7 +301,9 @@ void SchedUlConfigInd_callback(void *callback_data, const struct SchedUlConfigIn
   LOG_D(MAC, "%s leave\n", __FUNCTION__);
 }
 
-/* CSCHED callbacks */
+/************************************************************************/
+/*                           CSCHED callbacks                           */
+/************************************************************************/
 
 void CschedCellConfigCnf_callback(void *callback_data, const struct CschedCellConfigCnfParameters *params)
 {
@@ -262,6 +314,7 @@ void CschedCellConfigCnf_callback(void *callback_data, const struct CschedCellCo
   LOCK(fi, fn);
   CHECK(fi, fn);
 
+  /* copy from params to local structure */
   fi->CschedCellConfigCnfParameters = *params;
 
   DONE_callback(fi, fn);
@@ -279,6 +332,7 @@ void CschedUeConfigCnf_callback(void *callback_data, const struct CschedUeConfig
   LOCK(fi, fn);
   CHECK(fi, fn);
 
+  /* copy from params to local structure */
   fi->CschedUeConfigCnfParameters = *params;
 
   DONE_callback(fi, fn);
@@ -291,12 +345,21 @@ void CschedLcConfigCnf_callback(void *callback_data, const struct CschedLcConfig
 {
   struct fapi *fi = callback_data;
   int fn = CSCHED_LC_CONFIG_CNF;
+  int i;
   LOG_D(MAC, "%s enter\n", __FUNCTION__);
 
   LOCK(fi, fn);
   CHECK(fi, fn);
 
-  fi->CschedLcConfigCnfParameters = *params;
+  /* copy from params to local structure */
+  fi->CschedLcConfigCnfParameters.rnti = params->rnti;
+  fi->CschedLcConfigCnfParameters.result = params->result;
+
+  fi->CschedLcConfigCnfParameters.nr_logicalChannelIdendity = params->nr_logicalChannelIdendity;
+
+  for (i = 0; i < params->nr_logicalChannelIdendity; i++) {
+    fi->CschedLcConfigCnfParameters.logicalChannelIdentity[i] = params->logicalChannelIdentity[i];
+  }
 
   DONE_callback(fi, fn);
   UNLOCK(fi, fn);
@@ -328,6 +391,10 @@ void CschedCellConfigUpdateInd_callback(void *callback_data, const struct Csched
 abort();
 }
 
+/************************************************************************/
+/*                           init function                              */
+/************************************************************************/
+
 fapi_interface_t *init_fapi(void)
 {
   struct fapi *ret;
@@ -354,6 +421,57 @@ fapi_interface_t *init_fapi(void)
     ret->rsp_id[i] = 0;
   }
 
+  /* allocate memory (max size) to copy messages coming from FAPI */
+
+  /*********** CschedCellConfigCnfParameters is ok */
+
+  /*********** SchedDlConfigIndParameters */
+
+  /*********************     buildDataList */
+  ret->SchedDlConfigIndParameters.buildDataList = calloc(MAX_BUILD_DATA_LIST, sizeof(struct BuildDataListElement_s));
+  if (ret->SchedDlConfigIndParameters.buildDataList == NULL) abort();
+  for (i = 0; i < MAX_BUILD_DATA_LIST; i++) {
+    struct BuildDataListElement_s *b = &ret->SchedDlConfigIndParameters.buildDataList[i];
+    int j;
+    for (j = 0; j < MAX_TB_LIST; j++) {
+      b->rlcPduList[j] = calloc(MAX_RLC_PDU_LIST, sizeof(struct RlcPduListElement_s));
+      if (b->rlcPduList[j] == NULL) abort();
+    }
+  }
+
+  /*********************    buildRarList */
+  ret->SchedDlConfigIndParameters.buildRarList = calloc(MAX_BUILD_RAR_LIST, sizeof(struct BuildRarListElement_s));
+  if (ret->SchedDlConfigIndParameters.buildRarList == NULL) abort();
+
+  /*********************    buildBroadcastList */
+  ret->SchedDlConfigIndParameters.buildBroadcastList = calloc(MAX_BUILD_BC_LIST, sizeof(struct BuildBroadcastListElement_s));
+  if (ret->SchedDlConfigIndParameters.buildBroadcastList == NULL) abort();
+
+  /*********************    nrOfPdcchOfdmSymbols */
+  for (i = 0; i < MAX_NUM_CCs; i++) {
+    /* TODO: not sure about 1 there */
+    ret->SchedDlConfigIndParameters.nrOfPdcchOfdmSymbols[i] = calloc(1, sizeof(struct PdcchOfdmSymbolCountListElement_s));
+    if (ret->SchedDlConfigIndParameters.nrOfPdcchOfdmSymbols[i] == NULL) abort();
+  }
+
+  /*********** SchedUlConfigIndParameters */
+
+  /*********************    dciList */
+  ret->SchedUlConfigIndParameters.dciList = calloc(MAX_DCI_LIST, sizeof(struct UlDciListElement_s));
+  if (ret->SchedUlConfigIndParameters.dciList == NULL) abort();
+
+  /*********************    phichList */
+  ret->SchedUlConfigIndParameters.phichList = calloc(MAX_PHICH_LIST, sizeof(struct PhichListElement_s));
+  if (ret->SchedUlConfigIndParameters.phichList == NULL) abort();
+
+  /*********** CschedUeConfigCnfParameters is ok */
+
+  /*********** CschedLcConfigCnfParameters */
+
+  /*********************    logicalChannelIdentity */
+  ret->CschedLcConfigCnfParameters.logicalChannelIdentity = calloc(MAX_LC_LIST, sizeof(uint8_t));
+  if (ret->CschedLcConfigCnfParameters.logicalChannelIdentity == NULL) abort();
+
   ret->fi.sched = SchedInit(ret,
                       SchedDlConfigInd_callback,
                       SchedUlConfigInd_callback,