diff --git a/Modules/Chart/include/QmitkChartData.h b/Modules/Chart/include/QmitkChartData.h
index 90f7d663ac..0d83b16740 100644
--- a/Modules/Chart/include/QmitkChartData.h
+++ b/Modules/Chart/include/QmitkChartData.h
@@ -1,104 +1,114 @@
 /*===================================================================
 
 The Medical Imaging Interaction Toolkit (MITK)
 
 Copyright (c) German Cancer Research Center,
 Division of Medical and Biological Informatics.
 All rights reserved.
 
 This software is distributed WITHOUT ANY WARRANTY; without
 even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.
 
 See LICENSE.txt or http://www.mitk.org for details.
 
 ===================================================================*/
 
 #ifndef QmitkC3Data_h
 #define QmitkC3Data_h
 
 #include <QmitkChartWidget.h>
 #include <QVariant>
 
 /** \brief This class holds the relevant properties for the chart generation with C3 such as labels and diagram type.
 * It is derived from QObject, because we need Q_PROPERTIES to send Data via QWebChannel to JavaScript.
 * \sa The actual data for the chart generation is in QmitkC3xyData!
 */
 class QmitkChartData : public QObject
 {
   Q_OBJECT
 
   Q_PROPERTY(QVariant m_xAxisLabel READ GetXAxisLabel WRITE SetXAxisLabel NOTIFY SignalXAxisLabelChanged);
   Q_PROPERTY(QVariant m_yAxisLabel READ GetYAxisLabel WRITE SetYAxisLabel NOTIFY SignalYAxisLabelChanged);
   Q_PROPERTY(QVariant m_chartTitle READ GetTitle WRITE SetTitle NOTIFY SignalTitleChanged);
+  Q_PROPERTY(QVariant m_themeName READ GetThemeName WRITE SetThemeName NOTIFY SignalThemeNameChanged);
   Q_PROPERTY(QVariant m_LegendPosition READ GetLegendPosition WRITE SetLegendPosition NOTIFY SignalLegendPositionChanged);
   Q_PROPERTY(QVariant m_ShowLegend READ GetShowLegend WRITE SetShowLegend NOTIFY SignalShowLegendChanged);
   Q_PROPERTY(QVariant m_YAxisScale READ GetYAxisScale WRITE SetYAxisScale NOTIFY SignalYAxisScaleChanged);
   Q_PROPERTY(QVariant m_ShowSubchart READ GetShowSubchart WRITE SetShowSubchart NOTIFY SignalShowSubchartChanged);
   Q_PROPERTY(QVariant m_UsePercentageInPieChart READ GetUsePercentageInPieChart WRITE SetUsePercentageInPieChart NOTIFY SignalUsePercentageInPieChartChanged);
   Q_PROPERTY(QVariant m_DataPointSize READ GetDataPointSize WRITE SetDataPointSize NOTIFY SignalDataPointSizeChanged);
   Q_PROPERTY(QVariant m_StackedData READ GetStackedData WRITE SetStackedData NOTIFY SignalStackedDataChanged);
 
 public:
   QmitkChartData();
 
   void SetAppearance(bool showSubChart = true, bool usePercentageInPieChart = false);
 
   Q_INVOKABLE QVariant GetXAxisLabel() const { return m_xAxisLabel; };
   Q_INVOKABLE void SetXAxisLabel(const QVariant& label) { m_xAxisLabel = label; emit SignalXAxisLabelChanged(label); };
 
   Q_INVOKABLE QVariant GetYAxisLabel() const { return m_yAxisLabel; };
   Q_INVOKABLE void SetYAxisLabel(const QVariant& label) { m_yAxisLabel = label; emit SignalYAxisLabelChanged(label); };
 
   Q_INVOKABLE QVariant GetTitle() const { return m_chartTitle; };
   Q_INVOKABLE void SetTitle(const QVariant& title) { m_chartTitle = title; emit SignalTitleChanged(title); };
 
+  Q_INVOKABLE QVariant GetThemeName() const { return m_themeName; };
+  Q_INVOKABLE void SetThemeName(const QVariant &themeName)
+  {
+    m_themeName = themeName;
+    emit SignalThemeNameChanged(themeName);
+  };
+
   Q_INVOKABLE QVariant GetLegendPosition() const { return m_LegendPosition; };
   Q_INVOKABLE void SetLegendPosition(const QVariant& legendPosition) { m_LegendPosition = legendPosition; emit SignalLegendPositionChanged(legendPosition); };
 
   Q_INVOKABLE QVariant GetShowLegend() const { return m_ShowLegend; };
   Q_INVOKABLE void SetShowLegend(const QVariant& show) { m_ShowLegend = show; emit SignalShowLegendChanged(show); };
 
   Q_INVOKABLE QVariant GetYAxisScale() const { return m_YAxisScale; };
   Q_INVOKABLE void SetYAxisScale(const QVariant& YAxisScale) { m_YAxisScale = YAxisScale; emit SignalYAxisScaleChanged(YAxisScale); };
 
   Q_INVOKABLE QVariant GetShowSubchart() const { return m_ShowSubchart; };
   Q_INVOKABLE void SetShowSubchart(const QVariant& showSubchart) { m_ShowSubchart = showSubchart; emit SignalShowSubchartChanged(showSubchart); };
 
   Q_INVOKABLE QVariant GetUsePercentageInPieChart() const { return m_UsePercentageInPieChart; };
   Q_INVOKABLE void SetUsePercentageInPieChart(const QVariant& usePercentageInPieChart) { m_UsePercentageInPieChart = usePercentageInPieChart; emit SignalUsePercentageInPieChartChanged(usePercentageInPieChart); };
 
   Q_INVOKABLE QVariant GetDataPointSize() const { return m_DataPointSize; };
   Q_INVOKABLE void SetDataPointSize(const QVariant& showDataPoints) { if (showDataPoints > 0) { m_DataPointSize = 3; } else { m_DataPointSize = 0; } emit SignalDataPointSizeChanged(showDataPoints); };
 
   Q_INVOKABLE QVariant GetStackedData() const { return m_StackedData; };
   Q_INVOKABLE void SetStackedData(const QVariant& stackedData) { m_StackedData = stackedData; emit SignalStackedDataChanged(m_StackedData); };
 
 signals:
   void SignalYAxisLabelChanged(const QVariant label);
   void SignalXAxisLabelChanged(const QVariant label);
   void SignalLegendPositionChanged(const QVariant legendPosition);
   void SignalShowLegendChanged(const QVariant show);
   void SignalYAxisScaleChanged(const QVariant YAxisScale);
   void SignalTitleChanged(const QVariant title);
+  void SignalThemeNameChanged(const QVariant themeName);
   void SignalShowSubchartChanged(const QVariant showSubchart);
   void SignalUsePercentageInPieChartChanged(const QVariant usePercentageInPieChart);
   void SignalDataPointSizeChanged(const QVariant showDataPoints);
   void SignalStackedDataChanged(const QVariant stackedData);
 
 private:
   QVariant m_xAxisLabel;
   QVariant m_yAxisLabel;
   QVariant m_chartTitle;
+  QVariant m_themeName = "dark";
 
   QVariant m_ShowLegend = true;
   QVariant m_LegendPosition = "topRight";
   QVariant m_ShowSubchart;
   QVariant m_YAxisScale;
   QVariant m_UsePercentageInPieChart;
   QVariant m_numberDatasets;
   QVariant m_DataPointSize = 0;
   QVariant m_StackedData;
 };
 
 #endif  //QmitkC3Data_h
