diff --git a/OpenMesh/OMPropertyVisualizer.hh b/OpenMesh/OMPropertyVisualizer.hh
index d45e94c6041fcb7587b1c61d9fc6ef616c887ae8..a76e6fd35fafbf70a42267c0b50fd8be0ed98690 100644
--- a/OpenMesh/OMPropertyVisualizer.hh
+++ b/OpenMesh/OMPropertyVisualizer.hh
@@ -125,7 +125,6 @@ protected:
     virtual void setHalfedgePropertyFromText(unsigned int index, QString text);
     virtual void setVertexPropertyFromText(unsigned int index, QString text);
 
-    OpenMesh::Vec4f convertColor(QColor color);
     virtual void setPropertyFromText(unsigned int index, QString text);
 
     virtual int getEntityCount();
diff --git a/OpenMesh/OMPropertyVisualizerDouble.hh b/OpenMesh/OMPropertyVisualizerDouble.hh
index 07778d7be862ea596a209335fc79e0f395c0d1d4..e0f9830a4643fe3dbd624979da5bf00c450fad8e 100644
--- a/OpenMesh/OMPropertyVisualizerDouble.hh
+++ b/OpenMesh/OMPropertyVisualizerDouble.hh
@@ -70,7 +70,6 @@ public:
     virtual ~OMPropertyVisualizerDouble(){}
 
 protected:
-
     virtual void visualizeFaceProp(bool _setDrawMode = true);
     virtual void visualizeEdgeProp(bool _setDrawMode = true);
     virtual void visualizeHalfedgeProp(bool _setDrawMode = true);
diff --git a/OpenMesh/OMPropertyVisualizerDoubleT.cc b/OpenMesh/OMPropertyVisualizerDoubleT.cc
index b303478fb0e962cd7c1e950df17ba5208e9c6225..bccc77e839ea4f3d1a0d37f62a0f6ad9722d0c93 100644
--- a/OpenMesh/OMPropertyVisualizerDoubleT.cc
+++ b/OpenMesh/OMPropertyVisualizerDoubleT.cc
@@ -66,13 +66,11 @@ template <typename MeshT>
 void OMPropertyVisualizerDouble<MeshT>::visualizeFaceProp(bool _setDrawMode)
 {
     DoubleWidget* doubleWidget = static_cast<DoubleWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMin->color());
-    colorMax = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMax->color());
+    typename MeshT::Color colorMin = ACG::to_Vec4f(doubleWidget->doubleMin->color());
 
     // color coder in [0,1]
-    ACG::ColorCoder cc;
+    ACG::IColorCoder *cc = doubleWidget->buildColorCoder();
 
     OpenMesh::FPropHandleT< double > prop;
 
@@ -133,18 +131,13 @@ void OMPropertyVisualizerDouble<MeshT>::visualizeFaceProp(bool _setDrawMode)
             v = std::min(max,v);
 
             double t = (v-min)/range;
-
-            typename MeshT::Color color;
-
-            if( doubleWidget->doubleColorCoder->isChecked())
-                color = cc.color_float4(t);
-            else
-                color = (colorMin)*(1.0-t) + (colorMax)*t;
+            typename MeshT::Color color = cc->color_float4(t);
 
               // set color
             OMPropertyVisualizer<MeshT>::mesh->set_color(*f_it, color);
         }
     }
+    delete cc;
 
     if (_setDrawMode)
         PluginFunctions::setDrawMode(ACG::SceneGraph::DrawModes::SOLID_FACES_COLORED);
@@ -154,15 +147,12 @@ template <typename MeshT>
 void OMPropertyVisualizerDouble<MeshT>::visualizeEdgeProp(bool _setDrawMode)
 {
     DoubleWidget* doubleWidget = static_cast<DoubleWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
+    typename MeshT::Color colorMin;
 
-    colorMin = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMin->color());
-    colorMax = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMax->color());
+    colorMin = ACG::to_Vec4f(doubleWidget->doubleMin->color());
 
     // color coder in [0,1]
