Index: src/ActOnAllUnitTest.cpp
===================================================================
--- src/ActOnAllUnitTest.cpp	(revision 13a5749f3ea1cfcb14e8fa7943cdf7ce459fc59b)
+++ src/ActOnAllUnitTest.cpp	(revision 33f9f707ba379505762c0251bf773524a07503b2)
@@ -31,4 +31,5 @@
   temp = new Vector(0,0,1);
   VL.AddVector(temp);
+  Ref = VL;
 };
 
@@ -39,10 +40,71 @@
 };
 
+/** UnitTest for VectorList::ActOnAllVectors() and Vector::AddVector(), Vector::SubtractVector(),
+ */
+void ActOnAllTest::AddSubtractTest()
+{
+  const Vector test(1.,0.,0.);
+
+  // adding, subtracting
+  VL.ActOnAllVectors( &Vector::AddVector, &test );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , false );
+  VL.ActOnAllVectors( &Vector::SubtractVector, &test );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , true );
+};
+
 /** UnitTest for VectorList::ActOnAllVectors()
  */
-void ActOnAllTest::ListTest()
+void ActOnAllTest::ScaleTest()
 {
-  CPPUNIT_ASSERT_EQUAL( true, true );
+  double factor=2.;
+  double inverse=1./2.;
+
+  // scaling by value
+  VL.ActOnAllVectors( (void (Vector::*)(double)) &Vector::Scale, 2. );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , false );
+
+  VL.ActOnAllVectors( (void (Vector::*)(double)) &Vector::Scale, 0.5 );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , true );
+
+  // scaling by ref
+  VL.ActOnAllVectors( (void (Vector::*)(double *)) &Vector::Scale, &factor );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , false );
+
+  VL.ActOnAllVectors( (void (Vector::*)(double *)) &Vector::Scale, &inverse );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , true );
+
+  // scaling by three values
+  double *factors = Malloc<double>(NDIM, "ActOnAllTest::ScaleTest - factors");
+  double *inverses = Malloc<double>(NDIM, "ActOnAllTest::ScaleTest - inverses");
+  for (int i=0;i<NDIM;++i) {
+    factors[i] = 2.;
+    inverses[i] = 1./factors[i];
+  }
+  VL.ActOnAllVectors( (void (Vector::*)(double **)) &Vector::Scale, &factors );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , false );
+
+  VL.ActOnAllVectors( (void (Vector::*)(double **)) &Vector::Scale, &inverses );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , true );
 };
+
+/** UnitTest for VectorList::ActOnAllVectors() and Vector::MakeNormalVector()
+ */
+void ActOnAllTest::NormalizeTest()
+{
+  const Vector xaxis(1.,0.,0.);
+  const Vector yaxis(0.,1.,0.);
+
+  // normalize with respect to x and y axis
+  bool (Vector::*f)(const Vector *, const Vector *) = &Vector::MakeNormalVector;
+  VL.ActOnAllVectors( f, &xaxis, &yaxis );
+  CPPUNIT_ASSERT_EQUAL( VL == Ref , false );
+
+  // check that x and y components are zero
+  for (ListOfVectors::iterator Runner = VL.Vectors.begin(); Runner != VL.Vectors.end(); Runner++) {
+    CPPUNIT_ASSERT_EQUAL( (*Runner)->x[0] , 0. );
+    CPPUNIT_ASSERT_EQUAL( (*Runner)->x[1] , 0. );
+  }
+};
+
 
 /********************************************** Main routine **************************************/
Index: src/ActOnAllUnitTest.hpp
===================================================================
--- src/ActOnAllUnitTest.hpp	(revision 13a5749f3ea1cfcb14e8fa7943cdf7ce459fc59b)
+++ src/ActOnAllUnitTest.hpp	(revision 33f9f707ba379505762c0251bf773524a07503b2)
@@ -18,5 +18,7 @@
 {
     CPPUNIT_TEST_SUITE( ActOnAllTest) ;
-    CPPUNIT_TEST ( ListTest );
+    CPPUNIT_TEST ( AddSubtractTest );
+    CPPUNIT_TEST ( ScaleTest );
+    CPPUNIT_TEST ( NormalizeTest );
     CPPUNIT_TEST_SUITE_END();
 
@@ -24,9 +26,11 @@
       void setUp();
       void tearDown();
-      void ListTest();
-
+      void AddSubtractTest();
+      void ScaleTest();
+      void NormalizeTest();
 
 private:
       class VectorList VL;
+      class VectorList Ref;
 };
 
Index: src/ActOnAlltest.hpp
===================================================================
--- src/ActOnAlltest.hpp	(revision 13a5749f3ea1cfcb14e8fa7943cdf7ce459fc59b)
+++ src/ActOnAlltest.hpp	(revision 33f9f707ba379505762c0251bf773524a07503b2)
@@ -20,4 +20,5 @@
 public:
   VectorList();
+  VectorList(VectorList &ref);
   ~VectorList();
 
@@ -25,14 +26,73 @@
   void EmptyList();
 
-  template <T> void ActOnAllVectors( void (*f)(T) )
+  template <typename res, typename T> void ActOnAllVectors( res (Vector::*f)(T), T t );
+  template <typename res, typename T, typename U> void ActOnAllVectors( res (Vector::*f)(T, U), T t, U u );
+  template <typename res, typename T, typename U, typename V> void ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v);
 
-private:
+  bool operator == (VectorList &rhs);
+  VectorList& operator = (VectorList &ref);
+
+//private:
   ListOfVectors Vectors;
 };
 