diff --git a/Modules/Chart/resource/Chart.js b/Modules/Chart/resource/Chart.js
index 4ff589f167..512df898b7 100644
--- a/Modules/Chart/resource/Chart.js
+++ b/Modules/Chart/resource/Chart.js
@@ -1,227 +1,252 @@
 document.body.style.backgroundColor = 'rgb(240, 240, 240)';
 
 const minHeight = 255;
 var chart;
 
 var chartData;
 var xValues=[];
 var yValues=[];
 var dataLabels=[];
 var xs = {};
 var dataColors = {};
 var chartTypes = {};
 var lineStyle = {};
+var backgroundColor = '#f0f0f0';
+var foregroundColor = 'black';
 
 // Important loading function. This will be executed at first in this whole script.
 // Fetching data from QWebChannel and storing them for display purposes.
 window.onload = function()
 {
   initHeight();
 
   new QWebChannel(qt.webChannelTransport, function(channel) {
     chartData = channel.objects.chartData;
 
     let count = 0;
   	for(let propertyName in channel.objects) {
   	  if (propertyName != 'chartData')
   	  {
   			let xDataTemp = channel.objects[propertyName].m_XData
   			let yDataTemp = channel.objects[propertyName].m_YData
   			let dataLabel = channel.objects[propertyName].m_Label
   			dataLabels.push(dataLabel)
 
         console.log("loading datalabel: "+dataLabel);
 
         //add label to x array
   			xDataTemp.unshift('x'+count.toString())
   			xs[dataLabel] = 'x' + count.toString()
 
   			xDataTemp.push(null); //append null value, to make sure the last tick on x-axis is displayed correctly
   			yDataTemp.unshift(dataLabel)
   			yDataTemp.push(null); //append null value, to make sure the last tick on y-axis is displayed correctly
   			xValues[count] = xDataTemp
   			yValues[count] = yDataTemp
   			dataColors[dataLabel] = channel.objects[propertyName].m_Color
   			chartTypes[dataLabel] = channel.objects[propertyName].m_ChartType
 
   			if (channel.objects[propertyName].m_LineStyleName == "solid")
   			{
   			  lineStyle[dataLabel] = ''
   			}
   			else
   			{
   			  lineStyle[dataLabel] = [{ 'style': 'dashed' }]
   			}
 
   			count++;
   		}
   	}
-
-    generateChart(chartData);
-
+	var theme = chartData.m_themeName;
+	setThemeColors(theme);
+    generateChart(chartData, theme);
   });
 }
 
 /**
  * Inits the height of the chart element to 90% of the full window height.
  */
 function initHeight() {
   var size = window.innerHeight-(window.innerHeight/100*10); //subtract 10% of height to hide vertical scrool bar
   let chart = document.getElementById("chart");
   chart.style.height = `${size}px`;
 }
 
 function getPlotlyChartType(inputType){
   let plotlyType = "";
   if (inputType == "line"){
     plotlyType = "scatter";
   } else if (inputType == "bar"){
     plotlyType = "bar";
   }
   return plotlyType;
 }
 
 
 
 /**
  * Here, the chart magic takes place. Plot.ly is called.
  *
  * @param {object} chartData - containing the options for plotting, not the actual values
  */
