diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 39a24564dd31e23be2d0a8b0e8ac67c3804f9f74..a083cac1c38fc02a08fefa03a597f371e3a20eee 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -870,6 +870,7 @@ add_library(FLEXRAN_AGENT
   ${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c
   ${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c
   ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
+  ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
   )
 set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
 #include_directories(${OPENAIR2_DIR}/ENB_APP)
diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
index dea1aa05b93a5da6d1ea4bcac50829eae687ae74..d75712d430ca118e3b4fcdfc8df9d7da6f59fd34 100644
--- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
+++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
@@ -31,6 +31,7 @@
 
 #include "flexran_agent_common_internal.h"
 #include "flexran_agent_mac_internal.h"
+#include "flexran_agent_mac_slice_verification.h"
 
 /* from flexran_agent_mac.c */
 extern Protocol__FlexSliceConfig *slice_config[NUM_MAX_ENB];
@@ -1141,107 +1142,203 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli
   }
 }
 
-void prepare_update_slice_config_dl(mid_t mod_id, Protocol__FlexDlSlice *dls)
+void fill_dl_slice(mid_t mod_id, Protocol__FlexDlSlice *s)
 {
-  if (!dls->has_id) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Incoming DL slice configuration has no ID\n", mod_id);
-    return;
-  }
-  /* a percentage of zero will be interpreted as removal command */
-  if (sc_update[mod_id]->n_dl >= MAX_NUM_SLICES
-      && (!dls->has_percentage || dls->percentage > 0)) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Cannot create more than %ld slices in DL\n",
-          mod_id, sc_update[mod_id]->n_dl);
-    return;
-  }
-  if (sc_update[mod_id]->n_dl == 1 && dls->has_percentage && dls->percentage == 0) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Cannot delete last slice ID %d in DL\n",
-          mod_id, sc_update[mod_id]->dl[0]->id);
-    return;
-  }
+  /* TODO fill the slice depending on the chosen label */
+  /* for now, we fill it up with the information from slice 0 */
+  /* assume there is an ID (will be checked later) */
+  if (!s->has_label) {
+    s->has_label = 1;
+    s->label = sc_update[mod_id]->dl[0]->label;
+  }
+  if (!s->has_percentage) {
+    s->has_percentage = 1;
+    s->percentage = sc_update[mod_id]->dl[0]->percentage;
+  }
+  if (!s->has_isolation) {
+    s->has_isolation = 1;
+    s->isolation = sc_update[mod_id]->dl[0]->isolation;
+  }
+  if (!s->has_priority) {
+    s->has_priority = 1;
+    s->priority = sc_update[mod_id]->dl[0]->priority;
+  }
+  if (!s->has_position_low) {
+    s->has_position_low = 1;
+    s->position_low = sc_update[mod_id]->dl[0]->position_low;
+  }
+  if (!s->has_position_high) {
+    s->has_position_high = 1;
+    s->position_high = sc_update[mod_id]->dl[0]->position_high;
+  }
+  if (!s->has_maxmcs) {
+    s->has_maxmcs = 1;
+    s->maxmcs = sc_update[mod_id]->dl[0]->maxmcs;
+  }
+  if (s->n_sorting == 0) {
+    s->n_sorting = sc_update[0]->dl[0]->n_sorting;
+    /* TODO Dangerous? */
+    s->sorting = sc_update[0]->dl[0]->sorting;
+  }
+  if (!s->has_accounting) {
+    /* TODO Dangerous? */
+    s->accounting = sc_update[0]->dl[0]->accounting;
+  }
+  /* scheduler name not set, cannot be changed for the moment */
+}
 
-  Protocol__FlexDlSlice *to = NULL;
+Protocol__FlexDlSlice *get_existing_dl_slice(mid_t mod_id, int id)
+{
   for (int i = 0; i < sc_update[mod_id]->n_dl; ++i) {
-    if (dls->id == sc_update[mod_id]->dl[i]->id) {
-      to = sc_update[mod_id]->dl[i];
-      break;
+    if (id == sc_update[mod_id]->dl[i]->id) {
+      return sc_update[mod_id]->dl[i];
     }
   }
+  return NULL;
+}
 
-  /* create new slice -> read contents from existing slice config index 0 */
-  if (!to) {
-    LOG_I(FLEXRAN_AGENT,
-          "[%d] Creating DL slice with ID %d, taking default values from DL slice 0\n",
-          mod_id, dls->id);
-    to = sc_update[mod_id]->dl[sc_update[mod_id]->n_dl];
-    sc_update[mod_id]->n_dl++;
-    memcpy(to, slice_config[mod_id]->dl[0], sizeof(*to));
-    to->id = dls->id;
-  }
-
-  overwrite_slice_config_dl(to, dls);
+Protocol__FlexDlSlice *create_new_dl_slice(mid_t mod_id, int id)
+{
+  LOG_I(FLEXRAN_AGENT,
+        "[%d] Creating DL slice with ID %d, taking default values from DL slice 0\n",
+        mod_id, id);
+  Protocol__FlexDlSlice *to = sc_update[mod_id]->dl[sc_update[mod_id]->n_dl];
+  sc_update[mod_id]->n_dl++;
+  AssertFatal(sc_update[mod_id]->n_dl <= MAX_NUM_SLICES,
+              "cannot create more than MAX_NUM_SLICES\n");
+  to->id = id;
+  return to;
 }
 
-void prepare_update_slice_config_ul(mid_t mod_id, Protocol__FlexUlSlice *uls)
+void fill_ul_slice(mid_t mod_id, Protocol__FlexUlSlice *s)
 {
-  if (!uls->has_id) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Incoming UL slice configuration has no ID\n", mod_id);
-    return;
-  }
-  /* a percentage of zero will be interpreted as removal command */
-  if (sc_update[mod_id]->n_ul >= MAX_NUM_SLICES
-      && (!uls->has_percentage || uls->percentage > 0)) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Cannot create more than %ld slices in UL\n",
-          mod_id, sc_update[mod_id]->n_ul);
-    return;
-  }
-  if (sc_update[mod_id]->n_ul == 1 && uls->has_percentage && uls->percentage == 0) {
-    LOG_E(FLEXRAN_AGENT, "[%d] Cannot delete last slice ID %d in UL\n",
-          mod_id, sc_update[mod_id]->ul[0]->id);
-    return;
-  }
+  /* TODO fill the slice depending on the chosen label */
+  /* for now, we fill it up with the information from slice 0 */
+  /* assume there is an ID (will be checked later) */
+  if (!s->has_label) {
+    s->has_label = 1;
+    s->label = sc_update[mod_id]->ul[0]->label;
+  }
+  if (!s->has_percentage) {
+    s->has_percentage = 1;
+    s->percentage = sc_update[mod_id]->ul[0]->percentage;
+  }
+  if (!s->has_isolation) {
+    s->has_isolation = 1;
+    s->isolation = sc_update[mod_id]->ul[0]->isolation;
+  }
+  if (!s->has_priority) {
+    s->has_priority = 1;
+    s->priority = sc_update[mod_id]->ul[0]->priority;
+  }
+  if (!s->has_first_rb) {
+    s->has_first_rb = 1;
+    s->first_rb = sc_update[mod_id]->ul[0]->first_rb;
+  }
+  if (!s->has_maxmcs) {
+    s->has_maxmcs = 1;
+    s->maxmcs = sc_update[mod_id]->ul[0]->maxmcs;
+  }
+  if (s->n_sorting == 0) {
+    s->n_sorting = sc_update[0]->ul[0]->n_sorting;
+    /* TODO Dangerous? */
+    s->sorting = sc_update[0]->ul[0]->sorting;
+  }
+  if (!s->has_accounting) {
+    /* TODO Dangerous? */
+    s->accounting = sc_update[0]->ul[0]->accounting;
+  }
+  /* scheduler name not set, cannot be changed for the moment */
+}
 
