diff --git a/Core/PythonAPI/inc/ConstKBinAxis.pypp.h b/Core/PythonAPI/inc/ConstKBinAxis.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..13f436406463c8336a35f9cb5c24e3bbfa6b7e76
--- /dev/null
+++ b/Core/PythonAPI/inc/ConstKBinAxis.pypp.h
@@ -0,0 +1,11 @@
+// This file has been generated by Py++.
+
+// BornAgain: simulate and fit scattering at grazing incidence
+//! @brief Automatically generated boost::python code for PythonCoreAPI
+
+#ifndef ConstKBinAxis_hpp__pyplusplus_wrapper
+#define ConstKBinAxis_hpp__pyplusplus_wrapper
+
+void register_ConstKBinAxis_class();
+
+#endif//ConstKBinAxis_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/PythonCoreList.h b/Core/PythonAPI/inc/PythonCoreList.h
index 90ed5b0369e33aa5a9c1aba66dac7f2c329a9aea..edbe239d6b79980a855fae8aa4492eda5c85ba59 100644
--- a/Core/PythonAPI/inc/PythonCoreList.h
+++ b/Core/PythonAPI/inc/PythonCoreList.h
@@ -9,6 +9,7 @@
 #include "FixedBinAxis.h"
 #include "VariableBinAxis.h"
 #include "AngleBinAxis.h"
+#include "ConstKBinAxis.h"
 #include "BasicVector3D.h"
 #include "BAVersion.h"
 #include "Bin.h"