-function generateChart(chartData)
+function generateChart(chartData, theme='dark')
 {
   console.log("generate chart");
 	if (chartData == undefined)
 	{
 		chartData = {}
 	}
 
 	if (dataLabels == undefined)
 	{
     dataLabels = []
 	}
 
   //=============================== DATA ========================
   let data = [];
 
   for (let index = 0; index < dataLabels.length; index++){
 
     let inputType = chartTypes[dataLabels[index]];
     let chartType = getPlotlyChartType(inputType);
 
     let trace = {
       x: xValues[index].slice(1),
       y: yValues[index].slice(1),
       type: chartType,
       name: dataLabels[index],
     };
 
     if (lineStyle[dataLabels[index]]["style"] == "dashed"){
       trace["line"]["dash"] = "dot"
     }
 
     data.push(trace)
   }
 
   //=============================== STYLE ========================
   let marginTop = chartData.m_chartTitle == undefined ? 10 : 50;
 
   if (chartData.m_LegendPosition == "bottomMiddle"){
 	  var legendX = 0.5;
 	  var legendY = -0.75;
   }
   else if (chartData.m_LegendPosition == "bottomRight"){
 	  var legendX = 1;
 	  var legendY = 0;
   }
   else if (chartData.m_LegendPosition == "topRight"){
 	  var legendX = 1;
 	  var legendY = 1;
   }
   else if (chartData.m_LegendPosition == "topLeft"){
 	  var legendX = 0;
 	  var legendY = 1;
   }
   else if (chartData.m_LegendPosition == "middleRight"){
 	  var legendX = 1;
 	  var legendY = 0.5;
   }
   var layout = {
+	  paper_bgcolor : backgroundColor,
+	  plot_bgcolor : backgroundColor,
     title:chartData.m_chartTitle,
+	titlefont: {
+		color:foregroundColor
+	},
     xaxis: {
-      title: chartData.m_xAxisLabel
+      title: chartData.m_xAxisLabel,
+	  color: foregroundColor
     },
     yaxis: {
-      title: chartData.m_yAxisLabel
+      title: chartData.m_yAxisLabel,
+	  color: foregroundColor
     },
     margin: {
       l: 50,
       r: 10,
       b: 50,
       t: marginTop,
       pad: 4
     },
 	showlegend: chartData.m_ShowLegend,
 	legend: {
 		x: legendX,
-		y: legendY
+		y: legendY,
+		font : {
+			color: foregroundColor
+		}
 	}
   };
 
   if (chartData.m_YAxisScale){
       layout.yaxis["type"] = "log"
   }
 
   if (chartData.m_ShowSubchart){
     layout.xaxis.rangeslider = {}; // adds range slider below x axis
   }
 
   Plotly.newPlot('chart', data, layout, {displayModeBar: false, responsive: true});
 }
 
 /**
  * Change theme of chart.
  *
  * @param {string} color - dark or not dark
  */
 function changeTheme(color) {
+	setThemeColors(color);
 link = document.getElementsByTagName("link")[0];
   if (color == 'dark') {
     link.href = "Chart_dark.css";
   }
   else
   {
     link.href = "Chart.css";
   }
 };
 
