changeset 9312:740d65e4aa14

Q [m³/s] one message
author gernotbelger
date Thu, 26 Jul 2018 15:54:20 +0200
parents 7c7f73e5e01e
children 6ffcbb4f35d5
files artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextCSV.java artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java artifacts/src/main/java/org/dive4elements/river/artifacts/services/DischargeTablesOverview.java artifacts/src/main/java/org/dive4elements/river/artifacts/services/FixingsKMChartService.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCurveGenerator.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculator.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveExporter.java artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/DischargeLongitudinalSectionExporter.java artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveExporter.java artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityExporter.java artifacts/src/main/java/org/dive4elements/river/exports/HistoricalDischargeCurveGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java artifacts/src/main/java/org/dive4elements/river/exports/process/QOutProcessor.java artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties
diffstat 31 files changed, 1155 insertions(+), 1987 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextCSV.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/ExportContextCSV.java	Thu Jul 26 15:54:20 2018 +0200
@@ -33,19 +33,19 @@
  */
 public final class ExportContextCSV extends AbstractExportContext {
 
-    private static final String CSV_META_HEADER_EVALUATOR = "sinfo.export.flow_depth.csv.meta.header.sounding.evaluator";
-
-    private static final String CSV_META_HEADER_SOUNDING = "sinfo.export.flow_depth.csv.meta.header.sounding";
-
-    private static final String CSV_META_HEADER_SOUNDING_YEAR = "sinfo.export.flow_depth.csv.meta.header.sounding.year";
+    private static final String CSV_META_HEADER_EVALUATOR = "common.export.csv.meta.header.sounding.evaluator";
 
-    private static final String CSV_META_HEADER_SOUNDING_TYPE = "sinfo.export.flow_depth.csv.meta.header.sounding.type";
+    private static final String CSV_META_HEADER_SOUNDING = "common.export.csv.meta.header.sounding";
 
-    private static final String CSV_META_HEADER_SOUNDING_PRJ = "sinfo.export.flow_depth.csv.meta.header.sounding.prj";
+    private static final String CSV_META_HEADER_SOUNDING_YEAR = "common.export.csv.meta.header.sounding.year";
 
-    private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel";
+    private static final String CSV_META_HEADER_SOUNDING_TYPE = "common.export.csv.meta.header.sounding.type";
 
-    private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original";
+    private static final String CSV_META_HEADER_SOUNDING_PRJ = "common.export.csv.meta.header.sounding.prj";
+
+    private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL = "common.export.csv.meta.header.sounding.elevationmodel";
+
+    private static final String CSV_META_HEADER_SOUNDING_ELEVATIOIN_MODEL_ORIGINAL = "common.export.csv.meta.header.sounding.elevationmodel.original";
 
     private final CSVWriter writer;
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/GeneralResultType.java	Thu Jul 26 15:54:20 2018 +0200
@@ -13,6 +13,7 @@
 import java.util.Date;
 
 import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.river.artifacts.sinfo.common.SInfoI18NStrings;
 import org.dive4elements.river.utils.Formatter;
 
 /**
@@ -56,4 +57,34 @@
     private GeneralResultType(final String unit, final String csvHeader, final String pdfHeader) {
         super(unit, csvHeader, pdfHeader);
     }
+
+    public static final GeneralResultType location = new GeneralResultType(I18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_LOCATION_HEADER) {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public String exportValue(final CallContext context, final Object value) {
+            return exportStringValue(value);
+        }
+
+        @Override
+        protected NumberFormat createFormatter(final CallContext context) {
+            throw new UnsupportedOperationException();
+        }
+    };
+
+    public static final GeneralResultType dischargeQwithUnit = new GeneralResultType(I18NStrings.UNIT_NONE, "common.export.csv.header.q",
+            "common.export.csv.header.q") { // Q [m³/s]
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public String exportValue(final CallContext context, final Object value) {
+            final double doubleValue = asDouble(value);
+            return exportDoubleValue(context, doubleValue);
+        }
+
+        @Override
+        protected NumberFormat createFormatter(final CallContext context) {
+            return Formatter.getWaterlevelQ(context);
+        }
+    };
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DischargeTablesOverview.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DischargeTablesOverview.java	Thu Jul 26 15:54:20 2018 +0200
@@ -18,6 +18,16 @@
 import java.util.Locale;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.GlobalContext;
+import org.dive4elements.river.artifacts.model.DischargeTables;
+import org.dive4elements.river.artifacts.model.GaugesFactory;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.backend.SessionHolder;
+import org.dive4elements.river.model.DischargeTable;
+import org.dive4elements.river.model.Gauge;
+import org.dive4elements.river.model.MainValue;
+import org.dive4elements.river.model.TimeInterval;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.plot.Marker;
@@ -29,50 +39,29 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import org.dive4elements.artifacts.CallMeta;
-import org.dive4elements.artifacts.GlobalContext;
-import org.dive4elements.river.artifacts.model.DischargeTables;
-import org.dive4elements.river.artifacts.model.GaugesFactory;
-import org.dive4elements.river.artifacts.resources.Resources;
-import org.dive4elements.river.backend.SessionHolder;
-import org.dive4elements.river.model.DischargeTable;
-import org.dive4elements.river.model.Gauge;
-import org.dive4elements.river.model.MainValue;
-import org.dive4elements.river.model.TimeInterval;
-
-
 /** Generate Discharge Table chart. */
 public class DischargeTablesOverview extends AbstractChartService {
 
-    private static final Logger log = Logger
-        .getLogger(DischargeTablesOverview.class);
+    private static final Logger log = Logger.getLogger(DischargeTablesOverview.class);
 
     private static final long serialVersionUID = 1L;
 
-    public static final String I18N_CHART_TITLE =
-        "gauge.discharge.service.chart.title";
+    public static final String I18N_CHART_TITLE = "gauge.discharge.service.chart.title";
     public static final String DEFAULT_CHART_TITLE = "Pegel: XXX";
 
-    public static final String I18N_CHART_X_AXIS_TITLE =
-        "gauge.discharge.service.chart.x.title";
+    public static final String I18N_CHART_X_AXIS_TITLE = "common.export.csv.header.q";
     public static final String DEFAULT_X_AXIS_TITLE = "Q [m^3/s]";
 
-    public static final String I18N_CHART_Y_AXIS_TITLE =
-        "gauge.discharge.service.chart.y.title";
+    public static final String I18N_CHART_Y_AXIS_TITLE = "gauge.discharge.service.chart.y.title";
     public static final String DEFAULT_Y_AXIS_TITLE = "W [cm]";
 
-    public static final String I18N_CHART_SERIES_TITLE =
-        "gauge.discharge.service.chart.series.title";
+    public static final String I18N_CHART_SERIES_TITLE = "gauge.discharge.service.chart.series.title";
     public static final String DEFAULT_CHART_SERIES_TITLE = "Abflusskurve";
 
-    public static final String I18N_CHART_SERIES_TITLE_MASTER =
-        "gauge.discharge.service.chart.series.title.master";
-    public static final String DEFAULT_CHART_SERIES_TITLE_MASTER =
-        "Aktuelle Abflusskurve";
+    public static final String I18N_CHART_SERIES_TITLE_MASTER = "gauge.discharge.service.chart.series.title.master";
+    public static final String DEFAULT_CHART_SERIES_TITLE_MASTER = "Aktuelle Abflusskurve";
 
-    public static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(
-        DateFormat.SHORT, Locale.GERMANY);
-
+    public static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY);
 
     @Override
     protected void init() {
@@ -84,10 +73,10 @@
         SessionHolder.release();
     }
 
-    protected JFreeChart createChart(Document data,
-        GlobalContext globalContext, CallMeta callMeta) {
+    @Override
+    protected JFreeChart createChart(final Document data, final GlobalContext globalContext, final CallMeta callMeta) {
 
-        Gauge gauge = extractGauge(data);
+        final Gauge gauge = extractGauge(data);
 
         if (gauge == null) {
             log.warn("Could not determine Gauge from request!");
@@ -95,39 +84,34 @@
         }
 
         log.info("create discharge chart for gauge '" + gauge.getName() + "'");
-        TimeInterval timerange = extractTimeInterval(data);
+        final TimeInterval timerange = extractTimeInterval(data);
 
-        List<DischargeTable> dts = getDischargeTables(gauge, timerange);
-        XYSeriesCollection dataset = new XYSeriesCollection();
+        final List<DischargeTable> dts = getDischargeTables(gauge, timerange);
+        final XYSeriesCollection dataset = new XYSeriesCollection();
 
-        for (DischargeTable dt : dts) {
+        for (final DischargeTable dt : dts) {
             try {
-                XYSeries series = createSeries(callMeta, dt);
+                final XYSeries series = createSeries(callMeta, dt);
                 if (series != null) {
                     dataset.addSeries(series);
                 }
             }
-            catch (IllegalArgumentException iae) {
-                log.warn("unable to create discharge curve: "
-                    + iae.getMessage());
+            catch (final IllegalArgumentException iae) {
+                log.warn("unable to create discharge curve: " + iae.getMessage());
             }
         }
 
-        String title = Resources.format(callMeta, I18N_CHART_TITLE,
-            DEFAULT_CHART_TITLE, gauge.getName());
+        final String title = Resources.format(callMeta, I18N_CHART_TITLE, DEFAULT_CHART_TITLE, gauge.getName());
 
-        String xAxis = Resources.getMsg(callMeta, I18N_CHART_X_AXIS_TITLE,
-            DEFAULT_X_AXIS_TITLE);
+        final String xAxis = Resources.getMsg(callMeta, I18N_CHART_X_AXIS_TITLE, DEFAULT_X_AXIS_TITLE);
 
-        String yAxis = Resources.format(callMeta, I18N_CHART_Y_AXIS_TITLE,
-            DEFAULT_Y_AXIS_TITLE);
+        final String yAxis = Resources.format(callMeta, I18N_CHART_Y_AXIS_TITLE, DEFAULT_Y_AXIS_TITLE);
 
-        JFreeChart chart = ChartFactory.createXYLineChart(title, xAxis, yAxis,
-            null, PlotOrientation.VERTICAL, true, true, false);
+        final JFreeChart chart = ChartFactory.createXYLineChart(title, xAxis, yAxis, null, PlotOrientation.VERTICAL, true, true, false);
 
         chart.setBackgroundPaint(Color.white);
 
-        XYPlot plot = (XYPlot) chart.getPlot();
+        final XYPlot plot = (XYPlot) chart.getPlot();
         plot.setDataset(0, dataset);
         plot.setBackgroundPaint(Color.white);
         plot.setDomainGridlinePaint(Color.gray);
@@ -135,22 +119,18 @@
         plot.setDomainGridlinesVisible(true);
         plot.setRangeGridlinesVisible(true);
 
-        applyMainValueMarkers(
-            plot,
-            gauge,
-            callMeta);
+        applyMainValueMarkers(plot, gauge, callMeta);
 
         return chart;
     }
 
-    protected XYSeries createSeries(CallMeta callMeta, DischargeTable dt)
-        throws IllegalArgumentException {
+    protected XYSeries createSeries(final CallMeta callMeta, final DischargeTable dt) throws IllegalArgumentException {
 
         double[][] xy = null;
 
         xy = DischargeTables.loadDischargeTableValues(dt);
 
-        XYSeries series = new XYSeries(createSeriesTitle(callMeta, dt), false);
+        final XYSeries series = new XYSeries(createSeriesTitle(callMeta, dt), false);
         for (int i = 0, n = xy[0].length; i < n; i++) {
             series.add(xy[0][i], xy[1][i]);
         }
@@ -158,74 +138,56 @@
         return series;
     }
 
-
     /** Add domain markers to plot that indicate mainvalues. */
-    protected static void applyMainValueMarkers(
-        XYPlot   plot,
-        Gauge    gauge,
-        CallMeta meta
-    ) {
-        String river = gauge.getRiver().getName();
-        double km    = gauge.getStation().doubleValue();
+    protected static void applyMainValueMarkers(final XYPlot plot, final Gauge gauge, final CallMeta meta) {
+        final String river = gauge.getRiver().getName();
+        final double km = gauge.getStation().doubleValue();
 
         // Get Gauge s mainvalues.
-        List<MainValue> mainValues = gauge.getMainValues();
-        for (MainValue mainValue : mainValues) {
+        final List<MainValue> mainValues = gauge.getMainValues();
+        for (final MainValue mainValue : mainValues) {
             if (mainValue.getMainValue().getType().getName().equals("Q")) {
                 // Its a Q main value.
-                Marker m = FixingsKMChartService.createQSectorMarker(
-                    mainValue.getValue().doubleValue(),
-                    mainValue.getMainValue().getName());
+                final Marker m = FixingsKMChartService.createQSectorMarker(mainValue.getValue().doubleValue(), mainValue.getMainValue().getName());
                 plot.addDomainMarker(m);
-            }
-            else if (
-                mainValue.getMainValue().getType().getName().equals("W")
-            ) {
+            } else if (mainValue.getMainValue().getType().getName().equals("W")) {
                 // Its a W main value.
-                Marker m = FixingsKMChartService.createQSectorMarker(
-                    mainValue.getValue().doubleValue(),
-                    mainValue.getMainValue().getName());
+                final Marker m = FixingsKMChartService.createQSectorMarker(mainValue.getValue().doubleValue(), mainValue.getMainValue().getName());
                 plot.addRangeMarker(m);
             }
         }
     }
 
-    protected String createSeriesTitle(CallMeta callMeta, DischargeTable dt)
-        throws IllegalArgumentException {
-        TimeInterval timeInterval = dt.getTimeInterval();
+    protected String createSeriesTitle(final CallMeta callMeta, final DischargeTable dt) throws IllegalArgumentException {
+        final TimeInterval timeInterval = dt.getTimeInterval();
 
         if (timeInterval == null) {
             return Resources.format(callMeta, DEFAULT_CHART_SERIES_TITLE);
         }
 
-        Date start = timeInterval.getStartTime();
-        Date end = timeInterval.getStopTime();
+        final Date start = timeInterval.getStartTime();
+        final Date end = timeInterval.getStopTime();
 
         if (start != null && end != null) {
-            return Resources.format(callMeta, I18N_CHART_SERIES_TITLE,
-                DEFAULT_CHART_SERIES_TITLE, start, end);
-        }
-        else if (start != null) {
-            return Resources.format(callMeta, I18N_CHART_SERIES_TITLE_MASTER,
-                DEFAULT_CHART_SERIES_TITLE, start);
-        }
-        else {
-            throw new IllegalArgumentException(
-                "Missing start date of DischargeTable " + dt.getId());
+            return Resources.format(callMeta, I18N_CHART_SERIES_TITLE, DEFAULT_CHART_SERIES_TITLE, start, end);
+        } else if (start != null) {
+            return Resources.format(callMeta, I18N_CHART_SERIES_TITLE_MASTER, DEFAULT_CHART_SERIES_TITLE, start);
+        } else {
+            throw new IllegalArgumentException("Missing start date of DischargeTable " + dt.getId());
         }
     }
 
-    protected Gauge extractGauge(Document data) {
-        NodeList gauges = data.getElementsByTagName("gauge");
+    protected Gauge extractGauge(final Document data) {
+        final NodeList gauges = data.getElementsByTagName("gauge");
 
         if (gauges.getLength() > 0) {
-            String name = ((Element) gauges.item(0)).getAttribute("name");
+            final String name = ((Element) gauges.item(0)).getAttribute("name");
 
             try {
-                long officialNumber = Long.valueOf(name);
+                final long officialNumber = Long.valueOf(name);
                 return Gauge.getGaugeByOfficialNumber(officialNumber);
             }
-            catch (NumberFormatException nfe) {
+            catch (final NumberFormatException nfe) {
                 // it seems, that the client uses the name of the gauge instead
                 // of its official number
             }
@@ -238,23 +200,23 @@
         return null;
     }
 
-    protected TimeInterval extractTimeInterval(Document data) {
-        NodeList timeranges = data.getElementsByTagName("timerange");
+    protected TimeInterval extractTimeInterval(final Document data) {
+        final NodeList timeranges = data.getElementsByTagName("timerange");
 
         if (timeranges != null && timeranges.getLength() > 0) {
-            Element timerange = (Element) timeranges.item(0);
+            final Element timerange = (Element) timeranges.item(0);
 
-            String lower = timerange.getAttribute("lower");
-            String upper = timerange.getAttribute("upper");
+            final String lower = timerange.getAttribute("lower");
+            final String upper = timerange.getAttribute("upper");
 
             if (lower != null && upper != null) {
                 try {
-                    Date d1 = DATE_FORMAT.parse(lower);
-                    Date d2 = DATE_FORMAT.parse(upper);
+                    final Date d1 = DATE_FORMAT.parse(lower);
+                    final Date d2 = DATE_FORMAT.parse(upper);
 
                     return new TimeInterval(d1, d2);
                 }
-                catch (ParseException pe) {
+                catch (final ParseException pe) {
                     log.warn("Wrong time format: " + pe.getMessage());
                 }
             }
@@ -263,36 +225,33 @@
         return null;
     }
 
-    protected List<DischargeTable> getDischargeTables(Gauge gauge,
-        TimeInterval timerange) {
-        List<DischargeTable> all = gauge.getDischargeTables();
+    protected List<DischargeTable> getDischargeTables(final Gauge gauge, final TimeInterval timerange) {
+        final List<DischargeTable> all = gauge.getDischargeTables();
         Collections.sort(all);
 
         if (timerange == null) {
             return all;
         }
 
-        List<DischargeTable> dts = new ArrayList<DischargeTable>(all.size());
-        long startDate = timerange.getStartTime().getTime();
-        long stopDate = timerange.getStopTime().getTime();
+        final List<DischargeTable> dts = new ArrayList<>(all.size());
+        final long startDate = timerange.getStartTime().getTime();
+        final long stopDate = timerange.getStopTime().getTime();
 
-        for (DischargeTable dt : all) {
-            TimeInterval tmp = dt.getTimeInterval();
+        for (final DischargeTable dt : all) {
+            final TimeInterval tmp = dt.getTimeInterval();
             if (tmp == null) {
                 // this should never happen because all discharge tables should
                 // have a time interval set!
                 continue;
             }
 
-            Date start = tmp.getStartTime();
-            Date stop = tmp.getStartTime();
+            final Date start = tmp.getStartTime();
+            final Date stop = tmp.getStartTime();
 
             if (start.getTime() > startDate && start.getTime() < stopDate) {
                 dts.add(dt);
                 continue;
-            }
-            else if (stop != null && stop.getTime() < stopDate
-                && stop.getTime() > startDate) {
+            } else if (stop != null && stop.getTime() < stopDate && stop.getTime() > startDate) {
                 dts.add(dt);
                 continue;
             }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/FixingsKMChartService.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/FixingsKMChartService.java	Thu Jul 26 15:54:20 2018 +0200
@@ -8,255 +8,167 @@
 
 package org.dive4elements.river.artifacts.services;
 
-import org.dive4elements.artifactdatabase.DefaultService;
-
-import org.dive4elements.artifacts.CallMeta;
-import org.dive4elements.artifacts.GlobalContext;
-import org.dive4elements.artifacts.Service;
-
-import org.dive4elements.river.artifacts.model.FixingsColumn;
-import org.dive4elements.river.artifacts.model.FixingsColumnFactory;
-import org.dive4elements.river.artifacts.model.FixingsFilterBuilder;
-
-import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing;
-
-import org.dive4elements.river.artifacts.model.FixingsOverview;
-import org.dive4elements.river.artifacts.model.FixingsOverviewFactory;
-import org.dive4elements.river.artifacts.model.GaugeFinder;
-import org.dive4elements.river.artifacts.model.GaugeFinderFactory;
-import org.dive4elements.river.artifacts.model.GaugeRange;
-
-import org.dive4elements.river.artifacts.model.fixings.QWI;
-
-import org.dive4elements.river.artifacts.resources.Resources;
-
-import org.dive4elements.river.backend.SessionHolder;
-
-import org.dive4elements.river.jfree.ShapeRenderer;
-
-import org.dive4elements.river.utils.Formatter;
-import org.dive4elements.river.utils.Pair;
-
 import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Transparency;
-
 import java.awt.geom.Rectangle2D;
-
 import java.awt.image.BufferedImage;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.imageio.ImageIO;
 
 import org.apache.log4j.Logger;
-
+import org.dive4elements.artifactdatabase.DefaultService;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.GlobalContext;
+import org.dive4elements.artifacts.Service;
+import org.dive4elements.river.artifacts.model.FixingsColumn;
+import org.dive4elements.river.artifacts.model.FixingsColumnFactory;
+import org.dive4elements.river.artifacts.model.FixingsFilterBuilder;
+import org.dive4elements.river.artifacts.model.FixingsOverview;
+import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing;
+import org.dive4elements.river.artifacts.model.FixingsOverviewFactory;
+import org.dive4elements.river.artifacts.model.GaugeFinder;
+import org.dive4elements.river.artifacts.model.GaugeFinderFactory;
+import org.dive4elements.river.artifacts.model.GaugeRange;
+import org.dive4elements.river.artifacts.model.fixings.QWI;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.backend.SessionHolder;
+import org.dive4elements.river.jfree.ShapeRenderer;
+import org.dive4elements.river.utils.Formatter;
+import org.dive4elements.river.utils.Pair;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.LegendItemCollection;
-
 import org.jfree.chart.axis.NumberAxis;
-
 import org.jfree.chart.plot.Marker;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.chart.plot.ValueMarker;
 import org.jfree.chart.plot.XYPlot;
-
 import org.jfree.data.Range;
-
 import org.jfree.ui.RectangleAnchor;
 import org.jfree.ui.TextAnchor;
-
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-
 /** Serve chart of Fixings at certain km. */
-public class FixingsKMChartService
-extends      DefaultService
-{
-    private static final Logger log =
-        Logger.getLogger(FixingsKMChartService.class);
+public class FixingsKMChartService extends DefaultService {
+    private static final Logger log = Logger.getLogger(FixingsKMChartService.class);
 
-    public static final int DEFAULT_WIDTH  = 240;
+    public static final int DEFAULT_WIDTH = 240;
     public static final int DEFAULT_HEIGHT = 180;
 
-    public static final String [] I18N_Q_SECTOR_BOARDERS = {
-        "fix.km.chart.q.sector.border0",
-        "fix.km.chart.q.sector.border1",
-        "fix.km.chart.q.sector.border2"
-    };
-
-    public static final String [] DEFAULT_Q_SECTOR_BORDERS = {
-        "(MNQ + MQ)/2",
-        "(MQ + MHQ)/2",
-        "HQ5"
-    };
-
-    public static final String I18N_CHART_LABEL_DATE =
-        "fix.km.chart.label.date";
-
-    public static final String DEFAULT_CHART_LABEL_DATE =
-        "yyyy/MM/dd";
-
-    public static final String I18N_CHART_TITLE =
-        "fix.km.chart.title";
+    public static final String[] I18N_Q_SECTOR_BOARDERS = { "fix.km.chart.q.sector.border0", "fix.km.chart.q.sector.border1", "fix.km.chart.q.sector.border2" };
 
-    public static final String DEFAULT_CHART_TITLE =
-        "Fixings {0} km {1,number,#.###}";
-
-    public static final String I18N_Q_AXIS =
-        "fix.km.chart.q.axis";
-
-    public static final String DEFAULT_Q_AXIS =
-        "Q [m\u00b3/s]";
-
-    public static final String I18N_W_AXIS =
-        "fix.km.chart.w.axis";
+    public static final String[] DEFAULT_Q_SECTOR_BORDERS = { "(MNQ + MQ)/2", "(MQ + MHQ)/2", "HQ5" };
 
-    public static final String DEFAULT_W_AXIS =
-        "W [NN + m]";
-
-    public static final String I18N_MEASURED =
-        "fix.km.chart.measured";
+    public static final String I18N_CHART_LABEL_DATE = "fix.km.chart.label.date";
 
-    public static final String DEFAULT_MEASURED =
-        "measured";
+    public static final String DEFAULT_CHART_LABEL_DATE = "yyyy/MM/dd";
 
-    public static final String I18N_INTERPOLATED =
-        "fix.km.chart.interpolated";
+    public static final String I18N_CHART_TITLE = "fix.km.chart.title";
 
-    public static final String DEFAULT_INTERPOLATED =
-        "interpolated";
+    public static final String DEFAULT_CHART_TITLE = "Fixings {0} km {1,number,#.###}";
+
+    public static final String I18N_Q_AXIS = "common.export.csv.header.q";
+
+    public static final String DEFAULT_Q_AXIS = "Q [m\u00b3/s]";
+
+    public static final String I18N_W_AXIS = "fix.km.chart.w.axis";
+
+    public static final String DEFAULT_W_AXIS = "W [NN + m]";
+
+    public static final String I18N_MEASURED = "fix.km.chart.measured";
+
+    public static final String DEFAULT_MEASURED = "measured";
+
+    public static final String I18N_INTERPOLATED = "fix.km.chart.interpolated";
+
+    public static final String DEFAULT_INTERPOLATED = "interpolated";
 
     public static final String DEFAULT_FORMAT = "png";
 
     // TODO: Load fancy image from resources.
-    public static final byte [] EMPTY = {
-        (byte)0x89, (byte)0x50, (byte)0x4e, (byte)0x47,
-        (byte)0x0d, (byte)0x0a, (byte)0x1a, (byte)0x0a,
-        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0d,
-        (byte)0x49, (byte)0x48, (byte)0x44, (byte)0x52,
-        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
-        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
-        (byte)0x08, (byte)0x00, (byte)0x00, (byte)0x00,
-        (byte)0x00, (byte)0x3a, (byte)0x7e, (byte)0x9b,
-        (byte)0x55, (byte)0x00, (byte)0x00, (byte)0x00,
-        (byte)0x01, (byte)0x73, (byte)0x52, (byte)0x47,
-        (byte)0x42, (byte)0x00, (byte)0xae, (byte)0xce,
-        (byte)0x1c, (byte)0xe9, (byte)0x00, (byte)0x00,
-        (byte)0x00, (byte)0x09, (byte)0x70, (byte)0x48,
-        (byte)0x59, (byte)0x73, (byte)0x00, (byte)0x00,
-        (byte)0x0b, (byte)0x13, (byte)0x00, (byte)0x00,
-        (byte)0x0b, (byte)0x13, (byte)0x01, (byte)0x00,
-        (byte)0x9a, (byte)0x9c, (byte)0x18, (byte)0x00,
-        (byte)0x00, (byte)0x00, (byte)0x07, (byte)0x74,
-        (byte)0x49, (byte)0x4d, (byte)0x45, (byte)0x07,
-        (byte)0xdc, (byte)0x04, (byte)0x04, (byte)0x10,
-        (byte)0x30, (byte)0x15, (byte)0x7d, (byte)0x77,
-        (byte)0x36, (byte)0x0b, (byte)0x00, (byte)0x00,
-        (byte)0x00, (byte)0x08, (byte)0x74, (byte)0x45,
-        (byte)0x58, (byte)0x74, (byte)0x43, (byte)0x6f,
-        (byte)0x6d, (byte)0x6d, (byte)0x65, (byte)0x6e,
-        (byte)0x74, (byte)0x00, (byte)0xf6, (byte)0xcc,
-        (byte)0x96, (byte)0xbf, (byte)0x00, (byte)0x00,
-        (byte)0x00, (byte)0x0a, (byte)0x49, (byte)0x44,
-        (byte)0x41, (byte)0x54, (byte)0x08, (byte)0xd7,
-        (byte)0x63, (byte)0xf8, (byte)0x0f, (byte)0x00,
-        (byte)0x01, (byte)0x01, (byte)0x01, (byte)0x00,
-        (byte)0x1b, (byte)0xb6, (byte)0xee, (byte)0x56,
-        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
-        (byte)0x49, (byte)0x45, (byte)0x4e, (byte)0x44,
-        (byte)0xae, (byte)0x42, (byte)0x60, (byte)0x82
-    };
+    public static final byte[] EMPTY = { (byte) 0x89, (byte) 0x50, (byte) 0x4e, (byte) 0x47, (byte) 0x0d, (byte) 0x0a, (byte) 0x1a, (byte) 0x0a, (byte) 0x00,
+            (byte) 0x00, (byte) 0x00, (byte) 0x0d, (byte) 0x49, (byte) 0x48, (byte) 0x44, (byte) 0x52, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x3a, (byte) 0x7e,
+            (byte) 0x9b, (byte) 0x55, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x73, (byte) 0x52, (byte) 0x47, (byte) 0x42, (byte) 0x00,
+            (byte) 0xae, (byte) 0xce, (byte) 0x1c, (byte) 0xe9, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x09, (byte) 0x70, (byte) 0x48, (byte) 0x59,
+            (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x0b, (byte) 0x13, (byte) 0x00, (byte) 0x00, (byte) 0x0b, (byte) 0x13, (byte) 0x01, (byte) 0x00,
+            (byte) 0x9a, (byte) 0x9c, (byte) 0x18, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x74, (byte) 0x49, (byte) 0x4d, (byte) 0x45,
+            (byte) 0x07, (byte) 0xdc, (byte) 0x04, (byte) 0x04, (byte) 0x10, (byte) 0x30, (byte) 0x15, (byte) 0x7d, (byte) 0x77, (byte) 0x36, (byte) 0x0b,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x08, (byte) 0x74, (byte) 0x45, (byte) 0x58, (byte) 0x74, (byte) 0x43, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x00, (byte) 0xf6, (byte) 0xcc, (byte) 0x96, (byte) 0xbf, (byte) 0x00, (byte) 0x00,
+            (byte) 0x00, (byte) 0x0a, (byte) 0x49, (byte) 0x44, (byte) 0x41, (byte) 0x54, (byte) 0x08, (byte) 0xd7, (byte) 0x63, (byte) 0xf8, (byte) 0x0f,
+            (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x1b, (byte) 0xb6, (byte) 0xee, (byte) 0x56, (byte) 0x00, (byte) 0x00,
+            (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x45, (byte) 0x4e, (byte) 0x44, (byte) 0xae, (byte) 0x42, (byte) 0x60, (byte) 0x82 };
 
     private static final Output empty() {
         return new Output(EMPTY, "image/png");
     }
 
     @Override
-    public Service.Output process(
-        Document      data,
-        GlobalContext globalContext,
-        CallMeta      callMeta
-    ) {
+    public Service.Output process(final Document data, final GlobalContext globalContext, final CallMeta callMeta) {
         log.debug("FixingsKMChartService.process");
 
         SessionHolder.acquire();
         try {
             return doProcess(data, globalContext, callMeta);
-        }
-        finally {
+        } finally {
             SessionHolder.release();
         }
     }
 
-    protected Service.Output doProcess(
-        Document      input,
-        GlobalContext globalContext,
-        CallMeta      callMeta
-    ) {
-        String    river  = getRiverName(input);
-        Double    km     = getKM(input);
-        Dimension extent = getExtent(input);
-        String    format = getFormat(input);
+    protected Service.Output doProcess(final Document input, final GlobalContext globalContext, final CallMeta callMeta) {
+        final String river = getRiverName(input);
+        final Double km = getKM(input);
+        final Dimension extent = getExtent(input);
+        final String format = getFormat(input);
 
         if (river == null || km == null) {
             log.warn("River and/or km invalid.");
             return empty();
         }
 
-        FixingsOverview overview = FixingsOverviewFactory.getOverview(river);
+        final FixingsOverview overview = FixingsOverviewFactory.getOverview(river);
 
         if (overview == null) {
             log.warn("No overview found for river '" + river + "'");
             return empty();
         }
 
-        FixingsFilterBuilder ffb = new FixingsFilterBuilder(input);
-
-        List<Fixing.Column> columns = overview.filter(
-            ffb.getRange(),
-            ffb.getFilter());
+        final FixingsFilterBuilder ffb = new FixingsFilterBuilder(input);
 
-        List<Pair<Fixing.Column, FixingsColumn>> cols =
-            new ArrayList<Pair<Fixing.Column, FixingsColumn>>();
+        final List<Fixing.Column> columns = overview.filter(ffb.getRange(), ffb.getFilter());
 
-        for (Fixing.Column col: columns) {
-            FixingsColumn data =
-                FixingsColumnFactory.INSTANCE.getColumnData(col);
+        final List<Pair<Fixing.Column, FixingsColumn>> cols = new ArrayList<>();
+
+        for (final Fixing.Column col : columns) {
+            final FixingsColumn data = FixingsColumnFactory.INSTANCE.getColumnData(col);
             if (data != null) {
-                cols.add(new Pair<Fixing.Column, FixingsColumn>(col, data));
+                cols.add(new Pair<>(col, data));
             }
         }
 
-        JFreeChart chart = createChart(cols, river, km, callMeta);
+        final JFreeChart chart = createChart(cols, river, km, callMeta);
 
         return encode(chart, extent, format);
     }
 
-    protected static Output encode(
-        JFreeChart chart,
-        Dimension  extent,
-        String     format
-    ) {
-        BufferedImage image = chart.createBufferedImage(
-            extent.width, extent.height,
-            Transparency.BITMASK,
-            null);
+    protected static Output encode(final JFreeChart chart, final Dimension extent, final String format) {
+        final BufferedImage image = chart.createBufferedImage(extent.width, extent.height, Transparency.BITMASK, null);
 
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
         try {
             ImageIO.write(image, format, out);
         }
-        catch (IOException ioe) {
+        catch (final IOException ioe) {
             log.warn("writing image failed", ioe);
             return empty();
         }
@@ -264,86 +176,60 @@
         return new Output(out.toByteArray(), "image/" + format);
     }
 
-    protected static JFreeChart createChart(
-        List<Pair<Fixing.Column, FixingsColumn>> cols,
-        String      river,
-        double      km,
-        CallMeta    callMeta
-    ) {
-        String labelFormat = Resources.getMsg(
-            callMeta, I18N_CHART_LABEL_DATE, DEFAULT_CHART_LABEL_DATE);
-
-        QWSeriesCollection.LabelGenerator lg =
-            new QWSeriesCollection.DateFormatLabelGenerator(labelFormat);
+    protected static JFreeChart createChart(final List<Pair<Fixing.Column, FixingsColumn>> cols, final String river, final double km, final CallMeta callMeta) {
+        final String labelFormat = Resources.getMsg(callMeta, I18N_CHART_LABEL_DATE, DEFAULT_CHART_LABEL_DATE);
 
-        QWSeriesCollection dataset = new QWSeriesCollection(lg);
+        final QWSeriesCollection.LabelGenerator lg = new QWSeriesCollection.DateFormatLabelGenerator(labelFormat);
 
-        double [] w = new double[1];
-        for (Pair<Fixing.Column, FixingsColumn> col: cols) {
-            boolean interpolated = !col.getB().getW(km, w);
-            double q = col.getB().getQ(km);
+        final QWSeriesCollection dataset = new QWSeriesCollection(lg);
+
+        final double[] w = new double[1];
+        for (final Pair<Fixing.Column, FixingsColumn> col : cols) {
+            final boolean interpolated = !col.getB().getW(km, w);
+            final double q = col.getB().getQ(km);
             if (!Double.isNaN(w[0]) && !Double.isNaN(q)) {
-                QWI qw = new QWI(
-                    q, w[0],
-                    col.getA().getDescription(),
-                    col.getA().getStartTime(),
-                    interpolated, 0);
+                final QWI qw = new QWI(q, w[0], col.getA().getDescription(), col.getA().getStartTime(), interpolated, 0);
                 dataset.add(qw);
             }
         }
 
-        String title = Resources.format(
-            callMeta, I18N_CHART_TITLE, DEFAULT_CHART_TITLE, river, km);
-
-        String qAxis = Resources.getMsg(
-            callMeta, I18N_Q_AXIS, DEFAULT_Q_AXIS);
-
-        String wAxis = Resources.getMsg(
-            callMeta, I18N_W_AXIS, DEFAULT_W_AXIS);
+        final String title = Resources.format(callMeta, I18N_CHART_TITLE, DEFAULT_CHART_TITLE, river, km);
 
-        JFreeChart chart = ChartFactory.createXYLineChart(
-            title,
-            qAxis,
-            wAxis,
-            null,
-            PlotOrientation.VERTICAL,
-            true,
-            true,
-            false);
+        final String qAxis = Resources.getMsg(callMeta, I18N_Q_AXIS, DEFAULT_Q_AXIS);
 
-        XYPlot plot = (XYPlot)chart.getPlot();
+        final String wAxis = Resources.getMsg(callMeta, I18N_W_AXIS, DEFAULT_W_AXIS);
 
-        NumberAxis qA = (NumberAxis)plot.getDomainAxis();
+        final JFreeChart chart = ChartFactory.createXYLineChart(title, qAxis, wAxis, null, PlotOrientation.VERTICAL, true, true, false);
+
+        final XYPlot plot = (XYPlot) chart.getPlot();
+
+        final NumberAxis qA = (NumberAxis) plot.getDomainAxis();
         qA.setNumberFormatOverride(Formatter.getWaterlevelQ(callMeta));
 
-        NumberAxis wA = (NumberAxis)plot.getRangeAxis();
+        final NumberAxis wA = (NumberAxis) plot.getRangeAxis();
         wA.setNumberFormatOverride(Formatter.getWaterlevelW(callMeta));
 
         plot.setRenderer(0, dataset.createRenderer());
         plot.setDataset(0, dataset);
 
-        Rectangle2D area = dataset.getArea();
+        final Rectangle2D area = dataset.getArea();
 
         if (area != null) {
-            double height = area.getHeight();
-            double wInset = Math.max(height, 0.01) * 0.25d;
+            final double height = area.getHeight();
+            final double wInset = Math.max(height, 0.01) * 0.25d;
 
             wA.setAutoRangeIncludesZero(false);
-            wA.setRange(new Range(
-                area.getMinY() - wInset,
-                area.getMaxY() + wInset));
+            wA.setRange(new Range(area.getMinY() - wInset, area.getMaxY() + wInset));
         }
 
-        final String measuredS = Resources.getMsg(
-            callMeta, I18N_MEASURED, DEFAULT_MEASURED);
+        final String measuredS = Resources.getMsg(callMeta, I18N_MEASURED, DEFAULT_MEASURED);
 
-        final String interpolatedS = Resources.getMsg(
-            callMeta, I18N_INTERPOLATED, DEFAULT_INTERPOLATED);
+        final String interpolatedS = Resources.getMsg(callMeta, I18N_INTERPOLATED, DEFAULT_INTERPOLATED);
 
-        LegendItemCollection lic = plot.getLegendItems();
+        final LegendItemCollection lic = plot.getLegendItems();
         dataset.addLegendItems(lic, new ShapeRenderer.LabelGenerator() {
             @Override
-            public String createLabel(ShapeRenderer.Entry entry) {
+            public String createLabel(final ShapeRenderer.Entry entry) {
                 return entry.getFilled() ? measuredS : interpolatedS;
             }
         });
@@ -362,24 +248,18 @@
     }
 
     /** Add domain markers to plot that indicate Q-sectors. */
-    protected static void applyQSectorMarkers(
-        XYPlot   plot,
-        String   river,
-        double   km,
-        CallMeta meta
-    ) {
-        GaugeFinderFactory ggf = GaugeFinderFactory.getInstance();
-        GaugeFinder        gf  = ggf.getGaugeFinder(river);
+    protected static void applyQSectorMarkers(final XYPlot plot, final String river, final double km, final CallMeta meta) {
+        final GaugeFinderFactory ggf = GaugeFinderFactory.getInstance();
+        final GaugeFinder gf = ggf.getGaugeFinder(river);
 
         if (gf == null) {
             log.warn("No gauge finder found for river '" + river + "'");
             return;
         }
 
-        GaugeRange gr = gf.find(km);
+        final GaugeRange gr = gf.find(km);
         if (gr == null) {
-            log.debug("No gauge range found for km "
-                + km + " on river " + river + ".");
+            log.debug("No gauge range found for km " + km + " on river " + river + ".");
             return;
         }
 
@@ -388,13 +268,11 @@
         }
 
         for (int i = 0; i < I18N_Q_SECTOR_BOARDERS.length; ++i) {
-            String key   = I18N_Q_SECTOR_BOARDERS[i];
-            String def   = DEFAULT_Q_SECTOR_BORDERS[i];
-            String label = Resources.getMsg(meta, key, def);
+            final String key = I18N_Q_SECTOR_BOARDERS[i];
+            final String def = DEFAULT_Q_SECTOR_BORDERS[i];
+            final String label = Resources.getMsg(meta, key, def);
 
-            Marker m = createQSectorMarker(
-                gr.getSectorBorder(i),
-                label);
+            final Marker m = createQSectorMarker(gr.getSectorBorder(i), label);
 
             if (m != null) {
                 plot.addDomainMarker(m);
@@ -403,13 +281,11 @@
     }
 
     /** Create Marker at value with label. */
-    protected static Marker createQSectorMarker(
-         double value, String label
-    ) {
+    protected static Marker createQSectorMarker(final double value, final String label) {
         if (Double.isNaN(value)) {
             return null;
         }
-        Marker m = new ValueMarker(value);
+        final Marker m = new ValueMarker(value);
         m.setPaint(Color.black);
         m.setStroke(new BasicStroke());
         m.setLabel(label);
@@ -418,59 +294,59 @@
         return m;
     }
 
-    protected static String getRiverName(Document input) {
-        NodeList rivers = input.getElementsByTagName("river");
+    protected static String getRiverName(final Document input) {
+        final NodeList rivers = input.getElementsByTagName("river");
 
         if (rivers.getLength() == 0) {
             return null;
         }
 
-        String river = ((Element)rivers.item(0)).getAttribute("name");
+        final String river = ((Element) rivers.item(0)).getAttribute("name");
 
         return river.length() > 0 ? river : null;
     }
 
-    protected static Double getKM(Document input) {
-        NodeList kms = input.getElementsByTagName("km");
+    protected static Double getKM(final Document input) {
+        final NodeList kms = input.getElementsByTagName("km");
 
         if (kms.getLength() == 0) {
             return null;
         }
 
-        String km = ((Element)kms.item(0)).getAttribute("value");
+        final String km = ((Element) kms.item(0)).getAttribute("value");
 
         try {
             return Double.valueOf(km);
         }
-        catch (NumberFormatException nfe) {
+        catch (final NumberFormatException nfe) {
             log.warn("Km '" + km + " is not a valid number.");
             return null;
         }
     }
 
-    protected static Dimension getExtent(Document input) {
+    protected static Dimension getExtent(final Document input) {
 
-        int width  = DEFAULT_WIDTH;
+        int width = DEFAULT_WIDTH;
         int height = DEFAULT_HEIGHT;
 
-        NodeList extents = input.getElementsByTagName("extent");
+        final NodeList extents = input.getElementsByTagName("extent");
 
         if (extents.getLength() > 0) {
-            Element element = (Element)extents.item(0);
-            String w = element.getAttribute("width");
-            String h = element.getAttribute("height");
+            final Element element = (Element) extents.item(0);
+            final String w = element.getAttribute("width");
+            final String h = element.getAttribute("height");
 
             try {
                 width = Math.max(1, Integer.parseInt(w));
             }
-            catch (NumberFormatException nfe) {
+            catch (final NumberFormatException nfe) {
                 log.warn("width '" + w + "' is not a valid.");
             }
 
             try {
                 height = Math.max(1, Integer.parseInt(h));
             }
-            catch (NumberFormatException nfe) {
+            catch (final NumberFormatException nfe) {
                 log.warn("height '" + h + "' is not a valid");
             }
         }
@@ -478,13 +354,13 @@
         return new Dimension(width, height);
     }
 
-    protected static String getFormat(Document input) {
+    protected static String getFormat(final Document input) {
         String format = DEFAULT_FORMAT;
 
-        NodeList formats = input.getElementsByTagName("format");
+        final NodeList formats = input.getElementsByTagName("format");
 
         if (formats.getLength() > 0) {
-            String type = ((Element)formats.item(0)).getAttribute("type");
+            final String type = ((Element) formats.item(0)).getAttribute("type");
             if (type.length() > 0) {
                 format = type;
             }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoI18NStrings.java	Thu Jul 26 15:54:20 2018 +0200
@@ -17,15 +17,15 @@
 public interface SInfoI18NStrings {
     // TODO: MAKE interface package-visible again:-)
     // TODO: Strings werden nur einmal verwenden; direkte Verwendung auch denkbar. Liste ist nicht vollständig
-    String CSV_META_HEADER_WATERLEVEL_GAUGE = "sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge";
+    String CSV_META_HEADER_WATERLEVEL_GAUGE = "common.export.csv.meta.header.waterlevel.gauge";
 
-    String CSV_META_HEADER_WATERLEVEL_YEAR = "sinfo.export.flow_depth.csv.meta.header.waterlevel.year";
+    String CSV_META_HEADER_WATERLEVEL_YEAR = "common.export.csv.meta.header.waterlevel.year";
 
     String CSV_MEAN_BED_HEIGHT_HEADER = "sinfo.export.flow_depth.csv.header.mean_bed_height";
 
     String CSV_MEAN_BED_HEIGHT_HEADER_SHORT = "sinfo.export.flow_depth.csv.header.mean_bed_height.short";
 
-    String CSV_WATERLEVEL_HEADER = "sinfo.export.flow_depth.csv.header.waterlevel";
+    String CSV_WATERLEVEL_HEADER = "common.export.csv.header.waterlevel";
 
     String CSV_DISCHARGE_HEADER = "sinfo.export.flow_depth.csv.header.discharge";
 
@@ -33,7 +33,7 @@
 
     String CSV_GAUGE_HEADER = "sinfo.export.flow_depth.csv.header.gauge";
 
-    String CSV_LOCATION_HEADER = "sinfo.export.flow_depth.csv.header.location";
+    String CSV_LOCATION_HEADER = "common.export.csv.header.location";
 
     String CSV_SOUNDING_HEADER = "sinfo.export.flow_depth.csv.header.sounding";
 
@@ -69,9 +69,9 @@
 
     String CSV_FLOWDEPTH_HISTORICAL_HEADER = "sinfo.export.csv.header.flowdepth.historical";
 
-    String CSV_META_HEADER_WATERLEVEL = "sinfo.export.flow_depth.csv.meta.header.waterlevel";
+    String CSV_META_HEADER_WATERLEVEL = "common.export.csv.meta.header.waterlevel";
 
-    String CSV_META_HEADER_WATERLEVEL_NAME = "sinfo.export.flow_depth.csv.meta.header.waterlevel.name";
+    String CSV_META_HEADER_WATERLEVEL_NAME = "common.export.csv.meta.header.waterlevel.name";
 
     String PREFIX_TKH_KIND = "sinfo.export.tkh.soilkind.";
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java	Thu Jul 26 15:54:20 2018 +0200
@@ -365,20 +365,6 @@
         }
     };
 
-    public static final SInfoResultType location = new SInfoResultType(I18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_LOCATION_HEADER) {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public String exportValue(final CallContext context, final Object value) {
-            return exportStringValue(value);
-        }
-
-        @Override
-        protected NumberFormat createFormatter(final CallContext context) {
-            throw new UnsupportedOperationException();
-        }
-    };
-
     public static final SInfoResultType soilkind = new SInfoResultType(I18NStrings.UNIT_NONE, SInfoI18NStrings.CSV_TKHKIND_HEADER,
             "sinfo.export.tkh.pdf.header.tkhkind") {
         private static final long serialVersionUID = 1L;
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java	Thu Jul 26 15:54:20 2018 +0200
@@ -140,7 +140,7 @@
         }
 
         lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel));
-        lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location));
+        lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.location));
 
         return lines.toArray(new String[lines.size()]);
     }
@@ -169,7 +169,7 @@
         }
 
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
+        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.location));
 
         exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
     }
@@ -213,7 +213,7 @@
         }
 
         exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel);
-        exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location);
+        exportContextPDF.addJRMetadata(source, "location_header", GeneralResultType.location);
     }
 
     private final String getPdfHeader(final String rootStr, final int index) {
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -261,10 +261,10 @@
     private StickyAxisAnnotation calcInfrastructureQAnnotation(final ResultRow row) {
         final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure",
                 "sinfo.chart.flood_duration.curve.infrastructure",
-                SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype))
-                + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
-        final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge),
-                SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.Q.idx);
+                SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype)) + ", "
+                        + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
+        final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge), SimpleAxis.Y_AXIS,
+                FloodDurationCurveGenerator.YAXIS.Q.idx);
         annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration));
         return annotation;
     }
@@ -275,8 +275,8 @@
     private StickyAxisAnnotation calcInfrastructureWAnnotation(final ResultRow row) {
         final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure",
                 "sinfo.chart.flood_duration.curve.infrastructure",
-                SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype))
-                + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
+                SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype)) + ", "
+                        + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
         final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.infrastructureHeight),
                 SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.W.idx);
         annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration));
@@ -378,8 +378,7 @@
                 return "Q=" + description;
             else
                 return "W=" + description;
-        }
-        else
+        } else
             return description;
     }
 
@@ -408,8 +407,8 @@
     /**
      * Create a result row for a station and its gauge, and add w-q-values as selected
      */
-    private ResultRow createRow(final Double station, final Gauge gauge, final Gauge firstGauge, final WQKms[] wqkmsArray,
-            final List<Double> gaugeDurations, final int kmIndex) {
+    private ResultRow createRow(final Double station, final Gauge gauge, final Gauge firstGauge, final WQKms[] wqkmsArray, final List<Double> gaugeDurations,
+            final int kmIndex) {
 
         final ResultRow row = ResultRow.create();
         row.putValue(GeneralResultType.station, station);
@@ -420,7 +419,7 @@
         row.putValue(SInfoResultType.gaugeLabel, gaugeLabel);
 
         final String location = this.riverInfoProvider.getLocation(station);
-        row.putValue(SInfoResultType.location, location);
+        row.putValue(GeneralResultType.location, location);
 
         final List<DurationWaterlevel> wsts = new ArrayList<>(wqkmsArray.length);
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCurveGenerator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCurveGenerator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -57,7 +57,7 @@
 
     private static final String I18N_YAXIS_LABEL_W = "chart.duration.curve.yaxis.label.w";
 
-    private static final String I18N_YAXIS_LABEL_Q = "chart.duration.curve.yaxis.label.q";
+    private static final String I18N_YAXIS_LABEL_Q = "common.export.csv.header.q";
 
     private static final String I18N_CHART_TITLE_DEFAULT = "Dauerlinie";
 
@@ -165,15 +165,12 @@
 
         if (name.equals(DURATION_W)) {
             doWOut((WQDay) (artifactFacet.getData(context)), artifactFacet, attr, visible);
-        }
-        else if (name.equals(DURATION_Q)) {
+        } else if (name.equals(DURATION_Q)) {
             doQOut((WQDay) artifactFacet.getData(context), artifactFacet, attr, visible);
-        }
-        else if (name.equals(FloodDurationCurveProcessor.FACET_FLOOD_DURATION_MAINVALUES_Q)
+        } else if (name.equals(FloodDurationCurveProcessor.FACET_FLOOD_DURATION_MAINVALUES_Q)
                 || name.equals(FloodDurationCurveProcessor.FACET_FLOOD_DURATION_MAINVALUES_W)) {
             doAnnotations((RiverAnnotation) artifactFacet.getData(context), artifactFacet, attr, visible);
-        }
-        else if (name.equals(FloodDurationCurveProcessor.FACET_FLOOD_DURATION_INFRASTRUCTURE) && (artifactFacet.getData(context) != null)) {
+        } else if (name.equals(FloodDurationCurveProcessor.FACET_FLOOD_DURATION_INFRASTRUCTURE) && (artifactFacet.getData(context) != null)) {
             doAnnotations((RiverAnnotation) artifactFacet.getData(context), artifactFacet, attr, visible);
         }
         // else if (name.equals(RELATIVE_POINT)) {
@@ -181,8 +178,7 @@
         // }
         else if (FacetTypes.IS.MANUALPOINTS(name)) {
             doPoints(artifactFacet.getData(context), artifactFacet, attr, visible, YAXIS.W.idx);
-        }
-        else {
+        } else {
             log.warn("Unknown facet name: " + name);
             return;
         }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculationResult.java	Thu Jul 26 15:54:20 2018 +0200
@@ -74,7 +74,7 @@
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel));
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.meanBedHeight));
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
+        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.location));
 
         exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
 
@@ -123,7 +123,7 @@
         exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel);
         exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight);
         exportContextPDF.addJRMetadata(source, "sounding_name_header", SInfoResultType.soundingLabel);
-        exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location);
+        exportContextPDF.addJRMetadata(source, "location_header", GeneralResultType.location);
     }
 
     private String[] formatRow(final ExportMode mode, final IExportContext exportContext, final ResultRow row) {
@@ -145,7 +145,7 @@
         lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel));
         lines.add(exportContext.formatRowValue(row, SInfoResultType.meanBedHeight));
         lines.add(exportContext.formatRowValue(row, SInfoResultType.soundingLabel));
