Index: uspace/lib/cpp/include/impl/type_traits.hpp
===================================================================
--- uspace/lib/cpp/include/impl/type_traits.hpp	(revision 529ebfb8698c737bb531cf233360275241d0fd5c)
+++ uspace/lib/cpp/include/impl/type_traits.hpp	(revision 40f8328a685f4c3b53cfe8c7368b368591c9d03c)
@@ -32,4 +32,5 @@
 #include <cstdlib>
 #include <cstddef>
+#include <internal/aux.hpp>
 
 namespace std
@@ -607,6 +608,15 @@
     struct alignment_of;
 
-    template<class T>
-    struct rank;
+    template<class>
+    struct rank : aux::value_is<size_t, 0u>
+    { /* DUMMY BODY */ };
+
+    template<class T, size_t N>
+    struct rank<T[N]>: aux::value_is<size_t, 1u + rank<T>::value>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct rank<T[]>: aux::value_is<size_t, 1u + rank<T>::value>
+    { /* DUMMY BODY */ };
 
     template<class T, unsigned I = 0>
@@ -636,5 +646,10 @@
 
     template<class T>
-    struct remove_const;
+    struct remove_const: aux::type_is<T>
+    { /* DUMMY BODY */ };
+
+    template<class T>
+    struct remove_const<T const>: aux::type_is<T>
+    { /* DUMMY BODY */ };
 
     template<class T>
@@ -797,5 +812,5 @@
     using result_of_t = typename result_of<T>::type;
 
-    template<class T>
+    template<class...>
     using void_t = void;
 }
Index: uspace/lib/cpp/include/impl/typeinfo.hpp
===================================================================
--- uspace/lib/cpp/include/impl/typeinfo.hpp	(revision 529ebfb8698c737bb531cf233360275241d0fd5c)
+++ uspace/lib/cpp/include/impl/typeinfo.hpp	(revision 40f8328a685f4c3b53cfe8c7368b368591c9d03c)
@@ -37,5 +37,5 @@
 class type_info
 {
-	public:
+    public:
         virtual ~type_info();
 
Index: uspace/lib/cpp/include/internal/aux.hpp
===================================================================
--- uspace/lib/cpp/include/internal/aux.hpp	(revision 40f8328a685f4c3b53cfe8c7368b368591c9d03c)
+++ uspace/lib/cpp/include/internal/aux.hpp	(revision 40f8328a685f4c3b53cfe8c7368b368591c9d03c)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2017 Jaroslav Jindrak
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LIBCPP_AUX
+#define LIBCPP_AUX
+
+namespace std
+{
+
+namespace aux
+{
+    /**
+     * Two very handy templates, this allows us
+     * to easily follow the T::type and T::value
+     * convention by simply inheriting from specific
+     * instantiations of these templates.
+     * Examples:
+     *  1) We need a struct with int typedef'd to type:
+     *
+     *      stuct has_type_int: aux::type<int> {};
+     *      typename has_type_int::type x = 1; // x is of type int
+     *
+     *  2) We need a struct with static size_t member called value:
+     *
+     *      struct has_value_size_t: aux::value<size_t, 1u> {};
+     *      std::printf("%u\n", has_value_size_t::value); // prints "1\n"
+     */
+
+    template<class T>
+    struct type_is
+    {
+        using type = T;
+    };
+
+    template<class T, T v>
+    struct value_is
+    {
+        static constexpr T value = v;
+    };
+}
+
+}
+
+#endif
