diff --git a/kernel/include/mem.h b/kernel/include/mem.h
index 21bf409b01efa179f5cb73b5f0139bdd4a7b420c..9fccc85d518e72cdb2f5a8692218750f4615f945 100644
--- a/kernel/include/mem.h
+++ b/kernel/include/mem.h
@@ -139,9 +139,10 @@ public:
         init(backing_allocator);
     }
 
-    T *create() {
+    template<typename ...Ts>
+    T *create(Ts ...args) {
         auto ptr = reinterpret_cast<T*>(__alloc(0, 0).value());
-        new (ptr) T();
+        new (ptr) T(args...);
         return ptr;
     }
 
@@ -203,17 +204,19 @@ void free(Slice<T> buf)
     general_allocator->free(buf);
 }
 
-template <typename T>
-Optional<T*> create()
+template <typename T, typename ...Ts>
+Optional<T*> create(Ts ...args)
 {
     auto ptr = alloc<T>(1);
     if (!ptr.has_value()) return nullptr;
+    new (ptr.value().data()) T(args...);
     return ptr.value().data();
 }
 
 template <typename T>
 void destroy(T *ptr)
 {
+    ptr->~T();
     free(Slice<T>(ptr, 1));
 }
 
diff --git a/libs/include/new.h b/libs/include/new.h
index b8eacc63ee20d8b07e5d2a998d2c4de1d5ee202c..024723f0afb26777f3f1acd16cdf3c843dd938ec 100644
--- a/libs/include/new.h
+++ b/libs/include/new.h
@@ -5,4 +5,8 @@
 inline void *operator new(size_t, void *p)     { return p; }
 inline void *operator new[](size_t, void *p)   { return p; }
 inline void  operator delete  (void *, void *) { };
-inline void  operator delete[](void *, void *) { };
\ No newline at end of file
+inline void  operator delete[](void *, void *) { };
+extern void *operator new(size_t size);
+extern void *operator new[](size_t size);
+extern void operator delete(void *p, size_t s);
+extern void operator delete[](void *p, size_t s);
\ No newline at end of file
diff --git a/libs/new.cpp b/libs/new.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f2f970fa0115f87f4d1ba10fd399ac95ab7fe21e
--- /dev/null
+++ b/libs/new.cpp
@@ -0,0 +1,23 @@
+#include <mem.h>
+
+void *operator new(size_t size)
+{
+    auto ptr = alloc<byte>(size).value().data();
+    return ptr;
+}
+ 
+void *operator new[](size_t size)
+{
+    auto ptr = alloc<byte>(size).value().data();
+    return ptr;
+}
+
+void operator delete(void *p, size_t s)
+{
+    free(Slice<byte>((byte *)p, s));
+}
+ 
+void operator delete[](void *p, size_t s)
+{
+    free(Slice<byte>((byte *)p, s));
+}
\ No newline at end of file