Index: src/RandomNumbers/RandomNumberGenerator.hpp
===================================================================
--- src/RandomNumbers/RandomNumberGenerator.hpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/RandomNumberGenerator.hpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -54,10 +54,10 @@
    *
    */
-  virtual std::string EngineName()=0;
+  virtual std::string EngineName() const=0;
 
   /** Getter for the type name of the internal distribution.
    *
    */
-  virtual std::string DistributionName()=0;
+  virtual std::string DistributionName() const=0;
 
   /** Destructor of class RandomNumberGenerator.
Index: src/RandomNumbers/RandomNumberGeneratorFactory.cpp
===================================================================
--- src/RandomNumbers/RandomNumberGeneratorFactory.cpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/RandomNumberGeneratorFactory.cpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -55,5 +55,5 @@
       !GeneratorPrototypeTable.empty();
       iter = GeneratorPrototypeTable.begin()) {
-    EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,Clone<RandomNumberGenerator> *> > (iter->second);
+    EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,RandomNumberGenerator*> > (iter->second);
     GeneratorPrototypeTable.erase(iter);
   }
@@ -100,5 +100,5 @@
 }
 
-RandomNumberGenerator* RandomNumberGeneratorFactory::makeRandomNumberGenerator() const
+RandomNumberGenerator& RandomNumberGeneratorFactory::makeRandomNumberGenerator() const
 {
   // Instantiate and return (implicitly creates a copy of the stored prototype)
@@ -108,8 +108,8 @@
       RandomNumberDistributionFactory::getInstance().getCurrentTypeEnum();
 
-  return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
+  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
 }
 
-RandomNumberGenerator* RandomNumberGeneratorFactory::makeRandomNumberGenerator(
+RandomNumberGenerator& RandomNumberGeneratorFactory::makeRandomNumberGenerator(
     std::string engine_type,
     std::string distribution_type
@@ -128,7 +128,7 @@
   } else
     dis_type = RandomNumberDistributionFactory::getInstance().getCurrentTypeEnum();
-  return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
+  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
 
-  return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
+  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
 }
 
Index: src/RandomNumbers/RandomNumberGeneratorFactory.hpp
===================================================================
--- src/RandomNumbers/RandomNumberGeneratorFactory.hpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/RandomNumberGeneratorFactory.hpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -50,5 +50,5 @@
    * \return random number generator instance
    */
-  RandomNumberGenerator* makeRandomNumberGenerator() const;
+  RandomNumberGenerator& makeRandomNumberGenerator() const;
 
   /** Create a Generator of desired combination of engine and distribution.
@@ -62,5 +62,5 @@
    * \return random number generator instance
    */
-  RandomNumberGenerator* makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
+  RandomNumberGenerator& makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
 
   /** Specify the precise type of the engine to build
@@ -99,5 +99,5 @@
       std::map<
         RandomNumberDistributionFactory::TypeList,
-        Clone<RandomNumberGenerator> *>
+        RandomNumberGenerator *>
   > EngineDistributionTable;
 
Index: src/RandomNumbers/RandomNumberGenerator_Encapsulation.hpp
===================================================================
--- src/RandomNumbers/RandomNumberGenerator_Encapsulation.hpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/RandomNumberGenerator_Encapsulation.hpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -87,5 +87,7 @@
    */
   double operator()() const {
-    return (*randomgenerator)();
+    const double value = (*randomgenerator)();
+    //std::cout << "Current random value from (" << EngineName() << "," << DistributionName() << ") is " << value << std::endl;
+    return value;
   }
 
@@ -117,5 +119,5 @@
    *
    */