diff --git a/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp b/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f0c177f1c70fbc5daf4e10143a9b1cbd5701707c
--- /dev/null
+++ b/Core/PythonAPI/src/ConstKBinAxis.pypp.cpp
@@ -0,0 +1,254 @@
+// This file has been generated by Py++.
+
+// BornAgain: simulate and fit scattering at grazing incidence
+//! @brief Automatically generated boost::python code for PythonCoreAPI
+
+#include "Macros.h"
+GCC_DIAG_OFF(unused-parameter)
+GCC_DIAG_OFF(missing-field-initializers)
+#include "boost/python.hpp"
+GCC_DIAG_ON(unused-parameter)
+GCC_DIAG_ON(missing-field-initializers)
+#include "PythonCoreList.h"
+#include "ConstKBinAxis.pypp.h"
+
+namespace bp = boost::python;
+
+struct ConstKBinAxis_wrapper : ConstKBinAxis, bp::wrapper< ConstKBinAxis > {
+
+    ConstKBinAxis_wrapper(ConstKBinAxis const & arg )
+    : ConstKBinAxis( arg )
+      , bp::wrapper< ConstKBinAxis >(){
+        // copy constructor
+        
+    }
+
+    ConstKBinAxis_wrapper(::std::string name, ::std::size_t nbins, double start, double end )
+    : ConstKBinAxis( name, nbins, start, end )
+      , bp::wrapper< ConstKBinAxis >(){
+        // constructor
+    
+    }
+
+    virtual ::ConstKBinAxis * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
+        else
+            return this->ConstKBinAxis::clone(  );
+    }
+    
+    
+    ::ConstKBinAxis * default_clone(  ) const  {
+        return ConstKBinAxis::clone( );
+    }
+
+    virtual ::IAxis * createDoubleBinSize(  ) const  {
+        if( bp::override func_createDoubleBinSize = this->get_override( "createDoubleBinSize" ) )
+            return func_createDoubleBinSize(  );
+        else
+            return this->IAxis::createDoubleBinSize(  );
+    }
+    
+    
+    ::IAxis * default_createDoubleBinSize(  ) const  {
+        return IAxis::createDoubleBinSize( );
+    }
+
+    virtual ::std::size_t findClosestIndex( double value ) const  {
+        if( bp::override func_findClosestIndex = this->get_override( "findClosestIndex" ) )
+            return func_findClosestIndex( value );
+        else
+            return this->VariableBinAxis::findClosestIndex( value );
+    }
+    
+    
+    ::std::size_t default_findClosestIndex( double value ) const  {
+        return VariableBinAxis::findClosestIndex( value );
+    }
+
+    virtual ::Bin1D getBin( ::std::size_t index ) const  {
+        if( bp::override func_getBin = this->get_override( "getBin" ) )
+            return func_getBin( index );
+        else
+            return this->VariableBinAxis::getBin( index );
+    }
+    
+    
+    ::Bin1D default_getBin( ::std::size_t index ) const  {
+        return VariableBinAxis::getBin( index );
+    }
+
+    virtual ::std::vector< double > getBinBoundaries(  ) const  {
+        if( bp::override func_getBinBoundaries = this->get_override( "getBinBoundaries" ) )
+            return func_getBinBoundaries(  );
+        else
+            return this->VariableBinAxis::getBinBoundaries(  );
+    }
+    
+    
+    ::std::vector< double > default_getBinBoundaries(  ) const  {
+        return VariableBinAxis::getBinBoundaries( );
+    }
+
+    virtual ::std::vector< double > getBinCenters(  ) const  {
+        if( bp::override func_getBinCenters = this->get_override( "getBinCenters" ) )
+            return func_getBinCenters(  );
+        else
+            return this->VariableBinAxis::getBinCenters(  );
+    }
+    
+    
+    ::std::vector< double > default_getBinCenters(  ) const  {
+        return VariableBinAxis::getBinCenters( );
+    }
+
+    virtual double getMax(  ) const  {
+        if( bp::override func_getMax = this->get_override( "getMax" ) )
+            return func_getMax(  );
+        else
+            return this->VariableBinAxis::getMax(  );
+    }
+    
+    
+    double default_getMax(  ) const  {
+        return VariableBinAxis::getMax( );
+    }
+
+    virtual double getMin(  ) const  {
+        if( bp::override func_getMin = this->get_override( "getMin" ) )
+            return func_getMin(  );
+        else
+            return this->VariableBinAxis::getMin(  );
+    }
+    
+    
+    double default_getMin(  ) const  {
+        return VariableBinAxis::getMin( );
+    }
+
+    virtual ::std::size_t getSize(  ) const  {
+        if( bp::override func_getSize = this->get_override( "getSize" ) )
+            return func_getSize(  );
+        else
+            return this->VariableBinAxis::getSize(  );
+    }
+    
+    
+    ::std::size_t default_getSize(  ) const  {
+        return VariableBinAxis::getSize( );
+    }
+
+};
+
+void register_ConstKBinAxis_class(){
+
+    { //::ConstKBinAxis
+        typedef bp::class_< ConstKBinAxis_wrapper, bp::bases< VariableBinAxis > > ConstKBinAxis_exposer_t;
+        ConstKBinAxis_exposer_t ConstKBinAxis_exposer = ConstKBinAxis_exposer_t( "ConstKBinAxis", bp::init< std::string, std::size_t, double, double >(( bp::arg("name"), bp::arg("nbins"), bp::arg("start"), bp::arg("end") )) );
+        bp::scope ConstKBinAxis_scope( ConstKBinAxis_exposer );
+        { //::ConstKBinAxis::clone
+        
+            typedef ::ConstKBinAxis * ( ::ConstKBinAxis::*clone_function_type )(  ) const;
+            typedef ::ConstKBinAxis * ( ConstKBinAxis_wrapper::*default_clone_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "clone"
+                , clone_function_type(&::ConstKBinAxis::clone)
+                , default_clone_function_type(&ConstKBinAxis_wrapper::default_clone)
+                , bp::return_value_policy< bp::manage_new_object >() );
+        
+        }
+        { //::IAxis::createDoubleBinSize
+        
+            typedef ::IAxis * ( ::IAxis::*createDoubleBinSize_function_type )(  ) const;
+            typedef ::IAxis * ( ConstKBinAxis_wrapper::*default_createDoubleBinSize_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "createDoubleBinSize"
+                , createDoubleBinSize_function_type(&::IAxis::createDoubleBinSize)
+                , default_createDoubleBinSize_function_type(&ConstKBinAxis_wrapper::default_createDoubleBinSize)
+                , bp::return_value_policy< bp::manage_new_object >() );
+        
+        }
+        { //::VariableBinAxis::findClosestIndex
+        
+            typedef ::std::size_t ( ::VariableBinAxis::*findClosestIndex_function_type )( double ) const;
+            typedef ::std::size_t ( ConstKBinAxis_wrapper::*default_findClosestIndex_function_type )( double ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "findClosestIndex"
+                , findClosestIndex_function_type(&::VariableBinAxis::findClosestIndex)
+                , default_findClosestIndex_function_type(&ConstKBinAxis_wrapper::default_findClosestIndex)
+                , ( bp::arg("value") ) );
+        
+        }
+        { //::VariableBinAxis::getBin
+        
+            typedef ::Bin1D ( ::VariableBinAxis::*getBin_function_type )( ::std::size_t ) const;
+            typedef ::Bin1D ( ConstKBinAxis_wrapper::*default_getBin_function_type )( ::std::size_t ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getBin"
+                , getBin_function_type(&::VariableBinAxis::getBin)
+                , default_getBin_function_type(&ConstKBinAxis_wrapper::default_getBin)
+                , ( bp::arg("index") ) );
+        
+        }
+        { //::VariableBinAxis::getBinBoundaries
+        
+            typedef ::std::vector< double > ( ::VariableBinAxis::*getBinBoundaries_function_type )(  ) const;
+            typedef ::std::vector< double > ( ConstKBinAxis_wrapper::*default_getBinBoundaries_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getBinBoundaries"
+                , getBinBoundaries_function_type(&::VariableBinAxis::getBinBoundaries)
+                , default_getBinBoundaries_function_type(&ConstKBinAxis_wrapper::default_getBinBoundaries) );
+        
+        }
+        { //::VariableBinAxis::getBinCenters
+        
+            typedef ::std::vector< double > ( ::VariableBinAxis::*getBinCenters_function_type )(  ) const;
+            typedef ::std::vector< double > ( ConstKBinAxis_wrapper::*default_getBinCenters_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getBinCenters"
+                , getBinCenters_function_type(&::VariableBinAxis::getBinCenters)
+                , default_getBinCenters_function_type(&ConstKBinAxis_wrapper::default_getBinCenters) );
+        
+        }
+        { //::VariableBinAxis::getMax
+        
+            typedef double ( ::VariableBinAxis::*getMax_function_type )(  ) const;
+            typedef double ( ConstKBinAxis_wrapper::*default_getMax_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getMax"
+                , getMax_function_type(&::VariableBinAxis::getMax)
+                , default_getMax_function_type(&ConstKBinAxis_wrapper::default_getMax) );
+        
+        }
+        { //::VariableBinAxis::getMin
+        
+            typedef double ( ::VariableBinAxis::*getMin_function_type )(  ) const;
+            typedef double ( ConstKBinAxis_wrapper::*default_getMin_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getMin"
+                , getMin_function_type(&::VariableBinAxis::getMin)
+                , default_getMin_function_type(&ConstKBinAxis_wrapper::default_getMin) );
+        
+        }
+        { //::VariableBinAxis::getSize
+        
+            typedef ::std::size_t ( ::VariableBinAxis::*getSize_function_type )(  ) const;
+            typedef ::std::size_t ( ConstKBinAxis_wrapper::*default_getSize_function_type )(  ) const;
+            
+            ConstKBinAxis_exposer.def( 
+                "getSize"
+                , getSize_function_type(&::VariableBinAxis::getSize)
+                , default_getSize_function_type(&ConstKBinAxis_wrapper::default_getSize) );
+        
+        }
+    }
+
+}
diff --git a/Core/PythonAPI/src/PythonModule.cpp b/Core/PythonAPI/src/PythonModule.cpp
index f1ff3cd8d3512f8ca3fdb62f5968686495694148..78ce19edec1603e68d2e69d2a50305725075801a 100644
--- a/Core/PythonAPI/src/PythonModule.cpp
+++ b/Core/PythonAPI/src/PythonModule.cpp
@@ -54,6 +54,7 @@ GCC_DIAG_ON(missing-field-initializers)
 #include "StochasticParameter_t.pypp.h"
 #include "StochasticDoubleGaussian.pypp.h"
 #include "FormFactorPrism6.pypp.h"
