diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fecd6252923d60ba6d27fc8b1fa3bc5d4a74cb4f..f7fcd3dddecc21ca74da80df00e99817c99a0ae6 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-22  Paolo Carlini  <pcarlini@suse.de>
+
+	* include/tr1/type_traits_fwd.h: New, forward declarations.
+	* include/tr1/type_traits: Clean-up.
+	* include/Makefile.am: Add.
+	* include/Makefile.in: Regenerate.
+
 2004-12-20  Paolo Carlini  <pcarlini@suse.de>
 
 	* testsuite/27_io/basic_istream/peek/wchar_t/1.cc: New.
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index dcfa0e05f9831ea6a2235222c2cf66934fb55060..ba615fa84aac1cc32f3fd318cf57dd3bcc203374 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -232,7 +232,8 @@ tr1_headers = \
 	${tr1_srcdir}/functional \
 	${tr1_srcdir}/tuple \
 	${tr1_srcdir}/utility \
-	${tr1_srcdir}/type_traits
+	${tr1_srcdir}/type_traits \
+	${tr1_srcdir}/type_traits_fwd.h
 
 
 # This is the common subset of files that all three "C" header models use.
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 44723bef1d5b77901aee44902989d525b3a3b06f..87470b28e603665cc77fabb0d6d5129643505ba8 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -449,7 +449,8 @@ tr1_headers = \
 	${tr1_srcdir}/functional \
 	${tr1_srcdir}/tuple \
 	${tr1_srcdir}/utility \
-	${tr1_srcdir}/type_traits
+	${tr1_srcdir}/type_traits \
+	${tr1_srcdir}/type_traits_fwd.h
 
 
 # This is the common subset of files that all three "C" header models use.
diff --git a/libstdc++-v3/include/tr1/type_traits b/libstdc++-v3/include/tr1/type_traits
index 97008a131eb716a165b77fd3ad3f096fd2e7da2d..3381ccb57ecf6a7d850c06c486fdf7f6a5ffec2b 100644
--- a/libstdc++-v3/include/tr1/type_traits
+++ b/libstdc++-v3/include/tr1/type_traits
@@ -26,7 +26,7 @@
 #define _TYPE_TRAITS 1
 
 #include <bits/c++config.h>
-#include <cstddef>
+#include <tr1/type_traits_fwd.h>
 
 // namespace std::tr1
 namespace std
@@ -119,33 +119,16 @@ namespace tr1
     struct is_reference<_Tp&>
     : public true_type { };
   
-  template<typename _Tp>
-    struct is_member_object_pointer;
-  
-  template<typename _Tp>
-    struct is_member_function_pointer;   
-
-  template<typename _Tp>
-    struct is_enum;
-  
-  template<typename _Tp>
-    struct is_union;
-  
-  template<typename _Tp>
-    struct is_class;
-
   template<typename _Tp>
     struct __is_function_helper
     : public __sfinae_types
     {
     private:
       template<typename>
-        static __one
-        __test(...);
+        static __one __test(...);
 
       template<typename _Up>
-        static __two
-        __test(_Up (*) [1]);
+        static __two __test(_Up(*)[1]);
     
     public:
       static const bool __value = sizeof(__test<_Tp>(0)) == 1;
@@ -178,13 +161,6 @@ namespace tr1
 				       || is_void<_Tp>::value)>
     { };
 
-  template<typename _Tp>
-    struct is_member_pointer
-    : public integral_constant<bool,
-			       (is_member_object_pointer<_Tp>::value
-				|| is_member_function_pointer<_Tp>::value)>
-    { };
-  
   template<typename _Tp>
     struct is_scalar
     : public integral_constant<bool, (is_arithmetic<_Tp>::value
@@ -192,11 +168,18 @@ namespace tr1
 				      || is_pointer<_Tp>::value
 				      || is_member_pointer<_Tp>::value)>
     { };
