diff --git a/sidechain/pymod/_reconstruct_sidechains.py b/sidechain/pymod/_reconstruct_sidechains.py
index 2b1601a98a380f3f293fc2c48f7e3dada105662e..f39a1bd5cfd0c8bea47874fbacf62cf54036945b 100644
--- a/sidechain/pymod/_reconstruct_sidechains.py
+++ b/sidechain/pymod/_reconstruct_sidechains.py
@@ -323,10 +323,10 @@ def _GetDisulfidBridges(frame_residues, cystein_indices, res_list, rotamer_libra
             continue
         cys_ca_positions.append(ca.GetPos())
         cys_cb_positions.append(cb.GetPos())
-        # get RotamerGroup
+        # get RotamerGroup in case of disulfids, we do FRM in any case
         rot_group = _GetRotamerGroup(r.handle, sidechain.CYD, i, rotamer_library,
                                      rotamer_constructor, phi_angles[i],
-                                     psi_angles[i], use_frm, bbdep)
+                                     psi_angles[i], True, bbdep)
         rot_group.AddFrameEnergy(frame)
         cystein_rot_groups.append(rot_group)
         indices_with_rot_groups.append(i)
diff --git a/sidechain/src/sidechain_env_listener.cc b/sidechain/src/sidechain_env_listener.cc
index 52150b9aea7de72d0307e9980dca5b8e866d98f9..89519e04bece2de9fd057828019fe6c7f6b44eeb 100644
--- a/sidechain/src/sidechain_env_listener.cc
+++ b/sidechain/src/sidechain_env_listener.cc
@@ -93,11 +93,7 @@ void SidechainEnvListener::Init(const loop::AllAtomEnv& base_env) {
   if (use_frm_) frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr());
   else          rrm_rotamer_group_.assign(num_residues, RRMRotamerGroupPtr());
   if (add_cyd_rotamers_) {
-    if (use_frm_) {
-      cyd_frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr());
-    } else {
-      cyd_rrm_rotamer_group_.assign(num_residues, RRMRotamerGroupPtr());
-    }
+    cyd_frm_rotamer_group_.assign(num_residues, FRMRotamerGroupPtr());
   }
 }
 
@@ -203,13 +199,8 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos,
       }
       // set extra cystein rotamer if needed
       if (add_cyd_rotamers_ && r_id == CYS) {
-        if (use_frm_) {
-          CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], n_pos, ca_pos,
-                             cb_pos, CYD, res_idx);
-        } else {
-          CreateRotamerGroup(cyd_rrm_rotamer_group_[res_idx], n_pos, ca_pos,
-                             cb_pos, CYD, res_idx);
-        }
+        CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], n_pos, ca_pos,
+                           cb_pos, CYD, res_idx);
       }
     }
   } else {
@@ -218,12 +209,11 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos,
       env_.Remove(&env_data_[res_idx], env_data_[res_idx].pos);
       bb_frame_residue_[res_idx].reset();
       sc_frame_residue_[res_idx].reset();
+      cyd_frm_rotamer_group_[res_idx].reset();
       if (use_frm_) {
         frm_rotamer_group_[res_idx].reset();
-        cyd_frm_rotamer_group_[res_idx].reset();
       } else {
         rrm_rotamer_group_[res_idx].reset();
-        cyd_rrm_rotamer_group_[res_idx].reset();
       }
     }
   }
diff --git a/sidechain/src/sidechain_env_listener.hh b/sidechain/src/sidechain_env_listener.hh
index 9f467ce14223413b7e7a8f44b9b134f95cb90817..ad0b411f0ef343e3691b28cf0490aad34b10c0b2 100644
--- a/sidechain/src/sidechain_env_listener.hh
+++ b/sidechain/src/sidechain_env_listener.hh
@@ -83,16 +83,19 @@ public:
     return rrm_rotamer_group_[res_idx];
   }
   FRMRotamerGroupPtr GetCydFRMRotamerGroup(uint res_idx) const {
-    if (!use_frm_) {
-      throw promod3::Error("SidechainEnvListener doesn't have FRMRotamers!");
-    }
     return cyd_frm_rotamer_group_[res_idx];
   }
   RRMRotamerGroupPtr GetCydRRMRotamerGroup(uint res_idx) const {
-    if (use_frm_) {
-      throw promod3::Error("SidechainEnvListener doesn't have RRMRotamers!");
+    // typically all disulfid evaluations are done with FRM disulfids
+    // (even when use_frm is false), so this is just a nasty fallback
+    uint num_rotamers = cyd_frm_rotamer_group_[res_idx]->size();
+    std::vector<RRMRotamerPtr> rrm_rotamers(num_rotamers);
+    for(uint i = 0; i < num_rotamers; ++i){
+      rrm_rotamers[i] = (*cyd_frm_rotamer_group_[res_idx])[i]->ToRRMRotamer(); 
     }
-    return cyd_rrm_rotamer_group_[res_idx];
+    RRMRotamerGroupPtr p(new RRMRotamerGroup(rrm_rotamers, res_idx));
+    
+    return p;
   }
   
   // for convenience: use overload to set rot_group based on type
@@ -190,7 +193,6 @@ private:
   // extra rotamer groups (r_id == CYD) for cysteins to handle disulfid bridges
   // -> constructed for res. with r_id == CYS indep. of all_rotamers_ setting!
   std::vector<FRMRotamerGroupPtr> cyd_frm_rotamer_group_;
-  std::vector<RRMRotamerGroupPtr> cyd_rrm_rotamer_group_;
 };
 
 }} // ns
diff --git a/sidechain/src/sidechain_reconstructor.cc b/sidechain/src/sidechain_reconstructor.cc
index e1f9dd10c3d5e5bd4a478bd9c909c4a5753023ff..0fa9cfb9dae8e9f0e2c61ed728ea3e5a69cd5dab 100644
--- a/sidechain/src/sidechain_reconstructor.cc
+++ b/sidechain/src/sidechain_reconstructor.cc
@@ -375,8 +375,9 @@ void SidechainReconstructor::SolveSystem_(
   // handle cysteins
   res->disulfid_bridges.clear();
   if (build_disulfids_) {
-    BuildDisulfids_<RotamerGroup>(res, cys_indices, frame_residues,
-                                  has_sidechain);
+    // we use the FRM rotamer model in any case for reconstructing disulfids
+    BuildDisulfids_<FRMRotamerGroup>(res, cys_indices, frame_residues,
+                                     has_sidechain);
   }
   
   // collect rotamers