diff --git a/core/include/oneway_malloc.h b/core/include/oneway_malloc.h
deleted file mode 100644
index 3f24ff3075f30115a4aeff3074dedb742ca2fa22..0000000000000000000000000000000000000000
--- a/core/include/oneway_malloc.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2013 Freie Universität Berlin
- *
- * This file is subject to the terms and conditions of the GNU Lesser General
- * Public License. See the file LICENSE in the top level directory for more
- * details.
- */
-
-/**
- * @addtogroup  core_util
- * @{
- *
- * @file        oneway_malloc.h
- * @brief       Simple malloc wrapper for sbrk
- *
- * @author      Freie Universität Berlin, Computer Systems & Telematics
- * @author      Kaspar Schleiser <kaspar@schleiser.de>
- *
- * @detail      Simple malloc implementation for plattforms
- *              without malloc in libc, e.g. msb430.
- */
-
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-
-#include <stddef.h>
-
-/**
- * @brief Allocates a block of `size` bytes of memory
- *
- * @param[in] Size of the memory block, in bytes.
- *
- * @return On success, a pointer to the memory block allocated by the function.
- * @return NULL otherwise.
- */
-void *_malloc(size_t size);
-
-/**
- * @brief Changes the size of the memory block pointed to by ptr.
- *
- * @param[in] Pointer to a memory block previously allocated with malloc,
- *            calloc or realloc.
- *
- * @param[in] New size for the memory block, in bytes.
- *
- * @return A pointer to the reallocated memory block, which may be either
- *         the same as ptr or a new location.
- */
-void *_realloc(void *ptr, size_t size);
-
-/**
- * @brief Allocates a block of memory for an array of num elements,
- *        each of them size bytes long, and initializes all its bits to zero.
- *
- * @param[in] Number of elements to allocate.
- * @param[in] Size of each element.
- *
- * @return On success, a pointer to the memory block allocated by the function.
- *         If the function failed to allocate the requested block of memory,
- *         a null pointer is returned.
- */
-void *_calloc(int size, size_t cnt);
-
-/**
- * @brief  A block of memory previously allocated by a call to malloc,
- *         calloc or realloc is deallocated, making it available again
- *         for further allocations.
- *
- * @param[in] Pointer to a memory block previously allocated with malloc,
- *            calloc or realloc.
- */
-void _free(void *ptr);
-
-/** @} */
-#endif /* _MALLOC_H_ */
diff --git a/core/oneway_malloc.c b/core/oneway_malloc.c
deleted file mode 100644
index 348ab641dec98492ef320ccba782f4f137516e75..0000000000000000000000000000000000000000
--- a/core/oneway_malloc.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2013 Freie Universität Berlin
- *
- * This file is subject to the terms and conditions of the GNU Lesser General
- * Public License. See the file LICENSE in the top level directory for more
- * details.
- */
-
-/**
- * @ingroup     core_util
- * @{
- *
- * @file        oneway_malloc.c
- * @brief       Simple malloc wrapper for SBRK
-
- * @author      Kaspar Schleiser <kaspar@schleiser.de>
- *
- * @}
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define ENABLE_DEBUG    (0)
-#include "debug.h"
-
-extern void *sbrk(int incr);
-
-void *_malloc(size_t size)
-{
-    void *ptr = sbrk(size);
-
-    DEBUG("_malloc(): allocating block of size %u at 0x%X.\n", (unsigned int) size, (unsigned int)ptr);
-
-    if (ptr != (void*) - 1) {
-        return ptr;
-    }
-    else {
-        return NULL;
-    }
-}
-
-void *_realloc(void *ptr, size_t size)
-{
-    void *newptr = _malloc(size);
-    memcpy(newptr, ptr, size);
-    free(ptr);
-    return newptr;
-}
-
-void *_calloc(int size, size_t cnt)
-{
-    void *mem = _malloc(size * cnt);
-    if (mem) {
-        memset(mem, 0, size * cnt);
-    }
-    return mem;
-}
-
-void _free(void *ptr)
-{
-    /* who cares about pointers? */
-    (void) ptr;
-
-    DEBUG("_free(): block at 0x%X lost.\n", (unsigned int)ptr);
-}
diff --git a/cpu/msp430-common/Makefile.include b/cpu/msp430-common/Makefile.include
index caa62451a9795b06d5537387aec81e2461986da7..02ed2b915e9d75f9f6ea25dfdf84998e92995821 100644
--- a/cpu/msp430-common/Makefile.include
+++ b/cpu/msp430-common/Makefile.include
@@ -1 +1,3 @@
 INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/
