diff --git a/doc/tests/scripts/sidechain_steps.py b/doc/tests/scripts/sidechain_steps.py
index bf1a3866356d84db21819df5fa63218a41575b58..aa903d2477f57fcdaee574060afddb3b6c4a013e 100644
--- a/doc/tests/scripts/sidechain_steps.py
+++ b/doc/tests/scripts/sidechain_steps.py
@@ -6,8 +6,8 @@ prot = io.LoadPDB('data/1CRN.pdb')
 # load rotamer library
 library = sidechain.LoadDunbrackLib()
 # we need a rotamer constructor to create any rotamers or 
-# frame residues
-rot_constructor = sidechain.SCWRLRotamerConstructor()
+# frame residues 
+rot_constructor = sidechain.SCWRLRotamerConstructor(False)
 
 # create new entity from protein only containing the amino acids
 prot = mol.CreateEntityFromView(prot.Select("peptide=true"), True)
diff --git a/modelling/pymod/_reconstruct_sidechains.py b/modelling/pymod/_reconstruct_sidechains.py
index 26d31567bb76a95dd5703e3da840a77b937e70f5..cc465d832149d465348823cbfc67db6386235b93 100644
--- a/modelling/pymod/_reconstruct_sidechains.py
+++ b/modelling/pymod/_reconstruct_sidechains.py
@@ -1,5 +1,6 @@
 from ost import geom, mol, conop
 from promod3 import core, sidechain
+import traceback
 
 ###############################################################################
 # helper functions
@@ -10,7 +11,6 @@ def _GetRotamerIDs(res_list):
         rot_id = sidechain.TLCToRotID(r.GetName())
         if rot_id == sidechain.XXX:
             continue # no idea what it is, so we stick with ALA 
-                     # => don't model sidechain
         rotamer_ids[i] = rot_id
     return rotamer_ids
 