-  
+
   template<typename _Tp>
     struct is_compound
     : public integral_constant<bool, !is_fundamental<_Tp>::value> { };
-   
+
+  template<typename _Tp>
+    struct is_member_pointer
+    : public integral_constant<bool,
+			       (is_member_object_pointer<_Tp>::value
+				|| is_member_function_pointer<_Tp>::value)>
+    { };
+  
   /// @brief  type properties [4.5.3].
   template<typename>
     struct is_const
@@ -214,52 +197,10 @@ namespace tr1
     struct is_volatile<_Tp volatile>
     : public true_type { };
 
-  template<typename _Tp>
-    struct is_pod;
-  
-  template<typename _Tp>
-    struct is_empty;
-  
-  template<typename _Tp>
-    struct is_polymorphic;
-  
-  template<typename _Tp>
-    struct is_abstract;
-  
-  template<typename _Tp>
-    struct has_trivial_constructor;
-  
-  template<typename _Tp>
-    struct has_trivial_copy;
-
-  template<typename _Tp>
-    struct has_trivial_assign;
-  
-  template<typename _Tp>
-    struct has_trivial_destructor;
-  
-  template<typename _Tp>
-    struct has_nothrow_constructor;
-  
-  template<typename _Tp>
-    struct has_nothrow_copy;
-
-  template<typename _Tp>
-    struct has_nothrow_assign;
-  
-  template<typename _Tp>
+  template<typename>
     struct has_virtual_destructor
     : public false_type { };
   
-  template<typename _Tp>
-    struct is_signed;
-  
-  template<typename _Tp>
-    struct is_unsigned;
-   
-  template<typename _Tp>
-    struct alignment_of;
-  
   template<typename>
     struct rank
     : public integral_constant<std::size_t, 0> { };
@@ -272,7 +213,7 @@ namespace tr1
     struct rank<_Tp[]>
     : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
    
-  template<typename, unsigned = 0>
+  template<typename, unsigned>
     struct extent
     : public integral_constant<std::size_t, 0> { };
   
@@ -299,12 +240,6 @@ namespace tr1
     struct is_same<_Tp, _Tp>
     : public true_type { };
 
-  template<typename _From, typename _To>
-    struct is_convertible;
-  
-  template<typename _Base, typename _Derived>
-    struct is_base_of;
-
   /// @brief  const-volatile modifications [4.7.1].
   template<typename _Tp>
     struct remove_const
@@ -403,8 +338,6 @@ namespace tr1
     { typedef typename remove_reference<_Tp>::type*     type; };
 
   /// @brief  other transformations [4.8].
-  template<std::size_t _Len, std::size_t _Align>
-    struct aligned_storage;
 
 #undef _DEFINE_SPEC_HELPER
 #undef _DEFINE_SPEC