-        lines.add(exportContext.formatRowValue(row, SInfoResultType.location));
+        lines.add(exportContext.formatRowValue(row, GeneralResultType.location));
 
         return lines.toArray(new String[lines.size()]);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -13,9 +13,9 @@
 import java.util.Collection;
 
 import org.apache.commons.lang.math.DoubleRange;
+import org.dive4elements.river.artifacts.common.GeneralResultType;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
-
 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
@@ -76,7 +76,7 @@
 
         // REMARK: access the location once only during calculation
         final String location = this.riverInfoProvider.getLocation(station);
-        row.putValue(SInfoResultType.location, location);
+        row.putValue(GeneralResultType.location, location);
 
         if (this.tkhCalculator.calculateTkh(station, row))
             this.rows.add(row);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculation.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculation.java	Thu Jul 26 15:54:20 2018 +0200
@@ -117,8 +117,7 @@
         FlowDepthUtils.checkYearDifference(Resources.getMsg(this.context.getMeta(), "flowdepthdevelopmentcalculation.yearDifferenceCurrent"), currentWstYear,
                 currentSoundingYear, problems);
         FlowDepthUtils.checkYearDifference(Resources.getMsg(this.context.getMeta(), "flowdepthdevelopmentcalculation.yearDifferenceHistorical"),
-                historicalWstYear,
-                historicalSoundingYear, problems);
+                historicalWstYear, historicalSoundingYear, problems);
 
         /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */
         final RiverInfoProvider currentRiverInfoProvider = infoProvider.forWaterlevel(currentWaterlevel);
