diff --git a/Builds/VisualStudio2012/beast.vcxproj b/Builds/VisualStudio2012/beast.vcxproj
index c63d3621d..934a28286 100644
--- a/Builds/VisualStudio2012/beast.vcxproj
+++ b/Builds/VisualStudio2012/beast.vcxproj
@@ -172,6 +172,7 @@
+
diff --git a/Builds/VisualStudio2012/beast.vcxproj.filters b/Builds/VisualStudio2012/beast.vcxproj.filters
index 6b718eb5c..171a1a51f 100644
--- a/Builds/VisualStudio2012/beast.vcxproj.filters
+++ b/Builds/VisualStudio2012/beast.vcxproj.filters
@@ -1248,6 +1248,9 @@
beast\utility
+
+ beast\threads
+
diff --git a/beast/Threads.h b/beast/Threads.h
index 7336bc777..6c3859d9a 100644
--- a/beast/Threads.h
+++ b/beast/Threads.h
@@ -32,5 +32,6 @@
#include "threads/Thread.h"
#include "threads/ThreadLocalValue.h"
#include "threads/WaitableEvent.h"
+#include "threads/ScopedWrapperContext.h"
#endif
diff --git a/beast/threads/ScopedWrapperContext.h b/beast/threads/ScopedWrapperContext.h
new file mode 100644
index 000000000..6a0b88324
--- /dev/null
+++ b/beast/threads/ScopedWrapperContext.h
@@ -0,0 +1,93 @@
+//------------------------------------------------------------------------------
+/*
+ This file is part of Beast: https://github.com/vinniefalco/Beast
+ Copyright 2013, Vinnie Falco
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef BEAST_THREADS_WRAPSCOPED_H_INCLUDED
+#define BEAST_THREADS_WRAPSCOPED_H_INCLUDED
+
+namespace beast {
+
+/** Wraps a function object so invocation happens during a scoped container lifetime. */
+/** @{ */
+namespace detail {
+
+template
+class ScopedWrapper
+{
+public:
+ ScopedWrapper (Context const& context, Handler const& handler)
+ : m_context (context)
+ , m_handler (handler)
+ { }
+
+ void operator() ()
+ {
+ ScopedType const scope (m_context);
+ m_handler();
+ }
+
+private:
+ Context const& m_context;
+ Handler m_handler;
+};
+
+}
+
+//------------------------------------------------------------------------------
+
+/** Helper to eliminate the template argument at call sites. */
+template
+class ScopedWrapperContext
+{
+public:
+ typedef Context context_type;
+ typedef ScopedType scoped_type;
+
+ class Scope
+ {
+ public:
+ explicit Scope (ScopedWrapperContext const& owner)
+ : m_scope (owner.m_context)
+ { }
+ private:
+ scoped_type m_scope;
+ };
+
+ ScopedWrapperContext ()
+ { }
+
+ template
+ explicit ScopedWrapperContext (Arg& arg)
+ : m_context (arg)
+ { }
+
+ template
+ detail::ScopedWrapper wrap (
+ Handler const& handler)
+ {
+ return detail::ScopedWrapper (
+ m_context, handler);
+ }
+
+private:
+ Context m_context;
+};
+
+}
+
+#endif