changeset 5777:e95427ed80e5

Merged
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 21 Apr 2013 10:46:59 +0200
parents 1126b9e00378 (current diff) 300c0270c576 (diff)
children 4a1bd43e7aa6
files flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java
diffstat 76 files changed, 2332 insertions(+), 839 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Sun Apr 21 10:46:06 2013 +0200
+++ b/.hgtags	Sun Apr 21 10:46:59 2013 +0200
@@ -41,3 +41,5 @@
 2fa6da26a1421932608ab8c71ef51f260ad77acd 2.9.16
 3e8f7b4bdf20f2f96edaab593dfaaefe2add46f5 2.9.17
 8128622e4b2893d91a30bdd52f7e426f6098ba0c 2.9.18
+c4162d8378a1333f891b584228c9d00b0e367401 2.9.19
+280093510e1d726e034244275a6098f873b7bc9a 3.0.0
--- a/contrib/make_flys_release/bin/run.sh	Sun Apr 21 10:46:06 2013 +0200
+++ b/contrib/make_flys_release/bin/run.sh	Sun Apr 21 10:46:59 2013 +0200
@@ -12,7 +12,7 @@
 
 export CLASSPATH
 
-exec java -Xmx256m \
+exec java -Xmx1024m \
      -server \
      -Djava.awt.headless=true \
      -Dflys.datacage.recommendations.development=false \
--- a/contrib/make_flys_release/make_release.sh	Sun Apr 21 10:46:06 2013 +0200
+++ b/contrib/make_flys_release/make_release.sh	Sun Apr 21 10:46:59 2013 +0200
@@ -65,7 +65,7 @@
 #   --seddb-pass                    Sediment db password. Default: $SEDDBPASS
 #   --seddb-back                    Sediment db backend. Default: $SEDDBBACK
 TOMCAT_PORT=${TOMCAT_PORT:-8282}
-MAPSERVER_URL=${MAPSERVER_URL:-flys-devel.intevation.de}
+MAPSERVER_URL=${MAPSERVER_URL:-http://flys-devel.intevation.de}
 WIKI_URL=${WIKI_URL:-https://flys-intern.intevation.de/Flys-3.0}
 # Prefix to FreeSans.ttf
 FONT_PATH=${FONT_PATH:-/opt/flys}
@@ -187,6 +187,11 @@
 echo "[INFO]: Preparing configuration of web client"
 echo "[INFO]: Tomcat Port: $TOMCAT_PORT"
 echo "[INFO]: Artifact Port: $ARTIFACT_PORT"
+
+#Needs to be done before the tomcat replacement below
+sed -i -e "s@http://localhost:8888/flys/mapfish-print@https://localhost/flys-${VERSION}/flys/mapfish-print@g" \
+    $FLYS_SOURCE_DIR/flys/flys-client/src/main/webapp/WEB-INF/web.xml
+
 sed -i -e "s@http://localhost:8181@http://localhost:$ARTIFACT_PORT@g" \
        -e "s@http://localhost:8888@http://localhost:$TOMCAT_PORT@g" \
     $FLYS_SOURCE_DIR/flys/flys-client/src/main/webapp/WEB-INF/web.xml
@@ -194,12 +199,13 @@
 sed -i -e "s@/tmp/flys-client.log@${LOG_DIR}/client-${VERSION}.log@g" \
     $FLYS_SOURCE_DIR/flys/flys-client/src/main/webapp/WEB-INF/log4j.properties
 
-find $FLYS_SOURCE_DIR/flys/flys-artifacts/src/main/resources/ -name messages\*.properties | \
-    xargs sed -i "s@https://flys-intern.intevation.de/Flys-3.0@${WIKI_URL}@g";
-
+# XXX: Are they really used at runtime?
 find $FLYS_SOURCE_DIR/flys/ -name \*.properties -o -name \*.xsl |  \
     xargs sed -i "s@https://flys-intern.intevation.de@${WIKI_URL}@g";
 
+sed -i -e "s@/usr/share/fonts/truetype/freefont@${FONT_PATH}@g" \
+    $FLYS_SOURCE_DIR/flys/flys-client/src/main/webapp/WEB-INF/config.yaml
+
 if [ ! -f $FLYS_SOURCE_DIR/OpenLayers-2.11.tar.gz ]; then
     echo "INFO: download OpenLayers-2.11 for client"
     cd $FLYS_SOURCE_DIR
@@ -264,10 +270,10 @@
 sed -i "s/8181/$ARTIFACT_PORT/g" \
     $WORK_DIR/server/conf/rest-server.xml
 
-sed -i -e "s@http://example.com/@http://${MAPSERVER_URL}/@g" \
+sed -i -e "s@http://example.com/@${MAPSERVER_URL}/@g" \
     $WORK_DIR/server/conf/floodmap.xml
 
-sed -i -e "s@http://example.com/@http://${MAPSERVER_URL}/@g" \
+sed -i -e "s@http://example.com/@${MAPSERVER_URL}/@g" \
     $WORK_DIR/server/conf/rivermap.xml
 
 sed -i -e "s@/usr/share/fonts/truetype/freefont@${FONT_PATH}@g" \
@@ -284,6 +290,7 @@
     > $WORK_DIR/server/conf/log4j.properties
 
 sed -i -e "s@<dgm-path>/path/to/rivers/</dgm-path>@<dgm-path>${DGM_PATH}</dgm-path>@g" \
+       -e "s@<help-url>http://example.com</help-url>@<help-url>${WIKI_URL}</help-url>@g" \
     $WORK_DIR/server/conf/conf.xml
 
 cat > $WORK_DIR/server/conf/seddb-db.xml << EOF
--- a/flys-artifacts/doc/conf/artifacts/fixanalysis.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/artifacts/fixanalysis.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -284,6 +284,7 @@
                         <facet name="fix_wq_curve" description="WQ curve"/>
                         <facet name="fix_outlier" description="The outliers"/>
                         <facet name="qsectors" description="qsectors."/>
+                        <facet name="fix_events_wqkms"          description="WQKMS-Type of data" />
                         <facet name="other.wqkms.q"          description="W-Type of data" />
                         <facet name="other.wqkms.w"          description="W-Type of data" />
                         <facet name="other.wkms" description="facet.other.wqkms"/>
--- a/flys-artifacts/doc/conf/artifacts/minfo.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/artifacts/minfo.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -179,6 +179,17 @@
                         <facet name="longitudinal_section.w" description="Datacage facet"/>
                         <facet name="bedheight_middle.manualpoints" description="points"/>
                         <facet name="bedheight" description="Datacage facet"/>
+                        <facet name="discharge_longitudinal_section.w"/>
+                        <facet name="other.wqkms.w"/>
+                        <facet name="other.wq"/>
+                        <facet name="other.wqkms.q"/>
+                        <facet name="other.wqkms"/>
+                        <facet name="other.wkms"/>
+                        <facet name="heightmarks_points"/>
+                        <facet name="longitudinal_section.annotations"/>
+                        <facet name="longitudinal_section.w"/>
+                        <facet name="longitudinal_section.q"/>
+                        <facet name="other.wkms.interpol" description="Height over km, like flood protections."/>
                     </facets>
                 </outputmode>
                 <outputmode name="bedheight_middle_export" description="output.bedheight_middle_export" mime-type="text/plain" type="export">
@@ -225,6 +236,19 @@
                         <facet name="fix_sector_average_ls_3" description="Datacage facet"/>
                         <facet name="fix_analysis_events_ls" description="Datacage facet"/>
                         <facet name="fix_reference_events_ls" description="Datacage facet"/>
+                        <facet name="discharge_longitudinal_section.w"/>
+                        <facet name="other.wqkms.w"/>
+                        <facet name="other.wq"/>
+                        <facet name="other.wqkms.q"/>
+                        <facet name="other.wqkms"/>
+                        <facet name="other.wkms"/>
+                        <facet name="heightmarks_points"/>
+                        <facet name="longitudinal_section.annotations"/>
+                        <facet name="longitudinal_section.w"/>
+                        <facet name="longitudinal_section.q"/>
+                        <facet name="w_differences" description="facet.w_differences"/>
+                        <facet name="other.wkms.interpol" description="Height over km, like flood protections."/>
+                        <facet name="morph-width" description="morphologic width, not sounding width!"/>
                     </facets>
                 </outputmode>
                 <outputmode name="bed_difference_epoch" description="output.difference_epoch" mime-type="img/png" type="chart">
@@ -240,6 +264,19 @@
                         <facet name="fix_sector_average_ls_3" description="Datacage facet"/>
                         <facet name="fix_analysis_events_ls" description="Datacage facet"/>
                         <facet name="fix_reference_events_ls" description="Datacage facet"/>
+                        <facet name="discharge_longitudinal_section.w"/>
+                        <facet name="other.wqkms.w"/>
+                        <facet name="other.wq"/>
+                        <facet name="other.wqkms.q"/>
+                        <facet name="other.wqkms"/>
+                        <facet name="other.wkms"/>
+                        <facet name="heightmarks_points"/>
+                        <facet name="longitudinal_section.annotations"/>
+                        <facet name="longitudinal_section.w"/>
+                        <facet name="longitudinal_section.q"/>
+                        <facet name="w_differences" description="facet.w_differences"/>
+                        <facet name="other.wkms.interpol" description="Height over km, like flood protections."/>
+                        <facet name="morph-width" description="morphologic width, not sounding width!"/>
                     </facets>
                 </outputmode>
             </outputmodes>
--- a/flys-artifacts/doc/conf/conf.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/conf.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -128,6 +128,9 @@
             <artifact-factory name="staticsqrelation" description="Factory to create an artifact that generates sq relations from db."
                 ttl="3600000"
                 artifact="de.intevation.flys.artifacts.SQRelationArtifact">de.intevation.artifactdatabase.DefaultArtifactFactory</artifact-factory>
+            <artifact-factory name="morph-width" description="Factory to create an artifact used in minfo datacage."
+                ttl="3600000"
+                artifact="de.intevation.flys.artifacts.StaticMorphWidthArtifact">de.intevation.artifactdatabase.DefaultArtifactFactory</artifact-factory>
 
             <artifact-factory name="gaugedischargecurve" description="Factory to create an artifact to show a discharge curve for a gauge."
                 ttl="3600000"
@@ -409,8 +412,14 @@
             <zoom-scale river="Elbe" range="50" radius="1" />
             <zoom-scale river="Elbe" range="100" radius="5" />
             <zoom-scale river="Elbe" range="500" radius="10" />
+            <zoom-scale river="Rhein" range="50" radius="1" />
+            <zoom-scale river="Rhein" range="100" radius="5" />
+            <zoom-scale river="Rhein" range="500" radius="10" />
         </zoom-scales>
 
         <dgm-path>/path/to/rivers/</dgm-path>
     </options>
+
+    <!-- base url for online help. -->
+    <help-url>http://example.com</help-url>
 </artifact-database>
--- a/flys-artifacts/doc/conf/floodmap.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/floodmap.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -36,28 +36,28 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Donaurna">
-        <srid value="31467"/>
-        <dgm-srid value="25833"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donaurna"/>
-        <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
-    </river>
-    <river name="DonauSK">
+    <river name="Donau (Regensburg Nordarm)">
         <srid value="31467"/>
         <dgm-srid value="25833"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="DonauSK"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau (Regensburg Nordarm)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Fulda">
+    <river name="Donau (Schleusenkanäle)">
+        <srid value="31467"/>
+        <dgm-srid value="25833"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau (Schleusenkanäle)"/>
+        <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
+    </river>
+    <river name="Fulda (Winter)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda (Winter)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Fulda-Sommer">
+    <river name="Fulda (Sommer)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda-Sommer"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda (Sommer)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Lahn">
@@ -72,16 +72,16 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Main-Wehrarm-Limbach">
+    <river name="Main (Wehrarm Limbach)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main-Wehrarm-Limbach"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main (Wehrarm Limbach)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Main-Wehrarm-Volkach">
+    <river name="Main (Wehrarm Volkach)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main-Wehrarm-Volkach"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main (Wehrarm Volkach)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Neckar">
@@ -90,10 +90,10 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Neckar-über-Wehrarme">
+    <river name="Neckar (über Wehrarme)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar-über-Wehrarme"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar (über Wehrarme)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Rhein">
@@ -114,22 +114,22 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saale-Thüringen"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Saar-Wilt-Bogen">
+    <river name="Saar (Wiltinger Bogen)">
         <srid value="31467"/>
         <dgm-srid value="31466"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saar-Wilt-Bogen"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saar (Wiltinger Bogen)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Werra">
+    <river name="Werra (Winter)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra (Winter)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Werra-Sommer">
+    <river name="Werra (Sommer)">
         <srid value="31467"/>
         <dgm-srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra-Sommer"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra (Sommer)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Weser">
--- a/flys-artifacts/doc/conf/meta-data.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/meta-data.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -161,7 +161,7 @@
                   FROM wsts WHERE kind = 1 AND river_id = ${river_id}
                 </dc:statement>
                 <dc:for-each>
-                  <additional name="{$prot_description}">
+		  <additional name="{dc:replace($prot_description, 'Zus.Längsschnitte/', '')}">
                     <dc:context>
                       <dc:call-macro name="SQL-wst_columns_statement"/>
                       <dc:for-each>
@@ -383,7 +383,7 @@
                   FROM wsts WHERE kind = 4 AND river_id = ${river_id}
                 </dc:statement>
                 <dc:for-each>
-                  <heightmark name="{$prot_description}">
+                  <heightmark name="{dc:replace($prot_description, 'HW-Marken/', '')}">
                     <dc:context>
                       <dc:call-macro name="SQL-wst_columns_statement"/>
                       <dc:for-each>
@@ -410,7 +410,8 @@
                   FROM wsts WHERE kind = 4 AND river_id = ${river_id}
                 </dc:statement>
                 <dc:for-each>
-                  <heightmark name="{$prot_description}"><dc:context>
+                  <heightmark name="{$prot_description}">
+                    <dc:context>
                       <dc:call-macro name="SQL-wst_columns_statement"/>
                       <dc:for-each>
                         <column name="{$prot_column_name}"
@@ -466,7 +467,7 @@
                   FROM wsts WHERE kind = 5 AND river_id = ${river_id}
                 </dc:statement>
                 <dc:for-each>
-                  <flood_protection name="{$prot_description}"
+                  <flood_protection name="{dc:replace($prot_description, 'HW-Schutzanlagen/', '')}"
                                     db-id="{$prot_id}"
                                     factory="staticwkms">
                     <dc:context>
@@ -612,7 +613,7 @@
         </dc:macro>
 
         <dc:macro name="morph_width">
-          <morph-width>
+          <morph_width>
             <dc:context>
               <dc:statement>
                 SELECT id   AS width_id
@@ -635,7 +636,7 @@
                 </dc:context>
               </dc:for-each>
             </dc:context>
-          </morph-width>
+          </morph_width>
         </dc:macro>
 
         <dc:macro name="longitudinal-section-prototype">
@@ -673,6 +674,7 @@
              </dc:if>
              <dc:if test="dc:contains($artifact-outs, 'computed_discharge_curve')">
                <dc:call-macro name="mainvalues"/>
+               <dc:call-macro name="basedata_2_fixations_wst"/>
              </dc:if>
              <dc:if test="dc:contains($artifact-outs, 'duration_curve')">
                <dc:call-macro name="mainvalues"/>
@@ -768,6 +770,20 @@
             </dc:comment>
             <dc:if test="dc:contains($artifact-outs, 'bedheight_middle')">
               <dc:call-macro name="sounding-width"/>
+              <dc:call-macro name="basedata_0"/>
+              <dc:call-macro name="basedata_1_additionals"/>
+              <dc:call-macro name="basedata_2_fixations"/>
+              <dc:call-macro name="basedata_3_officials"/>
+              <dc:call-macro name="annotations_per_type"/>
+            </dc:if>
+            <dc:if test="dc:contains($artifact-outs, 'bed_difference_year') or
+                         dc:contains($artifact-outs, 'bed_difference_epoch')">
+              <dc:call-macro name="basedata_0"/>
+              <dc:call-macro name="basedata_1_additionals"/>
+              <dc:call-macro name="basedata_2_fixations"/>
+              <dc:call-macro name="basedata_3_officials"/>
+              <dc:call-macro name="annotations_per_type"/>
+              <dc:call-macro name="morph_width"/>
             </dc:if>
            <dc:comment comment="--- non-recommendations---"/>
           </dc:otherwise>
@@ -792,13 +808,6 @@
 
         </dc:if>
 
-        <dc:comment><!-- XXX: Why is this taken out?
-          <dc:if test="dc:contains($artifact-outs, 'computed_discharge_curve') and (dc:contains($parameters, 'recommended'))">
-             <dc:call-macro name="basedata_2_fixations_wst"/>
-           </dc:if>
-           -->
-        </dc:comment>
-
         <dc:if test="dc:contains($artifact-outs, 'computed_discharge_curve') and not (dc:contains($parameters, 'recommended'))">
           <discharge_table_nn>
             <discharge_table_gauge>
@@ -1216,6 +1225,22 @@
                 </sobek_flooded>
               </dc:if>
             </dc:context>
+            <dc:context>
+              <dc:statement>
+                SELECT DISTINCT
+                b.name AS name
+                FROM hydr_boundaries_poly b
+                WHERE b.river_id = ${river_id}
+                AND b.kind = 1
+                AND b.sobek IS NULL
+                AND b.sectie is NULL
+              </dc:statement>
+              <dc:for-each>
+                <boundary name="{$name}"
+                          factory="wmshydrboundariespolyfactory"
+                          ids="{$river_id};{$name}"/>
+              </dc:for-each>
+            </dc:context>
           </dc:macro>
 
           <dc:macro name="flood-map-hydr-boundaries">
@@ -1779,9 +1804,14 @@
           <dc:macro name="flood-map-complete">
             <buildings>
               <dc:call-macro name="flood-map-buildings"/>
-            </buildings>
-            <catchments factory="externalwmsfactory"
-              ids="http://geoportal.bafg.de/wmsproxy/INSPIRE/DrainageBasin;HY.PHYSICALWATERS.CATCHMENTS;Einzugsgebiet"/>
+          </buildings>
+          <catchments>
+              <catchment_wms factory="externalwmsfactory"
+                  ids="http://geoportal.bafg.de/wmsproxy/INSPIRE/DrainageBasin;HY.PHYSICALWATERS.CATCHMENTS;Einzugsgebiete (WMS)" />
+              <gaugelocations>
+                  <dc:call-macro name="flood-map-gaugelocations"/>
+              </gaugelocations>
+          </catchments>
             <dc:call-macro name="floodmarks"/>
             <hws>
               <dc:call-macro name="hwslines"/>
@@ -1795,12 +1825,6 @@
               <dc:call-macro name="flood-map-hydr-boundaries"/>
             </hydrboundaries>
             <dc:call-macro name="flood-map-uesk"/>
-            <gaugelocations>
-              <dc:call-macro name="flood-map-gaugelocations"/>
-            </gaugelocations>
-            <background factory="wmsbackground" ids="{$river_id}"/>
-            <pegel_had_measurement_points factory="externalwmsfactory"
-              ids="http://geoportal.bafg.de/wmsproxy/HAD/HAD_31;0;HAD Abflussmessstellen"/>
           </dc:macro>
 
         </dc:if>
@@ -1904,7 +1928,7 @@
                 </dc:if>
               </dc:for-each>
             </dc:macro>
-     
+
             <!-- OFFICIAL LINES -->
             <dc:if test="dc:contains($artifact-outs, 'longitudinal_section')">
               <dc:comment comment=".wst -------------------------------"/>
@@ -2219,6 +2243,47 @@
               </waterlevels>
             </dc:macro>
 
+            <dc:macro name="delta-wt-ls">
+              <waterlevels>
+                <dc:for-each>
+                  <dc:context>
+                    <dc:call-macro name="range-filter">
+                      <dc:context>
+                        <dc:statement>
+                          SELECT id AS out_id
+                          FROM outs
+                          WHERE artifact_id = ${a_id} AND name = 'fix_deltawt_curve'
+                        </dc:statement>
+                        <dc:for-each>
+                          <dc:context>
+                            <dc:statement>
+                              SELECT name AS facet_name, num AS facet_num, description AS facet_description
+                              FROM facets
+                              WHERE out_id = ${out_id} and (
+                                name LIKE 'fix_sector_average_dwt%' OR
+                                name LIKE 'fix_deviation_dwt%')
+                              ORDER BY num ASC, name DESC
+                            </dc:statement>
+                            <waterlevels description="{$river} {$a_creation} {$collection_name}">
+                              <dc:for-each>
+                                <dc:element name="${facet_name}">
+                                  <dc:attribute name="description" value="${facet_description}"/>
+                                  <dc:attribute name="ids" value="${facet_num}"/>
+                                  <dc:attribute name="factory" value="fixanalysis"/>
+                                  <dc:attribute name="artifact-id" value="${a_gid}"/>
+                                  <dc:attribute name="out" value="fix_deltawt_curve"/>
+                                </dc:element>
+                              </dc:for-each>
+                            </waterlevels>
+                          </dc:context>
+                        </dc:for-each>
+                      </dc:context>
+                    </dc:call-macro>
+                  </dc:context>
+                </dc:for-each>
+              </waterlevels>
+            </dc:macro>
+
             <dc:macro name="fix-derivate-curve">
               <waterlevels>
                 <dc:for-each>
@@ -2420,50 +2485,6 @@
             </dc:macro>
 
             <dc:comment>
-              MINFO bedheight difference
-            </dc:comment>
-
-            <dc:macro name="bed-difference">
-              <fix_longitudinal_section_curve>
-                <dc:for-each>
-                  <dc:context>
-                    <dc:call-macro name="range-filter">
-                      <dc:context>
-                        <dc:statement>
-                          SELECT a.gid         AS aid,
-                                 f.id          AS fid,
-                                 f.name        AS facet_name,
-                                 f.num         AS facet_num,
-                                 f.description AS facet_description
-                          FROM outs AS o, facets AS f, artifacts AS a
-                          WHERE (
-                              f.name = 'fix_sector_average_ls_0' OR
-                              f.name = 'fix_sector_average_ls_1' OR
-                              f.name = 'fix_sector_average_ls_2' OR
-                              f.name = 'fix_sector_average_ls_3' OR
-                              f.name = 'fix_analysis_events_ls'  OR
-                              f.name = 'fix_reference_events_ls'
-                              ) AND f.out_id = o.id AND o.artifact_id = ${a_id} AND a.id = ${a_id}
-                        </dc:statement>
-                        <fix_longitudinal_section_curve description="{$river} {$a_creation} {$collection_name}">
-                          <dc:for-each>
-                            <dc:element name="${facet_name}">
-                              <dc:attribute name="description" value="${facet_description}"/>
-                              <dc:attribute name="factory" value="fixanalysis"/>
-                              <dc:attribute name="artifact-id" value="${aid}"/>
-                              <dc:attribute name="ids" value="${facet_num}"/>
-                              <dc:attribute name="out" value="fix_longitudinal_section_curve"/>
-                            </dc:element>
-                          </dc:for-each>
-                        </fix_longitudinal_section_curve>
-                      </dc:context>
-                    </dc:call-macro>
-                  </dc:context>
-                </dc:for-each>
-              </fix_longitudinal_section_curve>
-            </dc:macro>
-
-            <dc:comment>
               MINFO bedheight middle
             </dc:comment>
 
@@ -2884,6 +2905,99 @@
               </bedheight-differences>
             </dc:macro>
 
+            <dc:macro name="fixings-year">
+              <fixings>
+                <dc:for-each>
+                  <dc:context>
+                    <dc:call-macro name="range-filter">
+                      <dc:context>
+                        <dc:statement>
+                          SELECT ou.id AS oid
+                          FROM outs AS ou, artifacts AS ar
+                          WHERE
+                            ar.state = 'state.fix.vollmer.compute' AND
+                            ou.name = 'longitudinal_section'
+                        </dc:statement>
+                        <dc:for-each>
+                          <fix description="{$river} {$a_id} {$a_creation} {$collection_name}">
+                            <dc:context>
+                              <dc:statement>
+                                SELECT a.gid         AS aid,
+                                       f.id          AS fid,
+                                       f.name        AS facet_name,
+                                       f.num         AS facet_num,
+                                       f.description AS facet_description
+                                FROM outs AS o, facets AS f, artifacts AS a
+                                WHERE f.name = 'longitudinal_section.w' AND
+                                      f.out_id = o.id         AND
+                                      o.artifact_id = ${a_id} AND
+                                      a.id = ${a_id}
+                              </dc:statement>
+                              <dc:for-each>
+                                <dc:element name="${facet_name}">
+                                  <dc:attribute name="factory" value="fixanalysis"/>
+                                  <dc:attribute name="description" value="${facet_description}"/>
+                                  <dc:attribute name="ids" value="${facet_num}-${facet_name}"/>
+                                  <dc:attribute name="artifact-id" value="${aid}"/>
+                                  <dc:attribute name="out" value="longitudinal_section"/>
+                                </dc:element>
+                              </dc:for-each>
+                            </dc:context>
+                          </fix>
+                        </dc:for-each>
+                      </dc:context>
+                    </dc:call-macro>
+                  </dc:context>
+                </dc:for-each>
+              </fixings>
+            </dc:macro>
+
+            <dc:macro name="waterlevels-discharge">
+              <waterlevels-discharge>
+                <dc:for-each>
+                  <dc:context>
+                    <dc:call-macro name="range-filter">
+                      <dc:context>
+                        <dc:statement>
+                          SELECT id AS oid
+                          FROM outs AS o
+                          WHERE
+                            o.artifact_id = ${a_id} AND
+                            o.name = 'discharge_longitudinal_section'
+                        </dc:statement>
+                        <dc:for-each>
+                          <discharge description="{$oid} {$river} {$a_id} {$a_creation} {$collection_name}">
+                            <dc:context>
+                              <dc:statement>
+                                SELECT a.gid         AS aid,
+                                       f.id          AS fid,
+                                       f.name        AS facet_name,
+                                       f.num         AS facet_num,
+                                       f.description AS facet_description
+                                FROM outs AS o, facets AS f, artifacts AS a
+                                WHERE f.name = 'discharge_longitudinal_section.w' AND
+                                      f.out_id = o.id         AND
+                                      o.artifact_id = ${a_id} AND
+                                      a.id = ${a_id}
+                              </dc:statement>
+                              <dc:for-each>
+                                <dc:element name="${facet_name}">
+                                  <dc:attribute name="factory" value="winfo"/>
+                                  <dc:attribute name="description" value="${facet_description}"/>
+                                  <dc:attribute name="ids" value="${facet_num}-${facet_name}"/>
+                                  <dc:attribute name="artifact-id" value="${aid}"/>
+                                  <dc:attribute name="out" value="longitudinal_section"/>
+                                </dc:element>
+                              </dc:for-each>
+                            </dc:context>
+                          </discharge>
+                        </dc:for-each>
+                      </dc:context>
+                    </dc:call-macro>
+                  </dc:context>
+                </dc:for-each>
+              </waterlevels-discharge>
+            </dc:macro>
 
             <dc:if test="dc:contains($artifact-outs, 'longitudinal_section') or (dc:contains($artifact-outs, 'discharge_longitudinal_section') or (dc:contains($artifact-outs, 'w_differences')))">
               <dc:call-macro name="longitudinal"/>
@@ -2921,11 +3035,9 @@
             <dc:if test="dc:contains($artifact-outs, 'floodmap') or dc:contains($artifact-outs, 'map')">
               <dc:call-macro name="flood-map"/>
             </dc:if>
-            <dc:if test="dc:contains($artifact-outs, 'bed_difference_year') or dc:contains($artifact-outs, 'bed_difference_height_year')">
-              <dc:call-macro name="bed-difference"/>
-            </dc:if>
             <dc:if test="dc:contains($artifact-outs, 'bedheight_middle')">
-              <dc:call-macro name="bed-height"/>
+              <dc:call-macro name="waterlevels-discharge"/>
+              <dc:call-macro name="waterlevels-fix"/>
             </dc:if>
             <dc:if test="dc:contains($artifact-outs, 'floodmap-hws')">
               <dc:call-macro name="floodmap-hws-user"/>
@@ -2946,6 +3058,14 @@
               <dc:call-macro name="flow-velocity"/>
               <dc:call-macro name="sediment-load"/>
             </dc:if>
+            <dc:if test="dc:contains($artifact-outs, 'bed_difference_year') or
+                         dc:contains($artifact-outs, 'bed_difference_epoch')">
+              <dc:call-macro name="waterlevels-discharge"/>
+              <dc:call-macro name="bedheight-differences"/>
+              <dc:call-macro name="differences"/>
+              <dc:call-macro name="waterlevels-fix"/>
+              <dc:call-macro name="delta-wt-ls"/>
+            </dc:if>
           </dc:context>
         </dc:call-macro>
 
--- a/flys-artifacts/doc/conf/rivermap.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/rivermap.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -32,24 +32,24 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Donaurna">
+    <river name="Donau (Regensburg Nordarm)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donaurna"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau (Regensburg Nordarm)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="DonauSK">
+    <river name="Donau (Schleusenkanäle)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="DonauSK"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Donau (Schleusenkanäle)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Fulda">
+    <river name="Fulda (Winter)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda (Winter)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Fulda-Sommer">
+    <river name="Fulda (Sommer)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda-Sommer"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Fulda (Sommer)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Lahn">
@@ -62,14 +62,14 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Main-Wehrarm-Limbach">
+    <river name="Main (Wehrarm Limbach)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main-Wehrarm-Limbach"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main (Wehrarm Limbach)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Main-Wehrarm-Volkach">
+    <river name="Main (Wehrarm Volkach)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main-Wehrarm-Volkach"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Main (Wehrarm Volkach)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Neckar">
@@ -77,9 +77,9 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Neckar-über-Wehrarme">
+    <river name="Neckar (über Wehrarme)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar-über-Wehrarme"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Neckar (über Wehrarme)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Rhein">
@@ -97,19 +97,19 @@
         <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saale-Thüringen"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Saar-Wilt-Bogen">
+    <river name="Saar (Wiltinger Bogen)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saar-Wilt-Bogen"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Saar (Wiltinger Bogen)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Werra">
+    <river name="Werra (Winter)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra (Winter)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
-    <river name="Werra-Sommer">
+    <river name="Werra (Sommer)">
         <srid value="31467"/>
-        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra-Sommer"/>
+        <river-wms url="http://example.com/cgi-bin/river-wms" layers="Werra (Sommer)"/>
         <background-wms url="http://osm.intevation.de/mapcache/?" layers="OSM-WMS-Dienst"/>
     </river>
     <river name="Weser">
--- a/flys-artifacts/doc/conf/themes.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/themes.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -273,6 +273,7 @@
         <mapping from="bedheight_difference.epoch.height1.filtered" to="BedheightDiffAbsHeight1"/>
         <mapping from="bedheight_difference.epoch.height2.filtered" to="BedheightDiffAbsHeight2"/>
         <mapping from="bedheight_difference.height_year.filtered" to="BedheightDiffHeightYear"/>
+        <mapping from="morph-width" to="MorphologicWidth"/>
         <mapping from="relativepoint" to="RelativePoint" />
         <mapping from="sq_a_measurement" to="SQMeasurements" />
         <mapping from="sq_a_outlier" to="SQOutliers" />
@@ -344,7 +345,7 @@
         <mapping from="sedimentload.sand" to="SedimentLoadSand" />
         <mapping from="sedimentload.susp_sand" to="SedimentLoadSuspSand" />
         <mapping from="sedimentload.susp_sand_bed" to="SedimentLoadSuspSandBed" />
-        <mapping from="sedimentload.sudp_sediment" to="SedimentLoadSediment" />
+        <mapping from="sedimentload.susp_sediment" to="SedimentLoadSediment" />
         <mapping from="sedimentload.total_load" to="SedimentLoadTotalLoad" />
         <mapping from="sedimentload.total" to="SedimentLoadTotal" />
     </mappings>
--- a/flys-artifacts/doc/conf/themes/default/longitudinal-section.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/doc/conf/themes/default/longitudinal-section.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -829,6 +829,16 @@
         </fields>
     </theme>
 
+    <theme name="MorphologicWidth">
+        <inherits>
+            <inherit from="LongitudinalSection" />
+        </inherits>
+        <fields>
+            <field name="linecolor" type="Color" default="0, 100, 200" />
+            <field name="showlinelabel" type="boolean"
+                display="Beschriftung anzeigen" default="false" hints="h" />
+        </fields>
+    </theme>
     <!-- Flow velocity -->
     <theme name="FlowVelocityVMainChannel">
         <inherits>
@@ -934,7 +944,7 @@
                 display="Beschriftung anzeigen" default="false" hints="h" />
         </fields>
     </theme>
-     <theme name="SedimentLoadTotal">
+    <theme name="SedimentLoadTotal">
         <inherits>
             <inherit from="LongitudinalSection" />
         </inherits>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/StaticMorphWidthArtifact.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,110 @@
+package de.intevation.flys.artifacts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+
+import de.intevation.artifactdatabase.state.DefaultOutput;
+import de.intevation.artifactdatabase.state.Facet;
+import de.intevation.artifactdatabase.state.FacetActivity;
+import de.intevation.artifacts.ArtifactFactory;
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallMeta;
+import de.intevation.artifacts.common.utils.XMLUtils;
+import de.intevation.flys.artifacts.model.minfo.BedHeightFacet;
+import de.intevation.flys.artifacts.model.minfo.BedHeightFactory;
+import de.intevation.flys.artifacts.model.minfo.MorphologicWidthFacet;
+import de.intevation.flys.artifacts.resources.Resources;
+import de.intevation.flys.artifacts.states.StaticState;
+
+public class StaticMorphWidthArtifact
+extends      AbstractStaticStateArtifact
+{
+    /** The logger for this class. */
+    private static Logger logger =
+        Logger.getLogger(StaticMorphWidthArtifact.class);
+
+    private static final String NAME = "morph-width";
+    private static final String STATIC_FACET_NAME = "morph-width";
+
+    static {
+        // TODO: Move to configuration.
+        FacetActivity.Registry.getInstance()
+            .register(NAME, FacetActivity.INACTIVE);
+    }
+
+    public static final String STATIC_STATE_NAME =
+        "state.morph-width.static";
+
+    /**
+     * Trivial Constructor.
+     */
+    public StaticMorphWidthArtifact() {
+    }
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+    /**
+     * Gets called from factory, to set things up.
+     */
+    @Override
+    public void setup(
+        String          identifier,
+        ArtifactFactory factory,
+        Object          context,
+        CallMeta        callMeta,
+        Document        data)
+    {
+        logger.debug("setup");
+
+        if (logger.isDebugEnabled()) {
+            logger.debug(XMLUtils.toString(data));
+        }
+
+        String code = getDatacageIDValue(data);
+
+        if (code != null) {
+                Facet facet = new MorphologicWidthFacet(
+                        STATIC_FACET_NAME,
+                        Resources.getMsg(
+                            callMeta,
+                            "facet.morphologic.width",
+                            "morphologische Breite"));
+                addStringData("width_id", code);
+                ArrayList<Facet> facets = new ArrayList<Facet>(1);
+                facets.add(facet);
+
+                addFacets(STATIC_STATE_NAME, facets);
+        }
+        super.setup(identifier, factory, context, callMeta, data);
+    }
+
+    @Override
+    protected void initStaticState() {
+
+        logger.debug("initStaticState " + getName() + " " + identifier());
+
+        StaticState state = new StaticState(STATIC_STATE_NAME);
+        DefaultOutput output = new DefaultOutput(
+                "general",
+                "general",
+                "image/png",
+                "chart");
+
+        List<Facet> facets = getFacets(STATIC_STATE_NAME);
+        output.addFacets(facets);
+        state.addOutput(output);
+
+        setStaticState(state);
+    }
+
+    @Override
+    protected void initialize(Artifact artifact, Object context, CallMeta meta) {
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/RangeAccess.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/access/RangeAccess.java	Sun Apr 21 10:46:59 2013 +0200
@@ -78,6 +78,13 @@
                             winfo.getReferenceEndKms()[0]
                         };
                 }
+                else if (winfo.getReferenceStartKm() != null) {
+                    return new double[]
+                        {
+                            winfo.getReferenceStartKm().doubleValue(),
+                            winfo.getReferenceStartKm().doubleValue()
+                        };
+                }
             }
             return null;
         }
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java	Sun Apr 21 10:46:59 2013 +0200
@@ -64,3 +64,4 @@
         return map;
     }
 }
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FacetTypes.java	Sun Apr 21 10:46:59 2013 +0200
@@ -103,6 +103,9 @@
 
             return false;
         }