-  std::string EngineName() {
+  std::string EngineName() const {
     return engine_type->name();
   }
@@ -124,5 +126,5 @@
    *
    */
-  std::string DistributionName() {
+  std::string DistributionName() const {
     return distribution_type->name();
   }
Index: src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.cpp
===================================================================
--- src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.cpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.cpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -75,6 +75,4 @@
 void RandomNumberGeneratorFactoryTest::setUp()
 {
-  rng = NULL;
-
   RandomNumberGeneratorFactory::getInstance();
 }
@@ -82,5 +80,4 @@
 void RandomNumberGeneratorFactoryTest::tearDown()
 {
-  delete rng;
 
   RandomNumberDistributionFactory::purgeInstance();
@@ -92,14 +89,14 @@
 {
   // check one of the engines and distributions
-  rng = RandomNumberGeneratorFactory::getInstance().
+  RandomNumberGenerator& rng = *(RandomNumberGeneratorFactory::getInstance().
       GeneratorPrototypeTable[RandomNumberEngineFactory::minstd_rand0]
-                              [RandomNumberDistributionFactory::uniform_smallint]->clone();
+                              [RandomNumberDistributionFactory::uniform_smallint]);
   CPPUNIT_ASSERT_EQUAL(
       std::string(typeid(boost::minstd_rand0).name()),
-      rng->EngineName()
+      rng.EngineName()
   );
   CPPUNIT_ASSERT_EQUAL(
       std::string(typeid(boost::uniform_smallint<> ).name()),
-      rng->DistributionName()
+      rng.DistributionName()
   );
 
@@ -108,14 +105,13 @@
   RandomNumberDistributionFactory::getInstance().setCurrentType(RandomNumberDistributionFactory::uniform_int);
   // ... and check whether generator delivers those set types
-  RandomNumberGenerator *rng_A = RandomNumberGeneratorFactory::getInstance().
+  RandomNumberGenerator &rng_A = RandomNumberGeneratorFactory::getInstance().
       makeRandomNumberGenerator();
   CPPUNIT_ASSERT_EQUAL(
       std::string(typeid(boost::minstd_rand0).name()),
-      rng_A->EngineName()
+      rng_A.EngineName()
   );
   CPPUNIT_ASSERT_EQUAL(
       std::string(typeid(boost::uniform_int<> ).name()),
-      rng_A->DistributionName()
+      rng_A.DistributionName()
   );
-  delete rng_A;
 }
Index: src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.hpp
===================================================================
--- src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.hpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.hpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -29,7 +29,4 @@
 
   void GeneratorTest();
-
-private:
-  RandomNumberGenerator *rng;
 };
 
Index: src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.cpp
===================================================================
--- src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.cpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.cpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -50,22 +50,14 @@
 
 /** We check that the RandomNumberGenerator instance received
- * from the RandomNumberGeneratorFactory is truely a copy and
- * not the prototype instance.
+ * from the RandomNumberGeneratorFactory is truely the prototype
+ * itself.
  */
-void RandomNumberGeneratorTest::PrototypeCopyTest()
+void RandomNumberGeneratorTest::PrototypeNonCopyTest()
 {
-  RandomNumberGenerator *rng1 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
-  RandomNumberGenerator *rng2 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
+  RandomNumberGenerator &rng1 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
+  RandomNumberGenerator &rng2 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
 
-  double random1_1 = (*rng1)();
-  double random1_2 = (*rng1)();
-  double random2_1 = (*rng2)();
-  double random2_2 = (*rng2)();
-
-  CPPUNIT_ASSERT(random1_1 == random2_1);
-  CPPUNIT_ASSERT(random1_2 == random2_2);
-
-  delete rng1;
-  delete rng2;
+  // compare addresses in memory, have to be the same
+  CPPUNIT_ASSERT( &rng1 == &rng2 );
 }
 
@@ -74,10 +66,9 @@
   // obtain some random values for uniform_smallint
   RandomNumberGeneratorFactory::getInstance().setDistribution("uniform_smallint");
-  RandomNumberGenerator* rng = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
+  RandomNumberGenerator& rng = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
   for (size_t i=0; i < 1000; ++i) {
-    const int testint = (*rng)();
+    const int testint = rng();
     CPPUNIT_ASSERT_MESSAGE("randon number from uniform_smallint is out of [0:9]!", testint >= 0);
     CPPUNIT_ASSERT_MESSAGE("randon number from uniform_smallint is out of [0:9]!", testint <= 9);
   }
-  delete rng;
 }
Index: src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.hpp
===================================================================
--- src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.hpp	(revision 5347cd4e514abf1b1aa9c7c234f7ba2c0622c8fd)
+++ src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.hpp	(revision 311da7bdf02dce8825b29e60fbe79e0688c15ca6)
@@ -20,5 +20,5 @@
 {
   CPPUNIT_TEST_SUITE( RandomNumberGeneratorTest );
-  CPPUNIT_TEST ( PrototypeCopyTest );
+  CPPUNIT_TEST ( PrototypeNonCopyTest );
   CPPUNIT_TEST ( Range_uniform_smallint_Test );
   CPPUNIT_TEST_SUITE_END();
@@ -28,5 +28,5 @@
   void tearDown();
 
-  void PrototypeCopyTest();
+  void PrototypeNonCopyTest();
   void Range_uniform_smallint_Test();
 
