diff --git a/modules/mol/mm/examples/gb_example_traj.dcd b/modules/mol/mm/examples/gb_example_traj.dcd
index f2dda449862fad41d41373d4ec76e52b72617d76..a3b16707652ff63865c1e1068966cc29d9f0dd9f 100644
Binary files a/modules/mol/mm/examples/gb_example_traj.dcd and b/modules/mol/mm/examples/gb_example_traj.dcd differ
diff --git a/modules/mol/mm/pymod/export_openmm.cc b/modules/mol/mm/pymod/export_openmm.cc
index 7c97b7964854d551106ff1d07f68da85915194f9..1d3d73d73af88bd203b0095e7ed6b0a81ec5df7c 100644
--- a/modules/mol/mm/pymod/export_openmm.cc
+++ b/modules/mol/mm/pymod/export_openmm.cc
@@ -18,10 +18,9 @@
 //------------------------------------------------------------------------------
 #include <OpenMM.h>
 #include <boost/python.hpp>
-#include <ost/mol/mm/simulation.hh>
 
 using namespace boost::python;
-using namespace ost::mol::mm;
+
 
 
 void export_OpenMM()
@@ -31,16 +30,11 @@ void export_OpenMM()
   class_<OpenMM::Integrator, boost::noncopyable>("Integrator",no_init)
     .def("GetConstraintTolerance",&OpenMM::Integrator::getConstraintTolerance)
     .def("SetConstraintTolerance",&OpenMM::Integrator::setConstraintTolerance)
-
   ;
-  boost::python::register_ptr_to_python<ost::mol::mm::IntegratorPtr>();
-
 
-  class_<OpenMM::VerletIntegrator, bases<OpenMM::Integrator> >("VerletIntegrator", init<Real>());
-  boost::python::register_ptr_to_python<ost::mol::mm::VerletIntegratorPtr>();
+  class_<OpenMM::VerletIntegrator, bases<OpenMM::Integrator> >("VerletIntegrator", init<double>());
 
-
-  class_<OpenMM::BrownianIntegrator, bases<OpenMM::Integrator> >("BrownianIntegrator", init<Real,Real,Real>())
+  class_<OpenMM::BrownianIntegrator, bases<OpenMM::Integrator> >("BrownianIntegrator", init<double,double,double>())
     .def("GetTemperature",&OpenMM::BrownianIntegrator::getTemperature)
     .def("SetTemperature",&OpenMM::BrownianIntegrator::setTemperature)
     .def("GetFriction",&OpenMM::BrownianIntegrator::getFriction)
@@ -48,10 +42,8 @@ void export_OpenMM()
     .def("GetRandomNumberSeed",&OpenMM::BrownianIntegrator::getRandomNumberSeed)
     .def("SetRandomNumberSeed",&OpenMM::BrownianIntegrator::setRandomNumberSeed)
   ;
-  boost::python::register_ptr_to_python<ost::mol::mm::BrownianIntegratorPtr>();
-
 
-  class_<OpenMM::LangevinIntegrator, bases<OpenMM::Integrator> >("LangevinIntegrator", init<Real,Real,Real>())
+  class_<OpenMM::LangevinIntegrator, bases<OpenMM::Integrator> >("LangevinIntegrator", init<double,double,double>())
     .def("GetTemperature",&OpenMM::LangevinIntegrator::getTemperature)
     .def("SetTemperature",&OpenMM::LangevinIntegrator::setTemperature)
     .def("GetFriction",&OpenMM::LangevinIntegrator::getFriction)
@@ -59,17 +51,13 @@ void export_OpenMM()
     .def("GetRandomNumberSeed",&OpenMM::LangevinIntegrator::getRandomNumberSeed)
     .def("SetRandomNumberSeed",&OpenMM::LangevinIntegrator::setRandomNumberSeed)
   ;
-  boost::python::register_ptr_to_python<ost::mol::mm::LangevinIntegratorPtr>();
-
 