+        public static boolean SEDIMENT_LOAD(String type) {
+            return type.startsWith("sedimentload");
+        }
         public static boolean SEDIMENT_LOAD_NO_FLOAT(String type) {
             return type.startsWith("sedimentload") && !type.contains("susp");
         }
@@ -286,6 +289,7 @@
     String BED_DIFFERENCE_EPOCH_HEIGHT2 = "bedheight_difference.epoch.height2";
     String BED_DIFFERENCE_EPOCH_HEIGHT1_FILTERED = "bedheight_difference.epoch.height1.filtered";
     String BED_DIFFERENCE_EPOCH_HEIGHT2_FILTERED = "bedheight_difference.epoch.height2.filtered";
+    String MORPHOLOGIC_WIDTH = "morph-width";
 
     String SEDIMENT_LOAD_COARSE        = "sedimentload.coarse";
     String SEDIMENT_LOAD_SAND          = "sedimentload.sand";
@@ -340,6 +344,8 @@
     String FIX_ANALYSIS_EVENTS_LS = "fix_analysis_events_ls";
     String FIX_ANALYSIS_EVENTS_WQ = "fix_analysis_events_wq";
 
+    String FIX_EVENTS = "fix_events_wqkms";
+
     String FIX_REFERENCE_EVENTS_DWT = "fix_reference_events_dwt";
     String FIX_REFERENCE_EVENTS_LS = "fix_reference_events_ls";
     String FIX_REFERENCE_EVENTS_WQ = "fix_reference_events_wq";
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java	Sun Apr 21 10:46:59 2013 +0200
@@ -39,6 +39,7 @@
         "WHERE" +
         "    name = :name";
 
+    /** All kind-2 wsts from given river. */
     public static final String SQL_FIXINGS =
         "SELECT" +
         "    id AS wst_id," +
@@ -47,6 +48,7 @@
         "WHERE" +
         "    river_id = :river_id AND kind = 2";
 
+    /** All columns from given wst. */
     public static final String SQL_FIXING_COLUMNS =
         "SELECT" +
         "    wc.id         AS wst_column_id," +
@@ -327,6 +329,11 @@
             }
         }
 
+        /**
+         * @param allColumns[out] Columns will be put here.
+         * @param range can be null.
+         * @param filter filter to apply.
+         */
         public void addAllColumns(
             List<Column> allColumns,
             Range        range,
@@ -562,6 +569,7 @@
         }
     } // class IdFilter
 
+    /** Accept Fixing columns whose id is in id list. */
     public static class IdsFilter implements Fixing.Filter {
 
         protected int [] columnIds;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/StaticMorphoWidthCacheKey.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,29 @@
+package de.intevation.flys.artifacts.model;
+
+
+public class StaticMorphoWidthCacheKey
+{
+   public static final String CACHE_NAME = "morpho-width-table-static";
+
+    private int width_id;
+
+    public StaticMorphoWidthCacheKey(
+        int width_id
+    ) {
+        this.width_id = width_id;
+    }
+
+    @Override
+    public int hashCode() {
+        return (String.valueOf(width_id)).hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof StaticMorphoWidthCacheKey)) {
+            return false;
+        }
+        StaticMorphoWidthCacheKey o = (StaticMorphoWidthCacheKey) other;
+        return this.width_id == o.width_id;
+    }
+}
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQKmsFactory.java	Sun Apr 21 10:46:59 2013 +0200
@@ -29,11 +29,15 @@
         "SELECT position, w, q FROM wst_value_table " +
         "WHERE wst_id = :wst_id AND column_pos = :column_pos";
 
+    /** Get wst_id and position from wst_columns. */
+    public static final String SQL_SELECT_COLUMN =
+        "SELECT wst_id, position FROM wst_columns WHERE id = :column_id";
+
     /** Query to get name for wst_id and column_pos. */
     public static final String SQL_SELECT_NAME =
         "SELECT name " +
         "FROM wst_columns "+
-        "WHERE wst_id = :wst_id AND position = :column_pos";
+        "WHERE id = :column_id";
 
 
     /** Hidden constructor, use static methods instead. */
@@ -42,16 +46,16 @@
 
 
     /**
-     * Get WKms for given column and wst_id, caring about the cache.
+     * Get WKms for given column (pos) and wst_id, caring about the cache.
      */