+#include "ConstKBinAxis.pypp.h"
 #include "InterferenceFunction2DLattice.pypp.h"
 #include "FormFactorPyramid.pypp.h"
 #include "FormFactorBox.pypp.h"
@@ -157,6 +158,8 @@ BOOST_PYTHON_MODULE(libBornAgainCore){
     register_Beam_class();
     register_Bin1D_class();
     register_Bin1DCVector_class();
+    register_VariableBinAxis_class();
+    register_ConstKBinAxis_class();
     register_ICloneable_class();
     register_ISample_class();
     register_ICompositeSample_class();
@@ -265,7 +268,6 @@ BOOST_PYTHON_MODULE(libBornAgainCore){
     register_StochasticDoubleGaussian_class();
     register_StochasticSampledParameter_class();
     register_ThreadInfo_class();
-    register_VariableBinAxis_class();
     register_global_variables();
     register_free_functions();
 
diff --git a/Core/Tools/inc/ConstKBinAxis.h b/Core/Tools/inc/ConstKBinAxis.h
new file mode 100644
index 0000000000000000000000000000000000000000..819d4b27b576dda5c00695b60311e56fed18387e
--- /dev/null
+++ b/Core/Tools/inc/ConstKBinAxis.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tools/inc/AxisBin.h
+//! @brief     Defines class AxisBin.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CONSTKBINAXIS_H
+#define CONSTKBINAXIS_H
+
+
+#include "VariableBinAxis.h"
+
+//! @class ConstKBinAxis
+//! @ingroup tools
+//! @brief Axis with fixed bin size in sin(angle) space.
+
+class BA_CORE_API_ ConstKBinAxis : public VariableBinAxis
+{
+public:
+    //! @brief ConstKBinAxis constructor
+    //! @param name Axis name
+    //! @param nbins number of bins
+    //! @param start low edge of first bin
+    //! @param end upper edge of last bin
+    ConstKBinAxis(std::string name, size_t nbins, double start, double end);
+    virtual ~ConstKBinAxis() {}
+
+    ConstKBinAxis *clone() const;
+
+protected:
+    void print(std::ostream& ostr) const;
+
+    double m_start;
+    double m_end;
+};
+
+
+#endif
diff --git a/Core/Tools/inc/IsGisaxsAxis.h b/Core/Tools/inc/IsGisaxsAxis.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Core/Tools/inc/OutputDataIOHelper.h b/Core/Tools/inc/OutputDataIOHelper.h
index e267a94537bf891bcdbec7832d04a8a07a05c762..87b9eb286110fb976143f1dd91c95aa4773c53ba 100644
--- a/Core/Tools/inc/OutputDataIOHelper.h
+++ b/Core/Tools/inc/OutputDataIOHelper.h
@@ -22,16 +22,19 @@
 class IAxis;
 class FixedBinAxis;
 class VariableBinAxis;
+class ConstKBinAxis;
 template <class T> class OutputData;
 
 namespace OutputDataIOHelper {
 
 const std::string FixedBinAxisType = "FixedBinAxis";
 const std::string VariableBinAxisType = "VariableBinAxis";
+const std::string ConstKBinAxisType = "ConstKBinAxis";
 
 IAxis *createAxis(std::istream &input_stream);
 FixedBinAxis *createFixedBinAxis(std::string line);
 VariableBinAxis *createVariableBinAxis(std::string line);
+ConstKBinAxis *createConstKBinAxis(std::string line);
 
 void fillOutputData(OutputData<double> *data, std::istream &input_stream);
 
diff --git a/Core/Tools/inc/VariableBinAxis.h b/Core/Tools/inc/VariableBinAxis.h
index e2a46183e54a113923aa96e6443207f2459058e2..d0d7e802bee04a2c1921bd9c452f03ee7faf199f 100644
--- a/Core/Tools/inc/VariableBinAxis.h
+++ b/Core/Tools/inc/VariableBinAxis.h
@@ -29,7 +29,7 @@ public:
     //! @brief VariableBinAxis constructor
     //! @param name Axis name
     //! @param nbins number of bins
-    //! @param bin_edges Array of size nbins+1 containing low-edges for each
+    //! @param bin_boundaries Array of size nbins+1 containing low-edges for each
     //! bin and upper edge of last bin.
     VariableBinAxis(std::string name, size_t nbins, const std::vector<double> &bin_boundaries);
     virtual ~VariableBinAxis() {}
@@ -53,6 +53,8 @@ public:
     std::vector<double > getBinBoundaries() const;
 
 protected:
+    VariableBinAxis(std::string name);
+
     void print(std::ostream& ostr) const;
     virtual bool equals(const IAxis& other) const;
     size_t m_nbins;
diff --git a/Core/Tools/src/ConstKBinAxis.cpp b/Core/Tools/src/ConstKBinAxis.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a92766e2a45c2eacfff75ca1ac474e065aa0715f
--- /dev/null
+++ b/Core/Tools/src/ConstKBinAxis.cpp
@@ -0,0 +1,37 @@
+#include "ConstKBinAxis.h"
+#include "Exceptions.h"
+#include <iomanip>
+#include <iostream>
+
+ConstKBinAxis::ConstKBinAxis(std::string name, size_t nbins, double start, double end)
+    : VariableBinAxis(name)
+    , m_start(start)
+    , m_end(end)
+{
+    // FIXME How to defend agains angles given in degress by mistake?
+    if(m_start >= m_end)
+        throw Exceptions::LogicErrorException("ConstKBinAxis::ConstKBinAxis() -> Error. start >= end is not allowed.");
+
+    m_nbins = nbins;
+
+    double start_sin = std::sin(m_start);
+    double end_sin = std::sin(m_end);
+    double step = (end_sin-start_sin)/(m_nbins);
+
+    m_bin_boundaries.resize(m_nbins + 1, 0.0);
+    for(size_t i=0; i<m_bin_boundaries.size(); ++i) {
+        m_bin_boundaries[i] = std::asin(start_sin + step*i);
+    }
+
+}
+
+ConstKBinAxis *ConstKBinAxis::clone() const
+{
+    return new ConstKBinAxis(getName(), m_nbins, m_start, m_end);
+}
+
+void ConstKBinAxis::print(std::ostream &ostr) const
+{
+    ostr << "ConstKBinAxis(\"" << m_name << "\", " << getSize() << ", " << std::setprecision(std::numeric_limits<double>::digits10+2) << getMin() << ", " << getMax() << ")";
+}
+
diff --git a/Core/Tools/src/IsGisaxsAxis.cpp b/Core/Tools/src/IsGisaxsAxis.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Core/Tools/src/OutputDataIOHelper.cpp b/Core/Tools/src/OutputDataIOHelper.cpp
index b4cac18cedc076a817ade2cc39b593e37ab4f25f..b144b63f655aee5a6a7332697dce2aa2478544cf 100644
--- a/Core/Tools/src/OutputDataIOHelper.cpp
+++ b/Core/Tools/src/OutputDataIOHelper.cpp
@@ -1,6 +1,7 @@
 #include "OutputDataIOHelper.h"
 #include "FixedBinAxis.h"
 #include "VariableBinAxis.h"
+#include "ConstKBinAxis.h"
 #include "Exceptions.h"
 #include "Utils.h"
 #include "OutputData.h"
@@ -23,6 +24,10 @@ IAxis *OutputDataIOHelper::createAxis(std::istream &input_stream)
     {
         return createVariableBinAxis(line);
     }
+    else if(line.find(ConstKBinAxisType) != std::string::npos)
+    {
+        return createConstKBinAxis(line);
+    }
     else {
         throw Exceptions::LogicErrorException("OutputDataIOHelper::createAxis() -> Error. Unknown axis '"+line+"'");
     }
@@ -83,6 +88,33 @@ VariableBinAxis *OutputDataIOHelper::createVariableBinAxis(std::string line)
 }
 
 
+//! Create ConstKBinAxis from string representation
+//! ConstKBinAxis("axis0", 10, -1, 1)
+ConstKBinAxis *OutputDataIOHelper::createConstKBinAxis(std::string line)
+{
+    std::vector<std::string> to_replace = boost::assign::list_of(",")("\"")("(")(")");
+    Utils::String::replaceItemsFromString(line, to_replace, " ");
+
+    std::string type, name;
+    size_t nbins(0);
+
+    std::istringstream iss(line);
+    if( !(iss >> type >> name >> nbins) )
+        throw Exceptions::FormatErrorException("OutputDataIOHelper::createConstKBinAxis() -> Error. Can't parse the string.");
+
+    std::vector<double> boundaries;
+    std::string value;
+    while( iss >> value) {
+        boundaries.push_back(std::strtod(value.c_str(), NULL));
+    }
+
+    if(boundaries.size() != 2)
+        throw Exceptions::FormatErrorException("OutputDataIOHelper::createConstKBinAxis() -> Error. Can't parse the string at p2.");
+
+    return new ConstKBinAxis(name, nbins, boundaries[0], boundaries[1]);
+}
+
+
 //! Fills output data raw buffer from input stream
 void OutputDataIOHelper::fillOutputData(OutputData<double> *data, std::istream &input_stream)
 {
diff --git a/Core/Tools/src/VariableBinAxis.cpp b/Core/Tools/src/VariableBinAxis.cpp
index c9d8e020576f58a51b71efb9bbc4329e3696d265..3a5d2ae2b261f4215930add87b818155d013088a 100644
--- a/Core/Tools/src/VariableBinAxis.cpp
+++ b/Core/Tools/src/VariableBinAxis.cpp
@@ -29,6 +29,14 @@ VariableBinAxis::VariableBinAxis(std::string name, size_t nbins, const std::vect
 }
 
 
+VariableBinAxis::VariableBinAxis(std::string name)
+    : IAxis(name)
+    , m_nbins(0)
+{
+
+}
+
+
 VariableBinAxis *VariableBinAxis::clone() const
 {
     VariableBinAxis *result = new VariableBinAxis(getName(), m_nbins, m_bin_boundaries);
@@ -132,3 +140,5 @@ bool VariableBinAxis::equals(const IAxis& other) const
 
 
 
+
+
diff --git a/Tests/FunctionalTests/TestPyCore/intensitydata_io.py b/Tests/FunctionalTests/TestPyCore/intensitydata_io.py
index 265f5ab1b2e2110ac85756a9a4b61ac481f9c03c..9ffdee5fc7a29a050a2f9b224a67367490668cad 100644
--- a/Tests/FunctionalTests/TestPyCore/intensitydata_io.py
+++ b/Tests/FunctionalTests/TestPyCore/intensitydata_io.py
@@ -67,7 +67,7 @@ class OutputDataIOTest(unittest.TestCase):
         newdata = OutputDataIOFactory.readIntensityData("tmp.baint")
         self.assertTrue(is_the_same_data(data, newdata))
 
-    def testB_02_FixedBinAxis_2D(self):
+    def test_02_FixedBinAxis_2D(self):
         data = IntensityData()
         data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0))
         data.addAxis(FixedBinAxis("axis1", 3, -4.0, 5.0))
@@ -76,7 +76,7 @@ class OutputDataIOTest(unittest.TestCase):
         newdata = OutputDataIOFactory.readIntensityData("tmp.baint")
         self.assertTrue(is_the_same_data(data, newdata))
 
-    def testC_03_FixedBinAxis_3D(self):
+    def test_03_FixedBinAxis_3D(self):
         data = IntensityData()
         data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0))
         data.addAxis(FixedBinAxis("axis1", 1, -4.0, 5.0))
