diff --git a/include/boost/program_options/detail/convert.hpp b/include/boost/program_options/detail/convert.hpp
index 96a69cd..4cccbc2 100644
--- a/include/boost/program_options/detail/convert.hpp
+++ b/include/boost/program_options/detail/convert.hpp
@@ -15,7 +15,7 @@
 #include <cwchar>
 #include <stdexcept>
 
-#if BOOST_WORKAROUND(__ICL, <= 700)
+#if BOOST_WORKAROUND(__ICL, <= 700) || BOOST_WORKAROUND(_MSC_VER, <= 1200)
 #include <wchar.h>
 namespace std
 {
diff --git a/include/boost/program_options/detail/utf8_codecvt_facet.hpp b/include/boost/program_options/detail/utf8_codecvt_facet.hpp
index 1e92baf..5d27d39 100644
--- a/include/boost/program_options/detail/utf8_codecvt_facet.hpp
+++ b/include/boost/program_options/detail/utf8_codecvt_facet.hpp
@@ -53,7 +53,7 @@
 
 #include <boost/detail/workaround.hpp>
 
-#if BOOST_WORKAROUND(__ICL, <= 700)
+#if BOOST_WORKAROUND(__ICL, <= 700) || BOOST_WORKAROUND(_MSC_VER, <= 1200)
 #include <wchar.h>
 namespace std
 {
diff --git a/include/boost/program_options/options_description.hpp b/include/boost/program_options/options_description.hpp
index 84dd931..1fed8cd 100644
--- a/include/boost/program_options/options_description.hpp
+++ b/include/boost/program_options/options_description.hpp
@@ -216,9 +216,6 @@ namespace program_options {
 
         approximation_range find_approximation(const std::string& prefix) const;
 
-        template<typename Derived>
-        friend class option_description_easy_init;
-
         std::string m_caption;
         // Data organization is chosen since:
         // - there could be two names for one option
diff --git a/src/cmdline.cpp b/src/cmdline.cpp
index 9683a12..a89bd29 100644
--- a/src/cmdline.cpp
+++ b/src/cmdline.cpp
@@ -66,6 +66,10 @@ namespace boost { namespace program_options {
 
 namespace boost { namespace program_options { namespace detail {
 
+    // vc6 needs this.
+    using namespace std;
+    using namespace program_options;
+
     cmdline::cmdline(const std::vector<std::string>& args, int style,
                      bool allow_unregistered)
     {
@@ -371,7 +375,7 @@ namespace boost { namespace program_options { namespace detail {
         int (*cmp)(const char*, const char*, size_t);
         cmp = (style & case_insentitive) 
             ? detail::strncmp_nocase : detail::strncmp_case;
-        const option* result(0);
+        const option* result = 0;
         for (size_t i = 0; i < options.size(); ++i) {
             const char* known_name = options[i].long_name.c_str();
             bool prefix = (*options[i].long_name.rbegin() == '*');
diff --git a/src/convert.cpp b/src/convert.cpp
index da033de..a24fe7b 100644
--- a/src/convert.cpp
+++ b/src/convert.cpp
@@ -84,7 +84,7 @@ namespace boost {
     {
         return detail::convert<wchar_t>(
             s,                 
-            boost::bind(boost::mem_fn(&codecvt<wchar_t, char, mbstate_t>::in),
+            boost::bind(&std::codecvt<wchar_t, char, mbstate_t>::in,
                         &cvt,
                         _1, _2, _3, _4, _5, _6, _7));
     }
@@ -95,7 +95,7 @@ namespace boost {
     {
         return detail::convert<char>(
             s,                 
-            boost::bind(boost::mem_fn(&codecvt<wchar_t, char, mbstate_t>::out),
+            boost::bind(&codecvt<wchar_t, char, mbstate_t>::out,
                         &cvt,
                         _1, _2, _3, _4, _5, _6, _7));
     }
diff --git a/src/options_description.cpp b/src/options_description.cpp
index 1fcd2fd..3b146f2 100644
--- a/src/options_description.cpp
+++ b/src/options_description.cpp
@@ -303,7 +303,8 @@ namespace boost { namespace program_options {
 
         /* Find the maximum width of the option column */
         unsigned width(24);
-        for (unsigned i = 0; i < options.size(); ++i)
+        unsigned i; // vc6 has broken for loop scoping
+        for (i = 0; i < options.size(); ++i)
         {
             const option_description& opt = *options[i];
             stringstream ss;
@@ -312,7 +313,7 @@ namespace boost { namespace program_options {
         }
 
         /* The options formatting style is stolen from Subversion. */
-        for (unsigned i = 0; i < options.size(); ++i)
+        for (i = 0; i < options.size(); ++i)
         {
             if (belong_to_group[i])
                 continue;
diff --git a/test/cmdline_test.cpp b/test/cmdline_test.cpp
index 18186d7..20e0bc7 100644
--- a/test/cmdline_test.cpp
+++ b/test/cmdline_test.cpp
@@ -478,6 +478,7 @@ void test_style_errors()
 int test_main(int ac, char* av[])
 {
 // ###     detail::test_cmdline_detail();
+    cerr << "Checkpojnt 1\n";
 
     test_long_options();
     test_short_options();
@@ -512,5 +513,6 @@ int test_main(int ac, char* av[])
         cout << e.what() << "\n";
     }
 
+    cerr << "Returning normally\n";
     return 0;
 }