-    public static WQKms getWQKms(int column, int wst_id) {
+    public static WQKms getWQKms(int columnPos, int wst_id) {
         log.debug("WQKmsFactory.getWQKms");
         Cache cache = CacheFactory.getCache(StaticWQKmsCacheKey.CACHE_NAME);
 
         StaticWQKmsCacheKey cacheKey;
 
         if (cache != null) {
-            cacheKey = new StaticWQKmsCacheKey(wst_id, column);
+            cacheKey = new StaticWQKmsCacheKey(wst_id, columnPos);
             Element element = cache.get(cacheKey);
             if (element != null) {
                 log.debug("Got static wst values from cache");
@@ -62,7 +66,41 @@
             cacheKey = null;
         }
 
-        WQKms values = getWQKmsUncached(column, wst_id);
+        WQKms values = getWQKmsUncached(columnPos, wst_id);
+
+        if (values != null && cacheKey != null) {
+            log.debug("Store static wst values in cache.");
+            Element element = new Element(cacheKey, values);
+            cache.put(element);
+        }
+        return values;
+    }
+
+    /**
+     * Get WKms for given column (id), caring about the cache.
+     */
+    public static WQKms getWQKmsCID(int columnID) {
+        log.debug("WQKmsFactory.getWQKms");
+        Cache cache = CacheFactory.getCache(StaticWQKmsCacheKey.CACHE_NAME);
+
+        StaticWQKmsCacheKey cacheKey;
+
+        if (cache != null) {
+            cacheKey = new StaticWQKmsCacheKey(-columnID, -columnID);
+            Element element = cache.get(cacheKey);
+            if (element != null) {
+                log.debug("Got static wst values from cache");
+                return (WQKms)element.getValue();
+            }
+        }
+        else {
+            cacheKey = null;
+        }
+
+        int[] cInfo = getColumn(columnID);
+        if (cInfo == null) return null;
+        WQKms values = getWQKmsUncached(cInfo[1], cInfo[0]);
+
 
         if (values != null && cacheKey != null) {
             log.debug("Store static wst values in cache.");
@@ -106,5 +144,56 @@
 
         return wqkms;
     }
+
+
+    /**
+     * Get WQKms from db.
+     * @param columnID the columns database id value
+     * @param wst_id database id of the wst
+     * @return respective WQKms.
+     */
+    public static int[] getColumn(int columnID) {
+
+        if (log.isDebugEnabled()) {
+            log.debug("WQKmsFactory.getColumn, columnID "
+                + columnID);
+        }
+
+        Session session = SessionHolder.HOLDER.get();
+
+        SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_COLUMN)
+            .addScalar("wst_id",  StandardBasicTypes.INTEGER)
+            .addScalar("position", StandardBasicTypes.INTEGER);
+        sqlQuery.setInteger("column_id", columnID);
+
+        List<Object []> results = sqlQuery.list();
+
+        for (int i = 0, N = results.size(); i < N; i++) {
+            Object[] row = results.get(i);
+            return new int[] {(Integer)row[0], (Integer)row[1]};
+        }
+
+        return null;
+    }
+
+
+    /** Get name for a WKms. */
+    public static String getWQKmsName(int columnID) {
+        log.debug("WQKmsFactory.getWQKmsName c/" + columnID);
+
+        String name = null;
+        Session session = SessionHolder.HOLDER.get();
+
+        SQLQuery nameQuery = session.createSQLQuery(SQL_SELECT_NAME)
+            .addScalar("name", StandardBasicTypes.STRING);
+        nameQuery.setInteger("column_id", columnID);
+
+        List<String> names = nameQuery.list();
+        if (names.size() >= 1) {
+            name = names.get(0);
+        }
+
+        return name;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java	Sun Apr 21 10:46:59 2013 +0200
@@ -237,6 +237,10 @@
         return sb.toString();
     }
 
+
+    /** Create filter to accept only the chosen events. 
+     *  This factored out out to be overwritten. 
+     */
     protected Filter createFilter() {
         return new IdsFilter(events);
     }
@@ -267,6 +271,7 @@
         return columns;
     }
 
+    // Fit a function to the given points from fixation.
     protected FitResult doFitting(
         FixingsOverview overview,
         ColumnCache     cc,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixEventFacet.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,62 @@
+package de.intevation.flys.artifacts.model.fixings;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.model.DataFacet;
+import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.WQKmsFactory;
+import de.intevation.flys.artifacts.access.FixRealizingAccess;
+
+import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
+
+
+/**
+ * Facet to show W|Q|km Values.
+ */
+public class FixEventFacet
+extends      DataFacet
+implements   FacetTypes {
+
+    /** House logger. */
+    private static Logger logger = Logger.getLogger(FixEventFacet.class);
+
+
+    public FixEventFacet(int index, String name, String description) {
+        super(index, name, description, ComputeType.FEED, null, null);
+    }
+
+
+    /**
+     * Returns the data this facet requires.
+     *
+     * @param artifact the owner artifact.
+     * @param context  the CallContext (ignored).
+     *
+     * @return the data.
+     */
+    @Override
+    public Object getData(Artifact artifact, CallContext context) {
+        logger.debug("FixEventFacet.getData");
+
+        FixRealizingAccess access = new FixRealizingAccess((FLYSArtifact) artifact, context);
+        int wstColID = access.getEvents()[index];
+        return WQKmsFactory.getWQKmsCID(wstColID);
+    }
+
+
+    /**
+     * Create a deep copy of this Facet.
+     * @return a deep copy.
+     */
+    @Override
+    public FixEventFacet deepCopy() {
+        FixEventFacet copy = new FixEventFacet(index, name, description);
+        copy.set(this);
+        return copy;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/MorphologicWidth.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,50 @@
+package de.intevation.flys.artifacts.model.minfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import de.intevation.flys.jfree.DoubleBounds;
+
+
+public class MorphologicWidth
+{
+
+    private Map<Double, Double> pairs;
+
+
+    public MorphologicWidth() {
+        pairs = new HashMap<Double, Double>();
+    }
+
+    public void add(double station, double width) {
+        this.pairs.put(station, width);
+    }
+
+    public Map<Double, Double> getAll() {
+        return this.pairs;
+    }
+
+    public double[][] getAsArray() {
+        double [][] array = new double[2][pairs.size()];
+        Double[] kms = pairs.keySet().toArray(new Double[pairs.size()]);
+        Double[] width = pairs.values().toArray(new Double[pairs.size()]);
+        int realIndex = 0;
+        for (int i = 0; i < kms.length; i++) {
+            if (kms[i] == null || width[i] == null) {
+                continue;
+            }
+            array[0][realIndex] = kms[i];
+            array[1][realIndex] = width[i];
+            realIndex++;
+        }
+        return array;
+    }
+
+
+    public Double getWidth(double station) {
+        if (this.pairs.containsKey(station)) {
+            return this.pairs.get(station);
+        }
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/MorphologicWidthFacet.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,54 @@
+package de.intevation.flys.artifacts.model.minfo;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.artifactdatabase.state.Facet;
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.model.DataFacet;
+import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
+
+
+public class MorphologicWidthFacet
+extends DataFacet
+implements   FacetTypes
+{
+    private static Logger logger = Logger.getLogger(SedimentLoadFacet.class);
+
+
+    public MorphologicWidthFacet() {
+    }
+
+    public MorphologicWidthFacet(String facetName, String description) {
+        super(facetName, description);
+    }
+
+    public MorphologicWidthFacet(int idx, String name, String description,
+        ComputeType type, String stateId, String hash) {
+        super(idx, name, description, type, hash, stateId);
+    }
+
+    public Object getData(Artifact artifact, CallContext context) {
+
+        FLYSArtifact flys = (FLYSArtifact) artifact;
+        String width_id = flys.getDataAsString("width_id");
+
+        MorphologicWidth width =
+            MorphologicWidthFactory.getWidth(Integer.valueOf(width_id));
+
+        return width;
+    }
+
+    /** Copy deeply. */
+    @Override
+    public Facet deepCopy() {
+        MorphologicWidthFacet copy = new MorphologicWidthFacet();
+        copy.set(this);
+        copy.type = type;
+        copy.hash = hash;
+        copy.stateId = stateId;
+        return copy;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/MorphologicWidthFactory.java	Sun Apr 21 10:46:59 2013 +0200
@@ -0,0 +1,87 @@
+package de.intevation.flys.artifacts.model.minfo;
+
+import java.util.List;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.Element;
+
+import org.apache.log4j.Logger;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.type.StandardBasicTypes;
+
+import de.intevation.flys.artifacts.cache.CacheFactory;
+import de.intevation.flys.artifacts.model.StaticMorphoWidthCacheKey;
+import de.intevation.flys.backend.SessionHolder;
+
+
+public class MorphologicWidthFactory
+{
+    /** Private logger to use here. */
+    private static Logger log = Logger.getLogger(MorphologicWidthFactory.class);
+
+    public static final String SQL_SELECT =
+        "SELECT mwv.station AS station, mwv.width AS width " +
+        "   FROM morphologic_width mw" +
+        "       JOIN morphologic_width_values mwv on mwv.morphologic_width_id = mw.id" +
+        "   WHERE mw.id = :width_id";
+
+    private MorphologicWidthFactory() {
+    }
+
+
+    /**
+     * Get WKms for given column and wst_id, caring about the cache.
+     */
+    public static MorphologicWidth getWidth(int width_id) {
+        log.debug("MorphologicWidthFactory.getWidth");
+        Cache cache = CacheFactory.getCache(StaticMorphoWidthCacheKey.CACHE_NAME);
+
+        StaticMorphoWidthCacheKey cacheKey;
+
+        if (cache != null) {
+            cacheKey = new StaticMorphoWidthCacheKey(width_id);
+            Element element = cache.get(cacheKey);
+            if (element != null) {
+                log.debug("Got static bedheight values from cache");
+                return (MorphologicWidth)element.getValue();
+            }
+        }
+        else {
+            cacheKey = null;
+        }
+
+        MorphologicWidth values = getWidthUncached(width_id);
+
+        if (values != null && cacheKey != null) {
+            log.debug("Store static morphologic width values in cache.");
+            Element element = new Element(cacheKey, values);
+            cache.put(element);
+        }
+        return values;
+    }
+
+    private static MorphologicWidth getWidthUncached(int width_id) {
+        if (log.isDebugEnabled()) {
+            log.debug("MorphologicWidthFactory.getWidthUncached");
+        }
+
+        Session session = SessionHolder.HOLDER.get();
+        SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT)
+                .addScalar("station", StandardBasicTypes.DOUBLE)
+                .addScalar("width", StandardBasicTypes.DOUBLE);
+        sqlQuery.setInteger("width_id", width_id);
+        List<Object []> results = sqlQuery.list();
+
+        MorphologicWidth widths = new MorphologicWidth();
+        for (int i = 0; i < results.size(); i++) {
+            Object[] row = results.get(i);
+            log.debug("got station: " + (Double)row[0]);
+            widths.add(
+                (Double) row[0],
+                (Double) row[1]);
+        }
+        return widths;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensity.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensity.java	Sun Apr 21 10:46:59 2013 +0200
@@ -78,7 +78,7 @@
                 }
             }
         }
-        return -1d;
+        return 1.8d;
     }
 
     private double getDensityAtKm(
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensityFactory.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensityFactory.java	Sun Apr 21 10:46:59 2013 +0200
@@ -81,7 +81,9 @@
         results = sqlQuery.list();
         SedimentDensity density = new SedimentDensity();
         for (Object[] row : results) {
-            density.addDensity((Double)row[0], (Double)row[1], (Integer)row[2]);
+            if (row[0] != null && row[1] != null && row[2] != null) {
+                density.addDensity((Double)row[0], (Double)row[1], (Integer)row[2]);
+            }
         }
 
         density.cleanUp();
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoad.java	Sun Apr 21 10:46:59 2013 +0200
@@ -223,3 +223,4 @@
         return false;
     }
 }
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadCalculation.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadCalculation.java	Sun Apr 21 10:46:59 2013 +0200
@@ -115,7 +115,7 @@
     private SedimentLoadResult calculateEpoch(int i) {
         List<SedimentLoad> epochLoads = new ArrayList<SedimentLoad>();
         for (int j = epoch[i][0]; j < epoch[i][1]; j++) {
-            epochLoads.add(SedimentLoadFactory.getLoadwithData(
+            epochLoads.add(SedimentLoadFactory.getLoadWithData(
                 this.river,
                 this.yearEpoch,
                 this.kmLow,
@@ -207,7 +207,7 @@
     }
 
     private SedimentLoadResult calculateOffEpoch(int i) {
-        SedimentLoad load = SedimentLoadFactory.getLoadwithData(
+        SedimentLoad load = SedimentLoadFactory.getLoadWithData(
             this.river,
             this.yearEpoch,
             kmLow,
@@ -234,7 +234,7 @@
     }
 
     private SedimentLoadResult calculateYear(int y) {
-        SedimentLoad load = SedimentLoadFactory.getLoadwithData(
+        SedimentLoad load = SedimentLoadFactory.getLoadWithData(
             this.river,
             this.yearEpoch,
             this.kmLow,
@@ -256,22 +256,29 @@
 
     private SedimentLoad calculateTotalLoad(SedimentLoad load, int year) {
         logger.debug("calculateTotalLoad");
+        boolean problemThisYear = false;
         if (!load.hasCoarse()) {
-            addProblem(year, "missing.fraction.coarse");
+            addProblem("missing.fraction.coarse", Integer.toString(year));
+            problemThisYear = true;
         }
         if (!load.hasFineMiddle()) {
-            addProblem(year, "missing.fraction.fine_middle");
+            addProblem("missing.fraction.fine_middle", Integer.toString(year));
+            problemThisYear = true;
         }
         if (!load.hasSand()) {
-            addProblem(year, "missing.fraction.sand");
+            addProblem("missing.fraction.sand", Integer.toString(year));
+            problemThisYear = true;
         }
         if (!load.hasSuspSand()) {
-            addProblem(year, "missing.fraction.susp_sand");
+            addProblem("missing.fraction.susp_sand", Integer.toString(year));
+            problemThisYear = true;
         }
         if (!load.hasSuspSediment()) {
-            addProblem(year, "missing.fraction.susp_sediment");
+            addProblem("missing.fraction.susp_sediment", Integer.toString(year));
+            problemThisYear = true;
         }
-        if (hasProblems()) {
+        if (problemThisYear) {
+            logger.warn("Some problem, not calculating total load.");
             return load;
         }
         for(double km : load.getKms()) {
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java	Sun Apr 21 10:46:59 2013 +0200
@@ -3,7 +3,12 @@
 import org.apache.log4j.Logger;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import de.intevation.artifactdatabase.state.Facet;
 import de.intevation.artifacts.Artifact;
@@ -54,6 +59,7 @@
             return null;
         }
 
+        List<Double> sortedStarts = new ArrayList<Double>();
         // Filter stations according to type.
         List<MeasurementStation> stations = new ArrayList<MeasurementStation>();
         for (MeasurementStation station: allStations) {
@@ -61,43 +67,72 @@
                 continue;
             }
             if (FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName())
-                && station.getMeasurementType().equals("Geschiebe"))
+                && station.getMeasurementType().equals("Geschiebe")) {
                 stations.add(station);
+                sortedStarts.add(station.getStation());
+            }
             else if (!FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName())
-                && station.getMeasurementType().equals("Schwebstoff"))
+                && station.getMeasurementType().equals("Schwebstoff")) {
                 stations.add(station);
+                sortedStarts.add(station.getStation());
+            }
         }
+        Collections.sort(sortedStarts);
 
         // Access data according to type.
         double[][] sd = getLoadData(result);
 
+        // Sort by km.
+        TreeMap<Double, Double> sortData = new TreeMap<Double,Double>();
+
         double[] km   = sd[0];
         double[] load = sd[1];
 
+        for (int i = 0 ; i < km.length; i++) {
+            sortData.put(km[i], load[i]);
+        }
+
         double[][] values = new double[2][];
-        values[0] = new double[km.length*2];
-        values[1] = new double[km.length*2];
+        values[0] = new double[km.length*3];
+        values[1] = new double[km.length*3];
+
+        List<double[]> kmWithoutStation = new ArrayList<double[]>();
 
         // Find station via its station (km).
-        // TODO what to do with gaps in measurement stations.
-        for (int i = 0; i < km.length; i++) {
+        // TODO use a binarySearch instead of linear absdiff approach
+        int i = 0;
+        for (Map.Entry<Double, Double> entry: sortData.entrySet()) {
             boolean matchFound = false;
+            // For now, ignore overlaps like (B> next A)
             for (MeasurementStation station: stations) {
-                if (Math.abs(station.getStation() - km[i]) < EPSILON) {
-                    values[0][i*2] = station.getRange().getA().doubleValue();
-                    values[1][i*2] = load[i];
-                    values[0][i*2+1] = station.getRange().getB().doubleValue();
-                    values[1][i*2+1] = load[i];
+                if (Math.abs(station.getStation() - entry.getKey()) < EPSILON ||
+                    station.getRange().containsTolerant(entry.getKey())) {
+                    // TODO: In rare cases, two matches can be found.
+                    values[0][i*3] = station.getRange().getA().doubleValue() + EPSILON;
+                    values[1][i*3] = entry.getValue();
+                    values[0][i*3+1] = station.getRange().getB().doubleValue() - EPSILON;
+                    values[1][i*3+1] = entry.getValue();
+                    values[0][i*3+2] = station.getRange().getB().doubleValue();
+                    values[1][i*3+2] = entry.getValue();
                     matchFound = true;
                 }
             }
-            // For now, add point if no matching measurement station found.
+            // Store points without match for later assessment.
             if (!matchFound) {
-                values[0][i*2] = km[i];
-                values[1][i*2] = load[i];
-                logger.debug("No measurement station for km " + km[i]);
+                logger.warn("measurement without station ("+entry.getKey()+")!");
+            }
+            i++;
+        }
+
+        for (int x = 0; x < values[0].length-1; x++) {
+            // Introduce gaps where no data in measurement station.
+            if (Math.abs(values[0][x+1] - values[0][x]) > 3*EPSILON
+                    && values[1][x+1] != values[1][x]) {
+                values[0][x] = Double.NaN;
+                values[1][x] = Double.NaN;
             }
         }
+
         return values;
     }
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFactory.java	Sun Apr 21 10:46:59 2013 +0200
@@ -18,7 +18,7 @@
 import de.intevation.flys.artifacts.model.StaticSedimentLoadCacheKey;
 import de.intevation.flys.backend.SessionHolder;
 
-
+/** Pull Sediment Loads out of db. */
 public class SedimentLoadFactory
 {
     /** Private logger to use here. */
@@ -130,7 +130,7 @@
         return values;
     }
 
-    public static SedimentLoad getLoadwithData(
+    public static SedimentLoad getLoadWithData(
         String river,
         String type,
         double startKm,
@@ -337,9 +337,7 @@
         return new SedimentLoad();
     }
 
-    /**
-     *
-     */
+
     protected static void getValues (
         String fraction,
         SQLQuery query,
@@ -375,3 +373,4 @@
         }
     }
 }
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/fixation/FixRealizingCompute.java	Sun Apr 21 10:46:59 2013 +0200
@@ -16,9 +16,11 @@
 import de.intevation.flys.artifacts.model.ReportFacet;
 import de.intevation.flys.artifacts.model.WQCKms;
 import de.intevation.flys.artifacts.model.WQKms;
+import de.intevation.flys.artifacts.model.WQKmsFactory;
 import de.intevation.flys.artifacts.model.fixings.FixOutlierFacet;
 import de.intevation.flys.artifacts.model.fixings.FixRealizingCalculation;
 import de.intevation.flys.artifacts.model.fixings.FixRealizingResult;
+import de.intevation.flys.artifacts.model.fixings.FixEventFacet;
 import de.intevation.flys.artifacts.model.fixings.FixReferenceEventsFacet;
 import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet;
 import de.intevation.flys.artifacts.model.fixings.FixWaterlevelFacet;
@@ -122,6 +124,13 @@
             }
         }
 
+        // Add one facet per event.
+        int i = 0;
+        for (int event: access.getEvents()) {
+            facets.add(new FixEventFacet(i, FIX_EVENTS, WQKmsFactory.getWQKmsName(event)));
+            i++;
+        }
+
         if (wqkms.length > 0) {
             facets.add(
                 new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, id));
@@ -137,7 +146,9 @@
             new DataFacet(AT, "AT data", ComputeType.ADVANCE, hash, id));
 
         facets.add(new FixWQCurveFacet(
-            0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE)));
+            0,
+            Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " ("
+                + access.getFunction() + ")"));
 
         facets.add(new FixReferenceEventsFacet(
             0,
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/minfo/SedimentLoadYearSelect.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/minfo/SedimentLoadYearSelect.java	Sun Apr 21 10:46:59 2013 +0200
@@ -2,9 +2,15 @@
 
 import org.apache.log4j.Logger;
 
+import de.intevation.artifacts.Artifact;
+
+import de.intevation.flys.artifacts.FLYSArtifact;
+
+import de.intevation.flys.artifacts.access.SedimentLoadAccess;
 import de.intevation.flys.artifacts.states.DefaultState;
 
 
+/** State in which to fetch years for sedminent load calculation. */
 public class SedimentLoadYearSelect
 extends DefaultState
 {
@@ -18,9 +24,25 @@
     public SedimentLoadYearSelect() {
     }
 
+
+    /** Year Select Widget. */
     @Override
     protected String getUIProvider() {
         return "minfo.sedimentload_year_select";
     }
 
+
+    @Override
+    public boolean validate(Artifact artifact)
+    throws IllegalArgumentException
+    {
+        SedimentLoadAccess access = new SedimentLoadAccess((FLYSArtifact) artifact, null);
+
+        // Second year should be later than first.
+        if (access.getPeriod() != null && access.getPeriod()[1] < access.getPeriod()[0])
+           throw new IllegalArgumentException("error_years_wrong");
+
+        return true;
+    }
 }
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/MapGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/MapGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -2,6 +2,7 @@
 
 import com.vividsolutions.jts.geom.Envelope;
 
+import de.intevation.artifactdatabase.data.StateData;
 import de.intevation.artifactdatabase.state.ArtifactAndFacet;
 import de.intevation.artifactdatabase.state.Facet;
 import de.intevation.artifactdatabase.state.Settings;
@@ -15,6 +16,7 @@
 import de.intevation.flys.artifacts.model.map.WMSDBLayerFacet;
 import de.intevation.flys.artifacts.model.map.WMSLayerFacet;
 import de.intevation.flys.artifacts.model.map.WSPLGENLayerFacet;
+import de.intevation.flys.artifacts.states.WaterlevelGroundDifferences;
 import de.intevation.flys.collections.FLYSArtifactCollection;
 import de.intevation.flys.utils.ArtifactMapfileGenerator;
 import de.intevation.flys.utils.GeometryUtils;
@@ -134,11 +136,24 @@
     ) {
         try {
             if(wms instanceof WSPLGENLayerFacet) {
+                // Retrieve waterlevel ground differences from artifact
+                StateData dFrom = flys.getData(WaterlevelGroundDifferences.LOWER_FIELD);
+                StateData dTo   = flys.getData(WaterlevelGroundDifferences.UPPER_FIELD);
+                StateData dStep = flys.getData(WaterlevelGroundDifferences.DIFF_FIELD);
+
+                String fromStr = dFrom != null ? (String) dFrom.getValue() : null;
+                String toStr   = dTo   != null ? (String) dTo.getValue()   : null;
+                String stepStr = dStep != null ? (String) dStep.getValue() : null;
+
+                float from = Float.parseFloat(fromStr);
+                float to   = Float.parseFloat(toStr);
+                float step = Float.parseFloat(stepStr);
+
                 ArtifactMapfileGenerator mfg = new ArtifactMapfileGenerator();
                 mfg.createUeskLayer(
                     flys,
                     (WSPLGENLayerFacet) wms,
-                    ThemeUtil.createDynamicMapserverStyle(attr),
+                    ThemeUtil.createDynamicMapserverStyle(attr, from, to, step),
                     context);
             }
             else {
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/MiddleBedHeightGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -120,7 +120,13 @@
             label = getHAxisLabel();
         }
         else if (index == YAXIS.W.idx) {
-            label = msg(I18N_W_YAXIS_LABEL, I18N_W_YAXIS_LABEL_DEFAULT);
+           FLYSArtifact flys = (FLYSArtifact) master;
+           String unit = FLYSUtils.getRiver(flys).getWstUnit().getName();
+
+           label = msg(
+                I18N_W_YAXIS_LABEL,
+                I18N_W_YAXIS_LABEL_DEFAULT,
+                new Object[] { unit });
         }
         else if (index == YAXIS.P.idx) {
             label = msg(I18N_P_YAXIS_LABEL, I18N_P_YAXIS_LABEL_DEFAULT);
@@ -166,7 +172,10 @@
 
         Processor woutp = new WOutProcessor();
         Processor bedp = new BedheightProcessor();
-
+        WOutProcessor processor = new WOutProcessor();
+        if (processor.canHandle(name)) {
+            processor.doOut(this, artifactAndFacet, attr, visible, YAXIS.W.idx);
+        }
         if (name.equals(MIDDLE_BED_HEIGHT_SINGLE) || name.equals(MIDDLE_BED_HEIGHT_EPOCH)) {
             doHeightOut(
                 (MiddleBedHeightData) artifactAndFacet.getData(context),
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -19,6 +19,7 @@
 import org.jfree.chart.annotations.XYTextAnnotation;
 import org.jfree.chart.axis.NumberAxis;
 import org.jfree.chart.axis.ValueAxis;
+import org.jfree.chart.axis.LogarithmicAxis;
 import org.jfree.chart.plot.Marker;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.chart.plot.XYPlot;
@@ -214,7 +215,8 @@
             false);
 
         XYPlot plot = (XYPlot) chart.getPlot();
-        plot.setDomainAxis(createXAxis(getXAxisLabel()));
+        ValueAxis axis = createXAxis(getXAxisLabel());
+        plot.setDomainAxis(axis);
 
         chart.setBackgroundPaint(Color.WHITE);
         plot.setBackgroundPaint(Color.WHITE);
@@ -236,7 +238,14 @@
 
         localizeAxes(plot);
         adjustAxes(plot);
-        autoZoom(plot);
+        if (!(axis instanceof LogarithmicAxis)) {
+            // XXX:
+            // The auto zoom without a range tries
+            // to include 0 in a logarithmic axis
+            // which triggers a bug in jfreechart that causes
+            // the values to be drawn carthesian
+            autoZoom(plot);
+        }
 
         //debugAxis(plot);
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixWQCurveGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -83,6 +83,8 @@
     public static final String I18N_YAXIS_LABEL_DEFAULT  =
             "W [NN + m]";
 
+    public static final double EPSILON = 0.001d;
+
     public static enum YAXIS {
         W(0),
         Q(1);
@@ -130,6 +132,9 @@
         else if(QSECTOR.equals(name)) {
             doQSectorOut(aaf, doc, visible);
         }
+        else if(FIX_EVENTS.equals(name)) {
+            doEventsOut(aaf, doc, visible);
+        }
         else if(/*STATIC_WKMS_INTERPOL.equals(name) ||*/
                 STATIC_WKMS_MARKS.equals(name) ||
                 STATIC_WKMS.equals(name) ||
@@ -245,6 +250,35 @@
     }
 
 
+    private void addPointFromWQKms(WQKms wqkms,
+        String title,
+        Document theme,
+        boolean visible
+    ) {
+        XYSeries series = new StyledXYSeries(title, theme);
+        Double ckm = (Double) context.getContextValue(CURRENT_KM);
+        if (wqkms == null || wqkms.getKms().length == 0 || ckm == null) {
+            logger.info("addPointFromWQKms: No event data to show.");
+            return;
+        }
+        double[] kms = wqkms.getKms();
+        for (int i = 0 ; i< kms.length; i++) {
+            if (Math.abs(kms[i] - ckm) <= EPSILON) {
+                series.add(wqkms.getQ(i), wqkms.getW(i));
+                addAxisSeries(series, YAXIS.W.idx, visible);
+                return;
+            }
+        }
+    }
+
+    protected void doEventsOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
+        logger.debug("doEventsOut");
+        // Find W/Q at km.
+        addPointFromWQKms((WQKms) aaf.getData(context),
+            aaf.getFacetDescription(), doc, visible);
+    }
+
+
     protected void doWQCurveOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
         logger.debug("doWQCurveOut");
 
@@ -435,14 +469,14 @@
             ) {
         logger.debug("FixWQCurveGenerator: doWQOut");
         if (wqkms instanceof WQKms) {
-            WQKms data = (WQKms) wqkms;
+            // TODO As in doEventsOut, the value-searching should
+            // be delivered by the facet already (instead of in the Generator).
+            logger.debug("FixWQCurveGenerator: doWQOut: WQKms");
 
-            XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
-            StyledSeriesBuilder.addPointsQW(series, data);
-
-            addAxisSeries(series, YAXIS.W.idx, visible);
+            addPointFromWQKms((WQKms) aaf.getData(context), aaf.getFacetDescription(), theme, visible);
         }
         else {
+            logger.debug("FixWQCurveGenerator: doWQOut: double[][]");
             double [][] data = (double [][]) wqkms;
 
             XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/BedDifferenceEpochGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/BedDifferenceEpochGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -9,15 +9,18 @@
 import de.intevation.flys.artifacts.FLYSArtifact;
 import de.intevation.flys.artifacts.access.FlowVelocityAccess;
 import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.WKms;
 import de.intevation.flys.artifacts.model.minfo.BedDiffEpochResult;
 import de.intevation.flys.exports.StyledSeriesBuilder;
 import de.intevation.flys.exports.fixings.FixChartGenerator;
 import de.intevation.flys.exports.process.KMIndexProcessor;
 import de.intevation.flys.exports.process.Processor;
+import de.intevation.flys.exports.process.WOutProcessor;
 import de.intevation.flys.jfree.Bounds;
 import de.intevation.flys.jfree.DoubleBounds;
 import de.intevation.flys.jfree.FLYSAnnotation;
 import de.intevation.flys.jfree.StyledXYSeries;
+import de.intevation.flys.utils.DataUtil;
 
 
 public class BedDifferenceEpochGenerator
@@ -25,7 +28,7 @@
 implements FacetTypes
 {
     public enum YAXIS {
-        D(0), H(1), dW(2);
+        D(0), H(1), dW(2), W(3);
 
         protected int idx;
 
@@ -51,6 +54,10 @@
     public static final String I18N_DW_YAXIS_LABEL =
             "chart.fixings.longitudinalsection.yaxis.label";
 
+    private static final String I18N_W_YAXIS_LABEL =
+        "chart.longitudinal.section.yaxis.label";
+    private static final String I18N_W_YAXIS_LABEL_DEFAULT = "W [NN + m]";
+
 
     @Override
     protected YAxisWalker getYAxisWalker() {
@@ -112,6 +119,7 @@
             context.putContextValue("endkm", bounds.getUpper());
         }
         Processor processor = new KMIndexProcessor();
+        Processor woutp = new WOutProcessor();
         if (name.equals(BED_DIFFERENCE_EPOCH)) {
             doBedDifferenceEpochOut(
                 (BedDiffEpochResult) bundle.getData(context),
@@ -141,6 +149,16 @@
         else if (processor.canHandle(name)) {
             processor.doOut(this, bundle, attr, visible, YAXIS.dW.idx);
         }
+        else if (woutp.canHandle(name)) {
+            woutp.doOut(this, bundle, attr, visible, YAXIS.W.idx);
+        }
+        else if (name.equals(W_DIFFERENCES)) {
+            doWDifferencesOut(
+                (WKms) bundle.getData(context),
+                bundle,
+                attr,
+                visible);
+        }
         else if (name.equals(LONGITUDINAL_ANNOTATION)) {
             doAnnotations(
                 (FLYSAnnotation) bundle.getData(context),
@@ -175,7 +193,9 @@
         else if (pos == YAXIS.dW.idx) {
             return msg(I18N_DW_YAXIS_LABEL, I18N_DW_YAXIS_LABEL_DEFAULT);
         }
-
+        else if (pos == YAXIS.W.idx) {
+            return msg(I18N_W_YAXIS_LABEL, I18N_W_YAXIS_LABEL_DEFAULT);
+        }
         return label;
     }
 
@@ -206,4 +226,24 @@
 
         addAxisSeries(series, YAXIS.H.idx, visible);
     }
+
+    protected void doWDifferencesOut(
+        WKms       wkms,
+        ArtifactAndFacet aandf,
+        Document   theme,
+        boolean    visible
+    ) {
+        if (wkms == null) {
+            logger.warn("No data to add to WDifferencesChart.");
+            return;
+         }
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+        StyledSeriesBuilder.addPoints(series, wkms);
+
+        addAxisSeries(series, YAXIS.D.idx, visible);
+        if (DataUtil.guessWaterIncreasing(wkms.allWs())) {
+            setInverted(true);
+        }
+    }
 }
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/BedDifferenceYearGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/BedDifferenceYearGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -7,16 +7,20 @@
 import de.intevation.artifactdatabase.state.ArtifactAndFacet;
 import de.intevation.artifactdatabase.state.Facet;
 import de.intevation.flys.artifacts.model.FacetTypes;
+import de.intevation.flys.artifacts.model.WKms;
 import de.intevation.flys.artifacts.model.minfo.BedDiffYearResult;
 import de.intevation.flys.artifacts.model.minfo.BedDifferencesResult;
+import de.intevation.flys.artifacts.model.minfo.MorphologicWidth;
 import de.intevation.flys.exports.StyledSeriesBuilder;
 import de.intevation.flys.exports.fixings.FixChartGenerator;
 import de.intevation.flys.exports.process.KMIndexProcessor;
 import de.intevation.flys.exports.process.Processor;
+import de.intevation.flys.exports.process.WOutProcessor;
 import de.intevation.flys.jfree.Bounds;
 import de.intevation.flys.jfree.DoubleBounds;
 import de.intevation.flys.jfree.FLYSAnnotation;
 import de.intevation.flys.jfree.StyledXYSeries;
+import de.intevation.flys.utils.DataUtil;
 
 
 public class BedDifferenceYearGenerator
@@ -24,7 +28,7 @@
 implements FacetTypes
 {
     public enum YAXIS {
-        D(0), M(1), H(2),  dW(3);
+        D(0), M(1), H(2),  dW(3), W(4);
 
         protected int idx;
 
@@ -45,12 +49,15 @@
     public static final String I18N_CHART_TITLE_DEFAULT = "Sohlenhöhen Differenz";
     public static final String I18N_XAXIS_LABEL_DEFAULT = "Fluss-Km";
     public static final String I18N_YAXIS_LABEL_DEFAULT = "delta S [m]";
-    public static final String I18N_SECOND_YAXIS_LABEL_DEFAULT = "Morph. Breite [m]";
+    public static final String I18N_SECOND_YAXIS_LABEL_DEFAULT = "Breite [m]";
     public static final String I18N_THIRD_YAXIS_LABEL_DEFAULT = "Höhe [m]";
     public static final String I18N_DW_YAXIS_LABEL_DEFAULT  =
             "delta W [cm]";
     public static final String I18N_DW_YAXIS_LABEL =
             "chart.fixings.longitudinalsection.yaxis.label";
+    private static final String I18N_W_YAXIS_LABEL =
+        "chart.longitudinal.section.yaxis.label";
+    private static final String I18N_W_YAXIS_LABEL_DEFAULT = "W [NN + m]";
 
     @Override
     protected YAxisWalker getYAxisWalker() {
@@ -110,6 +117,7 @@
             context.putContextValue("endkm", bounds.getUpper());
         }
         Processor processor = new KMIndexProcessor();
+        Processor woutp = new WOutProcessor();
         if (name.equals(BED_DIFFERENCE_YEAR)) {
             doBedDifferenceYearOut(
                 (BedDiffYearResult) bundle.getData(context),
@@ -145,6 +153,14 @@
                 (BedDiffYearResult)bundle.getData(context),
                 bundle, attr, visible, 1);
         }
+        else if (name.equals(MORPHOLOGIC_WIDTH)) {
+            doMorphologicWidthOut(
+                (MorphologicWidth)bundle.getData(context),
+                bundle,
+                attr,
+                visible,
+                0);
+        }
         else if (processor.canHandle(name)) {
             processor.doOut(this, bundle, attr, visible, YAXIS.dW.idx);
         }
@@ -155,14 +171,33 @@
                  attr,
                  visible);
         }
-        else if (processor.canHandle(name)) {
-            processor.doOut(this, bundle, attr, visible, YAXIS.dW.idx);
+        else if (woutp.canHandle(name)) {
+            woutp.doOut(this, bundle, attr, visible, YAXIS.W.idx);
+        }
+        else if (name.equals(W_DIFFERENCES)) {
+            doWDifferencesOut(
+                (WKms) bundle.getData(context),
+                bundle,
+                attr,
+                visible);
         }
         else {
             logger.warn("Unknown facet name " + name);
         }
     }
 
+    private void doMorphologicWidthOut(
+        MorphologicWidth data,
+        ArtifactAndFacet bundle,
+        Document attr,
+        boolean visible,
+        int i) {
+        XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), attr);
+        StyledSeriesBuilder.addPoints(series, data.getAsArray(), true);
+
+        addAxisSeries(series, YAXIS.M.idx, visible);
+    }
+
     private void doBedDifferenceHeightsOut(
         BedDiffYearResult data,
         ArtifactAndFacet bundle,
@@ -207,6 +242,10 @@
         else if (pos == YAXIS.dW.idx) {
             label = msg(I18N_DW_YAXIS_LABEL, I18N_DW_YAXIS_LABEL_DEFAULT);
         }
+        else if (pos == YAXIS.W.idx) {
+            return msg(I18N_W_YAXIS_LABEL, I18N_W_YAXIS_LABEL_DEFAULT);
+        }
+
         return label;
     }
 
@@ -229,4 +268,24 @@
 
         addAxisSeries(series, YAXIS.M.idx, visible);
     }
-}
+
+    protected void doWDifferencesOut(
+        WKms       wkms,
+        ArtifactAndFacet aandf,
+        Document   theme,
+        boolean    visible
+    ) {
+        if (wkms == null) {
+            logger.warn("No data to add to WDifferencesChart.");
+            return;
+         }
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+        StyledSeriesBuilder.addPoints(series, wkms);
+
+        addAxisSeries(series, YAXIS.D.idx, visible);
+        if (DataUtil.guessWaterIncreasing(wkms.allWs())) {
+            setInverted(true);
+        }
+    }
+}
\ No newline at end of file
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java	Sun Apr 21 10:46:59 2013 +0200
@@ -124,57 +124,8 @@
             context.putContextValue("startkm", bounds.getLower());
             context.putContextValue("endkm", bounds.getUpper());
         }
-        if (name.equals(SEDIMENT_LOAD_COARSE)) {
-            doSedimentLoadCoarseOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_SAND)) {
-            doSedimentLoadSandOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_FINEMIDDLE)) {
-            doSedimentLoadFineMiddleOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_SUSP_SAND)) {
-            doSedimentLoadSuspSandOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_SUSP_SAND_BED)) {
-            doSedimentLoadSuspSandBedOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_SUSP_SEDIMENT)) {
-            doSedimentLoadSuspSedimentOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_TOTAL_LOAD)) {
-            doSedimentLoadTotalLoadOut(
-                (double[][]) bundle.getData(context),
-                bundle,
-                attr,
-                visible);
-        }
-        else if (name.equals(SEDIMENT_LOAD_TOTAL)) {
-            doSedimentLoadTotalOut(
+        if (FacetTypes.IS.SEDIMENT_LOAD(SEDIMENT_LOAD_COARSE)) {
+            doSedimentLoadOut(
                 (double[][]) bundle.getData(context),
                 bundle,
                 attr,
@@ -288,75 +239,12 @@
         return label;
     }
 
-    // TODO all double[][] eating *Out() can be subsumed.
-    protected void doSedimentLoadCoarseOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSandOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadFineMiddleOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSuspSandOut(double[][] data,
+    protected void doSedimentLoadOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSuspSandBedOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSuspSedimentOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadTotalLoadOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadTotalOut(double[][] data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data, true);
+        // Allow for gaps (NaNs).
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), false, theme);
+        StyledSeriesBuilder.addPoints(series, data, false);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
@@ -434,5 +322,4 @@
             setInverted(true);
         }
     }
-
 }
--- a/flys-artifacts/src/main/java/de/intevation/flys/jfree/DoubleBounds.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/DoubleBounds.java	Sun Apr 21 10:46:59 2013 +0200
@@ -2,6 +2,7 @@
 
 
 import org.jfree.chart.axis.ValueAxis;
+import org.jfree.chart.axis.LogarithmicAxis;
 import org.jfree.data.Range;
 
 
@@ -50,7 +51,12 @@
     @Override
     public void applyBounds(ValueAxis axis, int percent) {
         double space = (upper - lower) / 100 * percent;
-        axis.setRange(new Range(lower-space, upper+space));
+        if (axis instanceof LogarithmicAxis) {
+            axis.setRange(new Range(Math.max(lower-space, 0.0001),
+                        Math.max(upper+space, 0.0002)));
+        } else {
+            axis.setRange(new Range(lower-space, upper+space));
+        }
     }
 
 
--- a/flys-artifacts/src/main/java/de/intevation/flys/utils/ThemeUtil.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/ThemeUtil.java	Sun Apr 21 10:46:59 2013 +0200
@@ -660,22 +660,35 @@
      * @param theme
      * @return String representation of the MapserverStyle
      */
-    public static String createDynamicMapserverStyle(Document theme) {
+    public static String createDynamicMapserverStyle(Document theme,
+            float from, float to, float step)
+    {
         MapserverStyle ms = new MapserverStyle();
 
         String strStartColor = XMLUtils.xpathString(theme, XPATH_WSPLGEN_STARTCOLOR, null);
         Color startColor = strStartColor != null ? parseColor(strStartColor) : new Color(178, 201, 215);
         String strEndColor = XMLUtils.xpathString(theme, XPATH_WSPLGEN_ENDCOLOR, null);
         Color endColor = strEndColor != null? parseColor(strEndColor) : new Color(2, 27, 42);
+/*
         String strNumClasses = XMLUtils.xpathString(theme, XPATH_WSPLGEN_NUMCLASSES, null);
-        int numClasses = strNumClasses != null ? Integer.parseInt(strNumClasses) : 5;
+        int numClasses;
+        if (strNumClasses != null) {
+            numClasses = Integer.parseInt(strNumClasses);
+        }
+        else {
+            numClasses = 5;
+            logger.warn("createDynamicMapserverStyle(): strNumClasses is null");
+        }
 
         if (numClasses < 5) {
             numClasses = 5;
         }
         else if (numClasses > 20) {
             numClasses = 20;
-        }
+        }*/
+
+
+        int numClasses = (int)((to - from) / step);
 
         float rd = (endColor.getRed()   - startColor.getRed())   / (float)numClasses;
         float gd = (endColor.getGreen() - startColor.getGreen()) / (float)numClasses;
@@ -689,7 +702,7 @@
             newColor.append(' ');
             newColor.append(startColor.getBlue()  + Math.round(n * bd));
 
-            String expr = createWSPLGENExpression(n + 1, numClasses);
+            String expr = createWSPLGENExpression(from + n * step, step, n + 1, numClasses);
 
             Clazz c = new Clazz(expr);
             Style s = new Style();
@@ -706,13 +719,12 @@
     }
 
 
-    protected static String createWSPLGENExpression(int idx, int maxIdx) {
+    protected static String createWSPLGENExpression(float val, float step, int idx, int maxIdx) {
         if (idx < maxIdx) {
-            int lower = idx - 1;
-            return "[DIFF] >= " + lower + " AND  [DIFF] < " + idx;
+            return "[DIFF] >= " + val + " AND  [DIFF] < " + (val + step);
         }
         else {
-            return "[DIFF] >= " + (maxIdx - 1);
+            return "[DIFF] >= " + val;
         }
     }
 
--- a/flys-artifacts/src/main/resources/messages.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/resources/messages.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -246,11 +246,11 @@
 facet.sedimentload.susp_sediment = Sediment
 facet.sedimentload.total = Total
 facet.sedimentload.total_load = Total bed load
-missing.fraction.coarse = Missing coarse fraction
-missing.fraction.fine_middle = Missing fine/middle fraction
-missing.fraction.sand = Missing sand fraction
-missing.fraction.susp_sand = Missing susp. sand fraction
-missing.fraction.susp_sediment = Missing susp. sediment fraction
+missing.fraction.coarse = Year {0}: Missing coarse fraction
+missing.fraction.fine_middle = Year {0}: Missing fine/middle fraction
+missing.fraction.sand = Year {0}: Missing sand fraction
+missing.fraction.susp_sand = Year {0}: Missing susp. sand fraction
+missing.fraction.susp_sediment = Year {0}: Missing susp. sediment fraction
 missing.data.coarse = Missing coarse data at
 missing.data.fine_middle = Missing fine/middle data at
 missing.data.sand = Missing sand data at
@@ -281,7 +281,7 @@
 bedquality.toplayer = 0.0m - 0.3m
 bedquality.sublayer = 0.1m - 0.5m
 facet.bedheight.diff.year = Bedheight Difference {0}
-facet.bedheight.diff.morph = Morphologic Width {0}
+facet.bedheight.diff.morph = sounding Width {0}
 facet.bedheight.diff.height1 = Original Height Minuend {0}
 facet.bedheight.diff.height2 = Original Height Subtrahend {0}
 facet.bedheight.diff.absolute = Bedheight Difference/Year {0}
@@ -296,6 +296,7 @@
 facet.gauge_discharge_curve.reference_gauge = Gauge official number
 facet.gauge_discharge_curve.gauge_name = Name of the gauge
 facet.gauge_discharge_curve.gauge_location = Location of the gauge
+facet.morphologic.width = morphologic Width
 
 chart.beddifference.height.title = Bedheight Difference
 chart.beddifference.height.xaxis.label = River-Km [km]
@@ -305,7 +306,7 @@
 chart.beddifference.yaxis.label.diff = Difference [m]
 chart.beddifference.yaxis.label.height = Absolute Height [m]
 chart.beddifference.year.title = Bedheight Difference
-chart.beddifference.yaxis.label.morph = Morphologic Width [m]
+chart.beddifference.yaxis.label.morph = Width [m]
 chart.beddifference.yaxis.label.heights = Absolute Height [m]
 
 
@@ -471,54 +472,54 @@
 no.reference.end.kms = No reference end station(s) given.
 waterlevels = Waterlevels
 
-help.index=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe
-help.state.winfo=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO
-help.state.winfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.river
-help.state.winfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
-help.state.winfo.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location
-help.state.winfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance_only
-help.state.winfo.distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance
-help.state.winfo.location_distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location_distance
-help.state.winfo.wq=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq
-help.state.winfo.wq_adapted=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
-help.state.winfo.waterlevel_pair_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
-help.state.winfo.reference.curve.input.start=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
-help.state.winfo.reference.curve.input.end=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
-help.state.winfo.uesk.wsp=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
-help.state.winfo.uesk.dgm=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
-help.state.winfo.uesk.profiles=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
-help.state.winfo.uesk.floodplain=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
-help.state.winfo.uesk.differences=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
-help.state.winfo.uesk.scenario=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.dc-hws=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.user-rgd=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.barriers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.historicalq.reference_gauge=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
-help.state.winfo.historicalq.timerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
-help.state.winfo.historicalq.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
-help.state.winfo.function_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.function_select
-help.state.winfo.extreme.percent=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
-help.state.winfo.extreme.qinput=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
+help.index=${help.url}/OnlineHilfe
+help.state.winfo=${help.url}/OnlineHilfe/WINFO
+help.state.winfo.river=${help.url}/OnlineHilfe/WINFO#help.state.winfo.river
+help.state.winfo.calculation_mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
+help.state.winfo.location=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location
+help.state.winfo.distance_only=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance_only
+help.state.winfo.distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance
+help.state.winfo.location_distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location_distance
+help.state.winfo.wq=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq
+help.state.winfo.wq_adapted=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
+help.state.winfo.waterlevel_pair_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
+help.state.winfo.reference.curve.input.start=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
+help.state.winfo.reference.curve.input.end=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
+help.state.winfo.uesk.wsp=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
+help.state.winfo.uesk.dgm=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
+help.state.winfo.uesk.profiles=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
+help.state.winfo.uesk.floodplain=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
+help.state.winfo.uesk.differences=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
+help.state.winfo.uesk.scenario=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.dc-hws=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.user-rgd=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.barriers=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.historicalq.reference_gauge=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
+help.state.winfo.historicalq.timerange=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
+help.state.winfo.historicalq.mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
+help.state.winfo.function_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.function_select
+help.state.winfo.extreme.percent=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
+help.state.winfo.extreme.qinput=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
 
-help.state.minfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.river
-help.state.minfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
-help.state.minfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.distance_only
-help.state.minfo.bed.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
-help.state.minfo.sq.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.location
-help.state.minfo.bed.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.location
-help.state.minfo.dischargestate=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.dischargestate
-help.state.minfo.soundings=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.soundings
-help.state.minfo.bed.difference_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
-help.state.minfo.sq.outliers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
-help.state.minfo.sediment.load.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
-help.state.minfo.sediment.load.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
-help.state.minfo.bed.periods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.periods
-help.state.minfo.bed.char_diameter=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
-help.state.minfo.sediment.load.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
-help.state.minfo.sediment.load.epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
-help.state.minfo.sediment.load.off_epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
-help.state.minfo.sediment.load.unit=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
-help.state.minfo.sq.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.period
+help.state.minfo.river=${help.url}/OnlineHilfe/MINFO#help.state.minfo.river
+help.state.minfo.calculation_mode=${help.url}/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
+help.state.minfo.distance_only=${help.url}/OnlineHilfe/MINFO#help.state.minfo.distance_only
+help.state.minfo.bed.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
+help.state.minfo.sq.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.location
+help.state.minfo.bed.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.location
+help.state.minfo.dischargestate=${help.url}/OnlineHilfe/MINFO#help.state.minfo.dischargestate
+help.state.minfo.soundings=${help.url}/OnlineHilfe/MINFO#help.state.minfo.soundings
+help.state.minfo.bed.difference_select=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
+help.state.minfo.sq.outliers=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
+help.state.minfo.sediment.load.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
+help.state.minfo.sediment.load.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
+help.state.minfo.bed.periods=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.periods
+help.state.minfo.bed.char_diameter=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
+help.state.minfo.sediment.load.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
+help.state.minfo.sediment.load.epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
+help.state.minfo.sediment.load.off_epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
+help.state.minfo.sediment.load.unit=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
+help.state.minfo.sq.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.period
 
 
 fix.reference.period=Reference period
@@ -614,18 +615,18 @@
 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}
 
-help.state.fix.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
-help.state.fix.calculation.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
-help.state.fix.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
-help.state.fix.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
-help.state.fix.gaugerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
-help.state.fix.eventselect=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
-help.state.fix.analysis.referenceperiod=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
-help.state.fix.analysis.analysisperiods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
-help.state.fix.analysis.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
-help.state.fix.analysis.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
-help.state.fix.analysis.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
-help.state.fix.vollmer.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
-help.state.fix.vollmer.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
-help.state.fix.vollmer.qs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
-help.state.fix.vollmer.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
+help.state.fix.river=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
+help.state.fix.calculation.mode=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
+help.state.fix.location=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
+help.state.fix.period=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
+help.state.fix.gaugerange=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
+help.state.fix.eventselect=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
+help.state.fix.analysis.referenceperiod=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
+help.state.fix.analysis.analysisperiods=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
+help.state.fix.analysis.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
+help.state.fix.analysis.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
+help.state.fix.analysis.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
+help.state.fix.vollmer.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
+help.state.fix.vollmer.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
+help.state.fix.vollmer.qs=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
+help.state.fix.vollmer.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
--- a/flys-artifacts/src/main/resources/messages_de.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/resources/messages_de.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -247,11 +247,11 @@
 facet.sedimentload.susp_sediment = Schwebstoff
 facet.sedimentload.total = Gesamt
 facet.sedimentload.total_load = Gesamt Geschiebe
-missing.fraction.coarse = Fehlende Fraktion: grober Kies
-missing.fraction.fine_middle = Fehlende Fraktion: fein/mittlerer Kies
-missing.fraction.sand = Fehlende Fraktion: Sand
-missing.fraction.susp_sand = Fehlende Fraktion: susp. Sand
-missing.fraction.susp_sediment = Fehlende Fraktion: Schwebstoffe
+missing.fraction.coarse = Jahr {0}: Fehlende Fraktion: grober Kies
+missing.fraction.fine_middle = Jahr {0}: Fehlende Fraktion: fein/mittlerer Kies
+missing.fraction.sand = Jahr {0}: Fehlende Fraktion: Sand
+missing.fraction.susp_sand = Jahr {0}: Fehlende Fraktion: susp. Sand
+missing.fraction.susp_sediment = Jahr {0}: Fehlende Fraktion: Schwebstoffe
 missing.data.coarse = Fehlende Daten bei grobem Kies
 missing.data.fine_middle = Fehlende Daten bei fein/mittlerem Kies
 missing.data.sand = Fehlende Daten bei Sand
@@ -281,13 +281,13 @@
 facet.bedquality.bedload.diameter = {0}_Geschiebe
 bedquality.toplayer = 0,0m - 0,3m
 bedquality.sublayer = 0,1m - 0,5m
-facet.bedheight.diff.year = Sohlh\u00f6hendiffernez {0}
-facet.bedheight.diff.morph = Morphologische Breite {0}
+facet.bedheight.diff.year = Sohlh\u00f6hendifferenz {0}
+facet.bedheight.diff.morph = gepeilte Breite {0}
 facet.bedheight.diff.height1 = H\u00f6he Minuend {0}
 facet.bedheight.diff.height2 = H\u00f6he Subtrahend {0}
 facet.bedheight.diff.absolute = Sohlh\u00f6hendifferenz/Jahr {0}
 facet.bedheight.diff.epoch = Sohlh\u00f6hendifferenz {0}
-facet.bedheight.diff.year.raw = Sohlh\u00f6hendiffernez {0} (Rohdaten)
+facet.bedheight.diff.year.raw = Sohlh\u00f6hendifferenz {0} (Rohdaten)
 facet.bedheight.diff.height1.raw = H\u00f6he Minuend {0} (Rohdaten)
 facet.bedheight.diff.height2.raw = H\u00f6he Subtrahend {0} (Rohdaten)
 facet.bedheight.diff.absolute.raw = Sohlh\u00f6hendifferenz/Jahr {0} (Rohdaten)
@@ -297,6 +297,7 @@
 facet.gauge_discharge_curve.reference_gauge = Pegelnummer
 facet.gauge_discharge_curve.gauge_name = Pegelname
 facet.gauge_discharge_curve.gauge_location = Pegelort
+facet.morphologic.width = Morphologische Breite
 
 chart.beddifference.height.title = Sohlh\u00f6hendifferenz
 chart.beddifference.height.xaxis.label = Fluss-Km [km]
@@ -306,7 +307,7 @@
 chart.beddifference.yaxis.label.diff = Differenz [m]
 chart.beddifference.yaxis.label.height = Absolute H\u00f6he [m]
 chart.beddifference.year.title = Sohlh\u00f6hendifferenz
-chart.beddifference.yaxis.label.morph = Morphologische Breite [m]
+chart.beddifference.yaxis.label.morph = Breite [m]
 chart.beddifference.yaxis.label.heights = Absolute H\u00f6he [m]
 
 export.waterlevel.csv.header.km = Fluss-Km
@@ -473,54 +474,54 @@
 no.reference.end.kms = Keine Endkilometerstation(en) angegeben.
 waterlevels = Wasserst\u00e4nde
 
-help.index=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe
-help.state.winfo=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO
-help.state.winfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.river
-help.state.winfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
-help.state.winfo.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location
-help.state.winfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance_only
-help.state.winfo.distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance
-help.state.winfo.location_distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location_distance
-help.state.winfo.wq=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq
-help.state.winfo.wq_adapted=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
-help.state.winfo.waterlevel_pair_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
-help.state.winfo.reference.curve.input.start=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
-help.state.winfo.reference.curve.input.end=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
-help.state.winfo.uesk.wsp=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
-help.state.winfo.uesk.dgm=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
-help.state.winfo.uesk.profiles=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
-help.state.winfo.uesk.floodplain=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
-help.state.winfo.uesk.differences=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
-help.state.winfo.uesk.scenario=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.dc-hws=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.user-rgd=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.barriers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.historicalq.reference_gauge=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
-help.state.winfo.historicalq.timerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
-help.state.winfo.historicalq.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
-help.state.winfo.function_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.function_select
-help.state.winfo.extreme.percent=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
-help.state.winfo.extreme.qinput=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
+help.index=${help.url}/OnlineHilfe
+help.state.winfo=${help.url}/OnlineHilfe/WINFO
+help.state.winfo.river=${help.url}/OnlineHilfe/WINFO#help.state.winfo.river
+help.state.winfo.calculation_mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
+help.state.winfo.location=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location
+help.state.winfo.distance_only=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance_only
+help.state.winfo.distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance
+help.state.winfo.location_distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location_distance
+help.state.winfo.wq=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq
+help.state.winfo.wq_adapted=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
+help.state.winfo.waterlevel_pair_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
+help.state.winfo.reference.curve.input.start=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
+help.state.winfo.reference.curve.input.end=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
+help.state.winfo.uesk.wsp=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
+help.state.winfo.uesk.dgm=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
+help.state.winfo.uesk.profiles=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
+help.state.winfo.uesk.floodplain=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
+help.state.winfo.uesk.differences=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
+help.state.winfo.uesk.scenario=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.dc-hws=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.user-rgd=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.barriers=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.historicalq.reference_gauge=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
+help.state.winfo.historicalq.timerange=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
+help.state.winfo.historicalq.mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
+help.state.winfo.function_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.function_select
+help.state.winfo.extreme.percent=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
+help.state.winfo.extreme.qinput=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
 
-help.state.minfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.river
-help.state.minfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
-help.state.minfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.distance_only
-help.state.minfo.bed.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
-help.state.minfo.sq.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.location
-help.state.minfo.bed.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.location
-help.state.minfo.dischargestate=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.dischargestate
-help.state.minfo.soundings=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.soundings
-help.state.minfo.bed.difference_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
-help.state.minfo.sq.outliers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
-help.state.minfo.sediment.load.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
-help.state.minfo.sediment.load.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
-help.state.minfo.bed.periods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.periods
-help.state.minfo.bed.char_diameter=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
-help.state.minfo.sediment.load.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
-help.state.minfo.sediment.load.epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
-help.state.minfo.sediment.load.off_epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
-help.state.minfo.sediment.load.unit=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
-help.state.minfo.sq.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.period
+help.state.minfo.river=${help.url}/OnlineHilfe/MINFO#help.state.minfo.river
+help.state.minfo.calculation_mode=${help.url}/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
+help.state.minfo.distance_only=${help.url}/OnlineHilfe/MINFO#help.state.minfo.distance_only
+help.state.minfo.bed.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
+help.state.minfo.sq.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.location
+help.state.minfo.bed.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.location
+help.state.minfo.dischargestate=${help.url}/OnlineHilfe/MINFO#help.state.minfo.dischargestate
+help.state.minfo.soundings=${help.url}/OnlineHilfe/MINFO#help.state.minfo.soundings
+help.state.minfo.bed.difference_select=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
+help.state.minfo.sq.outliers=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
+help.state.minfo.sediment.load.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
+help.state.minfo.sediment.load.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
+help.state.minfo.bed.periods=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.periods
+help.state.minfo.bed.char_diameter=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
+help.state.minfo.sediment.load.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
+help.state.minfo.sediment.load.epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
+help.state.minfo.sediment.load.off_epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
+help.state.minfo.sediment.load.unit=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
+help.state.minfo.sq.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.period
 
 
 fix.reference.period=Bezugszeitraum
@@ -617,18 +618,18 @@
 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}
 
-help.state.fix.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
-help.state.fix.calculation.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
-help.state.fix.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
-help.state.fix.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
-help.state.fix.gaugerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
-help.state.fix.eventselect=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
-help.state.fix.analysis.referenceperiod=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
-help.state.fix.analysis.analysisperiods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
-help.state.fix.analysis.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
-help.state.fix.analysis.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
-help.state.fix.analysis.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
-help.state.fix.vollmer.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
-help.state.fix.vollmer.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
-help.state.fix.vollmer.qs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
-help.state.fix.vollmer.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
+help.state.fix.river=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
+help.state.fix.calculation.mode=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
+help.state.fix.location=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
+help.state.fix.period=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
+help.state.fix.gaugerange=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
+help.state.fix.eventselect=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
+help.state.fix.analysis.referenceperiod=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
+help.state.fix.analysis.analysisperiods=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
+help.state.fix.analysis.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
+help.state.fix.analysis.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
+help.state.fix.analysis.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
+help.state.fix.vollmer.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
+help.state.fix.vollmer.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
+help.state.fix.vollmer.qs=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
+help.state.fix.vollmer.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
--- a/flys-artifacts/src/main/resources/messages_de_DE.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/resources/messages_de_DE.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -244,11 +244,11 @@
 facet.sedimentload.susp_sediment = Schwebstoff
 facet.sedimentload.total = Gesamt
 facet.sedimentload.total_load = Gesamt Geschiebe
-missing.fraction.coarse = Fehlende Fraktion: grober Kies
-missing.fraction.fine_middle = Fehlende Fraktion: fein/mittlerer Kies
-missing.fraction.sand = Fehlende Fraktion: Sand
-missing.fraction.susp_sand = Fehlende Fraktion: susp. Sand
-missing.fraction.susp_sediment = Fehlende Fraktion: Schwebstoffe
+missing.fraction.coarse = Jahr {0}: Fehlende Fraktion: grober Kies
+missing.fraction.fine_middle = Jahr {0}: Fehlende Fraktion: fein/mittlerer Kies
+missing.fraction.sand = Jahr {0}: Fehlende Fraktion: Sand
+missing.fraction.susp_sand = Jahr {0}: Fehlende Fraktion: susp. Sand
+missing.fraction.susp_sediment = Jahr {0}: Fehlende Fraktion: Schwebstoffe
 missing.data.coarse = Fehlende Daten bei grobem Kies
 missing.data.fine_middle = Fehlende Daten bei fein/mittlerem Kies
 missing.data.sand = Fehlende Daten bei Sand
@@ -278,9 +278,9 @@
 facet.bedquality.bedload.diameter = {0}_Geschiebe
 bedquality.toplayer = 0,0m - 0,3m
 bedquality.sublayer = 0,1m - 0,5m
-facet.bedheight.diff.year = Sohlh\u00f6hendiffernez {0}
-facet.bedheight.diff.year.raw = Sohlh\u00f6hendiffernez {0} (Rohdaten)
-facet.bedheight.diff.morph = Morphologische Breite {0}
+facet.bedheight.diff.year = Sohlh\u00f6hendifferenz {0}
+facet.bedheight.diff.year.raw = Sohlh\u00f6hendifferenz {0} (Rohdaten)
+facet.bedheight.diff.morph = gepeilte Breite {0}
 facet.bedheight.diff.height1 = H\u00f6he Minuend {0}
 facet.bedheight.diff.height2 = H\u00f6he Subtrahend {0}
 facet.bedheight.diff.absolute = Sohlh\u00f6hendifferenz/Jahr {0}
@@ -294,6 +294,7 @@
 facet.gauge_discharge_curve.reference_gauge = Pegelnummer
 facet.gauge_discharge_curve.gauge_name = Pegelname
 facet.gauge_discharge_curve.gauge_location = Pegelort
+facet.morphologic.width = Morphologische Breite
 
 chart.beddifference.height.title = Sohlh\u00f6hendifferenz
 chart.beddifference.height.xaxis.label = Fluss-Km [km]
@@ -303,7 +304,7 @@
 chart.beddifference.yaxis.label.diff = Differenz [m]
 chart.beddifference.yaxis.label.height = Absolute H\u00f6he [m]
 chart.beddifference.year.title = Sohlh\u00f6hendifferenz
-chart.beddifference.yaxis.label.morph = Morphologische Breite [m]
+chart.beddifference.yaxis.label.morph = Breite [m]
 chart.beddifference.yaxis.label.heights = Absolute H\u00f6he [m]
 
 export.waterlevel.csv.header.km = Fluss-Km
@@ -469,54 +470,54 @@
 no.reference.end.kms = Keine Endkilometerstation(en) angegeben.
 waterlevels = Wasserst\u00e4nde
 
-help.index=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe
-help.state.winfo=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO
-help.state.winfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.river
-help.state.winfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
-help.state.winfo.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location
-help.state.winfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance_only
-help.state.winfo.distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance
-help.state.winfo.location_distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location_distance
-help.state.winfo.wq=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq
-help.state.winfo.wq_adapted=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
-help.state.winfo.waterlevel_pair_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
-help.state.winfo.reference.curve.input.start=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
-help.state.winfo.reference.curve.input.end=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
-help.state.winfo.uesk.wsp=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
-help.state.winfo.uesk.dgm=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
-help.state.winfo.uesk.profiles=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
-help.state.winfo.uesk.floodplain=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
-help.state.winfo.uesk.differences=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
-help.state.winfo.uesk.scenario=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.dc-hws=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.user-rgd=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.barriers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.historicalq.reference_gauge=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
-help.state.winfo.historicalq.timerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
-help.state.winfo.historicalq.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
-help.state.winfo.function_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.function_select
-help.state.winfo.extreme.percent=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
-help.state.winfo.extreme.qinput=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
+help.index=${help.url}/OnlineHilfe
+help.state.winfo=${help.url}/OnlineHilfe/WINFO
+help.state.winfo.river=${help.url}/OnlineHilfe/WINFO#help.state.winfo.river
+help.state.winfo.calculation_mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
+help.state.winfo.location=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location
+help.state.winfo.distance_only=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance_only
+help.state.winfo.distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance
+help.state.winfo.location_distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location_distance
+help.state.winfo.wq=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq
+help.state.winfo.wq_adapted=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
+help.state.winfo.waterlevel_pair_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
+help.state.winfo.reference.curve.input.start=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
+help.state.winfo.reference.curve.input.end=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
+help.state.winfo.uesk.wsp=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
+help.state.winfo.uesk.dgm=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
+help.state.winfo.uesk.profiles=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
+help.state.winfo.uesk.floodplain=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
+help.state.winfo.uesk.differences=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
+help.state.winfo.uesk.scenario=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.dc-hws=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.user-rgd=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.barriers=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.historicalq.reference_gauge=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
+help.state.winfo.historicalq.timerange=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
+help.state.winfo.historicalq.mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
+help.state.winfo.function_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.function_select
+help.state.winfo.extreme.percent=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
+help.state.winfo.extreme.qinput=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
 
-help.state.minfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.river
-help.state.minfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
-help.state.minfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.distance_only
-help.state.minfo.bed.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
-help.state.minfo.sq.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.location
-help.state.minfo.bed.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.location
-help.state.minfo.dischargestate=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.dischargestate
-help.state.minfo.soundings=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.soundings
-help.state.minfo.bed.difference_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
-help.state.minfo.sq.outliers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
-help.state.minfo.sediment.load.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
-help.state.minfo.sediment.load.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
-help.state.minfo.bed.periods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.periods
-help.state.minfo.bed.char_diameter=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
-help.state.minfo.sediment.load.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
-help.state.minfo.sediment.load.epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
-help.state.minfo.sediment.load.off_epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
-help.state.minfo.sediment.load.unit=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
-help.state.minfo.sq.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.period
+help.state.minfo.river=${help.url}/OnlineHilfe/MINFO#help.state.minfo.river
+help.state.minfo.calculation_mode=${help.url}/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
+help.state.minfo.distance_only=${help.url}/OnlineHilfe/MINFO#help.state.minfo.distance_only
+help.state.minfo.bed.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
+help.state.minfo.sq.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.location
+help.state.minfo.bed.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.location
+help.state.minfo.dischargestate=${help.url}/OnlineHilfe/MINFO#help.state.minfo.dischargestate
+help.state.minfo.soundings=${help.url}/OnlineHilfe/MINFO#help.state.minfo.soundings
+help.state.minfo.bed.difference_select=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
+help.state.minfo.sq.outliers=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
+help.state.minfo.sediment.load.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
+help.state.minfo.sediment.load.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
+help.state.minfo.bed.periods=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.periods
+help.state.minfo.bed.char_diameter=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
+help.state.minfo.sediment.load.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
+help.state.minfo.sediment.load.epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
+help.state.minfo.sediment.load.off_epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
+help.state.minfo.sediment.load.unit=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
+help.state.minfo.sq.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.period
 
 
 fix.reference.period=Bezugszeitraum
@@ -615,18 +616,18 @@
 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}
 