-    ACG::ColorCoder cc;
-
-
+    ACG::IColorCoder *cc = doubleWidget->buildColorCoder();
 
     //TODO check if this also works if the property is Vec3d
     OpenMesh::EPropHandleT< double > prop;
@@ -225,19 +215,13 @@ void OMPropertyVisualizerDouble<MeshT>::visualizeEdgeProp(bool _setDrawMode)
             v = std::min(max,v);
 
             double t = (v-min)/range;
-
-            typename MeshT::Color color;
-
-            if( doubleWidget->doubleColorCoder->isChecked())
-                color = cc.color_float4(t);
-            else
-                color = (colorMin)*(1.0-t) + (colorMax)*t;
+            typename MeshT::Color color = cc->color_float4(t);
 
             // set color
             OMPropertyVisualizer<MeshT>::mesh->set_color(*e_it, color);
         }
     }
-
+    delete cc;
 
     if (_setDrawMode)
         PluginFunctions::setDrawMode(ACG::SceneGraph::DrawModes::EDGES_COLORED);
@@ -248,14 +232,11 @@ template <typename MeshT>
 void OMPropertyVisualizerDouble<MeshT>::visualizeHalfedgeProp(bool _setDrawMode)
 {
     DoubleWidget* doubleWidget = static_cast<DoubleWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMin->color());
-    colorMax = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMax->color());
+    typename MeshT::Color colorMin = ACG::to_Vec4f(doubleWidget->doubleMin->color());
 
     // color coder in [0,1]
-    ACG::ColorCoder cc;
-
+    ACG::IColorCoder *cc = doubleWidget->buildColorCoder();
 
     //TODO check if this also works if the property is Vec3d
     OpenMesh::HPropHandleT< double > prop;
@@ -317,14 +298,7 @@ void OMPropertyVisualizerDouble<MeshT>::visualizeHalfedgeProp(bool _setDrawMode)
             v = std::min(max,v);
 
             double t = (v-min)/range;
-
-            typename MeshT::Color color;
-
-            if( doubleWidget->doubleColorCoder->isChecked())
-                color = cc.color_float4(t);
-            else {
-                color = (colorMin)*(1.0-t) + (colorMax)*t;
-            }
+            typename MeshT::Color color = cc->color_float4(t);
 
             // set color
             OMPropertyVisualizer<MeshT>::mesh->set_color(*he_it, color);
@@ -338,13 +312,11 @@ template <typename MeshT>
 void OMPropertyVisualizerDouble<MeshT>::visualizeVertexProp(bool _setDrawMode)
 {
     DoubleWidget* doubleWidget = static_cast<DoubleWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMin->color());
-    colorMax = OMPropertyVisualizer<MeshT>::convertColor(doubleWidget->doubleMax->color());
+    typename MeshT::Color colorMin = ACG::to_Vec4f(doubleWidget->doubleMin->color());
 
     // color coder in [0,1]
-    ACG::ColorCoder cc;
+    ACG::IColorCoder *cc = doubleWidget->buildColorCoder();
 
     //TODO check if this also works if the property is Vec3d
     OpenMesh::VPropHandleT< double > prop;
@@ -406,14 +378,7 @@ void OMPropertyVisualizerDouble<MeshT>::visualizeVertexProp(bool _setDrawMode)
             v = std::min(max,v);
 
             double t = (v-min)/range;
-
-            typename MeshT::Color color;
-
-            if( doubleWidget->doubleColorCoder->isChecked())
-                color = cc.color_float4(t);
-            else {
-                color = (colorMin)*(1.0-t) + (colorMax)*t;
-            }
+            typename MeshT::Color color = cc->color_float4(t);
 
             // set color
             OMPropertyVisualizer<MeshT>::mesh->set_color(*v_it, color);