+function setThemeColors(theme){
+	if (theme == 'dark'){
+		backgroundColor = '#2d2d30';
+		foregroundColor = 'white';
+	}
+	else {
+		backgroundColor = '#f0f0f0';
+		foregroundColor = 'black';
+	}
+}
+
 /**
  * Reload the chart with the given arguments.
  *
  * This method is called by C++. Changes on signature with caution.
  * @param {boolean} showSubchart
  * @param {string} stackDataString
  */
 function ReloadChart(showSubchart, stackDataString = false)
 {
     chartData.m_ShowSubchart = showSubchart;
     chartData.m_StackedData = stackDataString;
-    generateChart(chartData);
+	var theme = chartData.m_themeName;
+    generateChart(chartData, theme);
 }
 
 /**
  * Transforms the view to another chart type.
  *
  * This method is called by C++. Changes on signature with caution.
  * @param {string} transformTo - 'line' or 'bar'
  */
 function transformView(transformTo) {
   console.log("transform view");
   console.log(transformTo);
 
   chartTypes[dataLabels[0]] = transformTo; // preserve chartType for later updates
   let plotlyType = getPlotlyChartType(transformTo);
   let chart = document.getElementById("chart");
   let update = {type : plotlyType}
   Plotly.restyle(chart, update, 0); // updates the given plotly trace at index 0 with an update object built of a standard trace object
 };
diff --git a/Modules/Chart/resource/empty_dark.html b/Modules/Chart/resource/empty_dark.html
deleted file mode 100644
index 4146f9e1f7..0000000000
--- a/Modules/Chart/resource/empty_dark.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
-<html lang="en"> 
-  <head> 
-    <style>
-            html, body {
-                background-color: #323231;
-            }
-
-        </style>
-  </head> 
-</html> 
\ No newline at end of file
diff --git a/Modules/Chart/src/QmitkChartWidget.cpp b/Modules/Chart/src/QmitkChartWidget.cpp
index 461cbda9dc..7aeb8bd1fe 100644
--- a/Modules/Chart/src/QmitkChartWidget.cpp
+++ b/Modules/Chart/src/QmitkChartWidget.cpp
@@ -1,545 +1,562 @@
 /*===================================================================
 
 The Medical Imaging Interaction Toolkit (MITK)
 
 Copyright (c) German Cancer Research Center,
 Division of Medical and Biological Informatics.
 All rights reserved.
 
 This software is distributed WITHOUT ANY WARRANTY; without
 even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.
 
 See LICENSE.txt or http://www.mitk.org for details.
 
 ===================================================================*/
 
 #include <regex>
 
 #include <QGridLayout>
 #include <QWebChannel>
 #include <QWebEngineSettings>
 #include <QWebEngineView>
 #include <QmitkChartWidget.h>
 
 #include "mitkExceptionMacro.h"
 #include <QmitkChartData.h>
 #include <QmitkChartxyData.h>
 
 class CustomPage : public QWebEnginePage
 {
 public:
   CustomPage(QObject* parent = 0) : QWebEnginePage(parent) {}
   virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel /*level*/, const QString &message, int lineNumber, const QString &/*sourceID*/)
   {
     MITK_INFO << "JS > " << lineNumber << ": " << message.toStdString();
   }
 };
 
 
 class QmitkChartWidget::Impl final
 {
 public:
   explicit Impl(QWidget *parent);
   ~Impl();
 
   Impl(const Impl &) = delete;
   Impl &operator=(const Impl &) = delete;
 
   void AddData1D(const std::vector<double> &data1D, const std::string &label, QmitkChartWidget::ChartType chartType);
   void AddData2D(const std::map<double, double> &data2D,
                  const std::string &label,
                  QmitkChartWidget::ChartType chartType);
 
   void RemoveData(const std::string &label);
 
   void ClearData();
 
   void SetColor(const std::string &label, const std::string &colorName);
   void SetLineStyle(const std::string &label, LineStyle style);
 
   void SetYAxisScale(AxisScale scale);
 
   void SetXAxisLabel(const std::string& label);
 
   void SetYAxisLabel(const std::string& label);
 
   void SetTitle(const std::string &title);
 
+  std::string GetThemeName() const;
+  void SetThemeName(ChartStyle style);
+
   void SetChartType(QmitkChartWidget::ChartType chartType);
   void SetLegendPosition(LegendPosition position);
   void SetChartTypeByLabel(const std::string &label, QmitkChartWidget::ChartType chartType);
 
   void Show(bool showSubChart);
 
   void SetShowLegend(bool show);
 
   void SetShowDataPoints(bool showDataPoints = false);
 
   void SetChartType(const std::string& label, QmitkChartWidget::ChartType chartType);
 
   std::string ConvertChartTypeToString(QmitkChartWidget::ChartType chartType) const;
 
   void ClearJavaScriptChart();
   void InitializeJavaScriptChart();
   void CallJavaScriptFuntion(const QString &command);
 
   QSize sizeHint() const;
 
 private:
   using ChartxyDataVector = std::vector<std::unique_ptr<QmitkChartxyData>>;
   std::string GetUniqueLabelName(const QList<QVariant>& labelList, const std::string& label) const;
   QmitkChartxyData* GetDataElementByLabel(const std::string& label) const;
   QList<QVariant> GetDataLabels(const ChartxyDataVector& c3xyData) const;
   void MapTypes();
 
   QWebChannel *m_WebChannel;
   QWebEngineView *m_WebEngineView;
 
   QmitkChartData m_C3Data;
   ChartxyDataVector m_C3xyData;
   std::map<QmitkChartWidget::ChartType, std::string> m_ChartTypeToName;
+  std::map<QmitkChartWidget::ChartStyle, std::string> m_ChartStyleToName;
   std::map<QmitkChartWidget::LegendPosition, std::string> m_LegendPositionToName;
   std::map<QmitkChartWidget::LineStyle, std::string> m_LineStyleToName;
   std::map<QmitkChartWidget::AxisScale, std::string> m_AxisScaleToName;
 };
 
