From 4b95dcfbe9bcfddcffb5b75245a62f65f4fa3fed Mon Sep 17 00:00:00 2001 From: Jeremiah Willcock Date: Sun, 15 Jan 2012 23:32:09 +0000 Subject: [PATCH] Merged r76050, r75547, r75891, r76049, r76083, and r76439 from trunk (reverse_graph bug fixes and fix for #6293); refs #6293 [SVN r76535] --- doc/AStarHeuristic.html | 2 +- doc/AdjacencyGraph.html | 4 +- doc/BidirectionalGraph.html | 4 +- doc/EdgeListGraph.html | 4 +- doc/Graph.html | 12 +- doc/IncidenceGraph.html | 4 +- doc/KeyedUpdatableQueue.html | 4 +- doc/MutableGraph.html | 6 +- doc/MutablePropertyGraph.html | 2 +- doc/PropertyGraph.html | 6 +- doc/UpdatableQueue.html | 2 +- doc/VertexAndEdgeListGraph.html | 4 +- doc/VertexListGraph.html | 6 +- doc/biconnected_components.w | 11 +- doc/constructing_algorithms.html | 10 +- doc/isomorphism-impl-v2.w | 22 +- doc/isomorphism-impl-v3.w | 22 +- doc/isomorphism-impl.w | 14 +- doc/leda_conversion.html | 6 +- doc/reverse_graph.html | 29 +- doc/transitive_closure.w | 19 +- example/implicit_graph.cpp | 20 +- example/leda-concept-check.cpp | 11 +- example/loops_dfs.cpp | 5 +- example/put-get-helper-eg.cpp | 3 +- include/boost/graph/astar_search.hpp | 6 +- .../graph/bellman_ford_shortest_paths.hpp | 11 +- .../boost/graph/biconnected_components.hpp | 17 +- .../graph/boykov_kolmogorov_max_flow.hpp | 21 +- include/boost/graph/breadth_first_search.hpp | 9 +- .../boost/graph/bron_kerbosch_all_cliques.hpp | 18 +- include/boost/graph/closeness_centrality.hpp | 33 +- .../boost/graph/clustering_coefficient.hpp | 21 +- include/boost/graph/connected_components.hpp | 5 +- include/boost/graph/copy.hpp | 25 +- include/boost/graph/core_numbers.hpp | 3 +- include/boost/graph/degree_centrality.hpp | 11 +- include/boost/graph/depth_first_search.hpp | 21 +- include/boost/graph/detail/geodesic.hpp | 9 +- .../boost/graph/dijkstra_shortest_paths.hpp | 3 +- include/boost/graph/dominator_tree.hpp | 7 +- include/boost/graph/eccentricity.hpp | 19 +- .../boost/graph/floyd_warshall_shortest.hpp | 9 +- include/boost/graph/geodesic_distance.hpp | 35 ++- include/boost/graph/graph_concepts.hpp | 5 +- include/boost/graph/howard_cycle_ratio.hpp | 11 +- include/boost/graph/isomorphism.hpp | 23 +- .../graph/johnson_all_pairs_shortest.hpp | 5 +- .../boost/graph/kruskal_min_spanning_tree.hpp | 19 +- include/boost/graph/neighbor_bfs.hpp | 11 +- include/boost/graph/properties.hpp | 2 + include/boost/graph/reverse_graph.hpp | 130 ++++++-- include/boost/graph/strong_components.hpp | 11 +- include/boost/graph/tiernan_all_cycles.hpp | 17 +- include/boost/graph/transitive_closure.hpp | 21 +- include/boost/graph/undirected_dfs.hpp | 29 +- test/adj_list_cc.cpp | 297 +++++++++--------- test/adj_matrix_cc.cpp | 69 ++-- test/edge_list_cc.cpp | 7 +- test/filtered_graph_cc.cpp | 15 +- test/graph_concepts.cpp | 11 +- test/grid_graph_cc.cpp | 17 +- test/leda_graph_cc.cpp | 32 +- test/read_propmap.cpp | 5 +- test/reverse_graph_cc.cpp | 17 +- test/stanford_graph_cc.cpp | 35 ++- test/test_construction.hpp | 1 + test/test_destruction.hpp | 3 +- test/test_direction.hpp | 1 + test/test_graph.hpp | 1 + test/test_iteration.hpp | 1 + test/test_properties.hpp | 2 + test/vector_graph_cc.cpp | 7 +- 73 files changed, 756 insertions(+), 564 deletions(-) diff --git a/doc/AStarHeuristic.html b/doc/AStarHeuristic.html index 5d0c1aeb..62257be8 100644 --- a/doc/AStarHeuristic.html +++ b/doc/AStarHeuristic.html @@ -116,7 +116,7 @@ Called for the target of every out edge of a vertex being examined. struct AStarHeuristicConcept { void constraints() { - function_requires< CopyConstructibleConcept<Heuristic> >(); + BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept<Heuristic> )); h(u); } Heuristic h; diff --git a/doc/AdjacencyGraph.html b/doc/AdjacencyGraph.html index 0764b29b..b72031b1 100644 --- a/doc/AdjacencyGraph.html +++ b/doc/AdjacencyGraph.html @@ -112,8 +112,8 @@ The adjacent_vertices() function must return in constant time. typedef typename boost::graph_traits<G>::adjacency_iterator adjacency_iterator; void constraints() { - function_requires< IncidenceGraphConcept<G> >(); - function_requires< MultiPassInputIteratorConcept<adjacency_iterator> >(); + BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( MultiPassInputIteratorConcept<adjacency_iterator> )); p = adjacent_vertices(v, g); v = *p.first; diff --git a/doc/BidirectionalGraph.html b/doc/BidirectionalGraph.html index f67a92a4..e5a92215 100644 --- a/doc/BidirectionalGraph.html +++ b/doc/BidirectionalGraph.html @@ -145,8 +145,8 @@ undirected graphs). typedef typename boost::graph_traits<G>::in_edge_iterator in_edge_iterator; void constraints() { - function_requires< IncidenceGraphConcept<G> >(); - function_requires< MultiPassInputIteratorConcept<in_edge_iterator> >(); + BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( MultiPassInputIteratorConcept<in_edge_iterator> )); p = in_edges(v, g); e = *p.first; diff --git a/doc/EdgeListGraph.html b/doc/EdgeListGraph.html index cb87cdb0..fc62539c 100644 --- a/doc/EdgeListGraph.html +++ b/doc/EdgeListGraph.html @@ -146,8 +146,8 @@ must all return in constant time. typedef typename boost::graph_traits<G>::edge_iterator edge_iterator; void constraints() { - function_requires< GraphConcept<G> >(); - function_requires< MultiPassInputIteratorConcept<edge_iterator> >(); + BOOST_CONCEPT_ASSERT(( GraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( MultiPassInputIteratorConcept<edge_iterator> )); p = edges(g); E = num_edges(g); diff --git a/doc/Graph.html b/doc/Graph.html index 08423b10..fabae1a4 100644 --- a/doc/Graph.html +++ b/doc/Graph.html @@ -121,12 +121,12 @@ any vertex of graph object which type is G. typedef typename boost::graph_traits<G>::traversal_category traversal_category; void constraints() { - function_requires< DefaultConstructibleConcept<vertex_descriptor> >(); - function_requires< EqualityComparableConcept<vertex_descriptor> >(); - function_requires< AssignableConcept<vertex_descriptor> >(); - function_requires< DefaultConstructibleConcept<edge_descriptor> >(); - function_requires< EqualityComparableConcept<edge_descriptor> >(); - function_requires< AssignableConcept<edge_descriptor> >(); + BOOST_CONCEPT_ASSERT(( DefaultConstructibleConcept<vertex_descriptor> )); + BOOST_CONCEPT_ASSERT(( EqualityComparableConcept<vertex_descriptor> )); + BOOST_CONCEPT_ASSERT(( AssignableConcept<vertex_descriptor> )); + BOOST_CONCEPT_ASSERT(( DefaultConstructibleConcept<edge_descriptor> )); + BOOST_CONCEPT_ASSERT(( EqualityComparableConcept<edge_descriptor> )); + BOOST_CONCEPT_ASSERT(( AssignableConcept<edge_descriptor> )); } G g; }; diff --git a/doc/IncidenceGraph.html b/doc/IncidenceGraph.html index 29db1946..228cbfc8 100644 --- a/doc/IncidenceGraph.html +++ b/doc/IncidenceGraph.html @@ -162,8 +162,8 @@ Therefore, the extra requirement is added that the out-edge connecting { typedef typename boost::graph_traits<G>::out_edge_iterator out_edge_iterator; void constraints() { - function_requires< GraphConcept<G> >(); - function_requires< MultiPassInputIteratorConcept<out_edge_iterator> >(); + BOOST_CONCEPT_ASSERT(( GraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( MultiPassInputIteratorConcept<out_edge_iterator> )); p = out_edges(u, g); e = *p.first; diff --git a/doc/KeyedUpdatableQueue.html b/doc/KeyedUpdatableQueue.html index 6d5ecaf0..81141a72 100644 --- a/doc/KeyedUpdatableQueue.html +++ b/doc/KeyedUpdatableQueue.html @@ -63,8 +63,8 @@ in addition to the members that are required of types that model diff --git a/doc/VertexListGraph.html b/doc/VertexListGraph.html index ee546fea..b108353a 100644 --- a/doc/VertexListGraph.html +++ b/doc/VertexListGraph.html @@ -121,9 +121,9 @@ groups these requirements together, hence the VertexListGraph concept. typedef typename boost::graph_traits<G>::vertex_iterator vertex_iterator; void constraints() { - function_requires< IncidenceGraphConcept<G> >(); - function_requires< AdjacencyGraphConcept<G> >(); - function_requires< MultiPassInputIteratorConcept<vertex_iterator> >(); + BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept<G> )); + BOOST_CONCEPT_ASSERT(( MultiPassInputIteratorConcept<vertex_iterator> )); p = vertices(g); V = num_vertices(g); diff --git a/doc/biconnected_components.w b/doc/biconnected_components.w index 97ba5dc8..d2eb21ff 100644 --- a/doc/biconnected_components.w +++ b/doc/biconnected_components.w @@ -156,11 +156,11 @@ template. @d Concept checking of type parameters @{ -function_requires< VertexListGraphConcept >(); -function_requires< IncidenceGraphConcept >(); -function_requires< WritablePropertyMapConcept >(); -function_requires< ReadWritePropertyMapConcept >(); -function_requires< ReadWritePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept )); +BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept )); +BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); +BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); @} The first step of the algorithm is to initialize the discover times of @@ -286,6 +286,7 @@ S.pop(); #include #include #include +#include namespace boost { @ diff --git a/doc/constructing_algorithms.html b/doc/constructing_algorithms.html index cbea2963..cc4047b0 100644 --- a/doc/constructing_algorithms.html +++ b/doc/constructing_algorithms.html @@ -79,7 +79,7 @@ those types that model VertexListGraph. This is enforced by the use of those graph operations in the algorithm, and furthermore by our explicit requirement added as a concept check with -function_requires() (see Section BOOST_CONCEPT_ASSERT() (see Section Concept Checking for more details about concept checking). @@ -122,10 +122,10 @@ namespace boost { typedef typename property_traits<Color>::value_type ColorType; typedef typename property_traits<Order>::value_type OrderType; - function_requires< VertexListGraphConcept<VertexListGraph> >(); - function_requires< ReadWritePropertyMapConcept<Color, vertex_descriptor> >(); - function_requires< IntegerConcept<ColorType> >(); - function_requires< ReadablePropertyMapConcept<Order, size_type> >(); + BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<VertexListGraph> )); + BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<Color, vertex_descriptor> )); + BOOST_CONCEPT_ASSERT(( IntegerConcept<ColorType> )); + BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<Order, size_type> )); BOOST_STATIC_ASSERT((is_same<OrderType, vertex_descriptor>::value)); size_type max_color = 0; diff --git a/doc/isomorphism-impl-v2.w b/doc/isomorphism-impl-v2.w index 75f88b2b..602db7ee 100644 --- a/doc/isomorphism-impl-v2.w +++ b/doc/isomorphism-impl-v2.w @@ -388,31 +388,31 @@ unsigned integers. @d Concept checking @{ // Graph requirements -function_requires< VertexListGraphConcept >(); -function_requires< EdgeListGraphConcept >(); -function_requires< VertexListGraphConcept >(); -function_requires< BidirectionalGraphConcept >(); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept )); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept )); typedef typename graph_traits::vertex_descriptor vertex1_t; typedef typename graph_traits::vertex_descriptor vertex2_t; typedef typename graph_traits::vertices_size_type size_type; // Vertex invariant requirement -function_requires< AdaptableUnaryFunctionConcept >(); -function_requires< AdaptableUnaryFunctionConcept >(); +BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept )); +BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept )); // Property map requirements -function_requires< ReadWritePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); typedef typename property_traits::value_type IsoMappingValue; BOOST_STATIC_ASSERT((is_same::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap1Value; BOOST_STATIC_ASSERT((is_convertible::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap2Value; BOOST_STATIC_ASSERT((is_convertible::value)); @} diff --git a/doc/isomorphism-impl-v3.w b/doc/isomorphism-impl-v3.w index 4ce87517..6e35e8e7 100644 --- a/doc/isomorphism-impl-v3.w +++ b/doc/isomorphism-impl-v3.w @@ -507,31 +507,31 @@ unsigned integers. @d Concept checking @{ // Graph requirements -function_requires< VertexListGraphConcept >(); -function_requires< EdgeListGraphConcept >(); -function_requires< VertexListGraphConcept >(); -function_requires< BidirectionalGraphConcept >(); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept )); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept )); typedef typename graph_traits::vertex_descriptor vertex1_t; typedef typename graph_traits::vertex_descriptor vertex2_t; typedef typename graph_traits::vertices_size_type size_type; // Vertex invariant requirement -function_requires< AdaptableUnaryFunctionConcept >(); -function_requires< AdaptableUnaryFunctionConcept >(); +BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept )); +BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept )); // Property map requirements -function_requires< ReadWritePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); typedef typename property_traits::value_type IsoMappingValue; BOOST_STATIC_ASSERT((is_same::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap1Value; BOOST_STATIC_ASSERT((is_convertible::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap2Value; BOOST_STATIC_ASSERT((is_convertible::value)); @} diff --git a/doc/isomorphism-impl.w b/doc/isomorphism-impl.w index 58b4bed8..ffff817e 100644 --- a/doc/isomorphism-impl.w +++ b/doc/isomorphism-impl.w @@ -301,21 +301,21 @@ unsigned integers. @d Concept checking @{ // Graph requirements -function_requires< VertexListGraphConcept >(); -function_requires< EdgeListGraphConcept >(); -function_requires< VertexListGraphConcept >(); -function_requires< BidirectionalGraphConcept >(); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept )); +BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); +BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept )); // Property map requirements -function_requires< ReadWritePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); typedef typename property_traits::value_type IndexMappingValue; BOOST_STATIC_ASSERT((is_same::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap1Value; BOOST_STATIC_ASSERT((is_convertible::value)); -function_requires< ReadablePropertyMapConcept >(); +BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); typedef typename property_traits::value_type IndexMap2Value; BOOST_STATIC_ASSERT((is_convertible::value)); @} diff --git a/doc/leda_conversion.html b/doc/leda_conversion.html index a8ba39f3..6c24c6ab 100644 --- a/doc/leda_conversion.html +++ b/doc/leda_conversion.html @@ -236,9 +236,9 @@ href="../test/graph.cpp">test/graph.cpp. main(int,char*[]) { typedef GRAPH<int,int> Graph; - function_requires< VertexListGraphConcept<Graph> >(); - function_requires< BidirectionalGraphConcept<Graph> >(); - function_requires< MutableGraphConcept<Graph> >(); + BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> )); + BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept<Graph> )); + BOOST_CONCEPT_ASSERT(( MutableGraphConcept<Graph> )); return 0; } diff --git a/doc/reverse_graph.html b/doc/reverse_graph.html index 96d03537..bb4a10f1 100644 --- a/doc/reverse_graph.html +++ b/doc/reverse_graph.html @@ -27,7 +27,7 @@ The reverse_graph adaptor flips the in-edges and out-edges of a BidirectionalGraph, effectively transposing the graph. The construction of the reverse_graph is constant time, providing a highly efficient -way to obtain a transposed-view of a graph. +way to obtain a transposed view of a graph.

Example

@@ -215,6 +215,16 @@ and must match one of the properties specified in the
+property_map<reverse_graph, edge_underlying_t>::type
+and
+property_map<reverse_graph, edge_underlying_t>::const_type +

+An edge property type mapping from edge descriptors in the reverse_graph to +edge descriptors in the underlying BidirectionalGraph object. + +
+ +

Member Functions


@@ -358,6 +368,16 @@ argument.
+
+property_map<reverse_graph, edge_underlying_t>::const_type
+get(PropertyTag, const reverse_graph& g)
+
+Returns a property map object that converts from edge descriptors in the +reverse_graph to edge descriptors in the underlying +BidirectionalGraph object. + +
+
 template <class PropertyTag, class X>
 typename property_traits<property_map<reverse_graph, PropertyTag>::const_type>::value_type
@@ -367,6 +387,13 @@ This returns the property value for x, which is either
 a vertex or edge descriptor.
 
+
+typename graph_traits<BidirectionalGraph>::edge_descriptor
+get(edge_underlying_t, const reverse_graph& g, edge_descriptor e)
+
+This returns the underlying edge descriptor for the edge e in the reverse_graph. +
+
 template <class PropertyTag, class X, class Value>
 void
diff --git a/doc/transitive_closure.w b/doc/transitive_closure.w
index c8db56dc..136eab68 100644
--- a/doc/transitive_closure.w
+++ b/doc/transitive_closure.w
@@ -160,11 +160,11 @@ algorithm.
 
 @d Concept checking
 @{
-function_requires< VertexListGraphConcept >();
-function_requires< AdjacencyGraphConcept >();
-function_requires< VertexMutableGraphConcept >();
-function_requires< EdgeMutableGraphConcept >();
-function_requires< ReadablePropertyMapConcept >();
+BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+BOOST_CONCEPT_ASSERT(( VertexMutableGraphConcept ));
+BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept ));
+BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
 @}
 
 \noindent To simplify the code in the rest of the function we make the
