diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6b0c9574abc57d80c31c8925e381fb963495d84a..206d7729b18d515732452df4cb804bcd4b09e7aa 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2002-08-15  Benjamin Kosnik  <bkoz@redhat.com>
+
+	* include/ext/stdio_filebuf.h (stdio_filebuf): Explicitly set
+	_M_buf_size_opt to zero when unbuffering.
+	* include/bits/fstream.tcc (filebuf::showmanyc): Simplify.
+	Consistency checks for _M_buf_size_opt.
+
+	Revert PR libstdc++/7445
+	* src/locale.cc (locale::classic): Revert.
+	
+	* docs/html/17_intro/TODO: Add.
+	
 2002-08-15  Phil Edwards  <pme@gcc.gnu.org>
 
 	* docs/html/documentation.html:  Update doxygen links for 3.2.
diff --git a/libstdc++-v3/docs/html/17_intro/TODO b/libstdc++-v3/docs/html/17_intro/TODO
index c7a2ecbe24e620676cf993ce103f2fb221d6147d..2ba36ad10a3b6956c3ba69f6f88b5b9f138c2bcc 100644
--- a/libstdc++-v3/docs/html/17_intro/TODO
+++ b/libstdc++-v3/docs/html/17_intro/TODO
@@ -17,7 +17,16 @@ executable speed.
 
 - benchmarking addition to the testsuite that does the above.
 
-- implement symbol versioning for ELF targets.
+- implement testing for symbol versioning for ELF targets.
+
+- review streambuf, filebuf, stringbuf to optimize data member
+placement.  Do pback bits need to be in streambuf? How about
+_M_set_indeterminate, etc?
+
+- Think about naming all member data and member functions consistently
+as per
+funtions: _M_verb_adverb
+data: _M_noun_adjective
 
 - exception specifications need to be reviewed for all parts of the
 library support and utility areas, particularly <new>. 
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc
index 2caeb6e5e5815cfe34b759fe36b22e3d7c654504..18dbaf1caae8b6915e88feebfce289f4e0ed6c7a 100644
--- a/libstdc++-v3/include/bits/fstream.tcc
+++ b/libstdc++-v3/include/bits/fstream.tcc
@@ -90,9 +90,8 @@ namespace std
 	    {
 	      _M_allocate_internal_buffer();
 	      _M_mode = __mode;
-	      
-	      // For time being, set both (in/out) sets  of pointers.
 	      _M_set_indeterminate();
+
 	      if ((__mode & ios_base::ate)
 		  && this->seekoff(0, ios_base::end, __mode) < 0)
 		this->close();
@@ -147,12 +146,7 @@ namespace std
       bool __testin = _M_mode & ios_base::in;
 
       if (__testin && this->is_open())
-	{
-	  if (_M_in_cur < _M_in_end)
-	    __ret = _M_in_end - _M_in_cur;
-	  else
-	    __ret = 0;
-	}
+	__ret = _M_in_end - _M_in_cur;
       _M_last_overflowed = false;	
       return __ret;
     }
@@ -316,7 +310,7 @@ namespace std
     {
       int_type __ret = traits_type::eof();
       bool __testput = _M_out_cur && _M_out_beg < _M_out_end;
-      bool __testunbuffered = _M_file.is_open() && !_M_buf_size;
+      bool __testunbuffered = _M_file.is_open() && !_M_buf_size_opt;
 
       if (__testput || __testunbuffered)
 	{
diff --git a/libstdc++-v3/include/ext/stdio_filebuf.h b/libstdc++-v3/include/ext/stdio_filebuf.h
index cd869a8db325449df5cb116564ffe43a74b07fbf..59ab41a03e559136ca10ebb42dc110e4e51f0ff4 100644
--- a/libstdc++-v3/include/ext/stdio_filebuf.h
+++ b/libstdc++-v3/include/ext/stdio_filebuf.h
@@ -123,16 +123,18 @@ namespace __gnu_cxx
       if (this->is_open())
 	{
 	  _M_mode = __mode;
-	  _M_buf_size_opt = __size;
-	  
 	  if (__size > 0 && __size < 4)
 	    {
+	      // Specify unbuffered.
 	      _M_buf = _M_unbuf;
 	      _M_buf_size = __size;
+	      _M_buf_size_opt = 0;
 	    }
 	  else
-	    _M_allocate_internal_buffer();
-	  
+	    {
+	      _M_buf_size_opt = __size;
+	      _M_allocate_internal_buffer();
+	    }
 	  _M_set_indeterminate();
 	}
     }
@@ -146,16 +148,18 @@ namespace __gnu_cxx
       if (this->is_open())
 	{
 	  _M_mode = __mode;
-	  _M_buf_size_opt = __size;
-	  
 	  if (__size > 0 && __size < 4)
 	    {
+	      // Specify unbuffered.
 	      _M_buf = _M_unbuf;
 	      _M_buf_size = __size;
+	      _M_buf_size_opt = 0;
 	    }
 	  else
-	    _M_allocate_internal_buffer();
-	  
+	    {
+	      _M_buf_size_opt = __size;
+	      _M_allocate_internal_buffer();
+	    }
 	  _M_set_indeterminate();
 	}
     }
diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc
index 3c755bbcba4dbdd5eba3618798e33a7389782841..3cb9d1b4cbfd1f569b700add610f38263c66b364 100644
--- a/libstdc++-v3/src/locale.cc
+++ b/libstdc++-v3/src/locale.cc
@@ -284,11 +284,11 @@ namespace std
   const locale&
   locale::classic()
   {
+    static _STL_mutex_lock __lock __STL_MUTEX_INITIALIZER;
+    _STL_auto_lock __auto(__lock);
+
     if (!_S_classic)
       {
-	static _STL_mutex_lock __lock __STL_MUTEX_INITIALIZER;
-	_STL_auto_lock __auto(__lock);
-
 	try 
 	  {
 	    // 26 Standard facets, 2 references.