-  Protocol__FlexUlSlice *to = NULL;
+Protocol__FlexUlSlice *get_existing_ul_slice(mid_t mod_id, int id)
+{
   for (int i = 0; i < sc_update[mod_id]->n_ul; ++i) {
-    if (uls->id == sc_update[mod_id]->ul[i]->id) {
-      to = sc_update[mod_id]->ul[i];
-      break;
+    if (id == sc_update[mod_id]->ul[i]->id) {
+      return sc_update[mod_id]->ul[i];
     }
   }
+  return NULL;
+}
 
-  /* create new slice -> read contents from existing slice config index 0 */
-  if (!to) {
-    LOG_I(FLEXRAN_AGENT,
-          "[%d] Creating UL slice with ID %d, taking default values from UL slice 0\n",
-          mod_id, uls->id);
-    to = sc_update[mod_id]->ul[sc_update[mod_id]->n_ul];
-    sc_update[mod_id]->n_ul++;
-    memcpy(to, slice_config[mod_id]->ul[0], sizeof(*to));
-    to->id = uls->id;
-  }
-
-  overwrite_slice_config_ul(to, uls);
+Protocol__FlexUlSlice *create_new_ul_slice(mid_t mod_id, int id)
+{
+  LOG_I(FLEXRAN_AGENT,
+        "[%d] Creating UL slice with ID %d, taking default values from UL slice 0\n",
+        mod_id, id);
+  Protocol__FlexUlSlice *to = sc_update[mod_id]->ul[sc_update[mod_id]->n_ul];
+  sc_update[mod_id]->n_ul++;
+  AssertFatal(sc_update[mod_id]->n_ul <= MAX_NUM_SLICES,
+              "cannot create more than MAX_NUM_SLICES\n");
+  to->id = id;
+  return to;
 }
 
-void prepare_update_slice_config(mid_t mod_id, Protocol__FlexSliceConfig *slice)
+void prepare_update_slice_config(mid_t mod_id, Protocol__FlexSliceConfig *sup)
 {
+  int verified = 1;
   if (!sc_update[mod_id]) {
     LOG_E(FLEXRAN_AGENT, "Can not update slice policy (no existing slice profile)\n");
     return;
   }
 
   pthread_mutex_lock(&sc_update_mtx);
-
-  if (slice->n_dl == 0)
+  if (sup->n_dl == 0) {
     LOG_I(FLEXRAN_AGENT, "[%d] no DL slice configuration in flex_slice_config message\n", mod_id);
-  for (int i = 0; i < slice->n_dl; i++)
-    prepare_update_slice_config_dl(mod_id, slice->dl[i]);
+  } else {
+    /* verify slice parameters */
+    for (int i = 0; i < sup->n_dl; i++) {
+      fill_dl_slice(mod_id, sup->dl[i]);
+      verified = verified && flexran_verify_dl_slice(mod_id, sup->dl[i]);
+      if (!verified) break;
+    }
 
-  if (slice->n_ul == 0)
+    /* verify group-based parameters (e.g. sum percentage should not exceed
+     * 100%). Can be used to perform admission control */
+    verified = verified && flexran_verify_group_dl_slices(mod_id,
+        sc_update[mod_id]->dl, sc_update[mod_id]->n_dl, sup->dl, sup->n_dl);
+
+    if (verified) {
+      for (int i = 0; i < sup->n_dl; i++) {
+        /* if all verifications were successful, get existing slice for ID or
+         * create new one and overwrite with the update */
+        Protocol__FlexDlSlice *dls = get_existing_dl_slice(mod_id, sup->dl[i]->id);
+        if (!dls) dls = create_new_dl_slice(mod_id, sup->dl[i]->id);
+        overwrite_slice_config_dl(dls, sup->dl[i]);
+      }
+    } else {
+      LOG_E(FLEXRAN_AGENT, "[%d] DL slice verification failed, refusing application\n", mod_id);
+    }
+  }
+
+  verified = 1;
+  if (sup->n_ul == 0) {
     LOG_I(FLEXRAN_AGENT, "[%d] no UL slice configuration in flex_slice_config message\n", mod_id);
-  for (int i = 0; i < slice->n_ul; i++)
-    prepare_update_slice_config_ul(mod_id, slice->ul[i]);
+  } else {
+    /* verify slice parameters */
+    for (int i = 0; i < sup->n_ul; i++) {
+      fill_ul_slice(mod_id, sup->ul[i]);
+      verified = verified && flexran_verify_ul_slice(mod_id, sup->ul[i]);
+      if (!verified) break;
+    }
 
+    /* verify group-based parameters (e.g. sum percentage should not exceed
+     * 100%). Can be used to perform admission control */
+    verified = verified && flexran_verify_group_ul_slices(mod_id,
+        sc_update[mod_id]->ul, sc_update[mod_id]->n_ul, sup->ul, sup->n_ul);
+
+    if (verified) {
+      for (int i = 0; i < sup->n_ul; i++) {
+        /* if all verifications were successful, get existing slice for ID or
+         * create new one and overwrite with the update */
+        Protocol__FlexUlSlice *uls = get_existing_ul_slice(mod_id, sup->ul[i]->id);
+        if (!uls) uls = create_new_ul_slice(mod_id, sup->ul[i]->id);
+        overwrite_slice_config_ul(uls, sup->ul[i]);
+      }
+    } else {
+      LOG_E(FLEXRAN_AGENT, "[%d] UL slice verification failed, refusing application\n", mod_id);
+    }
+  }
   pthread_mutex_unlock(&sc_update_mtx);
 
   /* perform the slice configuration reads a couple of times. If there are
@@ -1299,11 +1396,6 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco
     flexran_set_dl_slice_accounting_policy(mod_id, slice_idx, newc->accounting);
     changes++;
   }
-  if (strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) {
-    LOG_E(FLEXRAN_AGENT, "[%d][DL slice %d] setting the DL scheduler is not supported, reverting\n",
-          mod_id, newc->id);
-    newc->scheduler_name = oldc->scheduler_name;
-  }
   return changes;
 }
 
@@ -1365,11 +1457,6 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco
     LOG_W(FLEXRAN_AGENT, "[%d][UL slice %d] setting the accounting is not supported\n",
           mod_id, slice_idx);
   }
-  if (strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) {
-    LOG_E(FLEXRAN_AGENT, "[%d][UL slice %d] setting the UL scheduler is not supported, reverting\n",
-          mod_id, slice_idx);
-    newc->scheduler_name = oldc->scheduler_name;
-  }
   return changes;
 }
 
diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
new file mode 100644
index 0000000000000000000000000000000000000000..addc8d2e7523e3b463a51da47354a74b43cd932e
--- /dev/null
+++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
@@ -0,0 +1,340 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file flexran_agent_mac_slice_verification.c
+ * \brief MAC Agent slice verification helper functions
+ * \author Robert Schmidt
+ * \date 2018
+ * \version 0.1
+ */
+
+
+#include "flexran_agent_mac_slice_verification.h"
+
+/* overlap check for UL slices, helper type */
+struct sregion_s {
+  int start;
+  int length;
+};
+
+/* forward declaration of locally-used verification functions */
+int flexran_dl_slice_verify_pct(int pct);
+int flexran_dl_slice_verify_priority(int prio);
+int flexran_dl_slice_verify_position(int pos_low, int pos_high);
+int flexran_dl_slice_verify_maxmcs(int maxmcs);
+int flexran_ul_slice_verify_pct(int pct);
+int flexran_ul_slice_verify_priority(int prio);
+int flexran_ul_slice_verify_first_rb(int first_rb);
+int flexran_ul_slice_verify_maxmcs(int maxmcs);
+int check_ul_slice_overlap(mid_t mod_id, struct sregion_s *sr, int n);
+
+int flexran_verify_dl_slice(mid_t mod_id, Protocol__FlexDlSlice *dls)
+{
+  /* check mandatory parameters */
+  if (!dls->has_id) {
+    LOG_E(FLEXRAN_AGENT, "[%d] Incoming DL slice configuration has no ID\n", mod_id);
+    return 0;
+  }
+
+  /* verify parameters individualy */
+  /* label is enum */
+  if (!flexran_dl_slice_verify_pct(dls->percentage)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal DL slice percentage (%d)\n", mod_id, dls->percentage);
+    return 0;
+  }
+  /* isolation is a protobuf bool */
+  if (!flexran_dl_slice_verify_priority(dls->priority)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal DL slice priority (%d)\n", mod_id, dls->priority);
+    return 0;
+  }
+  if (!flexran_dl_slice_verify_position(dls->position_low, dls->position_high)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal DL slice position low (%d) and/or high (%d)\n",
+          mod_id, dls->position_low, dls->position_high);
+    return 0;
+  }
+  if (!flexran_dl_slice_verify_maxmcs(dls->maxmcs)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal DL slice max mcs %d\n", mod_id, dls->maxmcs);
+    return 0;
+  }
+  if (dls->n_sorting == 0) {
+    LOG_E(FLEXRAN_AGENT, "[%d] no sorting in DL slice", mod_id);
+    return 0;
+  }
+  if (!dls->sorting) {
+    LOG_E(FLEXRAN_AGENT, "[%d] no sorting found in DL slice\n", mod_id);
+    return 0;
+  }
+  /* sorting is an enum */
+  /* accounting is an enum */
+  if (dls->scheduler_name) {
+    LOG_E(FLEXRAN_AGENT, "[%d] setting the scheduler is not allowed\n", mod_id);
+    return 0;
+  }
+
+  return 1;
+}
+
+int flexran_verify_group_dl_slices(mid_t mod_id, Protocol__FlexDlSlice **existing,
+    int n_ex, Protocol__FlexDlSlice **update, int n_up)
+{
+  int i, j, n;
+  int pct, pct_orig;
+  /* for every update, array points to existing slice, or NULL if update
+   * creates new slice */
+  Protocol__FlexDlSlice *s[n_up];
+  for (i = 0; i < n_up; i++) {
+    s[i] = NULL;
+    for (j = 0; j < n_ex; j++) {
+      if (existing[j]->id == update[i]->id)
+        s[i] = existing[j];
+    }
+  }
+
+  /* check that number of created and number of added slices in total matches
+   * [1,10] */
+  n = n_ex;
+  for (i = 0; i < n_up; i++) {
+    /* new slice */
+    if (!s[i]) n += 1;
+    /* slice will be deleted */
+    else if (s[i]->percentage == 0) n -= 1;
+    /* else "only" an update */
+  }
+
+  if (n < 1 || n > MAX_NUM_SLICES) {
+    LOG_E(FLEXRAN_AGENT, "[%d] Illegal number of resulting slices (%d -> %d)\n", mod_id, n_ex, n);
+    return 0;
+  }
+
+  /* check that the sum of all slices percentages (including removed/added
+   * slices) matches [1,100] */
+  pct = 0;
+  for (i = 0; i < n_ex; i++) {
+    pct += existing[i]->percentage;
+  }
+  pct_orig = pct;
+  for (i = 0; i < n_up; i++) {
+    /* if there is an existing slice, subtract its percentage and add the
+     * update's percentage */
+    if (s[i])
+      pct -= s[i]->percentage;
+    pct += update[i]->percentage;
+  }
+  if (pct < 1 || pct > 100) {
+    LOG_E(FLEXRAN_AGENT, "[%d] invalid total RB share (%d%% -> %d%%)\n", mod_id, pct_orig, pct);
+    return 0;
+  }
+
+  return 1;
+}
+
+int flexran_verify_ul_slice(mid_t mod_id, Protocol__FlexUlSlice *uls)
+{
+  /* check mandatory parameters */
+  if (!uls->has_id) {
+    LOG_E(FLEXRAN_AGENT, "[%d] Incoming UL slice configuration has no ID\n", mod_id);
+    return 0;
+  }
+
+  /* verify parameters individually */
+  /* label is enum */
+  if (!flexran_ul_slice_verify_pct(uls->percentage)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal UL slice percentage (%d)\n", mod_id, uls->percentage);
+    return 0;
+  }
+  /* isolation is a protobuf bool */
+  if (!flexran_ul_slice_verify_priority(uls->priority)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal UL slice percentage (%d)\n", mod_id, uls->priority);
+    return 0;
+  }
+  if (!flexran_ul_slice_verify_first_rb(uls->first_rb)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal UL slice first RB (%d)\n", mod_id, uls->first_rb);
+    return 0;
+  }
+  if (!flexran_ul_slice_verify_maxmcs(uls->maxmcs)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] illegal UL slice max mcs (%d)\n", mod_id, uls->maxmcs);
+    return 0;
+  }
+  if (uls->n_sorting == 0) {
+    LOG_E(FLEXRAN_AGENT, "[%d] no sorting in UL slice\n", mod_id);
+    return 0;
+  }
+  if (!uls->sorting) {
+    LOG_E(FLEXRAN_AGENT, "[%d] no sorting found in UL slice\n", mod_id);
+    return 0;
+  }
+  /* sorting is an enum */
+  /* accounting is an enum */
+  if (uls->scheduler_name) {
+    LOG_E(FLEXRAN_AGENT, "[%d] setting the scheduler is not allowed\n", mod_id);
+    return 0;
+  }
+
+  return 1;
+}
+
+int flexran_verify_group_ul_slices(mid_t mod_id, Protocol__FlexUlSlice **existing,
+    int n_ex, Protocol__FlexUlSlice **update, int n_up)
+{
+  int i, j, n;
+  int pct, pct_orig;
+  /* for every update, array "s" points to existing slice, or NULL if update
+   * creates new slice; array "offs" gives the offset of this slice */
+  Protocol__FlexUlSlice *s[n_up];
+  int offs[n_up];
+  for (i = 0; i < n_up; i++) {
+    s[i] = NULL;
+    offs[i] = 0;
+    for (j = 0; j < n_ex; j++) {
+      if (existing[j]->id == update[i]->id) {
+        s[i] = existing[j];
+        offs[i] = j;
+      }
+    }
+  }
+
+  /* check that number of created and number of added slices in total matches
+   * [1,10] */
+  n = n_ex;
+  for (i = 0; i < n_up; i++) {
+    /* new slice */
+    if (!s[i]) n += 1;
+    /* slice will be deleted */
+    else if (s[i]->percentage == 0) n -= 1;
+    /* else "only" an update */
+  }
+
+  if (n < 1 || n > MAX_NUM_SLICES) {
+    LOG_E(FLEXRAN_AGENT, "[%d] Illegal number of resulting slices (%d -> %d)\n", mod_id, n_ex, n);
+    return 0;
+  }
+
+  /* check that the sum of all slices percentages (including removed/added
+   * slices) matches [1,100] */
+  pct = 0;
+  for (i = 0; i < n_ex; i++) {
+    pct += existing[i]->percentage;
+  }
+  pct_orig = pct;
+  for (i = 0; i < n_up; i++) {
+    /* if there is an existing slice, subtract its percentage and add the
+     * update's percentage */
+    if (s[i])
+      pct -= s[i]->percentage;
+    pct += update[i]->percentage;
+  }
+  if (pct < 1 || pct > 100) {
+    LOG_E(FLEXRAN_AGENT, "[%d] invalid total RB share (%d%% -> %d%%)\n", mod_id, pct_orig, pct);
+    return 0;
+  }
+
+  /* check that there is no overlap in slices resulting as the combination of
+   * first_rb and percentage */
+  struct sregion_s sregion[n];
+  const int N_RB = flexran_get_N_RB_UL(mod_id, 0); /* assume PCC */
+  int k = n_ex;
+  for (i = 0; i < n_ex; i++) {
+    sregion[i].start = existing[i]->first_rb;
+    sregion[i].length = existing[i]->percentage * N_RB / 100;
+  }
+  for (i = 0; i < n_up; i++) {
+    ptrdiff_t d = s[i] ? offs[i] : k++;
+    AssertFatal(d >= 0 && d < k, "illegal pointer offset (%ld, k=%d)\n", d, k);
+    sregion[d].start = update[i]->first_rb;
+    sregion[d].length = update[i]->percentage * N_RB / 100;
+  }
+  AssertFatal(k == n, "illegal number of slices while calculating overlap\n");
+  if (!check_ul_slice_overlap(mod_id, sregion, k)) {
+    LOG_E(FLEXRAN_AGENT, "[%d] UL slices are overlapping\n", mod_id);
+    return 0;
+  }
+
+  return 1;
+}
+
+int flexran_dl_slice_verify_pct(int pct)
+{
+  return pct >= 0 && pct <= 100;
+}
+
+int flexran_dl_slice_verify_priority(int prio)
+{
+  return prio >= 0;
+}
+
+int flexran_dl_slice_verify_position(int pos_low, int pos_high)
+{
+  return pos_low < pos_high && pos_low >= 0 && pos_high <= N_RBG_MAX;
+}
+
+int flexran_dl_slice_verify_maxmcs(int maxmcs)
+{
+  return maxmcs >= 0 && maxmcs <= 28;
+}
+
+int flexran_ul_slice_verify_pct(int pct)
+{
+  return pct >= 0 && pct <= 100;
+}
+
+int flexran_ul_slice_verify_priority(int prio)
+{
+  return prio >= 0;
+}
+
+int flexran_ul_slice_verify_first_rb(int first_rb)
+{
+  return first_rb >= 0 && first_rb < 100;
+}
+
+int flexran_ul_slice_verify_maxmcs(int maxmcs)
+{
+  return maxmcs >= 0 && maxmcs <= 20;
+}
+
+int sregion_compare(const void *_a, const void *_b)
+{
+  const struct sregion_s *a = (const struct sregion_s *)_a;
+  const struct sregion_s *b = (const struct sregion_s *)_b;
+  const int res = a->start - b->start;
+  if (res < 0)       return -1;
+  else if (res == 0) return 0;
+  else               return 1;
+}
+
+int check_ul_slice_overlap(mid_t mod_id, struct sregion_s *sr, int n)
+{
+  int i;
+  int overlap, op, u;
+  const int N_RB = flexran_get_N_RB_UL(mod_id, 0); /* assume PCC */
+  qsort(sr, n, sizeof(sr[0]), sregion_compare);
+  for (i = 0; i < n; i++) {
+    u = i == n-1 ? N_RB : sr[i+1].start;
+    AssertFatal(sr[i].start <= u, "unsorted slice list\n");
+    overlap = sr[i].start + sr[i].length - u;
+    if (overlap <= 0) continue;
+    op = overlap * 100 / sr[i].length;
+    LOG_W(FLEXRAN_AGENT, "[%d] slice overlap of %d%% detected\n", mod_id, op);
+    if (op >= 10) /* more than 10% overlap -> refuse */
+      return 0;
+  }
+  return 1;
+}
diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.h
new file mode 100644
index 0000000000000000000000000000000000000000..a8f4030d3664be1e1388d8d42cae8feed9a4dd90
--- /dev/null
+++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.h
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file flexran_agent_mac_slice_verification.h
+ * \brief MAC Agent slice verification helper functions
+ * \author Robert Schmidt
+ * \date 2018
+ * \version 0.1
+ */
+
+#include "flexran_agent_common_internal.h"
+#include "flexran_agent_mac_internal.h"
+
+int flexran_verify_dl_slice(mid_t mod_id, Protocol__FlexDlSlice *dls);
+int flexran_verify_group_dl_slices(mid_t mod_id, Protocol__FlexDlSlice **existing,
+    int n_ex, Protocol__FlexDlSlice **update, int n_up);
+int flexran_verify_ul_slice(mid_t mod_id, Protocol__FlexUlSlice *uls);
+int flexran_verify_group_ul_slices(mid_t mod_id, Protocol__FlexUlSlice **existing,
+    int n_ex, Protocol__FlexUlSlice **update, int n_up);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index c4c1cd1ca5ee379e7a5e53a0bd560b2004b7a39c..7a58cff2e54e6b48b32b7a9eef16ecb7a69df1e7 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -414,193 +414,7 @@ schedule_dlsch(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, in
   slice_info_t *sli = &RC.mac[module_idP]->slice_info;
   memset(sli->rballoc_sub, 0, sizeof(sli->rballoc_sub));
 
-  sli->tot_pct_dl = 0;
-  sli->avg_pct_dl = 1.0 / sli->n_dl;
-  //sli->slice_counter = sli->n_dl;
-
-  for (i = 0; i < sli->n_dl; i++) {
-    if (sli->dl[i].pct < 0) {
-      LOG_W(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: invalid percentage %f. resetting to zero",
-            module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].pct);
-      sli->dl[i].pct = 0;
-    }
-    sli->tot_pct_dl += sli->dl[i].pct;
-  }
-
-  // Check for *intra*slice share activation
-  if (sli->intraslice_share_active_current != sli->intraslice_share_active) {
-    if (sli->intraslice_share_active != 1 && sli->intraslice_share_active != 0) {
-      LOG_W(MAC,
-            "[eNB %d][DL] frame %d subframe %d: invalid intraslice sharing status (%d), revert to its previous value (%d)\n",
-            module_idP, frameP, subframeP, sli->intraslice_share_active, sli->intraslice_share_active_current);
-      sli->intraslice_share_active = sli->intraslice_share_active_current;
-    } else {
-      LOG_N(MAC, "[eNB %d][DL] frame %d subframe %d: intraslice sharing status has changed (%x-->%x)\n",
-            module_idP, frameP, subframeP, sli->intraslice_share_active_current, sli->intraslice_share_active);
-      sli->intraslice_share_active_current = sli->intraslice_share_active;
-    }
-  }
-
-  // Check for *inter*slice share activation
-  if (sli->interslice_share_active_current != sli->interslice_share_active) {
-    if (sli->interslice_share_active != 1 && sli->interslice_share_active != 0) {
-      LOG_W(MAC,
-            "[eNB %d][DL] frame %d subframe %d: invalid interslice sharing status (%d), revert to its previous value (%d)\n",
-            module_idP, frameP, subframeP, sli->interslice_share_active, sli->interslice_share_active_current);
-      sli->interslice_share_active = sli->interslice_share_active_current;
-    } else {
-      LOG_N(MAC, "[eNB %d][DL] frame %d subframe %d: interslice sharing status has changed (%x-->%x)\n",
-            module_idP, frameP, subframeP, sli->interslice_share_active_current, sli->interslice_share_active);
-      sli->interslice_share_active_current = sli->interslice_share_active;
-    }
-  }
-
   for (i = 0; i < sli->n_dl; i++) {
-
-    // Load any updated functions
-    if (sli->dl[i].update_sched > 0) {
-      sli->dl[i].sched_cb = dlsym(NULL, sli->dl[i].sched_name);
-      sli->dl[i].update_sched = 0;
-      sli->dl[i].update_sched_current = 0;
-      LOG_I(MAC, "update dl scheduler (%s) slice index %d ID %d\n",
-            sli->dl[i].sched_name, i, sli->dl[i].id);
-    }
-
-    if (sli->tot_pct_dl <= 1.0) { // the new total RB share is within the range
-
-      // check if the number of slices has changed, and log
-      if (sli->n_dl_current != sli->n_dl) {
-        if ((sli->n_dl > 0) && (sli->n_dl <= MAX_NUM_SLICES)) {
-          LOG_I(MAC, "[eNB %d]frame %d subframe %d: number of active DL slices has changed: %d-->%d\n",
-                module_idP, frameP, subframeP, sli->n_dl_current, sli->n_dl);
-          sli->n_dl_current = sli->n_dl;
-        } else {
-          LOG_W(MAC, "invalid number of DL slices %d, revert to the previous value %d\n",
-                sli->n_dl, sli->n_dl_current);
-          sli->n_dl = sli->n_dl_current;
-        }
-      }
-
-      // check if the slice rb share has changed, and log the console
-      if (sli->dl[i].pct_current != sli->dl[i].pct) { // new slice percentage
-        LOG_I(MAC,
-              "[eNB %d][SLICE %d][DL] frame %d subframe %d: total percentage %f-->%f, slice RB percentage has changed: %f-->%f\n",
-              module_idP, sli->dl[i].id, frameP, subframeP,
-              sli->tot_pct_dl_current, sli->tot_pct_dl,
-              sli->dl[i].pct_current, sli->dl[i].pct);
-        sli->tot_pct_dl_current = sli->tot_pct_dl;
-        sli->dl[i].pct_current = sli->dl[i].pct;
-      }
-
-      // check if the slice max MCS, and log the console
-      if (sli->dl[i].maxmcs_current != sli->dl[i].maxmcs) {
-        if ((sli->dl[i].maxmcs >= 0) && (sli->dl[i].maxmcs < 29)) {
-          LOG_I(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n",
-                module_idP, sli->dl[i].id, frameP, subframeP,
-                sli->dl[i].maxmcs_current, sli->dl[i].maxmcs);
-          sli->dl[i].maxmcs_current = sli->dl[i].maxmcs;
-        } else {
-          LOG_W(MAC, "[eNB %d][SLICE %d][DL] invalid slice max mcs %d, revert the previous value %d\n",
-                module_idP, sli->dl[i].id, sli->dl[i].maxmcs, sli->dl[i].maxmcs_current);
-          sli->dl[i].maxmcs = sli->dl[i].maxmcs_current;
-        }
-      }
-
-      // check if a new scheduler, and log the console
-      if (sli->dl[i].update_sched_current != sli->dl[i].update_sched) {
-        LOG_I(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: DL scheduler for this slice is updated: %s \n",
-              module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].sched_name);
-        sli->dl[i].update_sched_current = sli->dl[i].update_sched;
-      }
-
-    } else {
-      // here we can correct the values, e.g. reduce proportionally
-
-      if (sli->n_dl == sli->n_dl_current) {
-        LOG_W(MAC,
-              "[eNB %d][SLICE %d][DL] invalid total RB share (%f->%f), reduce proportionally the RB share by 0.1\n",
-              module_idP, sli->dl[i].id, sli->tot_pct_dl_current, sli->tot_pct_dl);
-        if (sli->dl[i].pct >= sli->avg_pct_dl) {
-          sli->dl[i].pct -= 0.1;
-          sli->tot_pct_dl -= 0.1;
-        }
-      } else {
-        LOG_W(MAC,
-              "[eNB %d][SLICE %d][DL] invalid total RB share (%f->%f), revert the number of slice to its previous value (%d->%d)\n",
-              module_idP, sli->dl[i].id, sli->tot_pct_dl_current, sli->tot_pct_dl,
-              sli->n_dl, sli->n_dl_current);
-        sli->n_dl = sli->n_dl_current;
-        sli->dl[i].pct = sli->dl[i].pct_current;
-      }
-    }
-
-    // Check for new slice positions
-    if (sli->dl[i].pos_low > sli->dl[i].pos_high ||
-        sli->dl[i].pos_low < 0 ||
-        sli->dl[i].pos_high > N_RBG_MAX) {
-      LOG_W(MAC, "[eNB %d][SLICE %d][DL] invalid slicing position (%d-%d), using previous values (%d-%d)\n",
-            module_idP, sli->dl[i].id,
-            sli->dl[i].pos_low, sli->dl[i].pos_high,
-            sli->dl[i].pos_low_current, sli->dl[i].pos_high_current);
-      sli->dl[i].pos_low = sli->dl[i].pos_low_current;
-      sli->dl[i].pos_high = sli->dl[i].pos_high_current;
-    } else {
-      if (sli->dl[i].pos_low_current != sli->dl[i].pos_low) {
-        LOG_N(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: start frequency has changed (%d-->%d)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].pos_low_current, sli->dl[i].pos_low);
-        sli->dl[i].pos_low_current = sli->dl[i].pos_low;
-      }
-      if (sli->dl[i].pos_high_current != sli->dl[i].pos_high) {
-        LOG_N(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: end frequency has changed (%d-->%d)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].pos_high_current, sli->dl[i].pos_high);
-        sli->dl[i].pos_high_current = sli->dl[i].pos_high;
-      }
-    }
-
-    // Check for new sorting policy
-    if (sli->dl[i].sorting_current != sli->dl[i].sorting) {
-      LOG_I(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: UE sorting policy has changed (%x-->%x)\n",
-            module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].sorting_current, sli->dl[i].sorting);
-      sli->dl[i].sorting_current = sli->dl[i].sorting;
-    }
-
-    // Check for new slice isolation
-    if (sli->dl[i].isol_current != sli->dl[i].isol) {
-      if (sli->dl[i].isol != 1 && sli->dl[i].isol != 0) {
-        LOG_W(MAC,
-              "[eNB %d][SLICE %d][DL] frame %d subframe %d: invalid slice isolation setting (%d), revert to its previous value (%d)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].isol, sli->dl[i].isol_current);
-        sli->dl[i].isol = sli->dl[i].isol_current;
-      } else {
-        LOG_I(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: slice isolation setting has changed (%x-->%x)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].isol_current, sli->dl[i].isol);
-        sli->dl[i].isol_current = sli->dl[i].isol;
-      }
-    }
-
-    // Check for new slice priority
-    if (sli->dl[i].prio_current != sli->dl[i].prio) {
-      LOG_I(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: slice priority setting has changed (%d-->%d)\n",
-            module_idP, sli->dl[i].id, frameP, subframeP, sli->dl[i].prio_current, sli->dl[i].prio);
-      sli->dl[i].prio_current = sli->dl[i].prio;
-    }
-
-    // Check for new accounting policy
-    if (sli->dl[i].accounting_current != sli->dl[i].accounting) {
-      if (sli->dl[i].accounting > 1 || sli->dl[i].accounting < 0) {
-        LOG_W(MAC,
-              "[eNB %d][SLICE %d][DL] frame %d subframe %d: invalid accounting policy (%d), revert to its previous value (%d)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP,
-              sli->dl[i].accounting, sli->dl[i].accounting_current);
-        sli->dl[i].accounting = sli->dl[i].accounting_current;
-      } else {
-        LOG_N(MAC, "[eNB %d][SLICE %d][DL] frame %d subframe %d: UE sorting policy has changed (%x-->%x)\n",
-              module_idP, sli->dl[i].id, frameP, subframeP,
-              sli->dl[i].accounting_current, sli->dl[i].accounting);
-        sli->dl[i].accounting_current = sli->dl[i].accounting;
-      }
-    }
-
     // Run each enabled slice-specific schedulers one by one
     sli->dl[i].sched_cb(module_idP, i, frameP, subframeP, mbsfn_flag/*, dl_info*/);
   }
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 68cd5de8bdffbfe7395b9d1dae6a36a596b5f7d6..4618d363f98bce612e06445b17228ced3ab324ca 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -1038,112 +1038,7 @@ schedule_ulsch(module_id_t module_idP, frame_t frameP,
     }
   }
 
