diff --git a/sidechain/pymod/_reconstruct_sidechains.py b/sidechain/pymod/_reconstruct_sidechains.py
index 44764d9e8119618067a05692345980131bfc8e91..3c15dd49e454f887561aa3bea4af40b9d284819b 100644
--- a/sidechain/pymod/_reconstruct_sidechains.py
+++ b/sidechain/pymod/_reconstruct_sidechains.py
@@ -289,7 +289,6 @@ def _GetRotamerGroups(res_list, rot_ids, indices, rot_lib, rot_constructor,
         except:
             continue
         # keep best ones
-        rot_group.CalculateInternalEnergies()
         frame.SetFrameEnergy(rot_group)
         rot_group.ApplySelfEnergyThresh()
         rotamer_groups.append(rot_group)
diff --git a/sidechain/pymod/export_rotamer.cc b/sidechain/pymod/export_rotamer.cc
index a9234df8e5f388591ae8dc0c1d21068d38710a01..067e3141eb8c5519518ee3991389625aee7a8cd5 100644
--- a/sidechain/pymod/export_rotamer.cc
+++ b/sidechain/pymod/export_rotamer.cc
@@ -249,6 +249,17 @@ void SetFRMFrameEnergyTwo(FRMRotamerPtr p, Real e, uint index) {
   p->SetFrameEnergy(e,index);
 }
 
+void AddFRMFrameEnergyOne(FRMRotamerPtr p, Real e) {
+  p->AddFrameEnergy(e);
+}
+
+void AddFRMFrameEnergyTwo(FRMRotamerPtr p, Real e, uint index) {
+  if (index >= p->subrotamer_size()) {
+    throw promod3::Error("Invalid subrotamer index");
+  }
+  p->AddFrameEnergy(e,index);
+}
+
 }
 
 void export_Rotamer()
@@ -262,17 +273,17 @@ void export_Rotamer()
     .def("ApplyOnResidue", WrapRRMApplyOnResAA,
          (arg("all_atom"), arg("res_idx")))
     .def("GetTransformedCopy",&RRMRotamer::GetTransformedCopy,(arg("transform")))
-    .def("CalculateInternalEnergy", &RRMRotamer::CalculateInternalEnergy,(arg("normalization_factor")))
-    .def("GetInternalEnergy",&RRMRotamer::GetInternalEnergy)
     .def("GetInternalEnergyPrefactor",&RRMRotamer::GetInternalEnergyPrefactor)
+    .def("GetInternalEnergy",&RRMRotamer::GetInternalEnergy)
     .def("GetFrameEnergy",&RRMRotamer::GetFrameEnergy)
     .def("GetSelfEnergy",&RRMRotamer::GetSelfEnergy)
     .def("GetProbability",&RRMRotamer::GetProbability)
-    .def("SetInternalEnergy",&RRMRotamer::SetInternalEnergy,
-         (arg("internal_energy")))
     .def("SetInternalEnergyPrefactor",&RRMRotamer::SetInternalEnergyPrefactor,
          (arg("prefactor")))
+    .def("SetInternalEnergy",&RRMRotamer::SetInternalEnergy,
+         (arg("internal_energy")))
     .def("SetFrameEnergy",&RRMRotamer::SetFrameEnergy,(arg("frame_energy")))
+    .def("AddFrameEnergy",&RRMRotamer::AddFrameEnergy,(arg("frame_energy")))
     .def("SetProbability",&RRMRotamer::SetProbability,(arg("probability")))
   ; 
 
@@ -291,20 +302,21 @@ void export_Rotamer()
     .def("ApplyOnResidue", WrapFRMApplyOnResAA,
          (arg("all_atom"), arg("res_idx")))
     .def("GetTransformedCopy",&FRMRotamer::GetTransformedCopy,(arg("transform")))
-    .def("CalculateInternalEnergy", &FRMRotamer::CalculateInternalEnergy,(arg("normalization_factor")))
-    .def("GetInternalEnergy",&FRMRotamer::GetInternalEnergy)
     .def("GetInternalEnergyPrefactor",&FRMRotamer::GetInternalEnergyPrefactor)
