diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 575055ea692d38a454e5d3de7eb14650a5dbf19e..ec140d4db6df36ab3f5858488cbbf8c5aa385d67 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-16  Paolo Carlini  <pcarlini@suse.de>
+	    Douglas Gregor  <doug.gregor@gmail.com>
+
+	* include/tr1_impl/type_traits (aligned_storage): Implement
+	in the neat and general way.
+
 2007-09-14  Benjamin Kosnik  <bkoz@redhat.com>
         
 	* include/parallel/base.h (__gnu_parallel::less<Tp>): Add partial
diff --git a/libstdc++-v3/include/tr1_impl/type_traits b/libstdc++-v3/include/tr1_impl/type_traits
index 9035fafece374824a34cb0c515bd5378e96e9f4b..4a31e8b00b3355883f273e8460f63d232c53e176 100644
--- a/libstdc++-v3/include/tr1_impl/type_traits
+++ b/libstdc++-v3/include/tr1_impl/type_traits
@@ -375,75 +375,13 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     { typedef typename remove_reference<_Tp>::type*     type; };
 
   /// @brief  other transformations [4.8].
-  
-  // Due to c++/19163 and c++/17743, for the time being we cannot use
-  // the correct, neat implementation :-(
-  // 
-  // template<std::size_t _Len, std::size_t _Align>
-  //   struct aligned_storage
-  //   { typedef char type[_Len] __attribute__((__aligned__(_Align))); }
-  //
-  // Temporary workaround, useful for Align up to 32:
-  template<std::size_t, std::size_t>
-    struct aligned_storage { };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 1>
-    {
-      union type
-      {
-	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(1)));
-      };
-    };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 2>
-    {
-      union type
-      {
-	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(2)));
-      };
-    };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 4>
-    {
-      union type
-      {
-	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(4)));
-      };
-    };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 8>
-    {
-      union type
-      {
-	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(8)));
-      };
-    };
-
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 16>
-    {
-      union type
-      {
-	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(16)));
-      };
-    };
-  
-  template<std::size_t _Len>
-    struct aligned_storage<_Len, 32>
-    {
+  template<std::size_t _Len, std::size_t _Align>
+    struct aligned_storage
+    { 
       union type
       {
 	unsigned char __data[_Len];
-	char __align __attribute__((__aligned__(32)));
+	struct __attribute__((__aligned__((_Align)))) { } __aligner; 
       };
     };