-  class_<OpenMM::VariableVerletIntegrator, bases<OpenMM::Integrator> >("VariableVerletIntegrator",init<Real>())
+  class_<OpenMM::VariableVerletIntegrator, bases<OpenMM::Integrator> >("VariableVerletIntegrator",init<double>())
     .def("GetErrorTolerance", &OpenMM::VariableVerletIntegrator::getErrorTolerance)
     .def("SetErrorTolerance", &OpenMM::VariableVerletIntegrator::setErrorTolerance)
   ;
-  boost::python::register_ptr_to_python<ost::mol::mm::VariableVerletIntegratorPtr>();
 
-
-  class_<OpenMM::VariableLangevinIntegrator, bases<OpenMM::Integrator> >("VaribaleLangevinIntegrator", init<Real,Real,Real>())
+  class_<OpenMM::VariableLangevinIntegrator, bases<OpenMM::Integrator> >("VaribaleLangevinIntegrator", init<double,double,double>())
     .def("GetTemperature",&OpenMM::VariableLangevinIntegrator::getTemperature)
     .def("SetTemperature",&OpenMM::VariableLangevinIntegrator::setTemperature)
     .def("GetFriction",&OpenMM::VariableLangevinIntegrator::getFriction)
@@ -79,15 +67,4 @@ void export_OpenMM()
     .def("GetErrorTolerance",&OpenMM::VariableLangevinIntegrator::getErrorTolerance)
     .def("SetErrorTolerance",&OpenMM::VariableLangevinIntegrator::setErrorTolerance)
   ;
-  boost::python::register_ptr_to_python<ost::mol::mm::VariableLangevinIntegratorPtr>();
-
-  enum_<OpenMM::NonbondedForce::NonbondedMethod>("NonbondedMethod")
-    .value("NoCutoff", OpenMM::NonbondedForce::NoCutoff)
-    .value("CutoffNonPeriodic", OpenMM::NonbondedForce::CutoffNonPeriodic)
-    .value("CutoffPeriodic", OpenMM::NonbondedForce::CutoffPeriodic)
-    .value("Ewald", OpenMM::NonbondedForce::Ewald)
-    .value("PME", OpenMM::NonbondedForce::PME)
-  ;
-
-
-}
\ No newline at end of file
+}
diff --git a/modules/mol/mm/pymod/export_settings.cc b/modules/mol/mm/pymod/export_settings.cc
index a5dfc2811936245ed4347f479af9b456c39c7749..42af757fcbf04c77909317881f22c9e99551d49c 100644
--- a/modules/mol/mm/pymod/export_settings.cc
+++ b/modules/mol/mm/pymod/export_settings.cc
@@ -18,6 +18,7 @@
 //------------------------------------------------------------------------------
 #include <boost/python.hpp>
 #include <ost/mol/mm/mm_settings.hh>
+#include <OpenMM.h> //for definition of Integrator
 
 using namespace boost::python;
 
@@ -32,6 +33,14 @@ void export_MMSettings()
     .value("CPU", ost::mol::mm::CPU)
   ;
 
+  enum_<ost::mol::mm::NonbondedMethod>("NonbondedMethod")
+    .value("NoCutoff", ost::mol::mm::NoCutoff)
+    .value("CutoffNonPeriodic", ost::mol::mm::CutoffNonPeriodic)
+    .value("CutoffPeriodic", ost::mol::mm::CutoffPeriodic)
+    .value("Ewald", ost::mol::mm::Ewald)
+    .value("PME", ost::mol::mm::PME)
+  ;
+
   //export the termini exceptions object
   class_<ost::mol::mm::TerminiExceptions>("TerminiExceptions",init<>())
     .def("SetException", &ost::mol::mm::TerminiExceptions::SetException)
@@ -39,7 +48,6 @@ void export_MMSettings()
     .def("GetException", &ost::mol::mm::TerminiExceptions::GetException)
   ;
 
-
   //export the settings
 
   class_<ost::mol::mm::MMSettings>("MMSettings",init<>())