+    .def("GetInternalEnergy",&FRMRotamer::GetInternalEnergy)
     .def("GetFrameEnergy",&GetFRMFrameEnergyOne)
     .def("GetFrameEnergy",&GetFRMFrameEnergyTwo)
     .def("GetSelfEnergy",&FRMRotamer::GetSelfEnergy)
     .def("GetTemperature",&FRMRotamer::GetTemperature)
     .def("GetProbability",&FRMRotamer::GetProbability)
+    .def("SetInternalEnergyPrefactor",&FRMRotamer::SetInternalEnergyPrefactor,(arg("prefactor")))
     .def("SetInternalEnergy",&FRMRotamer::SetInternalEnergy,
          (arg("internal_energy")))
-    .def("SetInternalEnergyPrefactor",&FRMRotamer::SetInternalEnergyPrefactor,(arg("prefactor")))
     .def("SetFrameEnergy",&SetFRMFrameEnergyOne,(arg("frame_energy")))
     .def("SetFrameEnergy",&SetFRMFrameEnergyTwo,
          (arg("frame_energy"),arg("subrotamer_index")))
+    .def("AddFrameEnergy",&AddFRMFrameEnergyOne,(arg("frame_energy")))
+    .def("AddFrameEnergy",&AddFRMFrameEnergyTwo,(arg("frame_energy"),arg("subrotamer_index")))
     .def("SetTemperature",&FRMRotamer::SetTemperature,(arg("temperature")))
     .def("SetProbability",&FRMRotamer::SetProbability,(arg("probability")))
   ; 
@@ -322,7 +334,6 @@ void export_Rotamer()
     .def("ApplyOnResidue", WrapRRMGApplyOnResAA,
          (arg("index"), arg("all_atom"), arg("res_idx")))
     .def("Merge",&RRMRotamerGroup::Merge,(arg("other")))
-    .def("CalculateInternalEnergies", &RRMRotamerGroup::CalculateInternalEnergies)
     .def("ApplySelfEnergyThresh", &RRMRotamerGroup::ApplySelfEnergyThresh,
          (arg("thresh")=30))
   ;
@@ -340,7 +351,6 @@ void export_Rotamer()
     .def("ApplyOnResidue", WrapFRMGApplyOnResAA,
          (arg("index"), arg("all_atom"), arg("res_idx")))
     .def("Merge",&FRMRotamerGroup::Merge,(arg("other")))
-    .def("CalculateInternalEnergies", &FRMRotamerGroup::CalculateInternalEnergies)
     .def("ApplySelfEnergyThresh", &FRMRotamerGroup::ApplySelfEnergyThresh,
          (arg("thresh")=30))
   ;
diff --git a/sidechain/pymod/export_scwrl_rotamer_constructor.cc b/sidechain/pymod/export_scwrl_rotamer_constructor.cc
index 27a425766d9f2d8074b504aaa2c13b26db63dd18..3f014a8f2e5e26c49fc5182f98d9640547bc5054 100644
--- a/sidechain/pymod/export_scwrl_rotamer_constructor.cc
+++ b/sidechain/pymod/export_scwrl_rotamer_constructor.cc
@@ -142,6 +142,16 @@ FrameResiduePtr WrapSCFrame_aa(SCWRLRotamerConstructor& constructor,
                                                       id, residue_index);
 }
 
+void AssignInternalEnergiesRRM(const SCWRLRotamerConstructor& constructor,
+                               RRMRotamerGroupPtr group){
+  constructor.AssignInternalEnergies(group);
+}
+
+void AssignInternalEnergiesFRM(const SCWRLRotamerConstructor& constructor,
+                               FRMRotamerGroupPtr group){
+  constructor.AssignInternalEnergies(group);
+}
+
 } // anon ns
 
 
@@ -221,6 +231,8 @@ void export_SCWRLRotamerConstructor(){
                                                             arg("all_atom_pos_idx"),
                                                             arg("rotamer_id"),
                                                             arg("residue_index")))