-help.state.fix.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
-help.state.fix.calculation.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
-help.state.fix.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
-help.state.fix.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
-help.state.fix.gaugerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
-help.state.fix.eventselect=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
-help.state.fix.analysis.referenceperiod=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
-help.state.fix.analysis.analysisperiods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
-help.state.fix.analysis.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
-help.state.fix.analysis.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
-help.state.fix.analysis.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
-help.state.fix.vollmer.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
-help.state.fix.vollmer.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
-help.state.fix.vollmer.qs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
-help.state.fix.vollmer.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
+help.state.fix.river=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
+help.state.fix.calculation.mode=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
+help.state.fix.location=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
+help.state.fix.period=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
+help.state.fix.gaugerange=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
+help.state.fix.eventselect=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
+help.state.fix.analysis.referenceperiod=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
+help.state.fix.analysis.analysisperiods=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
+help.state.fix.analysis.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
+help.state.fix.analysis.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
+help.state.fix.analysis.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
+help.state.fix.vollmer.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
+help.state.fix.vollmer.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
+help.state.fix.vollmer.qs=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
+help.state.fix.vollmer.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
--- a/flys-artifacts/src/main/resources/messages_en.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-artifacts/src/main/resources/messages_en.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -248,11 +248,11 @@
 facet.sedimentload.susp_sediment = Sediement
 facet.sedimentload.total = Total
 facet.sedimentload.total_load = Total bed load