@@ -105,12 +105,11 @@ def _AddLigandFrameResidues(frame_residues, ent_lig, rotamer_constructor, offset
                     fr1 = rotamer_constructor.ConstructBackboneFrameResidue(\
                               res.handle, rot_id, res_idx,
                               phi, n_ter, c_ter)
-                    if rot_id != sidechain.ALA and rot_id != sidechain.GLY:
-                        fr2 = rotamer_constructor.ConstructSidechainFrameResidue(\
-                                  res.handle, rot_id, res_idx)
-                        frame_residues.extend([fr1,fr2])
-                    else:
-                        frame_residues.append(fr1)
+
+                    fr2 = rotamer_constructor.ConstructSidechainFrameResidue(\
+                              res.handle, rot_id, res_idx)
+
+                    frame_residues.extend([fr1,fr2])
                 except:
                     pass   # ignore peptide treatment and treat below
                 else:
@@ -148,9 +147,6 @@ def _AddSidechainFrameResidues(frame_residues, incomplete_sidechains,
                 cystein_indices.append(i)
                 continue
 
-            if rotamer_ids[i] == sidechain.ALA or rotamer_ids[i] == sidechain.GLY:
-                continue # no sidechain to model
-
             try:
                 frame_residue = rotamer_constructor.ConstructSidechainFrameResidue(\
                                     r.handle, rotamer_ids[i], i)
@@ -166,9 +162,6 @@ def _AddSidechainFrameResidues(frame_residues, incomplete_sidechains,
                 cystein_indices.append(i)
                 continue
 
-            if rotamer_ids[i] == sidechain.ALA or rotamer_ids[i] == sidechain.GLY:
-                continue # no sidechain to model
-
             incomplete_sidechains.append(i)
 
 def _AddCysteinFrameResidues(frame_residues, incomplete_sidechains,
@@ -231,7 +224,7 @@ def _GetRotamerGroups(res_list, rot_ids, indices, rot_lib, rot_constructor,
                       phi_angles, psi_angles, use_frm, bbdep, frame_residues):
     '''Get list of rotamer groups from subset of res_list.
     Residues are chosen as res_list[i] for i in indices and only if a rotamer
-    group can be created (e.g. no ALA, GLY).
+    group can be created.
     Rotamer groups are filtered to keep only best ones (given frame).
     Returns list of rotamer groups and list of res. indices they belong to.
     '''
@@ -249,9 +242,6 @@ def _GetRotamerGroups(res_list, rot_ids, indices, rot_lib, rot_constructor,
         # get rotamer ID
         r = res_list[i]
         rot_id = rot_ids[i]
-        
-        if rot_id == sidechain.ALA or rot_id == sidechain.GLY:
-            continue
 
         if rot_id == sidechain.CYS:
             rot_id = sidechain.CYH
@@ -442,7 +432,7 @@ def ReconstructSidechains(ent, keep_sidechains=False, build_disulfids=True,
     if type(rotamer_library) is sidechain.BBDepRotamerLib:
         bbdep = True
 
-    rotamer_constructor = sidechain.SCWRLRotamerConstructor()
+    rotamer_constructor = sidechain.SCWRLRotamerConstructor(False)
     
     # take out ligand chain and any non-peptides
     prot = ent.Select("peptide=true and cname!='_'")
diff --git a/modelling/src/sidechain_env_listener.cc b/modelling/src/sidechain_env_listener.cc
index 18a1297eef220f6b2aa55227a17038b918216282..d72e09f30a9c918c87d1569aabe9be055c6de17f 100644
--- a/modelling/src/sidechain_env_listener.cc
+++ b/modelling/src/sidechain_env_listener.cc
@@ -150,10 +150,7 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos,
   // we only add data if BB is set
   if (bb_set) {
     // get positions
-    const geom::Vec3& n_pos  = all_pos->GetPos(idx_N);
     const geom::Vec3& ca_pos = all_pos->GetPos(idx_CA);
-    const geom::Vec3& c_pos  = all_pos->GetPos(idx_C);
-    const geom::Vec3& o_pos  = all_pos->GetPos(idx_O);
     geom::Vec3 cb_pos;
     if (r_id != sidechain::GLY)  cb_pos = all_pos->GetPos(idx_CB);
     
@@ -177,36 +174,33 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos,
 
     // set backbone frame res.
     bb_frame_residue_[res_idx]
-      = rot_constructor_.ConstructBackboneFrameResidue(n_pos, ca_pos, c_pos, 
-                                                       o_pos, cb_pos,
+      = rot_constructor_.ConstructBackboneFrameResidue(*all_pos, res_idx, 
                                                        r_id, res_idx, 
                                                        phi_angle_[res_idx], 
                                                        n_ter_[res_idx], 
                                                        c_ter_[res_idx]);
     
-    // do we have a sidechain?
-    if (r_id != sidechain::ALA && r_id != sidechain::GLY) {
-      // set sidechain frame res. if all set
-      if (all_set) {
-        sc_frame_residue_[res_idx]
-          = rot_constructor_.ConstructSidechainFrameResidue(*all_pos, res_idx, 
-                                                            r_id, res_idx);
-      } else {
-        sc_frame_residue_[res_idx].reset();
-      }
-      // set rotamer if needed
-      if (all_rotamers_ || !all_set) {
-        SetRotamer_(all_pos, n_pos, ca_pos, cb_pos, r_id, res_idx);
-      } else {
-        if (use_frm_) frm_rotamer_group_[res_idx].reset();
-        else          rrm_rotamer_group_[res_idx].reset();
-      }
-      // set extra cystein rotamer if needed
-      if (add_cyd_rotamers_ && r_id == sidechain::CYS) {
-        CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], n_pos, ca_pos,
-                           cb_pos, sidechain::CYD, res_idx);
-      }
+    // set sidechain frame res. if all set
+    if (all_set) {
+      sc_frame_residue_[res_idx]
+        = rot_constructor_.ConstructSidechainFrameResidue(*all_pos, res_idx, 
+                                                           r_id, res_idx);
+    } else {
+      sc_frame_residue_[res_idx].reset();
+    }
+    // set rotamer if needed
+    if (all_rotamers_ || !all_set) {
+      SetRotamer_(all_pos, r_id, res_idx);
+    } else {
+      if (use_frm_) frm_rotamer_group_[res_idx].reset();
+      else          rrm_rotamer_group_[res_idx].reset();
     }
+    // set extra cystein rotamer if needed
+    if (add_cyd_rotamers_ && r_id == sidechain::CYS) {
+      CreateRotamerGroup(cyd_frm_rotamer_group_[res_idx], all_pos,
+                         sidechain::CYD, res_idx);
+    }
+    
   } else {
     // clear stuff
     if (bb_frame_residue_[res_idx]) {
@@ -224,9 +218,6 @@ void SidechainEnvListener::SetResidue_(loop::ConstAllAtomPositionsPtr all_pos,
 }
 
 void SidechainEnvListener::SetRotamer_(loop::ConstAllAtomPositionsPtr all_pos,
-                                       const geom::Vec3& n_pos,
-                                       const geom::Vec3& ca_pos,
-                                       const geom::Vec3& cb_pos,
                                        const sidechain::RotamerID r_id,
                                        const uint res_idx) {
   // add rotamer anyways -> potentially need to change ID
@@ -245,10 +236,10 @@ void SidechainEnvListener::SetRotamer_(loop::ConstAllAtomPositionsPtr all_pos,
   //    -> same with RRM:         0.30s
   //    -> RRM w/o BBdep:         0.23s
   if (use_frm_) {
-    CreateRotamerGroup(frm_rotamer_group_[res_idx], n_pos, ca_pos, cb_pos,
+    CreateRotamerGroup(frm_rotamer_group_[res_idx], all_pos,
                        rg_r_id, res_idx);
   } else {
-    CreateRotamerGroup(rrm_rotamer_group_[res_idx], n_pos, ca_pos, cb_pos,
+    CreateRotamerGroup(rrm_rotamer_group_[res_idx], all_pos,
                        rg_r_id, res_idx);
   }
 }
diff --git a/modelling/src/sidechain_env_listener.hh b/modelling/src/sidechain_env_listener.hh
index a35a0b36b8f18f7a497ec8c27f70739fda4576bf..2f8c14a1349f80b6d36464debc298b7aa3161d01 100644
--- a/modelling/src/sidechain_env_listener.hh
+++ b/modelling/src/sidechain_env_listener.hh
@@ -119,40 +119,33 @@ public:
 
   // create a rotamer group based on internal settings (no use_frm_ check!)
   void CreateRotamerGroup(sidechain::FRMRotamerGroupPtr& rot_group,
-                          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                          const geom::Vec3& cb_pos, 
+                          loop::ConstAllAtomPositionsPtr all_pos, 
                           const sidechain::RotamerID r_id, const uint res_idx) {
     if (use_bbdep_lib_) {
-      rot_group = rot_constructor_.ConstructFRMRotamerGroup(n_pos, ca_pos, 
-                                                            cb_pos, r_id, 
-                                                            res_idx,
+      rot_group = rot_constructor_.ConstructFRMRotamerGroup(*all_pos, res_idx, 
+                                                            r_id, res_idx,
                                                             bbdep_library_,
                                                             phi_angle_[res_idx],
                                                             psi_angle_[res_idx]);
     } else {
-      rot_group = rot_constructor_.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos, 
+      rot_group = rot_constructor_.ConstructFRMRotamerGroup(*all_pos, res_idx, 
                                                             r_id, res_idx,
                                                             library_);
     }
     rot_constructor_.AssignInternalEnergies(rot_group);
   }
   void CreateRotamerGroup(sidechain::RRMRotamerGroupPtr& rot_group,
-                          const geom::Vec3& n_pos, 
-                          const geom::Vec3& ca_pos,
-                          const geom::Vec3& cb_pos, 
-                          const sidechain::RotamerID r_id,
-                          const uint res_idx) {
+                          loop::ConstAllAtomPositionsPtr all_pos, 
+                          const sidechain::RotamerID r_id, const uint res_idx) {
     if (use_bbdep_lib_) {
-      rot_group = rot_constructor_.ConstructRRMRotamerGroup(n_pos, ca_pos, 
-                                                            cb_pos, r_id, 
-                                                            res_idx,
+      rot_group = rot_constructor_.ConstructRRMRotamerGroup(*all_pos, res_idx,
+                                                            r_id, res_idx,
                                                             bbdep_library_,
                                                             phi_angle_[res_idx],
                                                             psi_angle_[res_idx]);
     } else {
-      rot_group = rot_constructor_.ConstructRRMRotamerGroup(n_pos, ca_pos, 
-                                                            cb_pos, r_id, 
-                                                            res_idx,
+      rot_group = rot_constructor_.ConstructRRMRotamerGroup(*all_pos, res_idx,
+                                                            r_id, res_idx,
                                                             library_);
     }
     rot_constructor_.AssignInternalEnergies(rot_group);
@@ -163,9 +156,7 @@ private:
   // set stuff for one residue
   void SetResidue_(loop::ConstAllAtomPositionsPtr all_pos, const uint res_idx);
   void SetRotamer_(loop::ConstAllAtomPositionsPtr all_pos,
-                   const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                   const geom::Vec3& cb_pos, const sidechain::RotamerID r_id,
-                   const uint res_idx);
+                   const sidechain::RotamerID r_id, const uint res_idx);
 
   // global data
   bool all_rotamers_;  // construct rotamers for all res. with BB instead of
@@ -185,8 +176,8 @@ private:
   
   // dynamic data per residue
   // -> any data only set if BB set ("if (bb_frame_residue_[res_idx]) ...")
-  // -> sc_frame_residue set if not ALA/GLY and all pos. available
-  // -> xxx_rotamer_group set if not ALA/GLY and atoms missing or all_rotamers_
+  // -> sc_frame_residue set if not GLY and all pos. available
+  // -> xxx_rotamer_group set if no atoms are missing or all_rotamers_
   //    -> if use_frm_, only xxx = frm valid, else, only xxx = rrm
   //    -> CalculateInternalEnergies done for all rotamer groups
   ScCBetaSpatialOrganizerItem* env_data_;
diff --git a/sidechain/doc/rotamer_constructor.rst b/sidechain/doc/rotamer_constructor.rst
index 316c0aba0559e2c0061d8a5ed23641967093a00f..2f9d7479e9cb43e9e6c052f2e8df1d524a19eeff 100644
--- a/sidechain/doc/rotamer_constructor.rst
+++ b/sidechain/doc/rotamer_constructor.rst
@@ -11,22 +11,33 @@ Constructing Rotamers and Frame Residues
 --------------------------------------------------------------------------------
 
 
-.. class:: SCWRLRotamerConstructor()
+.. class:: SCWRLRotamerConstructor(cb_in_sidechain)
 
   Constructing rotamers and frame residues that are parametrized according to
   the SCWRL4 method. They contain all heavy atoms, but also the
-  polar hydrogens. The rotamers start after the CB atom (typically CG). 
+  polar hydrogens. 
   In case of the :class:`FrameResidue` construction, the
   constructor distinguishes between backbone and sidechain frame residues.
 
+  :param cb_in_sidechain: If set to true, all constructed rotamers will contain 
+                          the cb atom. This flag also affects the construction 
+                          of frame residues and controls whether the cb atom 
+                          shows up in the backbone frame residues or sidechain 
+                          frame residues.
+                          This is useful when you want to represent ALA or 
+                          GLY with actual rotamers, but be aware of increased 
+                          runtime. This flag can be set to False for most
+                          modeling applications and you just don't generate
+                          any rotamers for ALA and GLY.
+
+  :type cb_in_sidechain: :class:`bool`
+
+
   .. method:: ConstructRRMRotamerGroup(res, id, residue_index, rot_lib,\
                                        [probability_cutoff = 0.98])
   .. method:: ConstructRRMRotamerGroup(all_atom_pos, aa_res_idx, id,\
                                        residue_index, rot_lib,\
                                        [probability_cutoff = 0.98])
-  .. method:: ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, id,\
-                                       residue_index, rot_lib,\          
-                                       [probability_cutoff = 0.98])
   .. method:: ConstructRRMRotamerGroup(res, id, residue_index, rot_lib,\
                                        [phi = -1.0472, psi = -0.7854,\
                                         probability_cutoff = 0.98])
@@ -34,18 +45,11 @@ Constructing Rotamers and Frame Residues
                                        residue_index, rot_lib,\
                                        [phi = -1.0472, psi = -0.7854,\
                                         probability_cutoff = 0.98])
-  .. method:: ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, id,\
-                                       residue_index, rot_lib,\
-                                       [phi = -1.0472, psi = -0.7854,\
-                                        probability_cutoff = 0.98])
   .. method:: ConstructRRMRotamerGroup(res, id, residue_index, rot_lib_entries,\
                                        [probability_cutoff = 0.98])
   .. method:: ConstructRRMRotamerGroup(all_atom_pos, aa_res_idx, id,\
                                        residue_index, rot_lib_entries,\
                                        [probability_cutoff = 0.98])
-  .. method:: ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, id,\
-                                       residue_index, rot_lib_entries,\          
-                                       [probability_cutoff = 0.98])
 
     All functions are also avaible for their flexible rotamer model counterpart.
     =>ConstructFRMRotamerGroup(...) with exactly the same parameters. 
@@ -105,10 +109,6 @@ Constructing Rotamers and Frame Residues
                                             residue_index, Real phi,\
                                             [n_ter = False, c_ter = False])
 
-  .. method:: ConstructBackboneFrameResidue(n_pos, ca_pos, c_pos, o_pos, cb_pos,\ 
-                                            id, residue_index, Real phi,\
-                                            [n_ter = False, c_ter = False])
-
     Constructs backbone frame residues for amino acid residues. It extracts
     the n, ca, c, o and cb positions and constructs a frame residue based on
     the parametrizations of SCWRL4. In case of **n_ter**, there are additional
diff --git a/sidechain/pymod/export_scwrl_rotamer_constructor.cc b/sidechain/pymod/export_scwrl_rotamer_constructor.cc
index 1d9cda258ed7f3fe39127025f2e2765aa3f8a0ae..539288e3e6363cee544e8815c484c83da32e6971 100644
--- a/sidechain/pymod/export_scwrl_rotamer_constructor.cc
+++ b/sidechain/pymod/export_scwrl_rotamer_constructor.cc
@@ -13,6 +13,10 @@ using namespace promod3;
 
 namespace{
 
+SCWRLRotamerConstructorPtr WrapSCWRLRotamerConstructorInit(bool cb_in_sidechain) {
+  SCWRLRotamerConstructorPtr p(new SCWRLRotamerConstructor(cb_in_sidechain));
+  return p;
+}
 
 RRMRotamerGroupPtr WrapRRMGroup_res(SCWRLRotamerConstructor& constructor,
                                     const ost::mol::ResidueHandle& res,
@@ -36,18 +40,6 @@ RRMRotamerGroupPtr WrapRRMGroup_aa(SCWRLRotamerConstructor& constructor,
                                               rot_lib, probability_cutoff);
 }
 
-RRMRotamerGroupPtr WrapRRMGroup_pos(SCWRLRotamerConstructor& constructor,
-                                    const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                                    const geom::Vec3& cb_pos,
-                                    RotamerID rotamer_id,
-                                    uint residue_idx,
-                                    RotamerLibPtr rot_lib,
-                                    Real probability_cutoff){
-  return constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              rot_lib, probability_cutoff);
-}
-
 FRMRotamerGroupPtr WrapFRMGroup_res(SCWRLRotamerConstructor& constructor,
                                     const ost::mol::ResidueHandle& res,
                                     RotamerID id,
@@ -70,18 +62,6 @@ FRMRotamerGroupPtr WrapFRMGroup_aa(SCWRLRotamerConstructor& constructor,
                                               rot_lib, probability_cutoff);
 }
 
-FRMRotamerGroupPtr WrapFRMGroup_pos(SCWRLRotamerConstructor& constructor,
-                                    const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                                    const geom::Vec3& cb_pos,
-                                    RotamerID rotamer_id,
-                                    uint residue_idx,
-                                    RotamerLibPtr rot_lib,
-                                    Real probability_cutoff){
-  return constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              rot_lib, probability_cutoff);
-}
-
 RRMRotamerGroupPtr WrapRRMGroup_bbdep_res(SCWRLRotamerConstructor& constructor,
                                           const ost::mol::ResidueHandle& res,
                                           RotamerID id,
@@ -108,20 +88,6 @@ RRMRotamerGroupPtr WrapRRMGroup_bbdep_aa(SCWRLRotamerConstructor& constructor,
                                               probability_cutoff);
 }
 
-RRMRotamerGroupPtr WrapRRMGroup_bbdep_pos(SCWRLRotamerConstructor& constructor,
-                                          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                                          const geom::Vec3& cb_pos,
-                                          RotamerID rotamer_id,
-                                          uint residue_idx,
-                                          BBDepRotamerLibPtr rot_lib,
-                                          Real phi, Real  psi,
-                                          Real probability_cutoff){
-  return constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              rot_lib, phi, psi, 
-                                              probability_cutoff);
-}
-
 FRMRotamerGroupPtr WrapFRMGroup_bbdep_res(SCWRLRotamerConstructor& constructor,
                                           const ost::mol::ResidueHandle& res,
                                           RotamerID id,
@@ -148,20 +114,6 @@ FRMRotamerGroupPtr WrapFRMGroup_bbdep_aa(SCWRLRotamerConstructor& constructor,
                                               probability_cutoff);
 }
 
-FRMRotamerGroupPtr WrapFRMGroup_bbdep_pos(SCWRLRotamerConstructor& constructor,
-                                          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                                          const geom::Vec3& cb_pos,
-                                          RotamerID rotamer_id,
-                                          uint residue_idx,
-                                          BBDepRotamerLibPtr rot_lib,
-                                          Real phi, Real  psi,
-                                          Real probability_cutoff){
-  return constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              rot_lib, phi, psi, 
-                                              probability_cutoff);
-}
-
 RRMRotamerGroupPtr WrapRRMGroup_entries_res(SCWRLRotamerConstructor& constructor,
                                             const ost::mol::ResidueHandle& res,
                                             RotamerID id,
@@ -190,22 +142,6 @@ RRMRotamerGroupPtr WrapRRMGroup_entries_aa(SCWRLRotamerConstructor& constructor,
                                               probability_cutoff);
 }
 
-RRMRotamerGroupPtr WrapRRMGroup_entries_pos(SCWRLRotamerConstructor& constructor,
-                                            const geom::Vec3& n_pos,
-                                            const geom::Vec3& ca_pos,
-                                            const geom::Vec3& cb_pos,
-                                            RotamerID rotamer_id,
-                                            uint residue_idx,
-                                            const boost::python::list& entries,
-                                            Real probability_cutoff){
-  std::vector<RotamerLibEntry> v_entries;
-  core::ConvertListToVector(entries, v_entries);
-  return constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              v_entries, 
-                                              probability_cutoff);
-}
-
 FRMRotamerGroupPtr WrapFRMGroup_entries_res(SCWRLRotamerConstructor& constructor,
                                             const ost::mol::ResidueHandle& res,
                                             RotamerID id,
@@ -234,23 +170,6 @@ FRMRotamerGroupPtr WrapFRMGroup_entries_aa(SCWRLRotamerConstructor& constructor,
                                               probability_cutoff);
 }
 
-FRMRotamerGroupPtr WrapFRMGroup_entries_pos(SCWRLRotamerConstructor& constructor,
-                                            const geom::Vec3& n_pos,
-                                            const geom::Vec3& ca_pos,
-                                            const geom::Vec3& cb_pos,
-                                            RotamerID rotamer_id,
-                                            uint residue_idx,
-                                            const boost::python::list& entries,
-                                            Real probability_cutoff){
-  std::vector<RotamerLibEntry> v_entries;
-  core::ConvertListToVector(entries, v_entries);
-  return constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos,
-                                              rotamer_id, residue_idx,
-                                              v_entries, 
-                                              probability_cutoff);
-}
-
-
 FrameResiduePtr WrapBBFrame_res(SCWRLRotamerConstructor& constructor,
                                 const ost::mol::ResidueHandle& residue,
                                 RotamerID id, uint residue_index,
@@ -269,19 +188,6 @@ FrameResiduePtr WrapBBFrame_aa(SCWRLRotamerConstructor& constructor,
                                                      phi, n_ter, c_ter);
 }
 
-FrameResiduePtr WrapBBFrame_pos(SCWRLRotamerConstructor& constructor,
-                               const geom::Vec3& n_pos,
-                               const geom::Vec3& ca_pos,
-                               const geom::Vec3& c_pos,
-                               const geom::Vec3& o_pos,
-                               const geom::Vec3& cb_pos,
-                               RotamerID id, uint residue_index,
-                               Real phi, bool n_ter, bool c_ter){
-    return constructor.ConstructBackboneFrameResidue(n_pos, ca_pos, c_pos, 
-                                                     o_pos, cb_pos, id, 
-                                                     residue_index,
-                                                     phi, n_ter, c_ter);
-}
 
 FrameResiduePtr WrapSCFrame_res(SCWRLRotamerConstructor& constructor,
                                 const ost::mol::ResidueHandle& residue,
@@ -313,7 +219,8 @@ void AssignInternalEnergiesFRM(const SCWRLRotamerConstructor& constructor,
 
 void export_SCWRLRotamerConstructor(){
 
-  class_<SCWRLRotamerConstructor>("SCWRLRotamerConstructor", init<>())
+  class_<SCWRLRotamerConstructor, SCWRLRotamerConstructorPtr>("SCWRLRotamerConstructor", no_init)
+    .def("__init__", boost::python::make_constructor(&WrapSCWRLRotamerConstructorInit))
     .def("ConstructRRMRotamerGroup", &WrapRRMGroup_res,(arg("residue"),
                                                         arg("rotamer_id"),
                                                         arg("residue_idx"),
@@ -325,13 +232,6 @@ void export_SCWRLRotamerConstructor(){
                                                        arg("residue_idx"),
                                                        arg("rot_lib"),
                                                        arg("probability_cutoff") = 0.98))
-    .def("ConstructRRMRotamerGroup", &WrapRRMGroup_pos,(arg("n_pos"),
-                                                        arg("ca_pos"),
-                                                        arg("cb_pos"),
-                                                        arg("rotamer_id"),
-                                                        arg("residue_idx"),
-                                                        arg("rot_lib"),
-                                                        arg("probability_cutoff") = 0.98))
     .def("ConstructFRMRotamerGroup", &WrapFRMGroup_res,(arg("residue"),
                                                         arg("rotamer_id"),
                                                         arg("residue_idx"),
@@ -343,13 +243,6 @@ void export_SCWRLRotamerConstructor(){
                                                        arg("residue_idx"),
                                                        arg("rot_lib"),
                                                        arg("probability_cutoff") = 0.98))
-    .def("ConstructFRMRotamerGroup", &WrapFRMGroup_pos,(arg("n_pos"),
-                                                        arg("ca_pos"),
-                                                        arg("cb_pos"),
-                                                        arg("rotamer_id"),
-                                                        arg("residue_idx"),
-                                                        arg("rot_lib"),
-                                                        arg("probability_cutoff") = 0.98))
     .def("ConstructRRMRotamerGroup", &WrapRRMGroup_bbdep_res,(arg("residue"),
                                                               arg("rotamer_id"),
                                                               arg("residue_idx"),
@@ -365,15 +258,6 @@ void export_SCWRLRotamerConstructor(){
                                                              arg("phi") = -1.0472,
                                                              arg("psi") = -0.7854,
                                                              arg("probability_cutoff") = 0.98))
-    .def("ConstructRRMRotamerGroup", &WrapRRMGroup_bbdep_pos,(arg("n_pos"),
-                                                              arg("ca_pos"),
-                                                              arg("cb_pos"),
-                                                              arg("rotamer_id"),
-                                                              arg("residue_idx"),
-                                                              arg("rot_lib"),
-                                                              arg("phi") = -1.0472,
-                                                              arg("psi") = -0.7854,
-                                                              arg("probability_cutoff") = 0.98))
     .def("ConstructFRMRotamerGroup", &WrapFRMGroup_bbdep_res,(arg("residue"),
                                                               arg("rotamer_id"),
                                                               arg("residue_idx"),
@@ -389,15 +273,6 @@ void export_SCWRLRotamerConstructor(){
                                                              arg("phi") = -1.0472,
                                                              arg("psi") = -0.7854,
                                                              arg("probability_cutoff") = 0.98))
-    .def("ConstructFRMRotamerGroup", &WrapFRMGroup_bbdep_pos,(arg("n_pos"),
-                                                              arg("ca_pos"),
-                                                              arg("cb_pos"),
-                                                              arg("rotamer_id"),
-                                                              arg("residue_idx"),
-                                                              arg("rot_lib"),
-                                                              arg("phi") = -1.0472,
-                                                              arg("psi") = -0.7854,
-                                                              arg("probability_cutoff") = 0.98))
     .def("ConstructRRMRotamerGroup", &WrapRRMGroup_entries_res,(arg("residue"),
                                                                 arg("rotamer_id"),
                                                                 arg("residue_idx"),
@@ -409,13 +284,6 @@ void export_SCWRLRotamerConstructor(){
                                                                arg("residue_idx"),
                                                                arg("entries"),
                                                                arg("probability_cutoff") = 0.98))
-    .def("ConstructRRMRotamerGroup", &WrapRRMGroup_entries_pos,(arg("n_pos"),
-                                                                arg("ca_pos"),
-                                                                arg("cb_pos"),
-                                                                arg("rotamer_id"),
-                                                                arg("residue_idx"),
-                                                                arg("entries"),
-                                                                arg("probability_cutoff") = 0.98))
     .def("ConstructFRMRotamerGroup", &WrapFRMGroup_entries_res,(arg("residue"),
                                                                 arg("rotamer_id"),
                                                                 arg("residue_idx"),
@@ -427,13 +295,6 @@ void export_SCWRLRotamerConstructor(){
                                                                arg("residue_idx"),
                                                                arg("entries"),
                                                                arg("probability_cutoff") = 0.98))
-    .def("ConstructFRMRotamerGroup", &WrapFRMGroup_entries_pos,(arg("n_pos"),
-                                                                arg("ca_pos"),
-                                                                arg("cb_pos"),
-                                                                arg("rotamer_id"),
-                                                                arg("residue_idx"),
-                                                                arg("entries"),
-                                                                arg("probability_cutoff") = 0.98))
     .def("ConstructBackboneFrameResidue", &WrapBBFrame_res,(arg("residue"),
                                                             arg("rotamer_id"),
                                                             arg("residue_index"),
@@ -447,16 +308,6 @@ void export_SCWRLRotamerConstructor(){
                                                            arg("phi"),
                                                            arg("n_ter")=false,
                                                            arg("c_ter")=false))
-    .def("ConstructBackboneFrameResidue", &WrapBBFrame_pos,(arg("n_pos"),
-                                                            arg("ca_pos"),
-                                                            arg("c_pos"),
-                                                            arg("o_pos"),
-                                                            arg("cb_pos"),
-                                                            arg("rotamer_id"),
-                                                            arg("residue_index"),
-                                                            arg("phi"),
-                                                            arg("n_ter")=false,
-                                                            arg("c_ter")=false))
     .def("ConstructSidechainFrameResidue", &WrapSCFrame_res,(arg("residue"),
                                                              arg("rotamer_id"),
                                                              arg("residue_index")))
diff --git a/sidechain/src/scwrl_rotamer_constructor.cc b/sidechain/src/scwrl_rotamer_constructor.cc
index 1ef28876c408c19e689c00c0ca252d9c50cfce77..5ef45a293683b1976f54387fe82277e0b74e02bc 100644
--- a/sidechain/src/scwrl_rotamer_constructor.cc
+++ b/sidechain/src/scwrl_rotamer_constructor.cc
@@ -170,7 +170,7 @@ _AtomSpecCPList _GetCarboxylAtoms(const _AtomInfo& atom_info) {
 
 namespace promod3 { namespace sidechain {
 
-SCWRLRotamerLookup::SCWRLRotamerLookup() {
+SCWRLRotamerLookup::SCWRLRotamerLookup(bool cb_in_sidechain) {
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
                                 "SCWRLRotamerLookup::SCWRLRotamerLookup", 2);
   
@@ -178,6 +178,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[ARG].has_hydrogens = true;
   sidechain_infos_[ARG].internal_e_prefactor = 2.27;
   sidechain_infos_[ARG].frm_t = 1.23;
+
   AddInfo(ARG, CH2Particle, 0.0, "CG", promod3::loop::ARG_CG_INDEX, false);
   AddInfo(ARG, CH2Particle, 0.1, "CD", promod3::loop::ARG_CD_INDEX, false);
   AddInfo(ARG, NParticle, -0.4, "NE", promod3::loop::ARG_NE_INDEX, false);
@@ -189,11 +190,17 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddInfo(ARG, HParticle, 0.35, "HH12", promod3::loop::ARG_HH12_INDEX, true);
   AddInfo(ARG, HParticle, 0.35, "HH21", promod3::loop::ARG_HH21_INDEX, true);
   AddInfo(ARG, HParticle, 0.35, "HH22", promod3::loop::ARG_HH22_INDEX, true);
+
+  if(cb_in_sidechain) {
+    AddInfo(ARG, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(ARG, promod3::loop::ARG_HE_INDEX, promod3::loop::ARG_NE_INDEX, 6);
   AddPDir(ARG, promod3::loop::ARG_HH11_INDEX, promod3::loop::ARG_NH1_INDEX, 7);
   AddPDir(ARG, promod3::loop::ARG_HH12_INDEX, promod3::loop::ARG_NH1_INDEX, 8);
   AddPDir(ARG, promod3::loop::ARG_HH21_INDEX, promod3::loop::ARG_NH2_INDEX, 9);
   AddPDir(ARG, promod3::loop::ARG_HH22_INDEX, promod3::loop::ARG_NH2_INDEX, 10);
+
   AddFRMRule(ARG, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(ARG, 0, -0.87);
   AddFRMPrefactor(ARG, 0, 0.87);
@@ -208,6 +215,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ARG, 0, 8);
   AddFRMRotatingParticle(ARG, 0, 9);
   AddFRMRotatingParticle(ARG, 0, 10);
+
   AddFRMRule(ARG, promod3::loop::BB_CB_INDEX, promod3::loop::ARG_CG_INDEX);
   AddFRMPrefactor(ARG, 1, -1.62);
   AddFRMPrefactor(ARG, 1, 1.62);
@@ -222,6 +230,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ARG, 1, 8);
   AddFRMRotatingParticle(ARG, 1, 9);
   AddFRMRotatingParticle(ARG, 1, 10);
+
   AddFRMRule(ARG, promod3::loop::ARG_CG_INDEX, promod3::loop::ARG_CD_INDEX);
   AddFRMPrefactor(ARG, 2, -1.67);
   AddFRMPrefactor(ARG, 2, 1.67);
@@ -236,6 +245,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ARG, 2, 8);
   AddFRMRotatingParticle(ARG, 2, 9);
   AddFRMRotatingParticle(ARG, 2, 10);
+
   AddFRMRule(ARG, promod3::loop::ARG_CD_INDEX, promod3::loop::ARG_NE_INDEX);
   AddFRMPrefactor(ARG, 3, -0.73);
   AddFRMPrefactor(ARG, 3, 0.73);
@@ -250,14 +260,26 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ARG, 3, 8);
   AddFRMRotatingParticle(ARG, 3, 9);
   AddFRMRotatingParticle(ARG, 3, 10);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(ARG, 0, 11);
+    AddFRMFixParticle(ARG, 1, 11);
+    AddFRMFixParticle(ARG, 2, 11);
+    AddFRMFixParticle(ARG, 3, 11);
+  }
+
   backbone_infos_[ARG].has_hydrogens = true;
   AddBBInfo(ARG, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(ARG, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(ARG, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(ARG, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(ARG, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(ARG, HParticle, 0.25, "H", promod3::loop::ARG_H_INDEX,true);
-  AddBBPDir(ARG, promod3::loop::ARG_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(ARG, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(ARG, promod3::loop::ARG_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(ARG, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -265,15 +287,22 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[ASN].has_hydrogens = true;
   sidechain_infos_[ASN].internal_e_prefactor = 1.80;
   sidechain_infos_[ASN].frm_t = 1.41;
+
   AddInfo(ASN, CParticle, 0.55, "CG", promod3::loop::ASN_CG_INDEX, false);
   AddInfo(ASN, OParticle, -0.55, "OD1", promod3::loop::ASN_OD1_INDEX, false);
   AddInfo(ASN, NParticle, -0.6, "ND2", promod3::loop::ASN_ND2_INDEX, false);
   AddInfo(ASN, HParticle, 0.3, "HD21", promod3::loop::ASN_HD21_INDEX, true);
   AddInfo(ASN, HParticle, 0.3, "HD22", promod3::loop::ASN_HD22_INDEX, true);
+
+  if(cb_in_sidechain) {
+    AddInfo(ASN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(ASN, promod3::loop::ASN_HD21_INDEX, promod3::loop::ASN_ND2_INDEX, 3);
   AddPDir(ASN, promod3::loop::ASN_HD22_INDEX, promod3::loop::ASN_ND2_INDEX, 4);
   AddLP(ASN, promod3::loop::ASN_ND2_INDEX, promod3::loop::ASN_CG_INDEX, 
         promod3::loop::ASN_OD1_INDEX, false, false, false, 1, LONE_PAIR_CARBONYL);
+
   AddFRMRule(ASN, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(ASN, 0, -0.62);
   AddFRMPrefactor(ASN, 0, 0.62);
@@ -282,6 +311,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ASN, 0, 2);
   AddFRMRotatingParticle(ASN, 0, 3);
   AddFRMRotatingParticle(ASN, 0, 4);
+
   AddFRMRule(ASN, promod3::loop::BB_CB_INDEX, promod3::loop::ASN_CG_INDEX);
   AddFRMPrefactor(ASN, 1, -1.93);
   AddFRMPrefactor(ASN, 1, 1.93);
@@ -290,47 +320,76 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(ASN, 1, 2);
   AddFRMRotatingParticle(ASN, 1, 3);
   AddFRMRotatingParticle(ASN, 1, 4);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(ASN, 0, 5);
+    AddFRMFixParticle(ASN, 1, 5);
+  }
+
   backbone_infos_[ASN].has_hydrogens = true;
   AddBBInfo(ASN, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(ASN, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(ASN, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(ASN, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(ASN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(ASN, HParticle, 0.25, "H", promod3::loop::ASN_H_INDEX,true);
-  AddBBPDir(ASN, promod3::loop::ASN_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(ASN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(ASN, promod3::loop::ASN_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(ASN, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
   // ASP
-  AddInfo(ASP, CParticle, 0.36, "CG", promod3::loop::ASP_CG_INDEX, false);
   sidechain_infos_[ASP].internal_e_prefactor = 2.44;
   sidechain_infos_[ASP].frm_t = 1.48;
+  sidechain_infos_[ASP].has_hydrogens = false;
+
+  AddInfo(ASP, CParticle, 0.36, "CG", promod3::loop::ASP_CG_INDEX, false);
   AddInfo(ASP, OParticle, -0.60, "OD1", promod3::loop::ASP_OD1_INDEX, false);
   AddInfo(ASP, OParticle, -0.60, "OD2", promod3::loop::ASP_OD2_INDEX, false);
+
+  if(cb_in_sidechain) {
+    AddInfo(ASP, CH2Particle, -0.16, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddLP(ASP, promod3::loop::ASP_OD2_INDEX, promod3::loop::ASP_CG_INDEX, 
         promod3::loop::ASP_OD1_INDEX, false, false, false, 1, LONE_PAIR_CARBONYL);
   AddLP(ASP, promod3::loop::ASP_OD1_INDEX, promod3::loop::ASP_CG_INDEX, 
         promod3::loop::ASP_OD2_INDEX, false, false, false, 2, LONE_PAIR_CARBONYL);
+
   AddFRMRule(ASP, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(ASP, 0, -1.59);
   AddFRMPrefactor(ASP, 0, 1.59);
   AddFRMRotatingParticle(ASP, 0, 0);
   AddFRMRotatingParticle(ASP, 0, 1);
   AddFRMRotatingParticle(ASP, 0, 2);
+
   AddFRMRule(ASP, promod3::loop::BB_CB_INDEX, promod3::loop::ASP_CG_INDEX);
   AddFRMPrefactor(ASP, 1, -0.63);
   AddFRMPrefactor(ASP, 1, 0.63);
   AddFRMFixParticle(ASP, 1, 0);
   AddFRMRotatingParticle(ASP, 1, 1);
   AddFRMRotatingParticle(ASP, 1, 2);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(ASP, 0, 3);
+    AddFRMFixParticle(ASP, 1, 3);
+  }
+
   backbone_infos_[ASP].has_hydrogens = true;
   AddBBInfo(ASP, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(ASP, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(ASP, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(ASP, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(ASP, CH2Particle, -0.16, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(ASP, HParticle, 0.25, "H", promod3::loop::ASP_H_INDEX,true);
-  AddBBPDir(ASP, promod3::loop::ASP_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(ASP, CH2Particle, -0.16, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(ASP, promod3::loop::ASP_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(ASP, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -338,16 +397,23 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[GLN].has_hydrogens = true;
   sidechain_infos_[GLN].internal_e_prefactor = 1.61;
   sidechain_infos_[GLN].frm_t = 1.32;
+
   AddInfo(GLN, CH2Particle, 0.0, "CG", promod3::loop::GLN_CG_INDEX, false);
   AddInfo(GLN, CParticle, 0.55, "CD", promod3::loop::GLN_CD_INDEX, false);
   AddInfo(GLN, OParticle, -0.55, "OE1", promod3::loop::GLN_OE1_INDEX, false);
   AddInfo(GLN, NParticle, -0.60, "NE2", promod3::loop::GLN_NE2_INDEX, false);
   AddInfo(GLN, HParticle, 0.3, "HE21", promod3::loop::GLN_HE21_INDEX, true);
   AddInfo(GLN, HParticle, 0.3, "HE22", promod3::loop::GLN_HE22_INDEX, true);
+
+  if(cb_in_sidechain) {
+    AddInfo(GLN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(GLN, promod3::loop::GLN_HE21_INDEX, promod3::loop::GLN_NE2_INDEX, 4);
   AddPDir(GLN, promod3::loop::GLN_HE22_INDEX, promod3::loop::GLN_NE2_INDEX, 5);
   AddLP(GLN, promod3::loop::GLN_NE2_INDEX, promod3::loop::GLN_CD_INDEX, 
         promod3::loop::GLN_OE1_INDEX, false, false, false, 2, LONE_PAIR_CARBONYL);
+
   AddFRMRule(GLN, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(GLN, 0, -1.55);
   AddFRMPrefactor(GLN, 0, 1.55);
@@ -357,6 +423,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(GLN, 0, 3);
   AddFRMRotatingParticle(GLN, 0, 4);
   AddFRMRotatingParticle(GLN, 0, 5);
+
   AddFRMRule(GLN, promod3::loop::BB_CB_INDEX, promod3::loop::GLN_CG_INDEX);
   AddFRMPrefactor(GLN, 1, -0.53);
   AddFRMPrefactor(GLN, 1, 0.53);
@@ -366,6 +433,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(GLN, 1, 3);
   AddFRMRotatingParticle(GLN, 1, 4);
   AddFRMRotatingParticle(GLN, 1, 5);
+
   AddFRMRule(GLN, promod3::loop::GLN_CG_INDEX, promod3::loop::GLN_CD_INDEX);
   AddFRMPrefactor(GLN, 2, -1.89);
   AddFRMPrefactor(GLN, 2, 1.89);
@@ -375,14 +443,25 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(GLN, 2, 3);
   AddFRMRotatingParticle(GLN, 2, 4);
   AddFRMRotatingParticle(GLN, 2, 5);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(GLN, 0, 6);
+    AddFRMFixParticle(GLN, 1, 6);
+    AddFRMFixParticle(GLN, 2, 6);
+  }
+
   backbone_infos_[GLN].has_hydrogens = true;
   AddBBInfo(GLN, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(GLN, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(GLN, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(GLN, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(GLN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(GLN, HParticle, 0.25, "H", promod3::loop::GLN_H_INDEX,true);
-  AddBBPDir(GLN, promod3::loop::GLN_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(GLN, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(GLN, promod3::loop::GLN_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(GLN, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -390,14 +469,21 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[GLU].has_hydrogens = false;
   sidechain_infos_[GLU].internal_e_prefactor = 1.85;
   sidechain_infos_[GLU].frm_t = 0.94;
+
   AddInfo(GLU, CH2Particle, -0.16, "CG", promod3::loop::GLU_CG_INDEX, false);
   AddInfo(GLU, CParticle, 0.36, "CD", promod3::loop::GLU_CD_INDEX, false);
   AddInfo(GLU, OParticle, -0.60, "OE1", promod3::loop::GLU_OE1_INDEX, false);
   AddInfo(GLU, OParticle, -0.60, "OE2", promod3::loop::GLU_OE2_INDEX, false);
+
+  if(cb_in_sidechain) {
+    AddInfo(GLU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddLP(GLU, promod3::loop::GLU_OE2_INDEX, promod3::loop::GLU_CD_INDEX, 
         promod3::loop::GLU_OE1_INDEX, false, false, false, 2, LONE_PAIR_CARBONYL);
   AddLP(GLU, promod3::loop::GLU_OE1_INDEX, promod3::loop::GLU_CD_INDEX, 
         promod3::loop::GLU_OE2_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
+
   AddFRMRule(GLU, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(GLU, 0, -0.82);
   AddFRMPrefactor(GLU, 0, 0.82);
@@ -405,6 +491,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(GLU, 0, 1);
   AddFRMRotatingParticle(GLU, 0, 2);
   AddFRMRotatingParticle(GLU, 0, 3);
+
   AddFRMRule(GLU, promod3::loop::BB_CB_INDEX, promod3::loop::GLU_CG_INDEX);
   AddFRMPrefactor(GLU, 1, -1.57);
   AddFRMPrefactor(GLU, 1, 1.57);
@@ -412,6 +499,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(GLU, 1, 1);
   AddFRMRotatingParticle(GLU, 1, 2);
   AddFRMRotatingParticle(GLU, 1, 3);
+
   AddFRMRule(GLU, promod3::loop::GLU_CG_INDEX, promod3::loop::GLU_CD_INDEX);
   AddFRMPrefactor(GLU, 2, -0.76);
   AddFRMPrefactor(GLU, 2, 0.76);
@@ -419,14 +507,25 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMFixParticle(GLU, 2, 1);
   AddFRMRotatingParticle(GLU, 2, 2);
   AddFRMRotatingParticle(GLU, 2, 3);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(GLU, 0, 4);
+    AddFRMFixParticle(GLU, 1, 4);
+    AddFRMFixParticle(GLU, 2, 4);
+  }
+
   backbone_infos_[GLU].has_hydrogens = true;
   AddBBInfo(GLU, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(GLU, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(GLU, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(GLU, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(GLU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(GLU, HParticle, 0.25, "H", promod3::loop::GLU_H_INDEX,true);
-  AddBBPDir(GLU, promod3::loop::GLU_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(GLU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(GLU, promod3::loop::GLU_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(GLU, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -434,6 +533,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[LYS].has_hydrogens = true;
   sidechain_infos_[LYS].internal_e_prefactor = 2.13;
   sidechain_infos_[LYS].frm_t = 1.27;
+
   AddInfo(LYS, CH2Particle, 0.0, "CG", promod3::loop::LYS_CG_INDEX,false);
   AddInfo(LYS, CH2Particle, 0.0, "CD", promod3::loop::LYS_CD_INDEX,false);
   AddInfo(LYS, CH2Particle, 0.25, "CE", promod3::loop::LYS_CE_INDEX,false);
@@ -441,9 +541,15 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddInfo(LYS, HParticle, 0.35, "HZ1", promod3::loop::LYS_HZ1_INDEX,true);
   AddInfo(LYS, HParticle, 0.35, "HZ2", promod3::loop::LYS_HZ2_INDEX,true);
   AddInfo(LYS, HParticle, 0.35, "HZ3", promod3::loop::LYS_HZ3_INDEX,true);
+
+  if(cb_in_sidechain) {
+    AddInfo(LYS, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(LYS, promod3::loop::LYS_HZ1_INDEX, promod3::loop::LYS_NZ_INDEX, 4);
   AddPDir(LYS, promod3::loop::LYS_HZ2_INDEX, promod3::loop::LYS_NZ_INDEX, 5);
   AddPDir(LYS, promod3::loop::LYS_HZ3_INDEX, promod3::loop::LYS_NZ_INDEX, 6);
+
   AddFRMRule(LYS, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(LYS, 0, -1.62);
   AddFRMPrefactor(LYS, 0, 1.62);
@@ -454,6 +560,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(LYS, 0, 4);
   AddFRMRotatingParticle(LYS, 0, 5);
   AddFRMRotatingParticle(LYS, 0, 6);
+
   AddFRMRule(LYS, promod3::loop::BB_CB_INDEX, promod3::loop::LYS_CG_INDEX);
   AddFRMPrefactor(LYS, 1, -0.99);
   AddFRMPrefactor(LYS, 1, 0.99);
@@ -464,6 +571,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(LYS, 1, 4);
   AddFRMRotatingParticle(LYS, 1, 5);
   AddFRMRotatingParticle(LYS, 1, 6);
+
   AddFRMRule(LYS, promod3::loop::LYS_CG_INDEX, promod3::loop::LYS_CD_INDEX);
   AddFRMPrefactor(LYS, 2, -0.96);
   AddFRMPrefactor(LYS, 2, 0.96);
@@ -474,6 +582,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(LYS, 2, 4);
   AddFRMRotatingParticle(LYS, 2, 5);
   AddFRMRotatingParticle(LYS, 2, 6);
+
   AddFRMRule(LYS, promod3::loop::LYS_CD_INDEX, promod3::loop::LYS_CE_INDEX);
   AddFRMPrefactor(LYS, 3, -1.49);
   AddFRMPrefactor(LYS, 3, 1.49);
@@ -484,14 +593,26 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(LYS, 3, 4);
   AddFRMRotatingParticle(LYS, 3, 5);
   AddFRMRotatingParticle(LYS, 3, 6);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(LYS, 0, 7);
+    AddFRMFixParticle(LYS, 1, 7);
+    AddFRMFixParticle(LYS, 2, 7);
+    AddFRMFixParticle(LYS, 3, 7);
+  }
+
   sidechain_infos_[LYS].has_hydrogens = true;
   AddBBInfo(LYS, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(LYS, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(LYS, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(LYS, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(LYS, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(LYS, HParticle, 0.25, "H", promod3::loop::LYS_H_INDEX,true);
-  AddBBPDir(LYS, promod3::loop::LYS_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(LYS, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(LYS, promod3::loop::LYS_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(LYS, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -499,8 +620,14 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[SER].has_hydrogens = true;
   sidechain_infos_[SER].internal_e_prefactor = 2.78;
   sidechain_infos_[SER].frm_t = 3.53;
+
   AddInfo(SER, OParticle, -0.65, "OG", promod3::loop::SER_OG_INDEX, false);
   AddInfo(SER, HParticle, 0.40, "HG", promod3::loop::SER_HG_INDEX, true);
+
+  if(cb_in_sidechain) {
+    AddInfo(SER, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(SER, promod3::loop::SER_HG_INDEX, promod3::loop::SER_OG_INDEX, 1);
   AddLP(SER, promod3::loop::BB_CB_INDEX, promod3::loop::SER_OG_INDEX, 
         promod3::loop::SER_HG_INDEX, false, false, true, 0, LONE_PAIR_COH);
@@ -508,24 +635,36 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
                         promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX, 
                         promod3::loop::SER_OG_INDEX,
                         0.96, 1.85, 1);
+
   AddFRMRule(SER, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(SER, 0, -0.65);
   AddFRMPrefactor(SER, 0, 0.65);
   AddFRMRotatingParticle(SER, 0, 0);
   AddFRMRotatingParticle(SER, 0, 1);
+
   AddFRMRule(SER, promod3::loop::BB_CB_INDEX, promod3::loop::SER_OG_INDEX);
   AddFRMPrefactor(SER, 1, -2.98);
   AddFRMPrefactor(SER, 1, 2.98);
   AddFRMFixParticle(SER, 1, 0);
   AddFRMRotatingParticle(SER, 1, 1);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(SER, 0, 2);
+    AddFRMFixParticle(SER, 1, 2);
+  }
+
   backbone_infos_[SER].has_hydrogens = true;
   AddBBInfo(SER, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(SER, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(SER, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(SER, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(SER, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(SER, HParticle, 0.25, "H", promod3::loop::SER_H_INDEX,true);
-  AddBBPDir(SER, promod3::loop::SER_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(SER, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(SER, promod3::loop::SER_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(SER, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -533,19 +672,34 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[CYS].has_hydrogens = false;
   sidechain_infos_[CYS].internal_e_prefactor = 4.07;
   sidechain_infos_[CYS].frm_t = 1.69;
+
   AddInfo(CYS, SParticle, -0.19, "SG", promod3::loop::CYS_SG_INDEX, false);
+
+  if(cb_in_sidechain) {
+    AddInfo(CYS, CH2Particle, 0.19, "CB", promod3::loop::BB_CB_INDEX, false);  
+  }
+
   AddFRMRule(CYS, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(CYS, 0, -1.69);
   AddFRMPrefactor(CYS, 0, 1.69);
   AddFRMRotatingParticle(CYS, 0, 0);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(CYS, 0, 1);
+  }
+
   backbone_infos_[CYS].has_hydrogens = true;
   AddBBInfo(CYS, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(CYS, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(CYS, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(CYS, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(CYS, CH2Particle, 0.19, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(CYS, HParticle, 0.25, "H", promod3::loop::CYS_H_INDEX,true);
-  AddBBPDir(CYS, promod3::loop::CYS_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(CYS, CH2Particle, 0.19, "CB", promod3::loop::BB_CB_INDEX, false);   
+  }
+
+  AddBBPDir(CYS, promod3::loop::CYS_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(CYS, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -563,35 +717,54 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[MET].has_hydrogens = false;
   sidechain_infos_[MET].internal_e_prefactor = 1.95;
   sidechain_infos_[MET].frm_t = 1.77;
+
   AddInfo(MET, CH2Particle, 0.06, "CG", promod3::loop::MET_CG_INDEX,false);
   AddInfo(MET, SParticle, -0.12, "SD", promod3::loop::MET_SD_INDEX,false);
   AddInfo(MET, CH3Particle, 0.06, "CE", promod3::loop::MET_CE_INDEX,false);
+
+  if(cb_in_sidechain) {
+    AddInfo(MET, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddFRMRule(MET, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(MET, 0, -0.97);
   AddFRMPrefactor(MET, 0, 0.97);
   AddFRMRotatingParticle(MET, 0, 0);
   AddFRMRotatingParticle(MET, 0, 1);
   AddFRMRotatingParticle(MET, 0, 2);
+
   AddFRMRule(MET, promod3::loop::BB_CB_INDEX, promod3::loop::MET_CG_INDEX);
   AddFRMPrefactor(MET, 1, -1.54);
   AddFRMPrefactor(MET, 1, 1.54);
   AddFRMFixParticle(MET, 1, 0);
   AddFRMRotatingParticle(MET, 1, 1);
   AddFRMRotatingParticle(MET, 1, 2);
+
   AddFRMRule(MET, promod3::loop::MET_CG_INDEX, promod3::loop::MET_SD_INDEX);
   AddFRMPrefactor(MET, 2, -1.21);
   AddFRMPrefactor(MET, 2, 1.21);
   AddFRMFixParticle(MET, 2, 0);
   AddFRMFixParticle(MET, 2, 1);
   AddFRMRotatingParticle(MET, 2, 2);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(MET, 0, 3);
+    AddFRMFixParticle(MET, 1, 3);
+    AddFRMFixParticle(MET, 2, 3);
+  }
+
   backbone_infos_[MET].has_hydrogens = true;
   AddBBInfo(MET, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(MET, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(MET, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(MET, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(MET, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(MET, HParticle, 0.25, "H", promod3::loop::MET_H_INDEX,true);
-  AddBBPDir(MET, promod3::loop::MET_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(MET, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(MET, promod3::loop::MET_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(MET, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -599,6 +772,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[TRP].has_hydrogens = true;
   sidechain_infos_[TRP].internal_e_prefactor = 3.24;
   sidechain_infos_[TRP].frm_t = 0.99;
+
   AddInfo(TRP, CParticle,-0.03, "CG", promod3::loop::TRP_CG_INDEX,false);
   AddInfo(TRP, CParticle, 0.06, "CD1", promod3::loop::TRP_CD1_INDEX,false);
   AddInfo(TRP, CParticle, 0.10, "CD2", promod3::loop::TRP_CD2_INDEX,false);
@@ -609,7 +783,13 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddInfo(TRP, CParticle, 0.00, "CH2", promod3::loop::TRP_CH2_INDEX,false);
   AddInfo(TRP, CParticle, 0.00, "CZ2", promod3::loop::TRP_CZ2_INDEX,false);
   AddInfo(TRP, HParticle, 0.30, "HE1", promod3::loop::TRP_HE1_INDEX,true);
+
+  if(cb_in_sidechain) {
+    AddInfo(TRP, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(TRP, promod3::loop::TRP_HE1_INDEX, promod3::loop::TRP_NE1_INDEX, 9);
+
   AddFRMRule(TRP, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(TRP, 0, -1.28);
   AddFRMPrefactor(TRP, 0, 1.28);
@@ -623,6 +803,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(TRP, 0, 7);
   AddFRMRotatingParticle(TRP, 0, 8);
   AddFRMRotatingParticle(TRP, 0, 9);
+
   AddFRMRule(TRP, promod3::loop::BB_CB_INDEX, promod3::loop::TRP_CG_INDEX);
   AddFRMPrefactor(TRP, 1, -1.48);
   AddFRMPrefactor(TRP, 1, 1.48);
@@ -636,14 +817,24 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(TRP, 1, 7);
   AddFRMRotatingParticle(TRP, 1, 8);
   AddFRMRotatingParticle(TRP, 1, 9);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(TRP, 0, 10);
+    AddFRMFixParticle(TRP, 1, 10);
+  }
+
   backbone_infos_[TRP].has_hydrogens = true;
   AddBBInfo(TRP, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(TRP, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(TRP, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(TRP, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(TRP, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(TRP, HParticle, 0.25, "H", promod3::loop::TRP_H_INDEX,true);
-  AddBBPDir(TRP, promod3::loop::TRP_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(TRP, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(TRP, promod3::loop::TRP_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(TRP, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -651,6 +842,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[TYR].has_hydrogens = true;
   sidechain_infos_[TYR].internal_e_prefactor = 2.00;
   sidechain_infos_[TYR].frm_t = 1.96;
+
   AddInfo(TYR, CParticle, 0.0, "CG", promod3::loop::TYR_CG_INDEX,false);
   AddInfo(TYR, CParticle, 0.0, "CD1", promod3::loop::TYR_CD1_INDEX,false);
   AddInfo(TYR, CParticle, 0.0, "CD2", promod3::loop::TYR_CD2_INDEX,false);
@@ -659,6 +851,11 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddInfo(TYR, CParticle, 0.25, "CZ", promod3::loop::TYR_CZ_INDEX,false);
   AddInfo(TYR, OParticle, -0.65, "OH", promod3::loop::TYR_OH_INDEX,false);
   AddInfo(TYR, HParticle, 0.40, "HH", promod3::loop::TYR_HH_INDEX,true);
+
+  if(cb_in_sidechain) {
+    AddInfo(TYR, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(TYR, promod3::loop::TYR_HH_INDEX, promod3::loop::TYR_OH_INDEX, 7);
   AddLP(TYR, promod3::loop::TYR_CZ_INDEX, promod3::loop::TYR_OH_INDEX, 
         promod3::loop::TYR_HH_INDEX, false, false, true, 6, LONE_PAIR_COH);
@@ -667,6 +864,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
                         promod3::loop::TYR_CZ_INDEX, 
                         promod3::loop::TYR_OH_INDEX,
                         0.96, 1.885, 2);
+
   AddFRMRule(TYR, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(TYR, 0, -1.48);
   AddFRMPrefactor(TYR, 0, 1.48);
@@ -678,6 +876,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(TYR, 0, 5);
   AddFRMRotatingParticle(TYR, 0, 6);
   AddFRMRotatingParticle(TYR, 0, 7);
+
   AddFRMRule(TYR, promod3::loop::BB_CB_INDEX, promod3::loop::TYR_CG_INDEX);
   AddFRMPrefactor(TYR, 1, -0.73);
   AddFRMPrefactor(TYR, 1, 0.73);
@@ -689,6 +888,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(TYR, 1, 5);
   AddFRMRotatingParticle(TYR, 1, 6);
   AddFRMRotatingParticle(TYR, 1, 7);
+
   AddFRMRule(TYR, promod3::loop::TYR_CZ_INDEX, promod3::loop::TYR_OH_INDEX);
   AddFRMPrefactor(TYR, 2, -0.96);
   AddFRMPrefactor(TYR, 2, 0.96);
@@ -700,14 +900,25 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMFixParticle(TYR, 2, 5);
   AddFRMFixParticle(TYR, 2, 6);
   AddFRMRotatingParticle(TYR, 2, 7);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(TYR, 0, 8);
+    AddFRMFixParticle(TYR, 1, 8);
+    AddFRMFixParticle(TYR, 2, 8);
+  }
+
   backbone_infos_[TYR].has_hydrogens = true;
   AddBBInfo(TYR, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(TYR, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(TYR, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(TYR, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(TYR, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(TYR, HParticle, 0.25, "H", promod3::loop::TYR_H_INDEX,true);
-  AddBBPDir(TYR, promod3::loop::TYR_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(TYR, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(TYR, promod3::loop::TYR_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(TYR, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -715,36 +926,54 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[THR].has_hydrogens = true;
   sidechain_infos_[THR].internal_e_prefactor = 2.96;
   sidechain_infos_[THR].frm_t = 1.11;
+
   AddInfo(THR, OParticle, -0.65, "OG1", promod3::loop::THR_OG1_INDEX, false);
   AddInfo(THR, CH3Particle, 0.0, "CG2", promod3::loop::THR_CG2_INDEX, false);
   AddInfo(THR, HParticle, 0.40, "HG1", promod3::loop::THR_HG1_INDEX, true);
-  AddPDir(THR, promod3::loop::THR_HG1_INDEX, promod3::loop::THR_OG1_INDEX, 0);
+
+  if(cb_in_sidechain) {
+    AddInfo(THR, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddPDir(THR, promod3::loop::THR_HG1_INDEX, promod3::loop::THR_OG1_INDEX, 2);
   AddLP(THR, promod3::loop::BB_CB_INDEX, promod3::loop::THR_OG1_INDEX, 
         promod3::loop::THR_HG1_INDEX, false, false, true, 0, LONE_PAIR_COH);
   AddCustomHydrogenInfo(THR, promod3::loop::THR_HG1_INDEX, 
                         promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX, 
                         promod3::loop::THR_OG1_INDEX,
                         0.96, 1.85, 1);
+
   AddFRMRule(THR, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(THR, 0, -0.88);
   AddFRMPrefactor(THR, 0, 0.88);
   AddFRMRotatingParticle(THR, 0, 0);
   AddFRMRotatingParticle(THR, 0, 1);
   AddFRMRotatingParticle(THR, 0, 2);
+
   AddFRMRule(THR, promod3::loop::BB_CB_INDEX, promod3::loop::THR_OG1_INDEX);
   AddFRMPrefactor(THR, 1, -0.88);
   AddFRMPrefactor(THR, 1, 0.88);
   AddFRMFixParticle(THR, 1, 0);
   AddFRMFixParticle(THR, 1, 1);
   AddFRMRotatingParticle(THR, 1, 2);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(THR, 0, 3);
+    AddFRMFixParticle(THR, 1, 3);
+  }
+
   backbone_infos_[THR].has_hydrogens = true;
   AddBBInfo(THR, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(THR, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(THR, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(THR, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(THR, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(THR, HParticle, 0.25, "H", promod3::loop::THR_H_INDEX,true);
-  AddBBPDir(THR, promod3::loop::THR_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(THR, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false); 
+  }
+
+  AddBBPDir(THR, promod3::loop::THR_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(THR, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -752,21 +981,36 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[VAL].has_hydrogens = false;
   sidechain_infos_[VAL].internal_e_prefactor = 1.62;
   sidechain_infos_[VAL].frm_t = 2.20;
+
   AddInfo(VAL, CH3Particle, 0.0, "CG1", promod3::loop::VAL_CG1_INDEX, false);
   AddInfo(VAL, CH3Particle, 0.0, "CG2", promod3::loop::VAL_CG2_INDEX, false);
+
+  if(cb_in_sidechain) {
+    AddInfo(VAL, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddFRMRule(VAL, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(VAL, 0, -2.09);
   AddFRMPrefactor(VAL, 0, 2.09);
   AddFRMRotatingParticle(VAL, 0, 0);
   AddFRMRotatingParticle(VAL, 0, 1);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(VAL, 0, 2);
+  }
+
   backbone_infos_[VAL].has_hydrogens = true;
   AddBBInfo(VAL, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(VAL, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(VAL, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(VAL, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(VAL, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(VAL, HParticle, 0.25, "H", promod3::loop::VAL_H_INDEX,true);
-  AddBBPDir(VAL, promod3::loop::VAL_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(VAL, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false); 
+  }
+
+  AddBBPDir(VAL, promod3::loop::VAL_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(VAL, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -774,29 +1018,46 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[ILE].has_hydrogens = false;
   sidechain_infos_[ILE].internal_e_prefactor = 2.18;
   sidechain_infos_[ILE].frm_t = 2.03;
+
   AddInfo(ILE, CH2Particle, 0.0, "CG1", promod3::loop::ILE_CG1_INDEX, false);
   AddInfo(ILE, CH3Particle, 0.0, "CG2", promod3::loop::ILE_CG2_INDEX, false);  
   AddInfo(ILE, CH3Particle, 0.0, "CD1", promod3::loop::ILE_CD1_INDEX, false);  
+
+  if(cb_in_sidechain) {
+    AddInfo(ILE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddFRMRule(ILE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(ILE, 0, -1.23);
   AddFRMPrefactor(ILE, 0, 1.23);
   AddFRMRotatingParticle(ILE, 0, 0);
   AddFRMRotatingParticle(ILE, 0, 1);
   AddFRMRotatingParticle(ILE, 0, 2);
+
   AddFRMRule(ILE, promod3::loop::BB_CB_INDEX, promod3::loop::ILE_CG1_INDEX);
   AddFRMPrefactor(ILE, 1, -0.98);
   AddFRMPrefactor(ILE, 1, 0.98);
   AddFRMFixParticle(ILE, 1, 0);
   AddFRMFixParticle(ILE, 1, 1);
   AddFRMRotatingParticle(ILE, 1, 2);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(ILE, 0, 3);
+    AddFRMFixParticle(ILE, 1, 3);
+  }
+
   backbone_infos_[ILE].has_hydrogens = true;
   AddBBInfo(ILE, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(ILE, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(ILE, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(ILE, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(ILE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(ILE, HParticle, 0.25, "H", promod3::loop::ILE_H_INDEX,true);
-  AddBBPDir(ILE, promod3::loop::ILE_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(ILE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(ILE, promod3::loop::ILE_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(ILE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -804,49 +1065,76 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[LEU].has_hydrogens = false;
   sidechain_infos_[LEU].internal_e_prefactor = 2.25;
   sidechain_infos_[LEU].frm_t = 2.55;
+  
   AddInfo(LEU, CH1Particle, 0.0, "CG", promod3::loop::LEU_CG_INDEX, false);
   AddInfo(LEU, CH3Particle, 0.0, "CD1", promod3::loop::LEU_CD1_INDEX, false);  
   AddInfo(LEU, CH3Particle, 0.0, "CD2", promod3::loop::LEU_CD2_INDEX, false);  
+
+  if(cb_in_sidechain) {
+    AddInfo(LEU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+  
   AddFRMRule(LEU, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(LEU, 0, -1.15);
   AddFRMPrefactor(LEU, 0, 1.15);
   AddFRMRotatingParticle(LEU, 0, 0);
   AddFRMRotatingParticle(LEU, 0, 1);
   AddFRMRotatingParticle(LEU, 0, 2);
+
   AddFRMRule(LEU, promod3::loop::BB_CB_INDEX, promod3::loop::LEU_CG_INDEX);
   AddFRMPrefactor(LEU, 1, -1.48);
   AddFRMPrefactor(LEU, 1, 1.48);
-  AddFRMFixParticle(LEU, 1, 0);
+  AddFRMFixParticle(LEU, 1, 0);  
   AddFRMRotatingParticle(LEU, 1, 1);
   AddFRMRotatingParticle(LEU, 1, 2);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(LEU, 0, 3);
+    AddFRMFixParticle(LEU, 1, 3);
+  }
+
   backbone_infos_[LEU].has_hydrogens = true;
   AddBBInfo(LEU, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(LEU, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(LEU, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(LEU, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(LEU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(LEU, HParticle, 0.25, "H", promod3::loop::LEU_H_INDEX,true);
-  AddBBPDir(LEU, promod3::loop::LEU_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(LEU, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(LEU, promod3::loop::LEU_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(LEU, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
   // PROLINES DO NOT HAVE FRM DEFINITIONS!
   // large scale benchmarks showed, that varying around chi angles in case
-  // of prolines has a negative effect on performance => reduce to onoe single
+  // of prolines has a negative effect on performance => reduce to one single
   // subrotamer...
 
   // PRO
   sidechain_infos_[PRO].has_hydrogens = false;
   sidechain_infos_[PRO].internal_e_prefactor = 0.76;
   sidechain_infos_[PRO].frm_t = 2.62;
+  
   AddInfo(PRO, CH2Particle, 0.0, "CG", promod3::loop::PRO_CG_INDEX, false);
   AddInfo(PRO, CH2Particle, 0.0, "CD", promod3::loop::PRO_CD_INDEX, false); 
+
+  if(cb_in_sidechain) {
+    AddInfo(PRO, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   backbone_infos_[PRO].has_hydrogens = false;
   AddBBInfo(PRO, NParticle, -0.20, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(PRO, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(PRO, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(PRO, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(PRO, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(PRO, CH2Particle, 0.25, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddBBLP(PRO, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -864,15 +1152,23 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[HSD].has_hydrogens = true;
   sidechain_infos_[HSD].internal_e_prefactor = 2.01;
   sidechain_infos_[HSD].frm_t = 1.35;
+
   AddInfo(HSD, CParticle, 0.10, "CG", promod3::loop::HIS_CG_INDEX,false);
   AddInfo(HSD, NParticle, -0.40, "ND1", promod3::loop::HIS_ND1_INDEX,false);
   AddInfo(HSD, CParticle, 0.10, "CD2", promod3::loop::HIS_CD2_INDEX,false);
   AddInfo(HSD, CParticle, 0.30, "CE1", promod3::loop::HIS_CE1_INDEX,false);
   AddInfo(HSD, NParticle, -0.40, "NE2", promod3::loop::HIS_NE2_INDEX,false);
   AddInfo(HSD, HParticle, 0.30, "HD1", promod3::loop::HIS_HD1_INDEX,true);
+
+  if(cb_in_sidechain) {
+    AddInfo(HSD, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(HSD, promod3::loop::HIS_HD1_INDEX, promod3::loop::HIS_ND1_INDEX, 5);
   AddLP(HSD, promod3::loop::HIS_CD2_INDEX, promod3::loop::HIS_NE2_INDEX, 
         promod3::loop::HIS_CE1_INDEX, false, false, false, 4, LONE_PAIR_CNC);
+
+
   AddFRMRule(HSD, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(HSD, 0, -1.84);
   AddFRMPrefactor(HSD, 0, 1.84);
@@ -882,6 +1178,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(HSD, 0, 3);
   AddFRMRotatingParticle(HSD, 0, 4);
   AddFRMRotatingParticle(HSD, 0, 5);
+
   AddFRMRule(HSD, promod3::loop::BB_CB_INDEX, promod3::loop::HIS_CG_INDEX);
   AddFRMPrefactor(HSD, 1, -0.85);
   AddFRMPrefactor(HSD, 1, 0.85);
@@ -891,14 +1188,24 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(HSD, 1, 3);
   AddFRMRotatingParticle(HSD, 1, 4);
   AddFRMRotatingParticle(HSD, 1, 5);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(HSD, 0, 6);
+    AddFRMFixParticle(HSD, 1, 6);
+  }
+
   backbone_infos_[HSD].has_hydrogens = true;
   AddBBInfo(HSD, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(HSD, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(HSD, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(HSD, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(HSD, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(HSD, HParticle, 0.25, "H", promod3::loop::HIS_H_INDEX,true);
-  AddBBPDir(HSD, promod3::loop::HIS_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddInfo(HSD, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(HSD, promod3::loop::HIS_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(HSD, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -906,15 +1213,22 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[HSE].has_hydrogens = true;
   sidechain_infos_[HSE].internal_e_prefactor = 2.01;
   sidechain_infos_[HSE].frm_t = 1.35;
+  
   AddInfo(HSE, CParticle, 0.10, "CG", promod3::loop::HIS_CG_INDEX,false);
   AddInfo(HSE, NParticle, -0.40, "ND1", promod3::loop::HIS_ND1_INDEX,false);
   AddInfo(HSE, CParticle, 0.10, "CD2", promod3::loop::HIS_CD2_INDEX,false);
   AddInfo(HSE, CParticle, 0.30, "CE1", promod3::loop::HIS_CE1_INDEX,false);
   AddInfo(HSE, NParticle, -0.40, "NE2", promod3::loop::HIS_NE2_INDEX,false);
   AddInfo(HSE, HParticle, 0.30, "HE2", promod3::loop::HIS_HE2_INDEX,true);
+  
+  if(cb_in_sidechain) {
+    AddInfo(HSE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddPDir(HSE, promod3::loop::HIS_HE2_INDEX, promod3::loop::HIS_NE2_INDEX, 5);
   AddLP(HSE, promod3::loop::HIS_CG_INDEX, promod3::loop::HIS_ND1_INDEX, 
         promod3::loop::HIS_CE1_INDEX, false, false, false, 1, LONE_PAIR_CNC);
+
   AddFRMRule(HSE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(HSE, 0, -1.84);
   AddFRMPrefactor(HSE, 0, 1.84);
@@ -924,6 +1238,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(HSE, 0, 3);
   AddFRMRotatingParticle(HSE, 0, 4);
   AddFRMRotatingParticle(HSE, 0, 5);
+
   AddFRMRule(HSE, promod3::loop::BB_CB_INDEX, promod3::loop::HIS_CG_INDEX);
   AddFRMPrefactor(HSE, 1, -0.85);
   AddFRMPrefactor(HSE, 1, 0.85);
@@ -933,14 +1248,24 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(HSE, 1, 3);
   AddFRMRotatingParticle(HSE, 1, 4);
   AddFRMRotatingParticle(HSE, 1, 5);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(HSE, 0, 6);
+    AddFRMFixParticle(HSE, 1, 6);
+  }
+
   backbone_infos_[HSE].has_hydrogens = true;
   AddBBInfo(HSE, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(HSE, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(HSE, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(HSE, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(HSE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(HSE, HParticle, 0.25, "H", promod3::loop::HIS_H_INDEX,true);
-  AddBBPDir(HSE, promod3::loop::HIS_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(HSE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
+  AddBBPDir(HSE, promod3::loop::HIS_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(HSE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
@@ -954,12 +1279,18 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   sidechain_infos_[PHE].has_hydrogens = false;
   sidechain_infos_[PHE].internal_e_prefactor = 1.71;
   sidechain_infos_[PHE].frm_t = 1.07;
+  
   AddInfo(PHE, CParticle, 0.0, "CG", promod3::loop::PHE_CG_INDEX, false);
   AddInfo(PHE, CParticle, 0.0, "CD1", promod3::loop::PHE_CD1_INDEX, false);  
   AddInfo(PHE, CParticle, 0.0, "CD2", promod3::loop::PHE_CD2_INDEX, false); 
   AddInfo(PHE, CParticle, 0.0, "CE1", promod3::loop::PHE_CE1_INDEX, false);  
   AddInfo(PHE, CParticle, 0.0, "CE2", promod3::loop::PHE_CE2_INDEX, false); 
   AddInfo(PHE, CParticle, 0.0, "CZ", promod3::loop::PHE_CZ_INDEX, false); 
+
+  if(cb_in_sidechain) {
+    AddInfo(PHE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   AddFRMRule(PHE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_CB_INDEX);
   AddFRMPrefactor(PHE, 0, -1.45);
   AddFRMPrefactor(PHE, 0, 1.45);
@@ -969,6 +1300,7 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(PHE, 0, 3);
   AddFRMRotatingParticle(PHE, 0, 4);
   AddFRMRotatingParticle(PHE, 0, 5);
+
   AddFRMRule(PHE, promod3::loop::BB_CB_INDEX, promod3::loop::PHE_CG_INDEX);
   AddFRMPrefactor(PHE, 1, -1.35);
   AddFRMPrefactor(PHE, 1, 1.35);
@@ -978,32 +1310,56 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   AddFRMRotatingParticle(PHE, 1, 3);
   AddFRMRotatingParticle(PHE, 1, 4);
   AddFRMRotatingParticle(PHE, 1, 5);
+
+  if(cb_in_sidechain) {
+    AddFRMFixParticle(PHE, 0, 6);
+    AddFRMFixParticle(PHE, 1, 6);
+  }
+
   backbone_infos_[PHE].has_hydrogens = true;
   AddBBInfo(PHE, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(PHE, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(PHE, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(PHE, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(PHE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(PHE, HParticle, 0.25, "H", promod3::loop::PHE_H_INDEX,true);
-  AddBBPDir(PHE, promod3::loop::PHE_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(PHE, CH2Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false); 
+  }
+
+  AddBBPDir(PHE, promod3::loop::PHE_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(PHE, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
   // ALA
   sidechain_infos_[ALA].has_hydrogens = false;
+  sidechain_infos_[ALA].internal_e_prefactor = 1.0;
+  sidechain_infos_[ALA].frm_t = 1.0;
+
+  if(cb_in_sidechain) {
+    AddInfo(ALA, CH3Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
+  }
+
   backbone_infos_[ALA].has_hydrogens = true;
   AddBBInfo(ALA, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(ALA, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
   AddBBInfo(ALA, CParticle, 0.55, "C", promod3::loop::BB_C_INDEX, false);
   AddBBInfo(ALA, OParticle, -0.55, "O", promod3::loop::BB_O_INDEX, false);
-  AddBBInfo(ALA, CH3Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false);
   AddBBInfo(ALA, HParticle, 0.25, "H", promod3::loop::ALA_H_INDEX,true);
-  AddBBPDir(ALA, promod3::loop::ALA_H_INDEX, promod3::loop::BB_N_INDEX, 5);
+
+  if(!cb_in_sidechain) {
+    AddBBInfo(ALA, CH3Particle, 0.0, "CB", promod3::loop::BB_CB_INDEX, false); 
+  }
+
+  AddBBPDir(ALA, promod3::loop::ALA_H_INDEX, promod3::loop::BB_N_INDEX, 4);
   AddBBLP(ALA, promod3::loop::BB_CA_INDEX, promod3::loop::BB_C_INDEX, 
           promod3::loop::BB_O_INDEX, false, false, false, 3, LONE_PAIR_CARBONYL);
 
   // GLY
   sidechain_infos_[GLY].has_hydrogens = false;
+  sidechain_infos_[GLY].internal_e_prefactor = 1.0;
+  sidechain_infos_[GLY].frm_t = 1.0;
+  
   backbone_infos_[GLY].has_hydrogens = true;
   AddBBInfo(GLY, NParticle, -0.35, "N", promod3::loop::BB_N_INDEX, false);
   AddBBInfo(GLY, CH1Particle, 0.1, "CA", promod3::loop::BB_CA_INDEX, false);
@@ -1025,7 +1381,8 @@ SCWRLRotamerLookup::SCWRLRotamerLookup() {
   }
 }
 
-SCWRLRotamerConstructor::SCWRLRotamerConstructor(){
+SCWRLRotamerConstructor::SCWRLRotamerConstructor(bool cb_in_sidechain): 
+                                rotamer_lookup_(cb_in_sidechain) {
   String s(XXX,'X');
   for(uint i = 0; i < XXX; ++i){
     s[i] = RotIDToOLC(RotamerID(i));
@@ -1055,16 +1412,6 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
                                         probability_cutoff);
 }
 
-RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        RotamerLibPtr rot_lib, Real probability_cutoff){
-  std::pair<RotamerLibEntry*,uint> lib_entries = rot_lib->QueryLib(id);
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructRRMRotamerGroup(id, residue_index, lib_entries, 
-                                        probability_cutoff);
-}
-
 FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
         const ost::mol::ResidueHandle& res, RotamerID id,
         uint residue_index, RotamerLibPtr rot_lib, 
@@ -1085,16 +1432,6 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
                                         probability_cutoff);
 }
 
-FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        RotamerLibPtr rot_lib, Real probability_cutoff){
-  std::pair<RotamerLibEntry*,uint> lib_entries = rot_lib->QueryLib(id);
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructFRMRotamerGroup(id, residue_index, lib_entries, 
-                                        probability_cutoff);
-}
-
 RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
         const ost::mol::ResidueHandle& res, RotamerID id,
         uint residue_index, BBDepRotamerLibPtr rot_lib, 
@@ -1116,17 +1453,6 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
                                         probability_cutoff);
 }
 
-RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        BBDepRotamerLibPtr rot_lib, 
-        Real phi, Real psi, Real probability_cutoff){
-  std::pair<RotamerLibEntry*,uint> lib_entries = rot_lib->QueryLib(id, phi, psi);
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructRRMRotamerGroup(id, residue_index, lib_entries, 
-                                        probability_cutoff);
-}
-
 FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
         const ost::mol::ResidueHandle& res, RotamerID id,
         uint residue_index, BBDepRotamerLibPtr rot_lib, 
@@ -1148,26 +1474,11 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
                                         probability_cutoff);
 }
 
-FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        BBDepRotamerLibPtr rot_lib, 
-        Real phi, Real psi, Real probability_cutoff){
-  std::pair<RotamerLibEntry*,uint> lib_entries = rot_lib->QueryLib(id, phi, psi);
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructFRMRotamerGroup(id, residue_index, lib_entries, 
-                                        probability_cutoff);
-}
-
 RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
         const ost::mol::ResidueHandle& res, RotamerID id,
         uint residue_index, 
         std::vector<RotamerLibEntry>& lib_entries, 
         Real probability_cutoff){
-  if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
   std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
   std::make_pair(&lib_entries[0], lib_entries.size());
   this->SetPosBuffer(res, id);
@@ -1180,10 +1491,6 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
         uint aa_res_idx, RotamerID id, uint residue_index,
         std::vector<RotamerLibEntry>& lib_entries, 
         Real probability_cutoff){
-   if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
   std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
   std::make_pair(&lib_entries[0], lib_entries.size());
   this->SetPosBuffer(all_atom, aa_res_idx, id);
@@ -1191,30 +1498,10 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
                                         probability_cutoff);
 }
 
-RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        std::vector<RotamerLibEntry>& lib_entries, 
-        Real probability_cutoff){
-  if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
-  std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
-  std::make_pair(&lib_entries[0], lib_entries.size());
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructRRMRotamerGroup(id, residue_index, I_LIKE_CHEESE, 
-                                        probability_cutoff);
-}
-
 FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
         const ost::mol::ResidueHandle& res, RotamerID id,
         uint residue_index, std::vector<RotamerLibEntry>& lib_entries, 
         Real probability_cutoff){
-  if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
   std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
   std::make_pair(&lib_entries[0], lib_entries.size());
   this->SetPosBuffer(res, id);
@@ -1227,10 +1514,6 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
         uint aa_res_idx, RotamerID id, uint residue_index,
         std::vector<RotamerLibEntry>& lib_entries, 
         Real probability_cutoff){
-  if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
   std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
   std::make_pair(&lib_entries[0], lib_entries.size());
   this->SetPosBuffer(all_atom, aa_res_idx, id);
@@ -1238,22 +1521,6 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
                                         probability_cutoff);
 }
 
-FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
-        const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-        const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-        std::vector<RotamerLibEntry>& lib_entries, 
-        Real probability_cutoff){
-  if(lib_entries.empty()){
-    throw promod3::Error("How do you want me to construct rotamers with an " 
-                         "empty input?");
-  }
-  std::pair<RotamerLibEntry*,uint> I_LIKE_CHEESE = 
-  std::make_pair(&lib_entries[0], lib_entries.size());
-  this->SetPosBuffer(n_pos, ca_pos, cb_pos, id);
-  return this->ConstructFRMRotamerGroup(id, residue_index, I_LIKE_CHEESE, 
-                                        probability_cutoff);
-}
-
 
 FrameResiduePtr SCWRLRotamerConstructor::ConstructBackboneFrameResidue(
           const ost::mol::ResidueHandle& res, RotamerID id, uint residue_index,
@@ -1262,8 +1529,7 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructBackboneFrameResidue(
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructBackboneFrameResidue", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetBackboneInfo(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetBackboneInfo(id);
 
   for(uint i = 0; i < info.particles.size(); ++i){
     if(!info.particles[i].is_hydrogen){
@@ -1301,8 +1567,7 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructBackboneFrameResidue(
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructBackboneFrameResidue", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetBackboneInfo(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetBackboneInfo(id);
 
   for(uint i = 0; i < info.particles.size(); ++i){
     if(!info.particles[i].is_hydrogen){
@@ -1334,49 +1599,13 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructBackboneFrameResidue(
   return p; 
 }
 
-FrameResiduePtr SCWRLRotamerConstructor::ConstructBackboneFrameResidue(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos, 
-          const geom::Vec3& c_pos, const geom::Vec3& o_pos,
-          const geom::Vec3& cb_pos, 
-          RotamerID id, uint residue_index,
-          Real phi, bool n_ter, bool c_ter){
-
-  core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
-          "SCWRLRotamerConstructor::ConstructBackboneFrameResidue", 2);
-
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetBackboneInfo(id);
-
-  pos_buffer_->SetPos(id, promod3::loop::BB_N_INDEX, n_pos);
-  pos_buffer_->SetPos(id, promod3::loop::BB_CA_INDEX, ca_pos);
-  pos_buffer_->SetPos(id, promod3::loop::BB_C_INDEX, c_pos);
-  pos_buffer_->SetPos(id, promod3::loop::BB_O_INDEX, o_pos);
-  if(id != GLY) pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, cb_pos);
-
-  //set hydrogens
-  if(info.has_hydrogens){
-    promod3::loop::ConstructHydrogenN(*pos_buffer_, id, phi, *hydrogen_buffer_); 
-  }
-
-  int num_particles = info.particles.size();
-  if(n_ter) num_particles += 2;
-  if(c_ter) num_particles += 1;
-  std::vector<Particle> particles(num_particles);
-  this->ConstructBBFrameParticles(info, id, n_ter, c_ter, particles);
-
-  FrameResiduePtr p = boost::make_shared<FrameResidue>(particles, residue_index);
-
-  return p; 
-}
-
 FrameResiduePtr SCWRLRotamerConstructor::ConstructSidechainFrameResidue(
           const ost::mol::ResidueHandle& res, RotamerID id, uint residue_index){
 
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructSidechainFrameResidue", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetSidechainInfo(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetSidechainInfo(id);
 
   for(uint i = 0; i < info.particles.size(); ++i){
     if(!info.particles[i].is_hydrogen){
@@ -1413,8 +1642,7 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructSidechainFrameResidue(
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructSidechainFrameResidue", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetSidechainInfo(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetSidechainInfo(id);
 
   for(uint i = 0; i < info.particles.size(); ++i){
     if(!info.particles[i].is_hydrogen){
@@ -1597,6 +1825,20 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
     MVBBPosBuffer(HIS, HSE);
   }
 
+  // in case of alanine and glycine, the rotamer libraries won't have any 
+  // entries. For consistency we nevertheless construct rotamers.
+  // We simply add a fake RotamerLibEntry in this case that has
+  // no sidechain dihedrals set.
+  std::vector<RotamerLibEntry> fake_rotamers(1);
+  if(lib_entries.second == 0 && (id == ALA || id == GLY)) {
+    // we have to make sure, that the according probability really is one!
+    fake_rotamers[0].probability = 1.0;
+    lib_entries = std::make_pair(&fake_rotamers[0], 1);
+  }
+  else if(lib_entries.second == 0) {
+    throw promod3::Error("Did not find any rotamers in Rotamer Library!");
+  }
+
   for(uint i = 0; i < lib_entries.second; ++i){
 
     probability_ = lib_entries.first[i].probability;
@@ -1669,6 +1911,20 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
     MVBBPosBuffer(HIS, HSE);
   }
 
+  // in case of alanine and glycine, the rotamer libraries won't have any 
+  // entries. For consistency we nevertheless construct rotamers.
+  // We simply add a fake RotamerLibEntry in this case that has
+  // no sidechain dihedrals set.
+  std::vector<RotamerLibEntry> fake_rotamers(1);
+  if(lib_entries.second == 0 && (id == ALA || id == GLY)) {
+    // we have to make sure, that the according probability really is one!
+    fake_rotamers[0].probability = 1.0;
+    lib_entries = std::make_pair(&fake_rotamers[0], 1);
+  }
+  else if(lib_entries.second == 0) {
+    throw promod3::Error("Did not find any rotamers in Rotamer Library!");
+  }
+
   for(uint i = 0; i < lib_entries.second; ++i){
     probability_ = lib_entries.first[i].probability;
     summed_prob += probability_;
@@ -1733,10 +1989,8 @@ RRMRotamerPtr SCWRLRotamerConstructor::ConstructRRMRotamer(RotamerID id,
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructRRMRotamer", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetSidechainInfo(id);
-  int num_particles = 
-  SCWRLRotamerLookup::GetInstance().GetNumSidechainParticles(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetSidechainInfo(id);
+  int num_particles = rotamer_lookup_.GetNumSidechainParticles(id);
   std::vector<Particle> particles(num_particles);
 
   //set the positions
@@ -1749,7 +2003,7 @@ RRMRotamerPtr SCWRLRotamerConstructor::ConstructRRMRotamer(RotamerID id,
     promod3::loop::ConstructHydrogens(*pos_buffer_, id, *hydrogen_buffer_, true, 
                                       promod3::loop::PROT_STATE_HISH);
 
-    // If there are any custom rules, we apply them now an overrule the
+    // If there are any custom rules, we apply them now and overrule the
     // default hydrogen construction
     if(!info.custom_hydrogens.empty()){
       for(uint i = 0; i < info.custom_hydrogens.size(); ++i){
@@ -1781,12 +2035,9 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::ConstructFRMRotamer", 2);
 
-  const SCWRLRotamerInfo& info = 
-  SCWRLRotamerLookup::GetInstance().GetSidechainInfo(id);
-  int num_rrm_particles = 
-  SCWRLRotamerLookup::GetInstance().GetNumSidechainParticles(id);
-  int num_particles = 
-  SCWRLRotamerLookup::GetInstance().GetNumFRMSidechainParticles(id);
+  const SCWRLRotamerInfo& info = rotamer_lookup_.GetSidechainInfo(id);
+  int num_rrm_particles = rotamer_lookup_.GetNumSidechainParticles(id);
+  int num_particles = rotamer_lookup_.GetNumFRMSidechainParticles(id);
   std::vector<Particle> particles(num_particles);
 
   //set the positions
@@ -1823,8 +2074,7 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
   for(int i = 0; i < num_rrm_particles; ++i) actual_definition[i] = i;
   subrotamer_definitions.push_back(actual_definition);
 
-  const std::vector<SCWRLFRMRule>& frm_rules = 
-  SCWRLRotamerLookup::GetInstance().GetFRMRules(id);
+  const std::vector<SCWRLFRMRule>& frm_rules = rotamer_lookup_.GetFRMRules(id);
   geom::Vec3 rotation_axis, rotation_anchor;
   geom::Vec3 orig_pos, rot_pos;
   geom::Mat4 rot;
@@ -1836,8 +2086,10 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
     int num_rotating_particles = frm_rule.rotating_particles.size();
 
     // Update the subrotamer definition... all particles that are fixed are taken
-    // from the first subrotamer, the indices therefore start from 0
-    for(int i = 0; i < num_fix_particles; ++i) actual_definition[i] = i;
+    // from the first subrotamer.
+    for(int i = 0; i < num_fix_particles; ++i) {
+      actual_definition[i] = frm_rule.fix_particles[i];
+    }
 
     // The data required for the rotation around the specified axis
     rotation_anchor = pos_buffer_->GetPos(id, frm_rule.anchor_idx_two);
@@ -1853,9 +2105,10 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
                                               rotation_angle);
 
       for(int i = 0; i < num_rotating_particles; ++i){
+        int orig_particle_idx = frm_rule.rotating_particles[i];
         int new_particle_idx = base_idx + i;
-        int orig_particle_idx = num_fix_particles + i;
 
+        // replace the old with the new index...
         actual_definition[orig_particle_idx] = new_particle_idx;
 
         // get the new position
@@ -1877,10 +2130,10 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
       // instead of building them from scratch, they get extracted from the
       // initial particles and transformed
       for(int i = 0; i < num_rotating_particles; ++i){
-        int orig_particle_idx = num_fix_particles + i;
+        int orig_particle_idx = frm_rule.rotating_particles[i];
+        int new_particle_idx = base_idx + i;
 
         if(particles[orig_particle_idx].IsHBondDonor()){
-          int new_particle_idx = base_idx + i;
           orig_pos = particles[orig_particle_idx].GetPos() +
                      particles[orig_particle_idx].GetPolarDirection();
           rot_pos[0] = rot(0,0) * orig_pos[0] + rot(0,1) * orig_pos[1] + 
@@ -1895,7 +2148,6 @@ FRMRotamerPtr SCWRLRotamerConstructor::ConstructFRMRotamer(RotamerID id,
         }
 
         if(particles[orig_particle_idx].IsHBondAcceptor()){
-          int new_particle_idx = base_idx + i;
           const std::vector<geom::Vec3>& lp = 
           particles[orig_particle_idx].GetLonePairs();
           for(uint j = 0; j < lp.size(); ++j){
@@ -1939,14 +2191,26 @@ void SCWRLRotamerConstructor::SetPosBuffer(const ost::mol::ResidueHandle& res,
   ost::mol::AtomHandle n = res.FindAtom("N");
   ost::mol::AtomHandle ca = res.FindAtom("CA");
   ost::mol::AtomHandle cb = res.FindAtom("CB");
+  ost::mol::AtomHandle c = res.FindAtom("C");
+  ost::mol::AtomHandle o = res.FindAtom("O");
 
-  if(!(n.IsValid() && ca.IsValid() && cb.IsValid())){
-    throw promod3::Error("N, CA and CB must be valid to construct rotamer!");
+  if(!(n.IsValid() && ca.IsValid() && c.IsValid() && o.IsValid())) {
+    throw promod3::Error("All backbone atoms must be valid to construct "
+                         "rotamer!");
   }
 
   pos_buffer_->SetPos(id, promod3::loop::BB_N_INDEX, n.GetPos());
   pos_buffer_->SetPos(id, promod3::loop::BB_CA_INDEX, ca.GetPos());
-  pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, cb.GetPos());
+  pos_buffer_->SetPos(id, promod3::loop::BB_C_INDEX, c.GetPos());
+  pos_buffer_->SetPos(id, promod3::loop::BB_O_INDEX, o.GetPos());
+
+  if(id != GLY) {
+    if(!cb.IsValid()) {
+      throw promod3::Error("All backbone atoms must be valid to construct "
+                           "rotamer!");
+    }
+    pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, cb.GetPos());
+  }
 }
 
 void SCWRLRotamerConstructor::SetPosBuffer(const promod3::loop::AllAtomPositions& all_atom_pos,
@@ -1955,31 +2219,38 @@ void SCWRLRotamerConstructor::SetPosBuffer(const promod3::loop::AllAtomPositions
   core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
           "SCWRLRotamerConstructor::SetPosBuffer_all_atom_pos", 2);
 
+
   if(!(all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_N_INDEX) &&
        all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_CA_INDEX) &&
-       all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_CB_INDEX))){
-    throw promod3::Error("N, CA and CB must be set to construct rotamer!");
+       all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_C_INDEX) &&
+       all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_O_INDEX))){
+    throw promod3::Error("All backbone atoms must be set to construct "
+                         "rotamer!");
   }
 
   pos_buffer_->SetPos(id, promod3::loop::BB_N_INDEX, 
-                      all_atom_pos.GetPos(all_atom_idx, promod3::loop::BB_N_INDEX));
+                      all_atom_pos.GetPos(all_atom_idx, 
+                                          promod3::loop::BB_N_INDEX));
   pos_buffer_->SetPos(id, promod3::loop::BB_CA_INDEX, 
-                      all_atom_pos.GetPos(all_atom_idx, promod3::loop::BB_CA_INDEX));
-  pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, 
-                      all_atom_pos.GetPos(all_atom_idx, promod3::loop::BB_CB_INDEX));  
-}
-
-void SCWRLRotamerConstructor::SetPosBuffer(const geom::Vec3& n_pos, 
-                                           const geom::Vec3& ca_pos, 
-                                           const geom::Vec3& cb_pos,
-                                           RotamerID id){
-
-  core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
-          "SCWRLRotamerConstructor::SetPosBuffer_vec3", 2);
+                      all_atom_pos.GetPos(all_atom_idx, 
+                                          promod3::loop::BB_CA_INDEX));
+  pos_buffer_->SetPos(id, promod3::loop::BB_C_INDEX, 
+                      all_atom_pos.GetPos(all_atom_idx, 
+                                          promod3::loop::BB_C_INDEX));
+  pos_buffer_->SetPos(id, promod3::loop::BB_O_INDEX, 
+                      all_atom_pos.GetPos(all_atom_idx, 
+                                          promod3::loop::BB_O_INDEX));  
+
+  if(id != GLY) {
+    if(!all_atom_pos.IsSet(all_atom_idx, promod3::loop::BB_CB_INDEX)) {
+      throw promod3::Error("All backbone atoms must be valid to construct "
+                           "rotamer!");
+    }
+    pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, 
+                        all_atom_pos.GetPos(all_atom_idx, 
+                                            promod3::loop::BB_CB_INDEX));
 
-  pos_buffer_->SetPos(id, promod3::loop::BB_N_INDEX, n_pos);
-  pos_buffer_->SetPos(id, promod3::loop::BB_CA_INDEX, ca_pos);
-  pos_buffer_->SetPos(id, promod3::loop::BB_CB_INDEX, cb_pos);  
+  }
 }
 
 void SCWRLRotamerConstructor::MVBBPosBuffer(RotamerID from, RotamerID to){
@@ -1987,6 +2258,13 @@ void SCWRLRotamerConstructor::MVBBPosBuffer(RotamerID from, RotamerID to){
                       pos_buffer_->GetPos(from, promod3::loop::BB_N_INDEX));
   pos_buffer_->SetPos(to, promod3::loop::BB_CA_INDEX, 
                       pos_buffer_->GetPos(from, promod3::loop::BB_CA_INDEX));
+  pos_buffer_->SetPos(to, promod3::loop::BB_C_INDEX, 
+                      pos_buffer_->GetPos(from, promod3::loop::BB_C_INDEX));
+  pos_buffer_->SetPos(to, promod3::loop::BB_O_INDEX, 
+                      pos_buffer_->GetPos(from, promod3::loop::BB_O_INDEX));
+  // Even though we officially count CB as a sidechain atom, we still move it
+  // since its completely independent of any sidechain dihedral angle and
+  // cannot be constructed anyway
   pos_buffer_->SetPos(to, promod3::loop::BB_CB_INDEX, 
                       pos_buffer_->GetPos(from, promod3::loop::BB_CB_INDEX));
 }
@@ -2062,54 +2340,38 @@ void SCWRLRotamerConstructor::ConstructBBFrameParticles(
   }
 
   if(n_ter){
-    if(id == PRO || id == TPR || id == CPR){
-      // there are two hydrogens
-      geom::Vec3 ht1_pos, ht2_pos;
-      geom::Vec3 cb_pos, ca_pos, n_pos;
-      // Actually we would have to reconstruct the hydrogens using the prolines
-      // CD atom... since we only have bb info, we use the CB atom.
-      // rather crude, I know...
-      cb_pos = pos_buffer_->GetPos(id, promod3::loop::BB_CB_INDEX);
-      ca_pos = pos_buffer_->GetPos(id, promod3::loop::BB_CA_INDEX);
-      n_pos = pos_buffer_->GetPos(id, promod3::loop::BB_N_INDEX);
-      promod3::core::ConstructAtomPos(cb_pos, ca_pos, n_pos, 0.997, 2.042, 
-                                      2.0944, ht1_pos);
-      promod3::core::ConstructAtomPos(cb_pos,ca_pos,n_pos,0.997, 2.042, 
-                                     -2.0944, ht2_pos);
-      particles[p_idx] = Particle(HParticle, ht1_pos, 0.35, "HT1");
-      particles[p_idx].SetPolarDirection(ht1_pos - n_pos);
-      particles[p_idx + 1] = Particle(HParticle, ht2_pos, 0.35, "HT2");
-      particles[p_idx + 1].SetPolarDirection(ht2_pos - n_pos);
+    geom::Vec3 ht1_pos, ht2_pos, ht3_pos;
+    geom::Vec3 n_pos, ca_pos, c_pos;
+    n_pos = pos_buffer_->GetPos(id, promod3::loop::BB_N_INDEX);
+    ca_pos = pos_buffer_->GetPos(id, promod3::loop::BB_CA_INDEX);
+    c_pos = pos_buffer_->GetPos(id, promod3::loop::BB_C_INDEX);
+    promod3::core::ConstructAtomPos(c_pos, ca_pos, n_pos, 0.997, 2.042, 
+                                    1.0472, ht1_pos);
+    promod3::core::ConstructAtomPos(c_pos,ca_pos,n_pos,0.997, 2.042, 
+                                    -1.0472, ht2_pos);
+    particles[p_idx] = Particle(HParticle, ht1_pos, 0.35, "HT1");
+    particles[p_idx].SetPolarDirection(ht1_pos - n_pos);
+    particles[p_idx + 1] = Particle(HParticle, ht2_pos, 0.35, "HT2");
+    particles[p_idx + 1].SetPolarDirection(ht2_pos - n_pos);
+
+    if(id == PRO || id == TPR || id == CPR) {
+      // there are only two hydrogens... please note, that they are not
+      // optimally placed in case of proline. 
+      // we would have to consider CD for that. This costs a good bottle 
+      // of wine that I implement that correctly...
+      return;
     }
-    else{
-      // there are three hydrogens
-      geom::Vec3 ht1_pos, ht2_pos, ht3_pos;
-      geom::Vec3 cb_pos, ca_pos, n_pos; 
-      if(id == GLY) cb_pos = pos_buffer_->GetPos(id, promod3::loop::BB_C_INDEX);
-      else cb_pos = pos_buffer_->GetPos(id, promod3::loop::BB_CB_INDEX);
-      ca_pos = pos_buffer_->GetPos(id, promod3::loop::BB_CA_INDEX);
-      n_pos = pos_buffer_->GetPos(id, promod3::loop::BB_N_INDEX);
-      promod3::core::ConstructAtomPos(cb_pos, ca_pos, n_pos, 0.997, 2.042, 
-                                      M_PI, ht1_pos);
-      promod3::core::ConstructAtomPos(cb_pos, ca_pos, n_pos, 0.997, 2.042,
-                                      1.0472, ht2_pos);
-      promod3::core::ConstructAtomPos(cb_pos, ca_pos, n_pos, 0.997, 2.042, 
-                                      -1.0472, ht3_pos);
-
-      // we assume, that there is currently one hydrogen and replace it with ht1
-      for(uint i = 0; i < info.particles.size(); ++i){
-        if(info.particles[i].is_hydrogen){
-          particles[i] = Particle(HParticle, ht1_pos, 0.35, "HT1");
-          particles[i].SetPolarDirection(ht1_pos - n_pos);
-          break;
-        }
-      }
 
-      // set ht2 and ht3
-      particles[p_idx] = Particle(HParticle, ht2_pos, 0.35, "HT2");
-      particles[p_idx].SetPolarDirection(ht2_pos - n_pos);
-      particles[p_idx + 1] = Particle(HParticle, ht3_pos, 0.35, "HT3");
-      particles[p_idx + 1].SetPolarDirection(ht3_pos - n_pos);
+    promod3::core::ConstructAtomPos(c_pos, ca_pos, n_pos, 0.997, 2.042, 
+                                    M_PI, ht3_pos);
+    // we assume, that there is currently one hydrogen apart from ht1 and ht2 
+    // and replace it with ht3
+    for(uint i = 0; i < info.particles.size(); ++i){
+      if(info.particles[i].is_hydrogen){
+        particles[i] = Particle(HParticle, ht3_pos, 0.35, "HT3");
+        particles[i].SetPolarDirection(ht3_pos - n_pos);
+        break;
+      }
     }
   }
 }
diff --git a/sidechain/src/scwrl_rotamer_constructor.hh b/sidechain/src/scwrl_rotamer_constructor.hh
index cc0b38b392d9a5231a9d94a335bd469f15920014..8beea0819bacefa5d12de50ce1500740b23c20ed 100644
--- a/sidechain/src/scwrl_rotamer_constructor.hh
+++ b/sidechain/src/scwrl_rotamer_constructor.hh
@@ -18,6 +18,9 @@
 
 namespace promod3 { namespace sidechain {
 
+class SCWRLRotamerConstructor;
+typedef boost::shared_ptr<SCWRLRotamerConstructor> SCWRLRotamerConstructorPtr;
+
 /// \brief Types of lone pair construction
 enum SCWRLLPRule {
   LONE_PAIR_CARBONYL, LONE_PAIR_COH, LONE_PAIR_CNC
@@ -135,11 +138,9 @@ struct SCWRLRotamerInfo{
 /// \brief Defines lookups to build rotamer stuff.
 class SCWRLRotamerLookup {
 public:
-  // Singleton access to one constant instance (see AminoAcidLookup for details)
-  static const SCWRLRotamerLookup& GetInstance() {
-    static SCWRLRotamerLookup instance;
-    return instance;
-  }
+
+  SCWRLRotamerLookup(bool cb_in_sidechain);
+
   // Data access
   const SCWRLRotamerInfo& GetSidechainInfo(RotamerID id) const { 
     return sidechain_infos_[id]; 
@@ -227,8 +228,6 @@ private:
     frm_rules_[id][rule_idx].fix_particles.push_back(p_idx);
   }
 
-  SCWRLRotamerLookup();
-
   // To construct classical rotamers or as lookup for sidechain frame residues
   SCWRLRotamerInfo sidechain_infos_[XXX + 1];
 
@@ -248,7 +247,7 @@ class SCWRLRotamerConstructor{
 
 public:
 
-  SCWRLRotamerConstructor();
+  SCWRLRotamerConstructor(bool cb_in_sidechain = false);
 
   // Construct rotamer groups from non backbone dependent library
   RRMRotamerGroupPtr ConstructRRMRotamerGroup(
@@ -261,12 +260,6 @@ public:
           uint aa_res_idx, RotamerID id, uint residue_index,
           RotamerLibPtr rot_lib, 
           Real probability_cutoff = 0.98);
-
-  RRMRotamerGroupPtr ConstructRRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          RotamerLibPtr rot_lib, 
-          Real probability_cutoff = 0.98);
   
   FRMRotamerGroupPtr ConstructFRMRotamerGroup(
           const ost::mol::ResidueHandle& res, RotamerID id,
@@ -279,12 +272,6 @@ public:
           RotamerLibPtr rot_lib, 
           Real probability_cutoff = 0.98);
 
-  FRMRotamerGroupPtr ConstructFRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          RotamerLibPtr rot_lib, 
-          Real probability_cutoff = 0.98);
-
   // Construct rotamer groups from backbone dependent library
   RRMRotamerGroupPtr ConstructRRMRotamerGroup(
           const ost::mol::ResidueHandle& res, RotamerID id,
@@ -300,14 +287,6 @@ public:
           Real phi = -1.0472, 
           Real psi =  -0.7854,
           Real probability_cutoff = 0.98);
-
-  RRMRotamerGroupPtr ConstructRRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          BBDepRotamerLibPtr rot_lib, 
-          Real phi = -1.0472, 
-          Real psi =  -0.7854,
-          Real probability_cutoff = 0.98);
   
   FRMRotamerGroupPtr ConstructFRMRotamerGroup(
           const ost::mol::ResidueHandle& res, RotamerID id,
@@ -324,14 +303,6 @@ public:
           Real psi =  -0.7854,
           Real probability_cutoff = 0.98);
 
-  FRMRotamerGroupPtr ConstructFRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          BBDepRotamerLibPtr rot_lib, 
-          Real phi = -1.0472, 
-          Real psi =  -0.7854,
-          Real probability_cutoff = 0.98);
-
   // Construct rotamer groups directly from rotamerlib entries
   RRMRotamerGroupPtr ConstructRRMRotamerGroup(
           const ost::mol::ResidueHandle& res, RotamerID id,
@@ -344,12 +315,6 @@ public:
           uint aa_res_idx, RotamerID id, uint residue_index,
           std::vector<RotamerLibEntry>& lib_entries, 
           Real probability_cutoff = 0.98);
-
-  RRMRotamerGroupPtr ConstructRRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          std::vector<RotamerLibEntry>& lib_entries, 
-          Real probability_cutoff = 0.98);
   
   FRMRotamerGroupPtr ConstructFRMRotamerGroup(
           const ost::mol::ResidueHandle& res, RotamerID id,
@@ -363,26 +328,12 @@ public:
           std::vector<RotamerLibEntry>& lib_entries, 
           Real probability_cutoff = 0.98);
 
-  FRMRotamerGroupPtr ConstructFRMRotamerGroup(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-          const geom::Vec3& cb_pos, RotamerID id, uint residue_index,
-          std::vector<RotamerLibEntry>& lib_entries, 
-          Real probability_cutoff = 0.98);
-
   // Construct frame residues
   FrameResiduePtr ConstructBackboneFrameResidue(
           const ost::mol::ResidueHandle& res, RotamerID id, uint residue_index,
           Real phi, bool n_ter = false,
           bool c_ter = false);
 
-  FrameResiduePtr ConstructBackboneFrameResidue(
-          const geom::Vec3& n_pos, const geom::Vec3& ca_pos, 
-          const geom::Vec3& c_pos, const geom::Vec3& o_pos,
-          const geom::Vec3& cb_pos, 
-          RotamerID id, uint residue_index,
-          Real phi, bool n_ter = false,
-          bool c_ter = false);
-
   FrameResiduePtr ConstructBackboneFrameResidue(
           const promod3::loop::AllAtomPositions& all_atom, uint aa_res_idx, 
           RotamerID id, uint residue_index,
@@ -434,9 +385,6 @@ private:
   void SetPosBuffer(const promod3::loop::AllAtomPositions&,
                     uint aa_res_index, RotamerID id);
 
-  void SetPosBuffer(const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
-                    const geom::Vec3& cb_pos, RotamerID id);
-
   void MVBBPosBuffer(RotamerID from, RotamerID to);
 
   void ConstructBaseParticles(const SCWRLRotamerInfo& info, RotamerID id,
@@ -449,6 +397,7 @@ private:
   Real chi_angles_[4];
   Real chi_dev_[4];
   Real probability_;
+  SCWRLRotamerLookup rotamer_lookup_;
   promod3::loop::AllAtomPositionsPtr pos_buffer_;
   promod3::loop::HydrogenStoragePtr hydrogen_buffer_;
 };
diff --git a/sidechain/tests/test_frame_construction.cc b/sidechain/tests/test_frame_construction.cc
index edae739c5d13546fd4d3f3f550de1726e6fafc46..5c6801168270bd96ee3ae08bde1c0486fa8ce8b0 100644
--- a/sidechain/tests/test_frame_construction.cc
+++ b/sidechain/tests/test_frame_construction.cc
@@ -59,13 +59,7 @@ void CheckBackboneFrameConstruction(ost::mol::ResidueHandleList& res_list,
     // frame residues
     fr1 = rc.ConstructBackboneFrameResidue(res_list[i], r_id, i,
                                            phi, n_ter, c_ter);
-    const geom::Vec3 n_pos  = all_atoms.GetPos(i, loop::BB_N_INDEX);
-    const geom::Vec3 ca_pos = all_atoms.GetPos(i, loop::BB_CA_INDEX);
-    const geom::Vec3 c_pos  = all_atoms.GetPos(i, loop::BB_C_INDEX);
-    const geom::Vec3 o_pos  = all_atoms.GetPos(i, loop::BB_O_INDEX);
-    if (r_id != GLY) cb_pos = all_atoms.GetPos(i, loop::BB_CB_INDEX);
-    fr2 = rc.ConstructBackboneFrameResidue(n_pos, ca_pos, c_pos, o_pos, cb_pos,
-                                           r_id, i, phi, n_ter, c_ter);
+    fr2 = rc.ConstructBackboneFrameResidue(all_atoms, i, r_id, i, phi, n_ter, c_ter);
     CompareFrameResidues(*fr1, *fr2);
   }
 }
diff --git a/sidechain/tests/test_rotamers.cc b/sidechain/tests/test_rotamers.cc
index 702bfd1d5c246bc7dca25132ea18b29b5ff8a90c..0b49ec0bd4a76442941fdc4555df4ec18aa99c8d 100644
--- a/sidechain/tests/test_rotamers.cc
+++ b/sidechain/tests/test_rotamers.cc
@@ -96,7 +96,6 @@ void CheckRotamerGroupConstruction(ost::mol::ResidueHandleList& res_list,
                                    RotamerLibPtr rot_lib) {
   // check all frames
   BOOST_CHECK_EQUAL(res_list.size(), all_atoms.GetNumResidues());
-  geom::Vec3 cb_pos;
   RRMRotamerGroupPtr rrm1, rrm2;
   FRMRotamerGroupPtr frm1, frm2;
   SCWRLRotamerConstructor rot_constructor;
@@ -108,81 +107,33 @@ void CheckRotamerGroupConstruction(ost::mol::ResidueHandleList& res_list,
     // angles
     const Real phi = (n_ter) ? -1.0472 : all_atoms.GetPhiTorsion(i);
     const Real psi = (c_ter) ? -0.7854 : all_atoms.GetPsiTorsion(i);
-    // pos
-    const geom::Vec3 n_pos  = all_atoms.GetPos(i, loop::BB_N_INDEX);
-    const geom::Vec3 ca_pos = all_atoms.GetPos(i, loop::BB_CA_INDEX);
-    if (r_id != GLY) cb_pos = all_atoms.GetPos(i, loop::BB_CB_INDEX);
     // do it
-    if (r_id == ALA || r_id == GLY) {
-      // should all throw exceptions
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
-                                                      bbd_rot_lib,
-                                                      phi, psi),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, bbd_rot_lib, 
-                                                      phi, psi),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
-                                                      rot_lib),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, rot_lib),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
-                                                      bbd_rot_lib,
-                                                      phi, psi),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i,
-                                                      bbd_rot_lib, 
-                                                      phi, psi),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
-                                                      rot_lib),
-             promod3::Error);
-      BOOST_CHECK_THROW(
-             rot_constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, rot_lib),
-             promod3::Error);
-    } else {
-      // RRM ROTAMER (bbdep)
-      rrm1 = rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
-                                                      bbd_rot_lib,
-                                                      phi, psi);
-
-      rrm2 = rot_constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, bbd_rot_lib, 
-                                                      phi, psi);
-      CompareRotamerGroups(*rrm1, *rrm2);
-      // RRM ROTAMER (non-bbdep)
-      rrm1 = rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
-                                                      rot_lib);
-      rrm2 = rot_constructor.ConstructRRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, rot_lib);
-      CompareRotamerGroups(*rrm1, *rrm2);
-      // FRM ROTAMER (bbdep)
-      frm1 = rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
-                                                      bbd_rot_lib,
-                                                      phi, psi);
-      frm2 = rot_constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, bbd_rot_lib, 
-                                                      phi, psi);
-      CompareRotamerGroups(*frm1, *frm2);
-      // RRM ROTAMER (non-bbdep)
-      frm1 = rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
-                                                      rot_lib);
-      frm2 = rot_constructor.ConstructFRMRotamerGroup(n_pos, ca_pos, cb_pos, 
-                                                      r_id, i, rot_lib);
-      CompareRotamerGroups(*frm1, *frm2);
-    }
+    // RRM ROTAMER (bbdep)
+    rrm1 = rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
+                                                    bbd_rot_lib,
+                                                    phi, psi);
+
+    rrm2 = rot_constructor.ConstructRRMRotamerGroup(all_atoms, i, r_id, i, 
+                                                    bbd_rot_lib, phi, psi);
+    CompareRotamerGroups(*rrm1, *rrm2);
+    // RRM ROTAMER (non-bbdep)
+    rrm1 = rot_constructor.ConstructRRMRotamerGroup(res_list[i], r_id, i, 
+                                                    rot_lib);
+    rrm2 = rot_constructor.ConstructRRMRotamerGroup(all_atoms, i, r_id, i, 
+                                                    rot_lib);
+    CompareRotamerGroups(*rrm1, *rrm2);
+    // FRM ROTAMER (bbdep)
+    frm1 = rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
+                                                    bbd_rot_lib, phi, psi);
+    frm2 = rot_constructor.ConstructFRMRotamerGroup(all_atoms, i, r_id, i, 
+                                                    bbd_rot_lib, phi, psi);
+    CompareRotamerGroups(*frm1, *frm2);
+    // RRM ROTAMER (non-bbdep)
+    frm1 = rot_constructor.ConstructFRMRotamerGroup(res_list[i], r_id, i, 
+                                                    rot_lib);
+    frm2 = rot_constructor.ConstructFRMRotamerGroup(all_atoms, i, r_id, i, 
+                                                    rot_lib);
+    CompareRotamerGroups(*frm1, *frm2);
   }
 }