@@ -86,7 +86,7 @@ class OutputDataIOTest(unittest.TestCase):
         newdata = OutputDataIOFactory.readIntensityData("tmp.baint")
         self.assertTrue(is_the_same_data(data, newdata))
 
-    def testD_04_VariableBinAxis_1D(self):
+    def test_04_VariableBinAxis_1D(self):
         data = IntensityData()
         data.addAxis(VariableBinAxis("axis0", 10, get_boundaries_flat_in_sin(10, -5.0, 5.0)))
         fill_data(data)
@@ -112,6 +112,15 @@ class OutputDataIOTest(unittest.TestCase):
         newdata = OutputDataIOFactory.readIntensityData("tmp.baint")
         self.assertTrue(is_the_same_data(data, newdata))
 
+    def test_07_ConstKBinAxis_2D(self):
+        data = IntensityData()
+        data.addAxis(ConstKBinAxis("axis0", 9, -1.00000001*degree, 1.0*degree))
+        data.addAxis(ConstKBinAxis("axis1", 3, -4.0*degree, 5.0*degree))
+        fill_data(data)
+        OutputDataIOFactory.writeIntensityData(data, "tmp.baint")
+        newdata = OutputDataIOFactory.readIntensityData("tmp.baint")
+        self.assertTrue(is_the_same_data(data, newdata))
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Tests/UnitTests/TestCore/ConstKBinAxisTest.h b/Tests/UnitTests/TestCore/ConstKBinAxisTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..68da901dc2bdc5e99bdf89d26858b315cb36eb1e
--- /dev/null
+++ b/Tests/UnitTests/TestCore/ConstKBinAxisTest.h
@@ -0,0 +1,112 @@
+#ifndef CONSTKBINAXISTEST_H
+#define CONSTKBINAXISTEST_H
+
+#include "ConstKBinAxis.h"
+#include "OutputDataIOHelper.h"
+#include "Units.h"
+#include "gtest/gtest.h"
+#include <vector>
+
+class ConstKBinAxisTest: public ::testing::Test
+{
+protected:
+    ConstKBinAxisTest()
+        : m_nbins(10)
+        , m_start(-5.0*Units::degree)
+        , m_end(5.0*Units::degree)
+        , m_axis("name", m_nbins, m_start, m_end)
+    {
+        double start_sin = std::sin(m_start);
+        double end_sin = std::sin(m_end);
+        double step = (end_sin-start_sin)/m_nbins;
+
+        for(size_t i=0; i<m_nbins; ++i) {
+            m_centers.push_back( (std::asin(start_sin + step*i) +  std::asin(start_sin + step*(i+1)))/2.0 );
+        }
+
+        for(size_t i=0; i<m_nbins+1; ++i) {
+            m_boundaries.push_back( std::asin(start_sin + step*i) );
+        }
+
+    }
+
+    size_t m_nbins;
+    double m_start;
+    double m_end;
+    ConstKBinAxis m_axis;
+    std::vector<double> m_centers;
+    std::vector<double> m_boundaries;
+};
+
+
+//[-5.0, -3.99816897832528, -2.9975609824866662, -1.99786732193833, -0.9987818274427882, 0.0, 0.9987818274427874, 1.9978673219383292, 2.997560982486666, 3.998168978325279, 5.0]
+TEST_F(ConstKBinAxisTest, TypicalAxis)
+{
+    EXPECT_EQ(m_nbins, m_axis.getSize());
+    EXPECT_EQ(m_start, m_axis.getMin());
+    EXPECT_EQ(m_end, m_axis.getMax());
+
+    for(size_t i=0; i<m_axis.getSize(); ++i) {
+        EXPECT_DOUBLE_EQ( m_centers[i], m_axis[i]);
+    }
+
+    for(size_t i=0; i<m_axis.getSize(); ++i) {
+        EXPECT_DOUBLE_EQ( m_boundaries[i], m_axis.getBin(i).m_lower);
+        EXPECT_DOUBLE_EQ( m_boundaries[i+1], m_axis.getBin(i).m_upper);
+    }
+
+}
+
+
+TEST_F(ConstKBinAxisTest, CheckClone)
+{
+    ConstKBinAxis *clone=m_axis.clone();
+    EXPECT_TRUE(m_axis == *clone);
+    delete clone;
+}
+
+
+TEST_F(ConstKBinAxisTest, IOStream)
+{
+    std::ostringstream oss;
+    oss << m_axis;
+
+    ConstKBinAxis *result = OutputDataIOHelper::createConstKBinAxis(oss.str());
+    EXPECT_TRUE(m_axis == *result);
+    delete result;
+}
+
+
+//TEST_F(ConstKBinAxisTest, BinCenters)
+//{
+//    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+//    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+//    VariableBinAxis axis("name", 4, values);
+
+//    std::vector<double> centers = axis.getBinCenters();
+//    EXPECT_EQ(4, centers.size());
+//    EXPECT_DOUBLE_EQ(-0.75, centers[0]);
+//    EXPECT_DOUBLE_EQ(0.0, centers[1]);
+//    EXPECT_DOUBLE_EQ(0.75, centers[2]);
+//    EXPECT_DOUBLE_EQ(1.5, centers[3]);
+//}
+
+
+//TEST_F(ConstKBinAxisTest, BinBoundaries)
+//{
+//    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+//    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+//    VariableBinAxis axis("name", 4, values);
+
+//    std::vector<double> boundaries = axis.getBinBoundaries();
+//    EXPECT_EQ(5, boundaries.size());
+//    EXPECT_DOUBLE_EQ(-1.0, boundaries[0]);
+//    EXPECT_DOUBLE_EQ(-0.5, boundaries[1]);
+//    EXPECT_DOUBLE_EQ(0.5, boundaries[2]);
+//    EXPECT_DOUBLE_EQ(1.0, boundaries[3]);
+//    EXPECT_DOUBLE_EQ(2.0, boundaries[4]);
+//}
+
+
+
+#endif
diff --git a/Tests/UnitTests/TestCore/IsGisaxsAxisTest.h b/Tests/UnitTests/TestCore/IsGisaxsAxisTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Tests/UnitTests/TestCore/main.cpp b/Tests/UnitTests/TestCore/main.cpp
index a6d16942a621116b56f07fd843a4d5217f6547fe..d344444a6c38b703ee9a441a986cc46301cff07f 100644
--- a/Tests/UnitTests/TestCore/main.cpp
+++ b/Tests/UnitTests/TestCore/main.cpp
@@ -42,6 +42,8 @@
 #include "VariableBinAxisTest.h"
 #include "AsymmetricBinAxisTest.h"
 #include "AngleBinAxisTest.h"
+#include "ConstKBinAxisTest.h"
+#include "IsGisaxsAxisTest.h"
 
 struct ErrorStreamRedirect {
     ErrorStreamRedirect( std::streambuf * new_buffer )
diff --git a/dev-tools/python-bindings/settings_core.py b/dev-tools/python-bindings/settings_core.py
index a2efb9f1761fb28928b6bd9ce91e3f7fcc2e7b75..2f0383881ea1f89256622ec557322c35842d1bf6 100644
--- a/dev-tools/python-bindings/settings_core.py
+++ b/dev-tools/python-bindings/settings_core.py
@@ -42,6 +42,7 @@ include_classes = [
     "FixedBinAxis",
     "VariableBinAxis",
     "AngleBinAxis",
+    "ConstKBinAxis",
     "BasicVector3D<double>",
     "BasicVector3D<std::complex<double> >",
     "Beam",