-missing.fraction.coarse = Missing coarse fraction
-missing.fraction.fine_middle = Missing fine/middle fraction
-missing.fraction.sand = Missing sand fraction
-missing.fraction.susp_sand = Missing susp. sand fraction
-missing.fraction.susp_sediment = Missing susp. sediment fraction
+missing.fraction.coarse = Year {0}: Missing coarse fraction
+missing.fraction.fine_middle = Year {0}: Missing fine/middle fraction
+missing.fraction.sand = Year {0}: Missing sand fraction
+missing.fraction.susp_sand = Year {0}: Missing susp. sand fraction
+missing.fraction.susp_sediment = Year {0}: Missing susp. sediment fraction
 missing.data.coarse = Missing coarse data at
 missing.data.fine_middle = Missing fine/middle data at
 missing.data.sand = Missing sand data at
@@ -284,7 +284,7 @@
 bedquality.toplayer = 0.0m - 0.3m
 bedquality.sublayer = 0.1m - 0.5m
 facet.bedheight.diff.year = Bedheight Difference {0}
-facet.bedheight.diff.morph = Morphologic Width {0}
+facet.bedheight.diff.morph = sounding Width {0}
 facet.bedheight.diff.height1 = Original Height Minuend {0}
 facet.bedheight.diff.height2 = Original Height Subtrahend {0}
 facet.bedheight.diff.absolute = Bedheight Difference/Year {0}
@@ -299,6 +299,7 @@
 facet.gauge_discharge_curve.reference_gauge = Gauge official number
 facet.gauge_discharge_curve.gauge_name = Name of the gauge
 facet.gauge_discharge_curve.gauge_location = Location of the gauge
+facet.morphologic.width = morphologic Width
 
 chart.beddifference.height.title = Bedheight Difference
 chart.beddifference.height.xaxis.label = River-Km [km]
@@ -308,7 +309,7 @@
 chart.beddifference.yaxis.label.diff = Difference [m]
 chart.beddifference.yaxis.label.height = Absolute Height [m]
 chart.beddifference.year.title = Bedheight Difference
-chart.beddifference.yaxis.label.morph = Morphologic Width [m]
+chart.beddifference.yaxis.label.morph = Width [m]
 chart.beddifference.yaxis.label.heights = Absolute Height [m]
 
 export.waterlevel.csv.header.km = River-Km
@@ -474,54 +475,54 @@
 no.reference.end.kms = No reference end station(s) given.
 waterlevels = Waterlevels
 
-help.index=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe
-help.state.winfo=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO
-help.state.winfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.river
-help.state.winfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
-help.state.winfo.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location
-help.state.winfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance_only
-help.state.winfo.distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.distance
-help.state.winfo.location_distance=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.location_distance
-help.state.winfo.wq=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq
-help.state.winfo.wq_adapted=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
-help.state.winfo.waterlevel_pair_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
-help.state.winfo.reference.curve.input.start=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
-help.state.winfo.reference.curve.input.end=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
-help.state.winfo.uesk.wsp=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
-help.state.winfo.uesk.dgm=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
-help.state.winfo.uesk.profiles=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
-help.state.winfo.uesk.floodplain=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
-help.state.winfo.uesk.differences=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
-help.state.winfo.uesk.scenario=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.dc-hws=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.user-rgd=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.uesk.barriers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
-help.state.winfo.historicalq.reference_gauge=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
-help.state.winfo.historicalq.timerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
-help.state.winfo.historicalq.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
-help.state.winfo.function_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.function_select
-help.state.winfo.extreme.percent=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
-help.state.winfo.extreme.qinput=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
+help.index=${help.url}/OnlineHilfe
+help.state.winfo=${help.url}/OnlineHilfe/WINFO
+help.state.winfo.river=${help.url}/OnlineHilfe/WINFO#help.state.winfo.river
+help.state.winfo.calculation_mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.calculation_mode
+help.state.winfo.location=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location
+help.state.winfo.distance_only=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance_only
+help.state.winfo.distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.distance
+help.state.winfo.location_distance=${help.url}/OnlineHilfe/WINFO#help.state.winfo.location_distance
+help.state.winfo.wq=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq
+help.state.winfo.wq_adapted=${help.url}/OnlineHilfe/WINFO#help.state.winfo.wq_adapted
+help.state.winfo.waterlevel_pair_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.waterlevel_pair_select
+help.state.winfo.reference.curve.input.start=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.start
+help.state.winfo.reference.curve.input.end=${help.url}/OnlineHilfe/WINFO#help.state.winfo.reference.curve.input.end
+help.state.winfo.uesk.wsp=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.wsp
+help.state.winfo.uesk.dgm=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.dgm
+help.state.winfo.uesk.profiles=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.profiles
+help.state.winfo.uesk.floodplain=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.floodplain
+help.state.winfo.uesk.differences=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.differences
+help.state.winfo.uesk.scenario=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.dc-hws=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.user-rgd=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.uesk.barriers=${help.url}/OnlineHilfe/WINFO#help.state.winfo.uesk.scenario
+help.state.winfo.historicalq.reference_gauge=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.reference_gauge
+help.state.winfo.historicalq.timerange=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.timerange
+help.state.winfo.historicalq.mode=${help.url}/OnlineHilfe/WINFO#help.state.winfo.historicalq.mode
+help.state.winfo.function_select=${help.url}/OnlineHilfe/WINFO#help.state.winfo.function_select
+help.state.winfo.extreme.percent=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.percent
+help.state.winfo.extreme.qinput=${help.url}/OnlineHilfe/WINFO#help.state.winfo.extreme.qinput
 
-help.state.minfo.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.river
-help.state.minfo.calculation_mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
-help.state.minfo.distance_only=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.distance_only
-help.state.minfo.bed.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
-help.state.minfo.sq.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.location
-help.state.minfo.bed.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.location
-help.state.minfo.dischargestate=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.dischargestate
-help.state.minfo.soundings=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.soundings
-help.state.minfo.bed.difference_select=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
-help.state.minfo.sq.outliers=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
-help.state.minfo.sediment.load.year_epoch=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
-help.state.minfo.sediment.load.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
-help.state.minfo.bed.periods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.periods
-help.state.minfo.bed.char_diameter=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
-help.state.minfo.sediment.load.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
-help.state.minfo.sediment.load.epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
-help.state.minfo.sediment.load.off_epochs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
-help.state.minfo.sediment.load.unit=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
-help.state.minfo.sq.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/MINFO#help.state.minfo.sq.period
+help.state.minfo.river=${help.url}/OnlineHilfe/MINFO#help.state.minfo.river
+help.state.minfo.calculation_mode=${help.url}/OnlineHilfe/MINFO#help.state.minfo.calculation_mode
+help.state.minfo.distance_only=${help.url}/OnlineHilfe/MINFO#help.state.minfo.distance_only
+help.state.minfo.bed.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.year_epoch
+help.state.minfo.sq.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.location
+help.state.minfo.bed.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.location
+help.state.minfo.dischargestate=${help.url}/OnlineHilfe/MINFO#help.state.minfo.dischargestate
+help.state.minfo.soundings=${help.url}/OnlineHilfe/MINFO#help.state.minfo.soundings
+help.state.minfo.bed.difference_select=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.difference_select
+help.state.minfo.sq.outliers=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.outliers
+help.state.minfo.sediment.load.year_epoch=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.year_epoch
+help.state.minfo.sediment.load.location=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.location
+help.state.minfo.bed.periods=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.periods
+help.state.minfo.bed.char_diameter=${help.url}/OnlineHilfe/MINFO#help.state.minfo.bed.char_diameter
+help.state.minfo.sediment.load.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.period
+help.state.minfo.sediment.load.epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.epochs
+help.state.minfo.sediment.load.off_epochs=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.off_epochs
+help.state.minfo.sediment.load.unit=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sediment.load.unit
+help.state.minfo.sq.period=${help.url}/OnlineHilfe/MINFO#help.state.minfo.sq.period
 
 
 fix.reference.period=Reference period
@@ -615,18 +616,18 @@
 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}
 
-help.state.fix.river=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
-help.state.fix.calculation.mode=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
-help.state.fix.location=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
-help.state.fix.period=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
-help.state.fix.gaugerange=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
-help.state.fix.eventselect=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
-help.state.fix.analysis.referenceperiod=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
-help.state.fix.analysis.analysisperiods=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
-help.state.fix.analysis.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
-help.state.fix.analysis.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
-help.state.fix.analysis.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
-help.state.fix.vollmer.function=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
-help.state.fix.vollmer.preprocessing=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
-help.state.fix.vollmer.qs=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
-help.state.fix.vollmer.compute=https://flys-intern.intevation.de/Flys-3.0/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
+help.state.fix.river=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.river
+help.state.fix.calculation.mode=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.calculation.mode
+help.state.fix.location=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.location
+help.state.fix.period=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.period
+help.state.fix.gaugerange=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.gaugerange
+help.state.fix.eventselect=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.eventselect
+help.state.fix.analysis.referenceperiod=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.referenceperiod
+help.state.fix.analysis.analysisperiods=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.analysisperiods
+help.state.fix.analysis.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.function
+help.state.fix.analysis.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.preprocessing
+help.state.fix.analysis.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.analysis.compute
+help.state.fix.vollmer.function=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.function
+help.state.fix.vollmer.preprocessing=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.preprocessing
+help.state.fix.vollmer.qs=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.qs
+help.state.fix.vollmer.compute=${help.url}/OnlineHilfe/Fixierungsanalyse#help.state.fix.vollmer.compute
--- a/flys-backend/contrib/shpimporter/boundaries.py	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/contrib/shpimporter/boundaries.py	Sun Apr 21 10:46:59 2013 +0200
@@ -59,13 +59,9 @@
         newFeat.SetField("kind", kind)
         if self.IsFieldSet(feat, "SECTIE"):
             newFeat.SetField("sectie", feat.GetField("SECTIE"))
-        else:
-            newFeat.SetField("sectie", 0)
 
-        if self.IsFieldSet(feat, "SOBEK"):
-            newFeat.SetField("sobek", feat.GetField("SOBEK"))
-        else:
-            newFeat.SetField("sobek", 0)
+        if self.IsFieldSet(feat, "STROVOER"):
+            newFeat.SetField("sobek", feat.GetField("STROVOER"))
 
         if self.IsFieldSet(feat, "river_id"):
             newFeat.SetField("river_id", feat.GetField("river_id"))
@@ -106,13 +102,9 @@
 
         if self.IsFieldSet(feat, "SECTIE"):
             newFeat.SetField("sectie", feat.GetField("SECTIE"))
-        else:
-            newFeat.SetField("sectie", 0)
 
         if self.IsFieldSet(feat, "SOBEK"):
             newFeat.SetField("sobek", feat.GetField("SOBEK"))
-        else:
-            newFeat.SetField("sobek", 0)
 
         if self.IsFieldSet(feat, "river_id"):
             newFeat.SetField("river_id", feat.GetField("river_id"))
--- a/flys-backend/doc/schema/oracle-minfo.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/oracle-minfo.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -207,6 +207,7 @@
     main_channel            NUMBER(38,3) NOT NULL,
     shear_stress            NUMBER(38,3) NOT NULL,
     PRIMARY KEY(id),
+    UNIQUE (station, flow_velocity_model_id),
     CONSTRAINT fk_fvv_flow_velocity_model_id FOREIGN KEY (flow_velocity_model_id) REFERENCES flow_velocity_model(id) ON DELETE CASCADE
 );
 
@@ -331,5 +332,5 @@
     cduan                    NUMBER(38,20),
     PRIMARY KEY (id),
     CONSTRAINT fk_sqr_id FOREIGN KEY (sq_relation_id) REFERENCES sq_relation(id) ON DELETE CASCADE,