diff --git a/libstdc++-v3/include/tr1/type_traits_fwd.h b/libstdc++-v3/include/tr1/type_traits_fwd.h
new file mode 100644
index 0000000000000000000000000000000000000000..46beade5819b3f792eb5a1e64910084aa442ae33
--- /dev/null
+++ b/libstdc++-v3/include/tr1/type_traits_fwd.h
@@ -0,0 +1,212 @@
+// TR1 type_traits -*- C++ -*-
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+/** @file type_traits_fwd.h
+ *  This is an internal header file, included by other library headers.
+ *  You should not attempt to use it directly.
+ */
+
+#ifndef _TYPE_TRAITS_FWD_H
+#define _TYPE_TRAITS_FWD_H 1
+
+#include <cstddef>
+
+// namespace std::tr1
+namespace std
+{
+namespace tr1
+{
+  /// @brief  helper classes [4.3].
+  template<typename _Tp, _Tp __v>
+    struct integral_constant;
+  typedef integral_constant<bool, true>     true_type;
+  typedef integral_constant<bool, false>    false_type;
+
+  /// @brief  primary type categories [4.5.1].
+  template<typename _Tp>
+    struct is_void;
+
+  template<typename _Tp>
+    struct is_integral;
+
+  template<typename _Tp>
+    struct is_floating_point;
+
+  template<typename _Tp>
+    struct is_array;
+  
+  template<typename _Tp>
+    struct is_pointer;
+ 
+  template<typename _Tp>
+    struct is_reference;
+
+  template<typename _Tp>
+    struct is_member_object_pointer;
+  
+  template<typename _Tp>
+    struct is_member_function_pointer;   
+
+  template<typename _Tp>
+    struct is_enum;
+  
+  template<typename _Tp>
+    struct is_union;
+  
+  template<typename _Tp>
+    struct is_class;
+
+  template<typename _Tp>
+    struct is_function;
+
+  /// @brief  composite type traits [4.5.2].
+  template<typename _Tp>
+    struct is_arithmetic;
+
+  template<typename _Tp>
+    struct is_fundamental;
+
+  template<typename _Tp>
+    struct is_object;
+
+  template<typename _Tp>
+    struct is_scalar;
+
+  template<typename _Tp>
+    struct is_compound;
+
+  template<typename _Tp>
+    struct is_member_pointer;
+   
+  /// @brief  type properties [4.5.3].
+  template<typename _Tp>
+    struct is_const;
+  
+  template<typename _Tp>
+    struct is_volatile;
+
+  template<typename _Tp>
+    struct is_pod;
+  
+  template<typename _Tp>
+    struct is_empty;
+  
+  template<typename _Tp>
+    struct is_polymorphic;
+  
+  template<typename _Tp>
+    struct is_abstract;
+  
+  template<typename _Tp>
+    struct has_trivial_constructor;
+  
+  template<typename _Tp>
+    struct has_trivial_copy;
+
+  template<typename _Tp>
+    struct has_trivial_assign;
+  
+  template<typename _Tp>
+    struct has_trivial_destructor;
+  
+  template<typename _Tp>
+    struct has_nothrow_constructor;
+  
+  template<typename _Tp>
+    struct has_nothrow_copy;
+
+  template<typename _Tp>
+    struct has_nothrow_assign;
+  
+  template<typename _Tp>
+    struct has_virtual_destructor;
+  
+  template<typename _Tp>
+    struct is_signed;
+  
+  template<typename _Tp>
+    struct is_unsigned;
+   
+  template<typename _Tp>
+    struct alignment_of;
+  
+  template<typename _Tp>
+    struct rank;
+  
+  template<typename _Tp, unsigned _Uint = 0>
+    struct extent;
+  
+  /// @brief  relationships between types [4.6].
+  template<typename _Tp, typename _Up>
+    struct is_same;
+
+  template<typename _From, typename _To>
+    struct is_convertible;
+
+  template<typename _Base, typename _Derived>
+    struct is_base_of;
+
+  /// @brief  const-volatile modifications [4.7.1].
+  template<typename _Tp>
+    struct remove_const;
+  
+  template<typename _Tp>
+    struct remove_volatile;
+  
+  template<typename _Tp>
+    struct remove_cv;
+  
+  template<typename _Tp>
+    struct add_const;
+   
+  template<typename _Tp>
+    struct add_volatile;
+  
+  template<typename _Tp>
+    struct add_cv;
+
+  /// @brief  reference modifications [4.7.2].
+  template<typename _Tp>
+    struct remove_reference;
+  
+  template<typename _Tp>
+    struct add_reference;
+
+  /// @brief  array modififications [4.7.3].
+  template<typename _Tp>
+    struct remove_extent;
+
+  template<typename _Tp>
+    struct remove_all_extents;
+
+  /// @brief  pointer modifications [4.7.4].
+  template<typename _Tp>
+    struct remove_pointer;
+  
+  template<typename _Tp>
+    struct add_pointer;
+
+  /// @brief  other transformations [4.8].
+  template<std::size_t _Len, std::size_t _Align>
+    struct aligned_storage;
+}
+}
+
+#endif