diff --git a/OpenMesh/OMPropertyVisualizerInteger.hh b/OpenMesh/OMPropertyVisualizerInteger.hh
index abd49301109885948dcda27d5e3966f091b21bbf..b32c3efc95d2b7b49edc43b59ddcc41fbd083c5b 100644
--- a/OpenMesh/OMPropertyVisualizerInteger.hh
+++ b/OpenMesh/OMPropertyVisualizerInteger.hh
@@ -66,7 +66,6 @@ public:
     virtual ~OMPropertyVisualizerInteger(){}
 
 protected:
-
     virtual void visualizeFaceProp(bool _setDrawMode = true);
     virtual void visualizeEdgeProp(bool _setDrawMode = true);
     virtual void visualizeHalfedgeProp(bool _setDrawMode = true);
diff --git a/OpenMesh/OMPropertyVisualizerIntegerT.cc b/OpenMesh/OMPropertyVisualizerIntegerT.cc
index 53edf1f2d3be58838a82bf46eb1f69cc3e1abc9d..d9a7c806948178d2c70676bc9a05d6435f19cc4b 100644
--- a/OpenMesh/OMPropertyVisualizerIntegerT.cc
+++ b/OpenMesh/OMPropertyVisualizerIntegerT.cc
@@ -49,6 +49,7 @@
 
 #define OM_PROPERTY_VISUALIZER_INTEGER_CC
 
+#include <ACG/Utils/IColorCoder.hh>
 #include <ACG/Utils/ColorConversion.hh>
 #include "OMPropertyVisualizerInteger.hh"
 
@@ -78,13 +79,9 @@ template <typename MeshT, typename T>
 void OMPropertyVisualizerInteger<MeshT, T>::visualizeFaceProp(bool _setDrawMode)
 {
     IntegerWidget* integerWidget = static_cast<IntegerWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
-    colorMax = ACG::to_Vec4f(integerWidget->intMax->color());
-
-    // color coder in [0,1]
-    ACG::ColorCoder cc;
+    typename MeshT::Color colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
+    ACG::IColorCoder *cc = integerWidget->buildColorCoder(); // color coder in [0,1]
 
     std::map< int, typename MeshT::Color> randomColor;
 
@@ -132,19 +129,7 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeFaceProp(bool _setDrawMode)
 
             typename MeshT::Color color;
 
-            if (integerWidget->intColorCoder->isChecked())
-            {
-                color = cc.color_float4(pos);
-            }
-            else if ( !integerWidget->intRandom->isChecked() ){
-
-                color[0] = colorMin[0] * (1-pos) + pos * colorMax[0];
-                color[1] = colorMin[1] * (1-pos) + pos * colorMax[1];
-                color[2] = colorMin[2] * (1-pos) + pos * colorMax[2];
-                color[3] = 1.0;
-
-            } else {
-
+            if (integerWidget->intRandom->isChecked() ){
                 if ( randomColor.find( getValue(prop, f_it) ) == randomColor.end() ){
 
                     color = mColorGenerator.generateNextColor();
@@ -154,11 +139,14 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeFaceProp(bool _setDrawMode)
                 }
 
                 color = randomColor[ getValue(prop, f_it) ];
+            } else {
+                color = cc->color_float4(pos);
             }
 
             OMPropertyVisualizer<MeshT>::mesh->set_color(*f_it, color);
         }
     }
+    delete cc;
 
     if (_setDrawMode)
         PluginFunctions::setDrawMode(ACG::SceneGraph::DrawModes::SOLID_FACES_COLORED);
