diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..fe6963e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,151 @@
+#
+#    Copyright (c) 2010-2012 Nest Labs, Inc.
+#    All rights reserved.
+#
+#    This document is the property of Nest. It is considered
+#    confidential and proprietary information.
+#
+#    This document may not be reproduced or transmitted in any form,
+#    in whole or in part, without the express written permission of
+#    Nest.
+#
+#    Description:
+#      This file is the makefile for Boost, a collection of open
+#      source libraries that extend the functionality of the C++ standard
+#      library.
+#
+
+
+include pre.mak
+include products/paths.mak
+
+PackageName		:= boost
+
+PackageExtension	:= tar.bz2
+PackageSeparator	:= _
+
+PackagePatchArgs	:= -p1
+
+PackageArchive		:= $(PackageName).$(PackageExtension)
+PackageSourceDir	:= $(PackageName)$(PackageSeparator)$(PackageVersion)
+
+CleanPaths		+= $(PackageLicenseFile)
+
+TpsDir			:= sw/tps
+
+IcuDir			:= $(TpsDir)/icu
+IcuSearchPath		:= $(call GenerateResultPaths,$(IcuDir),usr)
+
+PythonDir        	:= $(TpsDir)/python
+PythonSearchPath 	:= $(call GenerateResultPaths,$(PythonDir),/)
+
+# For the short-term, we are always building with GCC even though the
+# actual tool chain may be some repackaged version of GCC. So, just
+# specify that.
+
+BoostToolset		:= gcc
+
+# We do not want versioned headers and libraries, so specify the
+# 'system' layout. Also, we do not want all the various combinations
+# of shared/static, release/debug, stripped/unstripped and
+# non-threaded/threaded libraries, so just specify 'minimal'.
+
+BoostJamConfig		+= --layout=system \
+			   --build-type=minimal \
+			   -sICU_PATH=$(IcuSearchPath) \
+			   link=shared
+
+# If ForceLibStdCPP is set, tell boost to use libstdc++ instead of
+# the compiler default
+ifeq ($(call IsYes,$(ForceLibStdCPP)),Y)
+BoostJamConfig		+= dll-path=$(BoostLibraryPath) cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"
+endif
+
+
+BoostLibraries		= filesystem	\
+			  system	\
+			  signals
+
+ifeq ($(BUILD_FEATURE_BOOST_PYTHON),1)
+BoostLibraries += \
+	python
+endif
+
+BoostLibrariesList	= $(subst $(Space),$(Comma),$(strip $(BoostLibraries)))
+
+BoostProjectConfig	= $(call GenerateBuildPaths,project-config.jam)
+
+SOURCEDIRS = $(PackageSourceDir)
+$(PackageSourceDir)_RULE_TARGET = $(BuildDirectory)/configure
+
+all: $(PackageDefaultGoal)
+
+# Generate the package license contents.
+
+$(PackageSourceDir)/LICENSE_1_0.txt: $(BuildDirectory)/source
+
+$(PackageLicenseFile): $(PackageSourceDir)/LICENSE_1_0.txt
+	$(copy-result)
+
+# Extract the source from the archive and apply patches, if any.
+
+$(PackageSourceDir): $(PackageArchive) $(PackagePatchPaths)
+	$(expand-and-patch-package)
+
+# Prepare the sources.
+
+$(BuildDirectory)/source: $(PackageSourceDir) | $(BuildDirectory)
+	$(Verbose)touch $(BuildDirectory)/source
+
+# Generate the package build makefile.
+
+
+# Generate the build-specific makefile and user configuration. We have
+# to post-process the generated user configuration since Boost's
+# adominable build system has no other way to override the actual C++
+# compiler executable used (see http://goodliffe.blogspot.com/2008/05/
+# cross-compiling-boost.html and boost/docs/html/bbv2/
+# tasks.html#bbv2.tasks.crosscompile).
+
+# Configure the source for building.
+$(BuildDirectory)/configure: $(BuildDirectory)/source | $(PackageSourceDir) $(BuildDirectory)
+	$(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))
+	$(Verbose)cd $(BuildDirectory) && \
+	./bootstrap.sh \
+	--prefix=$(ResultDirectory) \
+	--with-toolset=$(BoostToolset) \
+	--with-icu=$(IcuSearchPath) \
+	--with-libraries=$(BoostLibrariesList) \
+	--with-python-root=$(PythonSearchPath)	
+	$(Verbose)$(SED) -e "s#^\([[:space:]]*using\)[[:space:]]\{1,\}\($(BoostToolset)\)[[:space:]]\{1,\};#\1 \2 : $(TargetProcArch) : $(CXX) $(CPPOPTFLAGS) ;#g" \
+	< $(BoostProjectConfig) > $(BoostProjectConfig).N || $(RM) -f $(BoostProjectConfig)
+	$(Verbose)mv -f $(BoostProjectConfig) $(BoostProjectConfig).O
+	$(Verbose)mv -f $(BoostProjectConfig).N $(BoostProjectConfig)
+	$(Verbose)touch $(BuildDirectory)/configure
+
+# Build the source.
+
+$(BuildDirectory)/build: $(BuildDirectory)/configure
+	$(Verbose)cd $(BuildDirectory) && \
+	./bjam $(JOBSFLAG) $(BoostJamConfig)
+	$(Verbose)touch $(BuildDirectory)/build
+
+# Stage the build to a temporary installation area.
+
+$(BuildDirectory)/stage: $(BuildDirectory)/build | $(ResultDirectory)
+	$(Verbose)cd $(BuildDirectory) && \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" && \
+	./bjam $(JOBSFLAG) $(BoostJamConfig) \
+	install --prefix=$(ResultDirectory)
+	$(Verbose)touch $(BuildDirectory)/stage
+
+.PHONY: stage
+stage: $(BuildDirectory)/stage
+
+clean:
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir).mk.d
+
+include post.mak
diff --git a/boost.patches/boost-00.description b/boost.patches/boost-00.description
new file mode 100644
index 0000000..40cbf45
--- /dev/null
+++ b/boost.patches/boost-00.description
@@ -0,0 +1 @@
+This patch fixes https://svn.boost.org/trac/boost/ticket/4688
diff --git a/boost.patches/boost-00.patch b/boost.patches/boost-00.patch
new file mode 100644
index 0000000..85362e4
--- /dev/null
+++ b/boost.patches/boost-00.patch
@@ -0,0 +1,26 @@
+diff --git a/libs/filesystem/v2/src/v2_path.cpp b/libs/filesystem/v2/src/v2_path.cpp
+index 7adeaff..027b299 100644
+--- a/libs/filesystem/v2/src/v2_path.cpp
++++ b/libs/filesystem/v2/src/v2_path.cpp
+@@ -45,7 +45,7 @@ namespace
+   {
+ #if !defined(macintosh) && !defined(__APPLE__) && !defined(__APPLE_CC__) 
+     // ISO C calls this "the locale-specific native environment":
+-    static std::locale lc("");
++    static std::locale lc;
+ #else  // Mac OS
+     // "All BSD system functions expect their string parameters to be in UTF-8 encoding
+     // and nothing else."
+diff --git a/libs/filesystem/v3/src/path.cpp b/libs/filesystem/v3/src/path.cpp
+index 7dc0b53..213ca36 100644
+--- a/libs/filesystem/v3/src/path.cpp
++++ b/libs/filesystem/v3/src/path.cpp
+@@ -760,7 +760,7 @@ namespace
+ 
+ #   else
+     // ISO C calls this "the locale-specific native environment":
+-    return std::locale("");
++    return std::locale();
+ 
+ #   endif
+   }
diff --git a/boost.patches/boost-00.url b/boost.patches/boost-00.url
new file mode 100644
index 0000000..42f770e
--- /dev/null
+++ b/boost.patches/boost-00.url
@@ -0,0 +1 @@
+https://svn.boost.org/trac/boost/raw-attachment/ticket/4688/boost_filesystem.patch
diff --git a/boost.patches/boost-01.description b/boost.patches/boost-01.description
new file mode 100644
index 0000000..cc99764
--- /dev/null
+++ b/boost.patches/boost-01.description
@@ -0,0 +1,5 @@
+This patch addresses upstream issues 5331
+<https://svn.boost.org/trac/boost/attachment/ticket/5331> and 6692
+<https://svn.boost.org/trac/boost/attachment/ticket/6692> by removing
+the use of the deprecated swp{b} instructions on ARMv6 and ARMv7
+architectures, replacing them with the newer {ld,st}rex.
diff --git a/boost.patches/boost-01.patch b/boost.patches/boost-01.patch
new file mode 100644
index 0000000..e556c4e
--- /dev/null
+++ b/boost.patches/boost-01.patch
@@ -0,0 +1,88 @@
+--- a/boost/smart_ptr/detail/spinlock_gcc_arm.hpp	2009-03-02 08:22:16.000000000 -0800
++++ b/boost/smart_ptr/detail/spinlock_gcc_arm.hpp	2012-06-28 16:39:55.000000000 -0700
+@@ -2,7 +2,7 @@
+ #define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
+ 
+ //
+-//  Copyright (c) 2008 Peter Dimov
++//  Copyright (c) 2008, 2011 Peter Dimov
+ //
+ //  Distributed under the Boost Software License, Version 1.0.
+ //  See accompanying file LICENSE_1_0.txt or copy at
+@@ -11,6 +11,20 @@
+ 
+ #include <boost/smart_ptr/detail/yield_k.hpp>
+ 
++#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
++
++# define BOOST_SP_ARM_BARRIER "dmb"
++
++#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
++
++# define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5"
++
++#else
++
++# define BOOST_SP_ARM_BARRIER ""
++
++#endif
++
+ namespace boost
+ {
+ 
+@@ -29,12 +43,38 @@
+     {
+         int r;
+ 
++#if defined(__ARM_ARCH_6__) \
++    || defined(__ARM_ARCH_6J__) \
++    || defined(__ARM_ARCH_6K__) \
++    || defined(__ARM_ARCH_6Z__) \
++    || defined(__ARM_ARCH_6ZK__) \
++    || defined(__ARM_ARCH_6T2__) \
++    || defined(__ARM_ARCH_7__) \
++    || defined(__ARM_ARCH_7A__) \
++    || defined(__ARM_ARCH_7R__) \
++    || defined(__ARM_ARCH_7M__) \
++    || defined(__ARM_ARCH_7EM__)
++
+         __asm__ __volatile__(
+-            "swp %0, %1, [%2]":
++            "ldrex %0, [%2]; \n"
++            "cmp %0, %1; \n"
++            "strexne %0, %1, [%2]; \n"
++            BOOST_SP_ARM_BARRIER :
+             "=&r"( r ): // outputs
+             "r"( 1 ), "r"( &v_ ): // inputs
+             "memory", "cc" );
+ 
++#else
++
++        __asm__ __volatile__(
++            "swp %0, %1, [%2];\n"
++            BOOST_SP_ARM_BARRIER :
++            "=&r"( r ): // outputs
++            "r"( 1 ), "r"( &v_ ): // inputs
++            "memory", "cc" );
++
++#endif
++
+         return r == 0;
+     }
+ 
+@@ -48,7 +88,7 @@
+ 
+     void unlock()
+     {
+-        __asm__ __volatile__( "" ::: "memory" );
++        __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
+         *const_cast< int volatile* >( &v_ ) = 0;
+     }
+ 
+@@ -82,4 +122,6 @@
+ 
+ #define BOOST_DETAIL_SPINLOCK_INIT {0}
+ 
++#undef BOOST_SP_ARM_BARRIER
++
+ #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
diff --git a/boost.patches/boost-02.description b/boost.patches/boost-02.description
new file mode 100644
index 0000000..32ef535
--- /dev/null
+++ b/boost.patches/boost-02.description
@@ -0,0 +1,3 @@
+This patch fixes various compilation errors and warnings when compiling using gcc 4.8.2
+
+
diff --git a/boost.patches/boost-02.patch b/boost.patches/boost-02.patch
new file mode 100644
index 0000000..66f0979
--- /dev/null
+++ b/boost.patches/boost-02.patch
@@ -0,0 +1,126 @@
+--- a/boost/config/stdlib/libstdcpp3.hpp	2010-10-01 02:19:44.000000000 -0700
++++ b/boost/config/stdlib/libstdcpp3.hpp	2014-05-31 04:07:43.998193374 -0700
+@@ -31,7 +31,8 @@
+ 
+ #ifdef __GLIBCXX__ // gcc 3.4 and greater:
+ #  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \
+-        || defined(_GLIBCXX__PTHREADS)
++        || defined(_GLIBCXX__PTHREADS)    \
++		|| defined(_GLIBCXX_HAS_GTHREADS) 
+       //
+       // If the std lib has thread support turned on, then turn it on in Boost
+       // as well.  We do this because some gcc-3.4 std lib headers define _REENTANT
+--- a/boost/thread/xtime.hpp	2008-06-18 06:01:08.000000000 -0700
++++ b/boost/thread/xtime.hpp	2014-05-31 04:07:44.098193379 -0700
+@@ -20,7 +20,7 @@
+ 
+ enum xtime_clock_types
+ {
+-    TIME_UTC=1
++    TIME_UTC_=1
+ //    TIME_TAI,
+ //    TIME_MONOTONIC,
+ //    TIME_PROCESS,
+@@ -68,7 +68,7 @@
+ 
+ inline int xtime_get(struct xtime* xtp, int clock_type)
+ {
+-    if (clock_type == TIME_UTC)
++    if (clock_type == TIME_UTC_)
+     {
+         *xtp=get_xtime(get_system_time());
+         return clock_type;
+--- a/libs/thread/src/pthread/thread.cpp	2010-10-29 16:27:00.000000000 -0700
++++ b/libs/thread/src/pthread/thread.cpp	2014-05-31 04:07:50.302193645 -0700
+@@ -350,7 +350,7 @@
+                     cond.timed_wait(lock, xt);
+ #   endif
+                     xtime cur;
+-                    xtime_get(&cur, TIME_UTC);
++                    xtime_get(&cur, TIME_UTC_);
+                     if (xtime_cmp(xt, cur) <= 0)
+                         return;
+                 }
+@@ -365,7 +365,7 @@
+             BOOST_VERIFY(!pthread_yield());
+ #   else
+             xtime xt;
+-            xtime_get(&xt, TIME_UTC);
++            xtime_get(&xt, TIME_UTC_);
+             sleep(xt);
+ #   endif
+         }
+--- a/libs/thread/src/pthread/timeconv.inl	2010-04-01 08:04:15.000000000 -0700
++++ b/libs/thread/src/pthread/timeconv.inl	2014-05-31 04:07:50.302193645 -0700
+@@ -20,8 +20,8 @@
+ inline void to_time(int milliseconds, boost::xtime& xt)
+ {
+     int res = 0;
+-    res = boost::xtime_get(&xt, boost::TIME_UTC);
+-    BOOST_ASSERT(res == boost::TIME_UTC);
++    res = boost::xtime_get(&xt, boost::TIME_UTC_);
++    BOOST_ASSERT(res == boost::TIME_UTC_);
+ 
+     xt.sec += (milliseconds / MILLISECONDS_PER_SECOND);
+     xt.nsec += ((milliseconds % MILLISECONDS_PER_SECOND) *
+@@ -57,8 +57,8 @@
+ {
+     boost::xtime cur;
+     int res = 0;
+-    res = boost::xtime_get(&cur, boost::TIME_UTC);
+-    BOOST_ASSERT(res == boost::TIME_UTC);
++    res = boost::xtime_get(&cur, boost::TIME_UTC_);
++    BOOST_ASSERT(res == boost::TIME_UTC_);
+ 
+     if (boost::xtime_cmp(xt, cur) <= 0)
+     {
+@@ -88,8 +88,8 @@
+ {
+     boost::xtime cur;
+     int res = 0;
+-    res = boost::xtime_get(&cur, boost::TIME_UTC);
+-    BOOST_ASSERT(res == boost::TIME_UTC);
++    res = boost::xtime_get(&cur, boost::TIME_UTC_);
++    BOOST_ASSERT(res == boost::TIME_UTC_);
+ 
+     if (boost::xtime_cmp(xt, cur) <= 0)
+         milliseconds = 0;
+@@ -110,8 +110,8 @@
+ {
+     boost::xtime cur;
+     int res = 0;
+-    res = boost::xtime_get(&cur, boost::TIME_UTC);
+-    BOOST_ASSERT(res == boost::TIME_UTC);
++    res = boost::xtime_get(&cur, boost::TIME_UTC_);
++    BOOST_ASSERT(res == boost::TIME_UTC_);
+ 
+     if (boost::xtime_cmp(xt, cur) <= 0)
+         microseconds = 0;
+--- a/boost/static_assert.hpp	2008-07-11 03:49:31.000000000 -0700
++++ b/boost/static_assert.hpp	2014-06-07 07:32:29.365107458 -0700
+@@ -38,6 +38,15 @@
+ #  define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
+ #endif
+ 
++//
++// If the compiler warns about unused typedefs then enable this:
++//
++#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
++#  define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
++#else
++#  define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
++#endif
++
+ #ifdef BOOST_HAS_STATIC_ASSERT
+ #  define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
+ #else
+@@ -116,7 +125,7 @@
+ #define BOOST_STATIC_ASSERT( B ) \
+    typedef ::boost::static_assert_test<\
+       sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
+-         BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
++		  BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+ #endif
+ 
+ #else
+
diff --git a/boost.patches/boost-50.description b/boost.patches/boost-50.description
new file mode 100644
index 0000000..b4de134
--- /dev/null
+++ b/boost.patches/boost-50.description
@@ -0,0 +1 @@
+This patch resolves compiler errors / warnings regarding shadow variables.
diff --git a/boost.patches/boost-50.patch b/boost.patches/boost-50.patch
new file mode 100644
index 0000000..474e31f
--- /dev/null
+++ b/boost.patches/boost-50.patch
@@ -0,0 +1,110 @@
+--- a/boost/concept_check.hpp
++++ b/boost/concept_check.hpp
+@@ -1014,11 +1014,11 @@
+         c.swap(c);
+       }
+ 
+-      void const_constraints(const C& c) {
+-        ci = c.begin();
+-        ci = c.end();
+-        n = c.size();
+-        b = c.empty();
++      void const_constraints(const C& constraint) {
++        ci = constraint.begin();
++        ci = constraint.end();
++        n = constraint.size();
++        b = constraint.empty();
+       }
+ 
+     private:
+--- a/boost/filesystem/v3/path.hpp	2010-10-16 06:09:25.000000000 -0700
++++ b/boost/filesystem/v3/path.hpp	2011-05-14 16:54:35.927910801 -0700
+@@ -142,23 +142,23 @@
+     }
+ 
+     template <class InputIterator>
+-    path(InputIterator begin, InputIterator end)
++    path(InputIterator first, InputIterator last)
+     { 
+-      if (begin != end)
++      if (first != last)
+       {
+         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+-          s(begin, end);
++          s(first, last);
+         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, codecvt());
+       }
+     }
+ 
+     template <class InputIterator>
+-    path(InputIterator begin, InputIterator end, const codecvt_type& cvt)
++    path(InputIterator first, InputIterator last, const codecvt_type& cvt)
+     { 
+-      if (begin != end)
++      if (first != last)
+       {
+         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+-          s(begin, end);
++          s(first, last);
+         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+       }
+     }
+@@ -190,19 +190,19 @@
+     }
+ 
+     template <class InputIterator>
+-    path& assign(InputIterator begin, InputIterator end)
++    path& assign(InputIterator first, InputIterator last)
+     {
+-      return assign(begin, end, codecvt());
++      return assign(first, last, codecvt());
+     }
+ 
+     template <class InputIterator>
+-    path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt)
++    path& assign(InputIterator first, InputIterator last, const codecvt_type& cvt)
+     { 
+       m_pathname.clear();
+-      if (begin != end)
++      if (first != last)
+       {
+         std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+-          s(begin, end);
++          s(first, last);
+         path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+       }
+       return *this;
+@@ -227,13 +227,13 @@
+     path& append(Source const& source, const codecvt_type& cvt);
+ 
+     template <class InputIterator>
+-    path& append(InputIterator begin, InputIterator end)
++    path& append(InputIterator first, InputIterator last)
+     { 
+-      return append(begin, end, codecvt());
++      return append(first, last, codecvt());
+     }
+ 
+     template <class InputIterator>
+-    path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt);
++    path& append(InputIterator first, InputIterator last, const codecvt_type& cvt);
+ 
+     //  -----  modifiers  -----
+ 
+@@ -612,13 +612,13 @@
+ //--------------------------------------------------------------------------------------//
+ 
+   template <class InputIterator>
+-  path& path::append(InputIterator begin, InputIterator end, const codecvt_type& cvt)
++  path& path::append(InputIterator first, InputIterator last, const codecvt_type& cvt)
+   { 
+-    if (begin == end)
++    if (first == last)
+       return *this;
+     string_type::size_type sep_pos(m_append_separator_if_needed());
+     std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
+-      s(begin, end);
++      s(first, last);
+     path_traits::convert(s.c_str(), s.c_str()+s.size(), m_pathname, cvt);
+     if (sep_pos)
+       m_erase_redundant_separator(sep_pos);
diff --git a/boost.patches/boost-51.description b/boost.patches/boost-51.description
new file mode 100644
index 0000000..ab896a1
--- /dev/null
+++ b/boost.patches/boost-51.description
@@ -0,0 +1 @@
+This patch applies upstream change set 67067 <https://svn.boost.org/trac/boost/changeset/67067> for issue 4930 <https://svn.boost.org/trac/boost/ticket/4930>.
diff --git a/boost.patches/boost-51.patch b/boost.patches/boost-51.patch
new file mode 100644
index 0000000..a7ffbec
--- /dev/null
+++ b/boost.patches/boost-51.patch
@@ -0,0 +1,28 @@
+--- a/libs/filesystem/v2/src/v2_operations.cpp	2010-08-10 13:00:09.000000000 -0700
++++ b/libs/filesystem/v2/src/v2_operations.cpp	2011-06-16 17:28:00.000000000 -0700
+@@ -1215,8 +1214,9 @@
+         if ( ::stat( from_file_ph.c_str(), &from_stat ) != 0 )
+           { return error_code( errno, system_category() ); }
+ 
+-        int oflag = O_CREAT | O_WRONLY;
+-        if ( fail_if_exists ) oflag |= O_EXCL;
++        int oflag = O_CREAT | O_WRONLY | O_TRUNC;
++        if ( fail_if_exists )
++          oflag |= O_EXCL;
+         if (  (outfile = ::open( to_file_ph.c_str(), oflag, from_stat.st_mode )) < 0 )
+         {
+           int open_errno = errno;
+--- a/libs/filesystem/v3/src/operations.cpp	2010-10-16 06:09:25.000000000 -0700
++++ b/libs/filesystem/v3/src/operations.cpp	2011-06-16 17:28:00.000000000 -0700
+@@ -426,8 +433,9 @@
+     if (::stat(from_p.c_str(), &from_stat)!= 0)
+       { return false; }
+ 
+-    int oflag = O_CREAT | O_WRONLY;
+-    if (fail_if_exists)oflag |= O_EXCL;
++    int oflag = O_CREAT | O_WRONLY | O_TRUNC;
++    if (fail_if_exists)
++      oflag |= O_EXCL;
+     if ((outfile = ::open(to_p.c_str(), oflag, from_stat.st_mode))< 0)
+     {
+       int open_errno = errno;
diff --git a/boost.patches/boost-52.description b/boost.patches/boost-52.description
new file mode 100644
index 0000000..98582d2
--- /dev/null
+++ b/boost.patches/boost-52.description
@@ -0,0 +1 @@
+This patch resolves compiler errors / warnings regarding shadow variables in boost::numeric::ublas.
diff --git a/boost.patches/boost-52.patch b/boost.patches/boost-52.patch
new file mode 100644
index 0000000..aeae509
--- /dev/null
+++ b/boost.patches/boost-52.patch
@@ -0,0 +1,1948 @@
+diff -aruN a/boost/archive/basic_archive.hpp b/boost/archive/basic_archive.hpp
+--- a/boost/archive/basic_archive.hpp	2010-11-06 09:31:31.000000000 -0700
++++ b/boost/archive/basic_archive.hpp	2012-02-07 15:25:24.619334954 -0800
+@@ -254,7 +254,7 @@
+ #define BOOST_ARCHIVE_STRONG_TYPEDEF(T, D)         \
+     class D : public T {                           \
+     public:                                        \
+-        explicit D(const T t) : T(t){}             \
++        explicit D(const T t) : T(type){}       \
+     };                                             \
+ /**/
+ 
+diff -aruN a/boost/numeric/ublas/banded.hpp b/boost/numeric/ublas/banded.hpp
+--- a/boost/numeric/ublas/banded.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/banded.hpp	2012-02-07 15:25:24.623735807 -0800
+@@ -63,16 +63,16 @@
+             size1_ (0), size2_ (0),
+             lower_ (0), upper_ (0), data_ (0) {}
+         BOOST_UBLAS_INLINE
+-        banded_matrix (size_type size1, size_type size2, size_type lower = 0, size_type upper = 0):
++        banded_matrix (size_type s1, size_type s2, size_type l = 0, size_type u = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2),
+-            lower_ (lower), upper_ (upper), data_ ((std::max) (size1, size2) * (lower + 1 + upper)) {
++            size1_ (s1), size2_ (s2),
++            lower_ (l), upper_ (u), data_ ((std::max) (s1, s2) * (l + 1 + u)) {
+         }
+         BOOST_UBLAS_INLINE
+-        banded_matrix (size_type size1, size_type size2, size_type lower, size_type upper, const array_type &data):
++        banded_matrix (size_type s1, size_type s2, size_type l, size_type u, const array_type &d):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2),
+-            lower_ (lower), upper_ (upper), data_ (data) {}
++            size1_ (s1), size2_ (s2),
++            lower_ (l), upper_ (u), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         banded_matrix (const banded_matrix &m):
+             matrix_container<self_type> (),
+@@ -80,10 +80,10 @@
+             lower_ (m.lower_), upper_ (m.upper_), data_ (m.data_) {}
+         template<class AE>
+         BOOST_UBLAS_INLINE
+-        banded_matrix (const matrix_expression<AE> &ae, size_type lower = 0, size_type upper = 0):
++        banded_matrix (const matrix_expression<AE> &ae, size_type l = 0, size_type u = 0):
+             matrix_container<self_type> (),
+             size1_ (ae ().size1 ()), size2_ (ae ().size2 ()),
+-            lower_ (lower), upper_ (upper),
++            lower_ (l), upper_ (u),
+             data_ ((std::max) (size1_, size2_) * (lower_ + 1 + upper_)) {
+             matrix_assign<scalar_assign> (*this, ae);
+         }
+@@ -118,27 +118,27 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, size_type lower = 0, size_type upper = 0, bool preserve = true) {
++        void resize (size_type s1, size_type s2, size_type l = 0, size_type u = 0, bool preserve = true) {
+             if (preserve) {
+-                self_type temporary (size1, size2, lower, upper);
++                self_type temporary (s1, s2, l, u);
+                 detail::matrix_resize_preserve<layout_type> (*this, temporary);
+             }
+             else {
+-                data ().resize ((std::max) (size1, size2) * (lower + 1 + upper));
+-                size1_ = size1;
+-                size2_ = size2;
+-                lower_ = lower;
+-                upper_ = upper;
++                data ().resize ((std::max) (s1, s2) * (l + 1 + u));
++                size1_ = s1;
++                size2_ = s2;
++                lower_ = l;
++                upper_ = u;
+             }
+         }
+ 
+         BOOST_UBLAS_INLINE
+-        void resize_packed_preserve (size_type size1, size_type size2, size_type lower = 0, size_type upper = 0) {
+-            size1_ = size1;
+-            size2_ = size2;
+-            lower_ = lower;
+-            upper_ = upper;
+-            data ().resize ((std::max) (size1, size2) * (lower + 1 + upper), value_type ());
++        void resize_packed_preserve (size_type s1, size_type s2, size_type l = 0, size_type u = 0) {
++            size1_ = s1;
++            size2_ = s2;
++            lower_ = l;
++            upper_ = u;
++            data ().resize ((std::max) (size1, size2) * (l + 1 + u), value_type ());
+         }
+ 
+         // Element access
+@@ -1082,9 +1082,9 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        banded_adaptor (matrix_type &data, size_type lower = 0, size_type upper = 0):
++        banded_adaptor (matrix_type &d, size_type l = 0, size_type u = 0):
+             matrix_expression<self_type> (),
+-            data_ (data), lower_ (lower), upper_ (upper) {}
++            data_ (d), lower_ (l), upper_ (u) {}
+         BOOST_UBLAS_INLINE
+         banded_adaptor (const banded_adaptor &m):
+             matrix_expression<self_type> (),
+diff -aruN a/boost/numeric/ublas/detail/matrix_assign.hpp b/boost/numeric/ublas/detail/matrix_assign.hpp
+--- a/boost/numeric/ublas/detail/matrix_assign.hpp	2010-10-19 00:01:35.000000000 -0700
++++ b/boost/numeric/ublas/detail/matrix_assign.hpp	2012-02-07 15:25:24.623735807 -0800
+@@ -75,21 +75,21 @@
+                 if (it2 != it2_end && it2e != it2e_end) {
+                     size_type it2_index = it2.index2 (), it2e_index = it2e.index2 ();
+                     while (true) {
+-                        difference_type compare = it2_index - it2e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it2_index - it2e_index;
++                        if (compare2 == 0) {
+                             ++ it2, ++ it2e;
+                             if (it2 != it2_end && it2e != it2e_end) {
+                                 it2_index = it2.index2 ();
+                                 it2e_index = it2e.index2 ();
+                             } else
+                                 break;
+-                        } else if (compare < 0) {
+-                            increment (it2, it2_end, - compare);
++                        } else if (compare2 < 0) {
++                            increment (it2, it2_end, - compare2);
+                             if (it2 != it2_end)
+                                 it2_index = it2.index2 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
++                        } else if (compare2 > 0) {
+                             if (conformant_restrict_type::other (it2e.index1 (), it2e.index2 ()))
+                                 if (static_cast<value_type>(*it2e) != value_type/*zero*/())
+                                     index.push_back (std::pair<size_type, size_type> (it2e.index1 (), it2e.index2 ()));
+@@ -178,21 +178,21 @@
+                 if (it1 != it1_end && it1e != it1e_end) {
+                     size_type it1_index = it1.index1 (), it1e_index = it1e.index1 ();
+                     while (true) {
+-                        difference_type compare = it1_index - it1e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it1_index - it1e_index;
++                        if (compare2 == 0) {
+                             ++ it1, ++ it1e;
+                             if (it1 != it1_end && it1e != it1e_end) {
+                                 it1_index = it1.index1 ();
+                                 it1e_index = it1e.index1 ();
+                             } else
+                                 break;
+-                        } else if (compare < 0) {
+-                            increment (it1, it1_end, - compare);
++                        } else if (compare2 < 0) {
++                            increment (it1, it1_end, - compare2);
+                             if (it1 != it1_end)
+                                 it1_index = it1.index1 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
++                        } else if (compare2 > 0) {
+                             if (conformant_restrict_type::other (it1e.index1 (), it1e.index2 ()))
+                                 if (static_cast<value_type>(*it1e) != value_type/*zero*/())
+                                     index.push_back (std::pair<size_type, size_type> (it1e.index1 (), it1e.index2 ()));
+@@ -997,8 +997,8 @@
+                 if (it2 != it2_end && it2e != it2e_end) {
+                     size_type it2_index = it2.index2 (), it2e_index = it2e.index2 ();
+                     while (true) {
+-                        difference_type compare = it2_index - it2e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it2_index - it2e_index;
++                        if (compare2 == 0) {
+                             functor_type::apply (*it2, *it2e);
+                             ++ it2, ++ it2e;
+                             if (it2 != it2_end && it2e != it2e_end) {
+@@ -1006,18 +1006,18 @@
+                                 it2e_index = it2e.index2 ();
+                             } else
+                                 break;
+-                        } else if (compare < 0) {
++                        } else if (compare2 < 0) {
+                             if (!functor_type::computed) {
+                                 functor_type::apply (*it2, expr_value_type/*zero*/());
+                                 ++ it2;
+                             } else
+-                                increment (it2, it2_end, - compare);
++                                increment (it2, it2_end, - compare2);
+                             if (it2 != it2_end)
+                                 it2_index = it2.index2 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
+-                            increment (it2e, it2e_end, compare);
++                        } else if (compare2 > 0) {
++                            increment (it2e, it2e_end, compare2);
+                             if (it2e != it2e_end)
+                                 it2e_index = it2e.index2 ();
+                             else
+@@ -1118,8 +1118,8 @@
+                 if (it1 != it1_end && it1e != it1e_end) {
+                     size_type it1_index = it1.index1 (), it1e_index = it1e.index1 ();
+                     while (true) {
+-                        difference_type compare = it1_index - it1e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it1_index - it1e_index;
++                        if (compare2 == 0) {
+                             functor_type::apply (*it1, *it1e);
+                             ++ it1, ++ it1e;
+                             if (it1 != it1_end && it1e != it1e_end) {
+@@ -1127,18 +1127,18 @@
+                                 it1e_index = it1e.index1 ();
+                             } else
+                                 break;
+-                        } else if (compare < 0) {
++                        } else if (compare2 < 0) {
+                             if (!functor_type::computed) {
+                                 functor_type::apply (*it1, expr_value_type/*zero*/()); // zeroing
+                                 ++ it1;
+                             } else
+-                                increment (it1, it1_end, - compare);
++                                increment (it1, it1_end, - compare2);
+                             if (it1 != it1_end)
+                                 it1_index = it1.index1 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
+-                            increment (it1e, it1e_end, compare);
++                        } else if (compare2 > 0) {
++                            increment (it1e, it1e_end, compare2);
+                             if (it1e != it1e_end)
+                                 it1e_index = it1e.index1 ();
+                             else
+@@ -1386,8 +1386,8 @@
+                 if (it2 != it2_end && it2e != it2e_end) {
+                     size_type it2_index = it2.index2 (), it2e_index = it2e.index2 ();
+                     while (true) {
+-                        difference_type compare = it2_index - it2e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it2_index - it2e_index;
++                        if (compare2 == 0) {
+                             functor_type::apply (*it2, *it2e);
+                             ++ it2, ++ it2e;
+                             if (it2 != it2_end && it2e != it2e_end) {
+@@ -1395,14 +1395,14 @@
+                                 it2e_index = it2e.index2 ();
+                             } else
+                                 break;
+-                        } else if (compare < 0) {
+-                            increment (it2, it2_end, - compare);
++                        } else if (compare2 < 0) {
++                            increment (it2, it2_end, - compare2);
+                             if (it2 != it2_end)
+                                 it2_index = it2.index2 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
+-                            increment (it2e, it2e_end, compare);
++                        } else if (compare2 > 0) {
++                            increment (it2e, it2e_end, compare2);
+                             if (it2e != it2e_end)
+                                 it2e_index = it2e.index2 ();
+                             else
+@@ -1511,8 +1511,8 @@
+                 if (it1 != it1_end && it1e != it1e_end) {
+                     size_type it1_index = it1.index1 (), it1e_index = it1e.index1 ();
+                     while (true) {
+-                        difference_type compare = it1_index - it1e_index;
+-                        if (compare == 0) {
++                        difference_type compare2 = it1_index - it1e_index;
++                        if (compare2 == 0) {
+                             functor_type::apply (*it1, *it1e);
+                             ++ it1, ++ it1e;
+                             if (it1 != it1_end && it1e != it1e_end) {
+@@ -1520,14 +1520,14 @@
+                                 it1e_index = it1e.index1 ();
+                             } else
+                                 break;
+-                        }  else if (compare < 0) {
+-                            increment (it1, it1_end, - compare);
++                        }  else if (compare2 < 0) {
++                            increment (it1, it1_end, - compare2);
+                             if (it1 != it1_end)
+                                 it1_index = it1.index1 ();
+                             else
+                                 break;
+-                        } else if (compare > 0) {
+-                            increment (it1e, it1e_end, compare);
++                        } else if (compare2 > 0) {
++                            increment (it1e, it1e_end, compare2);
+                             if (it1e != it1e_end)
+                                 it1e_index = it1e.index1 ();
+                             else
+diff -aruN a/boost/numeric/ublas/hermitian.hpp b/boost/numeric/ublas/hermitian.hpp
+--- a/boost/numeric/ublas/hermitian.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/hermitian.hpp	2012-02-07 15:25:24.627228060 -0800
+@@ -284,14 +284,14 @@
+             size_ (BOOST_UBLAS_SAME (size, size)), data_ (triangular_type::packed_size (layout_type (), size, size)) {
+         }
+         BOOST_UBLAS_INLINE
+-        hermitian_matrix (size_type size1, size_type size2):
++        hermitian_matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size_ (BOOST_UBLAS_SAME (size1, size2)), data_ (triangular_type::packed_size (layout_type (), size1, size2)) {
++            size_ (BOOST_UBLAS_SAME (s1, s2)), data_ (triangular_type::packed_size (layout_type (), s1, s2)) {
+         }
+         BOOST_UBLAS_INLINE
+-        hermitian_matrix (size_type size, const array_type &data):
++        hermitian_matrix (size_type s, const array_type &d):
+             matrix_container<self_type> (),
+-            size_ (size), data_ (data) {}
++            size_ (s), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         hermitian_matrix (const hermitian_matrix &m):
+             matrix_container<self_type> (),
+@@ -338,8 +338,8 @@
+             }
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
+-            resize (BOOST_UBLAS_SAME (size1, size2), preserve);
++        void resize (size_type s1, size_type s2, bool preserve = true) {
++            resize (BOOST_UBLAS_SAME (s1, s2), preserve);
+         }
+         BOOST_UBLAS_INLINE
+         void resize_packed_preserve (size_type size) {
+@@ -1192,9 +1192,9 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        hermitian_adaptor (matrix_type &data):
++        hermitian_adaptor (matrix_type &d):
+             matrix_expression<self_type> (),
+-            data_ (data) {
++            data_ (d) {
+             BOOST_UBLAS_CHECK (data_.size1 () == data_.size2 (), bad_size ());
+         }
+         BOOST_UBLAS_INLINE
+@@ -1508,11 +1508,11 @@
+                 it1_begin_ (), it1_end_ (), it1_ (),
+                 it2_begin_ (), it2_end_ (), it2_ () {}
+             BOOST_UBLAS_INLINE
+-            const_iterator1 (const self_type &m, int begin, int end,
++            const_iterator1 (const self_type &m, int b, int e,
+                              const const_subiterator1_type &it1_begin, const const_subiterator1_type &it1_end,
+                              const const_subiterator2_type &it2_begin, const const_subiterator2_type &it2_end):
+                 container_const_reference<self_type> (m),
+-                begin_ (begin), end_ (end), current_ (begin),
++                begin_ (b), end_ (e), current_ (b),
+                 it1_begin_ (it1_begin), it1_end_ (it1_end), it1_ (it1_begin_),
+                 it2_begin_ (it2_begin), it2_end_ (it2_end), it2_ (it2_begin_) {
+                 if (current_ == 0 && it1_ == it1_end_)
+@@ -1962,11 +1962,11 @@
+                 it1_begin_ (), it1_end_ (), it1_ (),
+                 it2_begin_ (), it2_end_ (), it2_ () {}
+             BOOST_UBLAS_INLINE
+-            const_iterator2 (const self_type &m, int begin, int end,
++            const_iterator2 (const self_type &m, int b, int e,
+                              const const_subiterator1_type &it1_begin, const const_subiterator1_type &it1_end,
+                              const const_subiterator2_type &it2_begin, const const_subiterator2_type &it2_end):
+                 container_const_reference<self_type> (m),
+-                begin_ (begin), end_ (end), current_ (begin),
++                begin_ (b), end_ (e), current_ (b),
+                 it1_begin_ (it1_begin), it1_end_ (it1_end), it1_ (it1_begin_),
+                 it2_begin_ (it2_begin), it2_end_ (it2_end), it2_ (it2_begin_) {
+                 if (current_ == 0 && it1_ == it1_end_)
+diff -aruN a/boost/numeric/ublas/matrix_expression.hpp b/boost/numeric/ublas/matrix_expression.hpp
+--- a/boost/numeric/ublas/matrix_expression.hpp	2009-10-06 16:31:22.000000000 -0700
++++ b/boost/numeric/ublas/matrix_expression.hpp	2012-02-07 15:25:24.627228060 -0800
+@@ -1918,39 +1918,39 @@
+             // Sparse specializations
+             BOOST_UBLAS_INLINE
+             void increment (sparse_bidirectional_iterator_tag) {
+-                size_type index1 = (*this) ().size1 ();
++                size_type temp_index1 = (*this) ().size1 ();
+                 if (it1_ != it1_end_) {
+                     if (it1_.index1 () <= i_)
+                         ++ it1_;
+                     if (it1_ != it1_end_)
+-                        index1 = it1_.index1 ();
++                        temp_index1 = it1_.index1 ();
+                 }
+-                size_type index2 = (*this) ().size1 ();
++                size_type temp_index2 = (*this) ().size1 ();
+                 if (it2_ != it2_end_)
+                     if (it2_.index1 () <= i_)
+                         ++ it2_;
+                     if (it2_ != it2_end_) {
+-                        index2 = it2_.index1 ();
++                        temp_index2 = it2_.index1 ();
+                 }
+-                i_ = (std::min) (index1, index2);
++                i_ = (std::min) (temp_index1, temp_index2);
+             }
+             BOOST_UBLAS_INLINE
+             void decrement (sparse_bidirectional_iterator_tag) {
+-                size_type index1 = (*this) ().size1 ();
++                size_type temp_index1 = (*this) ().size1 ();
+                 if (it1_ != it1_end_) {
+                     if (i_ <= it1_.index1 ())
+                         -- it1_;
+                     if (it1_ != it1_end_)
+-                        index1 = it1_.index1 ();
++                        temp_index1 = it1_.index1 ();
+                 }
+-                size_type index2 = (*this) ().size1 ();
++                size_type temp_index2 = (*this) ().size1 ();
+                 if (it2_ != it2_end_) {
+                     if (i_ <= it2_.index1 ())
+                         -- it2_;
+                     if (it2_ != it2_end_)
+-                        index2 = it2_.index1 ();
++                        temp_index2 = it2_.index1 ();
+                 }
+-                i_ = (std::max) (index1, index2);
++                i_ = (std::max) (temp_index1, temp_index2);
+             }
+             BOOST_UBLAS_INLINE
+             void increment (sparse_bidirectional_iterator_tag, difference_type n) {
+@@ -2233,39 +2233,39 @@
+             // Sparse specializations
+             BOOST_UBLAS_INLINE
+             void increment (sparse_bidirectional_iterator_tag) {
+-                size_type index1 = (*this) ().size2 ();
++                size_type temp_index1 = (*this) ().size2 ();
+                 if (it1_ != it1_end_) {
+                     if (it1_.index2 () <= j_)
+                         ++ it1_;
+                     if (it1_ != it1_end_)
+                         index1 = it1_.index2 ();
+                 }
+-                size_type index2 = (*this) ().size2 ();
++                size_type temp_index2 = (*this) ().size2 ();
+                 if (it2_ != it2_end_) {
+                     if (it2_.index2 () <= j_)
+                         ++ it2_;
+                     if (it2_ != it2_end_)
+                         index2 = it2_.index2 ();
+                 }
+-                j_ = (std::min) (index1, index2);
++                j_ = (std::min) (temp_index1, temp_index2);
+             }
+             BOOST_UBLAS_INLINE
+             void decrement (sparse_bidirectional_iterator_tag) {
+-                size_type index1 = (*this) ().size2 ();
++                size_type temp_index1 = (*this) ().size2 ();
+                 if (it1_ != it1_end_) {
+                     if (j_ <= it1_.index2 ())
+                         -- it1_;
+                     if (it1_ != it1_end_)
+                         index1 = it1_.index2 ();
+                 }
+-                size_type index2 = (*this) ().size2 ();
++                size_type temp_index2 = (*this) ().size2 ();
+                 if (it2_ != it2_end_) {
+                     if (j_ <= it2_.index2 ())
+                         -- it2_;
+                     if (it2_ != it2_end_)
+                         index2 = it2_.index2 ();
+                 }
+-                j_ = (std::max) (index1, index2);
++                j_ = (std::max) (temp_index1, temp_index2);
+             }
+             BOOST_UBLAS_INLINE
+             void increment (sparse_bidirectional_iterator_tag, difference_type n) {
+diff -aruN a/boost/numeric/ublas/matrix.hpp b/boost/numeric/ublas/matrix.hpp
+--- a/boost/numeric/ublas/matrix.hpp	2010-10-19 00:01:35.000000000 -0700
++++ b/boost/numeric/ublas/matrix.hpp	2012-02-07 15:25:24.631348942 -0800
+@@ -126,9 +126,9 @@
+ 	   * \param size2 number of columns
+ 	   */
+         BOOST_UBLAS_INLINE
+-        matrix (size_type size1, size_type size2):
++        matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (layout_type::storage_size (size1, size2)) {
++            size1_ (s1), size2_ (s2), data_ (layout_type::storage_size (s1, s2)) {
+         }
+ 
+ 	  /** Dense matrix constructor with defined size a initial value for all the matrix elements
+@@ -136,9 +136,9 @@
+ 	   * \param size2 number of columns
+ 	   * \param init initial value assigned to all elements
+ 	   */
+-        matrix (size_type size1, size_type size2, const value_type &init):
++        matrix (size_type s1, size_type s2, const value_type &init):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (layout_type::storage_size (size1, size2), init) {
++            size1_ (s1), size2_ (s2), data_ (layout_type::storage_size (s1, s2), init) {
+         }
+ 
+ 	  /** Dense matrix constructor with defined size and an initial data array
+@@ -147,9 +147,9 @@
+ 	   * \param data array to copy into the matrix. Must have the same dimension as the matrix
+ 	   */
+         BOOST_UBLAS_INLINE
+-        matrix (size_type size1, size_type size2, const array_type &data):
++        matrix (size_type s1, size_type s2, const array_type &d):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (data) {}
++            size1_ (s1), size2_ (s2), data_ (d) {}
+ 
+ 	  /** Copy-constructor of a dense matrix
+ 	   * \param m is a dense matrix
+@@ -212,15 +212,15 @@
+ 	   * \param preserve a boolean to say if one wants the data to be preserved during the resizing. Default is true.
+ 	   */
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             if (preserve) {
+-                self_type temporary (size1, size2);
++                self_type temporary (s1, s2);
+                 detail::matrix_resize_preserve<layout_type> (*this, temporary);
+             }
+             else {
+-                data ().resize (layout_type::storage_size (size1, size2));
+-                size1_ = size1;
+-                size2_ = size2;
++                data ().resize (layout_type::storage_size (s1, s2));
++                size1_ = s1;
++                size2_ = s2;
+             }
+         }
+ 
+@@ -1186,10 +1186,10 @@
+             matrix_container<self_type> (),
+             size1_ (0), size2_ (0), data_ (1) {}
+         BOOST_UBLAS_INLINE
+-        vector_of_vector (size_type size1, size_type size2):
++        vector_of_vector (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (1) {
+-            resize (size1, size2, true);
++            size1_ (s1), size2_ (s2), data_ (1) {
++            resize (s1, s2, true);
+         }
+         BOOST_UBLAS_INLINE
+         vector_of_vector (const vector_of_vector &m):
+@@ -1227,18 +1227,18 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
+-            size1_ = size1;
+-            size2_ = size2;
++        void resize (size_type s1, size_type s2, bool preserve = true) {
++            size1_ = s1;
++            size2_ = s2;
+             if (preserve)
+-                data ().resize (layout_type::size_M (size1, size2) + 1, typename array_type::value_type ());
++                data ().resize (layout_type::size_M (s1, s2) + 1, typename array_type::value_type ());
+             else
+-                data ().resize (layout_type::size_M (size1, size2) + 1);
+-            for (size_type k = 0; k < layout_type::size_M (size1, size2); ++ k) {
++                data ().resize (layout_type::size_M (s1, s2) + 1);
++            for (size_type k = 0; k < layout_type::size_M (s1, s2); ++ k) {
+                 if (preserve)
+-                    data () [k].resize (layout_type::size_m (size1, size2), value_type ());
++                    data () [k].resize (layout_type::size_m (s1, s2), value_type ());
+                 else
+-                    data () [k].resize (layout_type::size_m (size1, size2));
++                    data () [k].resize (layout_type::size_m (s1, s2));
+             }
+         }
+ 
+@@ -2171,9 +2171,9 @@
+             matrix_container<self_type> (),
+             size1_ (size), size2_ (size) {}
+         BOOST_UBLAS_INLINE
+-        zero_matrix (size_type size1, size_type size2):
++        zero_matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2) {}
++            size1_ (s1), size2_ (s2) {}
+         BOOST_UBLAS_INLINE
+         zero_matrix (const zero_matrix &m):
+             matrix_container<self_type> (),
+@@ -2196,9 +2196,9 @@
+             size2_ = size;
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool /*preserve*/ = true) {
+-            size1_ = size1;
+-            size2_ = size2;
++        void resize (size_type s1, size_type s2, bool /*preserve*/ = true) {
++            size1_ = s1;
++            size2_ = s2;
+         }
+ 
+         // Element access
+@@ -2558,9 +2558,9 @@
+             matrix_container<self_type> (),
+             size1_ (size), size2_ (size), size_common_ ((std::min) (size1_, size2_)) {}
+         BOOST_UBLAS_INLINE
+-        identity_matrix (size_type size1, size_type size2):
++        identity_matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), size_common_ ((std::min) (size1_, size2_)) {}
++            size1_ (s1), size2_ (s2), size_common_ ((std::min) (size1_, size2_)) {}
+         BOOST_UBLAS_INLINE
+         identity_matrix (const identity_matrix &m):
+             matrix_container<self_type> (),
+@@ -2584,9 +2584,9 @@
+             size_common_ = ((std::min)(size1_, size2_));
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool /*preserve*/ = true) {
+-            size1_ = size1;
+-            size2_ = size2;
++        void resize (size_type s1, size_type s2, bool /*preserve*/ = true) {
++            size1_ = s1;
++            size2_ = s2;
+             size_common_ = ((std::min)(size1_, size2_));
+         }
+ 
+@@ -2970,9 +2970,9 @@
+             matrix_container<self_type> (),
+             size1_ (0), size2_ (0), value_ () {}
+         BOOST_UBLAS_INLINE
+-        scalar_matrix (size_type size1, size_type size2, const value_type &value = value_type(1)):
++        scalar_matrix (size_type s1, size_type s2, const value_type &value = value_type(1)):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), value_ (value) {}
++            size1_ (s1), size2_ (s2), value_ (value) {}
+         BOOST_UBLAS_INLINE
+         scalar_matrix (const scalar_matrix &m):
+             matrix_container<self_type> (),
+@@ -2990,9 +2990,9 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool /*preserve*/ = true) {
+-            size1_ = size1;
+-            size2_ = size2;
++        void resize (size_type s1, size_type s2, bool /*preserve*/ = true) {
++            size1_ = s1;
++            size2_ = s2;
+         }
+ 
+         // Element access
+@@ -3446,8 +3446,8 @@
+             size1_ (N), size2_ (M) /* , data_ () */ {
+         }
+         BOOST_UBLAS_INLINE
+-        c_matrix (size_type size1, size_type size2):
+-            size1_ (size1), size2_ (size2) /* , data_ () */ {
++        c_matrix (size_type s1, size_type s2):
++            size1_ (s1), size2_ (s2) /* , data_ () */ {
+             if (size1_ > N || size2_ > M)
+                 bad_size ().raise ();
+         }
+@@ -3487,14 +3487,14 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
+-            if (size1 > N || size2 > M)
++        void resize (size_type s1, size_type s2, bool preserve = true) {
++            if (s1 > N || s2 > M)
+                 bad_size ().raise ();
+             if (preserve) {
+-                self_type temporary (size1, size2);
++                self_type temporary (s1, s2);
+                 // Common elements to preserve
+-                const size_type size1_min = (std::min) (size1, size1_);
+-                const size_type size2_min = (std::min) (size2, size2_);
++                const size_type size1_min = (std::min) (s1, size1_);
++                const size_type size2_min = (std::min) (s2, size2_);
+                 for (size_type i = 0; i != size1_min; ++i) {    // indexing copy over major
+                     for (size_type j = 0; j != size2_min; ++j) {
+                         temporary.data_[i][j] = data_[i][j];
+@@ -3503,8 +3503,8 @@
+                 assign_temporary (temporary);
+             }
+             else {
+-                size1_ = size1;
+-                size2_ = size2;
++                size1_ = s1;
++                size2_ = s2;
+             }
+         }
+ 
+diff -aruN a/boost/numeric/ublas/matrix_proxy.hpp b/boost/numeric/ublas/matrix_proxy.hpp
+--- a/boost/numeric/ublas/matrix_proxy.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/matrix_proxy.hpp	2012-02-07 15:25:24.631348942 -0800
+@@ -51,8 +51,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_row (matrix_type &data, size_type i):
+-            data_ (data), i_ (i) {
++        matrix_row (matrix_type &d, size_type i):
++            data_ (d), i_ (i) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (i_ < data_.size1 (), bad_index ());
+         }
+@@ -508,8 +508,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_column (matrix_type &data, size_type j):
+-            data_ (data), j_ (j) {
++        matrix_column (matrix_type &d, size_type j):
++            data_ (d), j_ (j) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (j_ < data_.size2 (), bad_index ());
+         }
+@@ -965,8 +965,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_vector_range (matrix_type &data, const range_type &r1, const range_type &r2):
+-            data_ (data), r1_ (r1.preprocess (data.size1 ())), r2_ (r2.preprocess (data.size2 ())) {
++        matrix_vector_range (matrix_type &d, const range_type &r1, const range_type &r2):
++            data_ (d), r1_ (r1.preprocess (d.size1 ())), r2_ (r2.preprocess (d.size2 ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (r1_.start () <= data_.size1 () &&
+             //                     r1_.start () + r1_.size () <= data_.size1 (), bad_index ());
+@@ -1421,8 +1421,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_vector_slice (matrix_type &data, const slice_type &s1, const slice_type &s2):
+-            data_ (data), s1_ (s1.preprocess (data.size1 ())), s2_ (s2.preprocess (data.size2 ())) {
++        matrix_vector_slice (matrix_type &d, const slice_type &s1, const slice_type &s2):
++            data_ (d), s1_ (s1.preprocess (d.size1 ())), s2_ (s2.preprocess (d.size2 ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (s1_.start () <= data_.size1 () &&
+             //                    s1_.start () + s1_.stride () * (s1_.size () - (s1_.size () > 0)) <= data_.size1 (), bad_index ());
+@@ -1886,11 +1886,11 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_vector_indirect (matrix_type &data, size_type size):
+-            data_ (data), ia1_ (size), ia2_ (size) {}
++        matrix_vector_indirect (matrix_type &d, size_type s):
++            data_ (d), ia1_ (s), ia2_ (s) {}
+         BOOST_UBLAS_INLINE
+-        matrix_vector_indirect (matrix_type &data, const indirect_array_type &ia1, const indirect_array_type &ia2):
+-            data_ (data), ia1_ (ia1), ia2_ (ia2) {
++        matrix_vector_indirect (matrix_type &d, const indirect_array_type &ia1, const indirect_array_type &ia2):
++            data_ (d), ia1_ (ia1), ia2_ (ia2) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (ia1_.size () == ia2_.size (), bad_size ());
+         }
+@@ -2351,8 +2351,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_range (matrix_type &data, const range_type &r1, const range_type &r2):
+-            data_ (data), r1_ (r1.preprocess (data.size1 ())), r2_ (r2.preprocess (data.size2 ())) {
++        matrix_range (matrix_type &d, const range_type &r1, const range_type &r2):
++            data_ (d), r1_ (r1.preprocess (d.size1 ())), r2_ (r2.preprocess (d.size2 ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (r1_.start () <= data_.size1 () &&
+             //                    r1_.start () + r1_.size () <= data_.size1 (), bad_index ());
+@@ -2360,8 +2360,8 @@
+             //                    r2_.start () + r2_.size () <= data_.size2 (), bad_index ());
+         }
+         BOOST_UBLAS_INLINE
+-        matrix_range (const matrix_closure_type &data, const range_type &r1, const range_type &r2, int):
+-            data_ (data), r1_ (r1.preprocess (data.size1 ())), r2_ (r2.preprocess (data.size2 ())) {
++        matrix_range (const matrix_closure_type &d, const range_type &r1, const range_type &r2, int):
++            data_ (d), r1_ (r1.preprocess (d.size1 ())), r2_ (r2.preprocess (d.size2 ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (r1_.start () <= data_.size1 () &&
+             //                    r1_.start () + r1_.size () <= data_.size1 (), bad_index ());
+@@ -3255,8 +3255,8 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_slice (matrix_type &data, const slice_type &s1, const slice_type &s2):
+-            data_ (data), s1_ (s1.preprocess (data.size1 ())), s2_ (s2.preprocess (data.size2 ())) {
++        matrix_slice (matrix_type &d, const slice_type &s1, const slice_type &s2):
++            data_ (d), s1_ (s1.preprocess (d.size1 ())), s2_ (s2.preprocess (d.size2 ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (s1_.start () <= data_.size1 () &&
+             //                    s1_.start () + s1_.stride () * (s1_.size () - (s1_.size () > 0)) <= data_.size1 (), bad_index ());
+@@ -3264,8 +3264,8 @@
+             //                    s2_.start () + s2_.stride () * (s2_.size () - (s2_.size () > 0)) <= data_.size2 (), bad_index ());
+         }
+         BOOST_UBLAS_INLINE
+-        matrix_slice (const matrix_closure_type &data, const slice_type &s1, const slice_type &s2, int):
+-            data_ (data), s1_ (s1.preprocess (data.size1 ())), s2_ (s2.preprocess (data.size2 ())) {
++        matrix_slice (const matrix_closure_type &d, const slice_type &s1, const slice_type &s2, int):
++            data_ (d), s1_ (s1.preprocess (d.size1 ())), s2_ (s2.preprocess (d.size2 ())) {
+             // Early checking of preconditions.
+             // BOOST_UBLAS_CHECK (s1_.start () <= data_.size1 () &&
+             //                    s1_.start () + s1_.stride () * (s1_.size () - (s1_.size () > 0)) <= data_.size1 (), bad_index ());
+@@ -4213,14 +4213,14 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        matrix_indirect (matrix_type &data, size_type size1, size_type size2):
+-            data_ (data), ia1_ (size1), ia2_ (size2) {}
++        matrix_indirect (matrix_type &d, size_type s1, size_type s2):
++            data_ (d), ia1_ (s1), ia2_ (s2) {}
+         BOOST_UBLAS_INLINE
+-        matrix_indirect (matrix_type &data, const indirect_array_type &ia1, const indirect_array_type &ia2):
+-            data_ (data), ia1_ (ia1.preprocess (data.size1 ())), ia2_ (ia2.preprocess (data.size2 ())) {}
++        matrix_indirect (matrix_type &d, const indirect_array_type &ia1, const indirect_array_type &ia2):
++            data_ (d), ia1_ (ia1.preprocess (d.size1 ())), ia2_ (ia2.preprocess (d.size2 ())) {}
+         BOOST_UBLAS_INLINE
+-        matrix_indirect (const matrix_closure_type &data, const indirect_array_type &ia1, const indirect_array_type &ia2, int):
+-            data_ (data), ia1_ (ia1.preprocess (data.size1 ())), ia2_ (ia2.preprocess (data.size2 ())) {}
++        matrix_indirect (const matrix_closure_type &d, const indirect_array_type &ia1, const indirect_array_type &ia2, int):
++            data_ (d), ia1_ (ia1.preprocess (d.size1 ())), ia2_ (ia2.preprocess (d.size2 ())) {}
+ 
+         // Accessors
+         BOOST_UBLAS_INLINE
+diff -aruN a/boost/numeric/ublas/matrix_sparse.hpp b/boost/numeric/ublas/matrix_sparse.hpp
+--- a/boost/numeric/ublas/matrix_sparse.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/matrix_sparse.hpp	2012-02-07 15:25:24.635307503 -0800
+@@ -300,9 +300,9 @@
+             matrix_container<self_type> (),
+             size1_ (0), size2_ (0), data_ () {}
+         BOOST_UBLAS_INLINE
+-        mapped_matrix (size_type size1, size_type size2, size_type non_zeros = 0):
++        mapped_matrix (size_type s1, size_type s2, size_type non_zeros = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ () {
++            size1_ (s1), size2_ (s2), data_ () {
+             detail::map_reserve (data (), restrict_capacity (non_zeros));
+         }
+         BOOST_UBLAS_INLINE
+@@ -358,11 +358,11 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             // FIXME preserve unimplemented
+             BOOST_UBLAS_CHECK (!preserve, internal_logic ());
+-            size1_ = size1;
+-            size2_ = size2;
++            size1_ = s1;
++            size2_ = s2;
+             data ().clear ();
+         }
+ 
+@@ -1373,9 +1373,9 @@
+             data_ [layout_type::size_M (size1_, size2_)] = vector_data_value_type ();
+         }
+         BOOST_UBLAS_INLINE
+-        mapped_vector_of_mapped_vector (size_type size1, size_type size2, size_type non_zeros = 0):
++        mapped_vector_of_mapped_vector (size_type s1, size_type s2, size_type non_zeros = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ () {
++            size1_ (s1), size2_ (s2), data_ () {
+             data_ [layout_type::size_M (size1_, size2_)] = vector_data_value_type ();
+         }
+         BOOST_UBLAS_INLINE
+@@ -1427,11 +1427,11 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             // FIXME preserve unimplemented
+             BOOST_UBLAS_CHECK (!preserve, internal_logic ());
+-            size1_ = size1;
+-            size2_ = size2;
++            size1_ = s1;
++            size2_ = s2;
+             data ().clear ();
+             data () [layout_type::size_M (size1_, size2_)] = vector_data_value_type ();
+         }
+@@ -2666,9 +2666,9 @@
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+-        compressed_matrix (size_type size1, size_type size2, size_type non_zeros = 0):
++        compressed_matrix (size_type s1, size_type s2, size_type non_zeros = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), capacity_ (restrict_capacity (non_zeros)),
++            size1_ (s1), size2_ (s2), capacity_ (restrict_capacity (non_zeros)),
+             filled1_ (1), filled2_ (0),
+             index1_data_ (layout_type::size_M (size1_, size2_) + 1), index2_data_ (capacity_), value_data_ (capacity_) {
+             index1_data_ [filled1_ - 1] = k_based (filled2_);
+@@ -2764,9 +2764,9 @@
+             return value_data_;
+         }
+         BOOST_UBLAS_INLINE
+-        void set_filled (const array_size_type& filled1, const array_size_type& filled2) {
+-            filled1_ = filled1;
+-            filled2_ = filled2;
++        void set_filled (const array_size_type& f1, const array_size_type& f2) {
++            filled1_ = f1;
++            filled2_ = f2;
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+@@ -2802,11 +2802,11 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             // FIXME preserve unimplemented
+             BOOST_UBLAS_CHECK (!preserve, internal_logic ());
+-            size1_ = size1;
+-            size2_ = size2;
++            size1_ = s1;
++            size2_ = s2;
+             capacity_ = restrict_capacity (capacity_);
+             filled1_ = 1;
+             filled2_ = 0;
+@@ -4045,9 +4045,9 @@
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+-        coordinate_matrix (size_type size1, size_type size2, array_size_type non_zeros = 0):
++        coordinate_matrix (size_type s1, size_type s2, array_size_type non_zeros = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), capacity_ (restrict_capacity (non_zeros)),
++            size1_ (s1), size2_ (s2), capacity_ (restrict_capacity (non_zeros)),
+             filled_ (0), sorted_filled_ (filled_), sorted_ (true),
+             index1_data_ (capacity_), index2_data_ (capacity_), value_data_ (capacity_) {
+             storage_invariants ();
+@@ -4111,13 +4111,13 @@
+             return value_data_;
+         }
+         BOOST_UBLAS_INLINE
+-        void set_filled (const array_size_type &filled) {
++        void set_filled (const array_size_type &f) {
+             // Make sure that storage_invariants() succeeds
+-            if (sorted_ && filled < filled_)
+-                sorted_filled_ = filled;
++            if (sorted_ && f < filled_)
++                sorted_filled_ = f;
+             else
+-                sorted_ = (sorted_filled_ == filled);
+-            filled_ = filled;
++                sorted_ = (sorted_filled_ == f);
++            filled_ = f;
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+@@ -4144,11 +4144,11 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             // FIXME preserve unimplemented
+             BOOST_UBLAS_CHECK (!preserve, internal_logic ());
+-            size1_ = size1;
+-            size2_ = size2;
++            size1_ = s1;
++            size2_ = s2;
+             capacity_ = restrict_capacity (capacity_);
+             index1_data_.resize (capacity_);
+             index2_data_.resize (capacity_);
+@@ -4403,21 +4403,21 @@
+                 std::inplace_merge (ita.begin (), iunsorted, ita.end ());
+                 
+                 // sum duplicates with += and remove
+-                array_size_type filled = 0;
++                array_size_type f = 0;
+                 for (array_size_type i = 1; i < filled_; ++ i) {
+-                    if (index1_data_ [filled] != index1_data_ [i] ||
+-                        index2_data_ [filled] != index2_data_ [i]) {
+-                        ++ filled;
+-                        if (filled != i) {
+-                            index1_data_ [filled] = index1_data_ [i];
+-                            index2_data_ [filled] = index2_data_ [i];
+-                            value_data_ [filled] = value_data_ [i];
++                    if (index1_data_ [f] != index1_data_ [i] ||
++                        index2_data_ [f] != index2_data_ [i]) {
++                        ++ f;
++                        if (f != i) {
++                            index1_data_ [f] = index1_data_ [i];
++                            index2_data_ [f] = index2_data_ [i];
++                            value_data_ [f] = value_data_ [i];
+                         }
+                     } else {
+-                        value_data_ [filled] += value_data_ [i];
++                        value_data_ [f] += value_data_ [i];
+                     }
+                 }
+-                filled_ = filled + 1;
++                filled_ = f + 1;
+                 sorted_filled_ = filled_;
+                 sorted_ = true;
+                 storage_invariants ();
+diff -aruN a/boost/numeric/ublas/storage.hpp b/boost/numeric/ublas/storage.hpp
+--- a/boost/numeric/ublas/storage.hpp	2010-04-06 13:09:04.000000000 -0700
++++ b/boost/numeric/ublas/storage.hpp	2012-02-07 15:25:24.635307503 -0800
+@@ -62,8 +62,8 @@
+             data_ = 0;
+         }
+         explicit BOOST_UBLAS_INLINE
+-        unbounded_array (size_type size, const ALLOC &a = ALLOC()):
+-            alloc_(a), size_ (size) {
++        unbounded_array (size_type s, const ALLOC &a = ALLOC()):
++            alloc_(a), size_ (s) {
+           if (size_) {
+               data_ = alloc_.allocate (size_);
+               if (! detail::has_trivial_constructor<T>::value) {
+@@ -76,8 +76,8 @@
+         }
+         // No value initialised, but still be default constructed
+         BOOST_UBLAS_INLINE
+-        unbounded_array (size_type size, const value_type &init, const ALLOC &a = ALLOC()):
+-            alloc_ (a), size_ (size) {
++        unbounded_array (size_type s, const value_type &init, const ALLOC &a = ALLOC()):
++            alloc_ (a), size_ (s) {
+             if (size_) {
+                 data_ = alloc_.allocate (size_);
+                 std::uninitialized_fill (begin(), end(), init);
+@@ -113,33 +113,33 @@
+         // Resizing
+     private:
+         BOOST_UBLAS_INLINE
+-        void resize_internal (const size_type size, const value_type init, const bool preserve) {
+-            if (size != size_) {
++        void resize_internal (const size_type s, const value_type init, const bool preserve) {
++            if (s != size_) {
+                 pointer p_data = data_;
+-                if (size) {
+-                    data_ = alloc_.allocate (size);
++                if (s) {
++                    data_ = alloc_.allocate (s);
+                     if (preserve) {
+                         pointer si = p_data;
+                         pointer di = data_;
+-                        if (size < size_) {
+-                            for (; di != data_ + size; ++di) {
++                        if (s < size_) {
++                            for (; di != data_ + s; ++di) {
+                                 alloc_.construct (di, *si);
+                                 ++si;
+                             }
+                         }
+                         else {
+-                            for (pointer si = p_data; si != p_data + size_; ++si) {
+-                                alloc_.construct (di, *si);
++                            for (pointer si2 = p_data; si2 != p_data + size_; ++si) {
++                                alloc_.construct (di, *si2);
+                                 ++di;
+                             }
+-                            for (; di != data_ + size; ++di) {
++                            for (; di != data_ + s; ++di) {
+                                 alloc_.construct (di, init);
+                             }
+                         }
+                     }
+                     else {
+                         if (! detail::has_trivial_constructor<T>::value) {
+-                            for (pointer di = data_; di != data_ + size; ++di)
++                            for (pointer di = data_; di != data_ + s; ++di)
+                                 alloc_.construct (di, value_type());
+                         }
+                     }
+@@ -153,19 +153,19 @@
+                     alloc_.deallocate (p_data, size_);
+                 }
+ 
+-                if (!size)
++                if (!s)
+                     data_ = 0;
+-                size_ = size;
++                size_ = s;
+             }
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size) {
+-            resize_internal (size, value_type (), false);
++        void resize (size_type s) {
++            resize_internal (s, value_type (), false);
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, value_type init) {
+-            resize_internal (size, init, true);
++        void resize (size_type s, value_type init) {
++            resize_internal (s, init, true);
+         }
+                     
+         // Random Access Container
+@@ -318,14 +318,14 @@
+             size_ (0) /*, data_ ()*/ {   // size 0 - use bounded_vector to default construct with size N
+         }
+         explicit BOOST_UBLAS_INLINE
+-        bounded_array (size_type size):
+-            size_ (size) /*, data_ ()*/ {
++        bounded_array (size_type s):
++            size_ (s) /*, data_ ()*/ {
+             BOOST_UBLAS_CHECK (size_ <= N, bad_size ());
+             // data_ (an array) elements are already default constructed
+         }
+         BOOST_UBLAS_INLINE
+-        bounded_array (size_type size, const value_type &init):
+-            size_ (size) /*, data_ ()*/ {
++        bounded_array (size_type s, const value_type &init):
++            size_ (s) /*, data_ ()*/ {
+             BOOST_UBLAS_CHECK (size_ <= N, bad_size ());
+             // ISSUE elements should be value constructed here, but we must fill instead as already default constructed
+             std::fill (begin(), end(), init) ;
+@@ -339,16 +339,16 @@
+         
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size) {
+-            BOOST_UBLAS_CHECK (size <= N, bad_size ());
+-            size_ = size;
++        void resize (size_type s) {
++            BOOST_UBLAS_CHECK (s <= N, bad_size ());
++            size_ = s;
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, value_type init) {
+-            BOOST_UBLAS_CHECK (size <= N, bad_size ());
+-            if (size > size_)
+-                std::fill (data_ + size_, data_ + size, init);
+-            size_ = size;
++        void resize (size_type s, value_type init) {
++            BOOST_UBLAS_CHECK (s <= N, bad_size ());
++            if (s > size_)
++                std::fill (data_ + size_, data_ + s, init);
++            size_ = s;
+         }
+ 
+         // Random Access Container
+@@ -489,17 +489,17 @@
+             size_ (0), own_ (true), data_ (new value_type [0]) {
+         }
+         explicit BOOST_UBLAS_INLINE
+-        array_adaptor (size_type size):
+-            size_ (size), own_ (true), data_ (new value_type [size]) {
++        array_adaptor (size_type s):
++            size_ (s), own_ (true), data_ (new value_type [s]) {
+         }
+         BOOST_UBLAS_INLINE
+-        array_adaptor (size_type size, const value_type &init):
+-            size_ (size), own_ (true), data_ (new value_type [size]) {
++        array_adaptor (size_type s, const value_type &init):
++            size_ (s), own_ (true), data_ (new value_type [s]) {
+             std::fill (data_, data_ + size_, init);
+         }
+         BOOST_UBLAS_INLINE
+-        array_adaptor (size_type size, pointer data):
+-            size_ (size), own_ (false), data_ (data) {}
++        array_adaptor (size_type s, pointer d):
++            size_ (s), own_ (false), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         array_adaptor (const array_adaptor &a):
+             storage_array<self_type> (),
+@@ -516,26 +516,26 @@
+         // Resizing
+     private:
+         BOOST_UBLAS_INLINE
+-        void resize_internal (size_type size, value_type init, bool preserve = true) {
+-           if (size != size_) {
+-                pointer data = new value_type [size];
++        void resize_internal (size_type s, value_type init, bool preserve = true) {
++           if (s != size_) {
++                pointer data = new value_type [s];
+                 if (preserve) {
+-                    std::copy (data_, data_ + (std::min) (size, size_), data);
+-                    std::fill (data + (std::min) (size, size_), data + size, init);
++                    std::copy (data_, data_ + (std::min) (s, size_), data);
++                    std::fill (data + (std::min) (s, size_), data + s, init);
+                 }
+                 if (own_)
+                     delete [] data_;
+-                size_ = size;
++                size_ = s;
+                 own_ = true;
+                 data_ = data;
+             }
+         }
+         BOOST_UBLAS_INLINE
+-        void resize_internal (size_type size, pointer data, value_type init, bool preserve = true) {
++        void resize_internal (size_type s, pointer data, value_type init, bool preserve = true) {
+             if (data != data_) {
+                 if (preserve) {
+-                    std::copy (data_, data_ + (std::min) (size, size_), data);
+-                    std::fill (data + (std::min) (size, size_), data + size, init);
++                    std::copy (data_, data_ + (std::min) (s, size_), data);
++                    std::fill (data + (std::min) (s, size_), data + s, init);
+                 }
+                 if (own_)
+                     delete [] data_;
+@@ -543,26 +543,26 @@
+                 data_ = data;
+             }
+             else {
+-                std::fill (data + (std::min) (size, size_), data + size, init);
++                std::fill (data + (std::min) (s, size_), data + s, init);
+             }
+-            size_ = size;
++            size_ = s;
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size) {
+-            resize_internal (size, value_type (), false);
++        void resize (size_type s) {
++            resize_internal (s, value_type (), false);
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, value_type init) {
+-            resize_internal (size, init, true);
++        void resize (size_type s, value_type init) {
++            resize_internal (s, init, true);
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, pointer data) {
+-            resize_internal (size, data, value_type (), false);
++        void resize (size_type s, pointer data) {
++            resize_internal (s, data, value_type (), false);
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, pointer data, value_type init) {
+-            resize_internal (size, data, init, true);
++        void resize (size_type s, pointer data, value_type init) {
++            resize_internal (s, data, init, true);
+         }
+ 
+         BOOST_UBLAS_INLINE
+@@ -882,9 +882,9 @@
+         basic_range ():
+             start_ (0), size_ (0) {}
+         BOOST_UBLAS_INLINE
+-        basic_range (size_type start, size_type stop):
+-            start_ (start), size_ (stop - start) {
+-            BOOST_UBLAS_CHECK (start_ <= stop, bad_index ());
++        basic_range (size_type in_start, size_type in_stop):
++            start_ (in_start), size_ (in_stop - in_start) {
++            BOOST_UBLAS_CHECK (start_ <= in_stop, bad_index ());
+         }
+ 
+         BOOST_UBLAS_INLINE
+@@ -1055,10 +1055,10 @@
+         }
+ 
+         BOOST_UBLAS_INLINE
+-        basic_range preprocess (size_type size) const {
++        basic_range preprocess (size_type s) const {
+             if (this != &all_)
+                 return *this;
+-            return basic_range (0, size);
++            return basic_range (0, s);
+         }
+         static
+         BOOST_UBLAS_INLINE
+@@ -1094,8 +1094,8 @@
+         basic_slice ():
+             start_ (0), stride_ (0), size_ (0) {}
+         BOOST_UBLAS_INLINE
+-        basic_slice (size_type start, difference_type stride, size_type size):
+-            start_ (start), stride_ (stride), size_ (size) {}
++        basic_slice (size_type in_start, difference_type in_stride, size_type in_size):
++            start_ (in_start), stride_ (in_stride), size_ (in_size) {}
+ 
+         BOOST_UBLAS_INLINE
+         size_type start () const {
+@@ -1274,10 +1274,10 @@
+         }
+ 
+         BOOST_UBLAS_INLINE
+-        basic_slice preprocess (size_type size) const {
++        basic_slice preprocess (size_type s) const {
+             if (this != &all_)
+                 return *this;
+-            return basic_slice (0, 1, size);
++            return basic_slice (0, 1, s);
+         }
+         static
+         BOOST_UBLAS_INLINE
+@@ -1316,11 +1316,11 @@
+         indirect_array ():
+             size_ (), data_ () {}
+         explicit BOOST_UBLAS_INLINE
+-        indirect_array (size_type size):
+-            size_ (size), data_ (size) {}
++        indirect_array (size_type s):
++            size_ (s), data_ (s) {}
+         BOOST_UBLAS_INLINE
+-        indirect_array (size_type size, const array_type &data):
+-            size_ (size), data_ (data) {}
++        indirect_array (size_type s, const array_type &d):
++            size_ (s), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         indirect_array (pointer start, pointer stop):
+             size_ (stop - start), data_ (stop - start) {
+@@ -1376,27 +1376,27 @@
+         BOOST_UBLAS_INLINE
+         indirect_array compose (const basic_range<size_type, difference_type> &r) const {
+             BOOST_UBLAS_CHECK (r.start () + r.size () <= size_, bad_size ());
+-            array_type data (r.size ());
++            array_type local_data (r.size ());
+             for (size_type i = 0; i < r.size (); ++ i)
+-                data [i] = data_ [r.start () + i];
+-            return indirect_array (r.size (), data);
++                local_data [i] = data_ [r.start () + i];
++            return indirect_array (r.size (), local_data);
+         }
+         BOOST_UBLAS_INLINE
+         indirect_array compose (const basic_slice<size_type, difference_type> &s) const {
+             BOOST_UBLAS_CHECK (s.start () + s.stride () * (s.size () - (s.size () > 0)) <= size (), bad_size ());
+-            array_type data (s.size ());
++            array_type local_data (s.size ());
+             for (size_type i = 0; i < s.size (); ++ i)
+-                data [i] = data_ [s.start () + s.stride () * i];
+-            return indirect_array (s.size (), data);
++                local_data [i] = data_ [s.start () + s.stride () * i];
++            return indirect_array (s.size (), local_data);
+         }
+         BOOST_UBLAS_INLINE
+         indirect_array compose (const indirect_array &ia) const {
+-            array_type data (ia.size_);
++            array_type local_data (ia.size_);
+             for (size_type i = 0; i < ia.size_; ++ i) {
+                 BOOST_UBLAS_CHECK (ia.data_ [i] <= size_, bad_size ());
+-                data [i] = data_ [ia.data_ [i]];
++                local_data [i] = data_ [ia.data_ [i]];
+             }
+-            return indirect_array (ia.size_, data);
++            return indirect_array (ia.size_, local_data);
+         }
+ 
+         // Comparison
+@@ -1534,11 +1534,11 @@
+         }
+ 
+         BOOST_UBLAS_INLINE
+-        indirect_array preprocess (size_type size) const {
++        indirect_array preprocess (size_type s) const {
+             if (this != &all_)
+                 return *this;
+-            indirect_array ia (size);
+-            for (size_type i = 0; i < size; ++ i)
++            indirect_array ia (s);
++            for (size_type i = 0; i < s; ++ i)
+                ia (i) = i;
+             return ia;
+         }
+@@ -1666,8 +1666,8 @@
+         typedef const value_type const_reference;
+ 
+         BOOST_UBLAS_INLINE
+-        index_pair_array(size_type size, V1& data1, V2& data2) :
+-              size_(size),data1_(data1),data2_(data2) {}
++        index_pair_array(size_type s, V1& data1, V2& data2) :
++              size_(s),data1_(data1),data2_(data2) {}
+ 
+         BOOST_UBLAS_INLINE
+         size_type size() const {
+@@ -1841,8 +1841,8 @@
+         typedef const value_type const_reference;
+ 
+         BOOST_UBLAS_INLINE
+-        index_triple_array(size_type size, V1& data1, V2& data2, V3& data3) :
+-              size_(size),data1_(data1),data2_(data2),data3_(data3) {}
++        index_triple_array(size_type s, V1& data1, V2& data2, V3& data3) :
++              size_(s),data1_(data1),data2_(data2),data3_(data3) {}
+ 
+         BOOST_UBLAS_INLINE
+         size_type size() const {
+diff -aruN a/boost/numeric/ublas/storage_sparse.hpp b/boost/numeric/ublas/storage_sparse.hpp
+--- a/boost/numeric/ublas/storage_sparse.hpp	2009-03-09 13:24:11.000000000 -0700
++++ b/boost/numeric/ublas/storage_sparse.hpp	2012-02-07 15:25:24.635307503 -0800
+@@ -263,38 +263,38 @@
+     private:
+         // Resizing - implicitly exposses uninitialized (but default constructed) mapped_type
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size) {
++        void resize (size_type s) {
+             BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ());
+-            if (size > capacity_) {
+-                const size_type capacity = size << 1;
+-                BOOST_UBLAS_CHECK (capacity, internal_logic ());
+-                pointer data = alloc_.allocate (capacity);
+-                std::uninitialized_copy (data_, data_ + (std::min) (size, size_), data);
+-                std::uninitialized_fill (data + (std::min) (size, size_), data + capacity, value_type ());
++            if (s > capacity_) {
++                const size_type cap = s << 1;
++                BOOST_UBLAS_CHECK (cap, internal_logic ());
++                pointer data = alloc_.allocate (cap);
++                std::uninitialized_copy (data_, data_ + (std::min) (s, size_), data);
++                std::uninitialized_fill (data + (std::min) (s, size_), data + cap, value_type ());
+ 
+                 if (capacity_) {
+                     std::for_each (data_, data_ + capacity_, static_destroy);
+                     alloc_.deallocate (data_, capacity_);
+                 }
+-                capacity_ = capacity;
++                capacity_ = cap;
+                 data_ = data;
+             }
+-            size_ = size;
++            size_ = s;
+             BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ());
+         }
+     public:
+ 
+         // Reserving
+         BOOST_UBLAS_INLINE
+-        void reserve (size_type capacity) {
++        void reserve (size_type cap) {
+             BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ());
+             // Reduce capacity_ if size_ allows
+-            BOOST_UBLAS_CHECK (capacity >= size_, bad_size ());
++            BOOST_UBLAS_CHECK (cap >= size_, bad_size ());
+             pointer data;
+-            if (capacity) {
+-                data = alloc_.allocate (capacity);
++            if (cap) {
++                data = alloc_.allocate (cap);
+                 std::uninitialized_copy (data_, data_ + size_, data);
+-                std::uninitialized_fill (data + size_, data + capacity, value_type ());
++                std::uninitialized_fill (data + size_, data + cap, value_type ());
+             }
+             else
+                 data = 0;
+@@ -303,7 +303,7 @@
+                 std::for_each (data_, data_ + capacity_, static_destroy);
+                 alloc_.deallocate (data_, capacity_);
+             }
+-            capacity_ = capacity;
++            capacity_ = cap;
+             data_ = data;
+             BOOST_UBLAS_CHECK (size_ <= capacity_, internal_logic ());
+         }
+diff -aruN a/boost/numeric/ublas/symmetric.hpp b/boost/numeric/ublas/symmetric.hpp
+--- a/boost/numeric/ublas/symmetric.hpp	2009-10-06 16:53:19.000000000 -0700
++++ b/boost/numeric/ublas/symmetric.hpp	2012-02-07 15:25:24.635307503 -0800
+@@ -76,14 +76,14 @@
+             size_ (BOOST_UBLAS_SAME (size, size)), data_ (triangular_type::packed_size (layout_type (), size, size)) {
+         }
+         BOOST_UBLAS_INLINE
+-        symmetric_matrix (size_type size1, size_type size2):
++        symmetric_matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size_ (BOOST_UBLAS_SAME (size1, size2)), data_ (triangular_type::packed_size (layout_type (), size1, size2)) {
++            size_ (BOOST_UBLAS_SAME (s1, s2)), data_ (triangular_type::packed_size (layout_type (), s1, s2)) {
+         }
+         BOOST_UBLAS_INLINE
+-        symmetric_matrix (size_type size, const array_type &data):
++        symmetric_matrix (size_type size, const array_type &d):
+             matrix_container<self_type> (),
+-            size_ (size), data_ (data) {}
++            size_ (size), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         symmetric_matrix (const symmetric_matrix &m):
+             matrix_container<self_type> (),
+@@ -130,8 +130,8 @@
+             }
+         }
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
+-            resize (BOOST_UBLAS_SAME (size1, size2), preserve);
++        void resize (size_type s1, size_type s2, bool preserve = true) {
++            resize (BOOST_UBLAS_SAME (s1, s2), preserve);
+         }
+         BOOST_UBLAS_INLINE
+         void resize_packed_preserve (size_type size) {
+@@ -944,9 +944,9 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        symmetric_adaptor (matrix_type &data):
++        symmetric_adaptor (matrix_type &d):
+             matrix_expression<self_type> (),
+-            data_ (data) {
++            data_ (d) {
+             BOOST_UBLAS_CHECK (data_.size1 () == data_.size2 (), bad_size ());
+         }
+         BOOST_UBLAS_INLINE
+@@ -1201,11 +1201,11 @@
+                 it1_begin_ (), it1_end_ (), it1_ (),
+                 it2_begin_ (), it2_end_ (), it2_ () {}
+             BOOST_UBLAS_INLINE
+-            const_iterator1 (const self_type &m, int begin, int end,
++            const_iterator1 (const self_type &m, int b, int e,
+                              const const_subiterator1_type &it1_begin, const const_subiterator1_type &it1_end,
+                              const const_subiterator2_type &it2_begin, const const_subiterator2_type &it2_end):
+                 container_const_reference<self_type> (m),
+-                begin_ (begin), end_ (end), current_ (begin),
++                begin_ (b), end_ (e), current_ (b),
+                 it1_begin_ (it1_begin), it1_end_ (it1_end), it1_ (it1_begin_),
+                 it2_begin_ (it2_begin), it2_end_ (it2_end), it2_ (it2_begin_) {
+                 if (current_ == 0 && it1_ == it1_end_)
+@@ -1648,11 +1648,11 @@
+                 it1_begin_ (), it1_end_ (), it1_ (),
+                 it2_begin_ (), it2_end_ (), it2_ () {}
+             BOOST_UBLAS_INLINE
+-            const_iterator2 (const self_type &m, int begin, int end,
++            const_iterator2 (const self_type &m, int b, int e,
+                              const const_subiterator1_type &it1_begin, const const_subiterator1_type &it1_end,
+                              const const_subiterator2_type &it2_begin, const const_subiterator2_type &it2_end):
+                 container_const_reference<self_type> (m),
+-                begin_ (begin), end_ (end), current_ (begin),
++                begin_ (b), end_ (e), current_ (b),
+                 it1_begin_ (it1_begin), it1_end_ (it1_end), it1_ (it1_begin_),
+                 it2_begin_ (it2_begin), it2_end_ (it2_end), it2_ (it2_begin_) {
+                 if (current_ == 0 && it1_ == it1_end_)
+diff -aruN a/boost/numeric/ublas/triangular.hpp b/boost/numeric/ublas/triangular.hpp
+--- a/boost/numeric/ublas/triangular.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/triangular.hpp	2012-02-07 15:25:24.639286239 -0800
+@@ -106,14 +106,14 @@
+             matrix_container<self_type> (),
+             size1_ (0), size2_ (0), data_ (0) {}
+         BOOST_UBLAS_INLINE
+-        triangular_matrix (size_type size1, size_type size2):
++        triangular_matrix (size_type s1, size_type s2):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (triangular_type::packed_size (layout_type (), size1, size2)) {
++            size1_ (s1), size2_ (s2), data_ (triangular_type::packed_size (layout_type (), s1, s2)) {
+         }
+         BOOST_UBLAS_INLINE
+-        triangular_matrix (size_type size1, size_type size2, const array_type &data):
++        triangular_matrix (size_type s1, size_type s2, const array_type &d):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (data) {}
++            size1_ (s1), size2_ (s2), data_ (d) {}
+         BOOST_UBLAS_INLINE
+         triangular_matrix (const triangular_matrix &m):
+             matrix_container<self_type> (),
+@@ -149,21 +149,21 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             if (preserve) {
+-                self_type temporary (size1, size2);
++                self_type temporary (s1, s2);
+                 detail::matrix_resize_preserve<layout_type, triangular_type> (*this, temporary);
+             }
+             else {
+-                data ().resize (triangular_type::packed_size (layout_type (), size1, size2));
+-                size1_ = size1;
+-                size2_ = size2;
++                data ().resize (triangular_type::packed_size (layout_type (), s1, s2));
++                size1_ = s1;
++                size2_ = s2;
+             }
+         }
+         BOOST_UBLAS_INLINE
+-        void resize_packed_preserve (size_type size1, size_type size2) {
+-            size1_ = size1;
+-            size2_ = size2;
++        void resize_packed_preserve (size_type s1, size_type s2) {
++            size1_ = s1;
++            size2_ = s2;
+             data ().resize (triangular_type::packed_size (layout_type (), size1_, size2_), value_type ());
+         }
+ 
+@@ -996,9 +996,9 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        triangular_adaptor (matrix_type &data):
++        triangular_adaptor (matrix_type &d):
+             matrix_expression<self_type> (),
+-            data_ (data) {}
++            data_ (d) {}
+         BOOST_UBLAS_INLINE
+         triangular_adaptor (const triangular_adaptor &m):
+             matrix_expression<self_type> (),
+diff -aruN a/boost/numeric/ublas/vector.hpp b/boost/numeric/ublas/vector.hpp
+--- a/boost/numeric/ublas/vector.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/vector.hpp	2012-02-07 15:25:24.639286239 -0800
+@@ -72,9 +72,9 @@
+ 	/// By default, its elements are initialized to 0.
+ 	/// \param size initial size of the vector
+         explicit BOOST_UBLAS_INLINE
+-        vector (size_type size):
++        vector (size_type s):
+             vector_container<self_type> (),
+-            data_ (size) {
++            data_ (s) {
+         }
+ 
+ 	/// \brief Constructor of a vector by copying from another container
+@@ -83,25 +83,25 @@
+ 	/// \param data container of type \c A
+ 	/// \todo remove this definition because \c size is not used
+         BOOST_UBLAS_INLINE
+-        vector (size_type size, const array_type &data):
++        vector (size_type s, const array_type &d):
+             vector_container<self_type> (),
+-            data_ (data) {}
++            data_ (d) {}
+ 
+ 	/// \brief Constructor of a vector by copying from another container
+ 	/// This type has the generic name \c array_typ within the vector definition.
+ 	/// \param data container of type \c A
+         BOOST_UBLAS_INLINE
+-        vector (const array_type &data):
++        vector (const array_type &d):
+             vector_container<self_type> (),
+-            data_ (data) {}
++            data_ (d) {}
+ 
+ 	/// \brief Constructor of a vector with a predefined size and a unique initial value
+ 	/// \param size of the vector
+ 	/// \param init value to assign to each element of the vector
+         BOOST_UBLAS_INLINE
+-        vector (size_type size, const value_type &init):
++        vector (size_type s, const value_type &init):
+             vector_container<self_type> (),
+-            data_ (size, init) {}
++            data_ (s, init) {}
+ 
+ 	/// \brief Copy-constructor of a vector
+ 	/// \param v is the vector to be duplicated
+@@ -175,11 +175,11 @@
+ 	/// \param size new size of the vector
+ 	/// \param preserve if true, keep values
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool preserve = true) {
++        void resize (size_type s, bool preserve = true) {
+             if (preserve)
+-                data ().resize (size, typename A::value_type ());
++                data ().resize (s, typename A::value_type ());
+             else
+-                data ().resize (size);
++                data ().resize (s);
+         }
+ 
+ 	// ---------------
+@@ -900,9 +900,9 @@
+             vector_container<self_type> (),
+             size_ (0) {}
+         explicit BOOST_UBLAS_INLINE
+-        zero_vector (size_type size):
++        zero_vector (size_type s):
+             vector_container<self_type> (),
+-            size_ (size) {}
++            size_ (s) {}
+         BOOST_UBLAS_INLINE
+         zero_vector (const zero_vector &v):
+             vector_container<self_type> (),
+@@ -916,8 +916,8 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool /*preserve*/ = true) {
+-            size_ = size;
++        void resize (size_type s, bool /*preserve*/ = true) {
++            size_ = s;
+         }
+ 
+         // Element support
+@@ -1110,9 +1110,9 @@
+ 	/// \param size is the dimension of the vector
+ 	/// \param index is the order of the vector
+         BOOST_UBLAS_INLINE
+-        explicit unit_vector (size_type size, size_type index = 0):
++        explicit unit_vector (size_type s, size_type i = 0):
+             vector_container<self_type> (),
+-            size_ (size), index_ (index) {}
++            size_ (s), index_ (i) {}
+ 
+ 	/// \brief Copy-constructor
+         BOOST_UBLAS_INLINE
+@@ -1141,8 +1141,8 @@
+ 	/// \brief Resize the vector. The values are preserved by default (i.e. the index does not change)
+ 	/// \param size is the new size of the vector
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool /*preserve*/ = true) {
+-            size_ = size;
++        void resize (size_type s, bool /*preserve*/ = true) {
++            size_ = s;
+         }
+ 
+         // Element support
+@@ -1352,9 +1352,9 @@
+             vector_container<self_type> (),
+             size_ (0), value_ () {}
+         BOOST_UBLAS_INLINE
+-        explicit scalar_vector (size_type size, const value_type &value = value_type(1)):
++        explicit scalar_vector (size_type s, const value_type &value = value_type(1)):
+             vector_container<self_type> (),
+-            size_ (size), value_ (value) {}
++            size_ (s), value_ (value) {}
+         BOOST_UBLAS_INLINE
+         scalar_vector (const scalar_vector &v):
+             vector_container<self_type> (),
+@@ -1368,8 +1368,8 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool /*preserve*/ = true) {
+-            size_ = size;
++        void resize (size_type s, bool /*preserve*/ = true) {
++            size_ = s;
+         }
+ 
+         // Element support
+@@ -1594,8 +1594,8 @@
+         c_vector ():
+             size_ (N) /* , data_ () */ {}
+         explicit BOOST_UBLAS_INLINE
+-        c_vector (size_type size):
+-            size_ (size) /* , data_ () */ {
++        c_vector (size_type s):
++            size_ (s) /* , data_ () */ {
+             if (size_ > N)
+                 bad_size ().raise ();
+         }
+@@ -1631,10 +1631,10 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool preserve = true) {
+-            if (size > N)
++        void resize (size_type s, bool preserve = true) {
++            if (s > N)
+                 bad_size ().raise ();
+-            size_ = size;
++            size_ = s;
+         }
+ 
+         // Element support
+diff -aruN a/boost/numeric/ublas/vector_of_vector.hpp b/boost/numeric/ublas/vector_of_vector.hpp
+--- a/boost/numeric/ublas/vector_of_vector.hpp	2007-11-25 10:07:19.000000000 -0800
++++ b/boost/numeric/ublas/vector_of_vector.hpp	2012-02-07 15:25:24.639286239 -0800
+@@ -66,9 +66,9 @@
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+-        generalized_vector_of_vector (size_type size1, size_type size2, size_type non_zeros = 0):
++        generalized_vector_of_vector (size_type s1, size_type s2, size_type non_zeros = 0):
+             matrix_container<self_type> (),
+-            size1_ (size1), size2_ (size2), data_ (layout_type::size_M (size1_, size2_) + 1) {
++            size1_ (s1), size2_ (s2), data_ (layout_type::size_M (size1_, size2_) + 1) {
+             const size_type sizeM = layout_type::size_M (size1_, size2_);
+             const size_type sizem = layout_type::size_m (size1_, size2_);
+             for (size_type i = 0; i < sizeM; ++ i) // create size1 vector elements
+@@ -132,10 +132,10 @@
+ 
+         // Resizing
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size1, size_type size2, bool preserve = true) {
++        void resize (size_type s1, size_type s2, bool preserve = true) {
+             const size_type oldM = layout_type::size_M (size1_, size2_);
+-            size1_ = size1;
+-            size2_ = size2;
++            size1_ = s1;
++            size2_ = s2;
+             const size_type sizeM = layout_type::size_M (size1_, size2_);
+             const size_type sizem = layout_type::size_m (size1_, size2_);
+             data ().resize (sizeM + 1, preserve);
+diff -aruN a/boost/numeric/ublas/vector_proxy.hpp b/boost/numeric/ublas/vector_proxy.hpp
+--- a/boost/numeric/ublas/vector_proxy.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/vector_proxy.hpp	2012-02-07 15:25:24.639286239 -0800
+@@ -59,15 +59,15 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        vector_range (vector_type &data, const range_type &r):
+-            data_ (data), r_ (r.preprocess (data.size ())) {
++        vector_range (vector_type &d, const range_type &r):
++            data_ (d), r_ (r.preprocess (d.size ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (r_.start () <= data_.size () &&
+             //                   r_.start () + r_.size () <= data_.size (), bad_index ());
+         }
+         BOOST_UBLAS_INLINE
+-        vector_range (const vector_closure_type &data, const range_type &r, bool):
+-            data_ (data), r_ (r.preprocess (data.size ())) {
++        vector_range (const vector_closure_type &d, const range_type &r, bool):
++            data_ (d), r_ (r.preprocess (d.size ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (r_.start () <= data_.size () &&
+             //                    r_.start () + r_.size () <= data_.size (), bad_index ());
+@@ -614,15 +614,15 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        vector_slice (vector_type &data, const slice_type &s):
+-            data_ (data), s_ (s.preprocess (data.size ())) {
++        vector_slice (vector_type &d, const slice_type &s):
++            data_ (d), s_ (s.preprocess (d.size ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (s_.start () <= data_.size () &&
+             //                    s_.start () + s_.stride () * (s_.size () - (s_.size () > 0)) <= data_.size (), bad_index ());
+         }
+         BOOST_UBLAS_INLINE
+-        vector_slice (const vector_closure_type &data, const slice_type &s, int):
+-            data_ (data), s_ (s.preprocess (data.size ())) {
++        vector_slice (const vector_closure_type &d, const slice_type &s, int):
++            data_ (d), s_ (s.preprocess (d.size ())) {
+             // Early checking of preconditions here.
+             // BOOST_UBLAS_CHECK (s_.start () <= data_.size () &&
+             //                    s_.start () + s_.stride () * (s_.size () - (s_.size () > 0)) <= data_.size (), bad_index ());
+@@ -1159,14 +1159,14 @@
+ 
+         // Construction and destruction
+         BOOST_UBLAS_INLINE
+-        vector_indirect (vector_type &data, size_type size):
+-            data_ (data), ia_ (size) {}
++        vector_indirect (vector_type &d, size_type s):
++            data_ (d), ia_ (s) {}
+         BOOST_UBLAS_INLINE
+-        vector_indirect (vector_type &data, const indirect_array_type &ia):
+-            data_ (data), ia_ (ia.preprocess (data.size ())) {}
++        vector_indirect (vector_type &d, const indirect_array_type &ia):
++            data_ (d), ia_ (ia.preprocess (d.size ())) {}
+         BOOST_UBLAS_INLINE
+-        vector_indirect (const vector_closure_type &data, const indirect_array_type &ia, int):
+-            data_ (data), ia_ (ia.preprocess (data.size ())) {}
++        vector_indirect (const vector_closure_type &d, const indirect_array_type &ia, int):
++            data_ (d), ia_ (ia.preprocess (d.size ())) {}
+ 
+         // Accessors
+         BOOST_UBLAS_INLINE
+diff -aruN a/boost/numeric/ublas/vector_sparse.hpp b/boost/numeric/ublas/vector_sparse.hpp
+--- a/boost/numeric/ublas/vector_sparse.hpp	2010-07-04 23:06:24.000000000 -0700
++++ b/boost/numeric/ublas/vector_sparse.hpp	2012-02-07 15:25:24.639286239 -0800
+@@ -309,9 +309,9 @@
+             vector_container<self_type> (),
+             size_ (0), data_ () {}
+         BOOST_UBLAS_INLINE
+-        mapped_vector (size_type size, size_type non_zeros = 0):
++        mapped_vector (size_type s, size_type non_zeros = 0):
+             vector_container<self_type> (),
+-            size_ (size), data_ () {
++            size_ (s), data_ () {
+             detail::map_reserve (data(), restrict_capacity (non_zeros));
+         }
+         BOOST_UBLAS_INLINE
+@@ -360,8 +360,8 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool preserve = true) {
+-            size_ = size;
++        void resize (size_type s, bool preserve = true) {
++            size_ = s;
+             if (preserve) {
+                 data ().erase (data ().lower_bound(size_), data ().end());
+             }
+@@ -832,9 +832,9 @@
+             storage_invariants ();
+         }
+         explicit BOOST_UBLAS_INLINE
+-        compressed_vector (size_type size, size_type non_zeros = 0):
++        compressed_vector (size_type s, size_type non_zeros = 0):
+             vector_container<self_type> (),
+-            size_ (size), capacity_ (restrict_capacity (non_zeros)), filled_ (0),
++            size_ (s), capacity_ (restrict_capacity (non_zeros)), filled_ (0),
+             index_data_ (capacity_), value_data_ (capacity_) {
+         storage_invariants ();
+         }
+@@ -887,8 +887,8 @@
+             return value_data_;
+         }
+         BOOST_UBLAS_INLINE
+-        void set_filled (const typename index_array_type::size_type & filled) {
+-            filled_ = filled;
++        void set_filled (const typename index_array_type::size_type & f) {
++            filled_ = f;
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+@@ -910,14 +910,14 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool preserve = true) {
+-            size_ = size;
++        void resize (size_type s, bool preserve = true) {
++            size_ = s;
+             capacity_ = restrict_capacity (capacity_);
+             if (preserve) {
+                 index_data_. resize (capacity_, size_type ());
+                 value_data_. resize (capacity_, value_type ());
+                 filled_ = (std::min) (capacity_, filled_);
+-                while ((filled_ > 0) && (zero_based(index_data_[filled_ - 1]) >= size)) {
++                while ((filled_ > 0) && (zero_based(index_data_[filled_ - 1]) >= s)) {
+                     --filled_;
+                 }
+             }
+@@ -1473,9 +1473,9 @@
+             storage_invariants ();
+         }
+         explicit BOOST_UBLAS_INLINE
+-        coordinate_vector (size_type size, size_type non_zeros = 0):
++        coordinate_vector (size_type s, size_type non_zeros = 0):
+             vector_container<self_type> (),
+-            size_ (size), capacity_ (restrict_capacity (non_zeros)),
++            size_ (s), capacity_ (restrict_capacity (non_zeros)),
+             filled_ (0), sorted_filled_ (filled_), sorted_ (true),
+             index_data_ (capacity_), value_data_ (capacity_) {
+             storage_invariants ();
+@@ -1531,9 +1531,9 @@
+             return value_data_;
+         }
+         BOOST_UBLAS_INLINE
+-        void set_filled (const typename index_array_type::size_type &sorted, const typename index_array_type::size_type &filled) {
++        void set_filled (const typename index_array_type::size_type &sorted, const typename index_array_type::size_type &f) {
+             sorted_filled_ = sorted;
+-            filled_ = filled;
++            filled_ = f;
+             storage_invariants ();
+         }
+         BOOST_UBLAS_INLINE
+@@ -1556,16 +1556,16 @@
+         }
+     public:
+         BOOST_UBLAS_INLINE
+-        void resize (size_type size, bool preserve = true) {
++        void resize (size_type s, bool preserve = true) {
+             if (preserve)
+                 sort ();    // remove duplicate elements.
+-            size_ = size;
++            size_ = s;
+             capacity_ = restrict_capacity (capacity_);
+             if (preserve) {
+                 index_data_. resize (capacity_, size_type ());
+                 value_data_. resize (capacity_, value_type ());
+                 filled_ = (std::min) (capacity_, filled_);
+-                while ((filled_ > 0) && (zero_based(index_data_[filled_ - 1]) >= size)) {
++                while ((filled_ > 0) && (zero_based(index_data_[filled_ - 1]) >= s)) {
+                     --filled_;
+                 }
+             }
+@@ -1813,19 +1813,19 @@
+                 std::inplace_merge (ipa.begin (), iunsorted, ipa.end ());
+ 
+                 // sum duplicates with += and remove
+-                size_type filled = 0;
++                size_type f = 0;
+                 for (size_type i = 1; i < filled_; ++ i) {
+-                    if (index_data_ [filled] != index_data_ [i]) {
+-                        ++ filled;
+-                        if (filled != i) {
+-                            index_data_ [filled] = index_data_ [i];
+-                            value_data_ [filled] = value_data_ [i];
++                    if (index_data_ [f] != index_data_ [i]) {
++                        ++ f;
++                        if (f != i) {
++                            index_data_ [f] = index_data_ [i];
++                            value_data_ [f] = value_data_ [i];
+                         }
+                     } else {
+-                        value_data_ [filled] += value_data_ [i];
++                        value_data_ [f] += value_data_ [i];
+                     }
+                 }
+-                filled_ = filled + 1;
++                filled_ = f + 1;
+                 sorted_filled_ = filled_;
+                 sorted_ = true;
+                 storage_invariants ();
diff --git a/boost.patches/boost-53.description b/boost.patches/boost-53.description
new file mode 100644
index 0000000..a8c9afd
--- /dev/null
+++ b/boost.patches/boost-53.description
@@ -0,0 +1,3 @@
+Fix compiler warnings triggered by -Wunused-local-typedefs.  Some of this was taken
+from here https://svn.boost.org/trac/boost/ticket/8546 and some was fixed by looking
+at the build log.
diff --git a/boost.patches/boost-53.patch b/boost.patches/boost-53.patch
new file mode 100644
index 0000000..552e5a2
--- /dev/null
+++ b/boost.patches/boost-53.patch
@@ -0,0 +1,158 @@
+diff -Naur a/boost/algorithm/string/detail/finder.hpp b/boost/algorithm/string/detail/finder.hpp
+--- a/boost/algorithm/string/detail/finder.hpp	2009-09-13 12:10:55.000000000 -0700
++++ b/boost/algorithm/string/detail/finder.hpp	2015-04-15 09:02:18.683944124 -0700
+@@ -142,7 +142,6 @@
+                     ForwardIteratorT End,
+                     std::forward_iterator_tag ) const
+                 {
+-                    typedef ForwardIteratorT input_iterator_type;
+                     typedef iterator_range<ForwardIteratorT> result_type;
+ 
+                     first_finder_type first_finder(
+@@ -263,7 +262,6 @@
+                     ForwardIteratorT End,
+                     unsigned int N) const
+                 {
+-                    typedef ForwardIteratorT input_iterator_type;
+                     typedef iterator_range<ForwardIteratorT> result_type;
+ 
+                     // Sanity check
+@@ -298,7 +296,6 @@
+                     ForwardIteratorT End,
+                     unsigned int N) const
+                 {
+-                    typedef ForwardIteratorT input_iterator_type;
+                     typedef iterator_range<ForwardIteratorT> result_type;
+ 
+                     // Sanity check
+@@ -362,7 +359,6 @@
+                 unsigned int N,
+                 std::random_access_iterator_tag )
+             {
+-                typedef ForwardIteratorT input_iterator_type;
+                 typedef iterator_range<ForwardIteratorT> result_type;
+ 
+                 if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )
+@@ -436,7 +432,6 @@
+                 unsigned int N,
+                 std::random_access_iterator_tag )
+             {
+-                typedef ForwardIteratorT input_iterator_type;
+                 typedef iterator_range<ForwardIteratorT> result_type;
+ 
+                 if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )
+diff -Naur a/boost/bind/arg.hpp b/boost/bind/arg.hpp
+--- a/boost/bind/arg.hpp	2007-11-25 10:07:19.000000000 -0800
++++ b/boost/bind/arg.hpp	2015-04-15 09:02:18.683944124 -0700
+@@ -34,7 +34,6 @@
+     template< class T > arg( T const & /* t */ )
+     {
+         // static assert I == is_placeholder<T>::value
+-        typedef char T_must_be_placeholder[ I == is_placeholder<T>::value? 1: -1 ];
+     }
+ };
+ 
+diff -Naur a/boost/concept/detail/general.hpp b/boost/concept/detail/general.hpp
+--- a/boost/concept/detail/general.hpp	2010-06-08 12:31:13.000000000 -0700
++++ b/boost/concept/detail/general.hpp	2015-04-15 09:02:18.683944124 -0700
+@@ -12,6 +12,15 @@
+ #  include <boost/mpl/if.hpp>
+ # endif
+ 
++
++// If the compiler warns about unused typedefs then enable this:
++//
++#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
++#  define BOOST_CONCEPT_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
++#else
++#  define BOOST_CONCEPT_ASSERT_UNUSED_ATTRIBUTE
++#endif
++
+ // This implementation works on Comeau and GCC, all the way back to
+ // 2.95
+ namespace boost { namespace concepts {
+@@ -68,7 +77,7 @@
+ #  define BOOST_CONCEPT_ASSERT_FN( ModelFnPtr )             \
+     typedef ::boost::concepts::detail::instantiate<          \
+     &::boost::concepts::requirement_<ModelFnPtr>::failed>    \
+-      BOOST_PP_CAT(boost_concept_check,__LINE__)
++      BOOST_PP_CAT(boost_concept_check,__LINE__) BOOST_CONCEPT_ASSERT_UNUSED_ATTRIBUTE
+ 
+ }}
+ 
+diff -Naur a/boost/ptr_container/detail/move.hpp b/boost/ptr_container/detail/move.hpp
+--- a/boost/ptr_container/detail/move.hpp	2008-03-22 14:45:55.000000000 -0700
++++ b/boost/ptr_container/detail/move.hpp	2015-04-15 09:02:18.699944284 -0700
+@@ -20,7 +20,7 @@
+ template<typename Ptr>
+ class move_source {
+ public:
+-    move_source(Ptr& ptr) : ptr_(ptr) {}
++    move_source(Ptr& ptrArg) : ptr_(ptrArg) {}
+     Ptr& ptr() const { return ptr_; }
+ private:
+     Ptr& ptr_;
+diff -Naur a/boost/ptr_container/detail/reversible_ptr_container.hpp b/boost/ptr_container/detail/reversible_ptr_container.hpp
+--- a/boost/ptr_container/detail/reversible_ptr_container.hpp	2009-04-05 12:55:59.000000000 -0700
++++ b/boost/ptr_container/detail/reversible_ptr_container.hpp	2015-04-15 09:02:18.699944284 -0700
+@@ -278,9 +278,9 @@
+ 
+     private:
+         template< class ForwardIterator >
+-        ForwardIterator advance( ForwardIterator begin, size_type n ) 
++        ForwardIterator advance( ForwardIterator beginArg, size_type n ) 
+         {
+-            ForwardIterator iter = begin;
++            ForwardIterator iter = beginArg;
+             std::advance( iter, n );
+             return iter;
+         }        
+diff -Naur a/boost/ptr_container/detail/static_move_ptr.hpp b/boost/ptr_container/detail/static_move_ptr.hpp
+--- a/boost/ptr_container/detail/static_move_ptr.hpp	2008-03-22 14:45:55.000000000 -0700
++++ b/boost/ptr_container/detail/static_move_ptr.hpp	2015-04-15 09:02:18.699944284 -0700
+@@ -151,7 +151,7 @@
+     deleter_const_reference get_deleter() const { return impl_.second(); }
+ private:
+     template<typename TT, typename DD>
+-    void check(const static_move_ptr<TT, DD>& ptr)
++    void check(const static_move_ptr<TT, DD>& ptrArg)
+         {
+             typedef move_ptrs::is_smart_ptr_convertible<TT, T> convertible;
+             BOOST_STATIC_ASSERT(convertible::value);
+diff -Naur a/boost/ptr_container/exception.hpp b/boost/ptr_container/exception.hpp
+--- a/boost/ptr_container/exception.hpp	2008-03-22 14:45:55.000000000 -0700
++++ b/boost/ptr_container/exception.hpp	2015-04-15 09:02:18.699944284 -0700
+@@ -24,7 +24,7 @@
+     {
+         const char* what_;
+     public:
+-        bad_ptr_container_operation( const char* what ) : what_( what )
++        bad_ptr_container_operation( const char* whatArg ) : what_( whatArg )
+         { }
+         
+         virtual const char* what() const throw()
+@@ -38,7 +38,7 @@
+     class bad_index : public bad_ptr_container_operation
+     {
+     public:
+-        bad_index( const char* what ) : bad_ptr_container_operation( what )
++        bad_index( const char* whatArg ) : bad_ptr_container_operation( whatArg )
+         { }
+     };
+ 
+diff -Naur a/boost/system/error_code.hpp b/boost/system/error_code.hpp
+--- a/boost/system/error_code.hpp	2010-07-06 03:47:30.000000000 -0700
++++ b/boost/system/error_code.hpp	2015-04-15 09:02:18.695944245 -0700
+@@ -211,9 +211,9 @@
+     inline const error_category &  get_system_category() { return system_category(); }
+     inline const error_category &  get_generic_category() { return generic_category(); }
+     inline const error_category &  get_posix_category() { return generic_category(); }
+-    static const error_category &  posix_category = generic_category();
+-    static const error_category &  errno_ecat     = generic_category();
+-    static const error_category &  native_ecat    = system_category();
++    //static const error_category &  posix_category = generic_category();
++    //static const error_category &  errno_ecat     = generic_category();
++    //static const error_category &  native_ecat    = system_category();
+ # endif
+ 
+     //  class error_condition  -----------------------------------------------//
diff --git a/boost.patches/boost-54.description b/boost.patches/boost-54.description
new file mode 100644
index 0000000..679dc8c
--- /dev/null
+++ b/boost.patches/boost-54.description
@@ -0,0 +1 @@
+Fix compiler shadowed declaration warnings in uuid_io
diff --git a/boost.patches/boost-54.patch b/boost.patches/boost-54.patch
new file mode 100644
index 0000000..12718e7
--- /dev/null
+++ b/boost.patches/boost-54.patch
@@ -0,0 +1,12 @@
+diff -aruN boost_1_45_0/boost/uuid/uuid_io.hpp boost_1_45_0.N/boost/uuid/uuid_io.hpp
+--- boost_1_45_0/boost/uuid/uuid_io.hpp	2010-07-12 17:37:17.000000000 -0700
++++ boost_1_45_0.N/boost/uuid/uuid_io.hpp	2015-04-28 17:59:01.600615207 -0700
+@@ -59,7 +59,7 @@
+         }
+         
+         if (flags & std::ios_base::left) {
+-            for (std::streamsize i=uuid_width; i<width; i++) {
++            for (std::streamsize j=uuid_width; j<width; j++) {
+                 os << fill;
+             }
+         }
diff --git a/boost.patches/boost-55.description b/boost.patches/boost-55.description
new file mode 100644
index 0000000..3405cc2
--- /dev/null
+++ b/boost.patches/boost-55.description
@@ -0,0 +1 @@
+Allow boost dynamic libraries to expect to be installed in a specific directory
diff --git a/boost.patches/boost-55.patch b/boost.patches/boost-55.patch
new file mode 100644
index 0000000..cf15560
--- /dev/null
+++ b/boost.patches/boost-55.patch
@@ -0,0 +1,21 @@
+diff -Naur a/tools/build/v2/tools/darwin.jam b/tools/build/v2/tools/darwin.jam
+--- a/tools/build/v2/tools/darwin.jam	2010-07-12 00:37:43.000000000 -0700
++++ b/tools/build/v2/tools/darwin.jam	2015-12-04 10:04:07.000000000 -0800
+@@ -33,6 +33,8 @@
+ ## A dependency, that is forced to be included in the link.
+ feature force-load : : free dependency incidental ;
+ 
++flags darwin.link INSTALL_NAME_PATH <dll-path> ;
++
+ #############################################################################
+ 
+ if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
+@@ -540,7 +542,7 @@
+ 
+ actions link.dll bind LIBRARIES
+ {
+-    "$(CONFIG_COMMAND)" -dynamiclib -Wl,-single_module -install_name "$(<:B)$(<:S)" -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
++    "$(CONFIG_COMMAND)" -dynamiclib -Wl,-single_module -install_name "$(INSTALL_NAME_PATH[1])/$(<[1]:B)$(<[1]:S)" -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
+ }
+ 
+ # We use libtool instead of ar to support universal binary linking
diff --git a/boost.tar.bz2 b/boost.tar.bz2
new file mode 100644
index 0000000..e824653
--- /dev/null
+++ b/boost.tar.bz2
Binary files differ
diff --git a/boost.url b/boost.url
new file mode 100644
index 0000000..75502b2
--- /dev/null
+++ b/boost.url
@@ -0,0 +1 @@
+http://download.sourceforge.net/boost/boost_1_45_0.tar.bz2
diff --git a/boost.version b/boost.version
new file mode 100644
index 0000000..37918b8
--- /dev/null
+++ b/boost.version
@@ -0,0 +1 @@
+1_45_0