+std::string QmitkChartWidget::Impl::GetThemeName() const {
+  return m_C3Data.GetThemeName().toString().toStdString();
+}
+
 QmitkChartWidget::Impl::Impl(QWidget *parent)
   : m_WebChannel(new QWebChannel(parent)),
     m_WebEngineView(new QWebEngineView(parent))
 {
   // disable context menu for QWebEngineView
   m_WebEngineView->setContextMenuPolicy(Qt::NoContextMenu);
 
   m_WebEngineView->setPage(new CustomPage());
 
   // Set the webengineview to an initial empty page. The actual chart will be loaded once the data is calculated.
   m_WebEngineView->setUrl(QUrl(QStringLiteral("qrc:///C3js/empty.html")));
   m_WebEngineView->page()->setWebChannel(m_WebChannel);
   m_WebEngineView->settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, false);
 
   connect(m_WebEngineView, SIGNAL(loadFinished(bool)), parent, SLOT(OnLoadFinished(bool)));
   auto layout = new QGridLayout(parent);
   layout->setMargin(0);
   layout->addWidget(m_WebEngineView);
   m_ChartTypeToName.emplace(ChartType::bar, "bar");
   m_ChartTypeToName.emplace(ChartType::line, "line");
   m_ChartTypeToName.emplace(ChartType::spline, "spline");
   m_ChartTypeToName.emplace(ChartType::pie, "pie");
   m_ChartTypeToName.emplace(ChartType::area, "area");
   m_ChartTypeToName.emplace(ChartType::area_spline, "area-spline");
   m_ChartTypeToName.emplace(ChartType::scatter, "scatter");
 
   m_LegendPositionToName.emplace(LegendPosition::bottomMiddle, "bottomMiddle");
   m_LegendPositionToName.emplace(LegendPosition::bottomRight, "bottomRight");
   m_LegendPositionToName.emplace(LegendPosition::topRight, "topRight");
   m_LegendPositionToName.emplace(LegendPosition::topLeft, "topLeft");
   m_LegendPositionToName.emplace(LegendPosition::middleRight, "middleRight");
 
   m_LineStyleToName.emplace(LineStyle::solid, "solid");
   m_LineStyleToName.emplace(LineStyle::dashed, "dashed");
 
   m_AxisScaleToName.emplace(AxisScale::linear, "");
   m_AxisScaleToName.emplace(AxisScale::log, "log");