+
+DEFAULT_MODULE += oneway_malloc
diff --git a/cpu/msp430-common/include/malloc.h b/cpu/msp430-common/include/malloc.h
deleted file mode 100644
index f465d2c11b9c08da5fea4a4308f60a715389e36c..0000000000000000000000000000000000000000
--- a/cpu/msp430-common/include/malloc.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __MALLOC_H
-#define __MALLOC_H
-
-#include "oneway_malloc.h"
-
-#define malloc _malloc
-#define calloc _calloc
-#define realloc _realloc
-#define free _free
-
-#endif /* __MALLOC_H */
diff --git a/sys/Makefile b/sys/Makefile
index e9e61c1ccfb7075f674d2efe591ce7490c7f143f..c20e4781f9764f2fbdd0992722c24816f1c8af92 100644
--- a/sys/Makefile
+++ b/sys/Makefile
@@ -89,6 +89,9 @@ endif
 ifneq (,$(filter quad_math,$(USEMODULE)))
     DIRS += quad_math
 endif
+ifneq (,$(filter oneway_malloc,$(USEMODULE)))
+    DIRS += oneway-malloc
+endif
 
 all: $(BINDIR)$(MODULE).a
 	@for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ;
diff --git a/sys/Makefile.include b/sys/Makefile.include
index ddf496ce1bd95bf66068da008d72b0b737dc4865..2073b310a78c28bde3f1c96d0afedab4570af9d3 100644
--- a/sys/Makefile.include
+++ b/sys/Makefile.include
@@ -43,3 +43,7 @@ endif
 ifneq (,$(filter pthread,$(USEMODULE)))
     USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/pthread/include
 endif
+
+ifneq (,$(filter oneway_malloc,$(USEMODULE)))
+    USEMODULE_INCLUDES += $(RIOTBASE)/sys/oneway-malloc/include
+endif
diff --git a/sys/oneway-malloc/Makefile b/sys/oneway-malloc/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c5eae4a3c034cb229c6db4c9d3ad9f2949ee9762
--- /dev/null
+++ b/sys/oneway-malloc/Makefile
@@ -0,0 +1,3 @@
+MODULE = oneway_malloc
+
+include $(RIOTBASE)/Makefile.base
diff --git a/sys/oneway-malloc/include/malloc.h b/sys/oneway-malloc/include/malloc.h
new file mode 100644
index 0000000000000000000000000000000000000000..0212e0c758d7049ac3636fad626cadc7883d8e7d
--- /dev/null
+++ b/sys/oneway-malloc/include/malloc.h
@@ -0,0 +1,11 @@
+#ifndef __MALLOC_H
+#define __MALLOC_H
+
+#include <stdlib.h>
+
+void *malloc(size_t size);
+void *realloc(void *ptr, size_t size);
+void *calloc(int size, size_t cnt);
+void free(void *ptr);
+
+#endif /* __MALLOC_H */
diff --git a/sys/oneway-malloc/oneway-malloc.c b/sys/oneway-malloc/oneway-malloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..35024717e343f4ef1595a40927482cd4f61b596b
--- /dev/null
+++ b/sys/oneway-malloc/oneway-malloc.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2013 Freie Universität Berlin
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser General
+ * Public License. See the file LICENSE in the top level directory for more
+ * details.
+ */
+
+/**
+ * @addtogroup oneway_malloc
+ * @ingroup sys
+ * @{
+ *
+ * @file        oneway_malloc.c
+ * @brief       Simple malloc wrapper for SBRK
+
+ * @author      Kaspar Schleiser <kaspar@schleiser.de>
+ *
+ * @}
+ */
+
+#include <string.h>
+
+#include "malloc.h"
+
+#define ENABLE_DEBUG    (0)
+#include "debug.h"
+
+extern void *sbrk(int incr);
+
+void __attribute__((weak)) *malloc(size_t size)
+{
+    if (size != 0) {
+        void *ptr = sbrk(size);
+
+        DEBUG("malloc(): allocating block of size %u at %p.\n", (unsigned int) size, ptr);
+
+        if (ptr != (void*) -1) {
+            return ptr;
+        }
+    }
+    return NULL;
+}
+
+void __attribute__((weak)) *realloc(void *ptr, size_t size)
+{
+    if (ptr == NULL) {
+        return malloc(size);
+    }
+    else if (size == 0) {
+        free(ptr);
+        return NULL;
+    }
+    else {
+        void *newptr = malloc(size);
+        if (newptr) {
+            memcpy(newptr, ptr, size);
+        }
+        return newptr;
+    }
+}
+
+void __attribute__((weak)) *calloc(int size, size_t cnt)
+{
+    void *mem = malloc(size * cnt);
+    if (mem) {
+        memset(mem, 0, size * cnt);
+    }
+    return mem;
+}
+
+void __attribute__((weak)) free(void *ptr)
+{
+    /* who cares about pointers? */
+    (void) ptr;
+
+    DEBUG("free(): block at %p lost.\n", ptr);
+}