-    CONSTRAINT fk_mstation_id FOREIGN KEY (measurement_station_id) REFERENCES measurement_station(id)
+    CONSTRAINT fk_mstation_id FOREIGN KEY (measurement_station_id) REFERENCES measurement_station(id) ON DELETE CASCADE
 );
--- a/flys-backend/doc/schema/oracle-spatial.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/oracle-spatial.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -237,23 +237,23 @@
         SELECT HWS_LINES_ID_SEQ.nextval INTO :new.id FROM dual;
     END;
 /
--- HWS Points lookup tables
+
 CREATE TABLE sectie_kinds (
     id NUMBER PRIMARY KEY NOT NULL,
     name VARCHAR(64) NOT NULL
 );
-INSERT INTO sectie_kinds (id, name) VALUES (0, 'SECTIE Unbekannt');
-INSERT INTO sectie_kinds (id, name) VALUES (1, 'Flussschlauch');
-INSERT INTO sectie_kinds (id, name) VALUES (2, 'Uferbank');
-INSERT INTO sectie_kinds (id, name) VALUES (3, 'Überflutungsbereich');
+INSERT INTO sectie_kinds (id, name) VALUES (0, 'nicht berücksichtigt');
+INSERT INTO sectie_kinds (id, name) VALUES (1, 'Hauptgerinne');
+INSERT INTO sectie_kinds (id, name) VALUES (2, 'Uferbereich');
+INSERT INTO sectie_kinds (id, name) VALUES (3, 'Vorland');
 
 CREATE TABLE sobek_kinds (
     id NUMBER PRIMARY KEY NOT NULL,
     name VARCHAR(64) NOT NULL
 );
-INSERT INTO sobek_kinds (id, name) VALUES (0, 'SOBEK Unbekannt');
-INSERT INTO sobek_kinds (id, name) VALUES (1, 'Stromführend');
-INSERT INTO sobek_kinds (id, name) VALUES (2, 'Stromspeichernd');
+INSERT INTO sobek_kinds (id, name) VALUES (0, 'nicht berücksichtigt');
+INSERT INTO sobek_kinds (id, name) VALUES (1, 'durchströmt');
+INSERT INTO sobek_kinds (id, name) VALUES (2, 'nicht durchströmt');
 
 CREATE TABLE boundary_kinds (
     id NUMBER PRIMARY KEY NOT NULL,
@@ -338,8 +338,8 @@
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
     name VARCHAR(255),
     kind   NUMBER(38) DEFAULT 0 NOT NULL REFERENCES boundary_kinds(id),
-    sectie NUMBER(38) DEFAULT 0 NOT NULL REFERENCES sectie_kinds(id),
-    sobek  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES sobek_kinds(id),
+    sectie NUMBER(38) REFERENCES sectie_kinds(id),
+    sobek  NUMBER(38) REFERENCES sobek_kinds(id),
     path     VARCHAR(256),
     id NUMBER PRIMARY KEY NOT NULL
 );
@@ -357,8 +357,8 @@
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
     name VARCHAR(255),
     kind   NUMBER(38) DEFAULT 0 NOT NULL REFERENCES boundary_kinds(id),
-    sectie NUMBER(38) DEFAULT 0 NOT NULL REFERENCES sectie_kinds(id),
-    sobek  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES sobek_kinds(id),
+    sectie NUMBER(38) REFERENCES sectie_kinds(id),
+    sobek  NUMBER(38) REFERENCES sobek_kinds(id),
     path     VARCHAR(256),
     id NUMBER PRIMARY KEY NOT NULL
 );
--- a/flys-backend/doc/schema/oracle.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/oracle.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -220,7 +220,7 @@
 
 CREATE TABLE named_main_values (
     id                  NUMBER(38,0) NOT NULL,
-    name                VARCHAR2(255),
+    name                VARCHAR2(256) NOT NULL UNIQUE,
     type_id             NUMBER(38,0),
     PRIMARY KEY (id)
 );
--- a/flys-backend/doc/schema/postgresql-minfo.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/postgresql-minfo.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -207,6 +207,7 @@
     main_channel            NUMERIC NOT NULL,
     shear_stress            NUMERIC NOT NULL,
     PRIMARY KEY(id),
+    UNIQUE (station, flow_velocity_model_id),
     CONSTRAINT fk_fvv_flow_velocity_model_id FOREIGN KEY (flow_velocity_model_id) REFERENCES flow_velocity_model(id) ON DELETE CASCADE
 );
 
@@ -331,6 +332,6 @@
     cduan                  NUMERIC,
     PRIMARY KEY (id),
     CONSTRAINT fk_sqr_id FOREIGN KEY (sq_relation_id) REFERENCES sq_relation(id) ON DELETE CASCADE,
-    CONSTRAINT fk_mstation_id FOREIGN KEY (measurement_station_id) REFERENCES measurement_station(id)
+    CONSTRAINT fk_mstation_id FOREIGN KEY (measurement_station_id) REFERENCES measurement_station(id) ON DELETE CASCADE
 );
 COMMIT;
--- a/flys-backend/doc/schema/postgresql-spatial.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/postgresql-spatial.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -250,18 +250,18 @@
     id int PRIMARY KEY NOT NULL,
     name VARCHAR(64) NOT NULL
 );
-INSERT INTO sectie_kinds (id, name) VALUES (0, 'SECTIE Unbekannt');
-INSERT INTO sectie_kinds (id, name) VALUES (1, 'Flussschlauch');
-INSERT INTO sectie_kinds (id, name) VALUES (2, 'Uferbank');
-INSERT INTO sectie_kinds (id, name) VALUES (3, 'Überflutungsbereich');
+INSERT INTO sectie_kinds (id, name) VALUES (0, 'nicht berücksichtigt');
+INSERT INTO sectie_kinds (id, name) VALUES (1, 'Hauptgerinne');
+INSERT INTO sectie_kinds (id, name) VALUES (2, 'Uferbereich');
+INSERT INTO sectie_kinds (id, name) VALUES (3, 'Vorland');
 
 CREATE TABLE sobek_kinds (
     id int PRIMARY KEY NOT NULL,
     name VARCHAR(64) NOT NULL
 );
-INSERT INTO sobek_kinds (id, name) VALUES (0, 'SOBEK Unbekannt');
-INSERT INTO sobek_kinds (id, name) VALUES (1, 'Stromführend');
-INSERT INTO sobek_kinds (id, name) VALUES (2, 'Stromspeichernd');
+INSERT INTO sobek_kinds (id, name) VALUES (0, 'nicht berücksichtigt');
+INSERT INTO sobek_kinds (id, name) VALUES (1, 'durchströmt');
+INSERT INTO sobek_kinds (id, name) VALUES (2, 'nicht durchströmt');
 
 CREATE TABLE boundary_kinds (
     id int PRIMARY KEY NOT NULL,
@@ -278,8 +278,8 @@
     river_id   int REFERENCES rivers(id) ON DELETE CASCADE,
     name       VARCHAR(255),
     kind       int REFERENCES boundary_kinds(id) NOT NULL DEFAULT 0,
-    sectie     int REFERENCES sectie_kinds(id) NOT NULL DEFAULT 0,
-    sobek      int REFERENCES sobek_kinds(id) NOT NULL DEFAULT 0,
+    sectie     int REFERENCES sectie_kinds(id),
+    sobek      int REFERENCES sobek_kinds(id),
     path       VARCHAR(256)
 );
 SELECT AddGeometryColumn('hydr_boundaries','geom',31467,'MULTILINESTRING',3);
@@ -292,8 +292,8 @@
     river_id   int REFERENCES rivers(id) ON DELETE CASCADE,
     name       VARCHAR(255),
     kind       int REFERENCES boundary_kinds(id) NOT NULL DEFAULT 0,
-    sectie     int REFERENCES sectie_kinds(id) NOT NULL DEFAULT 0,
-    sobek      int REFERENCES sobek_kinds(id) NOT NULL DEFAULT 0,
+    sectie     int REFERENCES sectie_kinds(id),
+    sobek      int REFERENCES sobek_kinds(id),
     path       VARCHAR(256)
 );
 SELECT AddGeometryColumn('hydr_boundaries_poly','geom',31467,'MULTIPOLYGON',3);
--- a/flys-backend/doc/schema/postgresql.sql	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/doc/schema/postgresql.sql	Sun Apr 21 10:46:59 2013 +0200
@@ -111,8 +111,7 @@
 CREATE TABLE named_main_values (
     id      int PRIMARY KEY NOT NULL,
     name    VARCHAR(256)    NOT NULL UNIQUE,
-    type_id int NOT NULL REFERENCES main_value_types(id),
-    UNIQUE (name, type_id)
+    type_id int NOT NULL REFERENCES main_value_types(id)
 );
 
 -- Table for time intervals
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModel.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModel.java	Sun Apr 21 10:46:59 2013 +0200
@@ -30,6 +30,12 @@
         values = new ArrayList<ImportFlowVelocityModelValue>();
     }
 
+    public ImportFlowVelocityModel(String description) {
+        this();
+
+        this.description = description;
+    }
+
     public ImportFlowVelocityModel(ImportDischargeZone dischargeZone,
         String description) {
         this();
@@ -84,14 +90,12 @@
             Query query = session.createQuery("from FlowVelocityModel where "
                 + "   dischargeZone=:dischargeZone");
 
-            //query.setParameter("river", river);
             query.setParameter("dischargeZone", zone);
 
             List<FlowVelocityModel> model = query.list();
 
             if (model.isEmpty()) {
-                //peer = new FlowVelocityModel(river, zone);
-                peer = new FlowVelocityModel(zone);
+                peer = new FlowVelocityModel(zone, description);
                 session.save(peer);
             }
             else {
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModelValue.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportFlowVelocityModelValue.java	Sun Apr 21 10:46:59 2013 +0200
@@ -49,11 +49,11 @@
             Query query = session.createQuery(
                 "from FlowVelocityModelValue where " +
                 "   flowVelocity=:model and " +
-                "   station=:station"
+                "   station between :station - 0.00001 and :station + 0.00001"
             );
 
             query.setParameter("model", model);
-            query.setParameter("station", station);
+            query.setParameter("station", station.doubleValue());
 
             List<FlowVelocityModelValue> values = query.list();
 
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValue.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportMainValue.java	Sun Apr 21 10:46:59 2013 +0200
@@ -8,6 +8,7 @@
 import de.intevation.flys.model.Gauge;
 import de.intevation.flys.model.River;
 import de.intevation.flys.model.NamedMainValue;
+import de.intevation.flys.model.TimeInterval;
 
 import org.hibernate.Session;
 import org.hibernate.Query;
@@ -17,6 +18,7 @@
     protected ImportGauge          gauge;
     protected ImportNamedMainValue mainValue;
     protected BigDecimal           value;
+    protected ImportTimeInterval   timeInterval;
 
     protected MainValue peer;
 
@@ -26,11 +28,13 @@
     public ImportMainValue(
         ImportGauge          gauge,
         ImportNamedMainValue mainValue,
-        BigDecimal           value
+        BigDecimal           value,
+        ImportTimeInterval   timeInterval
     ) {
-        this.gauge     = gauge;
-        this.mainValue = mainValue;
-        this.value     = value;
+        this.gauge        = gauge;
+        this.mainValue    = mainValue;
+        this.value        = value;
+        this.timeInterval = timeInterval;
     }
 
     public ImportGauge getGauge() {
@@ -62,12 +66,17 @@
             Session session = ImporterSession.getInstance().getDatabaseSession();
             Query query = session.createQuery("from MainValue where "
                 + "gauge.id=:gauge_id and mainValue.id=:name_id "
+                + "and timeInterval = :time "
                 + "and value=:value");
             Gauge          g = gauge.getPeer(river);
             NamedMainValue n = mainValue.getPeer();
+            TimeInterval   t = timeInterval != null
+                ? timeInterval.getPeer()
+                : null;
             query.setParameter("gauge_id", g.getId());
             query.setParameter("name_id",  n.getId());
             query.setParameter("value",    value);
+            query.setParameter("time",     t);
             List<MainValue> values = query.list();
             if (values.isEmpty()) {
                 peer = new MainValue(g, n, value, null);
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportTimeInterval.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportTimeInterval.java	Sun Apr 21 10:46:59 2013 +0200
@@ -27,8 +27,14 @@
     }
 
     public ImportTimeInterval(Date startTime, Date stopTime) {
-        this.startTime = startTime;
-        this.stopTime  = stopTime;
+        if (startTime.after(stopTime)) {
+            this.stopTime = startTime;
+            this.startTime = stopTime;
+        }
+        else {
+            this.startTime = startTime;
+            this.stopTime  = stopTime;
+        }
     }
 
     public Date getStartTime() {
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityModelParser.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/parsers/FlowVelocityModelParser.java	Sun Apr 21 10:46:59 2013 +0200
@@ -1,10 +1,14 @@
 package de.intevation.flys.importer.parsers;
 
+import java.io.File;
+import java.io.IOException;
+
 import java.math.BigDecimal;
 import java.text.NumberFormat;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -13,6 +17,7 @@
 import de.intevation.flys.importer.ImportDischargeZone;
 import de.intevation.flys.importer.ImportFlowVelocityModel;
 import de.intevation.flys.importer.ImportFlowVelocityModelValue;
+import de.intevation.flys.utils.EpsilonComparator;
 
 
 public class FlowVelocityModelParser extends LineParser {
@@ -49,9 +54,14 @@
 
     private ImportFlowVelocityModel current;
 
+    protected String description;
+
+    protected TreeSet<Double> kmExists;
+
 
     public FlowVelocityModelParser() {
         models = new ArrayList<ImportFlowVelocityModel>();
+        kmExists = new TreeSet<Double>(EpsilonComparator.CMP);
     }
 
 
@@ -60,14 +70,24 @@
     }
 
     @Override
+    public void parse(File file) throws IOException {
+        description = file.getName();
+
+        super.parse(file);
+    }
+
+    @Override
     protected void reset() {
-        current = new ImportFlowVelocityModel();
+        current = new ImportFlowVelocityModel(description);
+        kmExists.clear();
     }
 
 
     @Override
     protected void finish() {
         models.add(current);
+
+	//	description = null;
     }
 
 
@@ -217,7 +237,15 @@
         }
 
         try {
-            double km     = nf.parse(cols[0]).doubleValue();
+            double km = nf.parse(cols[0]).doubleValue();
+
+            Double key = Double.valueOf(km);
+
+            if (kmExists.contains(key)) {
+                log.warn("duplicate stattion '" + km + "': -> ignored");
+                return;
+            }
+
             double q      = nf.parse(cols[1]).doubleValue();
             double total  = nf.parse(cols[2]).doubleValue();
             double main   = nf.parse(cols[3]).doubleValue();
@@ -230,6 +258,8 @@
                 new BigDecimal(main),
                 new BigDecimal(stress)
             ));
+
+            kmExists.add(key);
         }
         catch (ParseException pe) {
             log.warn("Unparseable flow velocity values:", pe);
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/StaFileParser.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/parsers/StaFileParser.java	Sun Apr 21 10:46:59 2013 +0200
@@ -11,8 +11,10 @@
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 
@@ -20,6 +22,8 @@
 import de.intevation.flys.importer.ImportMainValue;
 import de.intevation.flys.importer.ImportNamedMainValue;
 import de.intevation.flys.importer.ImportGauge;
+import de.intevation.flys.importer.ImportTimeInterval;
+import de.intevation.flys.utils.DateGuesser;
 
 public class StaFileParser
 {
@@ -37,6 +41,28 @@
         Pattern.compile("\\s*([^\\s]+)\\s+([^\\s]+)\\s+([" +
             Pattern.quote(TYPES) + "]).*");
 
+    public static final class NameAndTimeInterval {
+        private String             name;
+        private ImportTimeInterval timeInterval;
+
+        public NameAndTimeInterval(String name) {
+            this(name, null);
+        }
+
+        public NameAndTimeInterval(String name, ImportTimeInterval timeInterval) {
+            this.name         = name;
+            this.timeInterval = timeInterval;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public ImportTimeInterval getTimeInterval() {
+            return timeInterval;
+        }
+    } // class NameAndTimeInterval
+
     public StaFileParser() {
     }
 
@@ -64,7 +90,7 @@
                 return false;
             }
 
-            String gaugeName = line.substring(16, 37).trim();
+            String gaugeName = line.substring(16, 28).trim();
 
             Long gaugeNumber = null;
 
@@ -160,12 +186,16 @@
                         types.put(typeString, type);
                     }
                     String name = m.group(1);
+                    NameAndTimeInterval nat = parseName(name);
                     ImportNamedMainValue namedMainValue =
-                        new ImportNamedMainValue(type, name);
+                        new ImportNamedMainValue(type, nat.getName());
                     namedMainValues.add(namedMainValue);
 
-                    ImportMainValue mainValue =
-                        new ImportMainValue(gauge, namedMainValue, value);
+                    ImportMainValue mainValue = new ImportMainValue(
+                        gauge,
+                        namedMainValue,
+                        value,
+                        nat.getTimeInterval());
 
                     mainValues.add(mainValue);
                 }
@@ -186,5 +216,123 @@
         log.info("finished parsing STA file: " + file);
         return true;
     }
