diff --git a/modules/mol/mm/src/state_extractor.cc b/modules/mol/mm/src/state_extractor.cc
index 3bb36f7a7b3b143bba9f446c4e0f70c4acf837ae..72043b2aeb190805335c1ba1927d4fe3bb94055a 100644
--- a/modules/mol/mm/src/state_extractor.cc
+++ b/modules/mol/mm/src/state_extractor.cc
@@ -4,34 +4,37 @@
 namespace ost { namespace mol{ namespace mm{
 
 void StateExtractor::ExtractPotentialEnergy(boost::shared_ptr<OpenMM::Context> context,
-  	                        Real& energy){
+  	                                        Real& energy){
 
   OpenMM::State s = context->getState(OpenMM::State::Energy);
   energy = s.getPotentialEnergy();
 }
 
 void StateExtractor::ExtractKineticEnergy(boost::shared_ptr<OpenMM::Context> context,
-	                      Real& energy){
+	                                        Real& energy){
 
   OpenMM::State s = context->getState(OpenMM::State::Energy);
   energy = s.getKineticEnergy();
 }
 
 void StateExtractor::ExtractEnergy(boost::shared_ptr<OpenMM::Context> context,
-	               Real& energy){
+	                                 Real& energy){
 
   OpenMM::State s = context->getState(OpenMM::State::Energy);
   energy = s.getKineticEnergy() + s.getPotentialEnergy();
 }
 
 void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context,
-	                    geom::Vec3List& positions, bool enforce_periodic_box, bool in_angstrom){
+	                                    geom::Vec3List& positions, bool enforce_periodic_box, 
+                                      bool in_angstrom){
 
-  positions.clear();
+  positions.resize(context->getSystem().getNumParticles());
   OpenMM::State s = context->getState(OpenMM::State::Positions, enforce_periodic_box);
-  std::vector<OpenMM::Vec3> p = s.getPositions();
-  for(std::vector<OpenMM::Vec3>::iterator i = p.begin(); i != p.end(); ++i){
-    positions.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2]));
+  const std::vector<OpenMM::Vec3>& p = s.getPositions();
+  int actual_index = 0;
+  for(std::vector<OpenMM::Vec3>::const_iterator i = p.begin(); i != p.end(); ++i){
+    positions[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]);
+    ++actual_index;
   }
   if(in_angstrom) positions*=10.0;
 }
@@ -39,22 +42,26 @@ void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context
 void StateExtractor::ExtractVelocities(boost::shared_ptr<OpenMM::Context> context,
 	                                     geom::Vec3List& velocities){
 
-  velocities.clear();
+  velocities.resize(context->getSystem().getNumParticles());
   OpenMM::State s = context->getState(OpenMM::State::Velocities);
-  std::vector<OpenMM::Vec3> v = s.getVelocities();
-  for(std::vector<OpenMM::Vec3>::iterator i = v.begin(); i != v.end(); ++i){
-    velocities.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2]));
+  const std::vector<OpenMM::Vec3>& v = s.getVelocities();
+  int actual_index = 0;
+  for(std::vector<OpenMM::Vec3>::const_iterator i = v.begin(); i != v.end(); ++i){
+    velocities[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]);
+    ++actual_index;
   }
 }
 
 void StateExtractor::ExtractForces(boost::shared_ptr<OpenMM::Context> context,
-	               geom::Vec3List& forces){
+	                                 geom::Vec3List& forces){
 
-  forces.clear();
+  forces.resize(context->getSystem().getNumParticles());
   OpenMM::State s = context->getState(OpenMM::State::Forces);
-  std::vector<OpenMM::Vec3> f = s.getForces();
-  for(std::vector<OpenMM::Vec3>::iterator i = f.begin(); i != f.end(); ++i){
-    forces.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2]));
+  const std::vector<OpenMM::Vec3>& f = s.getForces();
+  int actual_index = 0;
+  for(std::vector<OpenMM::Vec3>::const_iterator i = f.begin(); i != f.end(); ++i){
+    forces[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]);
+    ++actual_index;
   }
 }