+    .def("AssignInternalEnergies", &AssignInternalEnergiesRRM)
+    .def("AssignInternalEnergies", &AssignInternalEnergiesFRM)
   ;
 
 }
diff --git a/sidechain/src/rotamer.cc b/sidechain/src/rotamer.cc
index b66fddbaeedffc4843e0d931894fdd5a6f43f217..ed56c2dc0f9fa877e733859190b6fe8cf49a3ea7 100644
--- a/sidechain/src/rotamer.cc
+++ b/sidechain/src/rotamer.cc
@@ -108,10 +108,6 @@ void RRMRotamer::ApplyOnResidue(loop::AllAtomPositions& all_atom,
   }
 }
 
-void RRMRotamer::CalculateInternalEnergy(Real normalization_factor){
-  internal_energy_ = -internal_e_prefactor_*std::log(probability_/normalization_factor);
-}
-
 FRMRotamer::FRMRotamer(Particle* particles, size_t n_particles, Real T, 
                        Real probability, Real internal_e_prefactor):
                        particles_(particles), n_particles_(n_particles),
@@ -251,9 +247,4 @@ void FRMRotamer::ApplyOnResidue(loop::AllAtomPositions& all_atom,
   }
 }
 
-void FRMRotamer::CalculateInternalEnergy(Real normalization_factor){
-  internal_energy_ = -internal_e_prefactor_*std::log(probability_/normalization_factor);
-}
-
-
 }}//ns
diff --git a/sidechain/src/rotamer.hh b/sidechain/src/rotamer.hh
index 405b66aee231951ec2d5337d669e29d890fae95a..650d90bb1ef7730b8b34f600b98d1f42d9c840eb 100644
--- a/sidechain/src/rotamer.hh
+++ b/sidechain/src/rotamer.hh
@@ -48,28 +48,22 @@ public:
 
   RRMRotamerPtr GetTransformedCopy(const geom::Transform& t) const;
 
-  void CalculateInternalEnergy(Real normalization_factor);
+  Real GetInternalEnergyPrefactor() const { return internal_e_prefactor_; }
 
-  inline Real GetInternalEnergy() const { return internal_energy_; }
+  Real GetInternalEnergy() const { return internal_energy_; }
 
-  inline Real GetInternalEnergyPrefactor() const {
-    return internal_e_prefactor_;
-  }
-
-  inline Real GetFrameEnergy() const { return frame_energy_; }
-
-  inline Real GetSelfEnergy() const {
-    return internal_energy_ + frame_energy_;
-  }
+  Real GetFrameEnergy() const { return frame_energy_; }
 
-  inline Real GetProbability() const { return probability_; }
+  Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; }
 
-  void SetInternalEnergy(Real e) { internal_energy_ = e; }
+  Real GetProbability() const { return probability_; }
 
   void SetInternalEnergyPrefactor(Real prefactor) {
     internal_e_prefactor_ = prefactor;
   }
 
+  void SetInternalEnergy(Real e) { internal_energy_ = e; }
+
   void SetFrameEnergy(Real e) { frame_energy_ = e; }
 
   void AddFrameEnergy(Real e) { frame_energy_ += e; }
@@ -96,7 +90,6 @@ private:
 };
 
 
-
 class FRMRotamer {
 
 public:
@@ -116,33 +109,26 @@ public:
 
   void AddSubrotamerDefinition(const std::vector<int>& definition);
 
-  //this function expects the frame energy to be set!!!
-  //Real PairwiseEnergy(const FRMRotamerPtr other) const;
+  Real GetInternalEnergyPrefactor() const { return internal_e_prefactor_; }
 
-  void CalculateInternalEnergy(Real normalization_factor);
+  Real GetInternalEnergy() const { return internal_energy_; }
 
-  inline Real GetInternalEnergy() const { return internal_energy_; }
+  Real GetFrameEnergy() const { return frame_energy_; }
 
-  inline Real GetInternalEnergyPrefactor() const {
-    return internal_e_prefactor_;
-  }
-
-  inline Real GetFrameEnergy() const { return frame_energy_; }
+  Real GetFrameEnergy(int index) const { return frame_energies_[index]; }
 
-  inline Real GetFrameEnergy(int index) const { return frame_energies_[index]; }
+  Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; }
 