+
+    protected NameAndTimeInterval parseName(String name) {
+        List<String> result = new ArrayList<String>();
+
+        unbracket(name, 0, result);
+
+        int length = result.size();
+
+        if (length < 1) { // Should not happen.
+            return new NameAndTimeInterval(name);
+        }
+
+        if (length == 1) { // No date at all -> use first part.
+            return new NameAndTimeInterval(result.get(0).trim());
+        }
+
+        if (length == 2) { // e.g. W(1994) or W(1994 - 1999)
+            String type = result.get(0).trim();
+
+            ImportTimeInterval timeInterval = getTimeInterval(
+                result.get(1).trim());
+
+            if (timeInterval == null) { // No date at all.
+                type = name;
+            }
+
+            return new NameAndTimeInterval(type, timeInterval);
+        }
+
+        if (length == 3) { // e.g W(Q(1994)) or W(Q(1994 - 1999))
+
+            String type =
+                result.get(0).trim() + "(" + 
+                result.get(1).trim() + ")";
+
+            ImportTimeInterval timeInterval = getTimeInterval(
+                result.get(2).trim());
+
+            if (timeInterval == null) { // No date at all.
+                type = name;
+            }
+
+            return new NameAndTimeInterval(type, timeInterval);
+        }
+
+        // more than 3 elements return unmodified.
+
+        return new NameAndTimeInterval(name);
+    }
+
+    private static ImportTimeInterval getTimeInterval(String datePart) {
+
+        int minus = datePart.indexOf('-');
+
+        if (minus < 0) { // '-' not found
+
+            Date date = null;
+            try {
+                date = DateGuesser.guessDate(datePart);
+            }
+            catch (IllegalArgumentException iae) {
+                log.warn("STA: Invalid date '" + datePart + "'");
+                return null;
+            }
+
+            return new ImportTimeInterval(date);
+        }
+
+        // Found '-' so we have <from> - <to>
+        String startPart = datePart.substring(0, minus).trim();
+        String endPart   = datePart.substring(minus).trim();
+
+        Date startDate = null;
+        Date endDate   = null;
+
+        try {
+            startDate = DateGuesser.guessDate(startPart);
+        }
+        catch (IllegalArgumentException iae) {
+            log.warn("STA: Invalid start date '" + startPart + "'");
+        }
+
+        try {
+            endDate = DateGuesser.guessDate(endPart);
+        }
+        catch (IllegalArgumentException iae) {
+            log.warn("STA: Invalid end date '" + endPart + "'");
+        }
+
+        if (startDate == null) {
+            log.warn("STA: Need start date.");
+            return null;
+        }
+
+        return new ImportTimeInterval(startDate, endDate);
+    }
+
+    private static int unbracket(String s, int index, List<String> result) {
+        StringBuilder sb = new StringBuilder();
+        int length = s.length();
+        while (index < length) {
+            char c = s.charAt(index);
+            switch (c) {
+                case '(':
+                    index = unbracket(s, index+1, result);
+                    break;
+                case ')':
+                    result.add(0, sb.toString());
+                    return index+1;
+                default:
+                    sb.append(c);
+                    ++index;
+            }
+        }
+        result.add(0, sb.toString());
+
+        return index;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-backend/src/main/java/de/intevation/flys/model/Range.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-backend/src/main/java/de/intevation/flys/model/Range.java	Sun Apr 21 10:46:59 2013 +0200
@@ -19,6 +19,7 @@
 public class Range
 implements   Serializable
 {
+    public static final double EPSILON = 1e-5;
     private Integer    id;
     private BigDecimal a;
     private BigDecimal b;
@@ -73,6 +74,22 @@
         this.b = b;
     }
 
+    public boolean containsTolerant(double x) {
+            return containsTolerant(x, EPSILON);
+    }
+
+    public boolean containsTolerant(double x, double tolerance) {
+        BigDecimal b = this.b != null ? this.b : a;
+        double av = a.doubleValue();
+        double bv = b.doubleValue();
+        if (av > bv) {
+            double t = av;
+            av = bv;
+            bv = t;
+        }
+        return x+tolerance >= av && x-tolerance <= bv;
+    }
+
     public boolean contains(double x) {
         BigDecimal b = this.b != null ? this.b : a;
         double av = a.doubleValue();
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.java	Sun Apr 21 10:46:59 2013 +0200
@@ -594,6 +594,8 @@
 
     // ERRORS
 
+    String error_years_wrong();
+
     String error_read_minmax_values();
 
     String error_validate_range();
@@ -822,6 +824,8 @@
 
     String annotations();
 
+    String all_annotations();
+
     String flowvelocitymeasurement();
 
     String bed_quality_bed();
@@ -844,6 +848,8 @@
 
     String catchments();
 
+    String catchment_wms();
+
     String floodplain();
 
     String lines();
@@ -878,6 +884,10 @@
 
     String mainvalues();
 
+    String wmainvalue();
+
+    String qmainvalue();
+
     String show_mainvalues();
 
     String dems();
@@ -892,6 +902,8 @@
 
     String bedheights();
 
+    String morph_width();
+
     String datacage();
 
     String datacage_add_pair();
@@ -1210,5 +1222,39 @@
 
     String printWindowTitle();
 
+    String mapfish_data_range();
+
+    String mapfish_data_subtitle();
+
+    String mapfish_data_strech();
+
+    String mapfish_data_institution();
+
+    String mapfish_data_source();
+
+    String mapfish_data_creator();
+
+    String mapfish_data_dateplace();
+
+    String mapfish_data_river();
+
+    String mapTitle();
+
+    String mapSubtitle();
+
+    String mapRange();
+
+    String mapStretch();
+
+    String mapCreator();
+
+    String mapInstitution();
+
+    String mapSource();
+
+    String mapDate();
+
+    String mapLogo();
+
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -307,6 +307,7 @@
 ele_window_geometry_error = The geometry is not supported:
 
 unexpected_exception = There occured an unexpected exception
+error_years_wrong = The second year needs to be bigger than the first year.
 error_read_minmax_values = Error while reading min/max values for the location input.
 error_validate_range = The value $1 needs to be smaller than $3 and bigger than $2.
 error_validate_date_range = Start date needs to be before end date.
@@ -426,6 +427,7 @@
 columns = Columns
 annotation = Annotations
 annotations = Annotations
+all_annotations = All annotations
 flowvelocitymeasurement = Flowvelocity measurements
 bed_quality_bed = Quality - Bed
 bed_quality_load = Quality - Load
@@ -437,6 +439,7 @@
 qps = Crosssection Tracks
 hws = Floodplain Protection Work
 catchments = Catchments
+catchment_wms = Catchments (WMS)
 floodplain = Floodplain
 lines = Lines
 buildings = Buildings
@@ -454,6 +457,8 @@
 discharge_table_gauge = Discharge Table at Gauge
 mainvalue = Mainvalue
 mainvalues = Mainvalues
+wmainvalue = Mainvalues (W)
+qmainvalue = Mainvalues (Q)
 show_mainvalues = Show Mainvalues
 dems = Digital Elevation Models
 hydrboundaries = Hydrological Boundaries
@@ -461,6 +466,7 @@
 single = Year
 epoch = Epoch
 bedheights = Bedheights
+morph_width = morphologic Width
 datacage = Datacage
 official = Offical
 inofficial = Inofficiall
@@ -629,3 +635,29 @@
 measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/
 measurement_station_info_link = Measurement Station Info
 measurement_station_gauge_name = Reference Gauge
+
+# The prefix is used to classify them and will be stripped
+# If the payload part sarts with a number it will be sorted
+# By this number and the number will be stripped.
+# Number must be a single digit 0-9. This hack was made necessary
+# by the usage of an attribute table in mapfish
+
+mapfish_data_range = mapfish_data_3Range
+mapfish_data_subtitle = mapfish_data_0Subtitle
+mapfish_data_strech = mapfish_data_2Stretch
+mapfish_data_institution = mapfish_data_5Institution
+mapfish_data_source = mapfish_data_6Source
+mapfish_data_creator = mapfish_data_5Creator
+mapfish_data_dateplace = mapfish_data_7Place, Date
+mapfish_data_river = mapfish_data_1River
+
+mapTitle = Title
+mapSubtitle = Subtitle
+mapRange = Range
+mapStretch = Stretch
+mapCreator = Creator
+mapInstitution = Institution
+mapSource = Source
+mapDate = Place, Date
+mapLogo = Logo
+
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_de.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -151,7 +151,7 @@
 wqTitle = Eingabe f\u00fcr W/Q Daten
 wqadaptedTitle = Eingabe f\u00fcr W/Q Daten
 wqHistorical = Auswahl der Analyseart
-calcTableTitle = Werte
+calcTableTitle = Ergebnisausgabe
 helperPanelTitle = Eingabeunterst\u00fctzung
 gaugePanelTitle = Gew\u00e4sser/Pegel-Info
 measurementStationPanelTitle = Gew\u00e4sser/Messstellen-Info
@@ -307,6 +307,7 @@
 ele_window_geometry_error = Die Geometrie wird nicht unterst\u00fctzt:
 
 unexpected_exception = Ein unerwarteter Fehler ist aufgetreten
+error_years_wrong = Das zweite Jahr muss gr\u00f6\u00dfer als das erste sein.
 error_read_minmax_values = Fehler beim Lesen der min/max Werte. Es kann keine Validierung der eingegebenen Strecke durchgef\u00fchrt werden.
 error_validate_range = Der Wert $1 muss kleiner als $3 und gr\u00f6\u00dfer als $2 sein.
 error_validate_date_range = Anfangsdatum muss fr\u00fcher sein als Enddatum.
@@ -428,19 +429,21 @@
 annotation = Streckenfavoriten
 annotation = Streckenfavoriten - Typen
 annotations = Streckenfavoriten
+all_annotations = Alle Streckenfavoriten
 flowvelocitymeasurement = gemessene Flie\u00dfgeschwindigkeiten
 bed_quality_bed = Sohlbeschaffenheit - Sohle
 bed_quality_load = Sohlbeschaffenheit - Geschiebe
 additionals = Zus\u00e4tzliche L\u00e4ngsschnitte
 differences = Differenzen
-kilometrage = Kilometrierung
+kilometrage = Stationierung
 riveraxis = Flussachse
 km = Km
 qps = Querprofilspuren
 hws = Hochwasserschutzanlagen
-catchments = Einzugsgebiete (WMS)
+catchments = Einzugsgebiete
+catchment_wms = Einzugsgebiete (WMS)
 floodplain = Talaue
-lines = Linien
+lines = Darstellungstyp: Linien
 buildings = Bauwerke
 fixpoints = Festpunkte
 uesk = \u00dcberschwemmungsfl\u00e4chen
@@ -456,13 +459,16 @@
 discharge_table_gauge = Abflusstafel am Pegel
 mainvalue = Hauptwerte
 mainvalues = Hauptwerte
+wmainvalue = Hauptwerte (W)
+qmainvalue = Hauptwerte (Q)
 show_mainvalues = Hauptwerte anzeigen
 dems = Digitale Gel\u00e4ndemodelle
 hydrboundaries = Hydrologische Grenzen
-gaugelocations = Pegellagen (WMS)
+gaugelocations = PEGELONLINE aktuell (WMS)
 single = Jahr
 epoch = Epoche
 bedheights = Sohlh\u00f6hen
+morph_width = Morphologische Breite
 datacage = Datenkorb
 official = Offiziell
 inofficial = Inoffiziell
@@ -476,16 +482,16 @@
 axis = Achse
 bfg_model = BfG-Modell
 federal = Bundesländer
-areas = Flächen
+areas = Darstellungstyp: Flächen
 sobek_flooded = SOBEK-Grenzlinie durchflutet / nicht durchflutet
 sobek_areas = SOBEK-Bereiche
 measurements = Messungen
 floodmarks = HW-Marken
 pegel_had_measurement_points = HAD Abflussmessstellen (WMS)
-gauge_points = Pegelpunkte (WSV)
-gauge_level = Aktueller Wasserstand (WSV)
-gauge_names = Pegelnamen (WSV)
-gauge_tendency = Tendenz des Wasserstands (WSV)
+gauge_points = Pegelmessstelle (WMS)
+gauge_level = Wasserstand (WMS)
+gauge_names = Pegelname (WMS)
+gauge_tendency = Tendenz des Wasserstands (WMS)
 
 startcolor = Farbverlauf Startfarbe
 endcolor = Farbverlauf Endfarbe
@@ -628,3 +634,28 @@
 measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/
 measurement_station_info_link = Messstelleninfo
 measurement_station_gauge_name = hydrologischer Bezugspegel
+
+# The prefix is used to classify them and will be stripped
+# If the payload part sarts with a number it will be sorted
+# By this number and the number will be stripped.
+# Number must be a single digit 0-9. This hack was made necessary
+# by the usage of an attribute table in mapfish
+
+mapfish_data_range = mapfish_data_3Bereich
+mapfish_data_subtitle = mapfish_data_0Untertitel
+mapfish_data_strech = mapfish_data_2Strecke
+mapfish_data_institution = mapfish_data_5Institution
+mapfish_data_source = mapfish_data_6Datenquelle
+mapfish_data_creator = mapfish_data_4Bearbeiter
+mapfish_data_dateplace = mapfish_data_7Ort, Datum
+mapfish_data_river = mapfish_data_1Gew\u00e4sser
+
+mapTitle = Titel
+mapSubtitle = Untertitel
+mapRange = Bereich
+mapStretch = Strecke
+mapCreator = Bearbeiter
+mapInstitution = Institution
+mapSource = Datenquelle
+mapDate = Ort, Datum
+mapLogo = Logo
--- a/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/FLYSConstants_en.properties	Sun Apr 21 10:46:59 2013 +0200
@@ -305,6 +305,7 @@
 ele_window_geometry_error = The geometry is not supported:
 
 unexpected_exception = There occured an unexpected exception
+error_years_wrong = The second year needs to be bigger than the first year.
 error_read_minmax_values = Error while reading min/max values for the location input.
 error_validate_range = The value $1 needs to be smaller than $3 and bigger than $2.
 error_validate_date_range = Start date needs to be before end date.
@@ -425,6 +426,7 @@
 columns = Columns
 annotation = Annotations
 annotations = Annotations
+all_annotations = All annotations
 flowvelocitymeasurement = Flowvelocity measurements
 bed_quality_bed = Quality - Bed
 bed_quality_load = Quality - Load
@@ -435,7 +437,8 @@
 km = Km
 qps = Crosssection Tracks
 hws = Floodplain Protection Work
-catchments = Catchments (WMS)
+catchments = Catchments
+catchment_wms = Catchment (WMS)
 floodplain = Floodplain
 lines = Lines
 buildings = Buildings
@@ -453,6 +456,8 @@
 discharge_table_gauge = Discharge Table at Gauge
 mainvalue = Mainvalue
 mainvalues = Mainvalues
+wmainvalue = Mainvalues (W)
+qmainvalue = Mainvalues (Q)
 show_mainvalues = Show Mainvalues
 dems = Digital Elevation Models
 hydrboundaries = Hydrological Boundaries
@@ -460,6 +465,7 @@
 single = Year
 epoch = Epoch
 bedheights = Bedheights
+morph_width = morphologic Width
 datacage = Datacage
 
 startcolor = Colorrange start color
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/AbstractUIProvider.java	Sun Apr 21 10:46:59 2013 +0200
@@ -300,7 +300,7 @@
 
 
     public List<String> validate() {
-        return new ArrayList<String>();
+        return new ArrayList<String>(); // FIXME: What's this?
     }
 
 
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/StyleEditorWindow.java	Sun Apr 21 10:46:59 2013 +0200
@@ -2,6 +2,7 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.rpc.AsyncCallback;
+
 import com.smartgwt.client.types.Alignment;
 import com.smartgwt.client.util.SC;
 import com.smartgwt.client.widgets.Button;
@@ -327,7 +328,9 @@
                 set.getName(),
                 set.getType(),
                 set.getDefaultValue());
-            vl.addMember(property);
+            if (property != null) {
+                vl.addMember(property);
+            }
         }
 
         // Add settings not in whitelist above.
@@ -345,7 +348,9 @@
                 set.getName(),
                 set.getType(),
                 set.getDefaultValue());
-            vl.addMember(property);
+            if (property != null) {
+                vl.addMember(property);
+            }
         }
 
         return vl;
@@ -434,6 +439,8 @@
                 valueMap.put("20", "20");
                 f.setValueMap(valueMap);
                 f.setValue(value);
+                // FIXME: Make that work again
+                return null;
             }
             else if (name.contains("transparency")) {
                 LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java	Sun Apr 21 10:46:59 2013 +0200
@@ -98,20 +98,23 @@
     /** List of doubleArrayPanels shown. */
     protected ArrayList<DoubleArrayPanel> doubleArrayPanels;
 
-    /** Stores the min/max values for each q range.*/
+    /** [startkm,endkm] per gauge in selected range. */
+    protected double[][] gaugeRanges;
+
+    /** Stores the min/max values for each q range (gauge). */
     protected Map<String, double[]> qranges;
 
-    /** Stores the min/max values for each w range. */
+    /** Stores the min/max values for each w range (gauge). */
     protected Map<String, double[]> wranges;
 
     /** The RadioGroupItem that determines the w/q input mode. */
     protected DynamicForm modes;
 
-    /** Table holding Q and D values. */
-    protected QDTable qdTable;
+    /** List of wTables in inputhelper section. */
+    protected List<WTable> wTables;
 
-    /** Table holding W values. */
-    protected WTable wTable;
+    /** List of QDTables in inputhelper section. */
+    protected List<QDTable> qdTables;
 
     /** Tabs in inputhelper area. */
     protected TabSet tabs;
@@ -125,14 +128,14 @@
         doubleArrayPanels = new ArrayList<DoubleArrayPanel>();
         qranges  = new HashMap<String, double[]>();
         wranges  = new HashMap<String, double[]>();
-        qdTable  = new QDTable();
-        wTable   = new WTable();
-        initTableListeners();
+        wTables  = new ArrayList<WTable>();
+        qdTables = new ArrayList<QDTable>();
     }
 
 
     @Override
     public Canvas create(DataList data) {
+        readGaugeRanges(data);
         initHelperPanel();
 
         Canvas submit = getNextButton();
@@ -149,6 +152,10 @@
         layout.addMember(widget);
         layout.addMember(submit);
 
+        fetchWQData();
+
+        initTableListeners();
+
         return layout;
     }
 
@@ -160,19 +167,30 @@
         tabs.setWidth100();
         tabs.setHeight100();
 
-        Tab wTab = new Tab(MESSAGE.wq_table_w());
-        Tab qTab = new Tab(MESSAGE.wq_table_q());
+        // For each gauge, add two tabs with helper tables.
 
-        qdTable.showSelect();
-        wTab.setPane(wTable);
-        qTab.setPane(qdTable);
+        for (int i = 0; i< gaugeRanges.length; i++) {
+            // Later the tabs title will get adjusted to include gauges name.
+            // TODO the tabs title becomes rather long through that (i18n).
+            Tab wTab = new Tab(MESSAGE.wq_table_w());
+            Tab qTab = new Tab(MESSAGE.wq_table_q());
 
-        tabs.addTab(wTab, 0);
-        tabs.addTab(qTab, 1);
+            QDTable qdTable = new QDTable();
+            WTable  wTable  = new WTable();
+
+            wTables.add(wTable);
+            qdTables.add(qdTable);
+
+            qdTable.showSelect();
+            //wTable.showSelect();
+            wTab.setPane(wTable);
+            qTab.setPane(qdTable);
+
+            tabs.addTab(wTab, i*2+0);
+            tabs.addTab(qTab, i*2+1);
+        }
 
         helperContainer.addMember(tabs);
-
-        fetchWQData();
     }
 
 
@@ -181,32 +199,57 @@
      */
     // TODO dupe from WQInputPanel
     protected void initTableListeners() {
-        CellClickHandler handler = new CellClickHandler() {
-            @Override
-            public void onCellClick(CellClickEvent e) {
-                if (isWMode() || qdTable.isLocked()) {
-                    return;
-                }
+        int i = 0;
+        for (QDTable qdTable: qdTables) {
+            // Register listener such that values are filled in on click.
+            final QDTable table = qdTable;
+            final int fi = i;
+            CellClickHandler handler = new CellClickHandler() {
+                @Override
+                public void onCellClick(CellClickEvent e) {
+                    if (isWMode() || table.isLocked()) {
+                        return;
+                    }
 
-                int    idx = e.getColNum();
-                Record r   = e.getRecord();
-                double val = r.getAttributeAsDouble("value");
+                    int    idx = e.getColNum();
+                    Record r   = e.getRecord();
+                    double val = r.getAttributeAsDouble("value");
 
-                if (itemWithFocus != null) {
-                    itemWithFocus.setValues(new double[]{val});
-                    // TODO 1133, show different data for each doublearraypanel
-                    int i = doubleArrayPanels.indexOf(itemWithFocus);
-                    if (i == doubleArrayPanels.size()-1) {
-                        doubleArrayPanels.get(0).focusInItem(1);
+                    doubleArrayPanels.get(fi).setValues(new double[]{val});
+                    // If a named value for first gauge is chosen, try to find and set
+                    // the values to the other panels too.
+                    if (fi == 0) {
+                        String valueName = r.getAttribute("name");
+                        int oi = 0;
+                        // TODO instead of oi use random access.
+                        for (QDTable otherQDTable: qdTables) {
+                            if (oi == 0) {
+                                oi++;
+                                continue;
+                            }
+                            Double value = otherQDTable.findRecordValue(valueName);
+                            if (value == null) {
+                                // TODO i18n
+                                SC.warn("No Value for <name> at <gauge>");
+                            }
+                            else {
+                                doubleArrayPanels.get(oi).setValues(new double[]{value});
+                            }
+                            oi++;
+                        }
                     }
                     else {
-                        doubleArrayPanels.get(i+1).focusInItem(1);
+                        // Focus next.
+                        if (fi != doubleArrayPanels.size()-1) {
+                            doubleArrayPanels.get(fi+1).focusInItem(1);
+                        }
                     }
                 }
-            }
-        };
+            };
 
-        qdTable.addCellClickHandler(handler);
+            qdTable.addCellClickHandler(handler);
+            i++;
+        }
     }
 
 
@@ -294,6 +337,7 @@
     }
 
 
+    /** Create non-input helper part of the UI. */
     protected Canvas createWidget(DataList dataList) {
         VLayout layout = new VLayout();
 
@@ -468,15 +512,40 @@
         }
     }
 
+    /** Populate Gauge Ranges array. */
+    private void readGaugeRanges(DataList dataList) {
+        DataItem[] items = getWQItems(dataList);
+        gaugeRanges = new double[items.length][2];
+    
+        int i = 0;
+
+        for (DataItem item: items) {
+            String[] startEndKm = item.getLabel().split(";");
+
+            gaugeRanges[i][0] = Double.parseDouble(startEndKm[0]);
+            gaugeRanges[i][1] = Double.parseDouble(startEndKm[1]);
+            i++;
+        }
+    }
+
 
     protected Canvas createList(DataList dataList) {
         VLayout layout = new VLayout();
 
         DataItem[] items = getWQItems(dataList);
 
+        int i = 0;
+
         for (DataItem item: items) {
-            String title = item.getLabel();
+            String title = item.getLabel(); // of form: 70.5;112.0
             String label = item.getStringValue();
+
+            // Rename W and Q tab to include gauges name.
+            tabs.getTab(i*2).setTitle(tabs.getTab(i*2).getTitle()
+                + " (" + label + ")");
+            tabs.getTab(i*2+1).setTitle(tabs.getTab(i*2+1).getTitle()
+                + " (" + label + ")");
+
             DoubleArrayPanel dap = new DoubleArrayPanel(
                 label, null, this, this, TitleOrientation.LEFT);
 
@@ -493,6 +562,7 @@
             }
 
             layout.addMember(dap);
+            i++;
         }
 
         layout.setHeight(items.length * ROW_HEIGHT);
@@ -650,10 +720,14 @@
     }
 
 
-    /** Store the currently focussed DoubleArrayPanel. */
+    /** Store the currently focussed DoubleArrayPanel and focus helper tab. */
     @Override
     public void onFocus(FocusEvent event) {
         itemWithFocus = (DoubleArrayPanel) event.getForm();
+        // Switch to respective tab.
+        // TODO which makes a focus loss
+        int inputIndex = doubleArrayPanels.indexOf(itemWithFocus);
+        tabs.selectTab(inputIndex*2 + (isWMode() ? 0 : 1));
     }
 
 
@@ -664,7 +738,7 @@
     }
 
 