@@ -139,7 +138,7 @@
         final double diffYear = currentMeanYear - historcialMeanYear;
 
         /* real calculation loop */
-        final Collection< ResultRow> rows = new ArrayList<>();
+        final Collection<ResultRow> rows = new ArrayList<>();
 
         final Collection<Double> stations = determineCalculationSteps(currentSounding, historicalSounding);
         for (final double station : stations) {
@@ -168,7 +167,7 @@
                 // REMARK: access the location once only during calculation
                 final String location = currentRiverInfoProvider.getLocation(station);
 
-                final ResultRow row =  ResultRow.create().//
+                final ResultRow row = ResultRow.create().//
                         putValue(GeneralResultType.station, station). //
                         putValue(SInfoResultType.flowdepthDevelopment, flowDepthDevelopment). //
                         putValue(SInfoResultType.flowdepthDevelopmentPerYear, flowDepthDevelopmentPerYear). //
@@ -176,15 +175,14 @@
                         putValue(SInfoResultType.bedHeightDifference, diffBedHeight). //
                         putValue(SInfoResultType.flowdepthCurrent, currentFlowDepth). //
                         putValue(SInfoResultType.flowdepthHistorical, historicalFlowDepth). //
-                        putValue(SInfoResultType.location, location);
+                        putValue(GeneralResultType.location, location);
                 rows.add(row);
             }
         }
 
         final String label = buildLabel(currentWaterlevel, currentSoundingInfo, historicalWaterlevel, historicalSoundingInfo);
 
-        return new FlowDepthDevelopmentCalculationResult(label, currentWstInfo, historicalWstInfo, currentSoundingInfo, historicalSoundingInfo,
-                rows);
+        return new FlowDepthDevelopmentCalculationResult(label, currentWstInfo, historicalWstInfo, currentSoundingInfo, historicalSoundingInfo, rows);
     }
 
     /**
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculationResult.java	Thu Jul 26 15:54:20 2018 +0200
@@ -140,7 +140,7 @@
         lines.add(exportContext.formatRowValue(row, SInfoResultType.bedHeightDifference));
         lines.add(exportContext.formatRowValue(row, SInfoResultType.flowdepthCurrent));
         lines.add(exportContext.formatRowValue(row, SInfoResultType.flowdepthHistorical));
-        lines.add(exportContext.formatRowValue(row, SInfoResultType.location));
+        lines.add(exportContext.formatRowValue(row, GeneralResultType.location));
 
         return lines.toArray(new String[lines.size()]);
     }
@@ -157,7 +157,7 @@
         header.add(exportContextCSV.msgUnitLabel(SInfoResultType.bedHeightDifference, getBedHeightDifferenceLabel()));
         header.add(exportContextCSV.msgUnitLabel(SInfoResultType.flowdepthCurrent, getFlowDepthCurrentLabel()));
         header.add(exportContextCSV.msgUnitLabel(SInfoResultType.flowdepthHistorical, getFlowDepthHistoricalLabel()));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
+        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.location));
 
         exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
 
@@ -194,7 +194,7 @@
         exportContextPDF.addJRMetadata(source, "flowdepthhistorical_header", SInfoResultType.flowdepthHistorical);
         exportContextPDF.addJRMetadata(source, "flowdepthhistorical_header2", getFlowDepthHistoricalLabel());
 
-        exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location);
+        exportContextPDF.addJRMetadata(source, "location_header", GeneralResultType.location);
 
     }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentState.java	Thu Jul 26 15:54:20 2018 +0200
@@ -78,7 +78,7 @@
         final FlowDepthDevelopmentCalculationResults results = (FlowDepthDevelopmentCalculationResults) res.getData();
         final FlowDepthDevelopmentCalculationResult result = results.getResult();
         if (result != null) {
-            // final FlowDepthDevelopmentCalculationResult result = (FlowDepthDevelopmentCalculationResult) resultList.get(0);
+            // final BezugswstCalculationResult result = (BezugswstCalculationResult) resultList.get(0);
             /* add themes for chart, for each result */
             final int index = 0;
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculation.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculation.java	Thu Jul 26 15:54:20 2018 +0200
@@ -121,7 +121,7 @@
         final String soundingLabel = bedHeightInfo.getDescription();
 
         /* real calculation loop */
-        final Collection< ResultRow> rows = new ArrayList<>();
+        final Collection<ResultRow> rows = new ArrayList<>();
 
         final Collection<Double> stations = bedHeight.getStations();
         for (final double station : stations) {
@@ -147,7 +147,7 @@
                 if (Double.isNaN(wst) || Double.isNaN(minBedHeightValue) || Double.isNaN(maxBedHeightValue))
                     continue;
 
-                final  ResultRow row =  ResultRow.create().//
+                final ResultRow row = ResultRow.create().//
                         putValue(GeneralResultType.station, station). //
                         putValue(SInfoResultType.flowdepthmin, minFlowDepth). //
                         putValue(SInfoResultType.flowdepthmax, maxFlowDepth). //
@@ -157,7 +157,7 @@
                         putValue(SInfoResultType.gaugeLabel, gaugeLabel). //
                         putValue(SInfoResultType.meanBedHeight, meanBedHeight). //
                         putValue(SInfoResultType.soundingLabel, soundingLabel). //
-                        putValue(SInfoResultType.location, location);
+                        putValue(GeneralResultType.location, location);
                 rows.add(row);
             }
         }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxCalculationResult.java	Thu Jul 26 15:54:20 2018 +0200
@@ -61,7 +61,7 @@
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel));
         header.add(exportContextCSV.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit()));
         header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
+        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.location));
 
         exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
 
@@ -108,7 +108,7 @@
         exportContextPDF.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel);
         exportContextPDF.addJRMetadata(source, "bedheight_header", SInfoResultType.meanBedHeight);
         exportContextPDF.addJRMetadata(source, "sounding_name_header", SInfoResultType.soundingLabel);
-        exportContextPDF.addJRMetadata(source, "location_header", SInfoResultType.location);
+        exportContextPDF.addJRMetadata(source, "location_header", GeneralResultType.location);
 
     }
 
@@ -132,7 +132,7 @@
         lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.gaugeLabel));
         lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.meanBedHeight));
         lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.soundingLabel));
-        lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.location));
+        lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.location));
 
         return lines.toArray(new String[lines.size()]);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculation.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculation.java	Thu Jul 26 15:54:20 2018 +0200
@@ -23,6 +23,7 @@
 import org.apache.commons.lang.math.NumberRange;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.WINFOArtifact;
+import org.dive4elements.river.artifacts.common.GeneralResultType;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.Calculation.Problem;
@@ -182,7 +183,7 @@
 
             row.putValue(SInfoResultType.waterlevelLabel, waterlevelLabel);
             row.putValue(SInfoResultType.gaugeLabel, riverInfoProvider.findGauge(station));
-            row.putValue(SInfoResultType.location, riverInfoProvider.getLocation(station));
+            row.putValue(GeneralResultType.location, riverInfoProvider.getLocation(station));
 
             if (tkhCalculator.calculateTkh(station, row))
                 rows.add(row);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculationResult.java	Thu Jul 26 15:54:20 2018 +0200
@@ -60,7 +60,7 @@
             header.add(descriptionHeader);
 
         header.add(exportContext.formatCsvHeader(SInfoResultType.gaugeLabel));
-        header.add(exportContext.formatCsvHeader(SInfoResultType.location));
+        header.add(exportContext.formatCsvHeader(GeneralResultType.location));
 
         exportContext.writeCSVLine(header.toArray(new String[header.size()]));
 
@@ -109,7 +109,7 @@
         exportContext.addJRMetadata(source, "waterlevel_name_header", waterlevelNameHeader);
 
         exportContext.addJRMetadata(source, "gauge_header", SInfoResultType.gaugeLabel);
-        exportContext.addJRMetadata(source, "location_header", SInfoResultType.location);
+        exportContext.addJRMetadata(source, "location_header", GeneralResultType.location);
 
     }
 
@@ -131,7 +131,7 @@
             lines.add(exportContext.formatRowValue(row, SInfoResultType.waterlevelLabel));
 
         lines.add(exportContext.formatRowValue(row, SInfoResultType.gaugeLabel));
-        lines.add(exportContext.formatRowValue(row, SInfoResultType.location));
+        lines.add(exportContext.formatRowValue(row, GeneralResultType.location));
 
         return lines.toArray(new String[lines.size()]);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -9,68 +9,55 @@
 package org.dive4elements.river.exports;
 
 import java.io.OutputStream;
+import java.text.DateFormat;
 import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.Date;
 import java.util.HashMap;
-import java.util.Date;
-import java.text.DateFormat;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.common.utils.Config;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.access.RangeAccess;
+import org.dive4elements.river.artifacts.model.CalculationResult;
+import org.dive4elements.river.artifacts.model.WKmsJRDataSource;
+import org.dive4elements.river.artifacts.model.WQ;
+import org.dive4elements.river.artifacts.model.WQKms;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.model.Gauge;
+import org.dive4elements.river.model.River;
+import org.dive4elements.river.utils.Formatter;
+import org.dive4elements.river.utils.RiverUtils;
 
 import au.com.bytecode.opencsv.CSVWriter;
-
+import net.sf.jasperreports.engine.JRException;
 import net.sf.jasperreports.engine.JasperExportManager;
 import net.sf.jasperreports.engine.JasperFillManager;
 import net.sf.jasperreports.engine.JasperPrint;