-  inline Real GetSelfEnergy() const { return internal_energy_ + frame_energy_; }
+  Real GetTemperature() const { return T_; }
 
-  inline Real GetTemperature() const { return T_; }
-
-  inline Real GetProbability() const { return probability_; }
-
-  void SetInternalEnergy(Real e) { internal_energy_ = e; }
+  Real GetProbability() const { return probability_; }
 
   void SetInternalEnergyPrefactor(Real prefactor) {
     internal_e_prefactor_ = prefactor;
   }
 
+  void SetInternalEnergy(Real e) { internal_energy_ = e; }
+
   void SetFrameEnergy(Real e) { frame_energy_ = e; }
 
   void SetFrameEnergy(Real e, int index) { frame_energies_[index] = e; }
diff --git a/sidechain/src/rotamer_group.cc b/sidechain/src/rotamer_group.cc
index a28ec0fed9ad7f81631d0725e5dbee874727d87e..b8575d7f13dc173021c90d019be48231633c9ed3 100644
--- a/sidechain/src/rotamer_group.cc
+++ b/sidechain/src/rotamer_group.cc
@@ -120,15 +120,6 @@ Real* RRMRotamerGroup::CalculatePairwiseEnergies(RRMRotamerGroupPtr other,
   return data;
 }
 