-    /** Get the WQD data from servide and stuck them up that tables. */
+    /** Get the WQD data from service and stuck them up that tables. */
     protected void fetchWQData() {
         Config config    = Config.getInstance();
         String locale    = config.getLocale ();
@@ -675,39 +749,49 @@
         double[]  mm = getMinMaxKM(data);
         String river = getRiverName(data);
 
-        wqInfoService.getWQInfo(locale, river, mm[0], mm[0],
-            new AsyncCallback<WQInfoObject[]>() {
-                @Override
-                public void onFailure(Throwable caught) {
-                    GWT.log("Could not recieve wq informations.");
-                    SC.warn(caught.getMessage());
-                }
+        int i = 0;
 
-                @Override
-                public void onSuccess(WQInfoObject[] wqi) {
-                    int num = wqi != null ? wqi.length :0;
-                    GWT.log("Recieved " + num + " wq informations.");
-
-                    if (num == 0) {
-                        return;
+        // Get Data for respective gauge.
+        for (double[] range : gaugeRanges){
+            // Gauge ranges overlap, move start and end a bit closer to each other.
+            final double rDiff = (range[1] - range[0]) / 10d;
+            final int fi = i;
+            wqInfoService.getWQInfo(locale, river, range[0]+rDiff, range[1]-rDiff,
+                new AsyncCallback<WQInfoObject[]>() {
+                    @Override
+                    public void onFailure(Throwable caught) {
+                        GWT.log("Could not recieve wq informations.");
+                        SC.warn(caught.getMessage());
                     }
 
-                    addWQInfo(wqi);
+                    @Override
+                    public void onSuccess(WQInfoObject[] wqi) {
+                        int num = wqi != null ? wqi.length :0;
+                        GWT.log("Received " + num + " wq informations (" + fi + ".");
+
+                        if (num == 0) {
+                            return;
+                        }
+
+                        addWQInfo(wqi, fi);
+                    }
                 }
-            }
-        );
+            );
+            i++;
+        }
     }
 
 
-    protected void addWQInfo (WQInfoObject[] wqi) {
+    /** Add Info to helper table for gauge at index gaugeIdx. */
+    protected void addWQInfo (WQInfoObject[] wqi, int gaugeIdx) {
         for(WQInfoObject wi: wqi) {
             WQInfoRecord rec = new WQInfoRecord(wi);
 
             if (wi.getType().equals("W")) {
-                wTable.addData(rec);
+                wTables.get(gaugeIdx).addData(rec);
             }
             else {
-                qdTable.addData(rec);
+                qdTables.get(gaugeIdx).addData(rec);
             }
         }
     }
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapPrintPanel.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapPrintPanel.java	Sun Apr 21 10:46:59 2013 +0200
@@ -9,6 +9,7 @@
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.TextItem;
 import com.smartgwt.client.widgets.form.fields.ButtonItem;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
 import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
 import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
 import com.smartgwt.client.types.Alignment;
@@ -25,21 +26,30 @@
 import de.intevation.flys.client.shared.model.Property;
 import de.intevation.flys.client.shared.model.PropertySetting;
 import de.intevation.flys.client.shared.model.Settings;
+import de.intevation.flys.client.shared.model.Artifact;
+import de.intevation.flys.client.shared.model.ArtifactDescription;
+import de.intevation.flys.client.shared.model.Data;
+import de.intevation.flys.client.shared.model.DataItem;
+import de.intevation.flys.client.shared.model.DataList;
+
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.MissingResourceException;
 
 public class MapPrintPanel extends Canvas {
 
-    private static final String MAPFISH_MAPTITLE = "mapfish-mapTitle";
-    private static final String MAPFISH_RANGE = "mapfish-data-range";
-    private static final String MAPFISH_SUBTITLE = "mapfish-data-subtitle";
-    private static final String MAPFISH_STRETCH = "mapfish-data-strech";
-    private static final String MAPFISH_CREATED = "mapfish-data-created";
-    private static final String MAPFISH_SOURCE = "mapfish-data-source";
-    private static final String MAPFISH_CREATOR = "mapfish-data-creator";
-    private static final String MAPFISH_DATEPLACE = "mapfish-data-dateplace";
+    private static final String MAPFISH_MAPTITLE = "mapfish_mapTitle";
+    private static final String MAPFISH_RANGE = "mapfish_data_range";
+    private static final String MAPFISH_SUBTITLE = "mapfish_data_subtitle";
+    private static final String MAPFISH_STRETCH = "mapfish_data_strech";
+    private static final String MAPFISH_INSTITUTION = "mapfish_data_institution";
+    private static final String MAPFISH_SOURCE = "mapfish_data_source";
+    private static final String MAPFISH_CREATOR = "mapfish_data_creator";
+    private static final String MAPFISH_DATEPLACE = "mapfish_data_dateplace";
+    private static final String MAPFISH_RIVER = "mapfish_data_river";
+    private static final String MAPFISH_LOGO = "mapfish_logo";
 
     protected FLYSConstants MSG = GWT.create(FLYSConstants.class);
 
@@ -53,11 +63,12 @@
     protected TextItem pageTitle = new TextItem();
     protected TextItem pageRange = new TextItem();
     protected TextItem pageSubtitle = new TextItem();
-    protected TextItem pageStrech = new TextItem();
-    protected TextItem pageCreated = new TextItem();
+    protected TextItem pageStretch = new TextItem();
+    protected TextItem pageInstitution = new TextItem();
     protected TextItem pageSource = new TextItem();
     protected TextItem pageCreator = new TextItem();
     protected TextItem pageDatePlace = new TextItem();
+    protected SelectItem pageLogo = createPageLogoSelectItem();
 //    protected SelectItem pageFormat = createPageFormatSelectItem();
     protected MapToolbar mapToolbar;
     protected MapPrintWindow parent;
@@ -88,10 +99,10 @@
                     this.pageSubtitle.setValue(props.getValue());
                 }
                 else if (props.getName().equals(MAPFISH_STRETCH)) {
-                    this.pageStrech.setValue(props.getValue());
+                    this.pageStretch.setValue(props.getValue());
                 }
-                else if (props.getName().equals(MAPFISH_CREATED)) {
-                    this.pageCreated.setValue(props.getValue());
+                else if (props.getName().equals(MAPFISH_INSTITUTION)) {
+                    this.pageInstitution.setValue(props.getValue());
                 }
                 else if (props.getName().equals(MAPFISH_SOURCE)) {
                     this.pageSource.setValue(props.getValue());
@@ -110,15 +121,23 @@
 
     protected void initLayout() {
         // TODO: i18n
-        this.pageTitle.setTitle("Titel");
-        this.pageSubtitle.setTitle("Untertitel");
-        this.pageRange.setTitle("Bereich");
-        this.pageStrech.setTitle("Strecke");
-        this.pageCreated.setTitle("Aufgestellt");
-        this.pageSource.setTitle("Datenquelle");
-        this.pageCreator.setTitle("Ersteller");
-        this.pageDatePlace.setTitle("Ort, Datum");
+        this.pageTitle.setTitle(MSG.mapTitle());
+        this.pageSubtitle.setTitle(MSG.mapSubtitle());
+        this.pageRange.setTitle(MSG.mapRange());
+        this.pageStretch.setTitle(MSG.mapStretch());
+        this.pageInstitution.setTitle(MSG.mapInstitution());
+        this.pageSource.setTitle(MSG.mapSource());
+        this.pageCreator.setTitle(MSG.mapCreator());
+        this.pageDatePlace.setTitle(MSG.mapDate());
 
+        pageTitle.setLength(30);
+        pageSubtitle.setLength(30);
+        pageRange.setLength(30);
+        pageStretch.setLength(30);
+        pageInstitution.setLength(30);
+        pageSource.setLength(30);
+        pageCreator.setLength(30);
+        pageDatePlace.setLength(30);
         ButtonItem printButton = createPrintButtonItem();
 
         printButton.setAlign(Alignment.RIGHT);
@@ -129,15 +148,29 @@
                this.pageTitle,
                this.pageSubtitle,
                this.pageRange,
-               this.pageStrech,
-               this.pageCreated,
+               this.pageStretch,
+               this.pageInstitution,
                this.pageSource,
                this.pageCreator,
                this.pageDatePlace,
+               this.pageLogo,
                printButton);
         addChild(df);
     }
 
+    protected SelectItem createPageLogoSelectItem() {
+        LinkedHashMap values = new LinkedHashMap();
+        // TODO: this should be configurable
+        values.put(MSG.bfgLogo(), "BfG Logo");
+
+        SelectItem selItem = new SelectItem();
+        selItem.setTitle(MSG.mapLogo());
+        selItem.setValueMap(values);
+        selItem.setDefaultToFirstOption(true);
+
+        return selItem;
+    }
+
 /*
  * Commented out because we only provide a layout for A4 Landscape atm
 
@@ -158,11 +191,9 @@
 */
     protected ButtonItem createPrintButtonItem() {
         ButtonItem btn = new ButtonItem();
-        GWT.log("Button created");
         btn.addClickHandler(new ClickHandler() {
 
             public void onClick(ClickEvent event) {
-                GWT.log("Print Button Click");
                 updateCollection();
                 Window.open(createPrintUrl(), "_blank", "");
                 parent.destroy();
@@ -229,11 +260,65 @@
             for (Property prop : properties) {
                 PropertySetting props = (PropertySetting)prop;
                 url.append("&");
-                url.append(props.getName());
+                String localized;
+                try {
+                    localized = MSG.getString(props.getName());
+                }
+                catch (MissingResourceException mre) {
+                    localized = props.getName();
+                }
+                url.append(toJavaEncodedString(localized));
                 url.append("=");
                 url.append(props.getValue());
             }
         }
+        // O.o
+        String river = findRiver(((MapOutputTab)mapToolbar.getOutputTab()
+                    ).getCollectionView().getArtifact());
+        url.append("&" + toJavaEncodedString(MSG.getString(MAPFISH_RIVER)) + "=" + river);
+    }
+
+    // Copy of DatacageWindow's findRiver
+    protected String findRiver(Artifact artifact) {
+        ArtifactDescription adescr = artifact.getArtifactDescription();
+        DataList [] data = adescr.getOldData();
+
+        if (data != null && data.length > 0) {
+            for (int i = 0; i < data.length; i++) {
+                DataList dl = data[i];
+                if (dl.getState().equals("state.winfo.river")) {
+                    for (int j = dl.size()-1; j >= 0; --j) {
+                        Data d = dl.get(j);
+                        DataItem [] di = d.getItems();
+                        if (di != null && di.length == 1) {
+                           return d.getItems()[0].getStringValue();
+                        }
+                    }
+                }
+            }
+        }
+
+        return "";
+    }
+
+    public static String toJavaEncodedString(String str) {
+        if (str == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0, len = str.length(); i < len; i++) {
+            int unipoint = Character.codePointAt(str, i);
+            if ((unipoint < 32) || (unipoint > 127)) {
+                sb.append("\\u");
+                sb.append(Integer.toHexString((unipoint >> 3*4) & 0xf));
+                sb.append(Integer.toHexString((unipoint >> 2*4) & 0xf));
+                sb.append(Integer.toHexString((unipoint >> 1*4) & 0xf));
+                sb.append(Integer.toHexString((unipoint >> 0*4) & 0xf));
+            } else {
+                sb.append(str.charAt(i));
+            }
+        }
+        return sb.toString();
     }
 
     protected void updateCollection() {
@@ -243,15 +328,16 @@
         GWT.log("MapPrintPanel.updateCollection via RPC now");
 
         List<Property> properties = new ArrayList<Property>();
-        properties.add(new PropertySetting(MAPFISH_MAPTITLE, this.pageTitle.getValueAsString()));
-//        properties.add(new PropertySetting(MAPFISH_LAYOUT, this.pageFormat.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_SUBTITLE, this.pageSubtitle.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_RANGE, this.pageRange.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_STRETCH, this.pageStrech.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_CREATED, this.pageCreated.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_SOURCE, this.pageSource.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_CREATOR, this.pageCreator.getValueAsString()));
-        properties.add(new PropertySetting(MAPFISH_DATEPLACE, this.pageDatePlace.getValueAsString()));
+        properties.add(new PropertySetting(MAPFISH_MAPTITLE, toJavaEncodedString(pageTitle.getValueAsString())));
+//        properties.add(new PropertySetting(MAPFISH_LAYOUT, toJavaEncodedString(pageFormat.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_SUBTITLE, toJavaEncodedString(pageSubtitle.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_RANGE, toJavaEncodedString(pageRange.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_STRETCH, toJavaEncodedString(pageStretch.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_INSTITUTION, toJavaEncodedString(pageInstitution.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_SOURCE, toJavaEncodedString(pageSource.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_CREATOR, toJavaEncodedString(pageCreator.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_DATEPLACE, toJavaEncodedString(pageDatePlace.getValueAsString())));
+        properties.add(new PropertySetting(MAPFISH_LOGO, toJavaEncodedString(pageLogo.getValueAsString())));
         settings.setSettings("default", properties);
 
         collection.addSettings("print-settings", settings);
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapPrintWindow.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapPrintWindow.java	Sun Apr 21 10:46:59 2013 +0200
@@ -13,7 +13,7 @@
 
     public MapPrintWindow(Collection collection, MapToolbar mapToolbar) {
         setWidth(255);
-        setHeight(280);
+        setHeight(300);
 
         setTitle(MSG.printWindowTitle());
         centerInPage();
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/wq/QDTable.java	Sun Apr 21 10:46:59 2013 +0200
@@ -109,5 +109,18 @@
     public boolean isLocked() {
         return lockClick;
     }
+
+    /**
+     * Search all records for one with attribute name equals to given name.
+     * @return null if none found.
+     * */
+    public Double findRecordValue(String name) {
+        for (ListGridRecord record : getRecords()) {
+            if (record.getAttribute("name").equals(name)) {
+                return record.getAttributeAsDouble("value");
+            }
+        }
+        return null;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-client/src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/server/MapPrintServiceImpl.java	Sun Apr 21 10:46:59 2013 +0200
@@ -11,7 +11,6 @@
 import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler;
 import de.intevation.flys.client.shared.MapUtils;
 import de.intevation.flys.client.shared.model.MapConfig;
-import de.intevation.flys.client.client.FLYSConstants;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -107,7 +106,10 @@
             List<Object> subLayers = new ArrayList<Object>(1);
             subLayers.add(layers);
             layer.put("layers", subLayers);
-            layer.put("baseURL", url);
+            // XXX: osm.intevation.de mapache only offers low dpi maps
+            // so we need to use the uncached service
+            layer.put("baseURL", url.replace("http://osm.intevation.de/mapcache/?",
+                        "http://osm.intevation.de/cgi-bin/germany.fcgi?"));
             layer.put("format", "image/png"); // TODO: Make configurable.
 
             return layer;
@@ -129,12 +131,12 @@
         Map<String, Object> pageSpecs
     ) {
         Map<String, Object> spec = new LinkedHashMap<String, Object>();
+        int dpi = 254;
         spec.put("layout",       "A4 landscape");
         spec.put("pageSize",     "A4");
-        spec.put("landscape",    "false");
-        spec.put("title",        "FLYS Druck");
+        spec.put("landscape",    "true");
         spec.put("srs",          "EPSG:" + mapConfig.getSrid());
-        spec.put("dpi",          Integer.valueOf(254));
+        spec.put("dpi",          dpi);
         spec.put("units",        "m");
         spec.put("geodaetic",    "true");
         spec.put("outputFormat", "pdf");
@@ -202,7 +204,7 @@
             Map<String, Object> legend = new LinkedHashMap<String, Object>();
             List<Object> classes = new ArrayList<Object>(1);
             Map<String, Object> clazz = new LinkedHashMap<String, Object>();
-            String lgu = MapUtils.getLegendGraphicUrl(layer.url, layer.layers);
+            String lgu = MapUtils.getLegendGraphicUrl(layer.url, layer.layers, dpi);
             clazz.put("icon", lgu);
             clazz.put("name", layer.description);
             classes.add(clazz);
@@ -264,21 +266,34 @@
         Map<String, Object> data = new HashMap<String, Object>();
         List<Object> payload = new ArrayList<Object>();
         data.put("data", payload);
-        Enumeration<String> paramNames = req.getParameterNames();
-        while (paramNames.hasMoreElements()) {
-            String paramName = paramNames.nextElement();
-            if (paramName.startsWith("mapfish-data-")) {
-                // You can add mapfish-data variables that will be mapped
+        Enumeration paramNames = req.getParameterNames();
+        List<String> params = Collections.list(paramNames);
+        Collections.sort(params);
+        for (String paramName : params) {
+            if (paramName.startsWith("mapfish_data_")) {
+                // You can add mapfish_data variables that will be mapped
                 // to a info value pairs to provide meta data for the map
+                // The the info part starts with a number for sorting that
+                // number will be stripped
                 String paramValue = req.getParameter(paramName);
-                if (paramValue != null && !paramValue.isEmpty()) {
-                    Map<String, Object> data3 = new HashMap<String, Object>();
+                Map<String, Object> data3 = new HashMap<String, Object>();
+                int order = 0;
+                try {
+                    order = Integer.parseInt(paramName.substring(13, 14));
+                    data3.put("info", paramName.substring(14));
+                } catch (NumberFormatException nfe) {
                     data3.put("info", paramName.substring(13));
-                    data3.put("value", paramValue);
                     payload.add(data3);
                 }
-            } else if (paramName.startsWith("mapfish-")) {
+                if (paramValue.equals("null"))
+                    data3.put("value", "");
+                else
+                    data3.put("value", paramValue);
+                payload.add(data3);
+            } else if (paramName.startsWith("mapfish_")) {
                 String paramValue = req.getParameter(paramName);
+                if (paramValue.equals("null"))
+                    paramValue = "";
                 pageSpecs.put(paramName.substring(8), paramValue);
             }
         }
@@ -412,9 +427,15 @@
                 try {
                     byte [] buf = new byte[4096];
                     int r;
-                    resp.setHeader("Content-Disposition",
-                            "attachment;filename=flys-karte.pdf");
-                    resp.setContentType("application/pdf");
+                    if (result < 200 || result >= 300) {
+                        resp.setContentType("text/plain");
+                    } else {
+                        // Only send content disposition and filename content
+                        // type when we have a pdf
+                        resp.setHeader("Content-Disposition",
+                                "attachment;filename=flys-karte.pdf");
+                        resp.setContentType("application/pdf");
+                    }
                     while ((r = in.read(buf)) >= 0) {
                         out.write(buf, 0, r);
                     }
--- a/flys-client/src/main/java/de/intevation/flys/client/shared/MapUtils.java	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/java/de/intevation/flys/client/shared/MapUtils.java	Sun Apr 21 10:46:59 2013 +0200
@@ -13,18 +13,29 @@
     private MapUtils() {
     }
 
+    public static String getLegendGraphicUrl(String server, String layer) {
+        return getLegendGraphicUrl(server, layer, -1);
+    }
 
-    public static String getLegendGraphicUrl(String server, String layer) {
+    public static String getLegendGraphicUrl(String server, String layer, int dpi) {
         if (server == null || layer == null) {
             return null;
         }
 
+        if (server.contains("osm.intevation.de")) {
+            // GetLegend is not implemented at osm.intevation.de
+            // This avoids an error in the print log
+            return null;
+        }
         server = server.indexOf("?") >= 0 ? server : server + "?";
 
         String url = GET_LEGEND_GRAPHIC_TEMPLATE;
         url = url.replace("${SERVER}", server);
         url = url.replace("${LAYER}", layer);
         url = url + "&timestamp=" + new Date().getTime();
+        if (dpi != -1) {
+            url+="&legend_options=dpi:" + dpi;
+        }
 
         return url;
     }
--- a/flys-client/src/main/webapp/WEB-INF/config.yaml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/webapp/WEB-INF/config.yaml	Sun Apr 21 10:46:59 2013 +0200
@@ -69,13 +69,22 @@
   - !localMatch
     dummy: true
   - !dnsMatch
-    host: wsvmapserv.wsv.bund.de
+    host: wsvmapserv.ilmenau.baw.de
+    port: 80
+  - !dnsMatch
+    host: www.pegelonline.wsv.de
+    port: 80
+  - !dnsMatch
+    host: gdz.bkg.bund.de
+    port: 80
+  - !dnsMatch
+    host: ims3.bkg.bund.de
     port: 80
   - !dnsMatch
     host: tile.openstreetmap.org
     port: 80
   - !dnsMatch
-    host: www.pegelonline.wsv.de
+    host: wsvmapserv.wsv.bund.de
     port: 80
   - !dnsMatch
     host: geo4.service24.rlp.de
@@ -93,6 +102,14 @@
   - !dnsMatch
     host: geoportal.bafg.de
     port: 80
+  - !dnsMatch
+    host: wsvmapserv.wsv.bvbs.bund.de
+    port: 80
+
+# We need a font with unicode support the defaults only
+# have latin1
+fonts:
+  - /usr/share/fonts/truetype/freefont/FreeSans.ttf
 
 layouts:
   #===========================================================================
@@ -119,102 +136,160 @@
           absoluteX: 20
           align: left
           absoluteY: 575
-          width: 592
+          width: 587
           height: 555
           spacingAfter: 0
-        #Flys and BFG Logo
+        # The north arrow
         - !columns
-          absoluteX: 747
-          absoluteY: 100
-          width: 60
-          items:
-            - !image
-              maxWidth: 60
-              maxHeight: 60
-              url: '${configDir}/../images/FLYS_Logo.png'
-        - !columns
-          absoluteX: 732
-          absoluteY: 160
-          width: 90
+          absoluteX: 627
+          absoluteY: 65
+          width: 32
           items:
             - !image
-              maxWidth: 90
-              maxHeight: 60
-              url: '${configDir}/../images/bfg_logo.gif'
-        # Legend header, a bit hackish with the border
-        # but I don't know how to put two rows in a column and I don't want to
-        # use tables
+              maxWidth: 20
+              maxHeight: 40
+              url: '${configDir}/../images/north.png'
+        # The scale text
         - !columns
-          absoluteX: 612
-          absoluteY: 575
-          width: 200
+          absoluteX: 615
+          absoluteY: 30
+          width: 45
           items:
             - !text
-              text: "Legende:"
+              fontSize: 8
+              text: '1:${scale}'
               align: center
-          config:
-            borderWidthLeft: 1
-            borderWidthRight: 1
-            borderWidthTop: 1
-            borderWidthBottom: 0
+              fontEncoding: Identity-H
+              font: FreeSans
+              backgroundColor: #FFFFFF
+        #Flys and BFG Logo
+        - !columns
+          absoluteX: 760
+          absoluteY: 70
+          width: 50
+          items:
+            - !image
+              maxWidth: 50
+              maxHeight: 50
+              url: '${configDir}/../images/FLYS_Logo.png'
+        - !columns
+          absoluteX: 665
+          absoluteY: 70
+          width: 75
+          items:
+            - !image
+              maxWidth: 75
+              maxHeight: 50
+              url: '${configDir}/../${logo}'
+        # Scalebar
+        - !columns
+          absoluteX: 460
+          absoluteY: 40
+          width: 150
+          items:
+            - !scalebar
+              type: bar
+              maxSize: 150
+              barSize: 5
+              barBgColor: white
+              fontSize: 8
+              backgroundColor: #FFFFFF
         # The legend
         - !columns
           absoluteX: 612
-          absoluteY: 564
+          absoluteY: 390
           width: 200
           items:
             - !legends
-              maxHeight: 400
+              maxHeight: 310
               maxWidth: 0
               maxIconHeight: 0
-              inline: false
+              inline: true
               classIndentation: 10
-              layerSpace: 5
-              classSpace: 2
-              layerFont: Helvetica
+              layerSpace: 0
+              classSpace: 5
               layerFontSize: 0
-              classFont: Helvetica
-              classFontSize: 0
-              fontEncoding: Cp1252
-              columnMargin: 2
-              defaultScale: 0.7
-          config:
-            borderWidthLeft: 1
-            borderWidthRight: 1
-            borderWidthTop: 0
-            borderWidthBottom: 1
-        # The Stamp
-        - !columns
-          absoluteX: 612
-          absoluteY: 200
-          width: 200
+              classFontSize: 10
+              fontEncoding: Identity-H
+              classFont: FreeSans
+              layerFont: FreeSans
+              defaultScale: 0.5
           config:
             borderWidthLeft: 1
             borderWidthRight: 1
             borderWidthTop: 1
             borderWidthBottom: 1
+        # The stamp background
+        - !columns
+          absoluteX: 557
+          absoluteY: 575
+          width: 260
+          items:
+            - !image
+              maxWidth: 260
+              maxHeight: 184
+              url: '${configDir}/../images/white.png'
+
+        # Title of the map
+        - !columns
+          absoluteX: 562
+          absoluteY: 575
+          width: 250
+          condition: mapTitle
+          items:
+            - !text
+              text: '${mapTitle}'
+
+        # The Stamp
+        - !columns
+          absoluteX: 562
+          absoluteY: 555
+          width: 250
+        #  config:
+        #    borderWidthLeft: 5
+        #    borderWidthRight: 5
+        #    borderWidthTop: 5
+        #    borderWidthBottom: 5
+            #padding: 10
+            #backgroundColor: #FFFFFF
+            #borderColor: #FFFFFF
           items:
             - !attributes
               source: data
-              spacingAfter: 30
+              spacingAfter: 0
               columnDefs:
                 info:
-                  columnWeight: 2
+                  columnWeight: 7
                   header: !text
-                    text: Info
-                    backgroundColor: #A0A0A0
-                  cell: !text
-                    text: '${info}'
-                value:
-                  columnWeight: 5
-                  header: !text
-                    text: value
-                    backgroundColor: #A0A0A0
+                    text: info
+                    fontSize: 0
                   cell: !columns
                     config:
                       cells:
                         - borderWidth: 1
+                          padding: 5
+                    items:
+                      - !text
+                        text: '${info}'
+                        fontSize: 10
+                        fontEncoding: Identity-H
+                        font: FreeSans
+                        fontSize: 10
+                    backgroundColor: #FFFFFF
+                value:
+                  columnWeight: 15
+                  header: !text
+                    text: value
+                    fontSize: 0
+                  cell: !columns
+                    config:
+                      cells:
+                        - borderWidth: 1
+                          padding: 5
                     items:
                       - !text
                         text: '${value}'
-
+                        fontEncoding: Identity-H
+                        font: FreeSans
+                        fontSize: 10
+                    backgroundColor: #FFFFFF
--- a/flys-client/src/main/webapp/WEB-INF/features.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/webapp/WEB-INF/features.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -7,14 +7,14 @@
         <ftr:feature>module:new_chart</ftr:feature>
         <ftr:feature>module:fixanalysis</ftr:feature>
         <ftr:feature>river:Saar</ftr:feature>
-        <ftr:feature>river:Saar-Wilt-Bogen</ftr:feature>
+        <ftr:feature>river:Saar (Wiltinger Bogen)</ftr:feature>
         <ftr:feature>river:Rhein</ftr:feature>
         <ftr:feature>river:Mosel</ftr:feature>
         <ftr:feature>river:Elbe</ftr:feature>
-        <ftr:feature>river:Donau (rna)</ftr:feature>
-        <ftr:feature>river:Donau (SK)</ftr:feature>
+        <ftr:feature>river:Donau (Regensburg Nordarm)</ftr:feature>
+        <ftr:feature>river:Donau (Schleusenkanäle)</ftr:feature>
         <ftr:feature>river:Donau</ftr:feature>
-        <ftr:feature>river:Fulda</ftr:feature>
+        <ftr:feature>river:Fulda (Winter)</ftr:feature>
         <ftr:feature>river:Fulda (Sommer)</ftr:feature>
         <ftr:feature>river:Havel</ftr:feature>
         <ftr:feature>river:Lahn</ftr:feature>
@@ -26,7 +26,7 @@
         <ftr:feature>river:Oder</ftr:feature>
         <ftr:feature>river:Saale</ftr:feature>
         <ftr:feature>river:Saale-Thüringen</ftr:feature>
-        <ftr:feature>river:Werra</ftr:feature>
+        <ftr:feature>river:Werra (Winter)</ftr:feature>
         <ftr:feature>river:Werra (Sommer)</ftr:feature>
         <ftr:feature>river:Weser</ftr:feature>
     </ftr:role>
--- a/flys-client/src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/webapp/WEB-INF/stylesheets/fixoverview2html.xsl	Sun Apr 21 10:46:59 2013 +0200
@@ -24,6 +24,13 @@
     </xsl:choose>
   </xsl:variable>
 
+  <xsl:variable name="i18n-gauge">
+    <xsl:choose>
+      <xsl:when test="$locale = 'de'">Pegel</xsl:when>
+      <xsl:otherwise>Gauge</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
   <xsl:variable name="i18n-event">
     <xsl:choose>
       <xsl:when test="$locale = 'de'">Ereignis</xsl:when>
@@ -255,6 +262,13 @@
           <xsl:when test="@class = '2'"> / Q <xsl:value-of select="$i18n-around-mhq"/></xsl:when>
           <xsl:when test="@class = '3'"> / Q <xsl:value-of select="$i18n-above-hq5"/></xsl:when>
         </xsl:choose>
+        <xsl:text>&#10;</xsl:text>
+        <xsl:value-of select="$i18n-gauge"/>
+        <xsl:text>:</xsl:text>
+        <xsl:call-template name="find-gauges">
+          <xsl:with-param name="start" select="@from"/>
+          <xsl:with-param name="stop" select="@to"/>
+        </xsl:call-template>
       </xsl:attribute>
       <xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
     </div>
@@ -277,6 +291,18 @@
     </tr>
   </xsl:template>
 
+  <xsl:template match="text()" mode="gauge-list"/>
+  <xsl:template match="gauge" mode="gauge-list">
+    <xsl:text> </xsl:text><xsl:value-of select="@name"/>
+  </xsl:template>
+
+  <xsl:template name="find-gauges">
+    <xsl:param name="start"/>
+    <xsl:param name="stop"/>
+    <xsl:apply-templates mode="gauge-list"
+      select="/fixings/gauges/gauge[not((number(@to) &lt; number($start)) or (number(@from) &gt; number($stop)))]"/>
+  </xsl:template>
+
   <xsl:template match="gauge" mode="gauges">
     <xsl:call-template name="emit-gap-gauge">
       <xsl:with-param name="gauge" select="."/>
--- a/flys-client/src/main/webapp/WEB-INF/wms-services.xml	Sun Apr 21 10:46:06 2013 +0200
+++ b/flys-client/src/main/webapp/WEB-INF/wms-services.xml	Sun Apr 21 10:46:59 2013 +0200
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <wms-services>
+  <wms name="OSM Hintergrundkarte" url="http://osm.intevation.de/mapcache/?"/>
   <wms name="Luftbilder RLP" url="http://geo4.service24.rlp.de/wms/dop40_geo4.fcgi"/>
   <wms name="TOP-Karten der WSV" url="http://wsvmapserv.ilmenau.baw.de/cgi-bin/wmstkappl?"/>
   <wms name="Bundeswasserstraßenkarte 1:1 Mio" url="http://wsvmapserv.ilmenau.baw.de/cgi-bin/wmsdbwk1000?"/>
   <wms name="DBWK2" url="http://wsvmapserv.wsv.bvbs.bund.de/cgi-bin/wms_dbwk2?"/>
   <wms name="Infos zu Bundeswasserstraßen" url="http://wsvmapserv.wsv.bund.de/wms_bwastr?Version=1.1.0"/>
-  <wms name="Einzugsgebiete Deutschland" url="http://wsvmapserv.wsv.bund.de/wmsezg?"/>
   <wms name="Orthophotos BKG" url="http://gdz.bkg.bund.de"/>
   <wms name="Orthophotos der WSV" url="http://wsvmapserv.ilmenau.baw.de/cgi-bin/wmsluft?"/>
   <wms name="Pegelonline" url="http://www.pegelonline.wsv.de/webservices/gis/wms/aktuell?"/>
Binary file flys-client/src/main/webapp/images/north.png has changed
Binary file flys-client/src/main/webapp/images/white.png has changed

http://dive4elements.wald.intevation.org