 }
 DECLARE_VECTOR_UNITTEST(TestMakePermutationIterator);
 
+template <typename Vector>
+void TestPermutationIteratorReduce(void)
+{
+    typedef typename Vector::value_type T;
+    typedef typename Vector::iterator Iterator;
+
+    Vector source(8);
+    Vector indices(4);
+    Vector output(4, 10);
+    
+    // initialize input
+    thrust::sequence(source.begin(), source.end(), 1);
+
+    indices[0] = 3;
+    indices[1] = 0;
+    indices[2] = 5;
+    indices[3] = 7;
+   
+    // construct transform_iterator
+    thrust::permutation_iterator<Iterator, Iterator> iter(source.begin(), indices.begin());
+
+    T result1 = thrust::reduce(thrust::make_permutation_iterator(source.begin(), indices.begin()),
+                               thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4);
+
+    ASSERT_EQUAL(result1, 19);
+    
+    T result2 = thrust::transform_reduce(thrust::make_permutation_iterator(source.begin(), indices.begin()),
+                                         thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4,
+                                         thrust::negate<T>(),
+                                         T(0),
+                                         thrust::plus<T>());
+    ASSERT_EQUAL(result2, -19);
+};
+DECLARE_VECTOR_UNITTEST(TestPermutationIteratorReduce);
+

#include <thrusttest/unittest.h>
#include <thrust/iterator/permutation_iterator.h>

#include <thrust/copy.h>
#include <thrust/reduce.h>
#include <thrust/sequence.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/transform_iterator.h>

template <class Vector>
void TestPermutationIterator(void)

    indices[3] = 7;
   
    // construct transform_iterator
    thrust::permutation_iterator<Iterator, Iterator> iter(source.begin(), indices.begin());

    thrust::copy(thrust::make_permutation_iterator(source.begin(), indices.begin()),
                 thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4,