-  // perform slice-specifc operations
-
-  sli->tot_pct_ul = 0;
-  sli->avg_pct_ul = 1.0 / sli->n_ul;
-
   for (i = 0; i < sli->n_ul; i++) {
-    if (sli->ul[i].pct < 0 ){
-      LOG_W(MAC,
-            "[eNB %d][SLICE %d][UL] frame %d subframe %d: invalid percentage %f. resetting to zero",
-            module_idP, sli->ul[i].id, frameP, subframeP, sli->ul[i].pct);
-      sli->ul[i].pct = 0;
-    }
-    sli->tot_pct_ul += sli->ul[i].pct;
-  }
-
-  for (i = 0; i < sli->n_ul; i++) {
-
-    // Load any updated functions
-    if (sli->ul[i].update_sched > 0 ) {
-      sli->ul[i].sched_cb = dlsym(NULL, sli->ul[i].sched_name);
-      sli->ul[i].update_sched = 0;
-      sli->ul[i].update_sched_current = 0;
-      //sli->ul[i].pct_current = sli->ul[i].pct;
-      //sli->tot_pct_ul_current += sli->ul[i].pct;
-      //if (sli->tot_pct_ul_current > 1)
-      //sli->tot_pct_ul_current = 1;
-      LOG_I(MAC,"update ul scheduler (%s) slice index %d ID %d\n",
-                sli->ul[i].sched_name, i, sli->ul[i].id);
-    }
-    // the new total RB share is within the range
-    if (sli->tot_pct_ul <= 1.0){
-
-      // check if the number of slices has changed, and log
-      if (sli->n_ul_current != sli->n_ul ){
-        if ((sli->n_ul > 0) && (sli->n_ul <= MAX_NUM_SLICES)) {
-          LOG_I(MAC,"[eNB %d]frame %d subframe %d: number of active UL slices has changed: %d-->%d\n",
-                module_idP, frameP, subframeP, sli->n_ul_current, sli->n_ul);
-          sli->n_ul_current = sli->n_ul;
-        } else {
-          LOG_W(MAC,"invalid number of UL slices %d, revert to the previous value %d\n",
-                sli->n_ul, sli->n_ul_current);
-          sli->n_ul = sli->n_ul_current;
-        }
-      }
-
-      // check if the slice rb share has changed, and log the console
-      if (sli->ul[i].pct_current != sli->ul[i].pct){
-        LOG_I(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: total percentage %f-->%f, slice RB percentage has changed: %f-->%f\n",
-              module_idP, sli->ul[i].id, frameP, subframeP, sli->tot_pct_ul_current,
-              sli->tot_pct_ul, sli->ul[i].pct_current, sli->ul[i].pct);
-        sli->tot_pct_ul_current = sli->tot_pct_ul;
-        sli->ul[i].pct_current = sli->ul[i].pct;
-      }
-
-      // check if the slice max MCS, and log the console
-      if (sli->ul[i].maxmcs_current != sli->ul[i].maxmcs){
-        if ((sli->ul[i].maxmcs >= 0) && (sli->ul[i].maxmcs <= 20)){
-          LOG_I(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n",
-                module_idP, sli->ul[i].id, frameP, subframeP,
-                sli->ul[i].maxmcs_current, sli->ul[i].maxmcs);
-          sli->ul[i].maxmcs_current = sli->ul[i].maxmcs;
-        } else {
-          LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid slice max mcs %d, revert the previous value %d\n",
-                module_idP, sli->ul[i].id, sli->ul[i].maxmcs, sli->ul[i].maxmcs_current);
-          sli->ul[i].maxmcs = sli->ul[i].maxmcs_current;
-        }
-      }
-
-      if (sli->ul[i].first_rb_current != sli->ul[i].first_rb){
-        if (sli->ul[i].first_rb >= 0){ // FIXME: Max limit is checked in the scheduler
-          LOG_N(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: slice first rb has changed: %d-->%d\n",
-                module_idP, sli->ul[i].id, frameP, subframeP,
-                sli->ul[i].first_rb_current, sli->ul[i].first_rb);
-          sli->ul[i].first_rb_current = sli->ul[i].first_rb;
-        } else {
-          LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid slice first rb %d, revert the previous value %d\n",
-                module_idP, sli->ul[i].id, sli->ul[i].first_rb,
-                sli->ul[i].first_rb_current);
-          sli->ul[i].first_rb = sli->ul[i].first_rb_current;
-        }
-      }
-
-      // check if a new scheduler, and log the console
-      if (sli->ul[i].update_sched_current != sli->ul[i].update_sched) {
-        LOG_I(MAC,"[eNB %d][SLICE %d][UL] frame %d subframe %d: UL scheduler for this slice is updated: %s \n",
-              module_idP, sli->ul[i].id, frameP, subframeP, sli->ul[i].sched_name);
-        sli->ul[i].update_sched_current = sli->ul[i].update_sched;
-      }
-    } else {
-      if (sli->n_ul == sli->n_ul_current) {
-        LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid total RB share (%f->%f), reduce proportionally the RB share by 0.1\n",
-              module_idP, sli->ul[i].id, sli->tot_pct_ul_current, sli->tot_pct_ul);
-        if (sli->ul[i].pct > sli->avg_pct_ul) {
-          sli->ul[i].pct -= 0.1;
-          sli->tot_pct_ul -= 0.1;
-        }
-      } else {
-        // here we can correct the values, e.g. reduce proportionally
-        LOG_W(MAC,"[eNB %d][SLICE %d][UL] invalid total RB share (%f->%f), revert the  number of slice to its previous value (%d->%d)\n",
-              module_idP, sli->ul[i].id, sli->tot_pct_ul_current,
-              sli->tot_pct_ul, sli->n_ul, sli->n_ul_current);
-        sli->n_ul = sli->n_ul_current;
-        sli->ul[i].pct = sli->ul[i].pct_current;
-      }
-    }
-
     // Run each enabled slice-specific schedulers one by one
     sli->ul[i].sched_cb(module_idP, i, frameP, subframeP, sched_subframe, first_rb);
   }
diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h
index 5507f643f0647715fc7be4f89ddd92e2d060740e..6148b63363cb8f5d7bd456d6b701b0f64e2cd48c 100644
--- a/openair2/LAYER2/MAC/mac.h
+++ b/openair2/LAYER2/MAC/mac.h
@@ -1151,38 +1151,29 @@ typedef void (*slice_scheduler_dl)(module_id_t mod_id,
 typedef struct {
     slice_id_t id;
 
-    /// RB share for each slice for past and current time
+    /// RB share for each slice
     float     pct;
-    float     pct_current;
 
-    /// whether this slice is isolated from the others for past and current time
+    /// whether this slice is isolated from the others
     int       isol;
-    int       isol_current;
 
     int       prio;
-    int       prio_current;
 
     /// Frequency ranges for slice positioning
     int       pos_low;
     int       pos_high;
-    int       pos_low_current;
-    int       pos_high_current;
 
-    // max mcs for each slice for past and current time
+    // max mcs for each slice
     int       maxmcs;
-    int       maxmcs_current;
 
     /// criteria for sorting policies of the slices
     uint32_t  sorting;
-    uint32_t  sorting_current;
 
     /// Accounting policy (just greedy(1) or fair(0) setting for now)
     int       accounting;
-    int       accounting_current;
 
     /// Whether the scheduler callback should be updated
     int       update_sched;
-    int       update_sched_current;
 
     /// name of available scheduler
     char     *sched_name;
@@ -1202,25 +1193,20 @@ typedef void (*slice_scheduler_ul)(module_id_t   mod_id,
 typedef struct {
     slice_id_t id;
 
-    /// RB share for each slice for past and current time
+    /// RB share for each slice
     float     pct;
-    float     pct_current;
 
-    // MAX MCS for each slice for past and current time
+    // MAX MCS for each slice
     int       maxmcs;
-    int       maxmcs_current;
 
     /// criteria for sorting policies of the slices
     uint32_t  sorting;
-    uint32_t  sorting_current;
 
     /// starting RB (RB offset) of UL scheduling
     int       first_rb;
-    int       first_rb_current;
 
     /// Slice scheduler callback update needed
     int       update_sched;
-    int       update_sched_current;
 
     /// name of available scheduler
     char     *sched_name;
@@ -1238,28 +1224,16 @@ typedef struct {
     /// indicates whether remaining RBs after first intra-slice allocation will
     /// be allocated to UEs of the same slice
     int       intraslice_share_active;
-    int       intraslice_share_active_current;
     /// indicates whether remaining RBs after slice allocation will be
     /// allocated to UEs of another slice. Isolated slices will be ignored
     int       interslice_share_active;
-    int       interslice_share_active_current;
 
-    /// number of active slices for past and current time in DL
+    /// number of active DL slices
     int      n_dl;
-    int      n_dl_current;
-    /// RB share stats for DL
-    float    tot_pct_dl;
-    float    tot_pct_dl_current;
-    float    avg_pct_dl;
     slice_sched_conf_dl_t dl[MAX_NUM_SLICES];
 
-    /// number of active slices for past and current time in UL
+    /// number of active UL slices
     int      n_ul;
-    int      n_ul_current;
-    /// RB share stats for UL
-    float    tot_pct_ul;
-    float    tot_pct_ul_current;
-    float    avg_pct_ul;
     slice_sched_conf_ul_t ul[MAX_NUM_SLICES];
 
     pre_processor_results_t pre_processor_results[MAX_NUM_SLICES];
diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c
index 4c3e22acb78600345144201e60ab2abbf5212296..e34e0e1dd031fa52fb418752ff96603200698c32 100644
--- a/openair2/LAYER2/MAC/main.c
+++ b/openair2/LAYER2/MAC/main.c
@@ -138,44 +138,24 @@ void mac_top_init_eNB(void)
         sli = &mac->slice_info;
 
         sli->intraslice_share_active = 1;
-        sli->intraslice_share_active_current = 1;
         sli->interslice_share_active = 1;
-        sli->interslice_share_active_current = 1;
 
         sli->n_dl = 1;
-        sli->n_dl_current = 1;
-        sli->tot_pct_dl = 1;
-        sli->tot_pct_dl_current = 1;
-        sli->avg_pct_dl = 0.25;
         memset(sli->dl, 0, sizeof(slice_sched_conf_dl_t) * MAX_NUM_SLICES);
         sli->dl[0].pct = 1.0;
-        sli->dl[0].pct_current = 1.0;
         sli->dl[0].prio = 10;
-        sli->dl[0].prio_current = 10;
         sli->dl[0].pos_high = N_RBG_MAX;
-        sli->dl[0].pos_high_current = N_RBG_MAX;
         sli->dl[0].maxmcs = 28;
-        sli->dl[0].maxmcs_current = 28;
         sli->dl[0].sorting = 0x012345;
-        sli->dl[0].sorting_current = 0x012345;
         sli->dl[0].update_sched = 1;
-        sli->dl[0].update_sched_current = 1;
         sli->dl[0].sched_name = "schedule_ue_spec";
 
         sli->n_ul = 1;
-        sli->n_ul_current = 1;
-        sli->tot_pct_ul = 1;
-        sli->tot_pct_ul_current = 1;
-        sli->avg_pct_ul = 0.25;
         memset(sli->ul, 0, sizeof(slice_sched_conf_ul_t) * MAX_NUM_SLICES);
         sli->ul[0].pct = 1.0;
-        sli->ul[0].pct_current = 1.0;
         sli->ul[0].maxmcs = 20;
-        sli->ul[0].maxmcs_current = 20;
         sli->ul[0].sorting = 0x0123;
-        sli->ul[0].sorting_current = 0x0123;
         sli->ul[0].update_sched = 1;
-        sli->ul[0].update_sched_current = 1;
         sli->ul[0].sched_name = "schedule_ulsch_rnti";
     }