diff --git a/src/GaussianEMRestraint.cpp b/src/GaussianEMRestraint.cpp
index 8bf9e0df0bd8043e8abc8e97cff7aa81bc7cbad9..f24ad993fb6e27b44ce5c8a90cd335e74d5ade65 100755
--- a/src/GaussianEMRestraint.cpp
+++ b/src/GaussianEMRestraint.cpp
@@ -17,6 +17,7 @@
 #include <IMP/isd/em_utilities.h>
 #include <limits>
 #include <algorithm>
+#include <IMP/core/symmetry.h>
 
 IMPBAYESIANEM_BEGIN_NAMESPACE
 
@@ -193,29 +194,47 @@ GaussianEMRestraint::unprotected_evaluate(DerivativeAccumulator *accum) const {
 }
 
 Ints get_all_indexes(IMP::core::MonteCarloMover *m, const ParticleIndexes &ref){
+	//first get indexes from the mover
+	ParticleIndexes gaussians;
 	Ints ret;
+	IMP::Model *mdl = m->get_model();
 	ModelObjectsTemp inputs = m->get_inputs();
 	for(int i(0) ; i<inputs.size() ; ++i){
 		ModelObject *o = inputs[i];
 		Particle *p = dynamic_cast<Particle *>(o);
 		if(p && IMP::core::Gaussian::get_is_setup(p)){
-			for(int j(0) ; j<ref.size() ; ++j){
-				if(p->get_index().get_index() == ref[j].get_index()){
-					ret.push_back(j);
-				}
-			}
+			gaussians.push_back(p->get_index());
 		}
 		else if(p && IMP::core::RigidBody::get_is_setup(p)){
 			ParticleIndexes pis = IMP::core::RigidBody(p).get_body_member_particle_indexes();
 			for (int k(0) ; k<pis.size() ; ++k){
-				for(int j(0) ; j<ref.size() ; ++j){
-					if(pis[k].get_index() == ref[j].get_index()){
-						ret.push_back(j);
-					}
-				}				
+				if(IMP::core::Gaussian::get_is_setup(mdl, pis[k])){
+					gaussians.push_back(pis[k]);
+				}
+			}
+		}
+	}
+	//second get references from the model
+	ParticleIndexes all_idxs = mdl->get_particle_indexes();
+	for(int i(0) ; i<all_idxs.size() ; ++i){
+		ParticleIndex pi = all_idxs[i];
+		if(IMP::core::Reference::get_is_setup(mdl, pi)){
+			IMP::core::Reference r = IMP::core::Reference(mdl, pi);
+			Particle *p = r.get_reference_particle();
+			if(std::find(gaussians.cbegin(), gaussians.cend(), p->get_index()) != gaussians.cend()){
+				gaussians.push_back(p->get_index());
 			}
 		}
 	}
+	//third intersect with the particles in ref
+	for(int i(0) ; i< gaussians.size() ; ++i){
+		for(int j(0) ; j<ref.size() ; ++j){
+			if(gaussians[i].get_index() == ref[j].get_index()){
+				ret.push_back(j);
+			}
+		}
+	}
+
 	std::sort(ret.begin(), ret.end());
 	return ret;
 }