@@ -168,13 +156,9 @@ template <typename MeshT, typename T>
 void OMPropertyVisualizerInteger<MeshT, T>::visualizeEdgeProp(bool _setDrawMode)
 {
     IntegerWidget* integerWidget = static_cast<IntegerWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
-    colorMax = ACG::to_Vec4f(integerWidget->intMax->color());
-
-    // color coder in [0,1]
-    ACG::ColorCoder cc;
+    typename MeshT::Color colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
+    ACG::IColorCoder *cc = integerWidget->buildColorCoder(); // color coder in [0,1]
 
     std::map< int, typename MeshT::Color> randomColor;
 
@@ -222,19 +206,7 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeEdgeProp(bool _setDrawMode)
 
             typename MeshT::Color color;
 
-            if (integerWidget->intColorCoder->isChecked())
-            {
-                color = cc.color_float4(pos);
-            }
-            else if ( !integerWidget->intRandom->isChecked() ){
-
-                color[0] = colorMin[0] * (1-pos) + pos * colorMax[0];
-                color[1] = colorMin[1] * (1-pos) + pos * colorMax[1];
-                color[2] = colorMin[2] * (1-pos) + pos * colorMax[2];
-                color[3] = 1.0;
-
-            } else {
-
+            if (integerWidget->intRandom->isChecked() ){
                 if ( randomColor.find( getValue(prop, e_it) ) == randomColor.end() ){
 
                     color = mColorGenerator.generateNextColor();
@@ -244,6 +216,8 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeEdgeProp(bool _setDrawMode)
                 }
 
                 color = randomColor[ getValue(prop, e_it) ];
+            } else {
+                color = cc->color_float4(pos);
             }
 
             OMPropertyVisualizer<MeshT>::mesh->set_color(*e_it, color);
@@ -259,13 +233,9 @@ template <typename MeshT, typename T>
 void OMPropertyVisualizerInteger<MeshT, T>::visualizeHalfedgeProp(bool _setDrawMode)
 {
     IntegerWidget* integerWidget = static_cast<IntegerWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
-    colorMax = ACG::to_Vec4f(integerWidget->intMax->color());
-
-    // color coder in [0,1]
-    ACG::ColorCoder cc;
+    typename MeshT::Color colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
+    ACG::IColorCoder *cc = integerWidget->buildColorCoder(); // color coder in [0,1]
 
     std::map< int, typename MeshT::Color> randomColor;
 
@@ -313,19 +283,7 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeHalfedgeProp(bool _setDrawM
 
             typename MeshT::Color color;
 
-            if (integerWidget->intColorCoder->isChecked())
-            {
-                color = cc.color_float4(pos);
-            }
-            else if ( !integerWidget->intRandom->isChecked() ){
-
-                color[0] = colorMin[0] * (1-pos) + pos * colorMax[0];
-                color[1] = colorMin[1] * (1-pos) + pos * colorMax[1];
-                color[2] = colorMin[2] * (1-pos) + pos * colorMax[2];
-                color[3] = 1.0;
-
-            } else {
-
+            if (integerWidget->intRandom->isChecked() ){
                 if ( randomColor.find( getValue(prop, he_it) ) == randomColor.end() ){
 
                     color = mColorGenerator.generateNextColor();
@@ -335,6 +293,8 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeHalfedgeProp(bool _setDrawM
                 }
 
                 color = randomColor[ getValue(prop, he_it) ];
+            } else {
+                color = cc->color_float4(pos);
             }
 
             OMPropertyVisualizer<MeshT>::mesh->set_color(*he_it, color);
@@ -349,13 +309,9 @@ template <typename MeshT, typename T>
 void OMPropertyVisualizerInteger<MeshT, T>::visualizeVertexProp(bool _setDrawMode)
 {
     IntegerWidget* integerWidget = static_cast<IntegerWidget*>(PropertyVisualizer::widget);
-    typename MeshT::Color colorMin, colorMax;
 
-    colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
-    colorMax = ACG::to_Vec4f(integerWidget->intMax->color());
-
-    // color coder in [0,1]
-    ACG::ColorCoder cc;
+    typename MeshT::Color colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
+    ACG::IColorCoder *cc = integerWidget->buildColorCoder(); // color coder in [0,1]
 
     std::map< int, typename MeshT::Color> randomColor;
 
@@ -403,21 +359,7 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeVertexProp(bool _setDrawMod
 
             typename MeshT::Color color;
 
-            if (integerWidget->intColorCoder->isChecked())
-            {
-                color = cc.color_float4(pos);
-            }
-            else if ( !integerWidget->intRandom->isChecked() ){
-
-                color[0] = colorMin[0] * (1-pos) + pos * colorMax[0];
-                color[1] = colorMin[1] * (1-pos) + pos * colorMax[1];
-                color[2] = colorMin[2] * (1-pos) + pos * colorMax[2];
-                color[3] = 1.0;
-
-            }
-            else
-            {
-
+            if (integerWidget->intRandom->isChecked() ){
                 if ( randomColor.find( getValue(prop, v_it) ) == randomColor.end() ){
 
                     color = mColorGenerator.generateNextColor();
@@ -427,6 +369,8 @@ void OMPropertyVisualizerInteger<MeshT, T>::visualizeVertexProp(bool _setDrawMod
                 }
 
                 color = randomColor[ getValue(prop, v_it) ];
+            } else {
+                color = cc->color_float4(pos);
             }
 
             OMPropertyVisualizer<MeshT>::mesh->set_color(*v_it, color);
diff --git a/OpenMesh/OMPropertyVisualizerT.cc b/OpenMesh/OMPropertyVisualizerT.cc
index 61377dd031f353fd20bcf85920ec4f56ff70d9b8..e7d49f4a988ef49a4d83c0af3282c78fc1097367 100644
--- a/OpenMesh/OMPropertyVisualizerT.cc
+++ b/OpenMesh/OMPropertyVisualizerT.cc
@@ -348,20 +348,6 @@ void OMPropertyVisualizer<MeshT>::clear()
         clearVertexProp();
 }
 
-
-template <typename MeshT>
-OpenMesh::Vec4f OMPropertyVisualizer<MeshT>::convertColor(const QColor _color){
-
-  OpenMesh::Vec4f color;
-
-  color[0] = _color.redF();
-  color[1] = _color.greenF();
-  color[2] = _color.blueF();
-  color[3] = _color.alphaF();
-
-  return color;
-}
-
 template <typename MeshT>
 void OMPropertyVisualizer<MeshT>::visualizeFaceProp(bool /*_setDrawMode*/)
 {
diff --git a/OpenVolumeMesh/OVMPropertyVisualizer.hh b/OpenVolumeMesh/OVMPropertyVisualizer.hh
index 534434c1b40697b56a73d5405bb2d118c3ed77c2..2794e2a94dde31c748db66d8aa08c1870c4b4c44 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizer.hh
+++ b/OpenVolumeMesh/OVMPropertyVisualizer.hh
@@ -110,8 +110,6 @@ protected:
     template<typename PropType>
     void duplicateProperty_stage1();
 
-    OpenMesh::Vec4f convertColor(QColor color);
-
     template <typename InnerType>
     QString getPropertyText_(unsigned int index);
 
diff --git a/OpenVolumeMesh/OVMPropertyVisualizerDouble.hh b/OpenVolumeMesh/OVMPropertyVisualizerDouble.hh
index 06de13d845d5c2b4af28cf89180eb715a6d89622..865e2291f914d88cfc74a971db980e9576d18659 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizerDouble.hh
+++ b/OpenVolumeMesh/OVMPropertyVisualizerDouble.hh
@@ -58,9 +58,7 @@
 
 #include <OpenFlipper/BasePlugin/PluginFunctions.hh>
 
-#include <ACG/Utils/ColorCoder.hh>
-
-
+#include <ACG/Utils/IColorCoder.hh>
 
 #include <iostream>
 
@@ -72,7 +70,6 @@ public:
     virtual ~OVMPropertyVisualizerDouble(){}
 
 protected:
-
     template <typename PropType, typename EntityIterator>
     void visualizeProp(PropType prop, EntityIterator e_begin, EntityIterator e_end);
     virtual void duplicateProperty();
diff --git a/OpenVolumeMesh/OVMPropertyVisualizerDoubleT.cc b/OpenVolumeMesh/OVMPropertyVisualizerDoubleT.cc
index 003cac151e3a6c1eecd55c85ed0843b840296ace..293483da68ef3972e2b3c4e194871f4230ce82b1 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizerDoubleT.cc
+++ b/OpenVolumeMesh/OVMPropertyVisualizerDoubleT.cc
@@ -57,8 +57,6 @@
 #include <ACG/Utils/LinearTwoColorCoder.hh>
 #include <ACG/Utils/ColorConversion.hh>
 
-#include <QObject>
-
 template <typename MeshT>
 OVMPropertyVisualizerDouble<MeshT>::OVMPropertyVisualizerDouble(MeshT* _mesh, int objectID, PropertyInfo _propertyInfo)
     : OVMPropertyVisualizer<MeshT>(_mesh, objectID, _propertyInfo)
@@ -77,11 +75,8 @@ void OVMPropertyVisualizerDouble<MeshT>::visualizeProp(PropType prop, EntityIter
 
     DoubleWidget* doubleWidget = static_cast<DoubleWidget*>(PropertyVisualizer::widget);
     ACG::Vec4f colorMin = ACG::to_Vec4f(doubleWidget->doubleMin->color());
-    ACG::Vec4f colorMax = ACG::to_Vec4f(doubleWidget->doubleMax->color());
-
-    // color coder in [0,1]
-    ACG::ColorCoder cc;
 
+    ACG::IColorCoder *cc = doubleWidget->buildColorCoder();
     double min, max;
 
     if ( doubleWidget->doubleAbsolute->isChecked() ){
@@ -137,13 +132,7 @@ void OVMPropertyVisualizerDouble<MeshT>::visualizeProp(PropType prop, EntityIter
 
             double t = (value-min)/range;
 
-            ACG::Vec4f color;
-
-            if( doubleWidget->doubleColorCoder->isChecked())
-                color = cc.color_float4(t);
-            else {
-                color = (colorMin)*(1.0-t) + (colorMax)*t;
-            }
+            ACG::Vec4f color = cc->color_float4(t);
 
             if (doubleWidget->doubleMapOutsideRange->isChecked()) {
               if (prop[*e_it] < min || prop[*e_it] > max)
@@ -154,6 +143,7 @@ void OVMPropertyVisualizerDouble<MeshT>::visualizeProp(PropType prop, EntityIter
             object->colors()[*e_it] = color;
         }
     }
+    delete cc;
 }
 CALLS_TO_VISUALIZE_PROP(OVMPropertyVisualizerDouble<MeshT>, typename MeshT, double)
 
diff --git a/OpenVolumeMesh/OVMPropertyVisualizerInteger.hh b/OpenVolumeMesh/OVMPropertyVisualizerInteger.hh
index 3daca00aeff334a8355f4a0e2eaaacf10208797a..22b9fc372efab6a5c1efb9d5c3e5dc17d39d214a 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizerInteger.hh
+++ b/OpenVolumeMesh/OVMPropertyVisualizerInteger.hh
@@ -68,7 +68,6 @@ public:
     virtual ~OVMPropertyVisualizerInteger(){}
 
 protected:
-
     template <typename PropType, typename EntityIterator>
     void visualizeProp(PropType prop, EntityIterator e_begin, EntityIterator e_end);
     virtual void duplicateProperty();
diff --git a/OpenVolumeMesh/OVMPropertyVisualizerIntegerT.cc b/OpenVolumeMesh/OVMPropertyVisualizerIntegerT.cc
index 86d902cb0ce4c351ed494620f0e11b23cca3b967..63bbf3928a163e1afe3f7d0d6099586d32364c7c 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizerIntegerT.cc
+++ b/OpenVolumeMesh/OVMPropertyVisualizerIntegerT.cc
@@ -53,6 +53,7 @@
 
 #include "OVMPropertyVisualizerInteger.hh"
 #include <ACG/Utils/ColorConversion.hh>
+#include <ACG/Utils/LinearTwoColorCoder.hh>
 
 template <typename MeshT, typename T>
 OVMPropertyVisualizerInteger<MeshT,T>::OVMPropertyVisualizerInteger(MeshT* _mesh, int objectID,  PropertyInfo _propertyInfo, bool isUnsigned)
@@ -82,10 +83,8 @@ void OVMPropertyVisualizerInteger<MeshT, T>::visualizeProp(PropType prop, Entity
     if (!prop) return;
 
     IntegerWidget* integerWidget = static_cast<IntegerWidget*>(PropertyVisualizer::widget);
-    ACG::Vec4f colorMin, colorMax;
 
-    colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
-    colorMax = ACG::to_Vec4f(integerWidget->intMax->color());
+    ACG::Vec4f colorMin = ACG::to_Vec4f(integerWidget->intMin->color());
 
     std::map< int, ACG::Vec4f> randomColor;
 
@@ -113,7 +112,7 @@ void OVMPropertyVisualizerInteger<MeshT, T>::visualizeProp(PropType prop, Entity
         integerWidget->intFixedRangeMax->setValue(max);
     }
 
-    ACG::ColorCoder cc;
+    ACG::IColorCoder *cc = integerWidget->buildColorCoder();
 
     unsigned int range = max - min;
     VolumeMeshObject<MeshT>* object;
@@ -127,20 +126,9 @@ void OVMPropertyVisualizerInteger<MeshT, T>::visualizeProp(PropType prop, Entity
             T value = prop[*e_it];
             double pos = (value - min) / (double) range;
             ACG::Vec4f color;
-            if (integerWidget->intColorCoder->isChecked())
-            {
-                color = cc.color_float4(pos);
-            }
-            else
-            if ( !integerWidget->intRandom->isChecked() )
-            {
-                color[0] = colorMin[0] * (1-pos) + pos * colorMax[0];
-                color[1] = colorMin[1] * (1-pos) + pos * colorMax[1];
-                color[2] = colorMin[2] * (1-pos) + pos * colorMax[2];
-                color[3] = 1.0;
-            }
-            else
+            if ( integerWidget->intRandom->isChecked() )
             {
+                // TODO: build appropriate subclass of IColorCoder for this purpose
                 if ( randomColor.find( value ) == randomColor.end() )
                 {
                     color = mColorGenerator.generateNextColor();
@@ -149,11 +137,15 @@ void OVMPropertyVisualizerInteger<MeshT, T>::visualizeProp(PropType prop, Entity
                 }
                 color = randomColor[ value ];
             }
+            else
+            {
+                color = cc->color_float4(pos);
+            }
 
             object->colors()[*e_it] = color;
         }
     }
-
+    delete cc;
 }
 #define KOMMA ,
 CALLS_TO_VISUALIZE_PROP(OVMPropertyVisualizerInteger<MeshT KOMMA T>, typename MeshT KOMMA typename T, T)
diff --git a/OpenVolumeMesh/OVMPropertyVisualizerT.cc b/OpenVolumeMesh/OVMPropertyVisualizerT.cc
index 9b4fa6b65fe0a58ab13795a222ba69c5452932e0..b28bf231183f5332feecefa9e38ab8b30a740cb3 100644
--- a/OpenVolumeMesh/OVMPropertyVisualizerT.cc
+++ b/OpenVolumeMesh/OVMPropertyVisualizerT.cc
@@ -234,19 +234,6 @@ void OVMPropertyVisualizer<MeshT>::visualize(bool _setDrawMode, QWidget* _widget
     }
 }
 
-template <typename MeshT>
-OpenMesh::Vec4f OVMPropertyVisualizer<MeshT>::convertColor(const QColor _color){
-
-  OpenMesh::Vec4f color;
-
-  color[0] = _color.redF();
-  color[1] = _color.greenF();
-  color[2] = _color.blueF();
-  color[3] = _color.alphaF();
-
-  return color;
-}
-
 template <typename MeshT>
 void OVMPropertyVisualizer<MeshT>::visualizeFaceProp(bool /*_setDrawMode*/)
 {
diff --git a/PropertyVisualizer.hh b/PropertyVisualizer.hh
index a4b3db3e7530a4e37419ee99e8e50f0cb82da9b1..6fa4e543e5beec138d0f2d87f98fecabafae75f4 100644
--- a/PropertyVisualizer.hh
+++ b/PropertyVisualizer.hh
@@ -156,7 +156,6 @@ public:
     /// Returns the header for saving.
     virtual QString getHeader() = 0;
 
-
     static inline QString toStr(bool b)               { return b ? QObject::tr("True") : QObject::tr("False"); }
     static inline QString toStr(double d)             { return QObject::tr("%1").arg(d); }
     static inline QString toStr(int i)                { return QObject::tr("%1").arg(i); }
diff --git a/Widgets/DoubleWidget.hh b/Widgets/DoubleWidget.hh
index 9d9ed8c034bb98635c242d25301673cf111acc45..65dfbf177ed4c799ebb67da4e9984a40476b3433 100644
--- a/Widgets/DoubleWidget.hh
+++ b/Widgets/DoubleWidget.hh
@@ -52,6 +52,10 @@
 
 #include "ui_DoubleWidget.hh"
 
+#include "ACG/Utils/IColorCoder.hh"
+#include "ACG/Utils/LinearTwoColorCoder.hh"
+#include <ACG/Utils/ColorConversion.hh>
+
 #if QT_VERSION >= 0x050000 
   #include <QtWidgets>
 #else
@@ -69,6 +73,22 @@ public:
   {
     setupUi(this);
   }
+
+  /**
+   * @brief Builds a color coder according to UI settings
+   * @return Pointer to an IColorCoder for parameters in [0..1]
+   * @note Caller is responsible for deleting the returned object.
+   */
+  ACG::IColorCoder *buildColorCoder()
+  {
+      if (doubleColorCoder->isChecked()) {
+          return new ACG::ColorCoder();
+      } else {
+          return new ACG::LinearTwoColorCoder(
+                      ACG::to_Vec4f(doubleMin->color()),
+                      ACG::to_Vec4f(doubleMax->color()));
+      }
+  }
   
   signals:
     void widgetShown();
diff --git a/Widgets/IntegerWidget.hh b/Widgets/IntegerWidget.hh
index 2841aaa0909de049df6cf4e5609b4b30290a4353..c7e296f3da8def1706c8663bdcaf15ad4c4283a5 100644
--- a/Widgets/IntegerWidget.hh
+++ b/Widgets/IntegerWidget.hh
@@ -52,6 +52,11 @@
 
 #include "ui_IntegerWidget.hh"
 
+#include "ACG/Utils/IColorCoder.hh"
+#include "ACG/Utils/ColorCoder.hh"
+#include "ACG/Utils/LinearTwoColorCoder.hh"
+#include <ACG/Utils/ColorConversion.hh>
+
 #if QT_VERSION >= 0x050000 
   #include <QtWidgets>
 #else
@@ -69,6 +74,23 @@ public:
   {
     setupUi(this);
   }
+
+  /**
+   * @brief Builds a color coder according to UI settings
+   * @return Pointer to an IColorCoder for parameters in [0..1]
+   * @note Caller is responsible for deleting the returned object.
+   */
+  ACG::IColorCoder *buildColorCoder()
+  {
+      if (intColorCoder->isChecked()) {
+          return new ACG::ColorCoder();
+      } else {
+          return new ACG::LinearTwoColorCoder(
+                      ACG::to_Vec4f(intMin->color()),
+                      ACG::to_Vec4f(intMax->color()));
+      }
+  }
+
   
   signals:
     void widgetShown();