diff --git a/modules/mol/mm/src/mm_observer.cc b/modules/mol/mm/src/mm_observer.cc
index a8c4da9ee2448f8a7c4a2a380046bf3005c74589..c8af30c1288e91cbbbc1b7d5426777b324d955ff 100644
--- a/modules/mol/mm/src/mm_observer.cc
+++ b/modules/mol/mm/src/mm_observer.cc
@@ -1,4 +1,5 @@
 #include <ost/mol/mm/mm_observer.hh>
+#include <OpenMM.h>
 
 namespace ost { namespace mol{ namespace mm{
 
@@ -121,6 +122,8 @@ void TrajWriter::Notify(){
   OpenMM::State openmm_state = context_->getState(0); //create minimal state
                                                       //to only extract periodic
                                                       //box information
+  OpenMM::Vec3 ucell_a,ucell_b,ucell_c;
+
   openmm_state.getPeriodicBoxVectors(ucell_a,ucell_b,ucell_c);
 
   int32_t out_n=positions.size()*4;
diff --git a/modules/mol/mm/src/mm_observer.hh b/modules/mol/mm/src/mm_observer.hh
index 1e95f092ce08f16ded321c53ee182d124ad2fae0..eec055472e9500ede28edf4eb398ca2c1acd0bc4 100644
--- a/modules/mol/mm/src/mm_observer.hh
+++ b/modules/mol/mm/src/mm_observer.hh
@@ -2,8 +2,6 @@
 #define OST_MM_OBSERVER_HH
 
 
-#include <OpenMM.h>
-
 #include <boost/shared_ptr.hpp>
 
 #include <ost/io/mol/io_profile.hh>
@@ -15,6 +13,11 @@
 #include <ost/mol/mm/topology.hh>
 #include <ost/mol/mm/mm_modeller.hh>
 
+namespace OpenMM{
+  class Context; //hacky way of telling the Context is around.
+                 //will be included in source file to avoid
+                 //dependencies on external libraries
+}
 
 namespace ost { namespace mol{ namespace mm{
 
@@ -25,6 +28,7 @@ typedef boost::shared_ptr<MMObserver> MMObserverPtr;
 typedef boost::shared_ptr<TrajObserver> TrajObserverPtr;
 typedef boost::shared_ptr<TrajWriter> TrajWriterPtr;
 
+
 class MMObserver{
 public:
 
@@ -101,9 +105,6 @@ private:
   std::vector<float> x;
   std::vector<float> y;
   std::vector<float> z;
-  OpenMM::Vec3 ucell_a;
-  OpenMM::Vec3 ucell_b;
-  OpenMM::Vec3 ucell_c;
 };
 
 
diff --git a/modules/mol/mm/src/mm_settings.hh b/modules/mol/mm/src/mm_settings.hh
index a4db474c9cba97def669dab03a90257d317b9ef5..a289d22fad3020f806fb327930f70199a0460ca1 100644
--- a/modules/mol/mm/src/mm_settings.hh
+++ b/modules/mol/mm/src/mm_settings.hh
@@ -1,7 +1,6 @@
 #ifndef OST_MM_SETTINGS_HH
 #define OST_MM_SETTINGS_HH
 
-#include <OpenMM.h>
 #include <vector>
 
 #include <boost/shared_ptr.hpp>
@@ -9,6 +8,11 @@
 #include <ost/mol/residue_handle.hh>
 #include <ost/mol/mm/forcefield.hh>
 
+namespace OpenMM{
+  class Integrator;//hacky way of telling the Integrator us around
+                   //will be included in source file to avoid
+                   //dependencies on external libraries
+}
 
 namespace ost { namespace mol{ namespace mm{
 
@@ -24,6 +28,13 @@ enum Platform{
   CPU
 };
 
+enum NonbondedMethod{
+  NoCutoff,
+  CutoffNonPeriodic,
+  CutoffPeriodic,
+  Ewald,
+  PME
+};
 
 class TerminiExceptions{
 
@@ -71,7 +82,7 @@ struct MMSettings{
                 fix_heavy_atoms(false),
                 kill_electrostatics(false),
                 generate_disulfid_bonds(true),
-                nonbonded_method(OpenMM::NonbondedForce::NoCutoff),
+                nonbonded_method(NoCutoff),
                 nonbonded_cutoff(10.0),
                 remove_cmm_motion(true),
                 cmm_frequency(1),
@@ -93,8 +104,8 @@ struct MMSettings{
                 solute_dielectric(1.0), //this is for GBSA
                 reaction_field_dielectric(78.3),
                 use_dispersion_correction(true),
-                openmm_plugin_directory(OpenMM::Platform::getDefaultPluginsDirectory()),
-                custom_plugin_directory(OpenMM::Platform::getDefaultPluginsDirectory())
+                openmm_plugin_directory("/usr/local/openmm/lib/plugins"),
+                custom_plugin_directory("/usr/local/openmm/lib/plugins")
 
                   {   }
 
@@ -118,7 +129,7 @@ struct MMSettings{
   //automatically generate disulfid bonds
   bool generate_disulfid_bonds;
   //see export_openmm.cc for all possibilities
-  OpenMM::NonbondedForce::NonbondedMethod nonbonded_method;
+  NonbondedMethod nonbonded_method;
   Real nonbonded_cutoff;
   bool remove_cmm_motion;
   int cmm_frequency;
diff --git a/modules/mol/mm/src/simulation.cc b/modules/mol/mm/src/simulation.cc
index 26a03e933eec7cb352f213dae661813dbaf592b6..2400a5219c73fdeea89f9ba3b75f1dcc9475fdbc 100644
--- a/modules/mol/mm/src/simulation.cc
+++ b/modules/mol/mm/src/simulation.cc
@@ -1,4 +1,5 @@
 #include <ost/mol/mm/simulation.hh>
+#include <OpenMM.h>
 
 namespace ost{ namespace mol{ namespace mm{
 
diff --git a/modules/mol/mm/src/simulation.hh b/modules/mol/mm/src/simulation.hh
index 14c835d95f8a0dd755cc7d17994e5e08a897d0fc..e1344c842dc8e0c8092b0e70cf7bad1dc25155ac 100644
--- a/modules/mol/mm/src/simulation.hh
+++ b/modules/mol/mm/src/simulation.hh
@@ -1,8 +1,6 @@
 #ifndef OST_SIMULATION_HH
 #define OST_SIMULATION_HH
 
-#include <OpenMM.h>
-
 #include <vector>
 #include <map>
 
@@ -21,20 +19,20 @@
 
 #include <time.h>
 
+namespace OpenMM{
+  class Integrator;
+  class Context;//hacky way of telling the Context and Integrator 
+                //are around.
+                //will be included in source file to avoid
+                //dependencies on external libraries
+}
+
 namespace ost { namespace mol{ namespace mm{
 
 class Simulation;
 
 typedef boost::shared_ptr<OpenMM::Integrator> IntegratorPtr;
-typedef boost::shared_ptr<OpenMM::VerletIntegrator> VerletIntegratorPtr;
-typedef boost::shared_ptr<OpenMM::BrownianIntegrator> BrownianIntegratorPtr;
-typedef boost::shared_ptr<OpenMM::LangevinIntegrator> LangevinIntegratorPtr;
-typedef boost::shared_ptr<OpenMM::VariableVerletIntegrator> VariableVerletIntegratorPtr;
-typedef boost::shared_ptr<OpenMM::VariableLangevinIntegrator> VariableLangevinIntegratorPtr;
 typedef boost::shared_ptr<OpenMM::Context> ContextPtr;
-typedef boost::shared_ptr<OpenMM::AndersenThermostat> AndersenThermostatPtr;
-typedef boost::shared_ptr<OpenMM::MonteCarloBarostat> MonteCarloBarostatPtr;
-
 typedef boost::shared_ptr<Simulation> SimulationPtr;
 
 class Simulation {
diff --git a/modules/mol/mm/src/state_extractor.cc b/modules/mol/mm/src/state_extractor.cc
index 72043b2aeb190805335c1ba1927d4fe3bb94055a..968f5db34a5fd59da66a8018d2bf3296cfcf8730 100644
--- a/modules/mol/mm/src/state_extractor.cc
+++ b/modules/mol/mm/src/state_extractor.cc
@@ -1,5 +1,5 @@
 #include <ost/mol/mm/state_extractor.hh>
-
+#include <OpenMM.h>
 
 namespace ost { namespace mol{ namespace mm{
 
diff --git a/modules/mol/mm/src/state_extractor.hh b/modules/mol/mm/src/state_extractor.hh
index 6b77c554ef53d9b3228e2beb421e044e7e09b288..f8c1f188cb9562cc8cdd660de12b537eca6a9abc 100644
--- a/modules/mol/mm/src/state_extractor.hh
+++ b/modules/mol/mm/src/state_extractor.hh
@@ -4,10 +4,14 @@
 #include <vector>
 
 #include <boost/shared_ptr.hpp>
-#include <OpenMM.h>
 #include <ost/geom/vec3.hh>
 
+namespace OpenMM{
+  class Context; //hacky way of telling the Context is around.
+                 //will be included in source file to avoid
+                 //dependencies on external libraries
 
+}
 
 namespace ost { namespace mol{ namespace mm{
 
diff --git a/modules/mol/mm/src/steep.cc b/modules/mol/mm/src/steep.cc
index d201c010ad519dc1e1c7234461c043540d4c530e..b33d5fb09823dbbd4a8c718f21627dc78d24eb24 100644
--- a/modules/mol/mm/src/steep.cc
+++ b/modules/mol/mm/src/steep.cc
@@ -1,4 +1,5 @@
 #include <ost/mol/mm/steep.hh>
+#include <OpenMM.h>
 
 namespace ost{ namespace mol{ namespace mm{
 
diff --git a/modules/mol/mm/src/steep.hh b/modules/mol/mm/src/steep.hh
index cc6ca3af627ed61269cdc2aa4cb552a098315e2a..567f46583b7289d492ff703f75adea2a84fafea6 100644
--- a/modules/mol/mm/src/steep.hh
+++ b/modules/mol/mm/src/steep.hh
@@ -1,7 +1,6 @@
 #ifndef OST_STEEP_H_
 #define OST_STEEP_H_
 
-#include <OpenMM.h>
 #include <ost/base.hh>
 #include <cmath>
 #include <sstream>
@@ -12,6 +11,11 @@
 
 #include <ost/message.hh>
 
+namespace OpenMM{
+  class Context; //hacky way of telling the Context is around.
+                 //will be included in source file to avoid
+                 //dependencies on external libraries
+}
 
 namespace ost { namespace mol { namespace mm{
 
diff --git a/modules/mol/mm/src/system_creator.cc b/modules/mol/mm/src/system_creator.cc
index 84b592a39d4b17cf1f1c3d4fe284ae840a60be5d..4c7eabd90a3435f5ffb1423b0e925e7e61b2e338 100644
--- a/modules/mol/mm/src/system_creator.cc
+++ b/modules/mol/mm/src/system_creator.cc
@@ -1,4 +1,5 @@
 #include <ost/mol/mm/system_creator.hh>
+#include <OpenMM.h>
 
 namespace ost{ namespace mol{ namespace mm{
 
@@ -221,7 +222,28 @@ SystemPtr SystemCreator::Create(const TopologyPtr top,
   std::vector<Real> charges = top->GetCharges();
   if(!sigmas.empty() && !epsilons.empty() && !charges.empty()){
     OpenMM::NonbondedForce& nonbonded_force = *new OpenMM::NonbondedForce();
-    nonbonded_force.setNonbondedMethod(settings->nonbonded_method);
+    switch(settings->nonbonded_method){
+      case NoCutoff:{
+        nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::NoCutoff);
+        break;
+      }
+      case CutoffNonPeriodic:{
+        nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::CutoffNonPeriodic);
+        break;        
+      }
+      case CutoffPeriodic:{
+        nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::CutoffPeriodic);
+        break;        
+      }
+      case Ewald:{
+        nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::Ewald);
+        break;        
+      }
+      case PME:{
+        nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::PME);
+        break;        
+      }
+    }
     //we can set the cutoff in any case, since it will have no effect when
     //nonbonded method is NoCutoff
     nonbonded_force.setCutoffDistance(settings->nonbonded_cutoff/10.0);
@@ -263,13 +285,13 @@ SystemPtr SystemCreator::Create(const TopologyPtr top,
       throw ost::Error("GBSA force requires atom charges to be set!");
     OpenMM::GBSAOBCForce& gbsa_force = *new OpenMM::GBSAOBCForce();
     sys->addForce(&gbsa_force);
-    if(settings->nonbonded_method == OpenMM::NonbondedForce::NoCutoff){
+    if(settings->nonbonded_method == NoCutoff){
       gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::NoCutoff);
     }
-    else if(settings->nonbonded_method == OpenMM::NonbondedForce::CutoffNonPeriodic){
+    else if(settings->nonbonded_method == CutoffNonPeriodic){
       gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::CutoffNonPeriodic);
     }
-    else if(settings->nonbonded_method == OpenMM::NonbondedForce::CutoffPeriodic){
+    else if(settings->nonbonded_method == CutoffPeriodic){
       gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::CutoffPeriodic);
     }
     else{
@@ -302,8 +324,8 @@ SystemPtr SystemCreator::Create(const TopologyPtr top,
     sys->setDefaultPeriodicBoxVectors(x_vec,y_vec,z_vec);
   }
   else if(settings->add_nonbonded && 
-           !(settings->nonbonded_method == OpenMM::NonbondedForce::NoCutoff ||
-            settings->nonbonded_method == OpenMM::NonbondedForce::CutoffNonPeriodic)){
+           !(settings->nonbonded_method == NoCutoff ||
+            settings->nonbonded_method == CutoffNonPeriodic)){
     throw ost::Error("Chosen nonbonded method requires to define the periodic box extents!");
   }
   //set the CMMMotion removing force if required
diff --git a/modules/mol/mm/src/system_creator.hh b/modules/mol/mm/src/system_creator.hh
index d7fce8408530c205a11f7671fb395fd9fb5f1722..58b06b05631a936c5ec8eb9f5f8f07993d5ec9ab 100644
--- a/modules/mol/mm/src/system_creator.hh
+++ b/modules/mol/mm/src/system_creator.hh
@@ -1,8 +1,6 @@
 #ifndef OST_SYSTEM_CREATOR_HH
 #define OST_SYSTEM_CREATOR_HH
 
-#include <OpenMM.h>
-
 #include <vector>
 #include <map>
 #include <set>
@@ -24,6 +22,12 @@
 #include <time.h>
 
 
+namespace OpenMM{
+  class System;  //hacky way of telling the System is around.
+                 //will be included in source file to avoid
+                 //dependencies on external libraries
+}
+
 namespace ost { namespace mol{ namespace mm{
 
 typedef boost::shared_ptr<OpenMM::System> SystemPtr;
diff --git a/modules/mol/mm/src/topology_creator.hh b/modules/mol/mm/src/topology_creator.hh
index 52cd37938c25537418e6561897c929f95101c20e..160590755bdb528c675cd28774e51debeb616130 100644
--- a/modules/mol/mm/src/topology_creator.hh
+++ b/modules/mol/mm/src/topology_creator.hh
@@ -1,8 +1,6 @@
 #ifndef OST_TOPOLOGY_CREATOR_HH
 #define OST_TOPOLOGY_CREATOR_HH
 
-#include <OpenMM.h>
-
 #include <vector>
 #include <map>
 #include <set>