@@ -566,8 +566,8 @@ void warshall_transitive_closure(G& g)
   typedef typename graph_traits::vertex_descriptor vertex;
   typedef typename graph_traits::vertex_iterator vertex_iterator;
 
-  function_requires< AdjacencyMatrixConcept >();
-  function_requires< EdgeMutableGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
+  BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept ));
 
   // Matrix form:
   // for k
@@ -597,8 +597,8 @@ void warren_transitive_closure(G& g)
   typedef typename graph_traits::vertex_descriptor vertex;
   typedef typename graph_traits::vertex_iterator vertex_iterator;
 
-  function_requires< AdjacencyMatrixConcept >();
-  function_requires< EdgeMutableGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
+  BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept ));
 
   // Make sure second loop will work  
   if (num_vertices(g) == 0)
@@ -671,6 +671,7 @@ indent -nut -npcs -i2 -br -cdw -ce transitive_closure.hpp
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
diff --git a/example/implicit_graph.cpp b/example/implicit_graph.cpp
index 7b0c0fc2..b93bc8b7 100644
--- a/example/implicit_graph.cpp
+++ b/example/implicit_graph.cpp
@@ -4,7 +4,7 @@
 //    (See accompanying file LICENSE_1_0.txt or copy at
 //          http://www.boost.org/LICENSE_1_0.txt)
 
-
+#include 
 #include 
 #include 
 #include 
@@ -444,15 +444,15 @@ int main (int argc, char const *argv[]) {
   // Check the concepts that graph models.  This is included to demonstrate
   // how concept checking works, but is not required for a working program
   // since Boost algorithms do their own concept checking.
-  function_requires< BidirectionalGraphConcept >();
-  function_requires< AdjacencyGraphConcept >();
-  function_requires< VertexListGraphConcept >();
-  function_requires< EdgeListGraphConcept >();
-  function_requires< AdjacencyMatrixConcept >();
-  function_requires<
-    ReadablePropertyMapConcept >();
-  function_requires<
-    ReadablePropertyGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+  BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+  BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+  BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+  BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
+  BOOST_CONCEPT_ASSERT((
+    ReadablePropertyMapConcept ));
+  BOOST_CONCEPT_ASSERT((
+    ReadablePropertyGraphConcept ));
 
   // Specify the size of the graph on the command line, or use a default size
   // of 5.
diff --git a/example/leda-concept-check.cpp b/example/leda-concept-check.cpp
index 21fc1606..f5720e7d 100644
--- a/example/leda-concept-check.cpp
+++ b/example/leda-concept-check.cpp
@@ -7,15 +7,16 @@
 //=======================================================================
 #include 
 #include 
+#include 
 
 int
 main()
 {
   using namespace boost;
-  typedef leda::GRAPH < int, int >Graph;
-  function_requires < VertexListGraphConcept < Graph > >();
-  function_requires < BidirectionalGraphConcept < Graph > >();
-  function_requires < VertexMutableGraphConcept < Graph > >();
-  function_requires < EdgeMutableGraphConcept < Graph > >();
+  typedef leda::GRAPH Graph;
+  BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+  BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept< Graph> ));
+  BOOST_CONCEPT_ASSERT(( VertexMutableGraphConcept< Graph> ));
+  BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept ));
   return EXIT_SUCCESS;
 }
