Index: include/cstddef
===================================================================
--- include/cstddef	(revision 200977)
+++ include/cstddef	(working copy)
@@ -52,8 +52,84 @@
 using ::ptrdiff_t;
 using ::size_t;
 
-typedef long double max_align_t;
+template <class _Hp, class _Tp>
+struct __type_list
+{
+    typedef _Hp _Head;
+    typedef _Tp _Tail;
+};
 
+struct __nat
+{
+#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+    __nat() = delete;
+    __nat(const __nat&) = delete;
+    __nat& operator=(const __nat&) = delete;
+    ~__nat() = delete;
+#endif
+};
+
+template <class _Tp>
+struct __align_type
+{
+    static const size_t value = __alignof__(_Tp);
+};
+
+struct __struct_double {long double __lx;};
+struct __struct_double4 {double __lx[4];};
+
+typedef
+    __type_list<__align_type<unsigned char>,
+    __type_list<__align_type<unsigned short>,
+    __type_list<__align_type<unsigned int>,
+    __type_list<__align_type<unsigned long>,
+    __type_list<__align_type<unsigned long long>,
+    __type_list<__align_type<double>,
+    __type_list<__align_type<long double>,
+    __type_list<__align_type<__struct_double>,
+    __type_list<__align_type<__struct_double4>,
+    __type_list<__align_type<int*>,
+    __nat
+    > > > > > > > > > > __all_types;
+
+template <class _TL, size_t _Len> struct __find_max_align;
+
+template <class _Hp, size_t _Len>
+struct __find_max_align<__type_list<_Hp, __nat>, _Len>
+{
+    static const size_t value = _Hp::value;
+};
+
+template <size_t _Len, size_t _A1, size_t _A2>
+struct __select_align
+{
+private:
+    static const size_t __min = _A2 < _A1 ? _A2 : _A1;
+    static const size_t __max = _A1 < _A2 ? _A2 : _A1;
+public:
+    static const size_t value = _Len < __max ? __min : __max;
+};
+
+template <class _Hp, class _Tp, size_t _Len>
+struct __find_max_align<__type_list<_Hp, _Tp>, _Len>
+{
+    static const size_t value = __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value;
+};
+
+#ifdef _LIBCPP_C_HAS_MAX_ALIGN_T
+
+using ::max_align_t;
+
+#else  // _LIBCPP_C_HAS_MAX_ALIGN_T
+
+#ifndef __ALIGNOF_MAX_ALIGN_T__
+#define __ALIGNOF_MAX_ALIGN_T__ (__find_max_align<__all_types, 1024>::value)
+#endif
+
+struct _ALIGNAS(__ALIGNOF_MAX_ALIGN_T__) max_align_t {};
+
+#endif  // _LIBCPP_C_HAS_MAX_ALIGN_T
+
 #ifdef _LIBCPP_HAS_NO_NULLPTR
 
 struct _LIBCPP_TYPE_VIS_ONLY nullptr_t
Index: include/type_traits
===================================================================
--- include/type_traits	(revision 200977)
+++ include/type_traits	(working copy)
@@ -985,97 +985,12 @@
 
 // aligned_storage
 
-template <class _Hp, class _Tp>
-struct __type_list
-{
-    typedef _Hp _Head;
-    typedef _Tp _Tail;
-};
-
-struct __nat
-{
-#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
-    __nat() = delete;
-    __nat(const __nat&) = delete;
-    __nat& operator=(const __nat&) = delete;
-    ~__nat() = delete;
-#endif
-};
-
-template <class _Tp>
-struct __align_type
-{
-    static const size_t value = alignment_of<_Tp>::value;
-    typedef _Tp type;
-};
-
-struct __struct_double {long double __lx;};
-struct __struct_double4 {double __lx[4];};
-
-typedef
-    __type_list<__align_type<unsigned char>,
-    __type_list<__align_type<unsigned short>,
-    __type_list<__align_type<unsigned int>,
-    __type_list<__align_type<unsigned long>,
-    __type_list<__align_type<unsigned long long>,
-    __type_list<__align_type<double>,
-    __type_list<__align_type<long double>,
-    __type_list<__align_type<__struct_double>,
-    __type_list<__align_type<__struct_double4>,
-    __type_list<__align_type<int*>,
-    __nat
-    > > > > > > > > > > __all_types;
-
-template <class _TL, size_t _Align> struct __find_pod;
-
-template <class _Hp, size_t _Align>
-struct __find_pod<__type_list<_Hp, __nat>, _Align>
-{
-    typedef typename conditional<
-                             _Align == _Hp::value,
-                             typename _Hp::type,
-                             void
-                         >::type type;
-};
-
-template <class _Hp, class _Tp, size_t _Align>
-struct __find_pod<__type_list<_Hp, _Tp>, _Align>
-{
-    typedef typename conditional<
-                             _Align == _Hp::value,
-                             typename _Hp::type,
-                             typename __find_pod<_Tp, _Align>::type
-                         >::type type;
-};
-
-template <class _TL, size_t _Len> struct __find_max_align;
-
-template <class _Hp, size_t _Len>
-struct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value> {};
-
-template <size_t _Len, size_t _A1, size_t _A2>
-struct __select_align
-{
-private:
-    static const size_t __min = _A2 < _A1 ? _A2 : _A1;
-    static const size_t __max = _A1 < _A2 ? _A2 : _A1;
-public:
-    static const size_t value = _Len < __max ? __min : __max;
-};
-
-template <class _Hp, class _Tp, size_t _Len>
-struct __find_max_align<__type_list<_Hp, _Tp>, _Len>
-    : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {};
-
 template <size_t _Len, size_t _Align = __find_max_align<__all_types, _Len>::value>
 struct _LIBCPP_TYPE_VIS_ONLY aligned_storage
 {
-    typedef typename __find_pod<__all_types, _Align>::type _Aligner;
-    static_assert(!is_void<_Aligner>::value, "");
-    union type
+    struct _ALIGNAS(_Align) type
     {
-        _Aligner __align;
-        unsigned char __data[_Len];
+       unsigned char __data[_Len];
     };
 };
 
@@ -1084,37 +999,6 @@
     using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
 #endif
 
-#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \
-template <size_t _Len>\
-struct _LIBCPP_TYPE_VIS_ONLY aligned_storage<_Len, n>\
-{\
-    struct _ALIGNAS(n) type\
-    {\
-        unsigned char __lx[_Len];\
-    };\
-}
-
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000);
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000);
-// MSDN says that MSVC does not support alignment beyond 8192 (=0x2000)
-#if !defined(_LIBCPP_MSVC)
-_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000);
-#endif // !_LIBCPP_MSVC
-
-#undef _CREATE_ALIGNED_STORAGE_SPECIALIZATION
-
 #ifndef _LIBCPP_HAS_NO_VARIADICS
 
 // aligned_union
@@ -1385,7 +1269,7 @@
 struct _LIBCPP_TYPE_VIS_ONLY common_type<_Tp, void, void>
 {
 public:
-    typedef _Tp type;
+    typedef typename decay<_Tp>::type type;
 };
 
 template <class _Tp, class _Up>
Index: test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp
===================================================================
--- test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp	(revision 200977)
+++ test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp	(working copy)
@@ -38,8 +38,10 @@
 
 struct C
 {
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     template <class U>
     D operator,(U&&);
+#endif
 };
 
 struct E