+
+  m_ChartStyleToName.emplace(ChartStyle::lightstyle, "light");
+  m_ChartStyleToName.emplace(ChartStyle::darkstyle, "dark");
 }
 
 QmitkChartWidget::Impl::~Impl()
 {
 }
 
 std::string CheckForCorrectHex(const std::string &colorName)
 {
   std::regex rgx("([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})");
   std::smatch match;
 
   if (!colorName.empty() && colorName.at(0) != '#' && std::regex_search(colorName.begin(), colorName.end(), match, rgx))
   {
     return "#" + colorName;
   }
   else
   {
     return colorName;
   }
 }
 
 void QmitkChartWidget::Impl::AddData1D(const std::vector<double>& data1D, const std::string& label, QmitkChartWidget::ChartType type)
 {
   std::map<double, double> transformedData2D;
   unsigned int count = 0;
   // transform the 1D data to 2D data
   for (const auto &ele : data1D)
   {
     transformedData2D[count] = ele;
     count++;
   }
 
   AddData2D(transformedData2D, label, type);
 }
 
 void QmitkChartWidget::Impl::AddData2D(const std::map<double, double>& data2D, const std::string& label, QmitkChartWidget::ChartType type)
 {
   QMap<QVariant, QVariant> data2DConverted;
   for (const auto &aValue : data2D)
   {
     data2DConverted.insert(aValue.first, aValue.second);
   }
   const std::string chartTypeName(m_ChartTypeToName.at(type));
 
   auto definedLabels = GetDataLabels(m_C3xyData);
   auto uniqueLabel = GetUniqueLabelName(definedLabels, label);
   if (type == ChartType::scatter)
   {
     SetShowDataPoints(true);
     MITK_INFO << "Enabling data points for all because of scatter plot";
   }
 
   m_C3xyData.push_back(std::make_unique<QmitkChartxyData>(
     data2DConverted, QVariant(QString::fromStdString(uniqueLabel)), QVariant(QString::fromStdString(chartTypeName))));
 }
 
 void QmitkChartWidget::Impl::RemoveData(const std::string &label)
 {
   for (ChartxyDataVector::iterator iter = m_C3xyData.begin(); iter != m_C3xyData.end(); ++iter)
   {
     if ((*iter)->GetLabel().toString().toStdString() == label)
     {
       m_C3xyData.erase(iter);
       return;
     }
   }
 
   throw std::invalid_argument("Cannot Remove Data because the label does not exist.");
 }
 
 void QmitkChartWidget::Impl::ClearData()
 {
   for (auto& xyData : m_C3xyData)
   {
     m_WebChannel->deregisterObject(xyData.get());
   }
   m_C3xyData.clear();
 }
 
 void QmitkChartWidget::Impl::SetColor(const std::string &label, const std::string &colorName)
 {
   auto element = GetDataElementByLabel(label);
   if (element)
   {
     auto colorChecked = CheckForCorrectHex(colorName);
     element->SetColor(QVariant(QString::fromStdString(colorChecked)));
   }
 }
 
 void QmitkChartWidget::Impl::SetLineStyle(const std::string &label, LineStyle style)
 {
   auto element = GetDataElementByLabel(label);
   // only has effect with chart type line
   if (element && element->GetChartType()==QVariant(QString::fromStdString(ConvertChartTypeToString(ChartType::line))))
   {
     const std::string lineStyleName(m_LineStyleToName.at(style));
     element->SetLineStyle(QVariant(QString::fromStdString(lineStyleName)));
   }
 }
 
 void QmitkChartWidget::Impl::SetYAxisScale(AxisScale scale)
 {
   const std::string axisScaleName(m_AxisScaleToName.at(scale));
   m_C3Data.SetYAxisScale(QString::fromStdString(axisScaleName));
 }
 
 QmitkChartxyData* QmitkChartWidget::Impl::GetDataElementByLabel(const std::string& label) const
 {
   for (const auto &qmitkChartxyData : m_C3xyData)
   {
     if (qmitkChartxyData->GetLabel().toString() == label.c_str())
     {
       return qmitkChartxyData.get();
     }
   }
   MITK_WARN << "label " << label << " not found in QmitkChartWidget";
   return nullptr;
 }
 
 QList<QVariant> QmitkChartWidget::Impl::GetDataLabels(const ChartxyDataVector& c3xyData) const
 {
   QList<QVariant> dataLabels;
   for (auto element = c3xyData.begin(); element != c3xyData.end(); ++element)
   {
     dataLabels.push_back((*element)->GetLabel());
   }
   return dataLabels;
 }
 
 void QmitkChartWidget::Impl::SetXAxisLabel(const std::string& label)
 {
   m_C3Data.SetXAxisLabel(QString::fromStdString(label));
 }
 
 void QmitkChartWidget::Impl::SetYAxisLabel(const std::string &label)
 {
   m_C3Data.SetYAxisLabel(QString::fromStdString(label));
 }
 
 void QmitkChartWidget::Impl::SetTitle(const std::string &title)
 {
   m_C3Data.SetTitle(QString::fromStdString(title));
 }
 