diff --git a/example/loops_dfs.cpp b/example/loops_dfs.cpp
index c6babb1e..9536701b 100644
--- a/example/loops_dfs.cpp
+++ b/example/loops_dfs.cpp
@@ -6,6 +6,7 @@
 // http://www.boost.org/LICENSE_1_0.txt)
 //=======================================================================
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -47,7 +48,7 @@ find_loops(typename graph_traits < Graph >::vertex_descriptor entry,
            const Graph & g, 
            Loops & loops)    // A container of sets of vertices
 {
-  function_requires < BidirectionalGraphConcept < Graph > >();
+  BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
   typedef typename graph_traits < Graph >::edge_descriptor Edge;
   typedef typename graph_traits < Graph >::vertex_descriptor Vertex;
   std::vector < Edge > back_edges;
@@ -69,7 +70,7 @@ compute_loop_extent(typename graph_traits <
                     Graph >::edge_descriptor back_edge, const Graph & g,
                     Set & loop_set)
 {
-  function_requires < BidirectionalGraphConcept < Graph > >();
+  BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
   typedef typename graph_traits < Graph >::vertex_descriptor Vertex;
   typedef color_traits < default_color_type > Color;
 
diff --git a/example/put-get-helper-eg.cpp b/example/put-get-helper-eg.cpp
index 1134c029..9c14e1b9 100644
--- a/example/put-get-helper-eg.cpp
+++ b/example/put-get-helper-eg.cpp
@@ -8,6 +8,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef BOOST_NO_STD_ITERATOR_TRAITS
 #error This examples requires a compiler that provides a working std::iterator_traits
@@ -53,6 +54,6 @@ main()
   typedef foo::iterator_property_map < vec_t::iterator,
     boost::identity_property_map > pmap_t;
   using namespace boost;
-  function_requires < Mutable_LvaluePropertyMapConcept < pmap_t, int > >();
+  BOOST_CONCEPT_ASSERT(( Mutable_LvaluePropertyMapConcept ));
   return 0;
 }
diff --git a/include/boost/graph/astar_search.hpp b/include/boost/graph/astar_search.hpp
index 042ffec4..316e7063 100644
--- a/include/boost/graph/astar_search.hpp
+++ b/include/boost/graph/astar_search.hpp
@@ -25,7 +25,7 @@
 #include 
 #include 
 #include 
-
+#include 
 
 namespace boost {
 
@@ -34,7 +34,7 @@ namespace boost {
   struct AStarHeuristicConcept {
     void constraints()
     {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       h(u);
     }
     Heuristic h;
@@ -58,7 +58,7 @@ namespace boost {
   struct AStarVisitorConcept {
     void constraints()
     {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.initialize_vertex(u, g);
       vis.discover_vertex(u, g);
       vis.examine_vertex(u, g);
diff --git a/include/boost/graph/bellman_ford_shortest_paths.hpp b/include/boost/graph/bellman_ford_shortest_paths.hpp
index 8fc02529..c80ebe7c 100644
--- a/include/boost/graph/bellman_ford_shortest_paths.hpp
+++ b/include/boost/graph/bellman_ford_shortest_paths.hpp
@@ -29,13 +29,14 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
   template 
   struct BellmanFordVisitorConcept {
     void constraints() {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.examine_edge(e, g);
       vis.edge_relaxed(e, g);
       vis.edge_not_relaxed(e, g);
@@ -95,12 +96,12 @@ namespace boost {
                          BinaryPredicate compare,
                          BellmanFordVisitor v)
   {
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
     typedef graph_traits GTraits;
     typedef typename GTraits::edge_descriptor Edge;
     typedef typename GTraits::vertex_descriptor Vertex;
-    function_requires >();
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type D_value;
     typedef typename property_traits::value_type W_value;
 
@@ -229,7 +230,7 @@ namespace boost {
     (VertexAndEdgeListGraph& g, 
      const bgl_named_params& params)
   {               
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     return detail::bellman_dispatch
       (g, num_vertices(g),
        choose_const_pmap(get_param(params, edge_weight), g, edge_weight),
diff --git a/include/boost/graph/biconnected_components.hpp b/include/boost/graph/biconnected_components.hpp
index 03459636..418da06f 100644
--- a/include/boost/graph/biconnected_components.hpp
+++ b/include/boost/graph/biconnected_components.hpp
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -160,14 +161,14 @@ namespace boost
   {
     typedef typename graph_traits::vertex_descriptor vertex_t;
     typedef typename graph_traits::edge_descriptor edge_t;
-    function_requires >();
-    function_requires >();
-    function_requires >();
-    function_requires >();
-    function_requires >();
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
 
     std::size_t num_components = 0;
     std::size_t dfs_time = 0;
diff --git a/include/boost/graph/boykov_kolmogorov_max_flow.hpp b/include/boost/graph/boykov_kolmogorov_max_flow.hpp
index 89bcfff2..0834c631 100644
--- a/include/boost/graph/boykov_kolmogorov_max_flow.hpp
+++ b/include/boost/graph/boykov_kolmogorov_max_flow.hpp
@@ -47,6 +47,7 @@
 #include 
 #include 
 #include 
+#include 
 
 // The algorithm impelemented here is described in:
 //
@@ -743,16 +744,16 @@ boykov_kolmogorov_max_flow(Graph& g,
   typedef typename graph_traits::edge_descriptor edge_descriptor;
 
   //as this method is the last one before we instantiate the solver, we do the concept checks here
-  function_requires >(); //to have vertices(), num_vertices(),
-  function_requires >(); //to have edges()
-  function_requires >(); //to have source(), target() and out_edges()
-  function_requires >(); //read flow-values from edges
-  function_requires >(); //write flow-values to residuals
-  function_requires >(); //read out reverse edges
-  function_requires >(); //store predecessor there
-  function_requires >(); //write corresponding tree
-  function_requires >(); //write distance to source/sink
-  function_requires >(); //get index 0...|V|-1
+  BOOST_CONCEPT_ASSERT(( VertexListGraphConcept )); //to have vertices(), num_vertices(),
+  BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept )); //to have edges()
+  BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept )); //to have source(), target() and out_edges()
+  BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); //read flow-values from edges
+  BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); //write flow-values to residuals
+  BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); //read out reverse edges
+  BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); //store predecessor there
+  BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); //write corresponding tree
+  BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept )); //write distance to source/sink
+  BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept )); //get index 0...|V|-1
   BOOST_ASSERT(num_vertices(g) >= 2 && src != sink);
 
   detail::bk_max_flow<
diff --git a/include/boost/graph/breadth_first_search.hpp b/include/boost/graph/breadth_first_search.hpp
index 79fde8cd..f65e4757 100644
--- a/include/boost/graph/breadth_first_search.hpp
+++ b/include/boost/graph/breadth_first_search.hpp
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef BOOST_GRAPH_USE_MPI
 #include 
@@ -34,7 +35,7 @@ namespace boost {
   template 
   struct BFSVisitorConcept {
     void constraints() {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.initialize_vertex(u, g);
       vis.discover_vertex(u, g);
       vis.examine_vertex(u, g);
@@ -59,12 +60,12 @@ namespace boost {
      typename graph_traits::vertex_descriptor s,
      Buffer& Q, BFSVisitor vis, ColorMap color)
   {
-    function_requires< IncidenceGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
     typedef graph_traits GTraits;
     typedef typename GTraits::vertex_descriptor Vertex;
     typedef typename GTraits::edge_descriptor Edge;
-    function_requires< BFSVisitorConcept >();
-    function_requires< ReadWritePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( BFSVisitorConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
     typedef typename property_traits::value_type ColorValue;
     typedef color_traits Color;
     typename GTraits::out_edge_iterator ei, ei_end;
diff --git a/include/boost/graph/bron_kerbosch_all_cliques.hpp b/include/boost/graph/bron_kerbosch_all_cliques.hpp
index 35479316..1466dfe5 100644
--- a/include/boost/graph/bron_kerbosch_all_cliques.hpp
+++ b/include/boost/graph/bron_kerbosch_all_cliques.hpp
@@ -11,6 +11,8 @@
 #include 
 #include 
 
+#include 
+
 #include 
 #include 
 
@@ -151,7 +153,7 @@ namespace detail
                                 const Container& in,
                                 Container& out)
     {
-        function_requires< GraphConcept >();
+        BOOST_CONCEPT_ASSERT(( GraphConcept ));
 
         typename graph_traits::directed_category cat;
         typename Container::const_iterator i, end = in.end();
@@ -174,8 +176,8 @@ namespace detail
                         Visitor vis,
                         std::size_t min)
     {
-        function_requires< GraphConcept >();
-        function_requires< CliqueVisitorConcept >();
+        BOOST_CONCEPT_ASSERT(( GraphConcept ));
+        BOOST_CONCEPT_ASSERT(( CliqueVisitorConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
 
         // Is there vertex in nots that is connected to all vertices
@@ -266,15 +268,15 @@ template 
 inline void
 bron_kerbosch_all_cliques(const Graph& g, Visitor vis, std::size_t min)
 {
-    function_requires< IncidenceGraphConcept >();
-    function_requires< VertexListGraphConcept >();
-    function_requires< VertexIndexGraphConcept >();
-    function_requires< AdjacencyMatrixConcept >(); // Structural requirement only
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexIndexGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept )); // Structural requirement only
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
     typedef std::vector VertexSet;
     typedef std::deque Clique;
-    function_requires< CliqueVisitorConcept >();
+    BOOST_CONCEPT_ASSERT(( CliqueVisitorConcept ));
 
     // NOTE: We're using a deque to implement the clique, because it provides
     // constant inserts and removals at the end and also a constant size.
diff --git a/include/boost/graph/closeness_centrality.hpp b/include/boost/graph/closeness_centrality.hpp
index d0dcabe1..44d478ab 100644
--- a/include/boost/graph/closeness_centrality.hpp
+++ b/include/boost/graph/closeness_centrality.hpp
@@ -9,6 +9,7 @@
 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -25,9 +26,9 @@ struct closeness_measure
 
     result_type operator ()(distance_type d, const Graph&)
     {
-        function_requires< NumericValueConcept >();
-        function_requires< NumericValueConcept >();
-        function_requires< AdaptableUnaryFunctionConcept >();
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
+        BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept ));
         return (d == base_type::infinite_distance())
             ? base_type::zero_result()
             : rec(result_type(d));
@@ -75,12 +76,12 @@ closeness_centrality(const Graph& g,
                      Measure measure,
                      Combinator combine)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
-    function_requires< NumericValueConcept >();
-    function_requires< DistanceMeasureConcept >();
+    BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
+    BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept ));
 
     Distance n = detail::combine_distances(g, dist, combine, Distance(0));
     return measure(n, g);
@@ -90,9 +91,9 @@ template 
 inline typename Measure::result_type
 closeness_centrality(const Graph& g, DistanceMap dist, Measure measure)
 {
-    function_requires< GraphConcept >();
+    BOOST_CONCEPT_ASSERT(( GraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
 
     return closeness_centrality(g, dist, measure, std::plus());
@@ -116,12 +117,12 @@ all_closeness_centralities(const Graph& g,
                            CentralityMap cent,
                            Measure measure)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type DistanceMap;
-    function_requires< ReadablePropertyMapConcept >();
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
     typedef typename property_traits::value_type Centrality;
 
@@ -141,11 +142,11 @@ all_closeness_centralities(const Graph& g,
                             DistanceMatrixMap dist,
                             CentralityMap cent)
 {
-    function_requires< GraphConcept >();
+    BOOST_CONCEPT_ASSERT(( GraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type DistanceMap;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
     typedef typename property_traits::value_type Result;
 
diff --git a/include/boost/graph/clustering_coefficient.hpp b/include/boost/graph/clustering_coefficient.hpp
index d897d94b..dad4695a 100644
--- a/include/boost/graph/clustering_coefficient.hpp
+++ b/include/boost/graph/clustering_coefficient.hpp
@@ -11,6 +11,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -20,7 +21,7 @@ namespace detail
     inline typename graph_traits::degree_size_type
     possible_edges(const Graph& g, std::size_t k, directed_tag)
     {
-        function_requires< GraphConcept >();
+        BOOST_CONCEPT_ASSERT(( GraphConcept ));
         typedef typename graph_traits::degree_size_type T;
         return T(k) * (T(k) - 1);
     }
@@ -42,7 +43,7 @@ namespace detail
                 directed_tag)
 
     {
-        function_requires< AdjacencyMatrixConcept >();
+        BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
         return (lookup_edge(u, v, g).second ? 1 : 0) +
                 (lookup_edge(v, u, g).second ? 1 : 0);
     }
@@ -55,7 +56,7 @@ namespace detail
                 typename graph_traits::vertex_descriptor v,
                 undirected_tag)
     {
-        function_requires< AdjacencyMatrixConcept >();
+        BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
         return lookup_edge(u, v, g).second ? 1 : 0;
     }
 }
@@ -64,7 +65,7 @@ template 
 inline typename graph_traits::degree_size_type
 num_paths_through_vertex(const Graph& g, Vertex v)
 {
-    function_requires< AdjacencyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
     typedef typename graph_traits::directed_category Directed;
     typedef typename graph_traits::adjacency_iterator AdjacencyIterator;
 
@@ -81,8 +82,8 @@ template 
 inline typename graph_traits::degree_size_type
 num_triangles_on_vertex(const Graph& g, Vertex v)
 {
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
     typedef typename graph_traits::degree_size_type Degree;
     typedef typename graph_traits::directed_category Directed;
     typedef typename graph_traits::adjacency_iterator AdjacencyIterator;
@@ -119,10 +120,10 @@ template 
 inline typename property_traits::value_type
 all_clustering_coefficients(const Graph& g, ClusteringMap cm)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename property_traits::value_type Coefficient;
 
     Coefficient sum(0);
@@ -139,10 +140,10 @@ template 
 inline typename property_traits::value_type
 mean_clustering_coefficient(const Graph& g, ClusteringMap cm)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Coefficient;
 
     Coefficient cc(0);
diff --git a/include/boost/graph/connected_components.hpp b/include/boost/graph/connected_components.hpp
index 90015e67..076b2a68 100644
--- a/include/boost/graph/connected_components.hpp
+++ b/include/boost/graph/connected_components.hpp
@@ -17,6 +17,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
@@ -64,7 +65,7 @@ namespace boost {
     if (num_vertices(g) == 0) return 0;
 
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename boost::graph_traits::directed_category directed;
     BOOST_STATIC_ASSERT((boost::is_same::value));
 
@@ -84,7 +85,7 @@ namespace boost {
     if (num_vertices(g) == 0) return 0;
 
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename boost::graph_traits::directed_category directed;
     // BOOST_STATIC_ASSERT((boost::is_same::value));
 
diff --git a/include/boost/graph/copy.hpp b/include/boost/graph/copy.hpp
index 8ef01238..576f9259 100644
--- a/include/boost/graph/copy.hpp
+++ b/include/boost/graph/copy.hpp
@@ -44,6 +44,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -53,6 +54,21 @@ namespace boost {
 
   namespace detail {
 
+    // Hack to make transpose_graph work with the same interface as before
+    template 
+    struct remove_reverse_edge_descriptor {
+      typedef Desc type;
+      static Desc convert(const Desc& d, const Graph&) {return d;}
+    };
+
+    template 
+    struct remove_reverse_edge_descriptor > {
+      typedef Desc type;
+      static Desc convert(const reverse_graph_edge_descriptor& d, const Graph& g) {
+        return get(edge_underlying, g, d);
+      }
+    };
+
     // Default edge and vertex property copiers
 
     template 
@@ -112,6 +128,7 @@ namespace boost {
                         CopyVertex copy_vertex, CopyEdge copy_edge,
                         Orig2CopyVertexIndexMap orig2copy, IndexMap)
       {
+        typedef remove_reverse_edge_descriptor::edge_descriptor> cvt;
         typename graph_traits::vertex_iterator vi, vi_end;
         for (boost::tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
           typename graph_traits::vertex_descriptor
@@ -126,7 +143,7 @@ namespace boost {
           boost::tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei, g_in)), 
                                                  get(orig2copy, target(*ei, g_in)),
                                                  g_out);
-          copy_edge(*ei, new_e);
+          copy_edge(cvt::convert(*ei, g_in), new_e);
         }
       }
     };
@@ -141,6 +158,7 @@ namespace boost {
                         CopyVertex copy_vertex, CopyEdge copy_edge,
                         Orig2CopyVertexIndexMap orig2copy, IndexMap)
       {
+        typedef remove_reverse_edge_descriptor::edge_descriptor> cvt;
         typename graph_traits::vertex_iterator vi, vi_end;
         for (boost::tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
           typename graph_traits::vertex_descriptor
@@ -156,7 +174,7 @@ namespace boost {
             boost::tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei, g_in)), 
                                                    get(orig2copy, target(*ei, g_in)),
                                                    g_out);
-            copy_edge(*ei, new_e);
+            copy_edge(cvt::convert(*ei, g_in), new_e);
           }
         }
       }
@@ -173,6 +191,7 @@ namespace boost {
                         Orig2CopyVertexIndexMap orig2copy,
                         IndexMap index_map)
       {
+        typedef remove_reverse_edge_descriptor::edge_descriptor> cvt;
         typedef color_traits Color;
         std::vector 
           color(num_vertices(g_in), Color::white());
@@ -192,7 +211,7 @@ namespace boost {
               boost::tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei,g_in)),
                                                      get(orig2copy, target(*ei,g_in)),
                                                      g_out);
-              copy_edge(*ei, new_e);
+              copy_edge(cvt::convert(*ei, g_in), new_e);
             }
           }
           color[get(index_map, *vi)] = Color::black();
diff --git a/include/boost/graph/core_numbers.hpp b/include/boost/graph/core_numbers.hpp
index 7ef08261..3db59c72 100644
--- a/include/boost/graph/core_numbers.hpp
+++ b/include/boost/graph/core_numbers.hpp
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  * core_numbers
@@ -46,7 +47,7 @@ namespace boost {
     struct CoreNumbersVisitorConcept {
         void constraints()
         {
-            function_requires< CopyConstructibleConcept >();
+            BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
             vis.examine_vertex(u,g);
             vis.finish_vertex(u,g);
             vis.examine_edge(e,g);
diff --git a/include/boost/graph/degree_centrality.hpp b/include/boost/graph/degree_centrality.hpp
index e3d7346c..f6cc7a22 100644
--- a/include/boost/graph/degree_centrality.hpp
+++ b/include/boost/graph/degree_centrality.hpp
@@ -8,6 +8,7 @@
 #define BOOST_GRAPH_DEGREE_CENTRALITY_HPP
 
 #include 
+#include 
 
 namespace boost {
 
@@ -28,7 +29,7 @@ struct influence_measure
 
     inline degree_type operator ()(vertex_type v, const Graph& g)
     {
-        function_requires< IncidenceGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
         return out_degree(v, g);
     }
 };
@@ -49,7 +50,7 @@ struct prestige_measure
 
     inline degree_type operator ()(vertex_type v, const Graph& g)
     {
-        function_requires< BidirectionalGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
         return in_degree(v, g);
     }
 };
@@ -64,7 +65,7 @@ template 
 inline typename Measure::degree_type
 degree_centrality(const Graph& g, Vertex v, Measure measure)
 {
-    function_requires< DegreeMeasureConcept >();
+    BOOST_CONCEPT_ASSERT(( DegreeMeasureConcept ));
     return measure(v, g);
 }
 
@@ -94,10 +95,10 @@ template 
 inline void
 all_degree_centralities(const Graph& g, CentralityMap cent, Measure measure)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename property_traits::value_type Centrality;
 
     VertexIterator i, end;
diff --git a/include/boost/graph/depth_first_search.hpp b/include/boost/graph/depth_first_search.hpp
index 74fe2c02..d38ad603 100644
--- a/include/boost/graph/depth_first_search.hpp
+++ b/include/boost/graph/depth_first_search.hpp
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -31,7 +32,7 @@ namespace boost {
   class DFSVisitorConcept {
   public:
     void constraints() {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.initialize_vertex(u, g);
       vis.start_vertex(u, g);
       vis.discover_vertex(u, g);
@@ -80,12 +81,12 @@ namespace boost {
        DFSVisitor& vis,
        ColorMap color, TerminatorFunc func = TerminatorFunc())
     {
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
       typedef typename graph_traits::vertex_descriptor Vertex;
-      function_requires< ReadWritePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type ColorValue;
-      function_requires< ColorValueConcept >();
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
       typedef color_traits Color;
       typedef typename graph_traits::out_edge_iterator Iter;
       typedef std::pair > VertexInfo;
@@ -151,12 +152,12 @@ namespace boost {
        DFSVisitor& vis,  // pass-by-reference here, important!
        ColorMap color, TerminatorFunc func)
     {
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
       typedef typename graph_traits::vertex_descriptor Vertex;
-      function_requires< ReadWritePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type ColorValue;
-      function_requires< ColorValueConcept >();
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
       typedef color_traits Color;
       typename graph_traits::out_edge_iterator ei, ei_end;
 
@@ -187,7 +188,7 @@ namespace boost {
                      typename graph_traits::vertex_descriptor start_vertex)
   {
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
     typedef typename property_traits::value_type ColorValue;
     typedef color_traits Color;
 
diff --git a/include/boost/graph/detail/geodesic.hpp b/include/boost/graph/detail/geodesic.hpp
index 57e2a208..adcb17f0 100644
--- a/include/boost/graph/detail/geodesic.hpp
+++ b/include/boost/graph/detail/geodesic.hpp
@@ -11,6 +11,7 @@
 #include 
 #include 
 #include 
+#include 
 
 // TODO: Should this really be in detail?
 
@@ -51,13 +52,13 @@ namespace detail {
                         Combinator combine,
                         Distance init)
     {
-        function_requires< VertexListGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
         typedef typename graph_traits::vertex_iterator VertexIterator;
-        function_requires< ReadablePropertyMapConcept >();
-        function_requires< NumericValueConcept >();
+        BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
         typedef numeric_values DistanceNumbers;
-        function_requires< AdaptableBinaryFunction >();
+        BOOST_CONCEPT_ASSERT(( AdaptableBinaryFunction ));
 
         // If there's ever an infinite distance, then we simply return
         // infinity. Note that this /will/ include the a non-zero
diff --git a/include/boost/graph/dijkstra_shortest_paths.hpp b/include/boost/graph/dijkstra_shortest_paths.hpp
index e0848e50..be0f97ea 100644
--- a/include/boost/graph/dijkstra_shortest_paths.hpp
+++ b/include/boost/graph/dijkstra_shortest_paths.hpp
@@ -30,6 +30,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef BOOST_GRAPH_DIJKSTRA_TESTING
 #  include 
@@ -68,7 +69,7 @@ namespace boost {
   template 
   struct DijkstraVisitorConcept {
     void constraints() {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.initialize_vertex(u, g);
       vis.discover_vertex(u, g);
       vis.examine_vertex(u, g);
diff --git a/include/boost/graph/dominator_tree.hpp b/include/boost/graph/dominator_tree.hpp
index db40cb73..9371eee0 100644
--- a/include/boost/graph/dominator_tree.hpp
+++ b/include/boost/graph/dominator_tree.hpp
@@ -13,6 +13,7 @@
 #include 
 #include 
 #include 
+#include 
 
 // Dominator tree computation
 
@@ -244,7 +245,7 @@ namespace boost {
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertices_size_type VerticesSizeType;
 
-    function_requires< BidirectionalGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
 
     const VerticesSizeType numOfVertices = num_vertices(g);
     if (numOfVertices == 0) return;
@@ -299,7 +300,7 @@ namespace boost {
     // Typedefs and concept check
     typedef typename graph_traits::vertices_size_type VerticesSizeType;
 
-    function_requires< BidirectionalGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
 
     // 1. Depth first visit
     const VerticesSizeType numOfVertices = num_vertices(g);
@@ -388,7 +389,7 @@ namespace boost {
       iterator_property_map >::iterator,
                             IndexMap> vertexSetMap;
 
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
 
     // 1. Finding dominator
     // 1.1. Initialize
diff --git a/include/boost/graph/eccentricity.hpp b/include/boost/graph/eccentricity.hpp
index 99f80a45..a8b3e485 100644
--- a/include/boost/graph/eccentricity.hpp
+++ b/include/boost/graph/eccentricity.hpp
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -19,9 +20,9 @@ template ::value_type
 eccentricity(const Graph& g, DistanceMap dist, Combinator combine)
 {
-    function_requires< GraphConcept >();
+    BOOST_CONCEPT_ASSERT(( GraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
 
     return detail::combine_distances(g, dist, combine, Distance(0));
@@ -31,9 +32,9 @@ template 
 inline typename property_traits::value_type
 eccentricity(const Graph& g, DistanceMap dist)
 {
-    function_requires< GraphConcept >();
+    BOOST_CONCEPT_ASSERT(( GraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Distance;
 
     return eccentricity(g, dist, detail::maximize());
@@ -44,12 +45,12 @@ inline std::pair::value_type,
                     typename property_traits::value_type>
 all_eccentricities(const Graph& g, const DistanceMatrix& dist, EccentricityMap ecc)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type DistanceMap;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename property_traits::value_type Eccentricity;
     BOOST_USING_STD_MIN();
     BOOST_USING_STD_MAX();
@@ -76,10 +77,10 @@ inline std::pair::value_type,
                     typename property_traits::value_type>
 radius_and_diameter(const Graph& g, EccentricityMap ecc)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type Eccentricity;
     BOOST_USING_STD_MIN();
     BOOST_USING_STD_MAX();
diff --git a/include/boost/graph/floyd_warshall_shortest.hpp b/include/boost/graph/floyd_warshall_shortest.hpp
index 3e95e1b0..472995f0 100644
--- a/include/boost/graph/floyd_warshall_shortest.hpp
+++ b/include/boost/graph/floyd_warshall_shortest.hpp
@@ -34,6 +34,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -84,7 +85,7 @@ namespace boost
     const BinaryFunction& combine, const Infinity& inf, 
     const Zero& zero)
   {
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
   
     return detail::floyd_warshall_dispatch(g, d, compare, combine, 
     inf, zero);
@@ -101,9 +102,9 @@ namespace boost
     const BinaryPredicate& compare, const BinaryFunction& combine, 
     const Infinity& inf, const Zero& zero)
   {
-    function_requires >();
-    function_requires >();
-    function_requires >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
   
     typename graph_traits::vertex_iterator 
       firstv, lastv, firstv2, lastv2;
diff --git a/include/boost/graph/geodesic_distance.hpp b/include/boost/graph/geodesic_distance.hpp
index 121ca4fb..d76d321e 100644
--- a/include/boost/graph/geodesic_distance.hpp
+++ b/include/boost/graph/geodesic_distance.hpp
@@ -9,6 +9,7 @@
 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -25,10 +26,10 @@ struct mean_geodesic_measure
 
     result_type operator ()(distance_type d, const Graph& g)
     {
-        function_requires< VertexListGraphConcept >();
-        function_requires< NumericValueConcept >();
-        function_requires< NumericValueConcept >();
-        function_requires< AdaptableBinaryFunctionConcept >();
+        BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
+        BOOST_CONCEPT_ASSERT(( AdaptableBinaryFunctionConcept ));
 
         return (d == base_type::infinite_distance())
             ? base_type::infinite_result()
@@ -69,8 +70,8 @@ struct mean_graph_distance_measure
 
     inline result_type operator ()(distance_type d, const Graph& g)
     {
-        function_requires< VertexListGraphConcept >();
-        function_requires< NumericValueConcept >();
+        BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+        BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
 
         if(d == base_type::infinite_distance()) {
             return base_type::infinite_result();
@@ -99,7 +100,7 @@ mean_geodesic(const Graph& g,
                 Measure measure,
                 Combinator combine)
 {
-    function_requires< DistanceMeasureConcept >();
+    BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept ));
     typedef typename Measure::distance_type Distance;
 
     Distance n = detail::combine_distances(g, dist, combine, Distance(0));
@@ -112,7 +113,7 @@ template  >();
+    BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept ));
     typedef typename Measure::distance_type Distance;
 
     return mean_geodesic(g, dist, measure, std::plus());
@@ -139,15 +140,15 @@ all_mean_geodesics(const Graph& g,
                     GeodesicMap geo,
                     Measure measure)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
     typedef typename graph_traits::vertex_iterator VertexIterator;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type DistanceMap;
-    function_requires< DistanceMeasureConcept >();
+    BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept ));
     typedef typename Measure::result_type Result;
-    function_requires< WritablePropertyMapConcept >();
-    function_requires< NumericValueConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT(( NumericValueConcept ));
 
     // NOTE: We could compute the mean geodesic here by performing additional
     // computations (i.e., adding and dividing). However, I don't really feel
@@ -178,11 +179,11 @@ template 
 inline typename property_traits::value_type
 all_mean_geodesics(const Graph& g, DistanceMatrixMap dist, GeodesicMap geo)
 {
-    function_requires< GraphConcept >();
+    BOOST_CONCEPT_ASSERT(( GraphConcept ));
     typedef typename graph_traits::vertex_descriptor Vertex;
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type DistanceMap;
-    function_requires< WritablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( WritablePropertyMapConcept ));
     typedef typename property_traits::value_type Result;
 
     return all_mean_geodesics(g, dist, geo, measure_mean_geodesic(g, DistanceMap()));
@@ -193,7 +194,7 @@ template 
 inline typename Measure::result_type
 small_world_distance(const Graph& g, GeodesicMap geo, Measure measure)
 {
-    function_requires< DistanceMeasureConcept >();
+    BOOST_CONCEPT_ASSERT(( DistanceMeasureConcept ));
     typedef typename Measure::result_type Result;
 
     Result sum = detail::combine_distances(g, geo, std::plus(), Result(0));
diff --git a/include/boost/graph/graph_concepts.hpp b/include/boost/graph/graph_concepts.hpp
index f382edf7..8cb7cbb2 100644
--- a/include/boost/graph/graph_concepts.hpp
+++ b/include/boost/graph/graph_concepts.hpp
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 namespace boost
@@ -529,8 +530,8 @@ typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&);
     {
         BOOST_CONCEPT_USAGE(NumericValue)
         {
-            function_requires< DefaultConstructible >();
-            function_requires< CopyConstructible >();
+            BOOST_CONCEPT_ASSERT(( DefaultConstructible ));
+            BOOST_CONCEPT_ASSERT(( CopyConstructible ));
             numeric_values::zero();
             numeric_values::infinity();
         }
diff --git a/include/boost/graph/howard_cycle_ratio.hpp b/include/boost/graph/howard_cycle_ratio.hpp
index 09c6522b..afbf26d8 100644
--- a/include/boost/graph/howard_cycle_ratio.hpp
+++ b/include/boost/graph/howard_cycle_ratio.hpp
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /** @file howard_cycle_ratio.hpp
  * @brief The implementation of the maximum/minimum cycle ratio/mean algorithm.
@@ -477,13 +478,13 @@ namespace boost {
     {
       typedef typename graph_traits::directed_category DirCat;
       BOOST_STATIC_ASSERT((is_convertible::value == true));
-      function_requires< IncidenceGraphConcept >();
-      function_requires< VertexListGraphConcept >();
+      BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
       typedef typename graph_traits::vertex_descriptor Vertex;
-      function_requires< ReadablePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
       typedef typename graph_traits::edge_descriptor Edge;
-      function_requires< ReadablePropertyMapConcept >();
-      function_requires< ReadablePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
 
       if(pcc == 0) {
           return detail::mcr_howard(
diff --git a/include/boost/graph/isomorphism.hpp b/include/boost/graph/isomorphism.hpp
index f5869026..cc28e001 100644
--- a/include/boost/graph/isomorphism.hpp
+++ b/include/boost/graph/isomorphism.hpp
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include  // for make_indirect_pmap
+#include 
 
 #ifndef BOOST_GRAPH_ITERATION_MACROS_HPP
 #define BOOST_ISO_INCLUDED_ITER_MACROS // local macro, see bottom of file
@@ -322,31 +323,31 @@ namespace boost {
 
   {
     // Graph requirements
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< VertexListGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
     
     typedef typename graph_traits::vertex_descriptor vertex1_t;
     typedef typename graph_traits::vertex_descriptor vertex2_t;
     typedef typename graph_traits::vertices_size_type size_type;
     
     // Vertex invariant requirement
-    function_requires< AdaptableUnaryFunctionConcept >();
-    function_requires< AdaptableUnaryFunctionConcept >();
+    BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept ));
+    BOOST_CONCEPT_ASSERT(( AdaptableUnaryFunctionConcept ));
     
     // Property map requirements
-    function_requires< ReadWritePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
     typedef typename property_traits::value_type IsoMappingValue;
     BOOST_STATIC_ASSERT((is_same::value));
     
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type IndexMap1Value;
     BOOST_STATIC_ASSERT((is_convertible::value));
     
-    function_requires< ReadablePropertyMapConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
     typedef typename property_traits::value_type IndexMap2Value;
     BOOST_STATIC_ASSERT((is_convertible::value));
     
diff --git a/include/boost/graph/johnson_all_pairs_shortest.hpp b/include/boost/graph/johnson_all_pairs_shortest.hpp
index 8aec5005..32e2b5cd 100644
--- a/include/boost/graph/johnson_all_pairs_shortest.hpp
+++ b/include/boost/graph/johnson_all_pairs_shortest.hpp
@@ -29,6 +29,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
@@ -44,8 +45,8 @@ namespace boost {
   {
     typedef graph_traits Traits1;
     typedef typename property_traits::value_type DT;
-    function_requires< BasicMatrixConcept >();
+    BOOST_CONCEPT_ASSERT(( BasicMatrixConcept ));
 
     typedef typename Traits1::directed_category DirCat;
     bool is_undirected = is_same::value;
diff --git a/include/boost/graph/kruskal_min_spanning_tree.hpp b/include/boost/graph/kruskal_min_spanning_tree.hpp
index a847e3f1..4d0c7efc 100644
--- a/include/boost/graph/kruskal_min_spanning_tree.hpp
+++ b/include/boost/graph/kruskal_min_spanning_tree.hpp
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 
 
 namespace boost {
@@ -51,18 +52,18 @@ namespace boost {
       if (num_vertices(G) == 0) return; // Nothing to do in this case
       typedef typename graph_traits::vertex_descriptor Vertex;
       typedef typename graph_traits::edge_descriptor Edge;
-      function_requires >();
-      function_requires >();
-      function_requires >();
-      function_requires >();
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( OutputIteratorConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept ));
       typedef typename property_traits::value_type W_value;
       typedef typename property_traits::value_type R_value;
       typedef typename property_traits::value_type P_value;
-      function_requires >();
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( ComparableConcept ));
+      BOOST_CONCEPT_ASSERT(( ConvertibleConcept ));
+      BOOST_CONCEPT_ASSERT(( IntegerConcept ));
 
       disjoint_sets  dset(rank, parent);
 
diff --git a/include/boost/graph/neighbor_bfs.hpp b/include/boost/graph/neighbor_bfs.hpp
index 3ed94fc5..4585f2e2 100644
--- a/include/boost/graph/neighbor_bfs.hpp
+++ b/include/boost/graph/neighbor_bfs.hpp
@@ -24,13 +24,14 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
   template 
   struct NeighborBFSVisitorConcept {
     void constraints() {
-      function_requires< CopyConstructibleConcept >();
+      BOOST_CONCEPT_ASSERT(( CopyConstructibleConcept ));
       vis.initialize_vertex(u, g);
       vis.discover_vertex(u, g);
       vis.examine_vertex(u, g);
@@ -133,13 +134,13 @@ namespace boost {
        Buffer& Q, BFSVisitor vis, ColorMap color)
 
     {
-      function_requires< BidirectionalGraphConcept >();
+      BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
       typedef graph_traits GTraits;
       typedef typename GTraits::vertex_descriptor Vertex;
       typedef typename GTraits::edge_descriptor Edge;
-      function_requires< 
-        NeighborBFSVisitorConcept >();
-      function_requires< ReadWritePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( 
+        NeighborBFSVisitorConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type ColorValue;
       typedef color_traits Color;
       
diff --git a/include/boost/graph/properties.hpp b/include/boost/graph/properties.hpp
index dd7a7357..bc498bbf 100644
--- a/include/boost/graph/properties.hpp
+++ b/include/boost/graph/properties.hpp
@@ -115,6 +115,7 @@ namespace boost {
   BOOST_DEF_PROPERTY(vertex, lowpoint);
   BOOST_DEF_PROPERTY(vertex, potential);
   BOOST_DEF_PROPERTY(vertex, update);
+  BOOST_DEF_PROPERTY(vertex, underlying);
   BOOST_DEF_PROPERTY(edge, reverse);
   BOOST_DEF_PROPERTY(edge, capacity);
   BOOST_DEF_PROPERTY(edge, flow);
@@ -123,6 +124,7 @@ namespace boost {
   BOOST_DEF_PROPERTY(edge, discover_time);
   BOOST_DEF_PROPERTY(edge, update);
   BOOST_DEF_PROPERTY(edge, finished);
+  BOOST_DEF_PROPERTY(edge, underlying);
   BOOST_DEF_PROPERTY(graph, visitor);
 
   // These tags are used for property bundles
diff --git a/include/boost/graph/reverse_graph.hpp b/include/boost/graph/reverse_graph.hpp
index 6c804208..48c4e057 100644
--- a/include/boost/graph/reverse_graph.hpp
+++ b/include/boost/graph/reverse_graph.hpp
@@ -27,17 +27,32 @@ struct reverse_graph_tag { };
     template 
     class reverse_graph_edge_descriptor {
       public:
-      EdgeDesc underlying_desc;
+      EdgeDesc underlying_descx; // Odd name is because this needs to be public but shouldn't be exposed to users anymore
+
+      private:
+      typedef EdgeDesc base_descriptor_type;
 
       public:
-      explicit reverse_graph_edge_descriptor(const EdgeDesc& underlying_desc = EdgeDesc())
-        : underlying_desc(underlying_desc) {}
+      explicit reverse_graph_edge_descriptor(const EdgeDesc& underlying_descx = EdgeDesc())
+        : underlying_descx(underlying_descx) {}
 
       friend bool operator==(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
-        return a.underlying_desc == b.underlying_desc;
+        return a.underlying_descx == b.underlying_descx;
       }
       friend bool operator!=(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
-        return a.underlying_desc != b.underlying_desc;
+        return a.underlying_descx != b.underlying_descx;
+      }
+      friend bool operator<(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
+        return a.underlying_descx < b.underlying_descx;
+      }
+      friend bool operator>(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
+        return a.underlying_descx > b.underlying_descx;
+      }
+      friend bool operator<=(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
+        return a.underlying_descx <= b.underlying_descx;
+      }
+      friend bool operator>=(const reverse_graph_edge_descriptor& a, const reverse_graph_edge_descriptor& b) {
+        return a.underlying_descx >= b.underlying_descx;
       }
     };
 
@@ -58,6 +73,18 @@ struct reverse_graph_tag { };
                             make_transform_iterator(ip.second, reverse_graph_edge_descriptor_maker()));
     }
 
+    // Get the underlying descriptor from a vertex or edge descriptor
+    template 
+    struct get_underlying_descriptor_from_reverse_descriptor {
+      typedef Desc type;
+      static Desc convert(const Desc& d) {return d;}
+    };
+    template 
+    struct get_underlying_descriptor_from_reverse_descriptor > {
+      typedef Desc type;
+      static Desc convert(const reverse_graph_edge_descriptor& d) {return d.underlying_descx;}
+    };
+
     template  struct choose_rev_edge_iter { };
     template <> struct choose_rev_edge_iter {
       template  struct bind_ {
@@ -97,8 +124,7 @@ class reverse_graph {
     typedef transform_iterator, typename Traits::out_edge_iterator> in_edge_iterator;
 
     // AdjacencyGraph requirements
-  typedef typename adjacency_iterator_generator::type adjacency_iterator;
+    typedef typename adjacency_iterator_generator::type adjacency_iterator;
 
     // VertexListGraph requirements
     typedef typename Traits::vertex_iterator vertex_iterator;
@@ -117,14 +143,20 @@ class reverse_graph {
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
     // Bundled properties support
     template
-    typename graph::detail::bundled_result::type&
+    typename graph::detail::bundled_result<
+               BidirectionalGraph,
+               typename detail::get_underlying_descriptor_from_reverse_descriptor::type
+             >::type&
     operator[](Descriptor x)
-    { return m_g[x]; }
+    { return m_g[detail::get_underlying_descriptor_from_reverse_descriptor::convert(x)]; }
 
     template
-    typename graph::detail::bundled_result::type const&
+    typename graph::detail::bundled_result<
+               BidirectionalGraph,
+               typename detail::get_underlying_descriptor_from_reverse_descriptor::type
+             >::type const&
     operator[](Descriptor x) const
-    { return m_g[x]; }
+    { return m_g[detail::get_underlying_descriptor_from_reverse_descriptor::convert(x)]; }
 #endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 
     static vertex_descriptor null_vertex()
@@ -236,13 +268,15 @@ vertex(const typename graph_traits::vertices_size_type v,
 }
 
 template 
-inline std::pair::edge_descriptor,
-                 bool>
+inline std::pair< typename graph_traits >::edge_descriptor,
+                  bool>
 edge(const typename graph_traits::vertex_descriptor u,
      const typename graph_traits::vertex_descriptor v,
      const reverse_graph& g)
 {
-    return edge(v, u, g.m_g);
+    typedef typename graph_traits::edge_descriptor underlying_edge_descriptor;
+    std::pair e = edge(v, u, g.m_g);
+    return std::make_pair(detail::reverse_graph_edge_descriptor(e.first), e.second);
 }
 
 template 
@@ -280,14 +314,14 @@ template 
 inline typename graph_traits::vertex_descriptor
 source(const detail::reverse_graph_edge_descriptor& e, const reverse_graph& g)
 {
-    return target(e.underlying_desc, g.m_g);
+    return target(e.underlying_descx, g.m_g);
 }
 
 template 
 inline typename graph_traits::vertex_descriptor
 target(const detail::reverse_graph_edge_descriptor& e, const reverse_graph& g)
 {
-    return source(e.underlying_desc, g.m_g);
+    return source(e.underlying_descx, g.m_g);
 }
 
 
@@ -309,18 +343,18 @@ namespace detail {
     friend reference
     get(const reverse_graph_edge_property_map& m,
         const key_type& e) {
-      return get(m.underlying_pm, e.underlying_desc);
+      return get(m.underlying_pm, e.underlying_descx);
     }
 
     friend void
     put(const reverse_graph_edge_property_map& m,
         const key_type& e,
         const value_type& v) {
-      put(m.underlying_pm, e.underlying_desc, v);
+      put(m.underlying_pm, e.underlying_descx, v);
     }
 
-    reference operator[](const key_type& k) {
-      return (this->underlying_pm)[k.underlying_desc];
+    reference operator[](const key_type& k) const {
+      return (this->underlying_pm)[k.underlying_descx];
     }
   };
 
@@ -388,6 +422,62 @@ put(Property p, reverse_graph& g, const Key& k,
   put(get(p, g), k, val);
 }
 
+// Get the underlying descriptor from a reverse_graph's wrapped edge descriptor
+
+namespace detail {
+  template 
+  struct underlying_edge_desc_map_type {
+    E operator[](const reverse_graph_edge_descriptor& k) const {
+      return k.underlying_descx;
+    }
+  };
+
+  template 
+  E
+  get(underlying_edge_desc_map_type m,
+      const reverse_graph_edge_descriptor& k)
+  {
+    return m[k];
+  }
+};
+
+template 
+struct property_traits > {
+  typedef detail::reverse_graph_edge_descriptor key_type;
+  typedef E value_type;
+  typedef const E& reference;
+  typedef readable_property_map_tag category;
+};
+
+template 
+struct property_map, edge_underlying_t> {
+  private:
+  typedef typename graph_traits::edge_descriptor ed;
+
+  public:
+  typedef detail::underlying_edge_desc_map_type type;
+  typedef detail::underlying_edge_desc_map_type const_type;
+};
+
+template 
+detail::underlying_edge_desc_map_type::edge_descriptor>
+get(edge_underlying_t,
+    const reverse_graph& g)
+{
+  return detail::underlying_edge_desc_map_type::edge_descriptor>();
+}
+
+template 
+typename graph_traits::edge_descriptor
+get(edge_underlying_t,
+    const reverse_graph& g,
+    const typename graph_traits >::edge_descriptor& k)
+{
+  return k.underlying_descx;
+}
+
+// Access to wrapped graph's graph properties
+
 template
 inline void
diff --git a/include/boost/graph/strong_components.hpp b/include/boost/graph/strong_components.hpp
index 6494283e..ba5d4590 100644
--- a/include/boost/graph/strong_components.hpp
+++ b/include/boost/graph/strong_components.hpp
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost {
 
@@ -93,11 +94,11 @@ namespace boost {
        const bgl_named_params& params)
     {
       typedef typename graph_traits::vertex_descriptor Vertex;
-      function_requires< ReadWritePropertyMapConcept >();
-      function_requires< ReadWritePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type RootV;
-      function_requires< ConvertibleConcept >();
-      function_requires< ReadWritePropertyMapConcept >();
+      BOOST_CONCEPT_ASSERT(( ConvertibleConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
 
       typename property_traits::value_type total = 0;
 
@@ -282,7 +283,7 @@ namespace boost {
   kosaraju_strong_components(Graph& G, ComponentsMap c,
                              FinishTime finish_time, ColorMap color)
   {
-    function_requires< MutableGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( MutableGraphConcept ));
     // ...
     
     typedef typename graph_traits::vertex_descriptor Vertex;
diff --git a/include/boost/graph/tiernan_all_cycles.hpp b/include/boost/graph/tiernan_all_cycles.hpp
index d4556796..2e7ebc97 100644
--- a/include/boost/graph/tiernan_all_cycles.hpp
+++ b/include/boost/graph/tiernan_all_cycles.hpp
@@ -13,6 +13,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 namespace boost {
@@ -156,8 +157,8 @@ namespace detail
                     const Path& p,
                     const ClosedMatrix& m)
     {
-        function_requires< IncidenceGraphConcept >();
-        function_requires< VertexIndexGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+        BOOST_CONCEPT_ASSERT(( VertexIndexGraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
 
         // get the vertices in question
@@ -181,7 +182,7 @@ namespace detail
     inline bool
     can_wrap_path(const Graph& g, const Path& p)
     {
-        function_requires< IncidenceGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
         typedef typename graph_traits::out_edge_iterator OutIterator;
 
@@ -209,7 +210,7 @@ namespace detail
                 Path& p,
                 ClosedMatrix& closed)
     {
-        function_requires< IncidenceGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
         typedef typename graph_traits::edge_descriptor Edge;
         typedef typename graph_traits::out_edge_iterator OutIterator;
@@ -238,7 +239,7 @@ namespace detail
     inline bool
     exhaust_paths(const Graph& g, Path& p, ClosedMatrix& closed)
     {
-        function_requires< GraphConcept >();
+        BOOST_CONCEPT_ASSERT(( GraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
 
         // if there's more than one vertex in the path, this closes
@@ -272,10 +273,10 @@ namespace detail
                             std::size_t minlen,
                             std::size_t maxlen)
     {
-        function_requires< VertexListGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
         typedef typename graph_traits::vertex_descriptor Vertex;
         typedef std::vector Path;
-        function_requires< CycleVisitorConcept >();
+        BOOST_CONCEPT_ASSERT(( CycleVisitorConcept ));
         typedef std::vector VertexList;
         typedef std::vector ClosedMatrix;
 
@@ -320,7 +321,7 @@ tiernan_all_cycles(const Graph& g,
                     std::size_t minlen,
                     std::size_t maxlen)
 {
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef typename graph_traits::vertex_iterator VertexIterator;
 
     VertexIterator i, end;
diff --git a/include/boost/graph/transitive_closure.hpp b/include/boost/graph/transitive_closure.hpp
index 01bfb3d3..5ba0cab7 100644
--- a/include/boost/graph/transitive_closure.hpp
+++ b/include/boost/graph/transitive_closure.hpp
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 
 namespace boost
 {
@@ -76,12 +77,12 @@ namespace boost
     typedef typename graph_traits <
       Graph >::adjacency_iterator adjacency_iterator;
 
-    function_requires < VertexListGraphConcept < Graph > >();
-    function_requires < AdjacencyGraphConcept < Graph > >();
-    function_requires < VertexMutableGraphConcept < GraphTC > >();
-    function_requires < EdgeMutableGraphConcept < GraphTC > >();
-    function_requires < ReadablePropertyMapConcept < VertexIndexMap,
-      vertex > >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept < Graph > ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept < Graph > ));
+    BOOST_CONCEPT_ASSERT(( VertexMutableGraphConcept < GraphTC > ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept < GraphTC > ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept < VertexIndexMap,
+      vertex > ));
 
     typedef size_type cg_vertex;
     std::vector < cg_vertex > component_number_vec(num_vertices(g));
@@ -302,8 +303,8 @@ namespace boost
     typedef typename graph_traits < G >::vertex_descriptor vertex;
     typedef typename graph_traits < G >::vertex_iterator vertex_iterator;
 
-    function_requires < AdjacencyMatrixConcept < G > >();
-    function_requires < EdgeMutableGraphConcept < G > >();
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept < G > ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept < G > ));
 
     // Matrix form:
     // for k
@@ -328,8 +329,8 @@ namespace boost
     typedef typename graph_traits < G >::vertex_descriptor vertex;
     typedef typename graph_traits < G >::vertex_iterator vertex_iterator;
 
-    function_requires < AdjacencyMatrixConcept < G > >();
-    function_requires < EdgeMutableGraphConcept < G > >();
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept < G > ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept < G > ));
 
     // Make sure second loop will work
     if (num_vertices(g) == 0)
diff --git a/include/boost/graph/undirected_dfs.hpp b/include/boost/graph/undirected_dfs.hpp
index 9cad25ad..df31d22b 100644
--- a/include/boost/graph/undirected_dfs.hpp
+++ b/include/boost/graph/undirected_dfs.hpp
@@ -13,6 +13,7 @@
 
 #include 
 #include 
+#include 
 
 namespace boost {
 
@@ -32,16 +33,16 @@ namespace boost {
        VertexColorMap vertex_color,
        EdgeColorMap edge_color)
     {
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
       typedef typename graph_traits::vertex_descriptor Vertex;
       typedef typename graph_traits::edge_descriptor Edge;
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type ColorValue;
       typedef typename property_traits::value_type EColorValue;
-      function_requires< ColorValueConcept >();
-      function_requires< ColorValueConcept >();
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
       typedef color_traits Color;
       typedef color_traits EColor;
       typedef typename graph_traits::out_edge_iterator Iter;
@@ -94,16 +95,16 @@ namespace boost {
        VertexColorMap vertex_color,
        EdgeColorMap edge_color)
     {
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+      BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
       typedef typename graph_traits::vertex_descriptor Vertex;
       typedef typename graph_traits::edge_descriptor Edge;
-      function_requires >();
-      function_requires >();
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
+      BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept ));
       typedef typename property_traits::value_type ColorValue;
       typedef typename property_traits::value_type EColorValue;
-      function_requires< ColorValueConcept >();
-      function_requires< ColorValueConcept >();
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
+      BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
       typedef color_traits Color;
       typedef color_traits EColor;
       typename graph_traits::out_edge_iterator ei, ei_end;
@@ -134,8 +135,8 @@ namespace boost {
                  VertexColorMap vertex_color, EdgeColorMap edge_color,
                  Vertex start_vertex)
   {
-    function_requires >();
-      function_requires >();
+    BOOST_CONCEPT_ASSERT(( DFSVisitorConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
 
     typedef typename property_traits::value_type ColorValue;
     typedef color_traits Color;
diff --git a/test/adj_list_cc.cpp b/test/adj_list_cc.cpp
index 8f22d573..fad29388 100644
--- a/test/adj_list_cc.cpp
+++ b/test/adj_list_cc.cpp
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 
 int main(int,char*[])
 {
@@ -21,20 +22,20 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   {
     typedef adjacency_list Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< listS, listS, directedS, 
@@ -66,20 +67,20 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires< 
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< listS, listS, undirectedS, 
@@ -88,20 +89,20 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   // Checking adjacency_list with EdgeList=setS
   {
@@ -111,21 +112,21 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< setS, listS, directedS, 
@@ -134,20 +135,20 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< setS, listS, undirectedS, 
@@ -156,105 +157,105 @@ int main(int,char*[])
     > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      LvaluePropertyGraphConcept ));
   }
   // Check adjacency_list without any properties
   {
     typedef adjacency_list Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
   }
   {
     typedef adjacency_list Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< listS, listS, directedS> Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
   }
   {
     typedef adjacency_list< listS, listS, undirectedS> Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
   }
   // Checking EdgeList=setS with no properties
   {
     typedef adjacency_list Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
-    function_requires< ReadablePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
   }
   {
     typedef adjacency_list< setS, listS, directedS> Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< MutableIncidenceGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( MutableIncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
   }
   {
     typedef adjacency_list< setS, listS, undirectedS> Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableBidirectionalGraphConcept >();
-    function_requires< MutableEdgeListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableBidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableEdgeListGraphConcept ));
   }
   return 0;
 }
diff --git a/test/adj_matrix_cc.cpp b/test/adj_matrix_cc.cpp
index 317a22f4..ae806014 100644
--- a/test/adj_matrix_cc.cpp
+++ b/test/adj_matrix_cc.cpp
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 
 int main(int,char*[])
 {
@@ -16,21 +17,21 @@ int main(int,char*[])
   // Check adjacency_matrix without properties
   {
     typedef adjacency_matrix Graph;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableGraphConcept >();
-    function_requires< AdjacencyMatrixConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
   }
   {
     typedef adjacency_matrix Graph;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< MutableGraphConcept >();
-    function_requires< AdjacencyMatrixConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( MutableGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
   }
   // Check adjacency_matrix with properties
   {
@@ -39,17 +40,17 @@ int main(int,char*[])
       property > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< AdjacencyMatrixConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires< ReadablePropertyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
   }
   {
     typedef adjacency_matrix > Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< AdjacencyMatrixConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires< ReadablePropertyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyMatrixConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
   }
   return 0;
 }
diff --git a/test/edge_list_cc.cpp b/test/edge_list_cc.cpp
index 0741ccea..18d34e05 100644
--- a/test/edge_list_cc.cpp
+++ b/test/edge_list_cc.cpp
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -24,10 +25,10 @@ int main(int,char*[])
     
         typedef graph_traits::edge_descriptor Edge;
     
-        function_requires< EdgeListGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
     
-        function_requires< ReadablePropertyGraphConcept >();
+        BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
     }
     return 0;
 }
diff --git a/test/filtered_graph_cc.cpp b/test/filtered_graph_cc.cpp
index 09feb4b0..52221b1e 100644
--- a/test/filtered_graph_cc.cpp
+++ b/test/filtered_graph_cc.cpp
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 
 int main(int,char*[])
 {
@@ -22,12 +23,12 @@ int main(int,char*[])
     typedef filtered_graph > ResGraph;
     typedef graph_traits::edge_descriptor Edge;
 
-    function_requires< VertexListGraphConcept >();
-    function_requires< EdgeListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
   }
   // Check filtered_graph with bidirectional adjacency_list
   {
@@ -35,7 +36,7 @@ int main(int,char*[])
       no_property, property > Graph;
     typedef property_map::type ResCapMap;
     typedef filtered_graph > ResGraph;
-    function_requires< BidirectionalGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
   }
   return 0;
 }
diff --git a/test/graph_concepts.cpp b/test/graph_concepts.cpp
index cfab6b4d..c2edc342 100644
--- a/test/graph_concepts.cpp
+++ b/test/graph_concepts.cpp
@@ -8,6 +8,7 @@
 //=======================================================================
 #include 
 #include 
+#include 
 
 int main(int,char*[])
 {
@@ -19,22 +20,22 @@ int main(int,char*[])
 
   typedef incidence_graph_archetype Graph1;
-  function_requires< IncidenceGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
 
   typedef adjacency_graph_archetype Graph2;
-  function_requires< AdjacencyGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
 
   typedef vertex_list_graph_archetype Graph3;
-  function_requires< VertexListGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
 
-  function_requires< ColorValueConcept >();
+  BOOST_CONCEPT_ASSERT(( ColorValueConcept ));
 
   typedef incidence_graph_archetype G;
   typedef property_graph_archetype
     Graph4;
-  function_requires< PropertyGraphConcept >();
+  BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
 
   return 0;
 }
diff --git a/test/grid_graph_cc.cpp b/test/grid_graph_cc.cpp
index 6c7d76a3..a9e1c808 100644
--- a/test/grid_graph_cc.cpp
+++ b/test/grid_graph_cc.cpp
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #define DIMENSIONS 3
 using namespace boost;
@@ -20,14 +21,14 @@ int main (int, char*[]) {
   typedef graph_traits::vertex_descriptor Vertex;
   typedef graph_traits::edge_descriptor Edge;
 
-  function_requires >();
-  function_requires >();
-  function_requires >();
-  function_requires >();
-  function_requires >();
-  function_requires >();
-  function_requires >();
-  function_requires >();
+  BOOST_CONCEPT_ASSERT((BidirectionalGraphConcept ));
+  BOOST_CONCEPT_ASSERT((VertexListGraphConcept ));
+  BOOST_CONCEPT_ASSERT((EdgeListGraphConcept ));
+  BOOST_CONCEPT_ASSERT((IncidenceGraphConcept ));
+  BOOST_CONCEPT_ASSERT((AdjacencyGraphConcept ));
+  BOOST_CONCEPT_ASSERT((AdjacencyMatrixConcept ));
+  BOOST_CONCEPT_ASSERT((ReadablePropertyGraphConcept ));
+  BOOST_CONCEPT_ASSERT((ReadablePropertyGraphConcept ));
 
   return (0);
 }
diff --git a/test/leda_graph_cc.cpp b/test/leda_graph_cc.cpp
index 40fafcf5..38998516 100644
--- a/test/leda_graph_cc.cpp
+++ b/test/leda_graph_cc.cpp
@@ -8,7 +8,7 @@
 //=======================================================================
 #include 
 #include 
-
+#include 
 
 int
 main(int,char*[])
@@ -18,21 +18,21 @@ main(int,char*[])
     typedef leda::GRAPH Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< BidirectionalGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< VertexMutableGraphConcept >();
-    function_requires< EdgeMutableGraphConcept >();
-    function_requires< VertexMutablePropertyGraphConcept >();
-    function_requires< EdgeMutablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      ReadablePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
-    function_requires<
-      LvaluePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutableGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutableGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( VertexMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( EdgeMutablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT((
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT((
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT((
+      LvaluePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT((
+      LvaluePropertyGraphConcept ));
   }
   return 0;
 }
diff --git a/test/read_propmap.cpp b/test/read_propmap.cpp
index 3c0aa69a..5e22fd44 100644
--- a/test/read_propmap.cpp
+++ b/test/read_propmap.cpp
@@ -6,6 +6,7 @@
 
 #include 
 #include 
+#include 
 
 // Test contributed by Dmitry that validates a read-only property map bug
 // for bundled properties.
@@ -24,7 +25,7 @@ int main()
     typedef property_map::type WeightMap;
     typedef property_map::const_type cWeightMap;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires >();
-    function_requires >();
+    BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept ));
+    BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept ));
     return 0;
 }
diff --git a/test/reverse_graph_cc.cpp b/test/reverse_graph_cc.cpp
index 00a362e9..990ca0f0 100644
--- a/test/reverse_graph_cc.cpp
+++ b/test/reverse_graph_cc.cpp
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 int main(int,char*[])
@@ -23,11 +24,13 @@ int main(int,char*[])
       property
     > AdjList;
     typedef reverse_graph Graph;
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< ReadablePropertyGraphConcept >();
-    function_requires< ReadablePropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    function_requires< ReadablePropertyGraphConcept >();
     AdjList g;
     Graph gr(g);
     get_property(gr, graph_name_t());
@@ -40,11 +43,13 @@ int main(int,char*[])
       property
     > AdjList;
     typedef reverse_graph Graph;
-    function_requires< VertexListGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< PropertyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( ReadablePropertyGraphConcept ));
+    function_requires< ReadablePropertyGraphConcept >();
     AdjList g;
     Graph gr(g);
     get_property(gr, graph_name_t());
diff --git a/test/stanford_graph_cc.cpp b/test/stanford_graph_cc.cpp
index 1da24d64..c237fdb3 100644
--- a/test/stanford_graph_cc.cpp
+++ b/test/stanford_graph_cc.cpp
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 
 int main(int,char*[])
 {
@@ -18,28 +19,28 @@ int main(int,char*[])
     typedef Graph* Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< PropertyGraphConcept >();
-    function_requires< 
-      PropertyGraphConcept > >();
-    function_requires< 
-      PropertyGraphConcept > >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( PropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      PropertyGraphConcept > ));
+    BOOST_CONCEPT_ASSERT(( 
+      PropertyGraphConcept > ));
   }
   {
     typedef const Graph* Graph;
     typedef graph_traits::vertex_descriptor Vertex;
     typedef graph_traits::edge_descriptor Edge;
-    function_requires< VertexListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
-    function_requires< 
-      ReadablePropertyGraphConcept >();
-    function_requires< 
-      ReadablePropertyGraphConcept > >();
-    function_requires< 
-      ReadablePropertyGraphConcept > >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept > ));
+    BOOST_CONCEPT_ASSERT(( 
+      ReadablePropertyGraphConcept > ));
   }
   return 0;
 }
diff --git a/test/test_construction.hpp b/test/test_construction.hpp
index 2f093905..0243f6d2 100644
--- a/test/test_construction.hpp
+++ b/test/test_construction.hpp
@@ -7,6 +7,7 @@
 #ifndef TEST_CONSTRUCTION_HPP
 #define TEST_CONSTRUCTION_HPP
 
+#include 
 #include 
 
 /** @name Build Graph
diff --git a/test/test_destruction.hpp b/test/test_destruction.hpp
index f6d8b14c..8cdfa1b6 100644
--- a/test/test_destruction.hpp
+++ b/test/test_destruction.hpp
@@ -7,6 +7,7 @@
 #ifndef TEST_DESTRUCTION_HPP
 #define TEST_DESTRUCTION_HPP
 
+#include 
 #include 
 
 /** @name Destroy Graph
@@ -36,7 +37,7 @@ template 
 void destroy_graph(Graph& g, VertexSet const&, boost::mpl::false_, boost::mpl::true_) {
     using namespace boost;
     BOOST_CONCEPT_ASSERT((VertexListGraphConcept));
-    // function_requires< VeretexMutableGraphConcept >();
+    // BOOST_CONCEPT_ASSERT(( VeretexMutableGraphConcept ));
 
     std::cout << "...destroy_labeled\n";
     // Remove the roof vertex
diff --git a/test/test_direction.hpp b/test/test_direction.hpp
index b2774b1a..1084c06b 100644
--- a/test/test_direction.hpp
+++ b/test/test_direction.hpp
@@ -9,6 +9,7 @@
 
 #include 
 #include 
+#include 
 
 /** @name Test Out-Directed Graph
  * Test all graphs that have directed out edges.
diff --git a/test/test_graph.hpp b/test/test_graph.hpp
index 481008b1..f1223042 100644
--- a/test/test_graph.hpp
+++ b/test/test_graph.hpp
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/test/test_iteration.hpp b/test/test_iteration.hpp
index ce48e0d7..7842dd39 100644
--- a/test/test_iteration.hpp
+++ b/test/test_iteration.hpp
@@ -7,6 +7,7 @@
 #ifndef TEST_ITERATION_HPP
 #define TEST_ITERATION_HPP
 
+#include 
 #include 
 
 /** @name Test Vertex List
diff --git a/test/test_properties.hpp b/test/test_properties.hpp
index 9c3d4979..adeb9ae1 100644
--- a/test/test_properties.hpp
+++ b/test/test_properties.hpp
@@ -7,6 +7,8 @@
 #ifndef TEST_PROPERTIES_HPP
 #define TEST_PROPERTIES_HPP
 
+#include 
+
 template T const& as_const(T& x) { return x; }
 template void ignore(T const&) { }
 
diff --git a/test/vector_graph_cc.cpp b/test/vector_graph_cc.cpp
index 7f7c5ebd..f9b1cfac 100644
--- a/test/vector_graph_cc.cpp
+++ b/test/vector_graph_cc.cpp
@@ -7,6 +7,7 @@
 // http://www.boost.org/LICENSE_1_0.txt)
 //=======================================================================
 #include 
+#include 
 #include 
 #include 
 
@@ -24,9 +25,9 @@ int main(int,char*[])
   // Check "vector as graph"
   {
     typedef std::vector< std::list > Graph;
-    function_requires< VertexListGraphConcept >();
-    function_requires< IncidenceGraphConcept >();
-    function_requires< AdjacencyGraphConcept >();
+    BOOST_CONCEPT_ASSERT(( VertexListGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept ));
+    BOOST_CONCEPT_ASSERT(( AdjacencyGraphConcept ));
   }
   return 0;
 }