-template <T> void VectorList::ActOnAllVectors( void (*f)(T) )
+
+VectorList::VectorList() { };
+VectorList::VectorList(VectorList &ref)
 {
-  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++)
-    f(T);
+  ref.EmptyList();
+  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
+    ref.Vectors.push_back(new Vector (**Runner));
+  }
+};
+
+VectorList & VectorList::operator = (VectorList &ref)
+{
+  EmptyList();
+  for (ListOfVectors::iterator Runner = ref.Vectors.begin(); Runner != ref.Vectors.end(); Runner++) {
+    Vectors.push_back(new Vector (**Runner));
+  }
+  return *this;
+};
+
+bool VectorList::operator == (VectorList &rhs)
+{
+  bool status = true;
+  ListOfVectors::iterator lRunner = Vectors.begin();
+  ListOfVectors::iterator rRunner = rhs.Vectors.begin();
+  for (;(lRunner != Vectors.end()) && (rRunner != rhs.Vectors.end()); lRunner++, rRunner++) {
+    //cout << **lRunner << " == " << **rRunner << endl;
+    status = status && (**lRunner == **rRunner);
+  }
+  return status;
+};
+
+VectorList::~VectorList() { };
+
+template <typename res, typename T> void VectorList::ActOnAllVectors( res (Vector::*f)(T), T t )
+{
+  Vector *test = NULL;
+  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
+    test = *Runner;
+    (test->*f)(t);
+  }
+};
+
+template <typename res, typename T, typename U> void VectorList::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u )
+{
+  Vector *test = NULL;
+  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
+    test = *Runner;
+    (test->*f)(t, u);
+  }
+};
+
+template <typename res, typename T, typename U, typename V> void VectorList::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v)
+{
+  Vector *test = NULL;
+  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
+    test = *Runner;
+    (test->*f)(t, u, v);
+  }
 };
 
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 13a5749f3ea1cfcb14e8fa7943cdf7ce459fc59b)
+++ src/Makefile.am	(revision 33f9f707ba379505762c0251bf773524a07503b2)
@@ -16,11 +16,14 @@
 TESTS = VectorUnitTest MemoryAllocatorUnitTest MemoryUsageObserverUnitTest TesselationUnitTest
 check_PROGRAMS = $(TESTS)
+
 VectorUnitTest_SOURCES = defs.hpp helpers.cpp helpers.hpp leastsquaremin.cpp leastsquaremin.hpp memoryallocator.hpp memoryusageobserver.cpp memoryusageobserver.hpp vectorunittest.cpp vectorunittest.hpp vector.cpp vector.hpp verbose.cpp verbose.hpp 
 VectorUnitTest_CXXFLAGS = $(CPPUNIT_CFLAGS)
 VectorUnitTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl
+
 TesselationUnitTest_SOURCES = defs.hpp helpers.cpp helpers.hpp leastsquaremin.cpp leastsquaremin.hpp linkedcell.cpp linkedcell.hpp memoryallocator.hpp memoryusageobserver.cpp memoryusageobserver.hpp tesselation.cpp tesselation.hpp tesselationhelpers.cpp tesselationhelpers.hpp tesselationunittest.cpp tesselationunittest.hpp vector.cpp vector.hpp verbose.cpp verbose.hpp
 TesselationUnitTest_CXXFLAGS = $(CPPUNIT_CFLAGS)
 TesselationUnitTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl
-ActOnAllTest_SOURCES = ActOnAllTest.hp ActOnAllUnitTest.cpp ActOnAllUnitTest.hpp vector.cpp vector.hpp
+
+ActOnAllTest_SOURCES = ActOnAllTest.hp ActOnAllUnitTest.cpp ActOnAllUnitTest.hpp defs.hpp helpers.cpp helpers.hpp memoryallocator.hpp memoryusageobserver.cpp memoryusageobserver.hpp vector.cpp vector.hpp verbose.cpp verbose.hpp leastsquaremin.cpp leastsquaremin.hpp 
 ActOnAllTest_CXXFLAGS = $(CPPUNIT_CFLAGS)
 ActOnAllTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl
Index: src/molecules.hpp
===================================================================
--- src/molecules.hpp	(revision 13a5749f3ea1cfcb14e8fa7943cdf7ce459fc59b)
+++ src/molecules.hpp	(revision 33f9f707ba379505762c0251bf773524a07503b2)
@@ -132,4 +132,9 @@
   bool IsEnd();
 
+  // templates for allowing global manipulation of all vectors
+  template <typename res, typename T> void ActOnAllVectors( res (Vector::*f)(T), T t );
+  template <typename res, typename T, typename U> void ActOnAllVectors( res (Vector::*f)(T, U), T t, U u );
+  template <typename res, typename T, typename U, typename V> void ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v);
+
   /// remove atoms from molecule.
   bool AddAtom(atom *pointer);
@@ -249,4 +254,32 @@
 };
 
+
+template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T), T t )
+{
+  atom *Walker = start;
+  while (Walker->next != end) {
+    Walker = Walker->next;
+    ((*Walker->node)->*f)(t);
+  }
+};
+
+template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u )
+{
+  atom *Walker = start;
+  while (Walker->next != end) {
+    Walker = Walker->next;
+    ((*Walker->node)->*f)(t, u);
+  }
+};
+
+template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v)
+{
+  atom *Walker = start;
+  while (Walker->next != end) {
+    Walker = Walker->next;
+    ((*Walker->node)->*f)(t, u, v);
+  }
+};
+
 /** A list of \a molecule classes.
  */
