diff --git a/Examples/cpp/ex001_CylindersAndPrisms/CMakeLists.txt b/Examples/cpp/ex001_CylindersAndPrisms/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e21ee56f13936a99cc0e2101165b601f22a9b8d7
--- /dev/null
+++ b/Examples/cpp/ex001_CylindersAndPrisms/CMakeLists.txt
@@ -0,0 +1,47 @@
+cmake_minimum_required(VERSION 2.8)
+ 
+project(CylindersAndPrisms)
+
+add_executable(CylindersAndPrisms CylindersAndPrisms.cpp)
+
+# BornAgain include dir
+set (BornAgain_Include_Dir "/usr/include/BornAgain")
+set (Eigen3_Include_Dir "/usr/include/eigen3")
+set (ROOT_Include_Dir "/usr/include/root")
+
+include_directories (
+	${BornAgain_Include_Dir}
+	${Eigen3_Include_Dir}
+	${ROOT_Include_Dir}
+)
+
+# look for the BornAgain library
+find_library (BA_LIBRARY
+	NAMES BornAgainCore BornAgainFit
+	PATHS /usr/lib /usr/local/lib
+)
+
+# look for the ROOT library
+find_library (ROOT_GPAD_LIBRARY
+	NAMES Gpad
+	PATHS /usr/lib/i386-linux-gnu/root5.34
+)
+
+find_library (ROOT_CORE_LIBRARY
+	NAMES Core
+	PATHS /usr/lib/i386-linux-gnu/root5.34
+)
+
+find_library (ROOT_HIST_LIBRARY
+	NAMES Hist
+	PATHS /usr/lib/i386-linux-gnu/root5.34
+)
+
+
+if (BA_LIBRARY)
+	message ("BornAgain library is found in ${BA_LIBRARY}")
+	target_link_libraries (CylindersAndPrisms ${BA_LIBRARY})
+endif()
+
+target_link_libraries (CylindersAndPrisms ${ROOT_CORE_LIBRARY}  ${ROOT_HIST_LIBRARY} ${ROOT_GPAD_LIBRARY})
+
diff --git a/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.cpp b/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f019fb3adc40f07aa44e4eb97d960da3ec2e78cc
--- /dev/null
+++ b/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.cpp
@@ -0,0 +1,137 @@
+#include "OutputData.h"
+#include "Simulation.h"
+#include "ISample.h"
+#include "MultiLayer.h"
+#include "ParticleDecoration.h"
+#include "MaterialManager.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorPrism3.h"
+#include "Units.h"
+#include "InterferenceFunctionNone.h"
+
+#include "TCanvas.h"
+#include "TH1D.h"
+#include "TH2D.h"
+#include "TH3D.h"
+#include "TStyle.h"
+#include "TLine.h"
+#include "TROOT.h"
+#include "TApplication.h"
+
+#include "CylindersAndPrisms.h"
+
+
+void CylindersAndPrismsExample::setSample() 
+{
+    m_sample = new MultiLayer();
+
+    const IMaterial *p_air_material =
+            MaterialManager::getHomogeneousMaterial("Air", 0., 0.);
+    const IMaterial *p_substrate_material =
+            MaterialManager::getHomogeneousMaterial("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer;
+    air_layer.setMaterial(p_air_material);
+    Layer substrate_layer;
+    substrate_layer.setMaterial(p_substrate_material);
+
+    ParticleDecoration particle_decoration;
+    const IMaterial *particle_material = MaterialManager::getHomogeneousMaterial("Particle", 6e-4, 2e-8);
+
+    particle_decoration.addParticle(
+                new Particle(particle_material,
+                             new FormFactorCylinder(5*Units::nanometer,
+                                                    5*Units::nanometer)),
+                0.0, 0.5);
+    particle_decoration.addParticle(
+                new Particle(particle_material,
+                             new FormFactorPrism3(5*Units::nanometer,
+                                                  5*Units::nanometer)),
+                0.0, 0.5);
+    particle_decoration.addInterferenceFunction(new InterferenceFunctionNone());
+
+    air_layer.setDecoration(particle_decoration);
+
+    m_sample->addLayer(air_layer);
+    m_sample->addLayer(substrate_layer);
+
+}
+
+void CylindersAndPrismsExample::setSimulation()  
+{
+	m_simulation = new Simulation();
+
+    m_simulation->setDetectorParameters(
+        100,-1.0*Units::degree, 1.0*Units::degree, 100,
+        0.0*Units::degree, 2.0*Units::degree, true);
+    m_simulation->setBeamParameters(
+        1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    m_simulation->setSample(*m_sample);
+}
+
+CylindersAndPrismsExample::CylindersAndPrismsExample() : m_result(0)
+{
+	setSample();
+	setSimulation();
+}
+
+void CylindersAndPrismsExample::runSimulation() 
+{
+	m_simulation->runSimulation();
+	m_result = m_simulation->getIntensityData();
+}
+
+void CylindersAndPrismsExample::drawResult()
+{
+	const IAxis *axisPhi = m_result->getAxis(0);
+	const IAxis *axisAlpha = m_result->getAxis(1);
+
+	size_t nPhibins = axisPhi->getSize();
+	size_t nAlphabins = axisAlpha->getSize();
+
+    TH2D *hist = new TH2D("Layer Roughness", "Layer Roughness", 
+		(int)nPhibins, axisPhi->getMin()*Units::degree, axisPhi->getMax()*Units::degree, 
+		(int)nAlphabins, axisAlpha->getMin()*Units::degree, axisAlpha->getMax()*Units::degree);
+
+	//hist->GetXaxis()->SetTitle( axisPhi->getName() );
+    //hist->GetYaxis()->SetTitle( axisAplha->getName() );
+
+	OutputData<double>::const_iterator it = m_result->begin();
+    while (it != m_result->end())
+    {
+        double x = m_result->getValueOfAxis( axisPhi->getName(), it.getIndex() );
+        double y = m_result->getValueOfAxis( axisAlpha->getName(), it.getIndex() );
+        double value = *it++;
+        hist->Fill(x*Units::degree, y*Units::degree, value);
+    }
+	
+	hist->SetContour(50);
+    hist->SetStats(0);
+    hist->GetYaxis()->SetTitleOffset(1.1);
+
+    gStyle->SetPalette(1);
+    gStyle->SetOptStat(0);
+
+	TCanvas *c1 = new TCanvas("Layer Roughness", "Layer Roughness", 800, 800);
+	c1->cd();
+	c1->SetLogz();
+	hist->SetMinimum(1.0);
+	hist->DrawCopy("colz");
+	c1->Update();
+	
+	delete axisPhi;
+	delete axisAlpha;
+	delete hist;
+}
+
+
+int main(int argc, char **argv)
+{
+	CylindersAndPrismsExample* example = new CylindersAndPrismsExample();
+	example->runSimulation();
+	TApplication *theApp = new TApplication("theApp", &argc, argv);
+	example->drawResult();
+	theApp->Run();
+    return 0;
+}
diff --git a/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.h b/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.h
new file mode 100644
index 0000000000000000000000000000000000000000..d6379a811f1c5fa776917e4aac53f57fc11b4fb6
--- /dev/null
+++ b/Examples/cpp/ex001_CylindersAndPrisms/CylindersAndPrisms.h
@@ -0,0 +1,28 @@
+#ifndef CYLINDERSANDPRISMS_H_
+#define CYLINDERSANDPRISMS_H_
+
+// Mixture of cylinders and prisms without interference (IsGISAXS example ex-1)
+#include "OutputData.h"
+#include "Simulation.h"
+#include "ISample.h"
+
+class CylindersAndPrismsExample
+{
+public:
+    CylindersAndPrismsExample();
+    virtual ~CylindersAndPrismsExample() { delete m_sample; delete m_simulation; delete m_result; }
+
+    void runSimulation();
+    void drawResult();
+
+protected:
+	void setSample();
+    void setSimulation();
+
+private:
+	OutputData<double> *m_result;
+	Simulation *m_simulation;
+	MultiLayer *m_sample;
+};
+
+#endif /* CYLINDERSANDPRISMS_H_ */