-import net.sf.jasperreports.engine.JRException;
-
-import org.dive4elements.artifacts.common.utils.Config;
-
-import org.dive4elements.artifacts.CallMeta;
-
-import org.dive4elements.river.artifacts.D4EArtifact;
-
-import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.model.CalculationResult;
-import org.dive4elements.river.artifacts.model.WQ;
-import org.dive4elements.river.artifacts.model.WQKms;
-import org.dive4elements.river.artifacts.model.WKmsJRDataSource;
-import org.dive4elements.river.artifacts.resources.Resources;
-
-import org.dive4elements.river.model.Gauge;
-import org.dive4elements.river.model.River;
-
-import org.dive4elements.river.utils.RiverUtils;
-import org.dive4elements.river.utils.Formatter;
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class ComputedDischargeCurveExporter extends AbstractExporter {
 
-    /** The log used in this exporter.*/
-    private static Logger log =
-        Logger.getLogger(ComputedDischargeCurveExporter.class);
-
-    public static final String CSV_W_HEADER =
-        "export.computed.discharge.curve.csv.header.w";
+    /** The log used in this exporter. */
+    private static Logger log = Logger.getLogger(ComputedDischargeCurveExporter.class);
 
-    public static final String CSV_Q_HEADER =
-        "export.computed.discharge.curve.csv.header.q";
-
-    public static final String DEFAULT_CSV_W_HEADER  = "W [NN + m]";
-    public static final String DEFAULT_CSV_Q_HEADER  = "Q [m\u00b3/s]";
+    public static final String CSV_W_HEADER = "export.computed.discharge.curve.csv.header.w";
 
-    public static final String PDF_HEADER_MODE =
-        "export.computed.discharge.pdf.mode";
-    public static final String PDF_HEADER_CALC_MODE =
-        "export.computed.discharge.pdf.calc.mode";
-    public static final String JASPER_FILE =
-        "export.computed.discharge.pdf.file";
+    public static final String CSV_Q_HEADER = "common.export.csv.header.q";
+
+    public static final String DEFAULT_CSV_W_HEADER = "W [NN + m]";
+    public static final String DEFAULT_CSV_Q_HEADER = "Q [m\u00b3/s]";
+
+    public static final String PDF_HEADER_MODE = "export.computed.discharge.pdf.mode";
+    public static final String PDF_HEADER_CALC_MODE = "export.computed.discharge.pdf.calc.mode";
+    public static final String JASPER_FILE = "export.computed.discharge.pdf.file";
 
     protected List<WQKms> data;
 
@@ -81,157 +68,135 @@
     protected Date validSince;
 
     public ComputedDischargeCurveExporter() {
-        data = new ArrayList<WQKms>();
+        this.data = new ArrayList<>();
     }
 
     @Override
     protected void addData(Object d) {
         if (d instanceof CalculationResult) {
-            d = ((CalculationResult)d).getData();
+            d = ((CalculationResult) d).getData();
         }
         WQKms referenceWQ = null; // used for gauge / unit observations
-        if (d instanceof WQKms[]){
-            data.addAll(Arrays.asList((WQKms [])d));
+        if (d instanceof WQKms[]) {
+            this.data.addAll(Arrays.asList((WQKms[]) d));
             // If there is a unit mix in this list
             // we are screwed anyway.
-            referenceWQ = ((WQKms[])d)[0];
-        }
-        else if (d instanceof WQKms) {
-            data.add((WQKms)d);
-            referenceWQ = (WQKms)d;
+            referenceWQ = ((WQKms[]) d)[0];
+        } else if (d instanceof WQKms) {
+            this.data.add((WQKms) d);
+            referenceWQ = (WQKms) d;
         } else {
-            log.warn("Can't add data for export. Unkown data type " +
-                d.getClass().getName());
+            log.warn("Can't add data for export. Unkown data type " + d.getClass().getName());
             return;
         }
         if (referenceWQ != null) {
-            D4EArtifact arti = (D4EArtifact)master;
-            River river = RiverUtils.getRiver(arti);
-            riverUnit = river.getWstUnit().getName();
-            RangeAccess rangeAccess = new RangeAccess(arti);
+            final D4EArtifact arti = (D4EArtifact) this.master;
+            final River river = RiverUtils.getRiver(arti);
+            this.riverUnit = river.getWstUnit().getName();
+            final RangeAccess rangeAccess = new RangeAccess(arti);
 
-            double[] kms = rangeAccess.getKmRange();
+            final double[] kms = rangeAccess.getKmRange();
 
-            Gauge gauge = river.determineGaugeAtStation(kms[0]);
+            final Gauge gauge = river.determineGaugeAtStation(kms[0]);
             if (gauge != null) {
-                wUnit = "cm";
-                gaugeName = gauge.getName();
-                gaugeDatum = gauge.getDatum().doubleValue();
+                this.wUnit = "cm";
+                this.gaugeName = gauge.getName();
+                this.gaugeDatum = gauge.getDatum().doubleValue();
 
                 // Now convert the data to cm because we are at gauge
-                List<WQKms> newData = new ArrayList<WQKms>();
-                for (WQKms d2: data) {
-                    newData.add(new WQKms(d2.getKms(),
-                            WQ.getFixedWQforExportAtGauge(
-                                (WQ)d2,
-                                gauge.getDatum()
-                            )));
+                final List<WQKms> newData = new ArrayList<>();
+                for (final WQKms d2 : this.data) {
+                    newData.add(new WQKms(d2.getKms(), WQ.getFixedWQforExportAtGauge(d2, gauge.getDatum())));
                 }
-                data = newData; // All hail the garbage collector
+                this.data = newData; // All hail the garbage collector
 
-                validSince = gauge.fetchMasterDischargeTable()
-                    .getTimeInterval().getStartTime();
+                this.validSince = gauge.fetchMasterDischargeTable().getTimeInterval().getStartTime();
             } else {
-                gaugeName = "";
-                validSince = null;
-                gaugeDatum = Double.NaN;
+                this.gaugeName = "";
+                this.validSince = null;
+                this.gaugeDatum = Double.NaN;
             }
         }
     }
 
-    protected void writeCSVData(CSVWriter writer) {
+    @Override
+    protected void writeCSVData(final CSVWriter writer) {
         log.info("ComputedDischargeCurveExporter.writeData");
 
         writeCSVHeader(writer);
 
-        NumberFormat wf  = getWFormatter();
-        NumberFormat qf  = getQFormatter();
+        final NumberFormat wf = getWFormatter();
+        final NumberFormat qf = getQFormatter();
 
         double[] res = new double[3];
 
-        for (WQKms wqkms: data) {
-            int size = wqkms.size();
+        for (final WQKms wqkms : this.data) {
+            final int size = wqkms.size();
 
             for (int i = 0; i < size; i++) {
                 res = wqkms.get(i, res);
 
-                writer.writeNext(new String[] {
-                    wf.format(res[0]),
-                    qf.format(res[1])
-                });
+                writer.writeNext(new String[] { wf.format(res[0]), qf.format(res[1]) });
             }
         }
     }
 
-
-    protected void writeCSVHeader(CSVWriter writer) {
+    protected void writeCSVHeader(final CSVWriter writer) {
         log.debug("ComputedDischargeCurveExporter.writeCSVHeader");
 
-        RangeAccess access = new RangeAccess((D4EArtifact)master);
-        double[] km = access.getLocations();
+        final RangeAccess access = new RangeAccess((D4EArtifact) this.master);
+        final double[] km = access.getLocations();
         // If we are not at gauge (cm) use the river unit
-        String realUnit = "cm".equals(wUnit) ? "cm" : riverUnit;
-        String header =
-            msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] {realUnit});
+        final String realUnit = "cm".equals(this.wUnit) ? "cm" : this.riverUnit;
+        final String header = msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER, new Object[] { realUnit });
 
-        writer.writeNext(new String[] {
-            header,
-            msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER)
-        });
+        writer.writeNext(new String[] { header, msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER) });
     }
 
-
     /**
      * Returns the number formatter for W values.
      *
      * @return the number formatter for W values.
      */
+    @Override
     protected NumberFormat getWFormatter() {
-        if ("cm".equals(wUnit)) {
-            return Formatter.getFormatter(context, 0, 0);
+        if ("cm".equals(this.wUnit)) {
+            return Formatter.getFormatter(this.context, 0, 0);
         }
-        return Formatter.getComputedDischargeW(context);
+        return Formatter.getComputedDischargeW(this.context);
     }
 
-
     /**
      * Returns the number formatter for Q values.
      *
      * @return the number formatter for Q values.
      */
+    @Override
     protected NumberFormat getQFormatter() {
-        return Formatter.getComputedDischargeQ(context);
+        return Formatter.getComputedDischargeQ(this.context);
     }
 
-
     @Override
-    protected void writePDF(OutputStream out) {
-        WKmsJRDataSource source = createJRData();
+    protected void writePDF(final OutputStream out) {
+        final WKmsJRDataSource source = createJRData();
 
-        String jasperFile = Resources.getMsg(
-                                context.getMeta(),
-                                JASPER_FILE,
-                                "/jasper/computed-discharge_en.jasper");
-        String confPath = Config.getConfigDirectory().toString();
+        final String jasperFile = Resources.getMsg(this.context.getMeta(), JASPER_FILE, "/jasper/computed-discharge_en.jasper");
+        final String confPath = Config.getConfigDirectory().toString();
 
-        Map parameters = new HashMap();
+        final Map parameters = new HashMap();
         parameters.put("ReportTitle", "Exported Data");
         try {
-            JasperPrint print = JasperFillManager.fillReport(
-                confPath + jasperFile,
-                parameters,
-                source);
+            final JasperPrint print = JasperFillManager.fillReport(confPath + jasperFile, parameters, source);
             JasperExportManager.exportReportToPdfStream(print, out);
         }
-        catch(JRException je) {
+        catch (final JRException je) {
             log.warn("Error generating PDF Report!");
             je.printStackTrace();
         }
     }
 
-
     protected WKmsJRDataSource createJRData() {
-        WKmsJRDataSource source = new WKmsJRDataSource();
+        final WKmsJRDataSource source = new WKmsJRDataSource();
 
         addMetaData(source);
         addWQData(source);
@@ -239,68 +204,54 @@
         return source;
     }
 
-
-    protected void addMetaData(WKmsJRDataSource source) {
-        CallMeta meta = context.getMeta();
+    protected void addMetaData(final WKmsJRDataSource source) {
+        final CallMeta meta = this.context.getMeta();
 
-        D4EArtifact flys = (D4EArtifact) master;
-        source.addMetaData("gauge", gaugeName);
-        if (!Double.isNaN(gaugeDatum)) {
-            NumberFormat mf = Formatter.getMeterFormat(context);
-            source.addMetaData(
-                "datum", mf.format(gaugeDatum) + " " + riverUnit);
+        final D4EArtifact flys = (D4EArtifact) this.master;
+        source.addMetaData("gauge", this.gaugeName);
+        if (!Double.isNaN(this.gaugeDatum)) {
+            final NumberFormat mf = Formatter.getMeterFormat(this.context);
+            source.addMetaData("datum", mf.format(this.gaugeDatum) + " " + this.riverUnit);
         } else {
             source.addMetaData("datum", "");
         }
 
-        source.addMetaData ("river", RiverUtils.getRivername(flys));
+        source.addMetaData("river", RiverUtils.getRivername(flys));
 
-        Locale locale = Resources.getLocale(meta);
-        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        final Locale locale = Resources.getLocale(meta);
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
 
         source.addMetaData("date", df.format(new Date()));
 
-        source.addMetaData("wUnit", "cm".equals(wUnit) ? "cm" : riverUnit);
+        source.addMetaData("wUnit", "cm".equals(this.wUnit) ? "cm" : this.riverUnit);
 
-        RangeAccess rangeAccess = new RangeAccess(flys);
-        double[] kms = rangeAccess.getKmRange();
-        source.addMetaData("range",
-                Formatter.getCalculationKm(context.getMeta()).format(kms[0]));
+        final RangeAccess rangeAccess = new RangeAccess(flys);
+        final double[] kms = rangeAccess.getKmRange();
+        source.addMetaData("range", Formatter.getCalculationKm(this.context.getMeta()).format(kms[0]));
 
-        if (!"cm".equals(wUnit)) {
+        if (!"cm".equals(this.wUnit)) {
             source.addMetaData("valid_since", "");
-            source.addMetaData("calculation", Resources.getMsg(
-                                                locale,
-                                                PDF_HEADER_CALC_MODE,
-                                                "Computed Discharge"));
+            source.addMetaData("calculation", Resources.getMsg(locale, PDF_HEADER_CALC_MODE, "Computed Discharge"));
         } else {
-            source.addMetaData(
-                "valid_since",
-                validSince == null ? "" : df.format(validSince));
-            source.addMetaData("calculation", Resources.getMsg(
-                                                locale,
-                                                PDF_HEADER_MODE,
-                                                "Discharge"));
+            source.addMetaData("valid_since", this.validSince == null ? "" : df.format(this.validSince));
+            source.addMetaData("calculation", Resources.getMsg(locale, PDF_HEADER_MODE, "Discharge"));
         }
     }
 
-    protected void addWQData(WKmsJRDataSource source) {
-        NumberFormat wf  = getWFormatter();
-        NumberFormat qf  = getQFormatter();
+    protected void addWQData(final WKmsJRDataSource source) {
+        final NumberFormat wf = getWFormatter();
+        final NumberFormat qf = getQFormatter();
 
         double[] res = new double[3];
 
-        for (WQKms wqkms: data) {
-            int size = wqkms.size();
+        for (final WQKms wqkms : this.data) {
+            final int size = wqkms.size();
 
             for (int i = 0; i < size; i++) {
                 res = wqkms.get(i, res);
 
-                source.addData(new String[] {
-                    "",   // Empty, the WKmsJRDtasource stores km here.
-                    wf.format(res[0]),
-                    qf.format(res[1])
-                });
+                source.addData(new String[] { "", // Empty, the WKmsJRDtasource stores km here.
+                        wf.format(res[0]), qf.format(res[1]) });
             }
         }
     }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -11,14 +11,18 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.log4j.Logger;
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
+import org.dive4elements.artifactdatabase.state.State;
+import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.GaugeDischargeCurveArtifact;
 import org.dive4elements.river.artifacts.access.RiverAccess;
 import org.dive4elements.river.artifacts.model.FacetTypes;
 import org.dive4elements.river.artifacts.model.WQKms;
 import org.dive4elements.river.exports.process.MiscDischargeProcessor;
+import org.dive4elements.river.jfree.Bounds;
 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation;
-import org.dive4elements.river.jfree.Bounds;
 import org.dive4elements.river.jfree.DoubleBounds;
 import org.dive4elements.river.jfree.RiverAnnotation;
 import org.dive4elements.river.jfree.StickyAxisAnnotation;
@@ -26,71 +30,51 @@
 import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.model.River;
 import org.dive4elements.river.themes.ThemeDocument;
-
-import org.dive4elements.artifactdatabase.state.State;
-import org.dive4elements.artifacts.CallContext;
-import org.dive4elements.river.artifacts.GaugeDischargeCurveArtifact;
-
-import org.apache.log4j.Logger;
 import org.jfree.chart.annotations.XYTextAnnotation;
 import org.jfree.chart.axis.ValueAxis;
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.data.Range;
 import org.jfree.data.xy.XYSeries;
 
-
 /**
  * An OutGenerator that generates discharge curves.
  *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
-public class DischargeCurveGenerator
-extends      XYChartGenerator
-implements   FacetTypes {
+public class DischargeCurveGenerator extends XYChartGenerator implements FacetTypes {
 
     /** Beware, in this implementation, the W axis is also in cm! */
     public static enum YAXIS {
-        WCm(0),
-        W(1);
+        WCm(0), W(1);
         protected int idx;
-        private YAXIS(int c) {
-            idx = c;
+
+        private YAXIS(final int c) {
+            this.idx = c;
         }
     }
 
     /** The log used in this generator. */
-    private static Logger log =
-        Logger.getLogger(DischargeCurveGenerator.class);
-
-    public static final String I18N_CHART_TITLE =
-        "chart.discharge.curve.title";
-
-    public static final String I18N_CHART_SUBTITLE =
-        "chart.discharge.curve.subtitle";
+    private static Logger log = Logger.getLogger(DischargeCurveGenerator.class);
 
-    public static final String I18N_XAXIS_LABEL =
-        "chart.discharge.curve.xaxis.label";
+    public static final String I18N_CHART_TITLE = "chart.discharge.curve.title";
 
-    public static final String I18N_YAXIS_LABEL =
-        "chart.discharge.curve.yaxis.label";
+    public static final String I18N_CHART_SUBTITLE = "chart.discharge.curve.subtitle";
 
-    public static final String I18N_CHART_TITLE_DEFAULT  = "Abflusskurven";
-    public static final String I18N_XAXIS_LABEL_DEFAULT  = "Q [m\u00b3/s]";
-    public static final String I18N_YAXIS_LABEL_DEFAULT  = "W [cm]";
+    public static final String I18N_XAXIS_LABEL = "common.export.csv.header.q";
 
+    public static final String I18N_YAXIS_LABEL = "chart.discharge.curve.yaxis.label";
+
+    public static final String I18N_CHART_TITLE_DEFAULT = "Abflusskurven";
+    public static final String I18N_XAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
+    public static final String I18N_YAXIS_LABEL_DEFAULT = "W [cm]";
 
     /**
      * Returns the PNP (Datum) of gauge, if at gauge, 0 otherwise.
      */
-    public static double getCurrentGaugeDatum(
-        double km,
-        D4EArtifact artifact,
-        double tolerance
-    ) {
+    public static double getCurrentGaugeDatum(final double km, final D4EArtifact artifact, final double tolerance) {
         // Look if there is a gauge at chosen km:
         // Get gauge which is defined for km
-        Gauge gauge = new RiverAccess(artifact).getRiver()
-            .determineGaugeAtStation(km);
+        final Gauge gauge = new RiverAccess(artifact).getRiver().determineGaugeAtStation(km);
         if (gauge == null) {
             log.error("No Gauge could be found at station " + km + "!");
             return 0d;
@@ -103,26 +87,22 @@
         return subtractPNP;
     }
 
-
     /** Get the current Gauge datum with default distance tolerance. */
     public double getCurrentGaugeDatum() {
-        return getCurrentGaugeDatum(getRange()[0],
-            (D4EArtifact) getMaster(), 1e-4);
+        return getCurrentGaugeDatum(getRange()[0], (D4EArtifact) getMaster(), 1e-4);
     }
 
-
     /** Overriden to show second axis also if no visible data present. */
     @Override
-    protected void adjustAxes(XYPlot plot) {
+    protected void adjustAxes(final XYPlot plot) {
         super.adjustAxes(plot);
         // XXX Hacking around that there were two axes shown in official Gauge
         // Discharge, the one from the WINFO module.
         // This should be made unecessary in a Q Diagram refactoring with
         // decent inheritance.
         if (getMaster() instanceof GaugeDischargeCurveArtifact) {
-            GaugeDischargeCurveArtifact myMaster =
-                (GaugeDischargeCurveArtifact) getMaster();
-            State state = myMaster.getCurrentState(getContext());
+            final GaugeDischargeCurveArtifact myMaster = (GaugeDischargeCurveArtifact) getMaster();
+            final State state = myMaster.getCurrentState(getContext());
             if (GaugeDischargeCurveArtifact.STATIC_STATE_NAME.equals(state.getID())) {
                 return;
             }
@@ -150,49 +130,38 @@
         // XXX Q-Symetry: I am assuming here that there can only
         // be a fixed Range for WinM as this is currently the only
         // thing that is configureable.
-        Range fixedWinMRange = getRangeForAxisFromSettings(
-                getYAxisWalker().getId(YAXIS.W.idx));
+        final Range fixedWinMRange = getRangeForAxisFromSettings(getYAxisWalker().getId(YAXIS.W.idx));
 
         // The combination of Range and Bounds is crazy..
         if (fixedWinMRange != null) {
-            boundsInMGauge = new DoubleBounds(fixedWinMRange.getLowerBound(),
-                    fixedWinMRange.getUpperBound());
+            boundsInMGauge = new DoubleBounds(fixedWinMRange.getLowerBound(), fixedWinMRange.getUpperBound());
         }
 
-        log.debug("Syncing Axis Bounds. Bounds W: "
-            + boundsInMGauge.toString()
-            + " Bounds Wcm: " + boundsInCM.toString());
+        log.debug("Syncing Axis Bounds. Bounds W: " + boundsInMGauge.toString() + " Bounds Wcm: " + boundsInCM.toString());
 
-        double datum = getCurrentGaugeDatum();
+        final double datum = getCurrentGaugeDatum();
 
         // Convert boundsInMGauge to Datum+cm
-        double convertedLower =
-            ((Double)boundsInMGauge.getLower() - datum) * 100;
-        double convertedUpper =
-            ((Double)boundsInMGauge.getUpper() - datum) * 100;
-        Bounds convertedBounds =
-            new DoubleBounds(convertedLower, convertedUpper);
+        final double convertedLower = ((Double) boundsInMGauge.getLower() - datum) * 100;
+        final double convertedUpper = ((Double) boundsInMGauge.getUpper() - datum) * 100;
+        final Bounds convertedBounds = new DoubleBounds(convertedLower, convertedUpper);
 
         // Now combine both Ranges
         boundsInCM = boundsInCM.combine(convertedBounds);
 
         // Recalculate absolute bounds
-        boundsInMGauge = new DoubleBounds(
-            (Double)boundsInCM.getLower() / 100d + datum,
-            (Double)boundsInCM.getUpper() / 100d + datum);
+        boundsInMGauge = new DoubleBounds((Double) boundsInCM.getLower() / 100d + datum, (Double) boundsInCM.getUpper() / 100d + datum);
 
         // Set the new combined bounds
         setYBounds(YAXIS.W.idx, boundsInMGauge);
         setYBounds(YAXIS.WCm.idx, boundsInCM);
-        log.debug("Synced Bounds W: " + boundsInMGauge.toString() +
-                " Bounds Wcm: " + boundsInCM.toString());
+        log.debug("Synced Bounds W: " + boundsInMGauge.toString() + " Bounds Wcm: " + boundsInCM.toString());
     }
 
     public DischargeCurveGenerator() {
         super();
     }
 
-
     @Override
     protected YAxisWalker getYAxisWalker() {
         return new YAxisWalker() {
@@ -202,14 +171,13 @@
             }
 
             @Override
-            public String getId(int idx) {
-                YAXIS[] yaxes = YAXIS.values();
+            public String getId(final int idx) {
+                final YAXIS[] yaxes = YAXIS.values();
                 return yaxes[idx].toString();
             }
         };
     }
 
-
     /**
      * Returns always null to suppress subtitles.
      */
@@ -218,27 +186,20 @@
         return null;
     }
 
-
     @Override
     protected String getDefaultXAxisLabel(final CallContext context) {
         return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
     }
 
     @Override
-    protected String getDefaultYAxisLabel(int pos) {
+    protected String getDefaultYAxisLabel(final int pos) {
         return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
     }
 
-
     /* TODO is this one really needed? */
     @Override
-    protected boolean zoomX(
-        XYPlot plot,
-        ValueAxis axis,
-        Bounds bounds,
-        Range x
-    ) {
-        boolean zoomin = super.zoom(plot, axis, bounds, x);
+    protected boolean zoomX(final XYPlot plot, final ValueAxis axis, final Bounds bounds, final Range x) {
+        final boolean zoomin = super.zoom(plot, axis, bounds, x);
 
         if (!zoomin) {
             axis.setLowerBound(0d);
@@ -248,104 +209,70 @@
     }
 
     /** Translate River annotations if a gauge. */
-    public void translateRiverAnnotation(RiverAnnotation riverAnnotation) {
+    public void translateRiverAnnotation(final RiverAnnotation riverAnnotation) {
         if (getCurrentGaugeDatum() == 0d) {
             return;
         }
         log.debug("Translate some river annotation.");
-        double translate = getCurrentGaugeDatum();
-        double factor    = 100d;
-        for (StickyAxisAnnotation annotation:
-                 riverAnnotation.getAxisTextAnnotations()
-        ){
+        final double translate = getCurrentGaugeDatum();
+        final double factor = 100d;
+        for (final StickyAxisAnnotation annotation : riverAnnotation.getAxisTextAnnotations()) {
             if (!annotation.atX()) {
-                annotation.setPos((annotation.getPos() - translate)*factor);
+                annotation.setPos((annotation.getPos() - translate) * factor);
             }
         }
-        for (
-            XYTextAnnotation annotation: riverAnnotation.getTextAnnotations()
-        ) {
-            annotation.setY((annotation.getY() - translate)*factor);
+        for (final XYTextAnnotation annotation : riverAnnotation.getTextAnnotations()) {
+            annotation.setY((annotation.getY() - translate) * factor);
         }
     }
 
-
     @Override
-    public void doOut(
-        ArtifactAndFacet artifactFacet,
-        ThemeDocument    theme,
-        boolean          visible
-    ) {
-        String name = artifactFacet.getFacetName();
+    public void doOut(final ArtifactAndFacet artifactFacet, final ThemeDocument theme, final boolean visible) {
+        final String name = artifactFacet.getFacetName();
         log.debug("DischargeCurveGenerator.doOut: " + name);
 
         final CallContext context = getContext();
-        
-        MiscDischargeProcessor dProcessor = new MiscDischargeProcessor(
-            getRange()[0]);
+
+        final MiscDischargeProcessor dProcessor = new MiscDischargeProcessor(getRange()[0]);
         if (dProcessor.canHandle(name)) {
             // In Base DischargeCurveGenerator, always at gauge, use WCm axis.
-            dProcessor.doOut(
-                this, artifactFacet, theme, visible, YAXIS.WCm.idx);
-        }
-        else if (name.equals(DISCHARGE_CURVE)
-                || name.equals(GAUGE_DISCHARGE_CURVE)) {
-            doDischargeOut(
-                (D4EArtifact)artifactFacet.getArtifact(),
-                artifactFacet.getData(context),
-                artifactFacet.getFacetDescription(),
-                theme,
-                visible);
-        }
-        else if (FacetTypes.IS.MANUALPOINTS(name)) {
-            doPoints(artifactFacet.getData(context),
-                artifactFacet,
-                theme, visible, YAXIS.W.idx);
-        }
-        else if (STATIC_WQ.equals(name)) {
-            doWQOut(artifactFacet.getData(context),
-                artifactFacet,
-                theme,
-                visible);
-        }
-        else {
-           log.warn("DischargeCurveGenerator.doOut: Unknown facet name: "
-               + name);
-           return;
+            dProcessor.doOut(this, artifactFacet, theme, visible, YAXIS.WCm.idx);
+        } else if (name.equals(DISCHARGE_CURVE) || name.equals(GAUGE_DISCHARGE_CURVE)) {
+            doDischargeOut((D4EArtifact) artifactFacet.getArtifact(), artifactFacet.getData(context), artifactFacet.getFacetDescription(), theme, visible);
+        } else if (FacetTypes.IS.MANUALPOINTS(name)) {
+            doPoints(artifactFacet.getData(context), artifactFacet, theme, visible, YAXIS.W.idx);
+        } else if (STATIC_WQ.equals(name)) {
+            doWQOut(artifactFacet.getData(context), artifactFacet, theme, visible);
+        } else {
+            log.warn("DischargeCurveGenerator.doOut: Unknown facet name: " + name);
+            return;
         }
     }
 
-
     /**
      * Add series with discharge curve to diagram.
      */
-    protected void doDischargeOut(
-        D4EArtifact artifact,
-        Object        o,
-        String        description,
-        ThemeDocument theme,
-        boolean       visible)
-    {
+    protected void doDischargeOut(final D4EArtifact artifact, final Object o, final String description, final ThemeDocument theme, final boolean visible) {
         log.debug("DischargeCurveGenerator.doDischargeOut");
-        WQKms wqkms = (WQKms) o;
+        final WQKms wqkms = (WQKms) o;
 
-        String gaugeName = wqkms.getName();
+        final String gaugeName = wqkms.getName();
 
-        River river = new RiverAccess(artifact).getRiver();
+        final River river = new RiverAccess(artifact).getRiver();
 
         if (river == null) {
             log.debug("no river found");
             return;
         }
 
-        Gauge gauge = river.determineGaugeByName(gaugeName);
+        final Gauge gauge = river.determineGaugeByName(gaugeName);
 
         if (gauge == null) {
             log.debug("no gauge found");
             return;
         }
 
-        XYSeries series = new StyledXYSeries(description, theme);
+        final XYSeries series = new StyledXYSeries(description, theme);
 
         StyledSeriesBuilder.addPointsQW(series, wqkms);
 
@@ -354,56 +281,43 @@
 
     /**
      * Add W/Q-Series to plot.
-     * @param wqkms actual data
-     * @param theme theme to use.
+     * 
+     * @param wqkms
+     *            actual data
+     * @param theme
+     *            theme to use.
      */
-    protected void doQOut(
-        Object           wqkms,
-        ArtifactAndFacet aaf,
-        ThemeDocument    theme,
-        boolean          visible
-    ) {
+    protected void doQOut(final Object wqkms, final ArtifactAndFacet aaf, final ThemeDocument theme, final boolean visible) {
         log.debug("DischargeCurveGenerator: doQOut (add W/Q data).");
-        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
 
         StyledSeriesBuilder.addPointsQW(series, (WQKms) wqkms);
 
         addAxisSeries(series, YAXIS.W.idx, visible);
     }
 
-
     /** Add a point annotation at given x and y coordinates. */
-    protected void addPointTextAnnotation(
-        String title,
-        double x,
-        double y,
-        ThemeDocument theme
-    ) {
+    protected void addPointTextAnnotation(final String title, final double x, final double y, final ThemeDocument theme) {
         final List<XYTextAnnotation> textAnnos = new ArrayList<>();
-        XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(
-                title,
-                x,
-                y);
+        final XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(title, x, y);
         textAnnos.add(anno);
-        RiverAnnotation flysAnno = new RiverAnnotation(
-            null, null, null, theme);
+        final RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme);
         flysAnno.setTextAnnotations(textAnnos);
         addAnnotations(flysAnno);
     }
 
-
     /**
      * Return true if all values in data[0] are smaller than zero
      * (in imported data they are set to -1 symbolically).
      * Return false if data is null or empty
      */
-    private static boolean hasNoDischarge(double[][] data) {
+    private static boolean hasNoDischarge(final double[][] data) {
         if (data == null || data.length == 0) {
             return false;
         }
 
-        double[] qs = data[0];
-        for (double q: qs) {
+        final double[] qs = data[0];
+        for (final double q : qs) {
             if (q > 0d) {
                 return false;
             }
@@ -412,67 +326,56 @@
         return true;
     }
 
-
     /**
      * Add WQ Data to plot.
-     * @param wq data as double[][]
+     * 
+     * @param wq
+     *            data as double[][]
      */
-    protected void doWQOut(
-        Object           wq,
-        ArtifactAndFacet aaf,
-        ThemeDocument    theme,
-        boolean          visible
-    ) {
+    protected void doWQOut(final Object wq, final ArtifactAndFacet aaf, final ThemeDocument theme, final boolean visible) {
         log.debug("DischargeCurveGenerator: doWQOut");
-        double [][] data = (double [][]) wq;
-        String title = aaf.getFacetDescription();
+        final double[][] data = (double[][]) wq;
+        final String title = aaf.getFacetDescription();
 
-        double translate = getCurrentGaugeDatum();
+        final double translate = getCurrentGaugeDatum();
 
         // If no Q values (i.e. all -1) found, add annotations.
         if (hasNoDischarge(data)) {
             final List<StickyAxisAnnotation> xy = new ArrayList<>();
 
-            for (double y: data[1]) {
+            for (double y : data[1]) {
                 if (translate != 0d) {
-                    y = (y-translate)*100d;
+                    y = (y - translate) * 100d;
                 }
 
-                xy.add(new StickyAxisAnnotation(
-                    title,
-                    (float) y,
-                    StickyAxisAnnotation.SimpleAxis.Y_AXIS));
+                xy.add(new StickyAxisAnnotation(title, (float) y, StickyAxisAnnotation.SimpleAxis.Y_AXIS));
             }
 
-            doAnnotations(
-                new RiverAnnotation(title, xy),
-                aaf, theme, visible);
+            doAnnotations(new RiverAnnotation(title, xy), aaf, theme, visible);
             return;
         }
 
         // Otherwise add points.
-        XYSeries series = new StyledXYSeries(title, theme);
+        final XYSeries series = new StyledXYSeries(title, theme);
 
         if (translate != 0d) {
             StyledSeriesBuilder.addPointsQW(series, data, -translate, 100d);
             addAxisSeries(series, YAXIS.W.idx, visible);
-        }
-        else {
+        } else {
             StyledSeriesBuilder.addPoints(series, data, true);
             addAxisSeries(series, YAXIS.W.idx, visible);
         }
 
-        if (visible && theme.parseShowPointLabel()
-            && data != null && data.length != 0) {
+        if (visible && theme.parseShowPointLabel() && data != null && data.length != 0) {
 
-            double[] xs = data[0];
-            double[] ys = data[1];
+            final double[] xs = data[0];
+            final double[] ys = data[1];
             for (int i = 0; i < xs.length; i++) {
-                double x = xs[i];
+                final double x = xs[i];
                 double y = ys[i];
 
                 if (translate != 0d) {
-                    y = (y-translate)*100d;
+                    y = (y - translate) * 100d;
                 }
 
                 addPointTextAnnotation(title, x, y, theme);
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DischargeLongitudinalSectionExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DischargeLongitudinalSectionExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -8,132 +8,101 @@
 
 package org.dive4elements.river.exports;
 
-import au.com.bytecode.opencsv.CSVWriter;
+import java.text.NumberFormat;
 
+import org.apache.log4j.Logger;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.model.WQCKms;
 import org.dive4elements.river.artifacts.model.WQKms;
 
-import java.text.NumberFormat;
-
-import org.apache.log4j.Logger;
+import au.com.bytecode.opencsv.CSVWriter;
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class DischargeLongitudinalSectionExporter extends WaterlevelExporter {
 
-    /** The log used in this exporter.*/
-    private static Logger log =
-        Logger.getLogger(DischargeLongitudinalSectionExporter.class);
-
-
-    public static final String CSV_KM_HEADER =
-        "export.discharge.longitudinal.section.csv.header.km";
+    /** The log used in this exporter. */
+    private static Logger log = Logger.getLogger(DischargeLongitudinalSectionExporter.class);
 
-    public static final String CSV_W_HEADER =
-        "export.discharge.longitudinal.section.csv.header.w";
+    public static final String CSV_KM_HEADER = "export.discharge.longitudinal.section.csv.header.km";
 
-    public static final String CSV_CW_HEADER =
-        "export.discharge.longitudinal.section.csv.header.cw";
+    public static final String CSV_W_HEADER = "export.discharge.longitudinal.section.csv.header.w";
 
-    public static final String CSV_Q_HEADER =
-        "export.discharge.longitudinal.section.csv.header.q";
+    public static final String CSV_CW_HEADER = "export.discharge.longitudinal.section.csv.header.cw";
+
+    public static final String CSV_Q_HEADER = "common.export.csv.header.q";
 
     public static final String DEFAULT_CSV_KM_HEADER = "Fluss-Km";
-    public static final String DEFAULT_CSV_W_HEADER  = "W [NN + m]";
+    public static final String DEFAULT_CSV_W_HEADER = "W [NN + m]";
     public static final String DEFAULT_CSV_CW_HEADER = "W korr.";
-    public static final String DEFAULT_CSV_Q_HEADER  = "Q [m\u00b3/s]";
-
+    public static final String DEFAULT_CSV_Q_HEADER = "Q [m\u00b3/s]";
 
     @Override
     protected void addData(Object d) {
         if (d instanceof CalculationResult) {
-            d = ((CalculationResult)d).getData();
-            if (d instanceof WQKms []) {
-                data.add((WQKms [])d);
+            d = ((CalculationResult) d).getData();
+            if (d instanceof WQKms[]) {
+                this.data.add((WQKms[]) d);
             }
         }
     }
 
-
     @Override
-    protected void writeCSVHeader(
-        CSVWriter writer,
-        boolean   atGauge,
-        boolean   isQ
-    ) {
+    protected void writeCSVHeader(final CSVWriter writer, final boolean atGauge, final boolean isQ) {
         log.info("WaterlevelExporter.writeCSVHeader");
 
-        writer.writeNext(new String[] {
-            msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER),
-            msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER),
-            msg(CSV_CW_HEADER, DEFAULT_CSV_CW_HEADER),
-            msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER),
-            msg(CSV_Q_DESC_HEADER, DEFAULT_CSV_Q_DESC_HEADER)
-        });
+        writer.writeNext(new String[] { msg(CSV_KM_HEADER, DEFAULT_CSV_KM_HEADER), msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER),
+                msg(CSV_CW_HEADER, DEFAULT_CSV_CW_HEADER), msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER), msg(CSV_Q_DESC_HEADER, DEFAULT_CSV_Q_DESC_HEADER) });
     }
 
-
-    protected void wQKms2CSV(
-        CSVWriter writer,
-        WQKms     wqkms,
-        boolean   atGauge,
-        boolean   isQ
-    ) {
+    @Override
+    protected void wQKms2CSV(final CSVWriter writer, final WQKms wqkms, final boolean atGauge, final boolean isQ) {
         log.debug("WaterlevelExporter.wQKms2CSV");
 
-        int      size   = wqkms.size();
+        final int size = wqkms.size();
         double[] result = new double[4];
 
-        NumberFormat kmf = getKmFormatter();
-        NumberFormat wf  = getWFormatter();
-        NumberFormat qf  = getQFormatter();
+        final NumberFormat kmf = getKmFormatter();
+        final NumberFormat wf = getWFormatter();
+        final NumberFormat qf = getQFormatter();
 
-        for (int i = 0; i < size; i ++) {
+        for (int i = 0; i < size; i++) {
             result = wqkms.get(i, result);
 
-            String name = wqkms.getName();
+            final String name = wqkms.getName();
             String wc = "";
             if (wqkms instanceof WQCKms) {
                 wc = wf.format(result[3]);
             }
 
-            writer.writeNext(new String[] {
-                kmf.format(result[2]),
-                wf.format(result[0]),
-                wc,
-                qf.format(result[1]),
-                name
-            });
+            writer.writeNext(new String[] { kmf.format(result[2]), wf.format(result[0]), wc, qf.format(result[1]), name });
         }
     }
 
-
     @Override
-    protected void addWSTColumn(WstWriter writer, WQKms wqkms) {
-        String name = wqkms.getName();
+    protected void addWSTColumn(final WstWriter writer, final WQKms wqkms) {
+        final String name = wqkms.getName();
 
         // is it a W or a Q mode?
-        int wIdx = name.indexOf("W");
-        int qIdx = name.indexOf("Q");
+        final int wIdx = name.indexOf("W");
+        final int qIdx = name.indexOf("Q");
 
         String wq = null;
         if (wIdx >= 0) {
             wq = "W";
-        }
-        else if (qIdx >= 0) {
+        } else if (qIdx >= 0) {
             wq = "Q";
         }
 
         // we just want to display the first W or Q value in the WST
-        int start = name.indexOf("(");
-        int end   = name.indexOf(")");
+        final int start = name.indexOf("(");
+        final int end = name.indexOf(")");
 
-        String   tmp    = name.substring(start+1, end);
-        String[] values = tmp.split(";");
+        final String tmp = name.substring(start + 1, end);
+        final String[] values = tmp.split(";");
 
-        String column = wq + "=" + values[0];
+        final String column = wq + "=" + values[0];
 
         writer.addColumn(column);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -9,39 +9,33 @@
 package org.dive4elements.river.exports;
 
 import java.io.OutputStream;
+import java.text.DateFormat;
 import java.text.NumberFormat;
 import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.Date;
 import java.util.HashMap;
-import java.util.Date;
-import java.text.DateFormat;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.common.utils.Config;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.access.RangeAccess;
+import org.dive4elements.river.artifacts.access.RiverAccess;
+import org.dive4elements.river.artifacts.model.CalculationResult;
+import org.dive4elements.river.artifacts.model.WKmsJRDataSource;
+import org.dive4elements.river.artifacts.model.WQDay;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.utils.Formatter;
+import org.dive4elements.river.utils.RiverUtils;
 
 import au.com.bytecode.opencsv.CSVWriter;
-
+import net.sf.jasperreports.engine.JRException;
 import net.sf.jasperreports.engine.JasperExportManager;
 import net.sf.jasperreports.engine.JasperFillManager;
 import net.sf.jasperreports.engine.JasperPrint;
-import net.sf.jasperreports.engine.JRException;
-
-import org.dive4elements.artifacts.CallMeta;
-import org.dive4elements.artifacts.common.utils.Config;
-
-import org.dive4elements.river.artifacts.D4EArtifact;
-
-import org.dive4elements.river.artifacts.access.RiverAccess;
-import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.model.WQDay;
-import org.dive4elements.river.artifacts.model.CalculationResult;
-import org.dive4elements.river.artifacts.model.WKmsJRDataSource;
-import org.dive4elements.river.artifacts.resources.Resources;
-
-import org.dive4elements.river.utils.RiverUtils;
-import org.dive4elements.river.utils.Formatter;
-
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
@@ -51,15 +45,11 @@
     /** The log used in this exporter. */
     private static Logger log = Logger.getLogger(DurationCurveExporter.class);
 
-
-    public static final String CSV_DURATION_HEADER =
-        "export.duration.curve.csv.header.duration";
+    public static final String CSV_DURATION_HEADER = "export.duration.curve.csv.header.duration";
 
-    public static final String CSV_W_HEADER =
-        "export.duration.curve.csv.header.w";
+    public static final String CSV_W_HEADER = "export.duration.curve.csv.header.w";
 
-    public static final String CSV_Q_HEADER =
-        "export.duration.curve.csv.header.q";
+    public static final String CSV_Q_HEADER = "common.export.csv.header.q";
 
     public static final String PDF_HEADER_MODE = "export.duration.pdf.mode";
     public static final String JASPER_FILE = "export.duration.pdf.file";
@@ -68,75 +58,58 @@
     protected List<WQDay> data;
 
     public DurationCurveExporter() {
-        data = new ArrayList<WQDay>();
+        this.data = new ArrayList<>();
     }
 
     @Override
     protected void addData(Object d) {
         if (d instanceof CalculationResult) {
-            d = ((CalculationResult)d).getData();
+            d = ((CalculationResult) d).getData();
             if (d instanceof WQDay) {
-                data.add((WQDay)d);
+                this.data.add((WQDay) d);
             }
         }
     }
 
-
-    protected void writeCSVData(CSVWriter writer) {
+    @Override
+    protected void writeCSVData(final CSVWriter writer) {
         log.info("DurationCurveExporter.writeData");
 
         writeCSVHeader(writer);
 
-        for (WQDay wqday: data) {
+        for (final WQDay wqday : this.data) {
             wQDay2CSV(writer, wqday);
         }
     }
 
-
-    protected void writeCSVHeader(CSVWriter writer) {
+    protected void writeCSVHeader(final CSVWriter writer) {
         log.info("DurationCurveExporter.writeCSVHeader");
 
-        String unit = new RiverAccess((D4EArtifact)master)
-            .getRiver().getWstUnit().getName();
+        final String unit = new RiverAccess((D4EArtifact) this.master).getRiver().getWstUnit().getName();
 
-        writer.writeNext(new String[] {
-            msg(CSV_W_HEADER, new Object[] { unit }),
-            msg(CSV_Q_HEADER),
-            msg(CSV_DURATION_HEADER)
-        });
+        writer.writeNext(new String[] { msg(CSV_W_HEADER, new Object[] { unit }), msg(CSV_Q_HEADER), msg(CSV_DURATION_HEADER) });
     }
 
-
-    protected void wQDay2CSV(CSVWriter writer, WQDay wqday) {
+    protected void wQDay2CSV(final CSVWriter writer, final WQDay wqday) {
         log.debug("DurationCurveExporter.wQDay2CSV");
 
-        int size = wqday.size();
+        final int size = wqday.size();
 
-        NumberFormat wf  = getWFormatter();
-        NumberFormat qf  = getQFormatter();
-        NumberFormat df  = getDFormatter();
+        final NumberFormat wf = getWFormatter();
+        final NumberFormat qf = getQFormatter();
+        final NumberFormat df = getDFormatter();
 
         if (wqday.isIncreasing()) {
-            for (int i = size-1; i >= 0; i --) {
-                writer.writeNext(new String[] {
-                    wf.format(wqday.getW(i)),
-                    qf.format(wqday.getQ(i)),
-                    df.format(wqday.getDay(i))
-                });
+            for (int i = size - 1; i >= 0; i--) {
+                writer.writeNext(new String[] { wf.format(wqday.getW(i)), qf.format(wqday.getQ(i)), df.format(wqday.getDay(i)) });
             }
-        }
-        else {
-            for (int i = 0; i < size; i ++) {
-                writer.writeNext(new String[] {
-                    wf.format(wqday.getW(i)),
-                    qf.format(wqday.getQ(i)),
-                    df.format(wqday.getDay(i))
-                });
+        } else {
+            for (int i = 0; i < size; i++) {
+                writer.writeNext(new String[] { wf.format(wqday.getW(i)), qf.format(wqday.getQ(i)), df.format(wqday.getDay(i)) });
             }
         }
     }
 
-
     /**
      * Returns the number formatter for W values.
      *
@@ -144,10 +117,9 @@
      */
     @Override
     protected NumberFormat getWFormatter() {
-        return Formatter.getDurationW(context);
+        return Formatter.getDurationW(this.context);
     }
 
-
     /**
      * Returns the number formatter for Q values.
      *
@@ -155,106 +127,81 @@
      */
     @Override
     protected NumberFormat getQFormatter() {
-        return Formatter.getDurationQ(context);
+        return Formatter.getDurationQ(this.context);
     }
 
-
     /**
      * Returns the number formatter for duration values.
      *
      * @return the number formatter for duration values.
      */
     protected NumberFormat getDFormatter() {
-        return Formatter.getDurationD(context);
+        return Formatter.getDurationD(this.context);
     }
 
-
     @Override
-    protected void writePDF(OutputStream out) {
-        WKmsJRDataSource source = createJRData();
+    protected void writePDF(final OutputStream out) {
+        final WKmsJRDataSource source = createJRData();
 
-        String jasperFile = Resources.getMsg(
-                                context.getMeta(),
-                                JASPER_FILE,
-                                "/jasper/duration_en.jasper");
-        String confPath = Config.getConfigDirectory().toString();
+        final String jasperFile = Resources.getMsg(this.context.getMeta(), JASPER_FILE, "/jasper/duration_en.jasper");
+        final String confPath = Config.getConfigDirectory().toString();
 
-        Map parameters = new HashMap();
+        final Map parameters = new HashMap();
         parameters.put("ReportTitle", "Exported Data");
         try {
-            JasperPrint print = JasperFillManager.fillReport(
-                confPath + jasperFile,
-                parameters,
-                source);
+            final JasperPrint print = JasperFillManager.fillReport(confPath + jasperFile, parameters, source);
             JasperExportManager.exportReportToPdfStream(print, out);
         }
-        catch(JRException je) {
+        catch (final JRException je) {
             log.warn("Error generating PDF Report!");
             je.printStackTrace();
         }
     }
 
     protected WKmsJRDataSource createJRData() {
-        WKmsJRDataSource source = new WKmsJRDataSource();
+        final WKmsJRDataSource source = new WKmsJRDataSource();
 
         addMetaData(source);
-        for (WQDay wqday: data) {
+        for (final WQDay wqday : this.data) {
             addWQDayData(source, wqday);
         }
 
         return source;
     }
 
-
-    protected void addMetaData(WKmsJRDataSource source) {
-        CallMeta meta = context.getMeta();
+    protected void addMetaData(final WKmsJRDataSource source) {
+        final CallMeta meta = this.context.getMeta();
 
-        D4EArtifact flys = (D4EArtifact) master;
+        final D4EArtifact flys = (D4EArtifact) this.master;
 
-        source.addMetaData ("river", RiverUtils.getRivername(flys));
+        source.addMetaData("river", RiverUtils.getRivername(flys));
 
-        Locale locale = Resources.getLocale(meta);
-        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        final Locale locale = Resources.getLocale(meta);
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
 
         source.addMetaData("date", df.format(new Date()));
 
-        RangeAccess rangeAccess = new RangeAccess(flys);
-        double[] kms = rangeAccess.getKmRange();
+        final RangeAccess rangeAccess = new RangeAccess(flys);
+        final double[] kms = rangeAccess.getKmRange();
         source.addMetaData("range", String.valueOf(kms[0]));
 
-        source.addMetaData("calculation", Resources.getMsg(
-                                            locale,
-                                            PDF_HEADER_MODE,
-                                            "Duration"));
+        source.addMetaData("calculation", Resources.getMsg(locale, PDF_HEADER_MODE, "Duration"));
     }
 
-    protected void addWQDayData(WKmsJRDataSource source, WQDay wqday) {
-        int size = wqday.size();
+    protected void addWQDayData(final WKmsJRDataSource source, final WQDay wqday) {
+        final int size = wqday.size();
 
-        NumberFormat wf  = getWFormatter();
-        NumberFormat qf  = getQFormatter();
-        NumberFormat df  = getDFormatter();
+        final NumberFormat wf = getWFormatter();
+        final NumberFormat qf = getQFormatter();
+        final NumberFormat df = getDFormatter();
 
         if (wqday.isIncreasing()) {
-            for (int i = size-1; i >= 0; i --) {
-                source.addData(new String[] {
-                    "",
-                    wf.format(wqday.getW(i)),
-                    qf.format(wqday.getQ(i)),
-                    "", "", "",
-                    df.format(wqday.getDay(i))
-                });
+            for (int i = size - 1; i >= 0; i--) {
+                source.addData(new String[] { "", wf.format(wqday.getW(i)), qf.format(wqday.getQ(i)), "", "", "", df.format(wqday.getDay(i)) });
             }
-        }
-        else {
-            for (int i = 0; i < size; i ++) {
-                source.addData(new String[] {
-                    "",
-                    wf.format(wqday.getW(i)),
-                    qf.format(wqday.getQ(i)),
-                    "", "", "",
-                    df.format(wqday.getDay(i))
-                });
+        } else {
+            for (int i = 0; i < size; i++) {
+                source.addData(new String[] { "", wf.format(wqday.getW(i)), qf.format(wqday.getQ(i)), "", "", "", df.format(wqday.getDay(i)) });
             }
         }
     }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveGenerator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveGenerator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -8,6 +8,10 @@
 
 package org.dive4elements.river.exports;
 
+import java.awt.Font;
+import java.awt.geom.Point2D;
+
+import org.apache.log4j.Logger;
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.model.FacetTypes;
@@ -16,77 +20,59 @@
 import org.dive4elements.river.jfree.RiverAnnotation;
 import org.dive4elements.river.jfree.StyledXYSeries;
 import org.dive4elements.river.themes.ThemeDocument;
-
-import java.awt.Font;
-import java.awt.geom.Point2D;
-
-import org.apache.log4j.Logger;
 import org.jfree.chart.axis.NumberAxis;
 import org.jfree.chart.axis.ValueAxis;
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.data.Range;
 import org.jfree.data.xy.XYSeries;
 
-
 /**
  * An OutGenerator that generates duration curves.
  *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
-public class DurationCurveGenerator
-extends      XYChartGenerator
-implements   FacetTypes
-{
+public class DurationCurveGenerator extends XYChartGenerator implements FacetTypes {
     public static enum YAXIS {
-        W(0),
-        Q(1);
+        W(0), Q(1);
         public int idx;
-        private YAXIS(int c) {
-           idx = c;
+
+        private YAXIS(final int c) {
+            this.idx = c;
         }
     }
 
     /** Local log. */
-    private static Logger log =
-        Logger.getLogger(DurationCurveGenerator.class);
-
-    public static final String I18N_CHART_TITLE =
-        "chart.duration.curve.title";
-
-    public static final String I18N_CHART_SUBTITLE =
-        "chart.duration.curve.subtitle";
-
-    public static final String I18N_XAXIS_LABEL =
-        "chart.duration.curve.xaxis.label";
+    private static Logger log = Logger.getLogger(DurationCurveGenerator.class);
 
-    public static final String I18N_YAXIS_LABEL_W =
-        "chart.duration.curve.yaxis.label.w";
-
-    public static final String I18N_YAXIS_LABEL_Q =
-        "chart.duration.curve.yaxis.label.q";
+    public static final String I18N_CHART_TITLE = "chart.duration.curve.title";
 
-    public static final String I18N_CHART_TITLE_DEFAULT  =
-        "Dauerlinie";
+    public static final String I18N_CHART_SUBTITLE = "chart.duration.curve.subtitle";
 
-    public static final String I18N_XAXIS_LABEL_DEFAULT  =
-        "Unterschreitungsdauer [Tage]";
+    public static final String I18N_XAXIS_LABEL = "chart.duration.curve.xaxis.label";
 
+    public static final String I18N_YAXIS_LABEL_W = "chart.duration.curve.yaxis.label.w";
+
+    public static final String I18N_YAXIS_LABEL_Q = "common.export.csv.header.q";
+
+    public static final String I18N_CHART_TITLE_DEFAULT = "Dauerlinie";
+
+    public static final String I18N_XAXIS_LABEL_DEFAULT = "Unterschreitungsdauer [Tage]";
 
     public DurationCurveGenerator() {
         super();
     }
 
-
     /**
      * Create Axis for given index.
+     * 
      * @return axis with according internationalized label.
      */
     @Override
-    protected NumberAxis createYAxis(int index) {
-        Font labelFont = new Font("Tahoma", Font.BOLD, 14);
-        String label   = getYAxisLabel(index);
+    protected NumberAxis createYAxis(final int index) {
+        final Font labelFont = new Font("Tahoma", Font.BOLD, 14);
+        final String label = getYAxisLabel(index);
 
-        NumberAxis axis = createNumberAxis(index, label);
+        final NumberAxis axis = createNumberAxis(index, label);
         if (index == YAXIS.W.idx) {
             axis.setAutoRangeIncludesZero(false);
         }
@@ -94,54 +80,40 @@
         return axis;
     }
 
-
     @Override
     protected String getDefaultChartTitle(final CallContext context) {
         return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
     }
 
-
     @Override
     protected String getDefaultChartSubtitle(final CallContext context) {
-        double[] dist  = getRange();
+        final double[] dist = getRange();
 
-        Object[] args = new Object[] {
-            getRiverName(),
-            dist[0]
-        };
+        final Object[] args = new Object[] { getRiverName(), dist[0] };
 
         return msg(I18N_CHART_SUBTITLE, "", args);
     }
 
-
     @Override
     protected String getDefaultXAxisLabel(final CallContext context) {
         return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
     }
 
-
     @Override
-    protected String getDefaultYAxisLabel(int index) {
+    protected String getDefaultYAxisLabel(final int index) {
         String label = "default";
         if (index == YAXIS.W.idx) {
             label = msg(I18N_YAXIS_LABEL_W, I18N_YAXIS_LABEL_W, new Object[] { getRiverUnit() });
-        }
-        else if (index == YAXIS.Q.idx) {
+        } else if (index == YAXIS.Q.idx) {
             label = msg(I18N_YAXIS_LABEL_Q);
         }
 
         return label;
     }
 
-
     @Override
-    protected boolean zoomX(
-        XYPlot plot,
-        ValueAxis axis,
-        Bounds bounds,
-        Range x
-    ) {
-        boolean zoomin = super.zoom(plot, axis, bounds, x);
+    protected boolean zoomX(final XYPlot plot, final ValueAxis axis, final Bounds bounds, final Range x) {
+        final boolean zoomin = super.zoom(plot, axis, bounds, x);
 
         if (!zoomin) {
             axis.setLowerBound(0d);
@@ -152,23 +124,17 @@
         return zoomin;
     }
 
-
     /**
      * This method overrides the method in the parent class to set the lower
      * bounds of the Q axis to 0. This axis should never display negative
      * values on its own.
      */
     @Override
-    protected boolean zoomY(
-        XYPlot plot,
-        ValueAxis axis,
-        Bounds bounds,
-        Range x
-    ) {
-        boolean zoomin = super.zoom(plot, axis, bounds, x);
+    protected boolean zoomY(final XYPlot plot, final ValueAxis axis, final Bounds bounds, final Range x) {
+        final boolean zoomin = super.zoom(plot, axis, bounds, x);
 
         if (!zoomin && axis instanceof IdentifiableNumberAxis) {
-            String id = ((IdentifiableNumberAxis) axis).getId();
+            final String id = ((IdentifiableNumberAxis) axis).getId();
 
             if (YAXIS.Q.toString().equals(id)) {
                 axis.setLowerBound(0d);
@@ -178,14 +144,9 @@
         return zoomin;
     }
 
-
     @Override
-    public void doOut(
-        ArtifactAndFacet artifactFacet,
-        ThemeDocument    attr,
-        boolean          visible
-    ) {
-        String name = artifactFacet.getFacetName();
+    public void doOut(final ArtifactAndFacet artifactFacet, final ThemeDocument attr, final boolean visible) {
+        final String name = artifactFacet.getFacetName();
 
         log.debug("DurationCurveGenerator.doOut: " + name);
 
@@ -193,69 +154,41 @@
             log.error("No facet given. Cannot create dataset.");
             return;
         }
-        
+
         final CallContext context = getContext();
 
         if (name.equals(DURATION_W)) {
-            doWOut(
-                (WQDay) artifactFacet.getData(context),
-                artifactFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(DURATION_Q)) {
-            doQOut(
-                (WQDay) artifactFacet.getData(context),
-                artifactFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(MAINVALUES_Q) || name.equals(MAINVALUES_W)) {
-            doAnnotations(
-                (RiverAnnotation) artifactFacet.getData(context),
-                artifactFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(RELATIVE_POINT)) {
-            doPointOut((Point2D) artifactFacet.getData(context),
-                artifactFacet,
-                attr,
-                visible);
-        }
-        else if (FacetTypes.IS.MANUALPOINTS(name)) {
-            doPoints(
-                artifactFacet.getData(context),
-                artifactFacet,
-                attr, visible, YAXIS.W.idx);
-        }
-        else {
+            doWOut((WQDay) artifactFacet.getData(context), artifactFacet, attr, visible);
+        } else if (name.equals(DURATION_Q)) {
+            doQOut((WQDay) artifactFacet.getData(context), artifactFacet, attr, visible);
+        } else if (name.equals(MAINVALUES_Q) || name.equals(MAINVALUES_W)) {
+            doAnnotations((RiverAnnotation) artifactFacet.getData(context), artifactFacet, attr, visible);
+        } else if (name.equals(RELATIVE_POINT)) {
+            doPointOut((Point2D) artifactFacet.getData(context), artifactFacet, attr, visible);
+        } else if (FacetTypes.IS.MANUALPOINTS(name)) {
+            doPoints(artifactFacet.getData(context), artifactFacet, attr, visible, YAXIS.W.idx);
+        } else {
             log.warn("Unknown facet name: " + name);
             return;
         }
     }
 
-
     /**
      * Creates the series for a duration curve's W facet.
      *
-     * @param wqdays The WQDay store that contains the Ws.
+     * @param wqdays
+     *            The WQDay store that contains the Ws.
      * @param theme
      */
-    protected void doWOut(
-        WQDay            wqdays,
-        ArtifactAndFacet aaf,
-        ThemeDocument    theme,
-        boolean          visible
-    ) {
+    protected void doWOut(final WQDay wqdays, final ArtifactAndFacet aaf, final ThemeDocument theme, final boolean visible) {
         log.debug("DurationCurveGenerator.doWOut");
 
-        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
 
-        int size = wqdays.size();
+        final int size = wqdays.size();
         for (int i = 0; i < size; i++) {
-            int  day = wqdays.getDay(i);
-            double w = wqdays.getW(i);
+            final int day = wqdays.getDay(i);
+            final double w = wqdays.getW(i);
 
             series.add(day, w);
         }
@@ -263,43 +196,32 @@
         addAxisSeries(series, YAXIS.W.idx, visible);
     }
 
-    protected void doPointOut(
-        Point2D          point,
-        ArtifactAndFacet aandf,
-        ThemeDocument    theme,
-        boolean          visible
-    ){
+    protected void doPointOut(final Point2D point, final ArtifactAndFacet aandf, final ThemeDocument theme, final boolean visible) {
         log.debug("DurationCurveGenerator.doPointOut");
 
-        XYSeries series =
-            new StyledXYSeries(aandf.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
 
         series.add(point.getX(), point.getY());
 
         addAxisSeries(series, YAXIS.W.idx, visible);
     }
 
-
     /**
      * Creates the series for a duration curve's Q facet.
      *
-     * @param wqdays The WQDay store that contains the Qs.
+     * @param wqdays
+     *            The WQDay store that contains the Qs.
      * @param theme
      */
-    protected void doQOut(
-        WQDay            wqdays,
-        ArtifactAndFacet aaf,
-        ThemeDocument    theme,
-        boolean          visible
-    ) {
+    protected void doQOut(final WQDay wqdays, final ArtifactAndFacet aaf, final ThemeDocument theme, final boolean visible) {
         log.debug("DurationCurveGenerator.doQOut");
 
-        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
 
-        int size = wqdays.size();
+        final int size = wqdays.size();
         for (int i = 0; i < size; i++) {
-            int  day = wqdays.getDay(i);
-            double q = wqdays.getQ(i);
+            final int day = wqdays.getDay(i);
+            final double q = wqdays.getQ(i);
 
             series.add(day, q);
         }
@@ -307,7 +229,6 @@
         addAxisSeries(series, YAXIS.Q.idx, visible);
     }
 
-
     @Override
     protected YAxisWalker getYAxisWalker() {
         return new YAxisWalker() {
@@ -317,8 +238,8 @@
             }
 
             @Override
-            public String getId(int idx) {
-                YAXIS[] yaxes = YAXIS.values();
+            public String getId(final int idx) {
+                final YAXIS[] yaxes = YAXIS.values();
                 return yaxes[idx].toString();
             }
         };
--- a/artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -14,48 +14,37 @@
 import java.util.List;
 
 import org.apache.log4j.Logger;
-
-import au.com.bytecode.opencsv.CSVWriter;
-
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.model.FlowVelocityData;
+import org.dive4elements.river.utils.Formatter;
 import org.dive4elements.river.utils.RiverUtils;
-import org.dive4elements.river.utils.Formatter;
 
+import au.com.bytecode.opencsv.CSVWriter;
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class FlowVelocityExporter extends AbstractExporter {
 
-    private static final Logger log =
-        Logger.getLogger(FlowVelocityExporter.class);
-
-
-    public static final String CSV_KM =
-        "export.flow_velocity.csv.header.km";
-
-    public static final String CSV_V_TOTAL =
-        "export.flow_velocity.csv.header.v_total";
+    private static final Logger log = Logger.getLogger(FlowVelocityExporter.class);
 
-    public static final String CSV_V_MAIN =
-        "export.flow_velocity.csv.header.v_main";
-
-    public static final String CSV_TAU_MAIN =
-        "export.flow_velocity.csv.header.tau_main";
+    public static final String CSV_KM = "export.flow_velocity.csv.header.km";
 
-    public static final String CSV_Q =
-        "export.flow_velocity.csv.header.q";
+    public static final String CSV_V_TOTAL = "export.flow_velocity.csv.header.v_total";
 
-    public static final String CSV_LOCATIONS =
-        "export.flow_velocity.csv.header.locations";
+    public static final String CSV_V_MAIN = "export.flow_velocity.csv.header.v_main";
 
+    public static final String CSV_TAU_MAIN = "export.flow_velocity.csv.header.tau_main";
+
+    public static final String CSV_Q = "common.export.csv.header.q";
+
+    public static final String CSV_LOCATIONS = "export.flow_velocity.csv.header.locations";
 
     protected List<FlowVelocityData[]> data;
 
     public FlowVelocityExporter() {
-        data = new ArrayList<FlowVelocityData[]>();
+        this.data = new ArrayList<>();
     }
 
     @Override
@@ -65,76 +54,56 @@
 
             if (d instanceof FlowVelocityData[]) {
                 log.debug("Add new data of type FlowVelocityData");
-                data.add((FlowVelocityData[]) d);
+                this.data.add((FlowVelocityData[]) d);
             }
         }
     }
 
-
     @Override
-    protected void writeCSVData(CSVWriter writer) {
+    protected void writeCSVData(final CSVWriter writer) {
         log.info("FlowVelocityExporter.writeCSVData");
-        log.debug("CSV gets " + data.size() + " FlowVelocityData objects.");
+        log.debug("CSV gets " + this.data.size() + " FlowVelocityData objects.");
 
         writeCSVHeader(writer);
 
-        for (FlowVelocityData[] d: data) {
+        for (final FlowVelocityData[] d : this.data) {
             data2CSV(writer, d);
         }
     }
 
-
-    protected void writeCSVHeader(CSVWriter writer) {
-        writer.writeNext(new String[] {
-            msg(CSV_KM, CSV_KM),
-            msg(CSV_V_MAIN, CSV_V_MAIN),
-            msg(CSV_V_TOTAL, CSV_V_TOTAL),
-            msg(CSV_TAU_MAIN, CSV_TAU_MAIN),
-            msg(CSV_Q, CSV_Q),
-            msg(CSV_LOCATIONS, CSV_LOCATIONS)
-        });
+    protected void writeCSVHeader(final CSVWriter writer) {
+        writer.writeNext(new String[] { msg(CSV_KM, CSV_KM), msg(CSV_V_MAIN, CSV_V_MAIN), msg(CSV_V_TOTAL, CSV_V_TOTAL), msg(CSV_TAU_MAIN, CSV_TAU_MAIN),
+                msg(CSV_Q, CSV_Q), msg(CSV_LOCATIONS, CSV_LOCATIONS) });
     }
 
-
-    protected void data2CSV(CSVWriter writer, FlowVelocityData[] fData) {
+    protected void data2CSV(final CSVWriter writer, final FlowVelocityData[] fData) {
         log.debug("Add next FlowVelocityData to CSV");
 
-        D4EArtifact flys = (D4EArtifact) master;
+        final D4EArtifact flys = (D4EArtifact) this.master;
 
-        for (FlowVelocityData data: fData) {
+        for (final FlowVelocityData data : fData) {
             for (int i = 0, n = data.size(); i < n; i++) {
-                NumberFormat kmF  = Formatter.getFlowVelocityKM(context);
-                NumberFormat valF = Formatter.getFlowVelocityValues(context);
-                NumberFormat qF   = Formatter.getFlowVelocityQ(context);
+                final NumberFormat kmF = Formatter.getFlowVelocityKM(this.context);
+                final NumberFormat valF = Formatter.getFlowVelocityValues(this.context);
+                final NumberFormat qF = Formatter.getFlowVelocityQ(this.context);
 
                 String vMain = "";
                 String vTotal = "";
 
-                if (data.getType().equals("main")
-                    || data.getType().equals("main_total")
-                ) {
+                if (data.getType().equals("main") || data.getType().equals("main_total")) {
                     vMain = valF.format(data.getVMain(i));
                 }
-                if (data.getType().equals("total")
-                    || data.getType().equals("main_total")
-                ) {
+                if (data.getType().equals("total") || data.getType().equals("main_total")) {
                     vTotal = valF.format(data.getVTotal(i));
                 }
-                writer.writeNext(new String[] {
-                    kmF.format(data.getKM(i)),
-                    vMain,
-                    vTotal,
-                    valF.format(data.getTauMain(i)),
-                    qF.format(data.getQ(i)) + "=" + data.getZone(),
-                    RiverUtils.getLocationDescription(flys, data.getKM(i)),
-                });
+                writer.writeNext(new String[] { kmF.format(data.getKM(i)), vMain, vTotal, valF.format(data.getTauMain(i)),
+                        qF.format(data.getQ(i)) + "=" + data.getZone(), RiverUtils.getLocationDescription(flys, data.getKM(i)), });
             }
         }
     }
 
-
     @Override
-    protected void writePDF(OutputStream out) {
+    protected void writePDF(final OutputStream out) {
         log.error("TODO: Implement FlowVelocityExporter.writePDF");
     }
 }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/HistoricalDischargeCurveGenerator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/HistoricalDischargeCurveGenerator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -11,64 +11,48 @@
 import java.util.Date;
 
 import org.apache.log4j.Logger;
-
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.D4EArtifact;
-
 import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess;
-
 import org.dive4elements.river.artifacts.model.FacetTypes;
 import org.dive4elements.river.artifacts.model.HistoricalWQTimerange;
 import org.dive4elements.river.artifacts.model.Timerange;
 import org.dive4elements.river.artifacts.model.WQTimerange;
-
 import org.dive4elements.river.jfree.StyledTimeSeries;
-
 import org.dive4elements.river.themes.ThemeDocument;
 import org.dive4elements.river.utils.RiverUtils;
-
 import org.jfree.chart.plot.XYPlot;
-
 import org.jfree.data.general.SeriesException;
-
 import org.jfree.data.time.FixedMillisecond;
 import org.jfree.data.time.RegularTimePeriod;
 import org.jfree.data.time.TimeSeries;
 import org.jfree.data.time.TimeSeriesCollection;
 
-
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
-public class HistoricalDischargeCurveGenerator extends TimeseriesChartGenerator
-    implements FacetTypes {
-
-    private static Logger log = Logger
-        .getLogger(HistoricalDischargeCurveGenerator.class);
-
-    public static final String I18N_CHART_TITLE =
-        "chart.historical.discharge.title";
+public class HistoricalDischargeCurveGenerator extends TimeseriesChartGenerator implements FacetTypes {
 
-    public static final String I18N_CHART_SUBTITLE =
-        "chart.historical.discharge.subtitle";
+    private static Logger log = Logger.getLogger(HistoricalDischargeCurveGenerator.class);
 
-    public static final String I18N_XAXIS_LABEL =
-        "chart.historical.discharge.xaxis.label";
+    public static final String I18N_CHART_TITLE = "chart.historical.discharge.title";
 
-    public static final String I18N_YAXIS_LABEL =
-        "chart.historical.discharge.yaxis.label";
+    public static final String I18N_CHART_SUBTITLE = "chart.historical.discharge.subtitle";
 
-    public static final String I18N_YAXIS_SECOND_LABEL =
-        "chart.historical.discharge.yaxis.second.label";
+    public static final String I18N_XAXIS_LABEL = "chart.historical.discharge.xaxis.label";
+
+    public static final String I18N_YAXIS_LABEL = "chart.historical.discharge.yaxis.label";
+
+    public static final String I18N_YAXIS_SECOND_LABEL = "common.export.csv.header.q";
 
     public static enum YAXIS {
         W(0), Q(1);
 
         protected int idx;
 
-        private YAXIS(int c) {
-            idx = c;
+        private YAXIS(final int c) {
+            this.idx = c;
         }
     }
 
@@ -82,8 +66,8 @@
             }
 
             @Override
-            public String getId(int idx) {
-                YAXIS[] yaxes = YAXIS.values();
+            public String getId(final int idx) {
+                final YAXIS[] yaxes = YAXIS.values();
                 return yaxes[idx].toString();
             }
         };
@@ -96,12 +80,10 @@
 
     @Override
     protected String getDefaultChartSubtitle(final CallContext context) {
-        D4EArtifact flys = getArtifact();
-        Timerange evalTime = new HistoricalDischargeAccess(flys)
-            .getEvaluationTimerange();
+        final D4EArtifact flys = getArtifact();
+        final Timerange evalTime = new HistoricalDischargeAccess(flys).getEvaluationTimerange();
 
-        Object[] args = new Object[] { RiverUtils.getReferenceGaugeName(flys),
-            evalTime.getStart(), evalTime.getEnd() };
+        final Object[] args = new Object[] { RiverUtils.getReferenceGaugeName(flys), evalTime.getStart(), evalTime.getEnd() };
 
         return msg(I18N_CHART_SUBTITLE, "", args);
     }
@@ -112,119 +94,93 @@
     }
 
     @Override
-    protected String getDefaultYAxisLabel(int pos) {
+    protected String getDefaultYAxisLabel(final int pos) {
         if (pos == 0) {
             return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL);
-        }
-        else if (pos == 1) {
+        } else if (pos == 1) {
             return msg(I18N_YAXIS_SECOND_LABEL, I18N_YAXIS_SECOND_LABEL);
-        }
-        else {
+        } else {
             return "NO TITLE FOR Y AXIS: " + pos;
         }
     }
 
     @Override
-    protected void adjustPlot(XYPlot plot) {
+    protected void adjustPlot(final XYPlot plot) {
         super.adjustPlot(plot);
         plot.setRangeZeroBaselineVisible(true);
     }
 
     @Override
-    public void doOut(ArtifactAndFacet artifactFacet, ThemeDocument theme,
-        boolean visible) {
-        String name = artifactFacet.getFacetName();
+    public void doOut(final ArtifactAndFacet artifactFacet, final ThemeDocument theme, final boolean visible) {
+        final String name = artifactFacet.getFacetName();
         log.debug("HistoricalDischargeCurveGenerator.doOut: " + name);
-        log.debug("Theme description is: "
-            + artifactFacet.getFacetDescription());
+        log.debug("Theme description is: " + artifactFacet.getFacetDescription());
 
         final CallContext context = getContext();
-        
+
         if (name.equals(HISTORICAL_DISCHARGE_Q)) {
-            doHistoricalDischargeOutQ(
-                (D4EArtifact) artifactFacet.getArtifact(),
-                artifactFacet.getData(context),
-                artifactFacet.getFacetDescription(), theme, visible);
-        }
-        else if (name.equals(HISTORICAL_DISCHARGE_W)) {
-            doHistoricalDischargeOutW(
-                (D4EArtifact) artifactFacet.getArtifact(),
-                artifactFacet.getData(context),
-                artifactFacet.getFacetDescription(), theme, visible);
-        }
-        else if (name.equals(HISTORICAL_DISCHARGE_Q_DIFF)) {
-            doHistoricalDischargeDifferenceOutQ(
-                (D4EArtifact) artifactFacet.getArtifact(),
-                artifactFacet.getData(context),
-                artifactFacet.getFacetDescription(), theme, visible);
-        }
-        else if (name.equals(HISTORICAL_DISCHARGE_W_DIFF)) {
-            doHistoricalDischargeDifferenceOutW(
-                (D4EArtifact) artifactFacet.getArtifact(),
-                artifactFacet.getData(context),
-                artifactFacet.getFacetDescription(), theme, visible);
-        }
-        else if (FacetTypes.IS.MANUALPOINTS(name)) {
-            HistoricalDischargeAccess.EvaluationMode mode =
-                new HistoricalDischargeAccess(
-                    (D4EArtifact)getMaster()).getEvaluationMode();
-            int axis = mode == HistoricalDischargeAccess.EvaluationMode.W
-                ? YAXIS.Q.idx
-                : YAXIS.W.idx;
+            doHistoricalDischargeOutQ((D4EArtifact) artifactFacet.getArtifact(), artifactFacet.getData(context), artifactFacet.getFacetDescription(), theme,
+                    visible);
+        } else if (name.equals(HISTORICAL_DISCHARGE_W)) {
+            doHistoricalDischargeOutW((D4EArtifact) artifactFacet.getArtifact(), artifactFacet.getData(context), artifactFacet.getFacetDescription(), theme,
+                    visible);
+        } else if (name.equals(HISTORICAL_DISCHARGE_Q_DIFF)) {
+            doHistoricalDischargeDifferenceOutQ((D4EArtifact) artifactFacet.getArtifact(), artifactFacet.getData(context), artifactFacet.getFacetDescription(),
+                    theme, visible);
+        } else if (name.equals(HISTORICAL_DISCHARGE_W_DIFF)) {
+            doHistoricalDischargeDifferenceOutW((D4EArtifact) artifactFacet.getArtifact(), artifactFacet.getData(context), artifactFacet.getFacetDescription(),
+                    theme, visible);
+        } else if (FacetTypes.IS.MANUALPOINTS(name)) {
+            final HistoricalDischargeAccess.EvaluationMode mode = new HistoricalDischargeAccess((D4EArtifact) getMaster()).getEvaluationMode();
+            final int axis = mode == HistoricalDischargeAccess.EvaluationMode.W ? YAXIS.Q.idx : YAXIS.W.idx;
 
-            doPoints(artifactFacet.getData(context), artifactFacet, theme,
-                visible, axis);
-        }
-        else {
+            doPoints(artifactFacet.getData(context), artifactFacet, theme, visible, axis);
+        } else {
             log.warn("doOut(): unknown facet name: " + name);
             return;
         }
     }
 
-    protected void doHistoricalDischargeOutQ(D4EArtifact artifact,
-        Object data, String desc, ThemeDocument theme, boolean visible) {
+    protected void doHistoricalDischargeOutQ(final D4EArtifact artifact, final Object data, final String desc, final ThemeDocument theme,
+            final boolean visible) {
         log.debug("doHistoricalDischargeOut(): description = " + desc);
 
-        WQTimerange wqt = (WQTimerange) data;
+        final WQTimerange wqt = (WQTimerange) data;
 
-        TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(),
-            wqt.getQs(), theme, desc);
+        final TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), wqt.getQs(), theme, desc);
 
         addAxisDataset(tsc, YAXIS.Q.idx, visible);
     }
 
-    protected void doHistoricalDischargeOutW(D4EArtifact artifact,
-        Object data, String desc, ThemeDocument theme, boolean visible) {
+    protected void doHistoricalDischargeOutW(final D4EArtifact artifact, final Object data, final String desc, final ThemeDocument theme,
+            final boolean visible) {
         log.debug("doHistoricalDischargeOut(): description = " + desc);
 
-        WQTimerange wqt = (WQTimerange) data;
+        final WQTimerange wqt = (WQTimerange) data;
 
-        TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(),
-            wqt.getWs(), theme, desc);
+        final TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), wqt.getWs(), theme, desc);
 
         addAxisDataset(tsc, YAXIS.W.idx, visible);
     }
 
-    protected void doHistoricalDischargeDifferenceOutQ(D4EArtifact artifact,
-        Object data, String desc, ThemeDocument theme, boolean visible) {
+    protected void doHistoricalDischargeDifferenceOutQ(final D4EArtifact artifact, final Object data, final String desc, final ThemeDocument theme,
+            final boolean visible) {
         log.debug("doHistoricalDischargeDifferenceOut: desc = " + desc);
 
-        HistoricalWQTimerange wqt = (HistoricalWQTimerange) data;
+        final HistoricalWQTimerange wqt = (HistoricalWQTimerange) data;
 
-        TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(),
-            wqt.getDiffs(), theme, desc);
+        final TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), wqt.getDiffs(), theme, desc);
 
         addAxisDataset(tsc, YAXIS.Q.idx, visible);
     }
 
-    protected void doHistoricalDischargeDifferenceOutW(D4EArtifact artifact,
-        Object data, String desc, ThemeDocument theme, boolean visible) {
+    protected void doHistoricalDischargeDifferenceOutW(final D4EArtifact artifact, final Object data, final String desc, final ThemeDocument theme,
+            final boolean visible) {
         log.debug("doHistoricalDischargeDifferenceOut: desc = " + desc);
 
-        HistoricalWQTimerange wqt = (HistoricalWQTimerange) data;
+        final HistoricalWQTimerange wqt = (HistoricalWQTimerange) data;
 
-        TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(),
-            wqt.getDiffs(), theme, desc);
+        final TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), wqt.getDiffs(), theme, desc);
 
         addAxisDataset(tsc, YAXIS.W.idx, visible);
     }
@@ -235,19 +191,14 @@
      * provided by <i>wqt</i>. This has the effect, that the line in the chart
      * looks like a "step chart".
      */
-    protected TimeSeriesCollection newTimeSeriesCollection(
-        Timerange[] timeranges,
-        double[] values,
-        ThemeDocument theme,
-        String desc
-    ) {
+    protected TimeSeriesCollection newTimeSeriesCollection(final Timerange[] timeranges, final double[] values, final ThemeDocument theme, final String desc) {
         log.debug("Create new TimeSeriesCollection for: " + desc);
 
-        TimeSeriesCollection tsc = new TimeSeriesCollection();
-        TimeSeries series = new StyledTimeSeries(desc, theme);
+        final TimeSeriesCollection tsc = new TimeSeriesCollection();
+        final TimeSeries series = new StyledTimeSeries(desc, theme);
 
         for (int i = 0, n = timeranges.length; i < n; i++) {
-            RegularTimePeriod[] rtp = newRegularTimePeriod(timeranges[i]);
+            final RegularTimePeriod[] rtp = newRegularTimePeriod(timeranges[i]);
 
             try {
                 if (Double.isNaN(values[i])) {
@@ -264,7 +215,7 @@
                     log.debug("   Value:      " + values[i]);
                 }
             }
-            catch (SeriesException se) {
+            catch (final SeriesException se) {
                 log.warn("Error while adding TimePeriod: " + se);
             }
         }
@@ -283,13 +234,11 @@
      *
      * @return an array with two <i>FixedMillisecond</i> periods [start, end].
      */
-    protected RegularTimePeriod[] newRegularTimePeriod(Timerange timerange) {
-        Date start = new Date(timerange.getStart());
-        Date end = new Date(timerange.getEnd() - 1000 * 60 * 60 * 24);
+    protected RegularTimePeriod[] newRegularTimePeriod(final Timerange timerange) {
+        final Date start = new Date(timerange.getStart());
+        final Date end = new Date(timerange.getEnd() - 1000 * 60 * 60 * 24);
 
-        return new RegularTimePeriod[] {
-            new FixedMillisecond(start),
-            new FixedMillisecond(end) };
+        return new RegularTimePeriod[] { new FixedMillisecond(start), new FixedMillisecond(end) };
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java	Thu Jul 26 15:54:20 2018 +0200
@@ -8,6 +8,7 @@
 
 package org.dive4elements.river.exports;
 
+import org.apache.log4j.Logger;
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifactdatabase.state.Facet;
 import org.dive4elements.artifacts.CallContext;
@@ -17,90 +18,72 @@
 import org.dive4elements.river.artifacts.model.FacetTypes;
 import org.dive4elements.river.artifacts.model.WKms;
 import org.dive4elements.river.artifacts.model.WQKms;
-
-import org.dive4elements.river.exports.process.Processor;
+import org.dive4elements.river.exports.process.AnnotationProcessor;
 import org.dive4elements.river.exports.process.BedDiffHeightYearProcessor;
 import org.dive4elements.river.exports.process.BedDiffYearProcessor;
+import org.dive4elements.river.exports.process.Processor;
 import org.dive4elements.river.exports.process.QOutProcessor;
 import org.dive4elements.river.exports.process.WOutProcessor;
-import org.dive4elements.river.exports.process.AnnotationProcessor;
-
 import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
 import org.dive4elements.river.jfree.StyledXYSeries;
 import org.dive4elements.river.themes.ThemeDocument;
 import org.dive4elements.river.utils.RiverUtils;
-import org.apache.log4j.Logger;
 import org.jfree.chart.axis.NumberAxis;
 import org.jfree.chart.axis.ValueAxis;
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.data.xy.XYSeries;
 
-
 /**
  * An OutGenerator that generates longitudinal section curves.
  *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
-public class LongitudinalSectionGenerator
-extends      XYChartGenerator
-implements   FacetTypes
-{
+public class LongitudinalSectionGenerator extends XYChartGenerator implements FacetTypes {
     public enum YAXIS {
-        W(0),
-        D(1),
-        Q(2);
+        W(0), D(1), Q(2);
         protected int idx;
-        private YAXIS(int c) {
-            idx = c;
+
+        private YAXIS(final int c) {
+            this.idx = c;
         }
     }
 
     /** The log that is used in this generator. */
-    private static Logger log =
-        Logger.getLogger(LongitudinalSectionGenerator.class);
+    private static Logger log = Logger.getLogger(LongitudinalSectionGenerator.class);
 
     /** Key to look up internationalized String for annotations label. */
-    public static final String I18N_ANNOTATIONS_LABEL =
-        "chart.longitudinal.annotations.label";
+    public static final String I18N_ANNOTATIONS_LABEL = "chart.longitudinal.annotations.label";
 
     /**
      * Key to look up internationalized String for LongitudinalSection diagrams
      * titles.
      */
-    public static final String I18N_CHART_TITLE =
-        "chart.longitudinal.section.title";
+    public static final String I18N_CHART_TITLE = "chart.longitudinal.section.title";
 
     /**
      * Key to look up internationalized String for LongitudinalSection diagrams
      * subtitles.
      */
-    public static final String I18N_CHART_SUBTITLE =
-        "chart.longitudinal.section.subtitle";
+    public static final String I18N_CHART_SUBTITLE = "chart.longitudinal.section.subtitle";
 
     /**
      * Key to look up internationalized String for LongitudinalSection diagrams
      * short subtitles.
      */
-    public static final String I18N_CHART_SHORT_SUBTITLE =
-        "chart.longitudinal.section.shortsubtitle";
-
-    public static final String I18N_XAXIS_LABEL =
-        "chart.longitudinal.section.xaxis.label";
+    public static final String I18N_CHART_SHORT_SUBTITLE = "chart.longitudinal.section.shortsubtitle";
 
-    public static final String I18N_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
+    public static final String I18N_XAXIS_LABEL = "chart.longitudinal.section.xaxis.label";
 
-    public static final String I18N_2YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.second.label";
+    public static final String I18N_YAXIS_LABEL = "chart.longitudinal.section.yaxis.label";
 
-    public static final String I18N_CHART_TITLE_DEFAULT =
-        "W-L\u00e4ngsschnitt";
-    public static final String I18N_XAXIS_LABEL_DEFAULT  = "km";
-    public static final String I18N_YAXIS_LABEL_DEFAULT  = "W [NN + m]";
+    public static final String I18N_2YAXIS_LABEL = "common.export.csv.header.q";
+
+    public static final String I18N_CHART_TITLE_DEFAULT = "W-L\u00e4ngsschnitt";
+    public static final String I18N_XAXIS_LABEL_DEFAULT = "km";
+    public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]";
     public static final String I18N_2YAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
 
-    public final static String I18N_WDIFF_YAXIS_LABEL =
-        "chart.w_differences.yaxis.label";
+    public final static String I18N_WDIFF_YAXIS_LABEL = "chart.w_differences.yaxis.label";
 
     public final static String I18N_WDIFF_YAXIS_LABEL_DEFAULT = "m";
 
@@ -108,7 +91,6 @@
         super();
     }
 
-
     @Override
     protected YAxisWalker getYAxisWalker() {
         return new YAxisWalker() {
@@ -118,14 +100,13 @@
             }
 
             @Override
-            public String getId(int idx) {
-                YAXIS[] yaxes = YAXIS.values();
+            public String getId(final int idx) {
+                final YAXIS[] yaxes = YAXIS.values();
                 return yaxes[idx].toString();
             }
         };
     }
 
-
     /**
      * Return left most data points x value (on first axis).
      * Overridden because axis could be inverted.
@@ -133,12 +114,11 @@
     @Override
     protected double getLeftX() {
         if (isInverted()) {
-            return (Double)getXBounds(0).getUpper();
+            return (Double) getXBounds(0).getUpper();
         }
-        return (Double)getXBounds(0).getLower();
+        return (Double) getXBounds(0).getLower();
     }
 
-
     /**
      * Return right most data points x value (on first axis).
      * Overridden because axis could be inverted.
@@ -146,12 +126,11 @@
     @Override
     protected double getRightX() {
         if (isInverted()) {
-            return (Double)getXBounds(0).getLower();
+            return (Double) getXBounds(0).getLower();
         }
-        return (Double)getXBounds(0).getUpper();
+        return (Double) getXBounds(0).getUpper();
     }
 
-
     /**
      * Returns the default title for this chart.
      *
@@ -169,109 +148,91 @@
      */
     @Override
     protected String getDefaultChartSubtitle(final CallContext context) {
-        double[] dist = getRange();
+        final double[] dist = getRange();
 
         Object[] args = null;
         if (dist == null) {
-            args = new Object[] {getRiverName()};
+            args = new Object[] { getRiverName() };
             return msg(getChartShortSubtitleKey(), "", args);
         }
-        args = new Object[] {
-            getRiverName(),
-            dist[0],
-            dist[1]
-        };
+        args = new Object[] { getRiverName(), dist[0], dist[1] };
         return msg(getChartSubtitleKey(), "", args);
     }
 
-
     /**
      * Gets key to look up internationalized String for the charts subtitle.
+     * 
      * @return key to look up translated subtitle.
      */
     protected String getChartSubtitleKey() {
         return I18N_CHART_SUBTITLE;
     }
 
-
     /**
      * Gets key to look up internationalized String for the charts short
      * subtitle.
+     * 
      * @return key to look up translated subtitle.
      */
     protected String getChartShortSubtitleKey() {
         return I18N_CHART_SHORT_SUBTITLE;
     }
 
-
     /**
      * Get internationalized label for the x axis.
      */
     @Override
-    protected String getDefaultXAxisLabel(CallContext context) {
-        D4EArtifact flys = getArtifact();
+    protected String getDefaultXAxisLabel(final CallContext context) {
+        final D4EArtifact flys = getArtifact();
 
-        return msg(
-            I18N_XAXIS_LABEL,
-            I18N_XAXIS_LABEL_DEFAULT,
-            new Object[] { RiverUtils.getRiver(flys).getName() });
+        return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT, new Object[] { RiverUtils.getRiver(flys).getName() });
     }
 
-
     @Override
-    protected String getDefaultYAxisLabel(int index) {
+    protected String getDefaultYAxisLabel(final int index) {
         String label = "default";
 
         if (index == YAXIS.W.idx) {
             label = getWAxisLabel();
-        }
-        else if (index == YAXIS.Q.idx) {
+        } else if (index == YAXIS.Q.idx) {
             label = msg(getQAxisLabelKey(), getQAxisDefaultLabel());
-        }
-        else if (index == YAXIS.D.idx) {
-            label = msg(
-                I18N_WDIFF_YAXIS_LABEL, I18N_WDIFF_YAXIS_LABEL_DEFAULT);
+        } else if (index == YAXIS.D.idx) {
+            label = msg(I18N_WDIFF_YAXIS_LABEL, I18N_WDIFF_YAXIS_LABEL_DEFAULT);
         }
 
         return label;
     }
 
-
     /**
      * Get internationalized label for the y axis.
      */
     protected String getWAxisLabel() {
-        D4EArtifact flys = getArtifact();
-
-        String unit = RiverUtils.getRiver(flys).getWstUnit().getName();
+        final D4EArtifact flys = getArtifact();
 
-        return msg(
-            I18N_YAXIS_LABEL,
-            I18N_YAXIS_LABEL_DEFAULT,
-            new Object[] { unit });
+        final String unit = RiverUtils.getRiver(flys).getWstUnit().getName();
+
+        return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT, new Object[] { unit });
     }
 
-
     /**
      * Create Axis for given index.
+     * 
      * @return axis with according internationalized label.
      */
     @Override
-    protected NumberAxis createYAxis(int index) {
-        NumberAxis axis = super.createYAxis(index);
+    protected NumberAxis createYAxis(final int index) {
+        final NumberAxis axis = super.createYAxis(index);
 
         // "Q" Axis shall include 0.
         if (index == YAXIS.Q.idx) {
             axis.setAutoRangeIncludesZero(true);
-        }
-        else {
+        } else {
             axis.setAutoRangeIncludesZero(false);
         }
 
         return axis;
     }
 
-
     /**
      * Get default value for the second Y-Axis' label (if no translation was
      * found).
@@ -280,7 +241,6 @@
         return I18N_2YAXIS_LABEL_DEFAULT;
     }
 
-
     /**
      * Get key for internationalization of the second Y-Axis' label.
      */
@@ -288,44 +248,41 @@
         return I18N_2YAXIS_LABEL;
     }
 
-
     /**
      * Trigger inversion.
      */
     @Override
-    protected void adjustAxes(XYPlot plot) {
+    protected void adjustAxes(final XYPlot plot) {
         super.adjustAxes(plot);
         invertXAxis(plot.getDomainAxis());
     }
 
-
     /**
      * This method inverts the x-axis based on the kilometer information of the
      * selected river. If the head of the river is at kilometer 0, the axis is
      * not inverted, otherwise it is.
      *
-     * @param xaxis The domain axis.
+     * @param xaxis
+     *            The domain axis.
      */
-    protected void invertXAxis(ValueAxis xaxis) {
+    protected void invertXAxis(final ValueAxis xaxis) {
         if (isInverted()) {
             log.debug("X-Axis.setInverted(true)");
             xaxis.setInverted(true);
         }
     }
 
-
     /**
      * Produce output.
-     * @param artifactAndFacet current facet and artifact.
-     * @param attr  theme for facet
+     * 
+     * @param artifactAndFacet
+     *            current facet and artifact.
+     * @param attr
+     *            theme for facet
      */
     @Override
-    public void doOut(
-        ArtifactAndFacet artifactAndFacet,
-        ThemeDocument    attr,
-        boolean          visible
-    ) {
-        String name = artifactAndFacet.getFacetName();
+    public void doOut(final ArtifactAndFacet artifactAndFacet, final ThemeDocument attr, final boolean visible) {
+        final String name = artifactAndFacet.getFacetName();
 
         log.debug("LongitudinalSectionGenerator.doOut: " + name);
 
@@ -334,63 +291,38 @@
             return;
         }
 
-        Facet facet = artifactAndFacet.getFacet();
+        final Facet facet = artifactAndFacet.getFacet();
 
         if (facet == null) {
             return;
         }
 
-        CallContext context = getContext();
-        
-        Processor wProcessor = new WOutProcessor();
-        Processor qProcessor = new QOutProcessor();
-        Processor bdyProcessor = new BedDiffYearProcessor();
-        Processor bdhyProcessor = new BedDiffHeightYearProcessor();
-        Processor annotationProcessor = new AnnotationProcessor();
+        final CallContext context = getContext();
+
+        final Processor wProcessor = new WOutProcessor();
+        final Processor qProcessor = new QOutProcessor();
+        final Processor bdyProcessor = new BedDiffYearProcessor();
+        final Processor bdhyProcessor = new BedDiffHeightYearProcessor();
+        final Processor annotationProcessor = new AnnotationProcessor();
 
         if (wProcessor.canHandle(name)) {
-            wProcessor.doOut(
-                this, artifactAndFacet, attr, visible, YAXIS.W.idx);
+            wProcessor.doOut(this, artifactAndFacet, attr, visible, YAXIS.W.idx);
         }
         if (qProcessor.canHandle(name)) {
-            qProcessor.doOut(
-                this, artifactAndFacet, attr, visible, YAXIS.Q.idx);
-        }
-        else if (bdyProcessor.canHandle(name)) {
-           bdyProcessor.doOut(
-               this, artifactAndFacet, attr, visible, YAXIS.W.idx);
-        }
-        else if (bdhyProcessor.canHandle(name)) {
-           bdhyProcessor.doOut(
-               this, artifactAndFacet, attr, visible, YAXIS.W.idx);
-        }
-        else if (annotationProcessor.canHandle(name)) {
-            annotationProcessor.doOut(
-                this, artifactAndFacet, attr, visible, 0);
-        }
-        else if (name.equals(W_DIFFERENCES)) {
-            doWDifferencesOut(
-                (WKms) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (FacetTypes.IS.AREA(name)) {
-            doArea(
-                artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (FacetTypes.IS.MANUALPOINTS(name)) {
-            doPoints(
-                artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible,
-                YAXIS.W.idx);
-        }
-        else {
+            qProcessor.doOut(this, artifactAndFacet, attr, visible, YAXIS.Q.idx);
+        } else if (bdyProcessor.canHandle(name)) {
+            bdyProcessor.doOut(this, artifactAndFacet, attr, visible, YAXIS.W.idx);
+        } else if (bdhyProcessor.canHandle(name)) {
+            bdhyProcessor.doOut(this, artifactAndFacet, attr, visible, YAXIS.W.idx);
+        } else if (annotationProcessor.canHandle(name)) {
+            annotationProcessor.doOut(this, artifactAndFacet, attr, visible, 0);
+        } else if (name.equals(W_DIFFERENCES)) {
+            doWDifferencesOut((WKms) artifactAndFacet.getData(context), artifactAndFacet, attr, visible);
+        } else if (FacetTypes.IS.AREA(name)) {
+            doArea(artifactAndFacet.getData(context), artifactAndFacet, attr, visible);
+        } else if (FacetTypes.IS.MANUALPOINTS(name)) {
+            doPoints(artifactAndFacet.getData(context), artifactAndFacet, attr, visible, YAXIS.W.idx);
+        } else {
             log.warn("Unknown facet name: " + name);
             return;
         }
@@ -399,20 +331,14 @@
     /**
      * Add items to dataseries which describes the differences.
      */
-    protected void doWDifferencesOut(
-        WKms       wkms,
-        ArtifactAndFacet aandf,
-        ThemeDocument   theme,
-        boolean    visible
-    ) {
+    protected void doWDifferencesOut(final WKms wkms, final ArtifactAndFacet aandf, final ThemeDocument theme, final boolean visible) {
         log.debug("WDifferencesCurveGenerator.doWDifferencesOut");
         if (wkms == null) {
             log.warn("No data to add to WDifferencesChart.");
             return;
-         }
+        }
 
-        XYSeries series =
-            new StyledXYSeries(aandf.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
 
         if (log.isDebugEnabled()) {
             if (wkms.size() > 0) {
@@ -428,83 +354,65 @@
         addAxisSeries(series, YAXIS.D.idx, visible);
     }
 
-
     /**
      * Get name of series (displayed in legend).
+     * 
      * @return name of the series.
      */
-    protected String getSeriesName(WQKms wqkms, String mode) {
-        String name   = wqkms.getName();
-        String prefix = name != null && name.indexOf(mode) >= 0 ? null : mode;
+    protected String getSeriesName(final WQKms wqkms, final String mode) {
+        final String name = wqkms.getName();
+        final String prefix = name != null && name.indexOf(mode) >= 0 ? null : mode;
 
-        return prefix != null && prefix.length() > 0
-            ? prefix + "(" + name +")"
-            : name;
+        return prefix != null && prefix.length() > 0 ? prefix + "(" + name + ")" : name;
     }
 
-
     /** Look up the axis identifier for a given facet type. */
-    public int axisIdxForFacet(String facetName) {
+    public int axisIdxForFacet(final String facetName) {
         if (FacetTypes.IS.W(facetName)) {
             return YAXIS.W.idx;
-        }
-        else if (FacetTypes.IS.Q(facetName)) {
+        } else if (FacetTypes.IS.Q(facetName)) {
             return YAXIS.Q.idx;
-        }
-        else {
+        } else {
             log.warn("Could not find axis for facet " + facetName);
             return YAXIS.W.idx;
         }
     }
 
-
     /**
      * Do Area out.
-     * @param theme styling information.
-     * @param visible whether or not visible.
+     * 
+     * @param theme
+     *            styling information.
+     * @param visible
+     *            whether or not visible.
      */
-    protected void doArea(
-        Object     o,
-        ArtifactAndFacet aandf,
-        ThemeDocument   theme,
-        boolean    visible
-    ) {
+    protected void doArea(final Object o, final ArtifactAndFacet aandf, final ThemeDocument theme, final boolean visible) {
         log.debug("LongitudinalSectionGenerator.doArea");
-        StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme);
+        final StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme);
 
-        String seriesName = aandf.getFacetDescription();
+        final String seriesName = aandf.getFacetDescription();
 
-        AreaFacet.Data data = (AreaFacet.Data) o;
+        final AreaFacet.Data data = (AreaFacet.Data) o;
 
-        XYSeries up   = null;
+        XYSeries up = null;
         XYSeries down = null;
 
         if (data.getUpperData() != null) {
             up = new StyledXYSeries(seriesName, false, theme);
             if (data.getUpperData() instanceof WQKms) {
                 if (FacetTypes.IS.Q(data.getUpperFacetName())) {
-                    StyledSeriesBuilder.addPointsKmQ(
-                        up, (WQKms)data.getUpperData());
-                }
-                else {
-                    StyledSeriesBuilder.addPoints(
-                        up, (WKms) data.getUpperData());
+                    StyledSeriesBuilder.addPointsKmQ(up, (WQKms) data.getUpperData());
+                } else {
+                    StyledSeriesBuilder.addPoints(up, (WKms) data.getUpperData());
                 }
-            }
-            else if (data.getUpperData() instanceof double[][]) {
-                StyledSeriesBuilder.addPoints(
-                    up, (double [][]) data.getUpperData(), false);
-            }
-            else if (data.getUpperData() instanceof WKms) {
+            } else if (data.getUpperData() instanceof double[][]) {
+                StyledSeriesBuilder.addPoints(up, (double[][]) data.getUpperData(), false);
+            } else if (data.getUpperData() instanceof WKms) {
                 StyledSeriesBuilder.addPoints(up, (WKms) data.getUpperData());
-            }
-            else if (data.getUpperData() instanceof Lines.LineData) {
-                StyledSeriesBuilder.addPoints(
-                    up, ((Lines.LineData) data.getUpperData()).points, false);
-            }
-            else {
-                log.error("Do not know how to deal with (up) area info from: "
-                    + data.getUpperData());
+            } else if (data.getUpperData() instanceof Lines.LineData) {
+                StyledSeriesBuilder.addPoints(up, ((Lines.LineData) data.getUpperData()).points, false);
+            } else {
+                log.error("Do not know how to deal with (up) area info from: " + data.getUpperData());
             }
         }
 
@@ -517,32 +425,18 @@
             down = new StyledXYSeries(seriesName + " ", false, theme);
             if (data.getLowerData() instanceof WQKms) {
                 if (FacetTypes.IS.Q(data.getLowerFacetName())) {
-                    StyledSeriesBuilder.addPointsKmQ(
-                        down, (WQKms) data.getLowerData());
-                }
-                else {
-                    StyledSeriesBuilder.addPoints(
-                        down, (WQKms) data.getLowerData());
+                    StyledSeriesBuilder.addPointsKmQ(down, (WQKms) data.getLowerData());
+                } else {
+                    StyledSeriesBuilder.addPoints(down, (WQKms) data.getLowerData());
                 }
-            }
-            else if (data.getLowerData() instanceof double[][]) {
-                StyledSeriesBuilder.addPoints(
-                    down, (double[][]) data.getLowerData(), false);
-            }
-            else if (data.getLowerData() instanceof WKms) {
-                StyledSeriesBuilder.addPoints(
-                    down, (WKms) data.getLowerData());
-            }
-            else if (data.getLowerData() instanceof Lines.LineData) {
-                StyledSeriesBuilder.addPoints(
-                    down,
-                    ((Lines.LineData) data.getLowerData()).points,
-                    false);
-            }
-            else {
-                log.error(
-                    "Do not know how to deal with (down) area info from: "
-                    + data.getLowerData());
+            } else if (data.getLowerData() instanceof double[][]) {
+                StyledSeriesBuilder.addPoints(down, (double[][]) data.getLowerData(), false);
+            } else if (data.getLowerData() instanceof WKms) {
+                StyledSeriesBuilder.addPoints(down, (WKms) data.getLowerData());
+            } else if (data.getLowerData() instanceof Lines.LineData) {
+                StyledSeriesBuilder.addPoints(down, ((Lines.LineData) data.getLowerData()).points, false);
+            } else {
+                log.error("Do not know how to deal with (down) area info from: " + data.getLowerData());
             }
         }
 
@@ -551,26 +445,21 @@
             down.setKey(seriesName);
             area.addSeries(down);
             area.addSeries(StyledSeriesBuilder.createGroundAtInfinity(down));
-        }
-        else if (up != null && down == null) {
+        } else if (up != null && down == null) {
             area.setMode(StyledAreaSeriesCollection.FILL_MODE.UNDER);
             area.addSeries(up);
             area.addSeries(StyledSeriesBuilder.createGroundAtInfinity(up));
-        }
-        else if (up != null && down != null) {
+        } else if (up != null && down != null) {
             if (data.doPaintBetween()) {
                 area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN);
-            }
-            else {
+            } else {
                 area.setMode(StyledAreaSeriesCollection.FILL_MODE.ABOVE);
             }
             area.addSeries(up);
             area.addSeries(down);
         }
         // Add area to the respective axis.
-        String facetAxisName = data.getUpperFacetName() == null
-            ? data.getLowerFacetName()
-            : data.getUpperFacetName();
+        final String facetAxisName = data.getUpperFacetName() == null ? data.getLowerFacetName() : data.getUpperFacetName();
         addAreaSeries(area, axisIdxForFacet(facetAxisName), visible);
     }
 }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -73,7 +73,7 @@
 
     public static final String CSV_W_HEADER = "export.waterlevel.csv.header.w";
 
-    public static final String CSV_Q_HEADER = "export.waterlevel.csv.header.q";
+    public static final String CSV_Q_HEADER = "common.export.csv.header.q";
 
     /**
      * @deprecated Use {@link WaterlevelDescriptionBuilder} instead.
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/QOutProcessor.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/QOutProcessor.java	Thu Jul 26 15:54:20 2018 +0200
@@ -9,20 +9,18 @@
 package org.dive4elements.river.exports.process;
 
 import org.apache.log4j.Logger;
-import org.jfree.data.xy.XYSeries;
-
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.model.FacetTypes;
-import org.dive4elements.river.artifacts.model.WQKms;
 import org.dive4elements.river.artifacts.model.FlowVelocityData;
-import org.dive4elements.river.model.FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue;
-
+import org.dive4elements.river.artifacts.model.WQKms;
+import org.dive4elements.river.exports.DiagramGenerator;
 import org.dive4elements.river.exports.StyledSeriesBuilder;
 import org.dive4elements.river.exports.XYChartGenerator;
-import org.dive4elements.river.exports.DiagramGenerator;
 import org.dive4elements.river.jfree.StyledXYSeries;
+import org.dive4elements.river.model.FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue;
 import org.dive4elements.river.themes.ThemeDocument;
+import org.jfree.data.xy.XYSeries;
 
 /**
  * Add data to chart/generator.
@@ -31,89 +29,68 @@
  */
 public class QOutProcessor extends DefaultProcessor {
 
-    public static final String I18N_LONGITUDINAL_LABEL =
-        "chart.longitudinal.section.yaxis.second.label";
+    public static final String I18N_LONGITUDINAL_LABEL = "common.export.csv.header.q";
 
-    public static final String
-        I18N_LONGITUDINAL_LABEL_DEFAULT = "Q [m\u00b3/s]";
+    public static final String I18N_LONGITUDINAL_LABEL_DEFAULT = "Q [m\u00b3/s]";
 
     /** Private log. */
-    private static final Logger log =
-            Logger.getLogger(QOutProcessor.class);
+    private static final Logger log = Logger.getLogger(QOutProcessor.class);
 
     @Override
-    public void doOut(
-            DiagramGenerator generator,
-            ArtifactAndFacet bundle,
-            ThemeDocument    theme,
-            boolean          visible) {
-        CallContext context = generator.getContext();
-        Object data = bundle.getData(context);
-        XYSeries series = new StyledXYSeries(
-            bundle.getFacetDescription(), theme);
-        String facetName = bundle.getFacetName();
+    public void doOut(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) {
+        final CallContext context = generator.getContext();
+        final Object data = bundle.getData(context);
+        final XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme);
+        final String facetName = bundle.getFacetName();
 
         if (facetName.equals(FacetTypes.FLOW_VELOCITY_DISCHARGE)) {
             if (data instanceof FlowVelocityData) {
-                FlowVelocityData fData = (FlowVelocityData) data;
+                final FlowVelocityData fData = (FlowVelocityData) data;
                 StyledSeriesBuilder.addPoints(series, fData.getQPoints(), true);
-            }
-            else {
-                FastFlowVelocityMeasurementValue fData =
-                    (FastFlowVelocityMeasurementValue) data;
-                double[][] points = new double[][] {
-                    {fData.getStation()},{fData.getQ()}};
+            } else {
+                final FastFlowVelocityMeasurementValue fData = (FastFlowVelocityMeasurementValue) data;
+                final double[][] points = new double[][] { { fData.getStation() }, { fData.getQ() } };
                 StyledSeriesBuilder.addPoints(series, points, true);
             }
         } else {
-            WQKms wqkms = (WQKms) data;
+            final WQKms wqkms = (WQKms) data;
             StyledSeriesBuilder.addStepPointsKmQ(series, wqkms);
         }
 
-        generator.addAxisSeries(series, axisName, visible);
+        generator.addAxisSeries(series, this.axisName, visible);
     }
 
     @Override
-    public void doOut(
-            XYChartGenerator generator,
-            ArtifactAndFacet bundle,
-            ThemeDocument    theme,
-            boolean          visible,
-            int              index)
-    {
-        CallContext context = generator.getContext();
-        WQKms wqkms = (WQKms) bundle.getData(context);
+    public void doOut(final XYChartGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible, final int index) {
+        final CallContext context = generator.getContext();
+        final WQKms wqkms = (WQKms) bundle.getData(context);
 
-        XYSeries series = new StyledXYSeries(
-            bundle.getFacetDescription(), theme);
+        final XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme);
 
         StyledSeriesBuilder.addStepPointsKmQ(series, wqkms);
 
         generator.addAxisSeries(series, index, visible);
 
-        /* Check if the diagram should be inverted*/
+        /* Check if the diagram should be inverted */
         generator.setInverted(wqkms.guessRTLData());
     }
 
     @Override
-    public String getAxisLabel(DiagramGenerator generator) {
-        return generator.msg(I18N_LONGITUDINAL_LABEL,
-                I18N_LONGITUDINAL_LABEL_DEFAULT);
+    public String getAxisLabel(final DiagramGenerator generator) {
+        return generator.msg(I18N_LONGITUDINAL_LABEL, I18N_LONGITUDINAL_LABEL_DEFAULT);
     }
 
     /**
      * Returns true if facettype is q-type.
      */
     @Override
-    public boolean canHandle(String facetType) {
+    public boolean canHandle(final String facetType) {
         if (facetType == null) {
             return false;
         }
 
-        if (facetType.equals(FacetTypes.STATIC_WQKMS_Q)
-            || facetType.equals(FacetTypes.LONGITUDINAL_Q)
-            || facetType.startsWith(FacetTypes.DISCHARGE_LONGITUDINAL_Q)
-            || facetType.startsWith(FacetTypes.FLOW_VELOCITY_DISCHARGE)) {
+        if (facetType.equals(FacetTypes.STATIC_WQKMS_Q) || facetType.equals(FacetTypes.LONGITUDINAL_Q)
+                || facetType.startsWith(FacetTypes.DISCHARGE_LONGITUDINAL_Q) || facetType.startsWith(FacetTypes.FLOW_VELOCITY_DISCHARGE)) {
             return true;
         }
         return false;
--- a/artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/sq/SQRelationExporter.java	Thu Jul 26 15:54:20 2018 +0200
@@ -9,47 +9,39 @@
 package org.dive4elements.river.exports.sq;
 
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Date;
-import java.util.Locale;
 import java.text.DateFormat;
 import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 
+import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.common.utils.Config;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.access.SQRelationAccess;
+import org.dive4elements.river.artifacts.model.CalculationResult;
+import org.dive4elements.river.artifacts.model.DateRange;
+import org.dive4elements.river.artifacts.model.Parameters;
+import org.dive4elements.river.artifacts.model.sq.SQ;
+import org.dive4elements.river.artifacts.model.sq.SQFractionResult;
+import org.dive4elements.river.artifacts.model.sq.SQMeasurementsJRDataSource;
+import org.dive4elements.river.artifacts.model.sq.SQRelationJRDataSource;
+import org.dive4elements.river.artifacts.model.sq.SQResult;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.exports.AbstractExporter;
+import org.dive4elements.river.utils.Formatter;
+import org.dive4elements.river.utils.RiverUtils;
+
+import au.com.bytecode.opencsv.CSVWriter;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JRPrintPage;
 import net.sf.jasperreports.engine.JasperExportManager;
 import net.sf.jasperreports.engine.JasperFillManager;
 import net.sf.jasperreports.engine.JasperPrint;
-import net.sf.jasperreports.engine.JRPrintPage;
-import net.sf.jasperreports.engine.JRException;
-
-import au.com.bytecode.opencsv.CSVWriter;
-
-import org.dive4elements.artifacts.CallMeta;
-
-import org.dive4elements.river.artifacts.model.CalculationResult;
-import org.dive4elements.river.artifacts.model.sq.SQFractionResult;
-import org.dive4elements.river.artifacts.model.sq.SQResult;
-import org.dive4elements.river.artifacts.model.sq.SQ;
-import org.dive4elements.river.artifacts.model.sq.SQRelationJRDataSource;
-import org.dive4elements.river.artifacts.model.sq.SQMeasurementsJRDataSource;
-import org.dive4elements.river.artifacts.model.Parameters;
-import org.dive4elements.river.artifacts.model.DateRange;
-import org.dive4elements.river.artifacts.access.SQRelationAccess;
-
-import org.dive4elements.river.artifacts.resources.Resources;
-
-import org.dive4elements.river.artifacts.D4EArtifact;
-
-import org.dive4elements.river.exports.AbstractExporter;
-
-import org.dive4elements.river.utils.RiverUtils;
-import org.dive4elements.river.utils.Formatter;
-
-import org.dive4elements.artifacts.common.utils.Config;
-
-import org.apache.log4j.Logger;
 
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
@@ -57,273 +49,182 @@
 public class SQRelationExporter extends AbstractExporter {
 
     /** Private log. */
-    private static final Logger log =
-        Logger.getLogger(SQRelationExporter.class);
-
-    public static final String INFO_COEFF_A =
-        "export.sqrelation.csv.info.coeff.a";
-
-    public static final String INFO_COEFF_B =
-        "export.sqrelation.csv.info.coeff.b";
-
-    public static final String INFO_QMAX =
-        "export.sqrelation.csv.info.qmax";
-
-    public static final String INFO_STDERR =
-        "export.sqrelation.csv.info.stderr";
-
-    public static final String INFO_R2 =
-        "export.sqrelation.csv.info.r2";
-
-    public static final String INFO_NTOT =
-        "export.sqrelation.csv.info.ntot";
-
-    public static final String INFO_NOUTL =
-        "export.sqrelation.csv.info.noutl";
-
-    public static final String INFO_CFERGUSON =
-        "export.sqrelation.csv.info.cferguson";
-
-    public static final String INFO_CDUAN =
-        "export.sqrelation.csv.info.cduan";
-
-    public static final String INFO_PARAM_A =
-        "export.sqrelation.csv.info.param.a";
-
-    public static final String INFO_PARAM_B =
-        "export.sqrelation.csv.info.param.b";
-
-    public static final String INFO_PARAM_C =
-        "export.sqrelation.csv.info.param.c";
-
-    public static final String INFO_PARAM_D =
-        "export.sqrelation.csv.info.param.d";
-
-    public static final String INFO_PARAM_E =
-        "export.sqrelation.csv.info.param.e";
-
-    public static final String INFO_PARAM_F =
-        "export.sqrelation.csv.info.param.f";
-
-    public static final String INFO_Q =
-        "export.sqrelation.csv.info.q";
-
-    public static final String INFO_S_KG =
-        "export.sqrelation.csv.info.s_kg";
-
-    public static final String INFO_DATE =
-        "export.sqrelation.csv.info.date";
-
-    public static final String CSV_PARAMETER =
-        "export.sqrelation.csv.header.parameter";
+    private static final Logger log = Logger.getLogger(SQRelationExporter.class);
 
-    public static final String CSV_STATION =
-        "export.sqrelation.csv.header.station";
-
-    public static final String CSV_KM =
-        "export.sqrelation.csv.header.km";
-
-    public static final String CSV_FUNCTION =
-        "export.sqrelation.csv.header.function";
-
-    public static final String CSV_GAUGE =
-        "export.sqrelation.csv.header.gauge";
-
-    public static final String CSV_COEFF_A =
-        "export.sqrelation.csv.header.coeff.a";
-
-    public static final String CSV_COEFF_B =
-        "export.sqrelation.csv.header.coeff.b";
-
-    public static final String CSV_COEFF_Q =
-        "export.sqrelation.csv.header.coeff.q";
-
-    public static final String CSV_COEFF_R =
-        "export.sqrelation.csv.header.coeff.r";
-
-    public static final String CSV_N_TOTAL =
-        "export.sqrelation.csv.header.n.total";
-
-    public static final String CSV_N_OUTLIERS =
-        "export.sqrelation.csv.header.n.outliers";
+    public static final String INFO_COEFF_A = "export.sqrelation.csv.info.coeff.a";
 
-    public static final String CSV_C_DUAN =
-        "export.sqrelation.csv.header.c.duan";
-
-    public static final String CSV_C_FERGUSON =
-        "export.sqrelation.csv.header.c.ferguson";
-
-    public static final String CSV_QMAX =
-        "export.sqrelation.csv.header.qmax";
-
-    public static final String CSV_SD =
-        "export.sqrelation.csv.header.sd";
-
-    public static final String CSV_S_KG =
-        "export.sqrelation.csv.header.s_kg";
+    public static final String INFO_COEFF_B = "export.sqrelation.csv.info.coeff.b";
 
-    public static final String CSV_Q =
-        "export.sqrelation.csv.header.q";
-
-    public static final String CSV_DATE =
-        "export.sqrelation.csv.header.date";
-
-    public static final String PDF_TITLE=
-        "export.sqrelation.pdf.title";
+    public static final String INFO_QMAX = "export.sqrelation.csv.info.qmax";
 
-    public static final String PDF_HEADER_MODE =
-        "export.sqrelation.pdf.mode";
+    public static final String INFO_STDERR = "export.sqrelation.csv.info.stderr";
 
-    public static final String JASPER_FILE =
-        "export.sqrelation.pdf.file";
+    public static final String INFO_R2 = "export.sqrelation.csv.info.r2";
 
-    public static final String JASPER_MEASUREMENTS_FILE =
-        "export.sqrelation.measurements.pdf.file";
+    public static final String INFO_NTOT = "export.sqrelation.csv.info.ntot";
 
-    protected List<SQResult []> data;
+    public static final String INFO_NOUTL = "export.sqrelation.csv.info.noutl";
+
+    public static final String INFO_CFERGUSON = "export.sqrelation.csv.info.cferguson";
+
+    public static final String INFO_CDUAN = "export.sqrelation.csv.info.cduan";
+
+    public static final String INFO_PARAM_A = "export.sqrelation.csv.info.param.a";
+
+    public static final String INFO_PARAM_B = "export.sqrelation.csv.info.param.b";
+
+    public static final String INFO_PARAM_C = "export.sqrelation.csv.info.param.c";
+
+    public static final String INFO_PARAM_D = "export.sqrelation.csv.info.param.d";
+
+    public static final String INFO_PARAM_E = "export.sqrelation.csv.info.param.e";
+
+    public static final String INFO_PARAM_F = "export.sqrelation.csv.info.param.f";
+
+    public static final String INFO_Q = "export.sqrelation.csv.info.q";
+
+    public static final String INFO_S_KG = "export.sqrelation.csv.info.s_kg";
+
+    public static final String INFO_DATE = "export.sqrelation.csv.info.date";
+
+    public static final String CSV_PARAMETER = "export.sqrelation.csv.header.parameter";
+
+    public static final String CSV_STATION = "export.sqrelation.csv.header.station";
+
+    public static final String CSV_KM = "export.sqrelation.csv.header.km";
+
+    public static final String CSV_FUNCTION = "export.sqrelation.csv.header.function";
+
+    public static final String CSV_GAUGE = "export.sqrelation.csv.header.gauge";
+
+    public static final String CSV_COEFF_A = "export.sqrelation.csv.header.coeff.a";
+
+    public static final String CSV_COEFF_B = "export.sqrelation.csv.header.coeff.b";
+
+    public static final String CSV_COEFF_Q = "export.sqrelation.csv.header.coeff.q";
+
+    public static final String CSV_COEFF_R = "export.sqrelation.csv.header.coeff.r";
+
+    public static final String CSV_N_TOTAL = "export.sqrelation.csv.header.n.total";
+
+    public static final String CSV_N_OUTLIERS = "export.sqrelation.csv.header.n.outliers";
+
+    public static final String CSV_C_DUAN = "export.sqrelation.csv.header.c.duan";
+
+    public static final String CSV_C_FERGUSON = "export.sqrelation.csv.header.c.ferguson";
+
+    public static final String CSV_QMAX = "export.sqrelation.csv.header.qmax";
+
+    public static final String CSV_SD = "export.sqrelation.csv.header.sd";
+
+    public static final String CSV_S_KG = "export.sqrelation.csv.header.s_kg";
+
+    public static final String CSV_Q = "common.export.csv.header.q";
+
+    public static final String CSV_DATE = "export.sqrelation.csv.header.date";
+
+    public static final String PDF_TITLE = "export.sqrelation.pdf.title";
+
+    public static final String PDF_HEADER_MODE = "export.sqrelation.pdf.mode";
+
+    public static final String JASPER_FILE = "export.sqrelation.pdf.file";
+
+    public static final String JASPER_MEASUREMENTS_FILE = "export.sqrelation.measurements.pdf.file";
+
+    protected List<SQResult[]> data;
 
     public SQRelationExporter() {
-        data = new ArrayList<SQResult []>();
+        this.data = new ArrayList<>();
     }
 
     @Override
     protected void addData(Object d) {
         if (d instanceof CalculationResult) {
-            d = ((CalculationResult)d).getData();
-            if (d instanceof SQResult []) {
-                data.add((SQResult [])d);
+            d = ((CalculationResult) d).getData();
+            if (d instanceof SQResult[]) {
+                this.data.add((SQResult[]) d);
             }
         }
     }
 
-    protected void writeCSVHeader(CSVWriter writer) {
-        writer.writeNext(new String[] {
-            msg(CSV_KM),
-            msg(CSV_PARAMETER),
-            msg(CSV_COEFF_A),
-            msg(CSV_COEFF_B),
-            msg(CSV_SD),
-            msg(CSV_QMAX),
-            msg(CSV_COEFF_R),
-            msg(CSV_N_TOTAL),
-            msg(CSV_N_OUTLIERS),
-            msg(CSV_C_DUAN),
-            msg(CSV_C_FERGUSON),
-            msg(CSV_S_KG),
-            msg(CSV_Q),
-            msg(CSV_DATE)
-        });
+    protected void writeCSVHeader(final CSVWriter writer) {
+        writer.writeNext(new String[] { msg(CSV_KM), msg(CSV_PARAMETER), msg(CSV_COEFF_A), msg(CSV_COEFF_B), msg(CSV_SD), msg(CSV_QMAX), msg(CSV_COEFF_R),
+                msg(CSV_N_TOTAL), msg(CSV_N_OUTLIERS), msg(CSV_C_DUAN), msg(CSV_C_FERGUSON), msg(CSV_S_KG), msg(CSV_Q), msg(CSV_DATE) });
     }
 
     @Override
-    protected void writeCSVData(CSVWriter writer) {
+    protected void writeCSVData(final CSVWriter writer) {
         log.debug("writeCSVData");
 
-        writeCSVInfo(writer, new String[] {
-                msg(INFO_PARAM_A),
-                msg(INFO_PARAM_B),
-                msg(INFO_PARAM_C),
-                msg(INFO_PARAM_D),
-                msg(INFO_PARAM_E),
-                msg(INFO_PARAM_F),
-                msg(INFO_COEFF_A),
-                msg(INFO_COEFF_B),
-                msg(INFO_QMAX),
-                msg(INFO_STDERR),
-                msg(INFO_R2),
-                msg(INFO_NTOT),
-                msg(INFO_NOUTL),
-                msg(INFO_CFERGUSON),
-                msg(INFO_CDUAN),
-                msg(INFO_S_KG),
-                msg(INFO_Q),
-                msg(INFO_DATE)
-            });
+        writeCSVInfo(writer,
+                new String[] { msg(INFO_PARAM_A), msg(INFO_PARAM_B), msg(INFO_PARAM_C), msg(INFO_PARAM_D), msg(INFO_PARAM_E), msg(INFO_PARAM_F),
+                        msg(INFO_COEFF_A), msg(INFO_COEFF_B), msg(INFO_QMAX), msg(INFO_STDERR), msg(INFO_R2), msg(INFO_NTOT), msg(INFO_NOUTL),
+                        msg(INFO_CFERGUSON), msg(INFO_CDUAN), msg(INFO_S_KG), msg(INFO_Q), msg(INFO_DATE) });
 
         writeCSVHeader(writer);
 
-        for (SQResult [] results: data) {
-            for (SQResult result: results) {
+        for (final SQResult[] results : this.data) {
+            for (final SQResult result : results) {
                 writer.writeAll(data2StringArrays(result, true));
             }
         }
     }
 
-    protected List<String[]> data2StringArrays(
-        SQResult result,
-        boolean includeMeasurements
-    ) {
-        String km = Formatter.getSQRelationKM(context
-                    ).format(result.getKm());
-        List<String[]> retval = new ArrayList<String[]>();
+    protected List<String[]> data2StringArrays(final SQResult result, final boolean includeMeasurements) {
+        final String km = Formatter.getSQRelationKM(this.context).format(result.getKm());
+        final List<String[]> retval = new ArrayList<>();
 
-        NumberFormat sqAFormatter = Formatter.getSQRelationA(context);
-        NumberFormat sqBFormatter = Formatter.getSQRelationB(context);
-        NumberFormat fThreeFormatter = Formatter.getFormatter(context, 3, 3);
-        NumberFormat fTwoFormatter = Formatter.getFormatter(context, 2, 2);
-        NumberFormat fZeroFormatter = Formatter.getFormatter(context, 0, 0);
-        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT,
-                Resources.getLocale(context.getMeta()));
+        final NumberFormat sqAFormatter = Formatter.getSQRelationA(this.context);
+        final NumberFormat sqBFormatter = Formatter.getSQRelationB(this.context);
+        final NumberFormat fThreeFormatter = Formatter.getFormatter(this.context, 3, 3);
+        final NumberFormat fTwoFormatter = Formatter.getFormatter(this.context, 2, 2);
+        final NumberFormat fZeroFormatter = Formatter.getFormatter(this.context, 0, 0);
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Resources.getLocale(this.context.getMeta()));
 
         for (int i = 0; i < SQResult.NUMBER_FRACTIONS; ++i) {
-            SQFractionResult fraction = result.getFraction(i);
+            final SQFractionResult fraction = result.getFraction(i);
 
-            String name = result.getFractionName(i);
+            final String name = result.getFractionName(i);
 
-            Parameters parameters = fraction.getParameters();
+            final Parameters parameters = fraction.getParameters();
 
             if (parameters == null) {
                 continue;
             }
 
             String a, b, sd, o, t, max_q, c_ferguson, c_duan, r2;
-            a  = sqAFormatter.format(parameters.getValue(0, "a"));
-            b  = sqBFormatter.format(parameters.getValue(0, "b"));
+            a = sqAFormatter.format(parameters.getValue(0, "a"));
+            b = sqBFormatter.format(parameters.getValue(0, "b"));
 
             /* The std_dev parameter contains the standard error actually */
             sd = fThreeFormatter.format(parameters.getValue(0, "std_dev"));
             max_q = fZeroFormatter.format(parameters.getValue(0, "max_q"));
-            c_ferguson = fTwoFormatter.format(
-                parameters.getValue(0, "c_ferguson"));
+            c_ferguson = fTwoFormatter.format(parameters.getValue(0, "c_ferguson"));
             c_duan = fTwoFormatter.format(parameters.getValue(0, "c_duan"));
             r2 = fTwoFormatter.format(parameters.getValue(0, "r2"));
 
-
-            o  = String.valueOf(fraction.totalNumOutliers());
-            t  = String.valueOf(fraction.numMeasurements());
+            o = String.valueOf(fraction.totalNumOutliers());
+            t = String.valueOf(fraction.numMeasurements());
 
             if (includeMeasurements) {
-                for (SQ sq: fraction.getMeasurements()) {
-                    retval.add(new String[] {
-                        km,
-                        name,
-                        a,
-                        b,
-                        sd, // 4
+                for (final SQ sq : fraction.getMeasurements()) {
+                    retval.add(new String[] { km, name, a, b, sd, // 4
+                            max_q, // 5
+                            r2, // 6
+                            t, // 7
+                            o, // 8
+                            c_duan, // 9
+                            c_ferguson, // 10
+                            fThreeFormatter.format(sq.getS()), fZeroFormatter.format(sq.getQ()), df.format(sq.getDate()) });
+                }
+            } else {
+                retval.add(new String[] { km, name, a, b, sd, // 4
                         max_q, // 5
                         r2, // 6
                         t, // 7
                         o, // 8
                         c_duan, // 9
-                        c_ferguson, // 10
-                        fThreeFormatter.format(sq.getS()),
-                        fZeroFormatter.format(sq.getQ()),
-                        df.format(sq.getDate())
-                    });
-                }
-            } else {
-                retval.add(new String[] {
-                    km,
-                    name,
-                    a,
-                    b,
-                    sd, // 4
-                    max_q, // 5
-                    r2, // 6
-                    t, // 7
-                    o, // 8
-                    c_duan, // 9
-                    c_ferguson // 10
+                        c_ferguson // 10
                 });
             }
 
@@ -331,14 +232,13 @@
         return retval;
     }
 
-
     protected SQRelationJRDataSource createJRData() {
-        SQRelationJRDataSource source = new SQRelationJRDataSource();
+        final SQRelationJRDataSource source = new SQRelationJRDataSource();
 
         addMetaData(source);
-        for (SQResult [] results: data) {
-            for (SQResult result: results) {
-                for (String[] res: data2StringArrays(result, false)) {
+        for (final SQResult[] results : this.data) {
+            for (final SQResult result : results) {
+                for (final String[] res : data2StringArrays(result, false)) {
                     source.addData(res);
                 }
             }
@@ -347,35 +247,24 @@
     }
 
     protected SQMeasurementsJRDataSource createMeasurementJRData() {
-        SQMeasurementsJRDataSource source = new SQMeasurementsJRDataSource();
-        NumberFormat fZeroFormatter = Formatter.getFormatter(context, 0, 0);
-        NumberFormat fThreeFormatter = Formatter.getFormatter(context, 3, 3);
-        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT,
-                Resources.getLocale(context.getMeta()));
+        final SQMeasurementsJRDataSource source = new SQMeasurementsJRDataSource();
+        final NumberFormat fZeroFormatter = Formatter.getFormatter(this.context, 0, 0);
+        final NumberFormat fThreeFormatter = Formatter.getFormatter(this.context, 3, 3);
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Resources.getLocale(this.context.getMeta()));
 
-        for (SQResult [] results: data) {
-            for (SQResult result: results) {
+        for (final SQResult[] results : this.data) {
+            for (final SQResult result : results) {
                 for (int i = 0; i < SQResult.NUMBER_FRACTIONS; ++i) {
-                    String name = result.getFractionName(i);
-                    SQFractionResult fraction = result.getFraction(i);
-                    for (SQ sq: fraction.getMeasurements()) {
-                        source.addData(new String[] {
-                            name,
-                            fThreeFormatter.format(sq.getS()),
-                            fZeroFormatter.format(sq.getQ()),
-                            df.format(sq.getDate()),
-                            null
-                        });
+                    final String name = result.getFractionName(i);
+                    final SQFractionResult fraction = result.getFraction(i);
+                    for (final SQ sq : fraction.getMeasurements()) {
+                        source.addData(
+                                new String[] { name, fThreeFormatter.format(sq.getS()), fZeroFormatter.format(sq.getQ()), df.format(sq.getDate()), null });
                     }
                     for (int j = 0; j < fraction.numIterations(); j++) {
-                        for (SQ sq: fraction.getOutliers(j)) {
-                            source.addData(new String[] {
-                                name,
-                                fThreeFormatter.format(sq.getS()),
-                                fZeroFormatter.format(sq.getQ()),
-                                df.format(sq.getDate()),
-                                Integer.toString(j + 1)
-                            });
+                        for (final SQ sq : fraction.getOutliers(j)) {
+                            source.addData(new String[] { name, fThreeFormatter.format(sq.getS()), fZeroFormatter.format(sq.getQ()), df.format(sq.getDate()),
+                                    Integer.toString(j + 1) });
                         }
                     }
                 }
@@ -384,39 +273,30 @@
         return source;
     }
 
-    protected void addMetaData(SQRelationJRDataSource source) {
-        CallMeta meta = context.getMeta();
+    protected void addMetaData(final SQRelationJRDataSource source) {
+        final CallMeta meta = this.context.getMeta();
 
-        D4EArtifact arti = (D4EArtifact) master;
+        final D4EArtifact arti = (D4EArtifact) this.master;
 
-        source.addMetaData ("river", RiverUtils.getRivername(arti));
+        source.addMetaData("river", RiverUtils.getRivername(arti));
 
-        Locale locale = Resources.getLocale(meta);
-        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        final Locale locale = Resources.getLocale(meta);
+        final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
 
         source.addMetaData("date", df.format(new Date()));
 
-        SQRelationAccess access = new SQRelationAccess(arti);
-        source.addMetaData(
-            "location", "KM " + getKmFormatter().format(access.getLocation()));
-
-        DateRange period = access.getPeriod();
-        source.addMetaData("periods", df.format(period.getFrom()) + " - " +
-            df.format(period.getTo()));
+        final SQRelationAccess access = new SQRelationAccess(arti);
+        source.addMetaData("location", "KM " + getKmFormatter().format(access.getLocation()));
 
-        source.addMetaData("outliertest", Resources.getMsg(meta,
-                    access.getOutlierMethod(),
-                    access.getOutlierMethod()));
-        source.addMetaData(
-            "outliers", Formatter.getRawFormatter(context).format(
-                    access.getOutliers()));
+        final DateRange period = access.getPeriod();
+        source.addMetaData("periods", df.format(period.getFrom()) + " - " + df.format(period.getTo()));
 
-        source.addMetaData("calculation", Resources.getMsg(
-                                            locale,
-                                            PDF_HEADER_MODE,
-                                            "SQRelation"));
+        source.addMetaData("outliertest", Resources.getMsg(meta, access.getOutlierMethod(), access.getOutlierMethod()));
+        source.addMetaData("outliers", Formatter.getRawFormatter(this.context).format(access.getOutliers()));
 
-        String measurementStationName = access.getMeasurementStationName();
+        source.addMetaData("calculation", Resources.getMsg(locale, PDF_HEADER_MODE, "SQRelation"));
+
+        final String measurementStationName = access.getMeasurementStationName();
 
         if (measurementStationName != null) {
             source.addMetaData("msName", measurementStationName);
@@ -424,8 +304,7 @@
             source.addMetaData("msName", "");
         }
 
-        String measurementStationGaugeName = access
-            .getMeasurementStationGaugeName();
+        final String measurementStationGaugeName = access.getMeasurementStationGaugeName();
 
         if (measurementStationGaugeName != null) {
             source.addMetaData("msGauge", measurementStationGaugeName);
@@ -436,44 +315,32 @@
     }
 
     @Override
-    protected void writePDF(OutputStream out) {
+    protected void writePDF(final OutputStream out) {
         log.debug("write PDF");
-        SQRelationJRDataSource source = createJRData();
-        SQMeasurementsJRDataSource measureSource = createMeasurementJRData();
-
-        String jasperFile = Resources.getMsg(
-                context.getMeta(),
-                JASPER_FILE,
-                "/jasper/sqrelation_en.jasper");
-        String jasperMeasurementsFile = Resources.getMsg(
-                context.getMeta(),
-                JASPER_MEASUREMENTS_FILE,
-                "/jasper/sqmeasurements_en.jasper");
-        String confPath = Config.getConfigDirectory().toString();
-
+        final SQRelationJRDataSource source = createJRData();
+        final SQMeasurementsJRDataSource measureSource = createMeasurementJRData();
 
-        Map parameters = new HashMap();
-        parameters.put("ReportTitle", Resources.getMsg(
-                    context.getMeta(), PDF_TITLE, "Exported Data"));
+        final String jasperFile = Resources.getMsg(this.context.getMeta(), JASPER_FILE, "/jasper/sqrelation_en.jasper");
+        final String jasperMeasurementsFile = Resources.getMsg(this.context.getMeta(), JASPER_MEASUREMENTS_FILE, "/jasper/sqmeasurements_en.jasper");
+        final String confPath = Config.getConfigDirectory().toString();
+
+        final Map parameters = new HashMap();
+        parameters.put("ReportTitle", Resources.getMsg(this.context.getMeta(), PDF_TITLE, "Exported Data"));
         try {
-            /* Page numbers start have a built in offset of 1 so this
-             * is fine. */
-            JasperPrint p2 = JasperFillManager.fillReport(
-                confPath + jasperMeasurementsFile,
-                parameters,
-                measureSource);
+            /*
+             * Page numbers start have a built in offset of 1 so this
+             * is fine.
+             */
+            final JasperPrint p2 = JasperFillManager.fillReport(confPath + jasperMeasurementsFile, parameters, measureSource);
             parameters.put("MEASUREMENT_PAGE_NUM", p2.getPages().size());
-            JasperPrint p1 = JasperFillManager.fillReport(
-                confPath + jasperFile,
-                parameters,
-                source);
-            for (Object page: p2.getPages()) {
-                JRPrintPage object = (JRPrintPage)page;
+            final JasperPrint p1 = JasperFillManager.fillReport(confPath + jasperFile, parameters, source);
+            for (final Object page : p2.getPages()) {
+                final JRPrintPage object = (JRPrintPage) page;
                 p1.addPage(object);
             }
             JasperExportManager.exportReportToPdfStream(p1, out);
         }
-        catch(JRException je) {
+        catch (final JRException je) {
             log.warn("Error generating PDF Report!", je);
         }
     }
--- a/artifacts/src/main/resources/messages.properties	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties	Thu Jul 26 15:54:20 2018 +0200
@@ -191,10 +191,8 @@
 chart.longitudinal.section.locsubtitle = {0} km {1,number,#.###}
 chart.longitudinal.section.xaxis.label = {0}-km
 chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 chart.discharge.curve.title = Discharge Curve
-chart.discharge.curve.xaxis.label = Q [m\u00b3/s]
 chart.discharge.curve.yaxis.label = W [{0}]
 chart.discharge.curve.yaxis.cm.label = W [cm]
 chart.discharge.curve.curve.valid.from = {0} (valid from {1,date,short})
@@ -209,16 +207,13 @@
 chart.duration.curve.subtitle = {0}-km: {1,number,#.###}
 chart.duration.curve.xaxis.label = Duration of Non-Exceedence [Days]
 chart.duration.curve.yaxis.label.w = W [{0}]
-chart.duration.curve.yaxis.label.q = Q [m\u00b3/s]
 chart.duration.curve.curve.w = Waterlevel duration curve for {0} (km: {1})
 chart.duration.curve.curve.q = Discharge duration curve for {0} (km: {1})
 chart.historical.discharge.title = Historical Discharge Curves for Gauge {0}
 chart.historical.discharge.subtitle = Gauge {0} {1,date,medium} - {2,date,medium}
-chart.historical.discharge.xaxis.label = Time
-chart.historical.discharge.yaxis.second.label = Q [m\u00b3/s]
+chart.historical.discharge.xaxis.label = Time 
 chart.historical.discharge.yaxis.label = W [cm]
 chart.historical.discharge.wq.title = Discharge Curves
-chart.historical.discharge.wq.xaxis.label = Q [m\u00b3/s]
 chart.historical.discharge.wq.yaxis.label = W [cm]
 
 chart.reference.curve.title = Reference Curve
@@ -402,7 +397,7 @@
 
 export.waterlevel.csv.header.km = River-Km
 export.waterlevel.csv.header.w = W [{0}]
-export.waterlevel.csv.header.q = Q [m\u00b3/s]
+common.export.csv.header.q = Q [m\u00b3/s]
 export.waterlevel.csv.header.q.desc = Description
 export.waterlevel.csv.header.location = Location
 export.waterlevel.csv.header.gauge = Reference Gauge
@@ -416,14 +411,11 @@
 export.waterlevel.csv.meta.w = # W (NN + m): {0} - {1}
 export.waterlevel.csv.not.in.gauge.range = Outside selected gauge
 export.computed.discharge.curve.csv.header.w = W [{0}]
-export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s]
 export.duration.curve.csv.header.duration = D [Days]
 export.duration.curve.csv.header.w = W [{0}]
-export.duration.curve.csv.header.q = Q [m\u00b3/s]
 export.discharge.longitudinal.section.csv.header.km = River-Km
 export.discharge.longitudinal.section.csv.header.w = W [NN + m]
 export.discharge.longitudinal.section.csv.header.cw = W corr. [NN + m]
-export.discharge.longitudinal.section.csv.header.q = Q [m\u00b3/s]
 export.discharge.curve.at.gauge.header = Dischargetable for {1}/{0} since {2} datum[{4}] = {3}
 export.discharge.curve.at.header = Computed discharge curve for {0} {0}-km: {1}
 export.historical.discharge.csv.header.timerange = Timerange
@@ -457,7 +449,6 @@
 export.flow_velocity.csv.header.v_total = v Total Channel
 export.flow_velocity.csv.header.v_main = v Main Channel
 export.flow_velocity.csv.header.tau_main = Bottom shear stress Main Channel
-export.flow_velocity.csv.header.q = Q [m\u00b3/s]
 export.flow_velocity.csv.header.locations = Location
 export.bedheight_middle.csv.header.km = River km
 export.bedheight_middle.csv.header.sounding = Sounding / Epoch
@@ -511,7 +502,6 @@
 export.sqrelation.csv.header.sd = Standard error
 export.sqrelation.csv.header.qmax = Q max, measured [m\u00b3/s]
 export.sqrelation.csv.header.s_kg = S [kg/s]
-export.sqrelation.csv.header.q = Q [m\u00b3/s]
 export.sqrelation.csv.header.date = Measurement date
 export.sqrelation.pdf.file = /jasper/sqrelation_en.jasper
 export.sqrelation.measurements.pdf.file = /jasper/sqmeasurements_en.jasper
@@ -736,7 +726,6 @@
 fix.km.chart.q.sector.border2=HQ5
 fix.km.chart.label.date=yyyy/MM/dd
 fix.km.chart.title=Fixings {0} km {1,number,#.###}
-fix.km.chart.q.axis=Q [m\u00b3/s]
 fix.km.chart.w.axis=W [NN + m]
 fix.km.chart.measured=measured
 fix.km.chart.interpolated=interpolated
@@ -765,7 +754,6 @@
 area.label.template = Area = %s m\u00b2
 
 gauge.discharge.service.chart.title = Discharge Tables at Gauge {0}
-gauge.discharge.service.chart.x.title = Q [m\u00b3/s]
 gauge.discharge.service.chart.y.title = W [cm]
 gauge.discharge.service.chart.series.title = Discharge Curve {0,date,short} - {1,date,short}
 gauge.discharge.service.chart.series.title.master = Current Discharge Curve since {0,date,short}
@@ -895,17 +883,17 @@
 sinfo.export.flow_depth.csv.meta.creation.label = Time of creation
 sinfo.export.flow_depth.csv.meta.river = # {0}: {1}
 sinfo.export.flow_depth.csv.meta.river.label = Gew\u00e4sser
-sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
-sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
-sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
-sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
-sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
-sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
+common.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
+common.export.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
+common.export.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+common.export.csv.meta.header.sounding.evaluator = # Auswerter: {0}
+common.export.csv.meta.header.sounding.prj = # Lagesystem: {0}
+common.export.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
+common.export.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
+common.export.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
+common.export.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
+common.export.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
+common.export.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}
 sinfo.export.flow_depth.csv.meta.range.label = Range (km)
 sinfo.export.flow_depth.pdf.meta.calculation.label = Angewandte Gleichung
@@ -924,7 +912,7 @@
 sinfo.export.flow_depth.csv.header.mean_bed_height = Mittlere Sohlh\u00f6he
 sinfo.export.flow_depth.csv.header.mean_bed_height.short = Mittlere Sohl-
 sinfo.export.flow_depth.csv.header.sounding = Peilung/Epoche
-sinfo.export.flow_depth.csv.header.location = Lage
+common.export.csv.header.location = Lage
 
 sinfo.export.flood_duration.csv.header.riverside = Uferseite
 sinfo.export.flood_duration.csv.header.infrastructure.height = H\u00f6he der Infrastruktur
@@ -1228,6 +1216,8 @@
 state.bundu.wst.load.function = Ausgleichsfunktion
 state.bundu.wst.function = Auswahl der Ausgleichsfunktion
 
+bundu.wst.export.csv.meta.header.bezugswst = Bezugswasserstand
+
 common.client.ui.selection = Selection
 common.client.ui.from = from
 common.client.ui.to = to
--- a/artifacts/src/main/resources/messages_de.properties	Thu Jul 26 11:16:06 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Thu Jul 26 15:54:20 2018 +0200
@@ -191,10 +191,8 @@
 chart.longitudinal.section.locsubtitle = {0} km {1,number,#.###}
 chart.longitudinal.section.xaxis.label = {0}-km
 chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 chart.discharge.curve.title = Abflusskurve
-chart.discharge.curve.xaxis.label = Q [m\u00b3/s]
 chart.discharge.curve.yaxis.label = W [{0}]
 chart.discharge.curve.yaxis.cm.label = W [cm]
 chart.discharge.curve.curve.valid.from = {0} (g\u00fcltig ab {1,date,medium})
@@ -209,16 +207,13 @@
 chart.duration.curve.subtitle = {0}-km: {1,number,#.###}
 chart.duration.curve.xaxis.label = Unterschreitungsdauer [Tage]
 chart.duration.curve.yaxis.label.w = W [{0}]
-chart.duration.curve.yaxis.label.q = Q [m\u00b3/s]
 chart.duration.curve.curve.w = Wasserstandsdauerline f\u00fcr {0} (km:{1})
 chart.duration.curve.curve.q = Abflussdauerline f\u00fcr {0} (km:{1})
 chart.historical.discharge.title = Historische Abflusskurven
 chart.historical.discharge.subtitle = Pegel {0} {1,date,medium} - {2,date,medium}
 chart.historical.discharge.xaxis.label = Zeit
-chart.historical.discharge.yaxis.second.label = Q [m\u00b3/s]
 chart.historical.discharge.yaxis.label = W [cm]
 chart.historical.discharge.wq.title = Abflusskurven
-chart.historical.discharge.wq.xaxis.label = Q [m\u00b3/s]
 chart.historical.discharge.wq.yaxis.label = W [cm]
 
 chart.reference.curve.title = Bezugslinie
@@ -402,7 +397,7 @@
 
 export.waterlevel.csv.header.km = Fluss-Km
 export.waterlevel.csv.header.w = W [{0}]
-export.waterlevel.csv.header.q = Q [m\u00b3/s]
+common.export.csv.header.q = Q [m\u00b3/s]
 export.waterlevel.csv.header.q.desc = Bezeichnung
 export.waterlevel.csv.header.location = Lage
 export.waterlevel.csv.header.gauge = Bezugspegel
@@ -416,14 +411,11 @@
 export.waterlevel.csv.meta.w = # W (NN + m): {0} - {1}
 export.waterlevel.csv.not.in.gauge.range = au\u00dferh. d. Bez.pegels
 export.computed.discharge.curve.csv.header.w = W [{0}]
-export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s]
 export.duration.curve.csv.header.duration = D [Tage]
 export.duration.curve.csv.header.w = W [{0}]
-export.duration.curve.csv.header.q = Q [m\u00b3/s]
 export.discharge.longitudinal.section.csv.header.km = Fluss-Km
 export.discharge.longitudinal.section.csv.header.w = W [NN + m]
 export.discharge.longitudinal.section.csv.header.cw = W korr. [NN + m]
-export.discharge.longitudinal.section.csv.header.q = Q [m\u00b3/s]
 export.discharge.curve.at.gauge.header = Abflusstafel f\u00fcr {1}/{0} ab {2} PNP[{4}] = {3}
 export.discharge.curve.at.header = Berechnete Abflusstafel f\u00fcr {0}, km {1}
 export.historical.discharge.csv.header.timerange = Zeitraum
@@ -457,7 +449,6 @@
 export.flow_velocity.csv.header.v_total = v Gesamtgerinne [m/s]
 export.flow_velocity.csv.header.v_main = v Hauptgerinne [m/s]
 export.flow_velocity.csv.header.tau_main = Sohlschubspannung Hauptgerinne [N/m\u00b2]
-export.flow_velocity.csv.header.q = Q [m\u00b3/s]
 export.flow_velocity.csv.header.locations = Streckendaten
 export.bedheight_middle.csv.header.km = Fluss-km
 export.bedheight_middle.csv.header.sounding = Peilung / Epoche
@@ -511,7 +502,6 @@
 export.sqrelation.csv.header.sd = Standardfehler
 export.sqrelation.csv.header.qmax = Q max, gemessen [m\u00b3/s]
 export.sqrelation.csv.header.s_kg = S [kg/s]
-export.sqrelation.csv.header.q = Q [m\u00b3/s]
 export.sqrelation.csv.header.date = Messdatum
 export.sqrelation.pdf.file = /jasper/sqrelation.jasper
 export.sqrelation.measurements.pdf.file = /jasper/sqmeasurements.jasper
@@ -736,7 +726,6 @@
 fix.km.chart.q.sector.border2=HQ5
 fix.km.chart.label.date=dd.MM.yyyy
 fix.km.chart.title=Fixierungen {0} km {1,number,#.###}
-fix.km.chart.q.axis=Q [m\u00b3/s]
 fix.km.chart.w.axis=W [NN + m]
 fix.km.chart.measured=gemessen
 fix.km.chart.interpolated=interpoliert
@@ -765,7 +754,6 @@
 area.label.template = Fl\u00e4che = %s m\u00b2
 
 gauge.discharge.service.chart.title = Abflusskurven am Pegel {0}
-gauge.discharge.service.chart.x.title = Q [m\u00b3/s]
 gauge.discharge.service.chart.y.title = W [cm]
 gauge.discharge.service.chart.series.title = Abflusskurve {0,date,short} - {1,date,short}
 gauge.discharge.service.chart.series.title.master = Aktuelle Abflusskurve ab {0,date,short}
@@ -895,17 +883,17 @@
 sinfo.export.flow_depth.csv.meta.creation.label = Datum der Erstellung
 sinfo.export.flow_depth.csv.meta.river = # {0}: {1}
 sinfo.export.flow_depth.csv.meta.river.label = Gew\u00e4sser
-sinfo.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
-sinfo.export.flow_depth.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.type = # Aufnahmeart: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.evaluator = # Auswerter: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.prj = # Lagesystem: {0}
-sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
-sinfo.export.flow_depth.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
-sinfo.export.flow_depth.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
-sinfo.export.flow_depth.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
-sinfo.export.flow_depth.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
-sinfo.export.flow_depth.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
+common.export.flow_depth.csv.meta.header.sounding = ##METADATEN PEILUNG
+common.export.csv.meta.header.sounding.year = # Jahr der Peilung: {0}
+common.export.csv.meta.header.sounding.type = # Aufnahmeart: {0}
+common.export.csv.meta.header.sounding.evaluator = # Auswerter: {0}
+common.export.csv.meta.header.sounding.prj = # Lagesystem: {0}
+common.export.csv.meta.header.sounding.elevationmodel = # H\u00f6hensystem: {0} 
+common.export.csv.meta.header.sounding.elevationmodel.original = # urspr\u00fcngliches H\u00f6hensystem: {0}
+common.export.csv.meta.header.waterlevel = ##METADATEN WASSERSPIEGELLAGE
+common.export.csv.meta.header.waterlevel.name = # Bezeichnung der Wasserspiegellage: {0} 
+common.export.csv.meta.header.waterlevel.gauge = # Bezugspegel: {0}
+common.export.csv.meta.header.waterlevel.year = # Jahr/Zeitraum der Wasserspiegellage: {0}
 sinfo.export.flow_depth.csv.meta.range = # {0}: {1} - {2}
 sinfo.export.flow_depth.csv.meta.range.label = Bereich (km)
 sinfo.export.flow_depth.pdf.meta.calculation.label = Angewandte Gleichung
@@ -924,7 +912,7 @@
 sinfo.export.flow_depth.csv.header.mean_bed_height = Mittlere Sohlh\u00f6he
 sinfo.export.flow_depth.csv.header.mean_bed_height.short = Mittlere Sohl-
 sinfo.export.flow_depth.csv.header.sounding = Peilung/Epoche
-sinfo.export.flow_depth.csv.header.location = Lage
+common.export.csv.header.location = Lage
 
 sinfo.export.flood_duration.csv.header.riverside = Uferseite
 sinfo.export.flood_duration.csv.header.infrastructure.height = H\u00f6he der Infrastruktur
@@ -1227,7 +1215,9 @@
 state.bundu.wst.missing_volume = Ermittlung von Fehlvolumina?
 state.bundu.wst.load.function = Ausgleichsfunktion
 state.bundu.wst.function = Auswahl der Ausgleichsfunktion
- 
+
+bundu.wst.export.csv.meta.header.bezugswst = Bezugswasserstand
+  
 common.client.ui.selection = Auswahl
 common.client.ui.from = von
 common.client.ui.to = bis

http://dive4elements.wald.intevation.org