-void RRMRotamerGroup::CalculateInternalEnergies(){
-  core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
-                               "RRMRotamerGroup::CalculateInternalEnergies", 2);
-  Real max_p = this->GetMaxP();
-  for(iterator i = rotamers_.begin();i != this->end(); ++i){
-    (*i)->CalculateInternalEnergy(max_p);
-  }  
-}
-
 Real RRMRotamerGroup::GetMaxP() const{
   Real max_p = std::numeric_limits<Real>::min();
   for(const_iterator i = this->begin(); i != this->end(); ++i){
@@ -494,15 +485,6 @@ Real* FRMRotamerGroup::CalculatePairwiseEnergies(FRMRotamerGroupPtr other,
   return data;
 }
 
-void FRMRotamerGroup::CalculateInternalEnergies(){
-  core::ScopedTimerPtr prof = core::StaticRuntimeProfiler::StartScoped(
-                               "FRMRotamerGroup::CalculateInternalEnergies", 2);
-  Real max_p = this->GetMaxP();
-  for(iterator i = rotamers_.begin();i != this->end(); ++i){
-    (*i)->CalculateInternalEnergy(max_p);
-  }
-}
-
 Real FRMRotamerGroup::GetMaxP() const{
   Real max_p = std::numeric_limits<Real>::min();
   for(const_iterator i = this->begin(); i != this->end(); ++i){
diff --git a/sidechain/src/rotamer_group.hh b/sidechain/src/rotamer_group.hh
index d346b38577750a8c2cc55d33f1fc870c5be22a11..061bf86f19a83cdf91621de2e8bc5f5c6748e01e 100644
--- a/sidechain/src/rotamer_group.hh
+++ b/sidechain/src/rotamer_group.hh
@@ -42,8 +42,6 @@ public:
 
   Real* CalculatePairwiseEnergies(RRMRotamerGroupPtr other, Real threshold);
 
-  void CalculateInternalEnergies();
-
   Real GetMaxP() const;
 
   void ApplySelfEnergyThresh(Real self_energy_thresh = 30);
@@ -100,8 +98,6 @@ public:
 
   Real* CalculatePairwiseEnergies(FRMRotamerGroupPtr other, Real threshold);
 
-  void CalculateInternalEnergies();
-
   Real GetMaxP() const;
 
   void ApplySelfEnergyThresh(Real self_energy_thresh = 30);
diff --git a/sidechain/src/scwrl_rotamer_constructor.cc b/sidechain/src/scwrl_rotamer_constructor.cc
index 2b0a401e33e45bc048f1b946a23b06a313a624a7..a8257126cb666b47afdb7ed3997a703d5bceeca8 100644
--- a/sidechain/src/scwrl_rotamer_constructor.cc
+++ b/sidechain/src/scwrl_rotamer_constructor.cc
@@ -1237,7 +1237,29 @@ FrameResiduePtr SCWRLRotamerConstructor::ConstructSidechainFrameResidue(
   return p; 
 }
 
+void SCWRLRotamerConstructor::AssignInternalEnergies(RRMRotamerGroupPtr group) const{
+
+  Real max_p = group->GetMaxP();
+  for(uint i = 0; i < group->size(); ++i){
+    RRMRotamerPtr r = (*group)[i];
+    Real internal_e_prefactor = r->GetInternalEnergyPrefactor();
+    Real probability = r->GetProbability();
+    Real e = -internal_e_prefactor * std::log(probability/max_p);
+    r->SetInternalEnergy(e);
+  }
+}
+
+void SCWRLRotamerConstructor::AssignInternalEnergies(FRMRotamerGroupPtr group) const{
 
+  Real max_p = group->GetMaxP();
+  for(uint i = 0; i < group->size(); ++i){
+    FRMRotamerPtr r = (*group)[i];
+    Real internal_e_prefactor = r->GetInternalEnergyPrefactor();
+    Real probability = r->GetProbability();
+    Real e = -internal_e_prefactor * std::log(probability/max_p);
+    r->SetInternalEnergy(e);
+  }
+}
 
 // INTERNAL FUNCTIONS
 
@@ -1306,6 +1328,7 @@ RRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructRRMRotamerGroup(
   
   RRMRotamerGroupPtr group = boost::make_shared<RRMRotamerGroup>(rotamers,
                                                                  residue_index);
+  this->AssignInternalEnergies(group);
   return group;
 }
 
@@ -1378,6 +1401,7 @@ FRMRotamerGroupPtr SCWRLRotamerConstructor::ConstructFRMRotamerGroup(
   
   FRMRotamerGroupPtr group = boost::make_shared<FRMRotamerGroup>(rotamers,
                                                                  residue_index);
+  this->AssignInternalEnergies(group);
   return group;
 }
 
diff --git a/sidechain/src/scwrl_rotamer_constructor.hh b/sidechain/src/scwrl_rotamer_constructor.hh
index 22d379d00bd0f98843123da8c6a5c8f357b1d79e..75f8416eb45caa158132a8ae9b3e3015286c79af 100644
--- a/sidechain/src/scwrl_rotamer_constructor.hh
+++ b/sidechain/src/scwrl_rotamer_constructor.hh
@@ -358,6 +358,11 @@ public:
           const promod3::loop::AllAtomPositions& all_atom, uint aa_res_idx, 
           RotamerID id, uint residue_index);
 
+  // Assign internal energies to rotamer groups
+  void AssignInternalEnergies(RRMRotamerGroupPtr group) const;
+
+  void AssignInternalEnergies(FRMRotamerGroupPtr group) const;
+
 private:
 
   // Construct the rotamer groups after all backbone position information has 
diff --git a/sidechain/src/sidechain_env_listener.hh b/sidechain/src/sidechain_env_listener.hh
index e5bd07ecbf6bf5a0a2050ff99e79f04cedac8874..32ded5d66342290dab8fd356e18cbc264ca0fb8c 100644
--- a/sidechain/src/sidechain_env_listener.hh
+++ b/sidechain/src/sidechain_env_listener.hh
@@ -124,7 +124,7 @@ public:
                                                             r_id, res_idx,
                                                             library_);
     }
-    rot_group->CalculateInternalEnergies();
+    rot_constructor_.AssignInternalEnergies(rot_group);
   }
   void CreateRotamerGroup(RRMRotamerGroupPtr& rot_group,
                           const geom::Vec3& n_pos, const geom::Vec3& ca_pos,
@@ -143,7 +143,7 @@ public:
                                                             res_idx,
                                                             library_);
     }
-    rot_group->CalculateInternalEnergies();
+    rot_constructor_.AssignInternalEnergies(rot_group);
   }
 
 private: