Index: uspace/lib/cpp/include/impl/type_traits.hpp
===================================================================
--- uspace/lib/cpp/include/impl/type_traits.hpp	(revision 9283830f49ecdb0b8a77c1fd2b8d90175b10e756)
+++ uspace/lib/cpp/include/impl/type_traits.hpp	(revision 7e7c1aacb954082b27c550322617cb50a2e4b3c2)
@@ -36,4 +36,13 @@
 namespace std
 {
+    template<class T>
+    struct add_rvalue_reference;
+
+    template<class T>
+    using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
+
+    template<class T>
+    add_rvalue_reference_t<T> declval() noexcept;
+
     /**
      * 20.10.3, helper class:
@@ -61,4 +70,7 @@
     using true_type = integral_constant<bool, true>;
     using false_type = integral_constant<bool, false>;
+
+    template<class...>
+    using void_t = void;
 
     template<class>
@@ -782,6 +794,15 @@
     inline constexpr bool is_base_of_v = is_base_of<Base, Derived>::value;
 
+    template<class From, class To, class = void>
+    struct is_convertible: false_type
+    { /* DUMMY BODY */ };
+
     template<class From, class To>
-    struct is_convertible;
+    struct is_convertible<From, To, void_t<decltype((To)declval<From>())>>
+        : true_type
+    { /* DUMMY BODY */ };
+
+    template<class From, class To>
+    inline constexpr bool is_convertible_v = is_convertible<From, To>::value;
 
     /**
@@ -867,6 +888,8 @@
     { /* DUMMY BODY */ };
 
-    template<class T>
-    struct add_lvalue_reference;
+    // TODO: is this good?
+    template<class T>
+    struct add_lvalue_reference: aux::type_is<T&>
+    { /* DUMMY BODY */ };
 
     // TODO: Special case when T is not referencable!
@@ -909,5 +932,14 @@
 
     template<class T>
-    struct remove_extent;
+    struct remove_extent: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_extent<T[]>: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T, size_t N>
+    struct remove_extent<T[N]>: aux::type_is<T>
+    { /* DUMMY BODY */ };
 
     template<class T>
@@ -925,5 +957,22 @@
 
     template<class T>
-    struct remove_pointer;
+    struct remove_pointer: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_pointer<T*>: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_pointer<T* const>: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_pointer<T* volatile>: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_pointer<T* const volatile>: aux::type_is<T>
+    { /* DUMMY BODY */ };
 
     template<class T>
@@ -939,7 +988,4 @@
      * 20.10.7.6, other transformations:
      */
-
-    template<class...>
-    using void_t = void;
 
     // TODO: consult standard on the default value of align
