diff --git a/modules/gfx/pymod/export_color_ops.cc b/modules/gfx/pymod/export_color_ops.cc
index d24a15179a9bbecbc7d10ee32c4454f288fd868d..78f23bac910ab692791ee0ca95e841d8bb3c7ca5 100644
--- a/modules/gfx/pymod/export_color_ops.cc
+++ b/modules/gfx/pymod/export_color_ops.cc
@@ -75,6 +75,8 @@ void export_ColorOps()
     .def(init<const mol::QueryViewWrapper&>())
     .def(init<const String&, int>())
     .def(init<const mol::QueryViewWrapper&, int>())
+    .def("GetChainCount",&ByChainColorOp::GetChainCount)
+    .def("SetChainCount",&ByChainColorOp::SetChainCount)
     .def("FromInfo",&ByChainColorOp::FromInfo)
     .staticmethod("FromInfo")
   ;
diff --git a/modules/gfx/src/color_ops/by_chain_color_op.cc b/modules/gfx/src/color_ops/by_chain_color_op.cc
index 908fb591ff42e49f66d885dabee617ef33bb193e..67279f893f3edd905627d5772bd026ffcccecb1b 100644
--- a/modules/gfx/src/color_ops/by_chain_color_op.cc
+++ b/modules/gfx/src/color_ops/by_chain_color_op.cc
@@ -26,20 +26,11 @@
 
 namespace ost { namespace gfx {
 
-ByChainColorOp::ByChainColorOp() : ColorOp(){this->init();}
+ByChainColorOp::ByChainColorOp() : ColorOp(),chain_count_(0),color_grad_("RAINBOW"){}
 
-ByChainColorOp::ByChainColorOp(const String& selection, int mask) : ColorOp(selection,mask){this->init();}
+ByChainColorOp::ByChainColorOp(const String& selection, int mask) : ColorOp(selection,mask),chain_count_(0),color_grad_("RAINBOW"){}
 
-ByChainColorOp::ByChainColorOp(const mol::QueryViewWrapper& query_view, int mask) : ColorOp(query_view,mask){this->init();}
-
-void ByChainColorOp::init(){
-  color_grad_.SetColorAt(0,Color(1,1,0));
-  color_grad_.SetColorAt(0.16666,Color(1,0,0));
-  color_grad_.SetColorAt(0.33333,Color(0,1,1));
-  color_grad_.SetColorAt(0.5,Color(0,1,0));
-  color_grad_.SetColorAt(0.66666,Color(1,0,1));
-  color_grad_.SetColorAt(0.83333,Color(0,0,1));
-}
+ByChainColorOp::ByChainColorOp(const mol::QueryViewWrapper& query_view, int mask) : ColorOp(query_view,mask),chain_count_(0),color_grad_("RAINBOW"){}
 
 bool ByChainColorOp::CanApplyTo(const GfxObjP& obj) const{
   if(dynamic_cast<Entity*>(obj.get()))
@@ -62,6 +53,16 @@ gfx::Color ByChainColorOp::GetColor(String ident) const{
   return colors_[ident];
 }
 
+int ByChainColorOp::GetChainCount() const
+{
+  return chain_count_;
+}
+
+void ByChainColorOp::SetChainCount(int chain_count)
+{
+  chain_count_ = chain_count;
+}
+
 gfx::ByChainColorOp ByChainColorOp::FromInfo(info::InfoGroup& group){
   gfx::ColorOp op = ColorOp::FromInfo(group);
   String selection = op.GetSelection();
@@ -71,18 +72,13 @@ gfx::ByChainColorOp ByChainColorOp::FromInfo(info::InfoGroup& group){
 
 gfx::Color ByChainColorOp::GenerateColor(String& ident) const{
   unsigned int size=colors_.size()-1;
-  int cnt = size % 6;
-  int factor = abs(size/6.0)+1;
-  float start = 1.0/(6.0*factor);
-  if(factor > 1 && !((factor+1) & 1)){
-    float old_start = 1.0 / (6.0 *abs(size/6.0));
-    start += old_start;
+  if(size<=0){
+    colors_[ident] = color_grad_.GetColorAt(0.0);
   }
-  float value = start + (cnt / 6.0);
-  if(value >= 1){
-    value -=1;
+  else{
+    colors_[ident] = color_grad_.GetColorAt(float(size) / chain_count_);
   }
-  return color_grad_.GetColorAt(value);
+  return colors_[ident];
 }
 
 }}
diff --git a/modules/gfx/src/color_ops/by_chain_color_op.hh b/modules/gfx/src/color_ops/by_chain_color_op.hh
index fffc8966864ea7d9770d79ffe59053f5cb2b4964..30d3ec2e6e5e41b65e8194deb9d4a4c2a3a5c1b3 100644
--- a/modules/gfx/src/color_ops/by_chain_color_op.hh
+++ b/modules/gfx/src/color_ops/by_chain_color_op.hh
@@ -43,13 +43,16 @@ public:
 
   virtual gfx::Color GetColor(String ident) const;
 
+  virtual int GetChainCount() const;
+  virtual void SetChainCount(int chain_count);
+
   //virtual void ToInfo(info::InfoGroup& group) const;
   static gfx::ByChainColorOp FromInfo(info::InfoGroup& group);
 
 private:
-  void init();
   gfx::Color GenerateColor(String& ident) const;
 
+  mutable int chain_count_;
   mutable std::map<String,gfx::Color> colors_;
 
   gfx::Gradient color_grad_;
diff --git a/modules/gfx/src/color_ops/color_op.hh b/modules/gfx/src/color_ops/color_op.hh
index c2c7c9360e610912922abdc84b96eddaf3079fdb..d1a98d88eaed0f71cd6e9bb4567dde1915be8c77 100644
--- a/modules/gfx/src/color_ops/color_op.hh
+++ b/modules/gfx/src/color_ops/color_op.hh
@@ -66,7 +66,6 @@ public:
   static gfx::ColorOp FromInfo(info::InfoGroup& group);
 private:
   mol::QueryViewWrapper query_view_;
-  mol::EntityView view_;
   ColorMask mask_;
 };
 
diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc
index 8d639a33665cddc437adb568d27b1f8c56f89723..2da4d22f9e69276121eb69fb86e379bc5f0cd6ad 100644
--- a/modules/gfx/src/entity.cc
+++ b/modules/gfx/src/entity.cc
@@ -908,11 +908,13 @@ void Entity::Apply(const gfx::ByElementColorOp& op, bool store)
 
 void Entity::Apply(const gfx::ByChainColorOp& op, bool store)
 {
+  const_cast<gfx::ByChainColorOp&>(op).SetChainCount(this->GetView().GetChainCount());
   if(store){
     ByChainColorOp* op_ptr = new ByChainColorOp(op);
     this->AppendColorOp(op_ptr);
   }
   apply_color_op_to_renderer_list(renderer_.begin(), renderer_.end(), op);
+  const_cast<gfx::ByChainColorOp&>(op).SetChainCount(0);
   FlagRebuild();
 }