+void QmitkChartWidget::Impl::SetThemeName(QmitkChartWidget::ChartStyle style)
+{
+  const std::string themeName(m_ChartStyleToName.at(style));
+  m_C3Data.SetThemeName(QString::fromStdString(themeName));
+}
+
 void QmitkChartWidget::Impl::SetChartType(QmitkChartWidget::ChartType chartType)
 {
   for (auto iterator = m_C3xyData.begin(); iterator != m_C3xyData.end(); ++iterator)
   {
     SetChartTypeByLabel((*iterator)->GetLabel().toString().toStdString(), chartType);
   }
 
   auto chartTypeName = ConvertChartTypeToString(chartType);
   const QString command = QString::fromStdString("transformView('" + chartTypeName + "')");
   CallJavaScriptFuntion(command);
 }
 
 void QmitkChartWidget::Impl::SetChartTypeByLabel(const std::string &label, QmitkChartWidget::ChartType chartType)
 {
   auto element = GetDataElementByLabel(label);
   if (element)
   {
     if (chartType == ChartType::scatter)
     {
       SetShowDataPoints(true);
       MITK_INFO << "Enabling data points for all because of scatter plot";
     }
     auto chartTypeName = ConvertChartTypeToString(chartType);
     element->SetChartType(QVariant(QString::fromStdString(chartTypeName)));
   }
 }
 
 void QmitkChartWidget::Impl::SetLegendPosition(QmitkChartWidget::LegendPosition legendPosition)
 {
   const std::string legendPositionName(m_LegendPositionToName.at(legendPosition));
   m_C3Data.SetLegendPosition(QString::fromStdString(legendPositionName));
 }
 
 void QmitkChartWidget::Impl::Show(bool showSubChart)
 {
   if (m_C3xyData.empty())
   {
     MITK_WARN << "no data available for display in chart";
   }
   else
   {
     m_C3Data.SetAppearance(showSubChart, m_C3xyData.front()->GetChartType() == QVariant("pie"));
   }
 
     InitializeJavaScriptChart();
 }
 
 void QmitkChartWidget::Impl::SetShowLegend(bool show)
 {
   m_C3Data.SetShowLegend(show);
 }
 
 void QmitkChartWidget::Impl::SetShowDataPoints(bool showDataPoints)
 {
   if (showDataPoints == true)
   {
     m_C3Data.SetDataPointSize(3);
   }
   else
   {
     m_C3Data.SetDataPointSize(0);
   }
 }
 
 void QmitkChartWidget::Impl::SetChartType(const std::string& label, QmitkChartWidget::ChartType chartType)
 {
   auto element = GetDataElementByLabel(label);
   if (element)
   {
     if (chartType == ChartType::scatter)
     {
       SetShowDataPoints(true);
       MITK_INFO << "Enabling data points for all because of scatter plot";
     }
     const std::string chartTypeName(m_ChartTypeToName.at(chartType));
     element->SetChartType(QVariant(QString::fromStdString(chartTypeName)));
   }
 }
 
 std::string QmitkChartWidget::Impl::ConvertChartTypeToString(QmitkChartWidget::ChartType chartType) const
 {
   return m_ChartTypeToName.at(chartType);
 }
 
 QSize QmitkChartWidget::Impl::sizeHint() const
 {
 	return QSize(400, 300);
 }
 
 void QmitkChartWidget::Impl::CallJavaScriptFuntion(const QString& command)
 {
   m_WebEngineView->page()->runJavaScript(command);
 }
 
 void QmitkChartWidget::Impl::ClearJavaScriptChart()
 {
   m_WebEngineView->setUrl(QUrl(QStringLiteral("qrc:///C3js/empty.html")));
 }
 
 void QmitkChartWidget::Impl::InitializeJavaScriptChart()
 {
   m_WebChannel->registerObject(QStringLiteral("chartData"), &m_C3Data);
   unsigned count = 0;
   for (auto& xyData : m_C3xyData)
   {
 	  QString variableName = "xyData" + QString::number(count);
 	  m_WebChannel->registerObject(variableName, xyData.get());
     count++;
   }
 
   m_WebEngineView->load(QUrl(QStringLiteral("qrc:///C3js/QmitkChartWidget.html")));
 }
 
 std::string QmitkChartWidget::Impl::GetUniqueLabelName(const QList<QVariant> &labelList, const std::string &label) const
 {
   QString currentLabel = QString::fromStdString(label);
   int counter = 0;
   while (labelList.contains(currentLabel))
   {
     currentLabel = QString::fromStdString(label + std::to_string(counter));
     counter++;
   }
   return currentLabel.toStdString();
 }
 
 QmitkChartWidget::QmitkChartWidget(QWidget *parent) : QWidget(parent), m_Impl(new Impl(this)) {}
 
 QmitkChartWidget::~QmitkChartWidget() {}
 
 void QmitkChartWidget::AddData2D(const std::map<double, double> &data2D, const std::string &label, ChartType type)
 {
   m_Impl->AddData2D(data2D, label, type);
 }
 
 void QmitkChartWidget::SetColor(const std::string &label, const std::string &colorName)
 {
   m_Impl->SetColor(label, colorName);
 }
 
 void QmitkChartWidget::SetLineStyle(const std::string &label, LineStyle style)
 {
   m_Impl->SetLineStyle(label, style);
 }
 
 void QmitkChartWidget::SetYAxisScale(AxisScale scale)
 {
   m_Impl->SetYAxisScale(scale);
 }
 
 void QmitkChartWidget::AddData1D(const std::vector<double>& data1D, const std::string& label, ChartType type)
 {
   m_Impl->AddData1D(data1D, label, type);
 }
 
 void QmitkChartWidget::RemoveData(const std::string& label)
 {
   m_Impl->RemoveData(label);
 }
 
 void QmitkChartWidget::SetXAxisLabel(const std::string & label)
 {
   m_Impl->SetXAxisLabel(label);
 }
 
 void QmitkChartWidget::SetYAxisLabel(const std::string &label)
 {
   m_Impl->SetYAxisLabel(label);
 }
 
 void QmitkChartWidget::SetTitle(const std::string &title)
 {
   m_Impl->SetTitle(title);
 }
 
 void QmitkChartWidget::SetShowDataPoints(bool showDataPoints)
 {
   m_Impl->SetShowDataPoints(showDataPoints);
 }
 
 void QmitkChartWidget::SetChartType(const std::string &label, ChartType type)
 {
   m_Impl->SetChartType(label, type);
 }
 
 void QmitkChartWidget::SetLegendPosition(LegendPosition position)
 {
   m_Impl->SetLegendPosition(position);
 }
 
 void QmitkChartWidget::SetShowLegend(bool show)
 {
   m_Impl->SetShowLegend(show);
 }
 
 void QmitkChartWidget::SetStackedData(bool stacked) {
   Q_UNUSED(stacked)  //this is a temporary solution and will be changed as soon as this method is implemented
   MITK_WARN << "not yet implemented";
 }
 
 void QmitkChartWidget::Show(bool showSubChart)
 {
   m_Impl->Show(showSubChart);
 }
 
 void QmitkChartWidget::Clear()
 {
   m_Impl->ClearData();
   m_Impl->ClearJavaScriptChart();
 }
 
 void QmitkChartWidget::OnLoadFinished(bool isLoadSuccessfull)
 {
   if(isLoadSuccessfull)
   {
     emit PageSuccessfullyLoaded();
   }
 }
 
 void QmitkChartWidget::SetChartTypeForAllDataAndReload(ChartType type)
 {
   m_Impl->SetChartType(type);
 }
 
 void QmitkChartWidget::SetTheme(ChartStyle themeEnabled)
 {
   QString command;
   if (themeEnabled == ChartStyle::darkstyle)
   {
     command = QString("changeTheme('dark')");
   }
   else
   {
     command = QString("changeTheme('light')");
   }
 
   m_Impl->CallJavaScriptFuntion(command);
 }
 
 void QmitkChartWidget::Reload(bool showSubChart)
 {
   QString subChartString;
   if (showSubChart)
   {
     subChartString = "true";
   }
   else
   {
     subChartString = "false";
   }
 
   const QString command = QString("ReloadChart(" + subChartString + ")");
   m_Impl->CallJavaScriptFuntion(command);
 }
 
 QSize QmitkChartWidget::sizeHint() const
 {
 	return m_Impl->sizeHint();
 }