diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c
index ff91d711d986c9a785e264ff2257ef0c329a9350..24ed07ac9255d0448af4d92c3f73ee1c31282e39 100644
--- a/openair2/ENB_APP/flexran_agent.c
+++ b/openair2/ENB_APP/flexran_agent.c
@@ -115,7 +115,7 @@ void *receive_thread(void *args) {
   
   while (1) {
 
-    while (flexran_agent_msg_recv(d->mod_id, FLEXRAN_AGENT_DEFAULT, &data, &size, &priority) == 0) {
+    while ((size = flexran_agent_msg_recv(d->mod_id, FLEXRAN_AGENT_DEFAULT, &data, &priority)) > 0) {
       
       LOG_D(FLEXRAN_AGENT,"received message with size %d\n", size);
   
diff --git a/openair2/ENB_APP/flexran_agent_async.c b/openair2/ENB_APP/flexran_agent_async.c
index 34d2f5b1e8e72834a8e696dc68d0297b1220be74..fa2e0c9ff583c1f5d7e697f325f2b514b5f3cffb 100644
--- a/openair2/ENB_APP/flexran_agent_async.c
+++ b/openair2/ENB_APP/flexran_agent_async.c
@@ -94,11 +94,11 @@ int flexran_agent_async_msg_send(void *data, int size, int priority, void *chann
   return message_put(channel->send_queue, data, size, priority);
 }
 
-int flexran_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info) {
+int flexran_agent_async_msg_recv(void **data, int *priority, void *channel_info) {
   flexran_agent_async_channel_t *channel;
   channel = (flexran_agent_async_channel_t *)channel_info;
 
-  return message_get(channel->receive_queue, data, size, priority);
+  return message_get(channel->receive_queue, data, priority);
 }
 
 void flexran_agent_async_release(flexran_agent_channel_t *channel) {
diff --git a/openair2/ENB_APP/flexran_agent_async.h b/openair2/ENB_APP/flexran_agent_async.h
index 03aebd0058fc6c3293baa664119124e6921f6ef2..1ebc565f62b31a5555ac00add7a9d4e50912878a 100644
--- a/openair2/ENB_APP/flexran_agent_async.h
+++ b/openair2/ENB_APP/flexran_agent_async.h
@@ -46,7 +46,7 @@ flexran_agent_async_channel_t * flexran_agent_async_channel_info(mid_t mod_id, c
 int flexran_agent_async_msg_send(void *data, int size, int priority, void *channel_info);
 
 /* Receive a message from a given channel */
-int flexran_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info);
+int flexran_agent_async_msg_recv(void **data, int *priority, void *channel_info);
 
 /* Release a channel */
 void flexran_agent_async_release(flexran_agent_channel_t *channel);
diff --git a/openair2/ENB_APP/flexran_agent_net_comm.c b/openair2/ENB_APP/flexran_agent_net_comm.c
index d5142e5456eeb10b86c6f7cd944929c0fdaf0804..0d1c52096dce1bc277a217c0dac5e93ce60f8144 100644
--- a/openair2/ENB_APP/flexran_agent_net_comm.c
+++ b/openair2/ENB_APP/flexran_agent_net_comm.c
@@ -53,7 +53,7 @@ int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int si
   return -1;
 }
 
-int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *size, int *priority) {
+int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *priority) {
   /*Check if agent id is valid*/
   if (agent_id >= FLEXRAN_AGENT_MAX || agent_id < 0) {
     goto error;
@@ -66,7 +66,7 @@ int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *
     goto error;
   }
   
-  return channel->msg_recv(data, size, priority, channel->channel_info);
+  return channel->msg_recv(data, priority, channel->channel_info);
   
  error:
   LOG_E(FLEXRAN_AGENT, "No channel registered for agent with id %d\n", agent_id);
@@ -104,7 +104,7 @@ void flexran_agent_unregister_channel(mid_t mod_id, agent_id_t agent_id) {
 
 int flexran_agent_create_channel(void *channel_info,
 				 int (*msg_send)(void *data, int size, int priority, void *channel_info),
-				 int (*msg_recv)(void **data, int *size, int *priority, void *channel_info),
+				 int (*msg_recv)(void **data, int *priority, void *channel_info),
 				 void (*release)(flexran_agent_channel_t *channel)) {
   
   int channel_id = ++flexran_agent_channel_id;
diff --git a/openair2/ENB_APP/flexran_agent_net_comm.h b/openair2/ENB_APP/flexran_agent_net_comm.h
index 2f59b0f7a379f90659e127ac2244cbba935b4919..4d012989fd80fe0788b58f8c40451f7aa78d63ef 100644
--- a/openair2/ENB_APP/flexran_agent_net_comm.h
+++ b/openair2/ENB_APP/flexran_agent_net_comm.h
@@ -39,7 +39,7 @@ int channel_id;
 void *channel_info;
 /*Callbacks for channel message Tx and Rx*/
 int (*msg_send)(void *data, int size, int priority, void *channel_info);
-int (*msg_recv)(void **data, int *size, int *priority, void *channel_info);
+int (*msg_recv)(void **data, int *priority, void *channel_info);
 void (*release)(struct flexran_agent_channel_s *channel);
 } flexran_agent_channel_t;
 
@@ -49,7 +49,7 @@ typedef struct flexran_agent_channel_instance_s{
 
 /*Send and receive messages using the channel registered for a specific agent*/
 int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority);
-int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *size, int *priority);
+int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *priority);
 
 /*Register a channel to an agent. Use FLEXRAN_AGENT_MAX to register the
  *same channel to all agents*/
@@ -61,7 +61,7 @@ void flexran_agent_unregister_channel(mid_t mod_id, agent_id_t agent_id);
 /*Create a new channel. Returns the id of the new channel or negative number otherwise*/
 int flexran_agent_create_channel(void *channel_info,
 				 int (*msg_send)(void *data, int size, int priority, void *channel_info),
-				 int (*msg_recv)(void **data, int *size, int *priority, void *channel_info),
+				 int (*msg_recv)(void **data, int *priority, void *channel_info),
 				 void (*release)(flexran_agent_channel_t *channel));
 
 /*Unregister a channel from all agents and destroy it. Returns 0 in case of success*/
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent.c b/openair2/LAYER2/PROTO_AGENT/proto_agent.c
index 00441aeed572ffef88836c55a0aa2265c864e352..148392280b697b0e01ac78c6d9c7fb2fd8cd279e 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent.c
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent.c
@@ -266,7 +266,7 @@ proto_agent_receive(void *args)
     msg = NULL;
     ser_msg = NULL;
     
-    if (proto_agent_async_msg_recv(&data, &size, &priority, inst->channel->channel_info)){
+    if ((size = proto_agent_async_msg_recv(&data, &priority, inst->channel->channel_info)) <= 0){
       err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING;
       goto error;
     }
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c
index 94532b1942d2ad3b4cca5216838cb7b8690b3ef9..476ecac90d68e236c943f4f912fd7b67eb981c29 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c
@@ -78,10 +78,10 @@ int proto_agent_async_msg_send(void *data, int size, int priority, void *channel
   return message_put(channel->send_queue, data, size, priority);
 }
 
-int proto_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info)
+int proto_agent_async_msg_recv(void **data, int *priority, void *channel_info)
 {
   proto_agent_async_channel_t *channel = channel_info;
-  return message_get(channel->receive_queue, data, size, priority);
+  return message_get(channel->receive_queue, data, priority);
 }
 
 void proto_agent_async_release(proto_agent_channel_t *channel)
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.h b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.h
index 7658e1d98fb32acc61af43d58fc42655290e6114..12050480525bef457598a6d9f24494cf5ae0ea79 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.h
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.h
@@ -53,7 +53,7 @@ proto_agent_async_channel_info(mod_id_t mod_id, const char *bind_ip, uint16_t bi
 
 int proto_agent_async_msg_send(void *data, int size, int priority, void *channel_info);
 
-int proto_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info);
+int proto_agent_async_msg_recv(void **data, int *priority, void *channel_info);
 
 void proto_agent_async_release(proto_agent_channel_t *channel);
 
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
index 5788bd0830da42fb6c3dc36cf16803427635f266..d396748d76e6b41b51da5ea5b28fe4e03f6ddcf7 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.c
@@ -72,7 +72,7 @@ void proto_agent_unregister_channel(mod_id_t mod_id, proto_agent_id_t agent_id)
 
 int proto_agent_create_channel(void *channel_info,
 			       int (*msg_send)(void *data, int size, int priority, void *channel_info),
-			       int (*msg_recv)(void **data, int *size, int *priority, void *channel_info),
+			       int (*msg_recv)(void **data, int *priority, void *channel_info),
 			     void (*release)(proto_agent_channel_t *channel)) {
   
   int channel_id = ++proto_agent_channel_id;
diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.h b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.h
index c88ba35b1369ee0feb84678898c8e41eae7469c8..c956bf48b1daf93e435c7e15a800d196151f214e 100644
--- a/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.h
+++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_net_comm.h
@@ -51,7 +51,7 @@ typedef struct proto_agent_channel_s {
   struct proto_agent_async_channel_s *channel_info;
   /*Callbacks for channel message Tx and Rx*/
   int (*msg_send)(void *data, int size, int priority, void *channel_info);
-  int (*msg_recv)(void **data, int *size, int *priority, void *channel_info);
+  int (*msg_recv)(void **data, int *priority, void *channel_info);
   void (*release)(struct proto_agent_channel_s *channel);
 } proto_agent_channel_t;
 
@@ -70,7 +70,7 @@ void proto_agent_unregister_channel(mod_id_t mod_id, proto_agent_id_t agent_id);
 /*Create a new channel. Returns the id of the new channel or negative number otherwise*/
 int proto_agent_create_channel(void *channel_info,
 			       int (*msg_send)(void *data, int size, int priority, void *channel_info),
-			       int (*msg_recv)(void **data, int *size, int *priority, void *channel_info),
+			       int (*msg_recv)(void **data, int *priority, void *channel_info),
 			     void (*release)(proto_agent_channel_t *channel));
 
 /*Unregister a channel from all agents and destroy it. Returns 0 in case of success*/
diff --git a/openair2/UTIL/ASYNC_IF/link_manager.c b/openair2/UTIL/ASYNC_IF/link_manager.c
index 9ac06b8ad5df4149bd7dc77f44ef54273af15ceb..110b9edb7e7e9483cc2261b286a276d444e9adda 100644
--- a/openair2/UTIL/ASYNC_IF/link_manager.c
+++ b/openair2/UTIL/ASYNC_IF/link_manager.c
@@ -46,7 +46,7 @@ static void *link_manager_sender_thread(void *_manager)
   LOG_D(MAC, "starting link manager sender thread\n");
 
   while (manager->run) {
-    while (message_get(manager->send_queue, &data, &size, &priority) == 0) {
+    while ((size = message_get(manager->send_queue, &data, &priority)) > 0) {
       link_send_packet(manager->socket_link, data, size, manager->peer_addr, manager->peer_port);
       free(data);
     }
@@ -184,7 +184,7 @@ int main(void)
   data = strdup("hello"); if (data == NULL) goto error;
   if (message_put(send_queue, data, 6, 100)) goto error;
 
-  if (message_get(receive_queue, &data, &size, &priority)) goto error;
+  if ((size = message_get(receive_queue, &data, &priority)) <= 0) goto error;
   printf("received message:\n");
   printf("    data: %s\n", (char *)data);
   printf("    size: %d\n", size);
@@ -228,7 +228,7 @@ int main(void)
   manager = create_link_manager(send_queue, receive_queue, link);
   if (manager == NULL) goto error;
 
-  if (message_get(receive_queue, &data, &size, &priority)) goto error;
+  if ((size = message_get(receive_queue, &data, &priority)) <= 0) goto error;
   printf("received message:\n");
   printf("    data: %s\n", (char *)data);
   printf("    size: %d\n", size);
diff --git a/openair2/UTIL/ASYNC_IF/message_queue.c b/openair2/UTIL/ASYNC_IF/message_queue.c
index 5a33fbfabe7c8a027e15a3dedb6d2e7da2cff67a..42790bdaaa5b80e6d43db80bdc74778ece8a0bf0 100644
--- a/openair2/UTIL/ASYNC_IF/message_queue.c
+++ b/openair2/UTIL/ASYNC_IF/message_queue.c
@@ -72,6 +72,8 @@ error:
 int message_put(message_queue_t *queue, void *data, int size, int priority)
 {
   message_t *m = NULL;
+  if (size <= 0)
+    goto error;
 
   m = calloc(1, sizeof(message_t));
   if (m == NULL)
@@ -106,12 +108,12 @@ int message_put(message_queue_t *queue, void *data, int size, int priority)
   return 0;
 
 error:
-  free(m);
+  if (m) free(m);
   LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
   return -1;
 }
 
-int message_get(message_queue_t *queue, void **data, int *size, int *priority)
+int message_get(message_queue_t *queue, void **data, int *priority)
 {
   message_t *m;
 
@@ -136,12 +138,11 @@ int message_get(message_queue_t *queue, void **data, int *size, int *priority)
     goto error;
 
   *data = m->data;
-  *size = m->size;
+  const int size = m->size;
   *priority = m->priority;
   free(m);
 
-  return 0;
-
+  return size;
 error:
   LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
   return -1;
@@ -181,10 +182,10 @@ int main(void)
   if (message_put(q, "hello", 6, 0)) goto error;
   if (message_put(q, "world", 6, 1)) goto error;
 
-  if (message_get(q, &data, &size, &priority)) goto error;
+  if ((size = message_get(q, &data, &priority)) <= 0) goto error;
   printf("message:\n  data: '%s'\n  size: %d\n  priority: %d\n",
          (char *)data, size, priority);
-  if (message_get(q, &data, &size, &priority)) goto error;
+  if ((size = message_get(q, &data, &priority)) <= 0) goto error;
   printf("message:\n  data: '%s'\n  size: %d\n  priority: %d\n",
          (char *)data, size, priority);
 
diff --git a/openair2/UTIL/ASYNC_IF/message_queue.h b/openair2/UTIL/ASYNC_IF/message_queue.h
index e5fc36ecd5f315711b6ec9ab5b20f34aeb8ff320..6d8d2a591a7061c81508e79e11fd6960796b6e75 100644
--- a/openair2/UTIL/ASYNC_IF/message_queue.h
+++ b/openair2/UTIL/ASYNC_IF/message_queue.h
@@ -55,7 +55,7 @@ typedef struct {
 
 message_queue_t *new_message_queue(void);
 int message_put(message_queue_t *queue, void *data, int size, int priority);
-int message_get(message_queue_t *queue, void **data, int *size, int *priority);
+int message_get(message_queue_t *queue, void **data, int *priority);
 void destroy_message_queue(message_queue_t *queue);
 
 #ifdef __cplusplus
diff --git a/openair2/UTIL/ASYNC_IF/ringbuffer_queue.c b/openair2/UTIL/ASYNC_IF/ringbuffer_queue.c
index 201603e0c57f327541c7aa0da91ba076a9393ced..f46ca41d788e106bc9e9539807cd2ae213663b9b 100644
--- a/openair2/UTIL/ASYNC_IF/ringbuffer_queue.c
+++ b/openair2/UTIL/ASYNC_IF/ringbuffer_queue.c
@@ -67,6 +67,9 @@ int message_put(message_queue_t *queue, void *data, int size, int priority) {
   message_t *overwritten_msg;
   message_t *m = NULL;
 
+  if (size <= 0)
+    goto error;
+
   LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE;
   lfds700_misc_prng_init(&ls);
   
@@ -94,12 +97,11 @@ int message_put(message_queue_t *queue, void *data, int size, int priority) {
   return 0;
 
  error:
-  free(m);
   LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
   return -1;
 }
 
-int message_get(message_queue_t *queue, void **data, int *size, int *priority) {
+int message_get(message_queue_t *queue, void **data, int *priority) {
   message_t *m;
   struct lfds700_misc_prng_state ls;
   
@@ -111,10 +113,10 @@ int message_get(message_queue_t *queue, void **data, int *size, int *priority) {
   }
 
   *data = m->data;
-  *size = m->size;
+  const int size = m->size;
   *priority = m->priority;
   free(m);
-  return 0;
+  return size;
 }
 
 void destroy_message_queue(message_queue_t *queue) {
diff --git a/openair2/UTIL/ASYNC_IF/ringbuffer_queue.h b/openair2/UTIL/ASYNC_IF/ringbuffer_queue.h
index 04414cbbb2b9618379ad1284a056943e04539c23..344187fe5c66c3b2558ec6c3f5759ece7e997720 100644
--- a/openair2/UTIL/ASYNC_IF/ringbuffer_queue.h
+++ b/openair2/UTIL/ASYNC_IF/ringbuffer_queue.h
@@ -47,7 +47,7 @@ typedef struct {
 
 message_queue_t * new_message_queue(int size);
 int message_put(message_queue_t *queue, void *data, int size, int priority);
-int message_get(message_queue_t *queue, void **data, int *size, int *priority);
+int message_get(message_queue_t *queue, void **data, int *priority);
 void destroy_message_queue(message_queue_t *queue);
 
 #endif /* RINGBUFFER_QUEUE_H */